diff --git a/config.js b/config.js
new file mode 100644
index 0000000..566d8fd
--- /dev/null
+++ b/config.js
@@ -0,0 +1,120 @@
+// config.js: basic config for docmd
+module.exports = {
+ // Core Site Metadata
+ siteTitle: 'docmd',
+ // Define a base URL for your site, crucial for SEO and absolute paths
+ // No trailing slash
+ siteUrl: '', // Replace with your actual deployed URL
+
+ // Logo Configuration
+ logo: {
+ light: '/assets/images/docmd-logo-light.png', // Path relative to outputDir root
+ dark: '/assets/images/docmd-logo-dark.png', // Path relative to outputDir root
+ alt: 'docmd logo', // Alt text for the logo
+ href: '/', // Link for the logo, defaults to site root
+ },
+
+ // Directory Configuration
+ srcDir: 'docs', // Source directory for Markdown files
+ outputDir: 'site', // Directory for generated static site
+
+ // Sidebar Configuration
+ sidebar: {
+ collapsible: true, // or false to disable
+ defaultCollapsed: false, // or true to start collapsed
+ },
+
+ // Theme Configuration
+ theme: {
+ name: 'sky', // Themes: 'default', 'sky'
+ defaultMode: 'light', // Initial color mode: 'light' or 'dark'
+ enableModeToggle: true, // Show UI button to toggle light/dark modes
+ positionMode: 'top', // 'top' or 'bottom' for the theme toggle
+ codeHighlight: true, // Enable/disable codeblock highlighting and import of highlight.js
+ customCss: [ // Array of paths to custom CSS files
+ // '/assets/css/custom.css', // Custom TOC styles
+ ]
+ },
+
+ // Custom JavaScript Files
+ customJs: [ // Array of paths to custom JS files, loaded at end of body
+ // '/assets/js/custom-script.js', // Paths relative to outputDir root
+ '/assets/js/docmd-image-lightbox.js', // Image lightbox functionality
+ ],
+
+ // Content Processing
+ autoTitleFromH1: true, // Set to true to automatically use the first H1 as page title
+ copyCode: true, // Enable/disable the copy code button on code blocks
+
+ // Plugins Configuration
+ // Plugins are configured here. docmd will look for these keys.
+ plugins: {
+ // SEO Plugin Configuration
+ // Most SEO data is pulled from page frontmatter (title, description, image, etc.)
+ // These are fallbacks or site-wide settings.
+ seo: {
+ // Default meta description if a page doesn't have one in its frontmatter
+ defaultDescription: 'docmd is a Node.js command-line tool for generating beautiful, lightweight static documentation sites from Markdown files.',
+ openGraph: { // For Facebook, LinkedIn, etc.
+ // siteName: 'docmd Documentation', // Optional, defaults to config.siteTitle
+ // Default image for og:image if not specified in page frontmatter
+ // Path relative to outputDir root
+ defaultImage: '/assets/images/docmd-preview.png',
+ },
+ twitter: { // For Twitter Cards
+ cardType: 'summary_large_image', // 'summary', 'summary_large_image'
+ // siteUsername: '@docmd_handle', // Your site's Twitter handle (optional)
+ // creatorUsername: '@your_handle', // Default author handle (optional, can be overridden in frontmatter)
+ }
+ },
+ // Analytics Plugin Configuration
+ analytics: {
+ // Google Analytics 4 (GA4)
+ googleV4: {
+ measurementId: 'G-8QVBDQ4KM1' // Replace with your actual GA4 Measurement ID
+ }
+ },
+ // Enable Sitemap plugin
+ sitemap: {
+ defaultChangefreq: 'weekly',
+ defaultPriority: 0.8
+ }
+ // Add other future plugin configurations here by their key
+ },
+
+ // Navigation Structure (Sidebar)
+ // Icons are kebab-case names from Lucide Icons (https://lucide.dev/)
+ navigation: [
+ { title: 'Welcome', path: '/', icon: 'home' }, // Corresponds to docs/index.md
+ {
+ title: 'Getting Started',
+ icon: 'rocket',
+ path: '#',
+ collapsible: true, // This makes the menu section collapsible
+ children: [
+ { title: 'Documentation', path: 'https://docmd.mgks.dev', icon: 'scroll', external: true },
+ { title: 'Installation', path: 'https://docmd.mgks.dev/getting-started/installation', icon: 'download', external: true },
+ { title: 'Basic Usage', path: 'https://docmd.mgks.dev/getting-started/basic-usage', icon: 'play', external: true },
+ { title: 'Content', path: 'https://docmd.mgks.dev/content', icon: 'layout-template', external: true },
+ ],
+ },
+ // External links:
+ { title: 'GitHub', path: 'https://github.com/mgks/docmd', icon: 'github', external: true },
+ { title: 'Support the Project', path: 'https://github.com/sponsors/mgks', icon: 'heart', external: true },
+ ],
+
+ // Sponsor Ribbon Configuration
+ Sponsor: {
+ enabled: false,
+ title: 'Support docmd',
+ link: 'https://github.com/sponsors/mgks',
+ },
+
+ // Footer Configuration
+ // Markdown is supported here.
+ footer: '© ' + new Date().getFullYear() + ' Project.',
+
+ // Favicon Configuration
+ // Path relative to outputDir root
+ favicon: '/assets/favicon.ico',
+};
diff --git a/docs/Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation.md b/docs/Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation.md
new file mode 100644
index 0000000..8ca49bb
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation.md
@@ -0,0 +1,162 @@
+---
+id: MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+sidebar_position: 0
+sidebar_label: Documentazione Tecnica – Flowpack MachineAnalytics & SCADA
+pagination_prev: null
+hide_table_of_contents: TRUE
+---
+
+# Documentazione Tecnica – Flowpack MachineAnalytics & SCADA
+
+---
+
+## Sommario
+
+- [Struttura SCADA Interface – Cambio Ricetta & Aggiornamento Produzione](sections/00-SCADAInterface_Structure.md#struttura-scada-interface--cambio-ricetta--aggiornamento-produzione)
+- [Status Macchina e Interfaccia SCADA](sections/01-ScadaInterfaceMasterStructure.md#status-macchina-e-interfaccia-scada)
+- [Gestione Cambio Ricetta](sections/02-GestioneRicette.md#gestione-cambio-ricetta)
+- [Statistiche Flowpack](sections/03-StatisticheFlowpack.md#statistiche-flowpack)
+- [Analytics & Allarmi](sections/04-AnalyticsAllarmi.md#analytics--allarmi)
+- [Ranking Allarmi (Frequenza/Downtime)](sections/05-RankingAllarmi.md#ranking-allarmi-frequenzadowntime)
+- [Tempi Macchina](sections/06-TempiMacchina.md#tempi-macchina)
+- [Timestamp & Reset](sections/07-TimestampReset.md#timestamp--reset)
+- [Popup & Logica HMI](sections/08-PopupLogicaHMI.md#popup--logica-hmi)
+- [Note di Interfaccia e Utilizzo](sections/10-NoteInterfacciaUtilizzo.md#note-di-interfaccia-e-utilizzo)
+- [Espansioni Future](#espansioni-future)
+
+---
+
+## Sessioni aggiunte (in alto)
+
+- Documentazione generata da Ufficio Sviluppo TecnoPack Group Spa
+- Versione: 2025-09-26
+- Repository di riferimento: [DFFM-maker/ai-assistant](https://github.com/DFFM-maker/ai-assistant)
+
+---
+
+## Introduzione
+
+Questa documentazione descrive la struttura, i dati e i flussi di comunicazione della macchina Flowpack integrata con sistemi SCADA/MES.
+Il sistema è pensato per massima compatibilità, chiarezza e performance, sia per la gestione locale che per l’integrazione con supervisori industriali.
+
+---
+
+## Protocollo di Comunicazione
+
+La comunicazione tra PLC e sistemi SCADA/MES avviene tramite **protocollo OPC-UA**, garantendo:
+- Interoperabilità tra piattaforme
+- Sicurezza nella trasmissione dati
+- Scalabilità per future espansioni
+
+---
+
+## Struttura Dati Principale
+
+La struttura dati centrale è la **ST_ScadaInterface**.
+Questa aggrega tutte le variabili, array, handshake e KPI necessari per la supervisione, la diagnostica e la gestione della produzione.
+
+```plaintext
+ST_ScadaInterface
+├── Egress (PLC → SCADA)
+│ ├── Status macchina e produzione
+│ ├── Ricette attive e lista ricette
+│ ├── Statistiche Flowpack
+│ ├── Analytics allarmi e ranking
+│ ├── Tempi macchina, timestamp e reset
+│ ├── Variabili di handshake e popup operatore
+├── Ingress (SCADA → PLC)
+│ ├── Comandi cambio ricetta/produzione
+│ ├── Reset statistiche/counters
+│ ├── Parametri di produzione richiesti
+```
+
+---
+
+## Macro-sezioni
+### [Struttura SCADA Interface – Cambio Ricetta & Aggiornamento Produzione](sections/00-SCADAInterface_Structure.md#struttura-scada-interface--cambio-ricetta--aggiornamento-produzione)
+
+Questa sezione raccoglie tutte le variabili, i flussi di handshake e le logiche di stato che governano lo scambio dati tra PLC e SCADA/MES per:
+- **Cambio ricetta**: gestione richiesta, conferma operatore, popup HMI, timer di reset, logging eventi.
+- **Aggiornamento dati produzione**: gestione cambio lotto/ordine, quantità, info aggiuntive, conferma e tracciamento.
+- Tutti i segnali di stato e i comandi per garantire sicurezza, tracciabilità e interoperabilità tra sistemi.
+
+Include:
+- Tabelle dettagliate di variabili Egress/Ingress.
+- Tree strutturale delle variabili di scambio.
+- Diagrammi di stato per cambio ricetta e produzione (Mermaid).
+- Note avanzate e best practice per configurazione, audit e troubleshooting.
+
+Questa macro-sezione è la base architetturale per l’integrazione e la supervisione della macchina tramite SCADA/MES.
+
+### [Status Macchina e Interfaccia SCADA](sections/01-ScadaInterfaceMasterStructure.md#status-macchina-e-interfaccia-scada)
+
+- Variabili di stato (IsRunning, IsStopped, IsInEmergency, ecc.)
+- Handshake per comandi remoti e conferme operatore
+- Heartbeat e monitor connessione PLC-SCADA
+
+### [Gestione Ricette](sections/02-GestioneRicette.md#gestione-ricette)
+
+- Scambio ricette tra PLC e SCADA: `ActualRecipeIndex`, `ActualRecipeName`, `RecipeList[0..40]`
+- Handshake cambio ricetta: `RecipeChangeRequest`, `RecipeChangeACK`, `RecipeChangeOK`, `RecipeChangeReject`, `RecipeChangePostpone`
+- Popup e logica HMI per conferma operatore
+
+### [Statistiche Flowpack](sections/03-StatisticheFlowpack.md#statistiche-flowpack)
+
+- Dati produzione: `Products_In_Total`, `Products_Out_Good`, `Products_Out_Rejected`
+- Dettaglio scarti: `Reject_EmptyPackets`, `Reject_DoublePackets`, ecc.
+- Percentuali di produzione/scarto
+- Velocità attuale e di riferimento
+
+### [Analytics & Allarmi](sections/04-AnalyticsAllarmi.md#analytics--allarmi)
+
+- KPI allarmi: `State`, `Count`, `TotalActiveTime_ms`, `MTTR_sec`, `MTBF_h`
+- Array compatto allarmi: `Alarms_Packed[0..80]` per sistemi SCADA con limiti di tag
+- Spiegazione dei ranking e KPI per manutenzione predittiva
+
+### [Ranking Allarmi (Frequenza/Downtime)](sections/05-RankingAllarmi.md#ranking-allarmi-frequenzadowntime)
+
+- `TopAlarms_ByFrequency[0..99]` per allarmi più frequenti
+- `TopAlarms_ByDowntime[0..99]` per allarmi che causano più fermo
+- Visualizzazione e priorità interventi
+
+### [Tempi Macchina](sections/06-TempiMacchina.md#tempi-macchina)
+
+- Statistiche dettagliate: `TotalTime`, `RunTime`, `StopTime`, `EmergencyTime`, `DownstreamTime`, `UpstreamTime`
+- Reset counters per cambio batch/turno
+
+### [Timestamp & Reset](sections/07-TimestampReset.md#timestamp--reset)
+
+- Tracciamento avvio/fine produzione e ultimo reset (`ProductionStart_Timestamp`, `ProductionStop_Timestamp`, `ProductionLastReset_Timestamp`)
+- Comando `ResetCounters` per azzeramento sicuro
+
+### [Popup & Logica HMI](sections/08-PopupLogicaHMI.md#popup--logica-hmi)
+
+- Flusso handshake ricette/produzione con popup e timer reset (OK/Reject: 2s, Postpone: 30s)
+- Variabili di stato per conferma/rifiuto operatore
+
+---
+
+## Note di Interfaccia e Utilizzo
+
+- Tutte le variabili sono pronte per mapping OPC-UA, con naming standard e struttura chiara.
+- Gli array compatti sono pensati per ridurre costi/licenze e rendere la supervisione più efficiente.
+- Diagrammi di stato e tree strutturali facilitano la configurazione e il troubleshooting.
+- Documentazione pronta per training, onboarding e audit.
+
+---
+
+## Espansioni Future
+
+- Integrazione con moduli OEE, predictive maintenance, reportistica avanzata
+- Estensione delle strutture per nuovi KPI, ranking, ricette
+- Logging centralizzato e dashboard custom
+
+---
+
+## Sessioni aggiunte (in basso)
+
+- Documento generato da Ufficio Sviluppo TecnoPack Group Spa
+- Versione: 2025-09-26
+
+
+---
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/00-SCADAInterface_Structure.md b/docs/Omron/MachineAnalytics_SCADA/sections/00-SCADAInterface_Structure.md
new file mode 100644
index 0000000..5f5b6c7
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/00-SCADAInterface_Structure.md
@@ -0,0 +1,183 @@
+---
+id: MachineAnalytics_SCADA_SCADAInterface_Structure
+sidebar_position: 0
+sidebar_label: Struttura SCADA Interface – Cambio Ricetta & Aggiornamento Produzione
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: true
+---
+
+# Struttura SCADA Interface – Cambio Ricetta & Aggiornamento Produzione
+
+---
+
+## 1. 📋 Tabella Variabili di Scambio PLC–SCADA
+
+### 🟢 EGRESS (PLC → SCADA)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|--------------------------|-------------|--------------|---------|---------------------------------------------|
+| ▶️ IsRunning | BOOL | Output | 🚦 | Macchina in marcia |
+| ⏹️ IsStopped | BOOL | Output | 🛑 | Macchina ferma |
+| 🆘 IsInEmergency | BOOL | Output | 🚨 | Emergenza attiva |
+| ⬇️ IsWaitingDownstream | BOOL | Output | ⏳ | Attesa segnale macchina a valle |
+| ⬆️ IsWaitingUpstream | BOOL | Output | ⏳ | Attesa prodotto da macchina a monte |
+| 🛎️ IsAlarmActive | BOOL | Output | 🛎️ | Allarme attivo |
+| 🔁 RecipeChangeACK | BOOL | Output | ✅ | Ack cambio ricetta |
+| 🟢 RecipeChangeOK | BOOL | Output | 🟩 | Cambio ricetta OK |
+| ❌ RecipeChangeReject | BOOL | Output | ❌ | Cambio ricetta rifiutato |
+| ⏸️ RecipeChangePostpone | BOOL | Output | ⏸️ | Cambio ricetta posticipato |
+| 🔁 ProductionChangeACK | BOOL | Output | ✅ | Ack cambio produzione |
+| 🟢 ProductionChangeOK | BOOL | Output | 🟩 | Produzione aggiornata OK |
+| ❌ ProductionChangeReject| BOOL | Output | ❌ | Aggiornamento produzione rifiutato |
+| ⏸️ ProductionChangePostpone| BOOL | Output | ⏸️ | Aggiornamento produzione posticipato |
+| 📄 ActualRecipeIndex | DINT | Output | #️⃣ | Indice ricetta attiva |
+| 📄 ActualRecipeName | STRING[38] | Output | 📝 | Nome ricetta attiva |
+| 🏷️ ActualProductionInfo | STRING[38] | Output | 🏷️ | Lotto/ordine attivo |
+| #️⃣ ActualProductionCode | DINT | Output | #️⃣ | Codice lotto/ordine attivo |
+| 📦 ActualProductionQuantity | DINT | Output | 📦 | Quantità lotto/ordine attiva |
+| 🚀 ActualSpeed | REAL | Output | 🚀 | Velocità attuale [Pacchi/min] |
+| 🎯 ReferenceSpeed | REAL | Output | 🎯 | Velocità di riferimento da ricetta |
+
+---
+
+### 🔵 INGRESS (SCADA → PLC)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|---------------------------|-------------|--------------|---------|---------------------------------------------|
+| 🔄 RecipeChangeRequest | BOOL | Input | 📥 | Richiesta cambio ricetta |
+| #️⃣ RecipeIndexRequest | DINT | Input | #️⃣ | Indice ricetta richiesta |
+| 🏷️ RecipeProductionInfoRequest | STRING[38]| Input | 🏷️ | Lotto/ordine richiesto per ricetta |
+| #️⃣ RecipeProductionCodeRequest | DINT | Input | #️⃣ | Codice lotto/ordine richiesto per ricetta |
+| 📦 RecipeProductionQuantityRequest | DINT | Input | 📦 | Quantità lotto/ordine richiesta per ricetta |
+| 🔄 ProductionChangeRequest| BOOL | Input | 📥 | Richiesta cambio produzione |
+| #️⃣ ProductionCodeRequest | DINT | Input | #️⃣ | Codice lotto/ordine richiesta |
+| 📦 ProductionQuantityRequest | DINT | Input | 📦 | Quantità lotto/ordine richiesta |
+| 🏷️ ProductionInfoRequest | STRING[38] | Input | 🏷️ | Lotto/ordine richiesto |
+
+---
+
+## 2. 🌳 Tree Strutturale SCADA Egress/Ingress
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── RecipeChangeACK ✅
+│ ├── RecipeChangeOK 🟩
+│ ├── RecipeChangeReject ❌
+│ ├── RecipeChangePostpone ⏸️
+│ ├── ProductionChangeACK ✅
+│ ├── ProductionChangeOK 🟩
+│ ├── ProductionChangeReject ❌
+│ ├── ProductionChangePostpone ⏸️
+│ ├── ActualRecipeIndex #️⃣
+│ ├── ActualRecipeName 📝
+│ ├── ActualProductionInfo 🏷️
+│ ├── ActualProductionCode #️⃣
+│ ├── ActualProductionQuantity 📦
+│ ├── ActualSpeed 🚀
+│ ├── ReferenceSpeed 🎯
+│ ├── ...altre variabili di status...
+├── Ingress
+│ ├── RecipeChangeRequest 📥
+│ ├── RecipeIndexRequest #️⃣
+│ ├── RecipeProductionInfoRequest 🏷️
+│ ├── RecipeProductionCodeRequest #️⃣
+│ ├── RecipeProductionQuantityRequest 📦
+│ ├── ProductionChangeRequest 📥
+│ ├── ProductionCodeRequest #️⃣
+│ ├── ProductionQuantityRequest 📦
+│ ├── ProductionInfoRequest 🏷️
+```
+
+---
+
+## 3. 🚦 Diagramma Stato Cambio Ricetta – Mermaid
+
+```mermaid
+flowchart TD
+ style WaitIdle fill:#bef5cb,stroke:#34c759,color:#000
+ style RequestReceived fill:#fff7aa,stroke:#ffd60a,color:#000
+ style AckSent fill:#e3eeff,stroke:#007aff,color:#000
+ style WaitingForHMI fill:#ffdde2,stroke:#ff375f,color:#000
+ style ProcessingAccepted fill:#e3ffe3,stroke:#30db5b,color:#000
+ style ProcessingRejected fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style Postponed fill:#e6ddff,stroke:#5856d6,color:#000
+
+ WaitIdle["🟢 Idle(Attesa richiesta) "]
+ RequestReceived["📥 RequestReceivedRichiesta SCADA, RecipeChangeRequest / RecipeIndexRequest "]
+ AckSent["✅ AckSentACK inviato a SCADA "]
+ WaitingForHMI["🧑🔧 WaitingForHMIPopup HMI operatore "]
+ ProcessingAccepted["🟩 AcceptedRecipeChangeOK (reset dopo 2s) "]
+ ProcessingRejected["❌ RejectedRecipeChangeReject (reset dopo 2s) "]
+ Postponed["⏸️ PostponedRecipeChangePostpone (reset dopo 30s) "]
+
+ WaitIdle -->|📥 RecipeChangeRequest| RequestReceived
+ RequestReceived -->|✅ RecipeChangeACK| AckSent
+ AckSent -->|🧑🔧 Handshake HMI| WaitingForHMI
+ WaitingForHMI -->|🟩 Operatore ACCETTA| ProcessingAccepted
+ WaitingForHMI -->|❌ Operatore RIFIUTA| ProcessingRejected
+ WaitingForHMI -->|⏸️ Operatore POSTICIPA| Postponed
+ ProcessingAccepted -->|⏱️ Reset 2s| WaitIdle
+ ProcessingRejected -->|⏱️ Reset 2s| WaitIdle
+ Postponed -->|⏱️ Reset 30s| AckSent
+```
+
+---
+
+## 4. 🚦 Diagramma Stato Aggiornamento Produzione – Mermaid
+
+```mermaid
+flowchart TD
+ style WaitIdle fill:#bef5cb,stroke:#34c759,color:#000
+ style RequestReceived fill:#fff7aa,stroke:#ffd60a,color:#000
+ style AckSent fill:#e3eeff,stroke:#007aff,color:#000
+ style WaitingForHMI fill:#ffdde2,stroke:#ff375f,color:#000
+ style ProcessingAccepted fill:#e3ffe3,stroke:#30db5b,color:#000
+ style ProcessingRejected fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style Postponed fill:#e6ddff,stroke:#5856d6,color:#000
+
+ WaitIdle["🟢 Idle(Attesa richiesta) "]
+ RequestReceived["📥 RequestReceivedRichiesta SCADA, ProductionChangeRequest / ProductionCodeRequest "]
+ AckSent["✅ AckSentACK inviato a SCADA "]
+ WaitingForHMI["🧑🔧 WaitingForHMIPopup HMI operatore "]
+ ProcessingAccepted["🟩 AcceptedProductionChangeOK (reset dopo 2s) "]
+ ProcessingRejected["❌ RejectedProductionChangeReject (reset dopo 2s) "]
+ Postponed["⏸️ PostponedProductionChangePostpone (reset dopo 30s) "]
+
+ WaitIdle -->|📥 ProductionChangeRequest| RequestReceived
+ RequestReceived -->|✅ ProductionChangeACK| AckSent
+ AckSent -->|🧑🔧 Handshake HMI| WaitingForHMI
+ WaitingForHMI -->|🟩 Operatore ACCETTA| ProcessingAccepted
+ WaitingForHMI -->|❌ Operatore RIFIUTA| ProcessingRejected
+ WaitingForHMI -->|⏸️ Operatore POSTICIPA| Postponed
+ ProcessingAccepted -->|⏱️ Reset 2s| WaitIdle
+ ProcessingRejected -->|⏱️ Reset 2s| WaitIdle
+ Postponed -->|⏱️ Reset 30s| AckSent
+```
+
+---
+
+## 5. 🗒️ Note Avanzate & Best Practice
+
+- Tutte le variabili sono pronte per mapping OPC-UA con UAexpert.
+- Il protocollo di handshake per cambio ricetta e produzione garantisce sicurezza operativa e audit trail.
+- Le state machine (diagrammi sopra) sono progettate per evitare race condition e garantire la conferma operatore su azioni critiche.
+- Logging centralizzato sugli eventi di stato per tracciabilità (audit, troubleshooting).
+- Struttura pronta per estensioni future (aggiunta KPI, OEE, manutenzione predittiva).
+
+---
+
+## 6. 🔗 Link alle macro-sezioni
+
+- [Gestione Cambio Ricetta](02-GestioneRicette.md#gestione-cambio-ricetta)
+- [Aggiornamento Info Produzione](09-ProductionInfoUpdate.md#aggiornamento-info-produzione)
+- [Statistiche Flowpack](03-StatisticheFlowpack.md#statistiche-flowpack)
+- [Analytics & Allarmi](04-AnalyticsAllarmi.md#analytics--allarmi)
+- [Ranking Allarmi (Frequenza/Downtime)](05-RankingAllarmi.md#ranking-allarmi-frequenzadowntime)
+- [Tempi Macchina](06-TempiMacchina.md#tempi-macchina)
+- [Timestamp & Reset](07-TimestampReset.md#timestamp--reset)
+- [Popup & Logica HMI](08-PopupLogicaHMI.md#popup--logica-hmi)
+
+---
+
+*Documento pronto per validazioni, pubblicazione tecnica e onboarding team SCADA/MES.*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/01-ScadaInterfaceMasterStructure.md b/docs/Omron/MachineAnalytics_SCADA/sections/01-ScadaInterfaceMasterStructure.md
new file mode 100644
index 0000000..e2e2c9d
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/01-ScadaInterfaceMasterStructure.md
@@ -0,0 +1,81 @@
+---
+id: MachineAnalytics_SCADA_ScadaInterfaceMasterStructure
+sidebar_position: 1
+sidebar_label: Stati Macchina e Interfaccia SCADA
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: true
+---
+
+# Stati Macchina e Interfaccia SCADA
+
+---
+
+## Tabella Variabili di Scambio
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|--------------------------|-------------|--------------|---------|---------------------------------------------|
+| IsRunning | BOOL | Output | 🚦 | Macchina in marcia |
+| IsStopped | BOOL | Output | 🛑 | Macchina ferma |
+| IsInEmergency | BOOL | Output | 🚨 | Emergenza attiva |
+| IsWaitingDownstream | BOOL | Output | ⏳ | Attesa segnale macchina a valle |
+| IsWaitingUpstream | BOOL | Output | ⏳ | Attesa prodotto da macchina a monte |
+| IsAlarmActive | BOOL | Output | 🛎️ | Allarme attivo |
+| Heartbeat | BOOL | Output | ❤️ | Segnale di vita PLC |
+| ...altre variabili status... | ... | ... | ... | ... |
+
+---
+
+## Tree Strutturale
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── IsRunning 🚦
+│ ├── IsStopped 🛑
+│ ├── IsInEmergency 🚨
+│ ├── IsWaitingDownstream ⏳
+│ ├── IsWaitingUpstream ⏳
+│ ├── IsAlarmActive 🛎️
+│ ├── Heartbeat ❤️
+│ ├── ...altre variabili...
+```
+
+---
+
+## Diagramma Stato Macchina – Mermaid
+
+```mermaid
+flowchart TD
+ style Running fill:#e3ffe3,stroke:#30db5b,color:#000
+ style Stopped fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style Emergency fill:#ffe6cc,stroke:#ff9800,color:#000
+ style WaitingDown fill:#fff7aa,stroke:#ffd60a,color:#000
+ style WaitingUp fill:#e6ddff,stroke:#5856d6,color:#000
+
+ Running["🚦 Running"]
+ Stopped["🛑 Stopped"]
+ Emergency["🚨 Emergency"]
+ WaitingDown["⏳ WaitingDownstream"]
+ WaitingUp["⏳ WaitingUpstream"]
+
+ Running -->|Stop| Stopped
+ Stopped -->|Start| Running
+ Running -->|Emergency| Emergency
+ Emergency -->|Reset| Stopped
+ Running -->|WaitDownstream| WaitingDown
+ Running -->|WaitUpstream| WaitingUp
+ WaitingDown -->|Resume| Running
+ WaitingUp -->|Resume| Running
+```
+
+---
+
+## Spiegazione Operativa
+
+- Le variabili di status consentono al sistema SCADA di monitorare in tempo reale lo stato macchina, i blocchi di processo e le condizioni di allarme/emergenza.
+- Il segnale **Heartbeat** serve per verificare la corretta comunicazione tra PLC e SCADA.
+- Il diagramma mostra i principali stati logici e i flussi di transizione tipici per troubleshooting e training.
+
+---
+
+*Sezione pronta per mapping OPC-UA e integrazione in sistemi SCADA/MES.*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/02-GestioneRicette.md b/docs/Omron/MachineAnalytics_SCADA/sections/02-GestioneRicette.md
new file mode 100644
index 0000000..38c41fc
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/02-GestioneRicette.md
@@ -0,0 +1,81 @@
+---
+id: MachineAnalytics_SCADA_GestioneRicette
+sidebar_position: 2
+sidebar_label: Gestione Ricette
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: False
+---
+
+# Gestione Ricette
+
+---
+
+## Tabella Variabili di Scambio
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|--------------------------|---------------------|-------------|---------|-------------------------------------------|
+| ActualRecipeIndex | DINT | Output | #️⃣ | Indice ricetta attualmente attiva |
+| ActualRecipeName | STRING[38] | Output | 📝 | Nome ricetta attiva |
+| RecipeList[0..40] | ST_Scada_Recipe | Output | 📋 | Elenco ricette disponibili su PLC |
+| RecipeChangeRequest | BOOL | Input | 📥 | Comando richiesta cambio ricetta |
+| RecipeIndexRequest | DINT | Input | #️⃣ | Indice ricetta da attivare |
+| RecipeProductionInfoRequest | STRING[38] | Input | 🏷️ | Lotto/ordine richiesto per ricetta |
+| RecipeProductionCodeRequest | DINT | Input | #️⃣ | Codice lotto/ordine richiesto per ricetta |
+| RecipeProductionQuantityRequest| DINT | Input | 📦 | Quantità lotto/ordine richiesta per ricetta|
+
+---
+
+## Tree Strutturale
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── ActualRecipeIndex #️⃣
+│ ├── ActualRecipeName 📝
+│ ├── RecipeList[0..40] 📋
+│ │ ├── Index : DINT
+│ │ ├── Name : STRING[38]
+├── Ingress
+│ ├── RecipeChangeRequest 📥
+│ ├── RecipeIndexRequest #️⃣
+│ ├── RecipeProductionInfoRequest 🏷️
+│ ├── RecipeProductionCodeRequest #️⃣
+│ ├── RecipeProductionQuantityRequest 📦
+```
+
+---
+
+## Diagramma Flusso Gestione Ricette – Mermaid
+
+```mermaid
+flowchart TD
+ Idle["🟦 Idle(Attesa richiesta) "]
+ RequestReceived["📥 RequestReceivedRecipeChangeRequest / RecipeIndexRequest "]
+ AckSent["✅ AckSentACK inviato a SCADA "]
+ WaitingForHMI["🧑🔧 WaitingForHMIPopup HMI operatore "]
+ Accepted["🟩 AcceptedRecipeChangeOK (reset 2s) "]
+ Rejected["❌ RejectedRecipeChangeReject (reset 2s) "]
+ Postponed["⏸️ PostponedRecipeChangePostpone (reset 30s) "]
+
+ Idle -->|📥 RecipeChangeRequest| RequestReceived
+ RequestReceived -->|✅ RecipeChangeACK| AckSent
+ AckSent -->|🧑🔧 Handshake HMI| WaitingForHMI
+ WaitingForHMI -->|🟩 Operatore ACCETTA| Accepted
+ WaitingForHMI -->|❌ Operatore RIFIUTA| Rejected
+ WaitingForHMI -->|⏸️ Operatore POSTICIPA| Postponed
+ Accepted -->|⏱️ Reset 2s| Idle
+ Rejected -->|⏱️ Reset 2s| Idle
+ Postponed -->|⏱️ Reset 30s| AckSent
+```
+
+---
+
+## Spiegazione Operativa
+
+- L’array `RecipeList` contiene tutte le ricette disponibili e permette la visualizzazione e selezione da SCADA/HMI.
+- Le variabili di handshake e popup gestiscono in modo sicuro il cambio ricetta, con conferma operatore.
+- Il diagramma mostra il flusso di stato, utile per troubleshooting e validazione.
+
+---
+
+*Sezione pronta per mapping OPC-UA e integrazione in sistemi SCADA/MES. Modifica e amplia secondo le tue variabili specifiche!*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/03-StatisticheFlowpack.md b/docs/Omron/MachineAnalytics_SCADA/sections/03-StatisticheFlowpack.md
new file mode 100644
index 0000000..7f6610e
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/03-StatisticheFlowpack.md
@@ -0,0 +1,102 @@
+---
+id: MachineAnalytics_SCADA_StatisticheFlowpack
+sidebar_position: 3
+sidebar_label: Statistiche Flowpack
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: True
+---
+
+# Statistiche Flowpack
+
+---
+
+## Tabella Variabili di Scambio Statistiche Flowpack
+
+### 🟢 EGRESS (PLC → SCADA)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|------------------------------------|----------------------------|-------------|---------|--------------------------------------------|
+| FlowpackAnalytics.Production | ST_Flowpack_ProductionCounts | Output | 📦 | Dati produzione (totali, buoni, scartati) |
+| FlowpackAnalytics.Rejects | ST_Flowpack_RejectReasons | Output | ❌ | Dettaglio motivi scarto |
+| FlowpackAnalytics.Percentages | ST_Flowpack_Percentages | Output | 📊 | Percentuali produzione/scarti |
+| ActualSpeed | REAL | Output | 🚀 | Velocità attuale [Pacchi/min] |
+| ReferenceSpeed | REAL | Output | 🎯 | Velocità di riferimento da ricetta |
+
+---
+
+### 🔵 INGRESS (SCADA → PLC)
+
+*(Nessuna variabile di comando diretta per produzione Flowpack; solo monitoraggio/statistiche)*
+
+---
+
+## Tree Strutturale Statistiche Flowpack
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── FlowpackAnalytics
+│ │ ├── Production 📦
+│ │ │ ├── Products_In_Total : DINT
+│ │ │ ├── Products_Out_Good : DINT
+│ │ │ ├── Products_Out_Rejected : DINT
+│ │ ├── Rejects ❌
+│ │ │ ├── Reject_EmptyPackets : DINT
+│ │ │ ├── Reject_DoublePackets : DINT
+│ │ │ ├── Reject_CrushedByCrimper : DINT
+│ │ │ ├── Reject_ChainPackets : DINT
+│ │ │ ├── Reject_PictureCardMissPackets : DINT
+│ │ │ ├── Reject_CameraNoGoodPackets : DINT
+│ │ ├── Percentages 📊
+│ │ │ ├── Perc_Good_vs_In : DINT
+│ │ │ ├── Perc_RejectedEmptyPackets : DINT
+│ │ │ ├── Perc_RejectedDoublePackets : DINT
+│ │ │ ├── Perc_RejectedCrushedByCrimper : DINT
+│ │ │ ├── Perc_RejectedChainPackets : DINT
+│ │ │ ├── Perc_RejectedPictureCardMissPackets : DINT
+│ │ │ ├── Perc_RejectedCameraNoGoodPackets : DINT
+│ ├── ActualSpeed 🚀
+│ ├── ReferenceSpeed 🎯
+```
+
+---
+
+## Diagramma Flusso Statistiche Flowpack – Mermaid
+
+```mermaid
+flowchart TD
+ style Production fill:#e3ffe3,stroke:#30db5b,color:#000
+ style Rejects fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style Percentages fill:#fff7aa,stroke:#ffd60a,color:#000
+ style ActualSpeed fill:#e3eeff,stroke:#007aff,color:#000
+ style ReferenceSpeed fill:#e6ddff,stroke:#5856d6,color:#000
+
+ Production["📦 ProductionTotali/Scarti/Buoni "]
+ Rejects["❌ RejectsMotivi Scarto "]
+ Percentages["📊 PercentagesPercentuali "]
+ ActualSpeed["🚀 ActualSpeedPacchi/min attuale "]
+ ReferenceSpeed["🎯 ReferenceSpeedDa ricetta "]
+
+ Production --> Percentages
+ Rejects --> Percentages
+ Production --> ActualSpeed
+ Production --> ReferenceSpeed
+```
+
+---
+
+## Spiegazione Statistiche Flowpack
+
+- **Production**: tiene traccia di tutti i prodotti processati, divisi tra totali, buoni e scartati.
+- **Rejects**: dettaglia la causa di ogni scarto (vuoti, doppi, schiacciati, NG camera, ecc.) per analisi qualità e manutenzione.
+- **Percentages**: percentuali calcolate su buoni/scartati, utili per KPI e controllo efficienza.
+- **ActualSpeed/ReferenceSpeed**: confronto tra velocità reale e quella impostata da ricetta, per monitoraggio produzione.
+
+Questi dati consentono a SCADA/MES di:
+- Visualizzare dashboard di efficienza reale
+- Analizzare cause di scarto e qualità prodotto
+- Fare trend analysis e reportistica OEE
+
+---
+
+*Sezione pronta per essere integrata in sistemi SCADA/MES tramite protocollo OPC-UA.*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/04-AnalyticsAllarmi.md b/docs/Omron/MachineAnalytics_SCADA/sections/04-AnalyticsAllarmi.md
new file mode 100644
index 0000000..3863c35
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/04-AnalyticsAllarmi.md
@@ -0,0 +1,91 @@
+---
+id: MachineAnalytics_SCADA_AnalyticsAllarmi
+sidebar_position: 4
+sidebar_label: Analytics & Allarmi
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: True
+---
+
+# Analytics & Allarmi
+
+---
+
+## Tabella Variabili di Scambio Analytics & Allarmi
+
+### 🟢 EGRESS (PLC → SCADA)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|-------------------------------|----------------------|-------------|---------|------------------------------------------------|
+| Alarms_Packed[0..80] | ST_AlarmAnalytics | Output | 🛎️ | Array compatto allarmi |
+| AlarmAnalytics[].State | BOOL | Output | 📶 | Stato allarme (attivo/disattivo) |
+| AlarmAnalytics[].Count | DINT | Output | 🔢 | Numero attivazioni |
+| AlarmAnalytics[].TotalActiveTime_ms | DINT | Output | ⏱️ | Tempo totale attivo (ms) |
+| AlarmAnalytics[].MTTR_sec | REAL | Output | 🕒 | Mean Time To Repair (sec) |
+| AlarmAnalytics[].MTBF_h | REAL | Output | ⏳ | Mean Time Between Failure (h) |
+
+---
+
+### 🔵 INGRESS (SCADA → PLC)
+
+*(Nessuna variabile di comando diretta per allarmi; solo monitoraggio/statistiche)*
+
+---
+
+## Tree Strutturale Analytics & Allarmi
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── Alarms_Packed[0..80] 🛎️
+│ │ ├── State : BOOL 📶
+│ │ ├── Count : DINT 🔢
+│ │ ├── TotalActiveTime_ms : DINT ⏱️
+│ │ ├── MTTR_sec : REAL 🕒
+│ │ ├── MTBF_h : REAL ⏳
+```
+
+---
+
+## Diagramma Analytics & Allarmi – Mermaid
+
+```mermaid
+flowchart TD
+ style AlarmsPacked fill:#e3eeff,stroke:#007aff,color:#000
+ style State fill:#e3ffe3,stroke:#30db5b,color:#000
+ style Count fill:#fff7aa,stroke:#ffd60a,color:#000
+ style TotalActiveTime fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style MTTR fill:#e6ddff,stroke:#5856d6,color:#000
+ style MTBF fill:#ffe6cc,stroke:#ff9800,color:#000
+
+ AlarmsPacked["🛎️ Alarms_Packed[0..80]"]
+ State["📶 State"]
+ Count["🔢 Count"]
+ TotalActiveTime["⏱️ TotalActiveTime_ms"]
+ MTTR["🕒 MTTR_sec"]
+ MTBF["⏳ MTBF_h"]
+
+ AlarmsPacked --> State
+ AlarmsPacked --> Count
+ AlarmsPacked --> TotalActiveTime
+ AlarmsPacked --> MTTR
+ AlarmsPacked --> MTBF
+```
+
+---
+
+## Spiegazione Operativa
+
+- **Alarms_Packed**: array compatto che aggrega lo stato e le statistiche di ogni allarme, ottimizzato per sistemi con limiti di tag OPC-UA/SCADA.
+- **State**: indica se l’allarme è attivo (TRUE) o inattivo (FALSE).
+- **Count**: numero totale di attivazioni dell’allarme, utile per ranking e analisi manutentiva.
+- **TotalActiveTime_ms**: tempo totale in cui l’allarme è stato attivo, utile per downtime analysis.
+- **MTTR/MTBF**: KPI fondamentali per la manutenzione predittiva e l’efficienza.
+
+Questi dati permettono a SCADA/MES di:
+- Visualizzare lo storico e lo stato real-time degli allarmi
+- Costruire dashboard di ranking/frequenza/downtime
+- Ottimizzare manutenzione e produzione
+
+---
+
+*Sezione pronta per mapping OPC-UA e integrazione in sistemi SCADA/MES. Modifica e amplia secondo le tue variabili specifiche!*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/05-RankingAllarmi.md b/docs/Omron/MachineAnalytics_SCADA/sections/05-RankingAllarmi.md
new file mode 100644
index 0000000..1d89b0c
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/05-RankingAllarmi.md
@@ -0,0 +1,65 @@
+---
+id: MachineAnalytics_SCADA_RankingAllarmi
+sidebar_position: 5
+sidebar_label: Ranking Allarmi (Frequenza/Downtime)
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: True
+---
+
+# Ranking Allarmi (Frequenza/Downtime)
+
+---
+
+## Tabella Variabili di Scambio Ranking Allarmi
+
+### 🟢 EGRESS (PLC → SCADA)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|-------------------------------|-------------------|-------------|---------|----------------------------------------|
+| TopAlarms_ByFrequency[0..99] | ST_TopAlarmEntry | Output | 📈 | Classifica allarmi più frequenti |
+| TopAlarms_ByDowntime[0..99] | ST_TopAlarmEntry | Output | ⏱️ | Classifica allarmi per downtime |
+
+---
+
+## Tree Strutturale Ranking Allarmi
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── TopAlarms_ByFrequency[0..99] 📈
+│ │ ├── AlarmId : DINT
+│ │ ├── Value : LREAL
+│ ├── TopAlarms_ByDowntime[0..99] ⏱️
+│ │ ├── AlarmId : DINT
+│ │ ├── Value : LREAL
+```
+
+---
+
+## Diagramma Ranking Allarmi – Mermaid
+
+```mermaid
+flowchart TD
+ style Analytics fill:#e3eeff,stroke:#007aff,color:#000
+ style RankingFrequency fill:#fff7aa,stroke:#ffd60a,color:#000
+ style RankingDowntime fill:#ffd6d6,stroke:#ff3b30,color:#000
+
+ Analytics["🛎️ AlarmAnalytics"]
+ RankingFrequency["📈 TopAlarms_ByFrequency"]
+ RankingDowntime["⏱️ TopAlarms_ByDowntime"]
+
+ Analytics --> RankingFrequency
+ Analytics --> RankingDowntime
+```
+
+---
+
+## Spiegazione Ranking Allarmi
+
+- **TopAlarms_ByFrequency**: mostra i 100 allarmi con più attivazioni, utile per identificare le cause più ricorrenti di fermo o disturbo.
+- **TopAlarms_ByDowntime**: mostra i 100 allarmi che hanno causato più tempo di fermo, fondamentale per la manutenzione e l’ottimizzazione produttiva.
+- Permette di visualizzare rapidamente le priorità di intervento e di migliorare la qualità della produzione agendo sui punti più critici.
+
+---
+
+*Sezione pronta per mapping OPC-UA e integrazione in sistemi SCADA/MES. Modifica e amplia secondo le tue variabili specifiche!*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/06-TempiMacchina.md b/docs/Omron/MachineAnalytics_SCADA/sections/06-TempiMacchina.md
new file mode 100644
index 0000000..a92e073
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/06-TempiMacchina.md
@@ -0,0 +1,87 @@
+---
+id: MachineAnalytics_SCADA_TempiMacchina
+sidebar_position: 6
+sidebar_label: Tempi Macchina
+hide_table_of_contents: False
+---
+
+# Tempi Macchina
+
+---
+
+## Tabella Variabili di Scambio Tempi Macchina
+
+### 🟢 EGRESS (PLC → SCADA)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|-----------------------|----------|-------------|---------|--------------------------------------------|
+| TotalTime | DINT | Output | ⏱️ | Tempo totale di funzionamento |
+| RunTime | DINT | Output | 🚦 | Tempo in marcia |
+| StopTime | DINT | Output | 🛑 | Tempo in stop |
+| EmergencyTime | DINT | Output | 🚨 | Tempo in emergenza |
+| DownstreamTime | DINT | Output | ⏳ | Tempo in attesa macchina a valle |
+| UpstreamTime | DINT | Output | ⏳ | Tempo in attesa prodotto da monte |
+
+---
+
+### 🔵 INGRESS (SCADA → PLC)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|-------------------|-----------|-------------|---------|------------------------------------------------|
+| ResetCounters | BOOL | Input | 🔄 | Comando reset tempi/statistiche |
+
+---
+
+## Tree Strutturale Tempi Macchina
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── TotalTime ⏱️
+│ ├── RunTime 🚦
+│ ├── StopTime 🛑
+│ ├── EmergencyTime 🚨
+│ ├── DownstreamTime ⏳
+│ ├── UpstreamTime ⏳
+├── Ingress
+│ ├── ResetCounters 🔄
+```
+
+---
+
+## Diagramma Flusso Tempi Macchina – Mermaid
+
+```mermaid
+flowchart TD
+ style TotalTime fill:#e3eeff,stroke:#007aff,color:#000
+ style RunTime fill:#e3ffe3,stroke:#30db5b,color:#000
+ style StopTime fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style EmergencyTime fill:#ffe6cc,stroke:#ff9800,color:#000
+ style DownstreamTime fill:#fff7aa,stroke:#ffd60a,color:#000
+ style UpstreamTime fill:#e6ddff,stroke:#5856d6,color:#000
+
+ TotalTime["⏱️ TotalTime"]
+ RunTime["🚦 RunTime"]
+ StopTime["🛑 StopTime"]
+ EmergencyTime["🚨 EmergencyTime"]
+ DownstreamTime["⏳ DownstreamTime"]
+ UpstreamTime["⏳ UpstreamTime"]
+
+ TotalTime --> RunTime
+ TotalTime --> StopTime
+ TotalTime --> EmergencyTime
+ TotalTime --> DownstreamTime
+ TotalTime --> UpstreamTime
+```
+
+---
+
+## Spiegazione Operativa
+
+- Le variabili di tempo permettono di monitorare l’efficienza della macchina, i fermi e le attese, dando una visione chiara per la reportistica OEE.
+- Il comando **ResetCounters** consente di azzerare i tempi per cambio batch, turno o manutenzione.
+- La struttura è pronta per essere mappata su sistemi SCADA/MES e per analisi di produttività.
+
+---
+
+*Sezione pronta per mapping OPC-UA e integrazione in sistemi SCADA/MES. Modifica e amplia secondo le tue variabili specifiche!*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/07-TimestampReset.md b/docs/Omron/MachineAnalytics_SCADA/sections/07-TimestampReset.md
new file mode 100644
index 0000000..f91fbff
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/07-TimestampReset.md
@@ -0,0 +1,73 @@
+---
+id: MachineAnalytics_SCADA_TimestampReset
+sidebar_position: 7
+sidebar_label: Timestamp & Reset
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: True
+---
+
+# Timestamp & Reset
+
+---
+
+## Tabella Variabili di Scambio Timestamp & Reset
+
+### 🟢 EGRESS (PLC → SCADA)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|---------------------------------|----------|-------------|---------|---------------------------------------------------|
+| ProductionStart_Timestamp | DT | Output | 🟢 | Timestamp avvio produzione |
+| ProductionStop_Timestamp | DT | Output | 🔴 | Timestamp fine produzione |
+| ProductionLastReset_Timestamp | DT | Output | 🔄 | Timestamp ultimo reset statistico |
+
+---
+
+### 🔵 INGRESS (SCADA → PLC)
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|----------------|---------|-------------|---------|--------------------------------------------|
+| ResetCounters | BOOL | Input | 🚦 | Comando reset timestamp/statistiche |
+
+---
+
+## Tree Strutturale Timestamp & Reset
+
+```plaintext
+ST_ScadaInterface
+├── Egress
+│ ├── ProductionStart_Timestamp 🟢
+│ ├── ProductionStop_Timestamp 🔴
+│ ├── ProductionLastReset_Timestamp 🔄
+├── Ingress
+│ ├── ResetCounters 🚦
+```
+
+---
+
+## Diagramma Flusso Timestamp & Reset – Mermaid
+
+```mermaid
+flowchart TD
+ style Start fill:#e3ffe3,stroke:#30db5b,color:#000
+ style Stop fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style LastReset fill:#ffe6cc,stroke:#ff9800,color:#000
+
+ Start["🟢 ProductionStart_Timestamp"]
+ Stop["🔴 ProductionStop_Timestamp"]
+ LastReset["🔄 ProductionLastReset_Timestamp"]
+ ResetCounters["🚦 ResetCounters"]
+
+ ResetCounters --> LastReset
+ Start --> Stop
+```
+
+---
+
+## Spiegazione Operativa
+
+- I timestamp consentono la tracciabilità degli eventi di produzione e facilitano audit, reportistica e troubleshooting.
+- Il comando **ResetCounters** permette di azzerare le statistiche e aggiornare il timestamp di reset, utile per la gestione di batch, turni o manutenzione.
+
+---
+
+*Sezione pronta per mapping OPC-UA e integrazione in sistemi SCADA/MES. Modifica e amplia secondo le tue variabili specifiche!*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/08-PopupLogicaHMI.md b/docs/Omron/MachineAnalytics_SCADA/sections/08-PopupLogicaHMI.md
new file mode 100644
index 0000000..16bdae8
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/08-PopupLogicaHMI.md
@@ -0,0 +1,79 @@
+---
+id: MachineAnalytics_SCADA_PopupLogicaHMI
+sidebar_position: 8
+sidebar_label: Popup & Logica HMI
+pagination_prev: Omron/MachineAnalytics_SCADA/MachineAnalytics_SCADA_Flowpack_MachineAnalytics_Documentation
+hide_table_of_contents: True
+---
+
+# Popup & Logica HMI
+
+---
+
+## Tabella Variabili di Scambio – Popup & Logica HMI
+
+| 🏷️ Nome | 🗃️ Tipo | 🔀 Direzione | 🪄 Icona | 📝 Descrizione Operativa |
+|--------------------------|-------------|--------------|---------|---------------------------------------------------|
+| RecipeChangeRequest | BOOL | Input | 📥 | Richiesta cambio ricetta da SCADA |
+| RecipeChangeACK | BOOL | Output | ✅ | Conferma ricezione richiesta cambio ricetta |
+| RecipeChangeOK | BOOL | Output | 🟩 | Conferma cambio ricetta accettato (reset 2s) |
+| RecipeChangeReject | BOOL | Output | ❌ | Cambio ricetta rifiutato (reset 2s) |
+| RecipeChangePostpone | BOOL | Output | ⏸️ | Cambio ricetta posticipato (reset 30s) |
+| Popup_Timer2s | INT | Output | ⏱️ | Timer reset popup OK/Reject (2s) |
+| Popup_Timer30s | INT | Output | ⏱️ | Timer reset popup Postpone (30s) |
+
+---
+
+## Tree Strutturale Popup & Logica HMI
+
+```plaintext
+ST_ScadaInterface
+├── Ingress
+│ ├── RecipeChangeRequest 📥
+├── Egress
+│ ├── RecipeChangeACK ✅
+│ ├── RecipeChangeOK 🟩
+│ ├── RecipeChangeReject ❌
+│ ├── RecipeChangePostpone ⏸️
+│ ├── Popup_Timer2s ⏱️
+│ ├── Popup_Timer30s ⏱️
+```
+
+---
+
+## Diagramma Flusso Popup & Logica HMI – Mermaid
+
+```mermaid
+flowchart TD
+ style Request fill:#e3eeff,stroke:#007aff,color:#000
+ style ACK fill:#e3ffe3,stroke:#30db5b,color:#000
+ style OK fill:#d6ffe3,stroke:#30db5b,color:#000
+ style Reject fill:#ffd6d6,stroke:#ff3b30,color:#000
+ style Postpone fill:#ffe6cc,stroke:#ff9800,color:#000
+
+ Request["📥 RecipeChangeRequest"]
+ ACK["✅ RecipeChangeACK"]
+ OK["🟩 RecipeChangeOK (reset 2s)"]
+ Reject["❌ RecipeChangeReject (reset 2s)"]
+ Postpone["⏸️ RecipeChangePostpone (reset 30s)"]
+
+ Request --> ACK
+ ACK --> OK
+ ACK --> Reject
+ ACK --> Postpone
+ OK -->|Timer2s| Request
+ Reject -->|Timer2s| Request
+ Postpone -->|Timer30s| ACK
+```
+
+---
+
+## Spiegazione Operativa
+
+- Il flusso di handshake gestisce il cambio ricetta in modo sicuro, con popup per la conferma dell’operatore e timer di reset automatico.
+- Le variabili permettono il dialogo tra SCADA, PLC e HMI, garantendo tracciabilità e controllo sull’azione.
+- Il timer per OK/Reject è di 2 secondi, mentre per Postpone è di 30 secondi, come da best practice industriale.
+
+---
+
+*Sezione pronta per mapping OPC-UA e integrazione in sistemi SCADA/MES. Modifica e amplia secondo le tue variabili specifiche!*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/10-NoteInterfacciaUtilizzo.md b/docs/Omron/MachineAnalytics_SCADA/sections/10-NoteInterfacciaUtilizzo.md
new file mode 100644
index 0000000..39e3977
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/10-NoteInterfacciaUtilizzo.md
@@ -0,0 +1,43 @@
+---
+id: MachineAnalytics_SCADA_NoteInterfacciaUtilizzo
+sidebar_position: 10
+sidebar_label: Note di Interfaccia e Utilizzo
+hide_table_of_contents: False
+---
+
+# Note di Interfaccia e Utilizzo
+
+---
+
+## Linee guida operative
+
+- **Tutte le variabili sono accessibili via OPC-UA:**
+ Utilizza UAexpert per esplorare i nodi, verificare tipi e mapping.
+- **Flow di handshake ricetta/produzione:**
+ Segui i diagrammi di stato nelle sezioni dedicate per troubleshooting e validazione.
+- **Timer di reset (2s, 30s):**
+ Questi garantiscono la coerenza nei popup HMI e negli acknowledgement. Non modificare senza validazione.
+- **In caso di errori di mapping:**
+ Verifica nomi, tipi dati e direzione (Input/Output) direttamente dal client OPC-UA.
+- **Logging eventi:**
+ Il log centralizzato delle transizioni di stato aiuta nell’audit e nel troubleshooting.
+- **Variabili di stato macchina:**
+ Utili per dashboard OEE, analisi produttività e allarmi.
+- **FAQ rapida:**
+ - Cosa fare se il cambio ricetta non viene accettato?
+ → Verifica stato handshake e popup HMI, controlla le variabili di stato.
+ - Come viene visualizzato il popup di conferma su HMI?
+ → Gestito tramite flag e timer nelle variabili dedicate (vedi diagrammi di stato).
+
+---
+
+## Best Practice
+
+- Mantieni la nomenclatura delle variabili coerente tra PLC, SCADA e documentazione.
+- Aggiorna la documentazione in caso di modifiche all’interfaccia o nuovi tag.
+- Segnala nel log ogni evento critico (cambio ricetta, lotto, produzione, allarme) per audit e analisi.
+- Utilizza sempre strumenti di test come UAexpert prima di rilasciare in produzione.
+
+---
+
+*Sezione pensata per facilitare l’integrazione, la validazione e l’utilizzo quotidiano della piattaforma SCADA/MES.*
\ No newline at end of file
diff --git a/docs/Omron/MachineAnalytics_SCADA/sections/_11-FAQ_Troubleshooting.md b/docs/Omron/MachineAnalytics_SCADA/sections/_11-FAQ_Troubleshooting.md
new file mode 100644
index 0000000..9d343fa
--- /dev/null
+++ b/docs/Omron/MachineAnalytics_SCADA/sections/_11-FAQ_Troubleshooting.md
@@ -0,0 +1,76 @@
+---
+id: MachineAnalytics_SCADA_FAQ_Troubleshooting
+sidebar_position: 11
+sidebar_label: FAQ & Troubleshooting
+hide_table_of_contents: False
+unlisted: true
+displayed_sidebar: null
+---
+
+# FAQ & Troubleshooting
+
+---
+
+## Domande frequenti
+
+### ❓ Il cambio ricetta non viene accettato, cosa posso controllare?
+
+- Verifica che la richiesta sia valida (`RecipeChangeRequest` attivo, indice ricetta corretto).
+- Assicurati che il flag di controllo remoto sia abilitato (`RemoteControlEn`).
+- Controlla lo stato della macchina: deve essere in condizioni accettabili per il cambio (non in emergenza, non in ciclo).
+- Consulta il log eventi: cerca messaggi di stato “Rejected” o “Postponed”.
+- Controlla che il popup HMI sia effettivamente visibile e attenda la conferma operatore.
+
+---
+
+### ❓ Non vedo il popup di conferma su HMI, come lo attivo?
+
+- Verifica che la variabile di handshake (`AckChangeRecipeToHMI` o `ActivateUpdatePopup`) sia TRUE.
+- Assicurati che la macchina sia nello stato “WaitingForHMI” (vedi diagrammi di stato).
+- Controlla che il timer di reset non abbia già azzerato la richiesta.
+- Se usi UAexpert: cerca la variabile specifica e verifica il valore in tempo reale.
+
+---
+
+### ❓ La produzione non aggiorna i dati richiesti, dove può essere il problema?
+
+- Controlla che la richiesta (`ProductionChangeRequest`) sia attiva.
+- Verifica che i dati (`ProductionCodeRequest`, `ProductionQuantityRequest`, ecc.) siano valorizzati correttamente.
+- Accertati che il popup HMI sia gestito e che l’operatore abbia confermato (“OK”).
+- Consulta il log per eventuali “Rejected” o “Postponed”.
+
+---
+
+### ❓ Alcune variabili non sono visibili via OPC-UA
+
+- Usa UAexpert per esplorare la struttura e validare la presenza dei nodi.
+- Verifica la configurazione del server OPC-UA (tag esposti, permessi).
+- Controlla la versione e la configurazione di runtime del PLC.
+- Assicurati che le variabili siano attive e valorizzate nel ciclo PLC.
+
+---
+
+### ❓ Gli allarmi non arrivano sul client SCADA
+
+- Controlla le variabili di stato (`IsAlarmActive`, `Alarms_Packed[]`).
+- Verifica la configurazione e il mapping dei tag OPC-UA.
+- Consulta la sezione “Analytics & Allarmi” per struttura e flusso dati.
+
+---
+
+## Suggerimenti operativi per troubleshooting
+
+- **Log eventi:**
+ Consulta sempre il log centralizzato per capire cause e sequenza delle transizioni di stato.
+- **Diagrammi di stato:**
+ Usa i diagrammi come guida rapida per capire dove si trova la macchina nel ciclo di richiesta/accettazione.
+- **UAexpert:**
+ Strumento essenziale per validare mapping, visualizzare variabili, testare handshake in tempo reale.
+- **Verifica timer:**
+ Se una variabile “OK” o “Reject” si azzera troppo presto, controlla la configurazione dei timer di reset.
+- **Documentazione sempre aggiornata:**
+ Se modifichi il PLC, aggiorna subito la documentazione delle variabili e i diagrammi di stato.
+
+---
+
+*Se trovi nuove domande o casi ricorrenti, aggiorna questa sezione per tenere la squadra sempre operativa!*
diff --git a/docs/Secomea/setup-1549dev.md b/docs/Secomea/setup-1549dev.md
new file mode 100644
index 0000000..a40cb67
--- /dev/null
+++ b/docs/Secomea/setup-1549dev.md
@@ -0,0 +1,148 @@
+---
+id: GestioneSiteManager1
+sidebar_position: 2
+title: 'Secomea SiteManager 1549 Dev Separation'
+sidebar_label: SiteManager 1549 Dev Separation
+pagination_prev: null
+hide_table_of_contents: true
+---
+
+
+
+Term
+: Definition for the term.
+: Another definition for the same term.
+
+Another Term
+: Definition of another term.
+
+
+:::info Obiettivo
+Avere due reti separate e sicure, accessibili in modo indipendente tramite GateManager.
+
+Questa guida è pensata per tecnici e amministratori di sistema che devono configurare un SiteManager per isolare la rete di una macchina (DEV2) dalla rete di impianto principale (DEV1).
+:::
+
+### **1️⃣ Accesso all'interfaccia di Configurazione**
+1️
+
+1. Prima di iniziare, accedi all'interfaccia web del SiteManager.
+
+Apri un browser e collegati all'indirizzo IP del SiteManager.
+
+Accedi tramite la rete locale (porta DEV1) o, se già configurato, attraverso il GateManager.
+
+Una volta dentro, naviga nel menu
+
+System per visualizzare tutte le interfacce di rete.
+
+
+2️⃣ Configurazione della Porta DEV2
+Ora configuriamo la porta DEV2 per operare come una rete indipendente.
+
+Dal menu
+
+System, clicca sulla scheda DEV2.
+
+Imposta i seguenti parametri nella pagina di configurazione:
+
+
+Mode: Seleziona Separation dal menu a tendina.
+
+
+
+IP Address: Assegna l'indirizzo IP che farà da gateway per la nuova rete (es. 172.16.223.254).
+
+
+
+
+Subnet Mask: Inserisci la maschera di sottorete corrispondente (es. 255.255.240.0).
+
+
+Clicca su
+
+Save per memorizzare le impostazioni.
+
+
+Apparirà un avviso per il riavvio. Clicca sul pulsante
+
+Reboot per rendere effettive le modifiche.
+
+
+
+
+
+:::danger Attenzione
+Il riavvio è un passaggio obbligatorio. Senza di esso, la porta DEV2 non funzionerà nella nuova modalità. Il riavvio cancella i log di sistema.
+
+
+
+
+:::
+
+3️⃣ Creazione dell'Agente Layer 2
+Dopo il riavvio, la porta DEV2 è attiva sulla sua nuova rete. Ora dobbiamo creare un "Agente" per potervi accedere da remoto.
+
+Spostati nella sezione GateManager -> Agents.
+
+Crea un nuovo agente.
+
+Come
+
+Device Type, seleziona Layer2 (GENERIC).
+
+
+Una volta creato, clicca sull'icona
+
+Edit (matita) per configurarlo.
+
+4️⃣ Associazione Agente-Interfaccia
+Questo è il passaggio cruciale per collegare l'agente software alla porta fisica corretta.
+
+All'interno delle impostazioni dell'agente, trova il menu a tendina Interface.
+
+Seleziona
+
+DEV2 dall'elenco.
+
+
+Clicca su
+
+Save e poi su Back per tornare alla lista agenti.
+
+
+
+
+:::tip
+Non è necessario compilare i campi "Device IP Address" o "Device MAC Address" a meno che tu non voglia limitare l'accesso a un singolo dispositivo specifico su quella rete.
+
+
+:::
+
+5️⃣ ✔️ Verifica Finale
+Se la configurazione è andata a buon fine, il risultato sarà immediatamente visibile sul GateManager.
+
+Doppia Connessione: Vedrai due agenti Layer 2 attivi per lo stesso SiteManager:
+
+Un agente per la rete su
+
+DEV1.
+
+Un agente per la nuova rete su
+
+DEV2.
+
+Questo conferma che le reti sono isolate e accessibili in modo indipendente.
+
+:::info Nota Pratica
+Per convenzione, su alcuni impianti (es. Rockwell) si preferisce usare le porte
+
+DEV1 e DEV3. La procedura per configurare la porta DEV3 è identica a quella descritta per la DEV2.
+
+
+:::
+
+🔗 Risorse Utili
+
+
+Help Online del SiteManager: L'interfaccia del dispositivo contiene una sezione di aiuto dettagliata per ogni parametro di configurazione.
\ No newline at end of file
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000..6c1da2c
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,8 @@
+---
+title: "Welcome"
+description: "Your documentation starts here."
+---
+
+# Hello, docmd!
+
+Start writing your Markdown content here.
diff --git a/package.json b/package.json
index e7def43..919495f 100644
--- a/package.json
+++ b/package.json
@@ -15,11 +15,11 @@
"typecheck": "tsc"
},
"dependencies": {
- "@docusaurus/core": "^3.8.1",
- "@docusaurus/plugin-pwa": "^3.8.1",
- "@docusaurus/preset-classic": "^3.8.1",
- "@docusaurus/theme-classic": "^3.8.1",
- "@docusaurus/theme-mermaid": "^3.8.1",
+ "@docusaurus/core": "^3.9.0",
+ "@docusaurus/plugin-pwa": "^3.9.0",
+ "@docusaurus/preset-classic": "^3.9.0",
+ "@docusaurus/theme-classic": "^3.9.0",
+ "@docusaurus/theme-mermaid": "^3.9.0",
"@easyops-cn/docusaurus-search-local": "^0.52.1",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
@@ -28,9 +28,9 @@
"react-dom": "^19.0.0"
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "3.8.1",
- "@docusaurus/tsconfig": "3.8.1",
- "@docusaurus/types": "3.8.1",
+ "@docusaurus/module-type-aliases": "^3.9.0",
+ "@docusaurus/tsconfig": "^3.9.0",
+ "@docusaurus/types": "^3.9.0",
"typescript": "~5.6.2"
},
"browserslist": {
diff --git a/site/HyperV/Gestione/index.html b/site/HyperV/Gestione/index.html
new file mode 100644
index 0000000..0e9300c
--- /dev/null
+++ b/site/HyperV/Gestione/index.html
@@ -0,0 +1,478 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gestione VM Hyper-V : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🖥️ Gestione VM Hyper-V
+
🎨 Guida passo-passo per configurare e gestire macchine virtuali Hyper-V
+
💡 L’obiettivo: avere un ambiente pronto per import/export VM e gestione dischi senza errori
+
Questa guida è pensata per sviluppatori e amministratori di sistema che necessitano di un ambiente Hyper-V organizzato e efficiente per la gestione delle macchine virtuali.
+
+
0️⃣ Installazione e Rimozione di Hyper-V
+
Prima di iniziare, è fondamentale avere un’installazione pulita di Hyper-V.
+
Installazione di Hyper-V (se non presente)
+
Apri PowerShell come Amministratore .
+Esegui il comando seguente per installare tutti i componenti di Hyper-V:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -All -NoRestart
+
+
+Al termine, riavvia il computer per completare l’installazione.
+
+
Rimozione di versioni precedenti o corrotte (Opzionale)
+
Se sospetti un’installazione problematica, puoi eseguire una pulizia completa.
+
Apri PowerShell come Amministratore .
+Esegui il comando per disabilitare e rimuovere tutte le funzionalità di Hyper-V:Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart
+
+
+
+
:::danger Attenzione
+Questo comando rimuove tutti i componenti di Hyper-V. Sarà necessario un riavvio per completare la disinstallazione.
+
+
1️⃣ Requisiti Software
+
Per seguire questa guida è necessario avere un ambiente PowerShell moderno e correttamente configurato.
+
:::info Prerequisito
+Se non hai ancora installato e configurato PowerShell 7, segui prima la nostra guida dedicata.
+
➡️ Guida alla Configurazione dell’Ambiente PowerShell
+
+Script VmManage.ps1
+Questo strumento facilita le operazioni di import ed export.
+
+Percorso di rete: \\tecnopack.local\sviluppo\Virtuale_Machines\Virtual_Machine-Hyper-V\VMScript\VmManage.ps1
+
+
+
+
+
2️⃣ Configurazione dei Commutatori Virtuali (Virtual Switch)
+
I commutatori virtuali sono essenziali per connettere le VM alla rete.
+
Rimozione sicura dei Virtual Switch esistenti
+
Per evitare conflitti, è consigliabile rimuovere le configurazioni precedenti.
+
Apri PowerShell come Amministratore .
+Elenca gli switch esistenti per verificarli:
+powershell Get-VMSwitch
+Assicurati che tutte le VM siano spente.
+Rimuovi tutti gli switch con un singolo comando:Get-VMSwitch | Remove-VMSwitch -Force
+
+
+
+
Creazione dei nuovi Commutatori
+
Apri Gestione Hyper-V dal menu Start.
+Nel pannello Azioni a destra, clicca su Gestione commutatori virtuali… .
+
+
+Commutatore 1: Wifi
+
+Tipo: Esterno
+Scheda di rete: Seleziona la tua scheda di rete Wi-Fi.
+Scopo: Permette alle VM di connettersi tramite la rete wireless.
+
+<img src=“/img/screenshots/hyperv/switch_wifi.jpg” alt=“Configurazione Commutatore Wifi” style={{ maxWidth: ‘60%’, borderRadius: ‘8px’ }} />
+
+
+Commutatore 2: LAN
+
+Tipo: Esterno
+Scheda di rete: Seleziona la tua scheda di rete cablata (Ethernet).
+Scopo: Permette alle VM di connettersi tramite la rete cablata.
+
+<img src=“/img/screenshots/hyperv/switch_lan.jpg” alt=“Configurazione Commutatore LAN” style={{ maxWidth: ‘60%’, borderRadius: ‘8px’ }} />
+
+
+
+
+
3️⃣ Impostazioni dei Percorsi di Hyper-V
+
Una corretta organizzazione dei file previene problemi futuri. Imposta questi percorsi prima di creare o importare VM.
+
+Dischi rigidi virtuali: D:\VMs
+Macchine virtuali: D:\VMs
+
+
:::tip
+Usare una cartella radice unica come D:\VMs per dischi e configurazioni semplifica il backup e la gestione. Hyper-V creerà automaticamente sottocartelle con i nomi delle VM.
+
+
4️⃣ 🚀 Utilizzo dello script VmManage.ps1
+
Questo script automatizza le operazioni di esportazione e importazione.
+
4.1 Preparazione
+
Copia l’intera cartella VMScript in una directory locale (es. Documenti).
+Apri PowerShell 7 come Amministratore .
+Naviga nella cartella dove hai copiato lo script:cd ~\Documenti\VMScript
+
+
+
+
4.2 Abilitazione ed Esecuzione dello Script
+
Per motivi di sicurezza, PowerShell blocca l’esecuzione di script di default. Per abilitare l’esecuzione solo per la sessione corrente, esegui questo comando:
+
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
+
+
:::info Nota
+Questo comando imposta il criterio di esecuzione solo per la finestra di PowerShell corrente. Una volta chiusa, la policy tornerà al suo valore predefinito. È una pratica sicura per eseguire script attendibili.
+
Ora, esegui lo script:
+
.\VmManage.ps1
+
+
Lo script mostrerà un menu interattivo per scegliere l’operazione.
+<img src=“/img/screenshots/hyperv/Script1.jpg” alt=“Menu principale dello script” style={{ maxWidth: ‘70%’, borderRadius: ‘8px’ }} />
+
Export (E): Spegne la VM, ne crea una copia in una cartella con timestamp (es. VM_Export_2023-10-27_10-30-00), e la riavvia. Ideale per creare backup sicuri.
+<img src=“/img/screenshots/hyperv/ScriptE.jpg” alt=“Processo di Esportazione” style={{ maxWidth: ‘70%’, borderRadius: ‘8px’ }} />
+
Import (I): Ti guida nell’importazione di una VM, chiedendoti un nuovo nome e la cartella di destinazione. Controlla lo spazio su disco prima di iniziare.
+<img src=“/img/screenshots/hyperv/ScriptI.jpg” alt=“Processo di Importazione” style={{ maxWidth: ‘70%’, borderRadius: ‘8px’ }} />
+
4.3 Note Pratiche
+✅ Esegui sempre PowerShell come Amministratore.
+
✅ Mantieni i percorsi delle VM organizzati come configurato al punto 3.
+
✅ Scegli nomi chiari e descrittivi per le VM importate.
+
🔗 Risorse Utili
+Documentazione ufficiale Hyper-V di Microsoft: Per approfondimenti e risoluzione di problemi.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/HyperV/configurazione-ambiente-powershell/index.html b/site/HyperV/configurazione-ambiente-powershell/index.html
new file mode 100644
index 0000000..72bb967
--- /dev/null
+++ b/site/HyperV/configurazione-ambiente-powershell/index.html
@@ -0,0 +1,390 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Configurazione Ambiente PowerShell per Sviluppo : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🖥️ Guida Rapida: Setup Ambiente di Sviluppo PowerShell
+
Questo documento descrive la procedura in due passaggi per configurare un ambiente di sviluppo PowerShell 7 completo, partendo da un’installazione pulita di Windows.
+
:::info Nota sulla Sicurezza e l’Accesso Offline
+Questa procedura è stata progettata per garantire la massima sicurezza e conformità con le policy aziendali. Tutti i file di installazione necessari (Git, PowerShell 7, ecc.) vengono prelevati da una condivisione di rete interna sicura. In questo modo, non è richiesta una connessione a Internet durante il setup sul computer client e si evitano blocchi da parte dei sistemi di sicurezza come Fortinet, assicurando un’installazione rapida, offline e standardizzata.
+
:::info Prerequisiti
+
Accesso alla rete aziendale (per raggiungere lo script sulla condivisione).
+Un Personal Access Token (PAT) di GitLab con permessi di lettura sul repository.
+
+
:::
+
1️⃣ Eseguire lo Script di Bootstrap (Bootstrap-DevEnv.ps1)
+
Questo primo script si occupa di installare Git e di clonare il repository con tutti gli strumenti necessari.
+
Apri una console Windows PowerShell. Non è necessario aprirla come Amministratore.
+
+Copia lo script in locale. Per evitare problemi di sicurezza con l’esecuzione di script da percorsi di rete, il primo passo è copiare lo script in una cartella temporanea sul tuo PC. Esegui questo comando:
+
+
+
Copy-Item -Path "\\tecnopack.local\sviluppo\utility\Bootstrap-DevEnv.ps1" -Destination "$env:TEMP \Bootstrap-DevEnv.ps1"
+
+
Esegui lo script locale. Ora, lancia la copia dello script che hai appena creato. Questo comando ignorerà temporaneamente i criteri di sicurezza solo per questa esecuzione.
+
PowerShell -ExecutionPolicy Bypass -File "$env:TEMP \Bootstrap-DevEnv.ps1" -GitLabToken "IL_TUO_TOKEN_QUI"
+
+
:::danger Importante:
+Sostituisci “IL_TUO_TOKEN_QUI” con il tuo token GitLab personale che ti forniranno i Gitlab-Admin.
+
:::
+
2️⃣ Eseguire lo Script di Setup Finale (Setup-PowerShell7Dev.ps1)
+
Una volta che il primo script ha terminato, il repository si troverà nella cartella Documenti. Ora puoi lanciare lo script che installerà e configurerà PowerShell 7, i font e il terminale.
+
Apri una nuova console PowerShell come amministratore.
+
Naviga nella cartella del repository appena clonato con il seguente comando:
+
cd $env:USERPROFILE \Documents\Script\Repos\hyperv-vmscripts
+
+
Lancia lo script di setup:
+
PowerShell -ExecutionPolicy Bypass -File ".\Setup-PowerShell7Dev.ps1"
+
+
Attendi che completi tutti i passaggi (installerà PowerShell 7, Oh My Posh, i font e aggiornerà le impostazioni di Windows Terminal).
+
️3️⃣ Completamento
+
Al termine del secondo script, la configurazione è completa.
+
Chiudi tutte le finestre di PowerShell e riavvia Windows Terminal.
+
Dovresti trovare un nuovo profilo chiamato “PowerShell 7 - Dev” (o simile) che si avvia con la versione 7 e mostra il prompt personalizzato da Oh My Posh.
+
4️⃣ Impostare PowerShell 7 come predefinito
+
Per evitare di usare la vecchia versione, impostala come predefinita in Windows Terminal .
+
Apri Windows Terminal .
+Vai su Impostazioni (o Ctrl + ,).
+Nella sezione Profilo di avvio , seleziona “PowerShell” (icona scura).
+<img src=“/img/screenshots/hyperv/wt-startup-profile.png” alt=“Selezione del profilo di avvio” style={{ maxWidth: ‘70%’, borderRadius: ‘8px’ }} />
+Salva le modifiche.
+
+
+
Prossimi Passi
+
Ora che il tuo ambiente è pronto, puoi tornare alla guida per la gestione delle macchine virtuali.
+
➡️ Vai alla Guida alla Gestione di VM Hyper-V
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Omron/index.html b/site/Omron/Omron/index.html
new file mode 100644
index 0000000..138962b
--- /dev/null
+++ b/site/Omron/Omron/index.html
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/0-ScadaInterfaceMasterStructure/index.html b/site/Omron/Statistiche/0-ScadaInterfaceMasterStructure/index.html
new file mode 100644
index 0000000..8481e03
--- /dev/null
+++ b/site/Omron/Statistiche/0-ScadaInterfaceMasterStructure/index.html
@@ -0,0 +1,672 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Architettura ScadaInterface : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🛠️ Architettura ScadaInterface
+
⚙️ Scopo
+
Per garantire una comunicazione robusta e manutenibile tra il PLC e il sistema SCADA, è stata creata una struttura dati dedicata e unificata.
+Questa struttura, un’istanza di ST_ScadaInterface, funge da unica fonte di verità per tutti i dati scambiati tramite OPC UA.
+
È una struttura di tipo NJ , progettata per sfruttare la comunicazione basata su “tag”, ed è suddivisa in due parti logiche:
+
+Egress : Dati che fluiscono DAL PLC ALLO SCADA (sola lettura per lo SCADA).
+Ingress : Dati e comandi che fluiscono DALLO SCADA AL PLC (scrivibili dallo SCADA).
+
+
+
⚙️ Struttura Master
+
Per prima cosa, definiamo la struttura principale che conterrà i due flussi di dati.
+
(* Struttura master per l'interfaccia SCADA *)
+TYPE ST_ScadaInterface :
+STRUCT NJ
+ Ingress : ST_Ingress; // Dati IN ENTRATA dallo SCADA
+ Egress : ST_Egress; // Dati IN USCITA verso lo SCADA
+END_STRUCT
+END_TYPE
+
+
+
⚙️ Struttura ST_Egress (PLC → SCADA)
+
Questa struttura contiene tutte le informazioni di stato, le analisi di produzione e i dati macchina che il PLC rende disponibili al sistema SCADA.
+
⚙️ Flag di Stato Macchina
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+IsRunning
+BOOL
+Flag VERO quando la macchina è in uno stato di marcia.
+
+
+IsStopped
+BOOL
+Flag VERO quando la macchina è ferma.
+
+
+IsInEmergency
+BOOL
+Flag VERO quando un’emergenza è attiva.
+
+
+IsWaitingDownstream
+BOOL
+Flag VERO quando in attesa di un segnale dalla macchina a valle.
+
+
+IsWaitingUpstream
+BOOL
+Flag VERO quando in attesa di un prodotto dalla macchina a monte.
+
+
+IsAlarmActive
+BOOL
+Flag VERO quando un qualsiasi allarme macchina è attivo.
+
+
+
+
⚙️ Flag di Handshake e Controllo
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+AckChangeRecipe
+BOOL
+Conferma (Ack) del PLC a un comando di cambio ricetta.
+
+
+RemoteControlEnable
+BOOL
+Flag che indica se il controllo remoto da SCADA è abilitato.
+
+
+ProductionChangeOK
+BOOL
+Conferma del PLC che il cambio produzione è avvenuto con successo.
+
+
+RecipeChangeOK
+BOOL
+Conferma del PLC che il cambio ricetta è avvenuto con successo.
+
+
+RecipeChangeReject
+BOOL
+Flag che indica che il cambio ricetta è stato rifiutato dall’Operatore.
+
+
+RecipeChangePostpone
+BOOL
+Flag che indica che il cambio ricetta è stato rimandato dall’Operatore.
+
+
+MesCommunicationFault
+BOOL
+Flag VERO se c’è un errore di comunicazione con il MES.
+
+
+
+
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+ActualRecipeIndex
+DINT
+Indice della ricetta attualmente attiva.
+
+
+ActualRecipeName
+STRING[38]
+Nome della ricetta attualmente attiva.
+
+
+ActualProductionInfo
+STRING[38]
+Descrizione del lotto/ordine di produzione attuale.
+
+
+ActualProductionCode
+DINT
+Codice del lotto/ordine di produzione attuale.
+
+
+MachineStatus
+DINT
+Codice di stato generale della macchina (come da visualizzazione HMI).
+
+
+
+
⚙️ Watchdog di Comunicazione
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+PlcWatchdog
+DINT
+Contatore di watchdog del PLC inviato allo SCADA.
+
+
+
+
⚙️ Strutture Dati di Analisi
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+TimeAnalytics
+ST_MachineTimers
+Statistiche dettagliate basate sul tempo.
+
+
+ProductionAnalytics
+ST_ProductionAnalytics
+Statistiche dettagliate basate sulla produzione.
+
+
+
+
⚙️ Dati Allarmi
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+AlarmAnalytics
+ARRAY[0..1399] OF ST_AlarmAnalytics
+Dati analitici per ogni singolo allarme.
+
+
+TopAlarms_ByFrequency
+ARRAY[0..99] OF ST_TopAlarmEntry
+Classifica degli allarmi più frequenti.
+
+
+TopAlarms_ByDowntime
+ARRAY[0..99] OF ST_TopAlarmEntry
+Classifica degli allarmi che causano più downtime.
+
+
+Alarms_Packed
+ARRAY[0..80] OF WORD
+Array compatto per visualizzazione rapida degli allarmi.
+
+
+
+
+
⚙️ Struttura ST_Ingress (SCADA → PLC)
+
Questa struttura contiene tutti i comandi e i setpoint che il sistema SCADA può inviare al PLC.
+
⚙️ Comandi di Controllo Produzione
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+ProductionChangeRequest
+BOOL
+Comando da SCADA per richiedere un cambio produzione/lotto.
+
+
+RecipeChangeRequest
+BOOL
+Comando da SCADA per richiedere un cambio ricetta.
+
+
+ResetCounters
+BOOL
+Comando da SCADA per resettare le statistiche.
+
+
+RemoteStopMachine
+BOOL
+Comando da SCADA per arrestare la macchina da remoto.
+
+
+
+
⚙️ Richieste Dati Ricetta e Produzione
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+RequestRecipeIndex
+DINT
+Indice della ricetta richiesta.
+
+
+RequestProductionQuantity
+DINT
+Quantità di produzione richiesta.
+
+
+RequestProductionCode
+DINT
+Codice del lotto/ordine di produzione richiesto.
+
+
+RequestProductionInfo
+STRING[38]
+Descrizione del lotto/ordine richiesta.
+
+
+
+
⚙️ Watchdog di Comunicazione
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+ScadaWatchdog
+DINT
+Contatore di watchdog dello SCADA ricevuto dal PLC.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/1-SottoStrutture/index.html b/site/Omron/Statistiche/1-SottoStrutture/index.html
new file mode 100644
index 0000000..3d3aa57
--- /dev/null
+++ b/site/Omron/Statistiche/1-SottoStrutture/index.html
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sotto Struttura ScadaInterface : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Sotto-Strutture di ScadaInterface
+
Questa sezione descrive in dettaglio le strutture dati “mattoncino” utilizzate all’interno dell’interfaccia SCADA.
+
Struttura ST_StateStatistics
+
Questa è la struttura base per l’analisi dei tempi. Contiene i dati calcolati per un singolo stato macchina (es. Marcia, Arresto, etc.). Viene riutilizzata per ogni stato che si desidera monitorare.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+Hours
+DINT
+Le ore totali accumulate per lo stato.
+
+
+Minutes
+DINT
+I minuti totali accumulati per lo stato (0-59).
+
+
+Percentage
+DINT
+La percentuale del tempo totale in cui lo stato è stato attivo. Il valore è un intero con due decimali fissi (es. 1234 rappresenta 12.34%).
+
+
+
+
Struttura ST_MachineTimers
+
Questa struttura raggruppa tutte le analisi dei tempi in un unico blocco, rendendo i dati facili da navigare per lo SCADA. Ogni membro di questa struttura è del tipo ST_StateStatistics definito sopra.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+TotalTime
+ST_StateStatistics
+Contiene il tempo totale di monitoraggio. La percentuale di questo stato è sempre 100%.
+
+
+RunTime
+ST_StateStatistics
+Contiene i dati relativi al tempo in cui la macchina è stata in marcia (Running).
+
+
+StopTime
+ST_StateStatistics
+Contiene i dati relativi al tempo in cui la macchina è stata in arresto (Stopped).
+
+
+EmergencyTime
+ST_StateStatistics
+Contiene i dati relativi al tempo in cui la macchina è stata in emergenza (Emergency).
+
+
+DownstreamTime
+ST_StateStatistics
+Contiene i dati relativi al tempo passato in attesa di un segnale dalla macchina a valle.
+
+
+UpstreamTime
+ST_StateStatistics
+Contiene i dati relativi al tempo passato in attesa di un prodotto dalla macchina a monte.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/2-scada-interface-stat-allarmi/index.html b/site/Omron/Statistiche/2-scada-interface-stat-allarmi/index.html
new file mode 100644
index 0000000..b800453
--- /dev/null
+++ b/site/Omron/Statistiche/2-scada-interface-stat-allarmi/index.html
@@ -0,0 +1,427 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Statistiche Allarmi : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Strutture per le Statistiche degli Allarmi
+
Questa sezione descrive l’architettura dei dati utilizzati per l’analisi avanzata degli allarmi, che include il calcolo di KPI come MTTR (Tempo Medio di Riparazione) e MTBF (Tempo Medio tra i Guasti), e la gestione di classifiche (“Top Alarms”) per identificare i problemi più critici.
+
+
Struttura ST_AlarmAnalytics
+
Questa è la struttura “mattoncino” che contiene tutte le analisi calcolate per un singolo allarme .
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+State
+BOOL
+Stato attuale dell’allarme (VERO = Attivo).
+
+
+Count
+DINT
+Conteggio totale delle occorrenze (Frequenza) di questo allarme.
+
+
+TotalActiveTime_ms
+LINT
+Tempo totale, in millisecondi, in cui questo allarme è rimasto attivo.
+
+
+MTTR_sec
+LREAL
+Tempo Medio di Riparazione (Mean Time To Repair), in secondi. Indica il tempo medio necessario per risolvere l’allarme.
+
+
+MTBF_h
+LREAL
+Tempo Medio tra i Guasti (Mean Time Between Failures), in ore. Indica il tempo medio di buon funzionamento tra un’occorrenza e l’altra di questo allarme.
+
+
+
+
+
Struttura ST_TopAlarmEntry
+
Questa struttura rappresenta una singola riga all’interno di una classifica di allarmi (“Top Alarms”). Viene usata per le due classifiche principali: quella per frequenza e quella per tempo di fermo.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+AlarmId
+DINT
+L’ID numerico dell’allarme. Un valore di -1 indica uno slot vuoto nella classifica.
+
+
+Value
+LREAL
+Il valore utilizzato per ordinare la classifica (può essere la frequenza o il tempo totale di attività in millisecondi).
+
+
+
+
+
Dati Allarmi nella Struttura ST_Egress
+
Infine, la struttura ST_Egress (dati in uscita verso lo SCADA) contiene gli array che rendono disponibili tutte queste informazioni.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+AlarmAnalytics
+ARRAY[0..1399] OF ST_AlarmAnalytics
+Un array che contiene i dati analitici dettagliati per ogni singolo allarme.
+
+
+TopAlarms_ByFrequency
+ARRAY[0..99] OF ST_TopAlarmEntry
+La classifica dei 100 allarmi più frequenti.
+
+
+TopAlarms_ByDowntime
+ARRAY[0..99] OF ST_TopAlarmEntry
+La classifica dei 100 allarmi che hanno causato il maggior tempo di fermo.
+
+
+Alarms_Packed
+ARRAY[0..80] OF WORD
+Un array compatto di word per una rappresentazione rapida e a basso livello dello stato di tutti gli allarmi.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/3-scada-interface-stat-flowpack/index.html b/site/Omron/Statistiche/3-scada-interface-stat-flowpack/index.html
new file mode 100644
index 0000000..ef3e690
--- /dev/null
+++ b/site/Omron/Statistiche/3-scada-interface-stat-flowpack/index.html
@@ -0,0 +1,485 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Statistiche Flowpack : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Strutture per le Statistiche della Flowpack
+
Questa sezione descrive l’architettura dei dati utilizzati per raccogliere e analizzare i conteggi di produzione, specifici per la macchina Flowpack .
+
+
Struttura ST_Flowpack_ProductionCounts
+
Questa è la struttura che contiene i conteggi di produzione principali (ingresso e uscita) per la Flowpack.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+Products_In_Total
+DINT
+Contatore totale dei prodotti in ingresso alla macchina.
+
+
+Products_Out_Good
+DINT
+Contatore totale dei prodotti in uscita conformi (buoni).
+
+
+Products_Out_Rejected
+DINT
+Contatore totale dei prodotti in uscita scartati (somma di tutte le cause).
+
+
+
+
+
Struttura ST_Flowpack_RejectReasons
+
Questa struttura raggruppa i contatori per ogni singola causa di scarto specifica della Flowpack.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+Reject_EmptyPackets
+DINT
+Scarto per buste vuote.
+
+
+Reject_DoublePackets
+DINT
+Scarto per buste doppie.
+
+
+Reject_CrushedByCrimper
+DINT
+Scarto per prodotto schiacciato dalle ganasce saldanti.
+
+
+Reject_ChainPackets
+DINT
+Scarto per problemi legati alla catena di trasporto.
+
+
+Reject_PictureCardMissPackets
+DINT
+Scarto per mancata inserzione della figurina/card.
+
+
+Reject_CameraNoGoodPPackets
+DINT
+Scarto rilevato dal sistema di visione (telecamera).
+
+
+
+
+
Struttura ST_Flowpack_Percentages
+
Questa struttura contiene tutte le percentuali calcolate per la Flowpack, pronte per la visualizzazione.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+Perc_Good_vs_In
+DINT
+% di prodotti buoni rispetto al totale entrato.
+
+
+Perc_RejectedEmptyPackets
+DINT
+Ripartizione % degli scarti per “Buste Vuote”.
+
+
+Perc_RejectedDoublePackets
+DINT
+Ripartizione % degli scarti per “Buste Doppie”.
+
+
+Perc_RejectedCrushedByCrimper
+DINT
+Ripartizione % degli scarti per “Schiacciamento Ganasce”.
+
+
+Perc_RejectedChainPackets
+DINT
+Ripartizione % degli scarti per “Problemi Catena”.
+
+
+Perc_RejectedPictureCardMissPackets
+DINT
+Ripartizione % degli scarti per “Mancata Figurina”.
+
+
+Perc_RejectedCameraNoGoodPPackets
+DINT
+Ripartizione % degli scarti per “Telecamera”.
+
+
+
+
+
Struttura DT_Flowpack_Analytics
+
Infine, questa è la struttura “contenitore” che unisce tutti i dati della Flowpack in un unico blocco logico.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+Production
+ST_Flowpack_ProductionCounts
+La struttura che contiene i conteggi di produzione IN/OUT.
+
+
+Rejects
+ST_Flowpack_RejectReasons
+La struttura che contiene i dettagli delle cause di scarto.
+
+
+Percentages
+ST_Flowpack_Percentages
+La struttura che contiene tutte le percentuali calcolate.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/4-Statistiche-Row-Distribution/index.html b/site/Omron/Statistiche/4-Statistiche-Row-Distribution/index.html
new file mode 100644
index 0000000..87ac32f
--- /dev/null
+++ b/site/Omron/Statistiche/4-Statistiche-Row-Distribution/index.html
@@ -0,0 +1,527 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Statistiche Row Distribution : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Strutture per le Statistiche di Produzione
+
Questa sezione descrive l’architettura dei dati utilizzati per raccogliere e analizzare i conteggi di produzione, specifici per la macchina Row Distribution .
+
+
Struttura ST_ChannelData
+
Questa è la struttura “mattoncino” che contiene tutti i conteggi grezzi e le percentuali calcolate per un singolo canale o impilatore.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+— Conteggi Grezzi —
+
+
+
+
+PiecesEntered
+DINT
+Pezzi totali entrati sull’impilatore del canale.
+
+
+Pieces_Stacked
+DINT
+Prodotti totali impilati da questo canale.
+
+
+Stacks_Sent
+DINT
+Pile totali inviate con successo da questo canale.
+
+
+StacksRejected
+DINT
+Pile totali scartate da questo canale.
+
+
+Rejects_Trapdoor
+DINT
+Pezzi scartati alla botola per questo canale (è il totale degli scarti).
+
+
+Rejects_RecipeMismatch
+DINT
+Pezzi scartati a causa di ricetta non conforme.
+
+
+Rejects_Jam
+DINT
+Pezzi scartati a causa di un inceppo nell’impilatore.
+
+
+Rejects_Clump
+DINT
+Pezzi scartati a causa di ammassi o accumuli.
+
+
+— Percentuali Calcolate (per canale) —
+
+
+
+
+Perc_Rejected_Trapdoor
+DINT
+% di pezzi scartati alla botola rispetto al totale entrato.
+
+
+Perc_Pieces_Stacked
+DINT
+% di pezzi impilati rispetto al totale entrato.
+
+
+Perc_Stacks_Sent
+DINT
+% di pile inviate rispetto al totale pile gestite (inviate + scartate).
+
+
+Perc_Stacks_Rejected
+DINT
+% di pile scartate rispetto al totale pile gestite.
+
+
+Perc_Reject_RecipeMismatch
+DINT
+Ripartizione % degli scarti per “Ricetta non conforme”.
+
+
+Perc_Reject_Clump
+DINT
+Ripartizione % degli scarti per “Ammassi”.
+
+
+Perc_Reject_Jam
+DINT
+Ripartizione % degli scarti per “Inceppo”.
+
+
+
+
+
Struttura ST_ProductionTotals
+
Questa struttura raggruppa tutti i conteggi globali della macchina, ottenuti sommando i dati dei singoli canali o da contatori generali.
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+IncomingRanks
+DINT
+Ranghi totali inseriti sulla linea di distribuzione.
+
+
+RanksDischarged_Module1
+DINT
+Ranghi totali scaricati verso la Flowpack 1.
+
+
+RanksDischarged_Module2
+DINT
+Ranghi totali scaricati verso la Flowpack 2.
+
+
+RanksDischarged_Module3
+DINT
+Ranghi totali scaricati verso la Flowpack 3.
+
+
+RanksDischarged_Buffer
+DINT
+Ranghi totali scaricati verso il nastro buffer.
+
+
+TotalStacksSent
+DINT
+Pile totali inviate ai moduli a valle.
+
+
+StacksOnLastRank
+DINT
+Numero di pile presenti sull’ultimo rango caricato.
+
+
+TotalStacksOnStackers
+DINT
+Numero istantaneo di pile fisicamente presenti su tutti gli impilatori.
+
+
+TotalStacksRejected
+DINT
+Numero totale di pile scartate.
+
+
+TotalProductsEntered
+DINT
+Prodotti totali “equivalenti” entrati nella linea.
+
+
+TotalRejectedProducts_Trapdoor
+DINT
+Prodotti totali scartati alla botola.
+
+
+GrandTotalProductsHandled
+DINT
+Somma totale di tutti i prodotti gestiti (Entrati + Scartati).
+
+
+
+
+
Struttura ST_ProductionAnalytics
+
Infine, questa è la struttura “contenitore” che unisce i dati dei canali e i totali in un unico blocco logico per la Row Distribution .
+
+
+
+Nome Variabile
+Tipo Dati
+Descrizione
+
+
+
+
+Channels
+ARRAY[0..4] OF ST_ChannelData
+Un array che contiene i dati dettagliati per ognuno dei 5 canali.
+
+
+Totals
+ST_ProductionTotals
+La struttura che contiene tutti i conteggi globali della macchina.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/flusso-comunicazione/index.html b/site/Omron/Statistiche/flusso-comunicazione/index.html
new file mode 100644
index 0000000..20209a0
--- /dev/null
+++ b/site/Omron/Statistiche/flusso-comunicazione/index.html
@@ -0,0 +1,384 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Flusso di Scambio Dati (PLC-HMI-SCADA) : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Flusso di Scambio Dati (PLC-HMI-SCADA)
+
Panoramica
+
Questo documento descrive la logica e la sequenza dinamica di “handshake” utilizzate per la comunicazione tra il PLC, l’interfaccia operatore (HMI) e il sistema di supervisione (SCADA). L’obiettivo è garantire uno scambio dati robusto e a prova di errore per le operazioni critiche come il cambio produzione e il monitoraggio della connessione.
+
Processo Principale: Cambio Ricetta/Produzione
+
Il processo di cambio ricetta è l’interazione più complessa e viene gestito da una macchina a stati (S60_RecipeManagement) nel PLC per garantire che ogni passo venga eseguito nella sequenza corretta.
+
Sequenza di Scambio Dati
+
Il “dialogo” tra i tre sistemi segue questi passaggi:
+
Abilitazione (HMI): L’operatore abilita il controllo remoto sull’HMI.
+
+HMI -> PLC: Imposta MachineAnalytics.HMI_Interface.RemoteControlEn = TRUE.
+
+
+Richiesta (SCADA): Lo SCADA invia i dati per la nuova produzione (Indice Ricetta, Codice Lotto, etc.) e imposta il bit di richiesta.
+
+SCADA -> PLC: Imposta ScadaInterface.Ingress.ProductionChangeRequest = TRUE.
+
+
+Ack a SCADA (PLC): Il PLC valida la richiesta. Se è corretta, risponde immediatamente:
+
+PLC -> SCADA: Invia la conferma di ricezione (Egress.AckChangeRecipe = TRUE).
+
+
+Completamento Handshake (SCADA): Lo SCADA, non appena riceve l’Ack, sa che il PLC ha preso in carico la richiesta e abbassa subito il suo bit di richiesta.
+
+SCADA -> PLC: Imposta Ingress.ProductionChangeRequest = FALSE.
+
+
+Completamento Handshake (PLC): Il PLC, vedendo che la richiesta è stata abbassata, abbassa a sua volta il suo AckChangeRecipe. L’handshake iniziale è concluso e il PLC procede autonomamente.
+
+Attivazione Pop-up (PLC): Il PLC attiva il flag per l’apertura del pop-up sull’HMI.
+
+PLC -> HMI: Imposta HMI_Interface.AckChangeRecipeToHMI = TRUE.
+
+
+Visualizzazione (HMI): L’HMI mostra il pop-up di conferma all’operatore con i dati della ricetta richiesta.
+
+Risposta (Operatore): L’operatore sceglie una delle opzioni sul pop-up:
+
+ACCETTA: L’HMI imposta HMI_Interface.RecipeChangeOk = TRUE. Il PLC esegue l’azione (carica la ricetta, aggiorna i dati) e invia l’esito positivo allo SCADA (Egress.RecipeChangeOK = TRUE per 2 secondi).
+RIFIUTA (o preme X): L’HMI imposta HMI_Interface.RejectRecipeChange = TRUE (o CloseMESWindow). Il PLC invia l’esito negativo allo SCADA (Egress.RecipeChangeReject = TRUE per 2 secondi).
+POSTICIPA: L’HMI imposta HMI_Interface.BatchChangePopupDismiss = TRUE. Il PLC invia lo stato di attesa allo SCADA (Egress.RecipeChangePostpone = TRUE), avvia un timer (30 secondi) e, alla scadenza, torna al Passo 6 per far riapparire il pop-up.
+
+
+
+
+
Handshake di Base: Watchdog (Heartbeat)
+
Per garantire che la comunicazione sia sempre attiva, è implementato un meccanismo di “heartbeat” a bit alternato.
+
+Dal PLC allo SCADA: Il PLC inverte il valore del bit ScadaInterface.Egress.PlcHeartbeat_Toggle ogni secondo.
+Dallo SCADA al PLC: Lo SCADA deve leggere PlcHeartbeat_Toggle e ricopiarne il valore nel bit ScadaInterface.Ingress.ScadaHeartbeat_Echo.
+Controllo del PLC: Se PlcHeartbeat_Toggle e ScadaHeartbeat_Echo rimangono diversi per più di un tempo di timeout (es. 3 secondi), il PLC imposta a VERO il flag ScadaInterface.Egress.MesCommunicationFault.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/flusso-comunicazione1/index.html b/site/Omron/Statistiche/flusso-comunicazione1/index.html
new file mode 100644
index 0000000..5080ad5
--- /dev/null
+++ b/site/Omron/Statistiche/flusso-comunicazione1/index.html
@@ -0,0 +1,420 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Flusso di Scambio Dati (PLC - HMI - SCADA) : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Flusso di Scambio Dati (PLC - HMI - SCADA)
+
Questo documento descrive il processo di scambio dati tra PLC, HMI e SCADA
+per la gestione del cambio ricetta e del meccanismo di heartbeat (watchdog) .
+
+
Sequence Diagram – Cambio Ricetta e Heartbeat
+
sequenceDiagram
+ autonumber
+ participant HMI as HMI (Operatore)
+ participant PLC as PLC
+ participant SCADA as SCADA
+
+ Note over HMI: Operatore abilita controllo remoto
+ HMI->>PLC: RemoteControlEn = TRUE
+
+ Note over SCADA: Invio nuova produzione (indice ricetta, lotto, …)
+ SCADA->>PLC: ProductionChangeRequest = TRUE
+
+ PLC-->>SCADA: AckChangeRecipe = TRUE
+ SCADA-->>PLC: ProductionChangeRequest = FALSE
+ PLC-->>SCADA: AckChangeRecipe = FALSE
+
+ PLC-->>HMI: AckChangeRecipeToHMI = TRUE (apri pop-up)
+
+ alt Operatore ACCETTA
+ HMI->>PLC: RecipeChangeOk = TRUE
+ PLC->>PLC: Carica ricetta / aggiorna dati
+ PLC-->>SCADA: RecipeChangeOK = TRUE (2s)
+ else Operatore RIFIUTA (o chiude)
+ HMI->>PLC: RejectRecipeChange = TRUE (o CloseMESWindow)
+ PLC-->>SCADA: RecipeChangeReject = TRUE (2s)
+ else Operatore POSTICIPA
+ HMI->>PLC: BatchChangePopupDismiss = TRUE
+ PLC->>PLC: Avvia timer 30s
+ PLC-->>SCADA: RecipeChangePostpone = TRUE
+ PLC-->>HMI: (allo scadere 30s) ri-apri pop-up
+ end
+
+ par Heartbeat / Watchdog
+ loop ogni 1s
+ PLC-->>SCADA: PlcHeartbeat_Toggle (inverti bit)
+ SCADA-->>PLC: ScadaHeartbeat_Echo = PlcHeartbeat_Toggle
+ end
+ PLC->>PLC: Se mismatch > 3s ⇒ MesCommunicationFault = TRUE
+ end
+
+
+
State Diagram – Macchina a stati (S60_RecipeManagement)
+
stateDiagram-v2
+ [*] --> Idle
+
+ Idle --> Handshake_In: ProductionChangeRequest ↑
+ Handshake_In --> Wait_Request_Low: AckChangeRecipe = TRUE
+ Wait_Request_Low --> Popup_To_HMI: ProductionChangeRequest = FALSE, AckChangeRecipe = FALSE
+
+ Popup_To_HMI --> Wait_Operator: AckChangeRecipeToHMI = TRUE
+
+ state Wait_Operator {
+ [*] --> AwaitChoice
+ AwaitChoice --> ApplyRecipe: RecipeChangeOk = TRUE
+ AwaitChoice --> RejectRecipe: RejectRecipeChange = TRUE
+ AwaitChoice --> Postpone: BatchChangePopupDismiss = TRUE
+
+ ApplyRecipe --> ReportOK: (carica/aggiorna dati)
+ ReportOK --> [*]
+
+ RejectRecipe --> ReportReject
+ ReportReject --> [*]
+
+ Postpone --> Timer30s
+ Timer30s --> Popup_To_HMI: allo scadere 30s (riapri pop-up)
+ }
+
+ note right of ReportOK
+ Egress.RecipeChangeOK = TRUE (2s)
+ end note
+
+ note right of ReportReject
+ Egress.RecipeChangeReject = TRUE (2s)
+ end note
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Omron/Statistiche/flusso-comunicazione2/index.html b/site/Omron/Statistiche/flusso-comunicazione2/index.html
new file mode 100644
index 0000000..cc8a696
--- /dev/null
+++ b/site/Omron/Statistiche/flusso-comunicazione2/index.html
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Flusso di Scambio Dati (PLC-HMI-SCADA) : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Flusso di Scambio Dati (PLC - HMI - SCADA)
+
Questo documento descrive il processo di scambio dati tra PLC, HMI e SCADA
+per la gestione del cambio ricetta e del meccanismo di heartbeat (watchdog) .
+
+
Sequence Diagram – Cambio Ricetta e Heartbeat
+
sequenceDiagram
+ autonumber
+ participant HMI as HMI (Operatore)
+ participant PLC as PLC
+ participant SCADA as SCADA
+
+ Note over HMI: Operatore abilita controllo remoto
+ HMI->>PLC: RemoteControlEn = TRUE
+
+ Note over SCADA: Invio nuova produzione (indice ricetta, lotto, …)
+ SCADA->>PLC: ProductionChangeRequest = TRUE
+
+ PLC-->>SCADA: AckChangeRecipe = TRUE
+ SCADA-->>PLC: ProductionChangeRequest = FALSE
+ PLC-->>SCADA: AckChangeRecipe = FALSE
+
+ PLC-->>HMI: AckChangeRecipeToHMI = TRUE (apri pop-up)
+
+ alt Operatore ACCETTA
+ HMI->>PLC: RecipeChangeOk = TRUE
+ PLC->>PLC: Carica ricetta / aggiorna dati
+ PLC-->>SCADA: RecipeChangeOK = TRUE (2s)
+ else Operatore RIFIUTA (o chiude)
+ HMI->>PLC: RejectRecipeChange = TRUE (o CloseMESWindow)
+ PLC-->>SCADA: RecipeChangeReject = TRUE (2s)
+ else Operatore POSTICIPA
+ HMI->>PLC: BatchChangePopupDismiss = TRUE
+ PLC->>PLC: Avvia timer 30s
+ PLC-->>SCADA: RecipeChangePostpone = TRUE
+ PLC-->>HMI: (allo scadere 30s) ri-apri pop-up
+ end
+
+ par Heartbeat / Watchdog
+ loop ogni 1s
+ PLC-->>SCADA: PlcHeartbeat_Toggle (inverti bit)
+ SCADA-->>PLC: ScadaHeartbeat_Echo = PlcHeartbeat_Toggle
+ end
+ PLC->>PLC: Se mismatch > 3s ⇒ MesCommunicationFault = TRUE
+ end
+
+
+
State Diagram – Macchina a stati (S60_RecipeManagement)
+
stateDiagram-v2
+ [*] --> Idle
+
+ Idle --> Handshake_In: ProductionChangeRequest ↑
+ Handshake_In --> Wait_Request_Low: AckChangeRecipe = TRUE
+ Wait_Request_Low --> Popup_To_HMI: ProductionChangeRequest = FALSE, AckChangeRecipe = FALSE
+
+ Popup_To_HMI --> Wait_Operator: AckChangeRecipeToHMI = TRUE
+
+ state Wait_Operator {
+ [*] --> AwaitChoice
+ AwaitChoice --> ApplyRecipe: RecipeChangeOk = TRUE
+ AwaitChoice --> RejectRecipe: RejectRecipeChange = TRUE
+ AwaitChoice --> Postpone: BatchChangePopupDismiss = TRUE
+
+ ApplyRecipe --> ReportOK: (carica/aggiorna dati)
+ ReportOK --> [*]
+
+ RejectRecipe --> ReportReject
+ ReportReject --> [*]
+
+ Postpone --> Timer30s
+ Timer30s --> Popup_To_HMI: allo scadere 30s (riapri pop-up)
+ }
+
+ note right of ReportOK
+ Egress.RecipeChangeOK = TRUE (2s)
+ end note
+
+ note right of ReportReject
+ Egress.RecipeChangeReject = TRUE (2s)
+ end note
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/CreareUnPulsanteDiNavigazione/index.html b/site/Rockwell/Optix/CreareUnPulsanteDiNavigazione/index.html
new file mode 100644
index 0000000..44861ad
--- /dev/null
+++ b/site/Rockwell/Optix/CreareUnPulsanteDiNavigazione/index.html
@@ -0,0 +1,420 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Creare un pulsante di navigazione : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
import useBaseUrl from ‘@docusaurus/useBaseUrl’;
+
🔘 Creare un Pulsante di Navigazione
+
Hai creato la tua nuova pagina (bravo! 👏), ma ora serve un modo per arrivarci, no? È il momento di aggiungere un pulsante di navigazione .
+
In questa guida vedremo come creare un pulsante per navigare da una schermata all’altra utilizzando i componenti custom messi a disposizione nel progetto Optix.
+
+
🧭 Principio di funzionamento
+
I pulsanti di navigazione disponibili sono diversi, ma condividono lo stesso principio base :
+
+🎯 A ogni pulsante viene associata una pagina di destinazione tramite il parametro Panel.
+
+
+
🧮 Tipi di pulsanti di navigazione
+
A seconda del contesto in cui ti trovi, scegli il template più adatto tra quelli disponibili. Ogni pulsante è pensato per uno scenario d’uso specifico.
+
+
+
+Template
+Descrizione
+
+
+
+
+tpAxHomeButton
+🔁 Pulsante per il comando di azzeramento di un singolo asse
+
+
+tpDualAxHomeButton
+🔀 Variante del precedente, consente l’azzeramento simultaneo di più assi . Utile quando gli azzeramenti devono essere coordinati tra più assi.
+
+
+tpButtNavigationLateral
+🧭 Pulsante da utilizzare nel menù laterale principale dell’interfaccia (quello sempre visibile sulla sinistra). Garantisce coerenza visiva e funzionale.
+
+
+tpButtNavigationSetup
+⚙️ Pulsante standard per la navigazione nelle pagine di setup . Ha uno stile neutro e coerente con l’ambiente di configurazione.
+
+
+tpButtNavigationAdvMenu
+🧩 Pulsante progettato per i menù a griglia come il menù avzato o vari sottomenù o con layout esplorativi. Ideale per strutture ad accesso rapido o dinamico.
+
+
+tpButtNavigationDiagnostic
+🧯 Pulsante per la navigazione alle pagine di diagnostica . Include un badge di stato che può mostrare la presenza di un fault o anomalia.
+
+
+
+
+💡 Suggerimento : usa il pulsante giusto per ogni contesto. Non è solo una questione estetica: migliora l’usabilità e rende l’interfaccia più intuitiva per l’operatore.
+
+
+
🛠️ Come crearne uno
+
Per inserire un nuovo pulsante di navigazione:
+
Fai clic destro sul contenitore in cui desideri aggiungerlo (può essere una Panel, una GroupBox, ecc.).
+Seleziona:
+New > tpTemplates > tpButtons > Navigation > <tipo desiderato>
+
+
📷 Esempio:
+
<img src={useBaseUrl(‘/img/screenshots/optix/create-navigation-button.jpg’)} alt=“Creazione pulsante di navigazione” style={{ maxWidth: ‘100%’, borderRadius: ‘8px’, marginTop: ‘1rem’ }} />
+
+
⚙️ Parametrizzazione del pulsante
+
Dopo aver creato il pulsante, selezionalo e imposta la pagina di destinazione :
+
Vai nel menu delle proprietà a sinistra
+Trova il parametro Panel
+Seleziona la pagina a cui vuoi che il pulsante navighi
+
+
📷 Esempio:
+
<img src={useBaseUrl(‘/img/screenshots/optix/parametrize-navigation-button.jpg’)} alt=“Parametri del pulsante di navigazione” style={{ maxWidth: ‘100%’, borderRadius: ‘8px’, marginTop: ‘1rem’ }} />
+
+
🚀 E ora?
+
Fatto! A questo punto, il tuo pulsante è operativo: durante il runtime, cliccandoci sopra, l’utente verrà portato direttamente alla pagina che hai configurato.
+
+
+🧙♂️ Pro tip : dai un nome chiaro al tuo pulsante e alla pagina di destinazione. Ti ringrazierai tra qualche progetto, fidati.
+
+
+
✅ Conclusione
+
Creare pulsanti di navigazione è semplice e potente. Ti permette di costruire un’esperienza utente fluida, organizzata e professionale, mantenendo la coerenza con il resto dell’interfaccia.
+
E poi… vuoi mettere la soddisfazione di cliccare su un bottone che funziona davvero ?
+
🚪➡️ Vai e clicca, l’interfaccia ti aspetta!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/CreareUnaNuovaPagina/index.html b/site/Rockwell/Optix/CreareUnaNuovaPagina/index.html
new file mode 100644
index 0000000..07ff169
--- /dev/null
+++ b/site/Rockwell/Optix/CreareUnaNuovaPagina/index.html
@@ -0,0 +1,452 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Creare una nuova pagina : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
import useBaseUrl from ‘@docusaurus/useBaseUrl’;
+
🛠️ Creare una nuova pagina in Optix
+
Creare una nuova pagina nel progetto Optix è molto semplice, ma richiede l’uso di un tipo derivato, non della pagina base standard. Questo perché la nostra struttura adotta proprietà estese per funzionalità avanzate.
+
+
📁 Dove creare la pagina
+
Per iniziare:
+
Fai clic destro sulla cartella Screens o su una delle sue sottocartelle.
+Seleziona:
+New > All > User interface > tpTemplates > tpScreens > tpBaseScreen
+
+
<img src={useBaseUrl(‘img/screenshots/optix/createBasePage.jpg’)} alt=“Creazione pagina base in Optix” style={{ maxWidth: ‘100%’, marginTop: ‘1rem’, borderRadius: ‘8px’ }} />
+
+
⚙️ Parametri fondamentali
+
Una volta creata la pagina, selezionala dal menu laterale e configura i seguenti parametri nel pannello di sinistra:
+
+
+
+Parametro
+Descrizione
+
+
+
+
+PageNumber
+Il numero identificativo univoco della pagina. Serve sia alla documentazione che alla navigazione gestita da PLC. Deve essere univoco!
+
+
+PageName
+Il nome della pagina. È un campo di tipo Localized Text , quindi può essere collegato al dizionario delle traduzioni. Verrà visualizzato insieme al PageNumber nell’Header del pannello.
+
+
+PageType
+Definisce il tipo di pagina tramite un enumeratore . Questo valore influisce sul colore dell’header e sulla logica di accesso.
+
+
+Father
+Indica la pagina padre , ovvero quella a cui tornare premendo “indietro” nell’header del pannello.
+
+
+
+
+
🧭 PageType — Elenco dei tipi disponibili
+
Qui sotto trovi l’elenco dei valori disponibili per PageType:
+
+
+
+Valore
+Display Name
+
+
+
+
+0
+Home
+
+
+1
+Menù
+
+
+2
+Allarmi
+
+
+3
+Modalità operativa
+
+
+4
+Ricette
+
+
+5
+Abilitazioni
+
+
+6–7
+–Reserved–
+
+
+8
+Masse saldanti
+
+
+9
+–Reserved–
+
+
+10
+Mini setup
+
+
+11
+Full setup
+
+
+12
+Diagnostica
+
+
+13–19
+–Reserved–
+
+
+20
+Altro
+
+
+
+
+⚠️ Attenzione: I valori “Reserved” non devono essere utilizzati a meno di indicazioni specifiche da parte del team di sviluppo.
+
+
+
✅ Conclusione
+
Seguendo questi semplici passaggi, sarai in grado di creare una pagina completamente funzionale all’interno dell’ambiente Optix, con parametri ben configurati per garantire compatibilità, navigazione e coerenza visiva.
+
Grandi cose ti aspettano, giovane Padawan! 🧙♂️✨
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/IOCardConfig/index.html b/site/Rockwell/Optix/DotNet/IOCardConfig/index.html
new file mode 100644
index 0000000..c527b54
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/IOCardConfig/index.html
@@ -0,0 +1,416 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IOCardConfig : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
📦 Configurazione delle Schede IO (IOCardConfig)
+
La configurazione delle schede IO è un elemento fondamentale per il corretto funzionamento del sistema.
+
Questa configurazione descrive tutte le caratteristiche delle schede Input/Output (IO) che possono essere sia normali sia di sicurezza (safety), e viene fornita in un file YAML che viene poi letto e interpretato dal software.
+
+
🧩 Struttura generale della configurazione
+
La configurazione è organizzata in due sezioni principali:
+
+NormalIoCards : contiene la definizione delle schede IO normali.
+SafetyIoCards : contiene la definizione delle schede IO di sicurezza.
+
+
Ogni sezione è composta da un insieme di schede, ognuna identificata da un nome univoco (ad esempio AB:1734_DI8:C:0:). Per ogni scheda sono definiti i seguenti elementi:
+
+
+
+Proprietà
+Descrizione
+
+
+
+
+type
+Tipo generico della scheda (es. IB8, OB8, IT2I) che indica la funzione o famiglia della scheda.
+
+
+nodeType
+Nome del template grafico usato per rappresentare la scheda nell’interfaccia utente.
+
+
+iODirection
+Direzione IO, indica se la scheda è di tipo input (“I”) o output (“O”).
+
+
+colors
+Definizione dei colori usati nella UI per la scheda e i suoi LED (acceso/spento).
+
+
+
+
+
⚠️ Specifiche per le schede di sicurezza (SafetyIoCards)
+
Le schede di sicurezza hanno una proprietà in più rispetto a quelle normali:
+
+outputType : indica il tipo di output associato alla scheda di sicurezza (es. AB:1734_IB8S:O:0).
+Serve a collegare la scheda di input safety con il suo corrispettivo output, necessario per la logica di sicurezza.
+
+
+
🎨 Dettaglio sui colori
+
La sezione colors permette di personalizzare l’aspetto della scheda nell’interfaccia grafica, con valori numerici che rappresentano i colori:
+
+card : colore principale della scheda.
+led_on : colore del LED quando è acceso (es. LED verde acceso).
+led_off : colore del LED quando è spento (es. LED rosso spento).
+
+
+
📝 Esempio pratico di configurazione YAML
+
normalIoCards:
+ AB:1734_DI8:C:0:
+ type: IB8
+ nodeType: IOCard_8B
+ iODirection: I
+ colors:
+ card: 0xff1b83df
+ led_on: 0xff00fa7e
+ led_off: 0xff0f4d29
+
+ AB:1734_DOB8:C:0:
+ type: OB8
+ nodeType: IOCard_8B
+ iODirection: O
+ colors:
+ card: 0xff40aa84
+ led_on: 0xffea2e2e
+ led_off: 0xff500f0f
+
+safetyIoCards:
+ AB:1734_IB8S_Safety2:I:0:
+ outputType: AB:1734_IB8S:O:0
+ type: IB8S
+ nodeType: IOCard_8BS
+ iODirection: I
+ colors:
+ card: 0xffe4564b
+ led_on: 0xff00fa7e
+ led_off: 0xff0f4d29
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.AlarmImporter/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.AlarmImporter/index.html
new file mode 100644
index 0000000..7e5ee54
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.AlarmImporter/index.html
@@ -0,0 +1,367 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AlarmImporter : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class AlarmImporter
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Classe statica per l’importazione di allarmi da file Excel (.xlsx)
+nella struttura del progetto FTOptix, inclusi dizionari e traduzioni.
+
public static class AlarmImporter
+
+
Inheritance
+
object ←
+AlarmImporter
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Methods
+
ImportAlarmsInsideOwner(IUANode, string, string)
+
Importa allarmi da un file Excel nella struttura del progetto,
+collegandoli al nodo logico specificato.
+
public static void ImportAlarmsInsideOwner (this IUANode owner, string alrmFilePath, string fileName )
+
+
Parameters
+
owner IUANode
+
Nodo logico a cui verranno aggiunti dizionari e allarmi.
+
alrmFilePath string
+
Percorso completo del file Excel contenente gli allarmi.
+
fileName string
+
Nome utilizzato per creare le sottocartelle nel progetto.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.BaseIOCardDefinition/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.BaseIOCardDefinition/index.html
new file mode 100644
index 0000000..71887bb
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.BaseIOCardDefinition/index.html
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BaseIOCardDefinition : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class BaseIOCardDefinition
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Classe base astratta per le definizioni di schede IO, contenente proprietà condivise tra le varie tipologie.
+
public abstract class BaseIOCardDefinition
+
+
Inheritance
+
object ←
+BaseIOCardDefinition
+
Derived
+
NormalIOCardDefinition ,
+SafetyIOCardDefinition
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Constructors
+
BaseIOCardDefinition()
+
protected BaseIOCardDefinition ()
+
+
Properties
+
Colors
+
Mappa tra nomi di colori e valori interi non negativi.
+Può essere utilizzata per rappresentazioni grafiche o codifiche di stato.
+
public Dictionary<string , uint > Colors { get ; set ; }
+
+
Property Value
+
Dictionary
+<
+string ,
+uint
+>
+
IODirection
+
Direzione del segnale IO: tipicamente “I” (Input) o “O” (Output).
+
public string IODirection { get ; set ; }
+
+
Property Value
+
string
+
NodeType
+
Indica il tipo di nodo associato alla scheda, utile per raggruppamenti logici o di rete.
+
public string NodeType { get ; set ; }
+
+
Property Value
+
string
+
Type
+
Specifica il tipo generale della scheda IO (ad esempio, “input” o “output”).
+
public string Type { get ; set ; }
+
+
Property Value
+
string
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.ConsoleLauncher/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.ConsoleLauncher/index.html
new file mode 100644
index 0000000..cdc3372
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.ConsoleLauncher/index.html
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ConsoleLauncher : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class ConsoleLauncher
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Classe statica responsabile dell’esecuzione di uno script batch da console
+e della lettura dell’input prodotto dallo script stesso.
+
public static class ConsoleLauncher
+
+
Inheritance
+
object ←
+ConsoleLauncher
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Methods
+
Launch(string, string)
+
Crea ed esegue uno script batch all’interno di una cartella temporanea,
+attende la fine dell’esecuzione e restituisce l’input dell’utente letto da file.
+
public static string Launch (string tempFolder, string script )
+
+
Parameters
+
tempFolder string
+
Percorso della cartella temporanea dove verrà salvato ed eseguito lo script.
+
script string
+
Contenuto dello script batch da eseguire. Deve contenere il placeholder #outputFilePath#
+che verrà sostituito con il percorso reale del file di output.
+
Returns
+
string
+
Valore immesso dall’utente nello script batch, oppure null in caso di errore.
+
+
Il metodo crea un file .bat e un file .txt temporanei, li elimina al termine dell’esecuzione.
+Il valore inserito dall’utente viene letto dal file .txt generato dallo script batch.
+
Exceptions
+
Exception
+
Eventuali eccezioni vengono intercettate internamente; viene restituito null in caso di errore.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.DynamicLinkExtensions/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.DynamicLinkExtensions/index.html
new file mode 100644
index 0000000..9a10fb5
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.DynamicLinkExtensions/index.html
@@ -0,0 +1,412 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DynamicLinkExtensions : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class DynamicLinkExtensions
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Classe di estensione per la creazione e gestione dei Dynamic Link su variabili UA in FTOptix.
+
public static class DynamicLinkExtensions
+
+
Inheritance
+
object ←
+DynamicLinkExtensions
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Methods
+
GetElementSize(object)
+
Restituisce la dimensione in byte dell’elemento di un array.
+
public static int GetElementSize (object obj )
+
+
Parameters
+
obj object
+
Oggetto che deve essere un array di tipi valore.
+
Returns
+
int
+
Dimensione in byte dell’elemento dell’array.
+
Exceptions
+
ArgumentException
+
Se l’oggetto non è un array.
+
InvalidOperationException
+
Se il tipo dell’elemento non può essere determinato o non è un tipo valore.
+
SetDynamicLink(IUAVariable, IUAVariable, DynamicLinkMode, uint?, uint?)
+
Imposta un collegamento dinamico (Dynamic Link) su una variabile, anche in presenza di array complessi o con bit specifici.
+
public static void SetDynamicLink (this IUAVariable variable, IUAVariable source, DynamicLinkMode mode, uint ? sourceArrayIndex = null , uint ? sourceSubArrayIndex = null )
+
+
Parameters
+
variable IUAVariable
+
La variabile di destinazione su cui verrà applicato il Dynamic Link.
+
source IUAVariable
+
La variabile sorgente da cui leggere il valore.
+
mode DynamicLinkMode
+
La modalità del Dynamic Link (lettura, scrittura, ecc.).
+
sourceArrayIndex uint ?
+
Indice dell’elemento da collegare in caso di array monodimensionale.
+
sourceSubArrayIndex uint ?
+
Indice del bit specifico da collegare, se applicabile.
+
Exceptions
+
ArgumentException
+
Viene sollevata se:
+
+L’indice specificato è fuori dai limiti dell’array.
+La sorgente è null.
+Il sotto-indice è maggiore della dimensione in bit dell’elemento.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.IOCardConfig/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.IOCardConfig/index.html
new file mode 100644
index 0000000..8674b32
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.IOCardConfig/index.html
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ IOCardConfig : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class IOCardConfig
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Rappresenta la configurazione delle schede IO (Input/Output) del sistema.
+Include la mappatura delle schede IO normali e di sicurezza.
+
public class IOCardConfig
+
+
Inheritance
+
object ←
+IOCardConfig
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
+
Le chiavi dei dizionari rappresentano identificativi univoci delle schede.
+Ogni voce contiene la definizione completa di una scheda.
+
Constructors
+
IOCardConfig()
+
public IOCardConfig ()
+
+
Properties
+
NormalIoCards
+
Dizionario contenente le definizioni delle schede IO normali, indicizzate per identificatore.
+
public Dictionary<string , NormalIOCardDefinition> NormalIoCards { get ; set ; }
+
+
Property Value
+
Dictionary
+<
+string ,
+NormalIOCardDefinition
+>
+
SafetyIoCards
+
Dizionario contenente le definizioni delle schede IO di sicurezza, indicizzate per identificatore.
+
public Dictionary<string , SafetyIOCardDefinition> SafetyIoCards { get ; set ; }
+
+
Property Value
+
Dictionary
+<
+string ,
+SafetyIOCardDefinition
+>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.InformationModelExtensions/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.InformationModelExtensions/index.html
new file mode 100644
index 0000000..8240803
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.InformationModelExtensions/index.html
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ InformationModelExtensions : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Contiene metodi di estensione per la gestione del modello informativo OPC UA all’interno del progetto FTOptix.
+
public static class InformationModelExtensions
+
+
Inheritance
+
object ←
+InformationModelExtensions
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
+
Questa classe fornisce utility per la creazione di dizionari di localizzazione, accesso ai namespace e generazione di riferimenti localizzati.
+È definita come partial per consentire estensioni modulari in altri file.
+
Methods
+
+
Crea una variabile UA che funge da dizionario di localizzazione, con intestazione precompilata.
+
public static IUAVariable CreateDictionary (string dictionaryName )
+
+
Parameters
+
dictionaryName string
+
Nome della variabile che rappresenterà il dizionario nel modello. Questo nome sarà utilizzato anche in OPC UA.
+
Returns
+
IUAVariable
+
Una variabile UA (IUAVariable) con tipo LocalizationDictionary, inizializzata con una riga contenente l’intestazione:
+la prima colonna è “Key”, le successive sono i codici delle lingue configurate nel progetto.
+
+
Il dizionario è pronto per essere popolato con chiavi di traduzione e valori per ciascuna lingua.
+
GetDefaultNamespaceIndex(IContext)
+
Restituisce l’indice del namespace predefinito per un determinato contesto.
+
public static int GetDefaultNamespaceIndex (IContext context )
+
+
Parameters
+
context IContext
+
Il contesto corrente da cui ottenere l’indice del namespace.
+
Returns
+
int
+
L’indice del namespace predefinito. Se non è valido, restituisce quello del progetto corrente.
+
GetLocalizedTextFromKey(string)
+
Restituisce un oggetto LocalizedText a partire da una chiave di traduzione.
+
public static LocalizedText GetLocalizedTextFromKey (string key )
+
+
Parameters
+
key string
+
La chiave della traduzione da cercare nel dizionario di localizzazione.
+
Returns
+
LocalizedText
+
Un oggetto LocalizedText che punta alla chiave specificata nel namespace del progetto corrente.
+
+
Questo metodo non esegue il lookup della traduzione, ma crea un riferimento che può essere utilizzato nelle proprietà localizzabili.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.NormalIOCardDefinition/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.NormalIOCardDefinition/index.html
new file mode 100644
index 0000000..ea87b8b
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.NormalIOCardDefinition/index.html
@@ -0,0 +1,359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NormalIOCardDefinition : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class NormalIOCardDefinition
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Definizione di una scheda IO normale.
+Eredita le proprietà comuni dalla classe .
+
public class NormalIOCardDefinition : BaseIOCardDefinition
+
+
Inheritance
+
object ←
+BaseIOCardDefinition ←
+NormalIOCardDefinition
+
Inherited Members
+
BaseIOCardDefinition.Type ,
+BaseIOCardDefinition.NodeType ,
+BaseIOCardDefinition.IODirection ,
+BaseIOCardDefinition.Colors ,
+object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Constructors
+
NormalIOCardDefinition()
+
public NormalIOCardDefinition ()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.SafetyIOCardDefinition/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.SafetyIOCardDefinition/index.html
new file mode 100644
index 0000000..ec33b82
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.SafetyIOCardDefinition/index.html
@@ -0,0 +1,378 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SafetyIOCardDefinition : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class SafetyIOCardDefinition
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Definizione di una scheda IO di sicurezza.
+Estende aggiungendo il tipo di uscita.
+
public class SafetyIOCardDefinition : BaseIOCardDefinition
+
+
Inheritance
+
object ←
+BaseIOCardDefinition ←
+SafetyIOCardDefinition
+
Inherited Members
+
BaseIOCardDefinition.Type ,
+BaseIOCardDefinition.NodeType ,
+BaseIOCardDefinition.IODirection ,
+BaseIOCardDefinition.Colors ,
+object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Constructors
+
SafetyIOCardDefinition()
+
public SafetyIOCardDefinition ()
+
+
Properties
+
OutputType
+
Specifica il tipo di uscita associato alla scheda di sicurezza.
+
public string OutputType { get ; set ; }
+
+
Property Value
+
string
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.ScriptBuilder/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.ScriptBuilder/index.html
new file mode 100644
index 0000000..dfa53b3
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.ScriptBuilder/index.html
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScriptBuilder : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class ScriptBuilder
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Classe statica responsabile della generazione di script batch dinamici
+utilizzati per presentare opzioni all’utente e gestire l’input.
+
public static class ScriptBuilder
+
+
Inheritance
+
object ←
+ScriptBuilder
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Methods
+
+
Filtra l’elenco delle opzioni in base alle lettere selezionate dall’utente.
+Ogni lettera corrisponde a un indice nell’array delle opzioni.
+
public static string [] FilterOptionsByLetters (string inputLetters, string [] options )
+
+
Parameters
+
inputLetters string
+
Lettere immesse dall’utente, ad esempio “AC”.
+
options string []
+
Array di stringhe con tutte le opzioni disponibili.
+
Returns
+
string []
+
Array di opzioni selezionate, senza duplicati.
+
Examples
+
var options = new [] { "Flowpack" , "RDS" , "Shrinkwrapper" , "Packer" };
+var selected = ScriptBuilder.FilterOptionsByLetters("AC" , options);
+
+
+
GenerateOptionScript(string, string[])
+
Genera uno script batch che presenta un messaggio e una lista di opzioni numerate all’utente.
+L’utente può selezionare una o più opzioni utilizzando lettere corrispondenti.
+
public static string GenerateOptionScript (string message, string [] options )
+
+
Parameters
+
message string
+
Messaggio da visualizzare prima delle opzioni.
+
options string []
+
Array di stringhe contenente le opzioni disponibili.
+
Returns
+
string
+
Script batch sotto forma di stringa.
+
Exceptions
+
ArgumentException
+
Sollevata se l’array delle opzioni è nullo o vuoto.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.Utils/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.Utils/index.html
new file mode 100644
index 0000000..6480871
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack.Utils/index.html
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Utils : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Class Utils
+
Namespace: TecnoPack
+Assembly: CO0002_Templ_FlowpackHMI_V00_9_3.dll
+
Classe di utilità che fornisce metodi e costanti per la gestione di percorsi file e cartelle temporanee.
+
public static class Utils
+
+
Inheritance
+
object ←
+Utils
+
Inherited Members
+
object.GetType() ,
+object.MemberwiseClone() ,
+object.ToString() ,
+object.Equals(object?) ,
+object.Equals(object?, object?) ,
+object.ReferenceEquals(object?, object?) ,
+object.GetHashCode()
+
Fields
+
TEMP_FOLDER_RESOURCE_URI
+
Percorso fisso della cartella temporanea del progetto.
+Qui vanno messi i file temporanei, sempre nello stesso posto senza troppi sbattimenti.
+
public const string TEMP_FOLDER_RESOURCE_URI = "%PROJECTDIR%/.temp"
+
+
Field Value
+
string
+
Methods
+
GetFullPath(string)
+
Risolve un percorso relativo e ne restituisce il percorso assoluto all’interno del progetto.
+Così non ti sbagli più a indicare i percorsi.
+
public static string GetFullPath (string relativePath )
+
+
Parameters
+
relativePath string
+
Il percorso relativo da risolvere (inserisci un valore valido).
+
Returns
+
string
+
Il percorso completo e assoluto corrispondente.
+
GetRelativeFileapathFromCaller(string, string)
+
Restituisce il percorso completo di un file, partendo dal percorso del file sorgente che ha chiamato questo metodo.
+
public static string GetRelativeFileapathFromCaller (string relativeFileName, string callerFilePath = "" )
+
+
Parameters
+
relativeFileName string
+
Il nome o percorso relativo del file da risolvere.
+
callerFilePath string
+
Il percorso completo del file sorgente chiamante, fornito automaticamente dal compilatore.
+Non va passato manualmente.
+
Returns
+
string
+
Il percorso assoluto calcolato a partire dalla posizione del file chiamante e dal nome relativo.
+
GetTempFolder()
+
Restituisce il percorso completo della cartella temporanea, pronta per essere usata.
+Senza doverci pensare troppo.
+
public static string GetTempFolder ()
+
+
Returns
+
string
+
Il percorso assoluto della cartella temporanea del progetto.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack/index.html b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack/index.html
new file mode 100644
index 0000000..24e90ff
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/TecnoPack/TecnoPack/index.html
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TecnoPack : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Namespace TecnoPack
+
Classes
+
AlarmImporter
+
Classe statica per l’importazione di allarmi da file Excel (.xlsx)
+nella struttura del progetto FTOptix, inclusi dizionari e traduzioni.
+
BaseIOCardDefinition
+
Classe base astratta per le definizioni di schede IO, contenente proprietà condivise tra le varie tipologie.
+
ConsoleLauncher
+
Classe statica responsabile dell’esecuzione di uno script batch da console
+e della lettura dell’input prodotto dallo script stesso.
+
DynamicLinkExtensions
+
Classe di estensione per la creazione e gestione dei Dynamic Link su variabili UA in FTOptix.
+
IOCardConfig
+
Rappresenta la configurazione delle schede IO (Input/Output) del sistema.
+Include la mappatura delle schede IO normali e di sicurezza.
+
InformationModelExtensions
+
Contiene metodi di estensione per la gestione del modello informativo OPC UA all’interno del progetto FTOptix.
+
NormalIOCardDefinition
+
Definizione di una scheda IO normale.
+Eredita le proprietà comuni dalla classe .
+
SafetyIOCardDefinition
+
Definizione di una scheda IO di sicurezza.
+Estende aggiungendo il tipo di uscita.
+
ScriptBuilder
+
Classe statica responsabile della generazione di script batch dinamici
+utilizzati per presentare opzioni all’utente e gestire l’input.
+
Utils
+
Classe di utilità che fornisce metodi e costanti per la gestione di percorsi file e cartelle temporanee.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/tpDiagnosticQueryInterface/index.html b/site/Rockwell/Optix/DotNet/tpDiagnosticQueryInterface/index.html
new file mode 100644
index 0000000..bbec5e6
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/tpDiagnosticQueryInterface/index.html
@@ -0,0 +1,560 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tpDiagnosticQueryInterface : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
⚙️ tpDiagnosticQueryInterface
+
La classe tpDiagnosticQueryInterface è una NetLogic che permette di eseguire query su un database SQLite e aggiornare variabili di output con i risultati in tempo reale.
+
È pensata per interfacciarsi con un database di diagnostica e fornire dinamicamente dati a variabili HMI, abilitando l’aggiornamento automatico dei valori tramite query configurabili.
+
+
🚦 Panoramica generale
+
La logica si basa su:
+
+Una variabile Query che contiene la stringa SQL da eseguire.
+Una variabile Enabled che abilita o disabilita l’esecuzione della query.
+Una lista di variabili OutVariables che ricevono i valori dal primo record risultato della query.
+Un database SQLite a cui si accede tramite percorso predefinito.
+
+
+
🛠️ Funzionamento principale
+
+
+
+Elemento
+Descrizione
+
+
+
+
+Start()
+Inizializza riferimenti alle variabili, al database e si iscrive agli eventi di cambio variabile.
+
+
+UpdateStatus()
+Esegue la query SQL se abilitato, aggiorna le variabili di output con i risultati.
+
+
+Stop()
+Pulisce le liste e rimuove gli handler eventi per evitare memory leak.
+
+
+
+
+
🔄 Flusso di lavoro
+
Alla partenza, recupera le variabili Query e Enabled, e il riferimento al database SQLite.
+Si iscrive agli eventi di cambio delle variabili Query e Enabled.
+Quando Query o Enabled cambiano, viene eseguita la query SQL se Enabled è true.
+Il primo record risultato viene scritto sulle variabili di output, fino a un massimo di variabili disponibili.
+
+
+
💡 Dettagli importanti
+
+Se la query SQL fallisce, viene loggato un messaggio d’errore molto colorito e dettagliato (con frase in dialetto veneziano).
+Le variabili di output sono i primi N figli dell’oggetto NetLogic, dove N è il numero di colonne del risultato SQL.
+L’aggiornamento supporta solo il primo record del risultato (riga zero).
+
+
+
🛠️ Come configurare le variabili di output su NetLogic in Factory Talk Optix
+
La classe si aspetta che sull’oggetto NetLogic siano create variabili aggiuntive per mappare i valori restituiti dalla query SQL.
+
1. Creazione delle variabili di output
+
+Nome variabile: Devono avere nomi sequenziali nel formato [0], [1], [2], ecc.
+Come crearle:
+
+Apri Factory Talk Optix e seleziona l’oggetto NetLogic in design time.
+Aggiungi variabili figlie di tipo IUAVariable o equivalente, con i nomi indicati sopra.
+
+
+Tipo variabile: Può essere arbitrario (es. String, Int32, Float, ecc.) in base al tipo di dato atteso dalla colonna SQL.
+
+
2. Gestione delle variabili in runtime
+
+Il codice legge dinamicamente queste variabili usando la numerazione [0], [1], ecc., e le usa come destinazione per i valori estratti dal primo record della query.
+Se non esistono variabili per tutte le colonne, il ciclo si interrompe al primo nome mancante.
+È possibile aggiungere tutte le variabili necessarie in modo sequenziale, in base al numero di colonne della query.
+
+
3. Tipo arbitrario e flessibilità
+
+Le variabili possono avere qualsiasi tipo supportato da Factory Talk Optix e compatibile con i tipi di dato SQL.
+Il codice scrive valori tramite RemoteWrite e usa UAValue che gestisce diversi tipi.
+È importante che il tipo della variabile corrisponda al tipo del dato restituito per evitare errori.
+
+
+
🔧 Esempio di configurazione variabili
+
+
+
+Nome variabile
+Tipo suggerito
+Descrizione
+
+
+
+
+[0]
+String
+Prima colonna risultato query
+
+
+[1]
+Int32
+Seconda colonna risultato query
+
+
+[2]
+Float
+Terza colonna risultato query
+
+
+…
+…
+…
+
+
+
+
+
⚠️ Nota importante
+
+La classe attualmente supporta solo il primo record della query (riga zero).
+Per gestire più righe servirebbe implementare una logica di iterazione e mapping aggiuntiva.
+
+
+
🧰 Metodi principali
+
+
+
+Metodo
+Descrizione
+
+
+
+
+Start()
+Setup iniziale: recupera variabili e database, iscrive eventi, prepara lista variabili output.
+
+
+UpdateStatus()
+Esegue la query e aggiorna le variabili se abilitato.
+
+
+UpdateStatus(object, VariableChangeEventArgs)
+Overload che risponde agli eventi di cambio variabile, invocando il metodo senza parametri.
+
+
+Stop()
+Pulizia delle risorse e rimozione degli eventi.
+
+
+
+
+
🔍 In Depth: Funzioni di tpDiagnosticQueryInterface
+
+
Start()
+
+Descrizione:
+Metodo di inizializzazione chiamato all’avvio della NetLogic.
+Recupera le variabili Query e Enabled e il database SQLite.
+Registra gli eventi di cambio variabile per aggiornare lo stato.
+Costruisce la lista OutVariables basandosi sui figli dell’oggetto NetLogic.
+
+
+Eccezioni:
+Lancia eccezioni se le variabili o il database non vengono trovati, con messaggi personalizzati in dialetto veneziano.
+
+
+
UpdateStatus()
+
+Descrizione:
+Controlla se la logica è abilitata leggendo la variabile Enabled.
+Se abilitata, esegue la query SQL contenuta in Query.
+Scrive il primo record dei risultati sulle variabili OutVariables.
+
+
+Error Handling:
+In caso di errore nella query, logga un messaggio di errore molto colorito contenente dettagli tecnici.
+
+
+
UpdateStatus(object sender, VariableChangeEventArgs e)
+
+Descrizione:
+Handler evento che richiama semplicemente UpdateStatus() senza parametri per aggiornare lo stato quando Query o Enabled cambiano.
+
+
+
Stop()
+
+Descrizione:
+Pulizia e rimozione dei riferimenti alle variabili e agli eventi.
+Serve a prevenire perdite di memoria quando la NetLogic viene fermata o distrutta.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/tpPopulateIONetworkDisplay/index.html b/site/Rockwell/Optix/DotNet/tpPopulateIONetworkDisplay/index.html
new file mode 100644
index 0000000..91c67b1
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/tpPopulateIONetworkDisplay/index.html
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tpPopulateIONetworkDisplay : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🖥️ tpPopulateIONetworkDisplay
+
La classe tpPopulateIONetworkDisplay è una NetLogic che si occupa di comporre e mostrare nella UI la diagnostica completa di tutti gli IO rack remoti presenti nel sistema.
+Questa classe raccoglie i dati dai dispositivi remoti configurati e crea dinamicamente i pannelli di visualizzazione per ciascun rack IO.
+
+
🚦 Panoramica generale
+
La logica si basa su:
+
+Un folder CommDrivers contenente i TagStructure relativi agli IO rack remoti.
+Un layout UI (IONodesDisplay di tipo ColumnLayout) dove vengono aggiunti dinamicamente i pannelli rappresentanti ogni IO rack.
+La comunicazione con ogni pannello remoto, che a sua volta usa la logica tpPopulateIORack per popolare i dettagli dello rack.
+
+
+
🛠️ Funzionamento principale
+
+
+
+Elemento
+Descrizione
+
+
+
+
+Populate()
+Metodo pubblico esportato che avvia un task asincrono per la composizione dinamica della UI.
+
+
+populateTask()
+Metodo che esegue la scansione dei tag di tipo TagStructure e costruisce i pannelli remoti.
+
+
+getRemoteIONodes(UAReference r)
+Metodo helper che crea un pannello remoto per ogni rack IO e ne avvia il popolamento UI.
+
+
+
+
+
🔍 In Depth: Funzioni di tpPopulateIONetworkDisplay
+
+
Populate()
+
+Descrizione:
+Metodo esportato per avviare la composizione della diagnostica IO in modo asincrono, evitando il blocco del thread UI.
+
+
+
populateTask()
+
+Descrizione:
+Recupera il folder CommDrivers contenente i tag strutturati degli IO rack.
+Pulisce il layout UI IONodesDisplay per prepararlo a contenere i nuovi pannelli.
+Costruisce un array con i nomi dei tag attesi (AB:1734_{slot}SLOT:I:0 da 1 a 64).
+Filtra i nodi di tipo TagStructureType corrispondenti ai nomi attesi.
+Per ciascun nodo valido, richiama il metodo getRemoteIONodes per creare il pannello remoto.
+
+
+
+
getRemoteIONodes(UAReference r)
+
+Descrizione:
+Ottiene il nodo TagStructure di destinazione dal riferimento passato.
+Estrae il nome del dispositivo remoto (remoteIOName).
+Crea un pannello (PanelType) figlio del pannello RemoteIO, con nome uguale al dispositivo remoto.
+Imposta la variabile RemoteIOName del pannello appena creato con il nome del dispositivo remoto.
+Aggiunge il pannello al layout IONodesDisplay.
+Effettua una pausa di 250ms (necessaria per problemi di sincronizzazione con dispositivi Rockwell).
+Invoca il metodo Populate() della NetLogic PopulateIORack contenuta all’interno del pannello per popolare i dettagli.
+
+
+
+
⚠️ Note importanti
+
+La classe presuppone che i dispositivi remoti e i relativi tag strutturati siano correttamente configurati nel folder CommDrivers.
+La sincronizzazione e il caricamento dei pannelli sono gestiti con una breve pausa, necessaria per garantire la corretta inizializzazione su dispositivi Rockwell.
+Ogni pannello remoto utilizza la logica tpPopulateIORack per il popolamento dei dettagli del rack.
+
+
+
Se vuoi vedere come funziona il popolamento di ogni singolo rack IO, dai un’occhiata alla documentazione di tpPopulateIORack .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/tpPopulateIORack/index.html b/site/Rockwell/Optix/DotNet/tpPopulateIORack/index.html
new file mode 100644
index 0000000..048477a
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/tpPopulateIORack/index.html
@@ -0,0 +1,485 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tpPopulateIORack : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
⚙️ tpPopulateIORack
+
La classe tpPopulateIORack è una NetLogic che si occupa di popolare dinamicamente la UI con le schede IO (Input/Output) di un rack remoto, basandosi su una configurazione YAML e strutture dati presenti nel progetto Factory Talk Optix.
+
+⚠️ Nota: La configurazione YAML viene deserializzata in oggetti C# di tipo IOCardConfig (definiti in un file dedicato, IOCardConfig.md ).
+Questa classe rappresenta la struttura dei dati usata per leggere la configurazione e differenziare schede normali e safety.
+
+
+
🚦 Panoramica generale
+
La logica si basa su:
+
+Un file di configurazione YAML (io_card_config.yaml) che descrive le caratteristiche e tipologie delle schede IO, corrispondente alla classe IOCardConfig.
+Folder di progetto contenenti i template grafici (di tipo RectangleType) per le schede IO da istanziare.
+Un folder CommDrivers che contiene le variabili remote corrispondenti ai dispositivi IO fisici.
+Un layout UI (RemoteIOBackplane) dove vengono aggiunte dinamicamente le schede.
+
+
+
🛠️ Funzionamento principale
+
+
+
+Elemento
+Descrizione
+
+
+
+
+Populate()
+Metodo pubblico esportato per avviare il popolamento tramite task asincrono a lunga durata.
+
+
+LoadConfiguration()
+Legge e deserializza il file YAML con la configurazione delle schede IO in oggetti IOCardConfig.
+
+
+InitializeNodeTypes()
+Recupera i template grafici (RectangleType) per ogni tipo di scheda configurata.
+
+
+PopulateIOCards()
+Crea e aggiunge i nodi scheda nel layout UI, sincronizzando l’ordine con un meccanismo di semafori.
+
+
+
+
🔍 In Depth: Funzioni di tpPopulateIORack
+
+
Populate()
+
+Descrizione:
+Avvia il processo di popolamento della UI.
+Esegue in background la lettura della configurazione, l’inizializzazione dei template e la creazione dinamica delle schede IO.
+
+
+
LoadConfiguration()
+
+Descrizione:
+Legge il file YAML di configurazione (io_card_config.yaml) e lo deserializza in oggetti IOCardConfig per uso interno.
+
+
+
InitializeNodeTypes()
+
+Descrizione:
+Carica i template grafici (RectangleType) associati a ciascun tipo di scheda definito nella configurazione YAML.
+
+
+
PopulateIOCards()
+
+Descrizione:
+Per ogni slot del rack (da 1 a 64), verifica la presenza di dispositivi remoti e crea le schede IO normali o di sicurezza corrispondenti, aggiungendole al layout UI.
+
+
+
TryCreateAndAddNormalCard()
+
+Descrizione:
+Tenta di creare e aggiungere una scheda IO normale basata sulla configurazione e i dati trovati nel folder CommDrivers.
+
+
+
TryCreateAndAddSafetyCard()
+
+Descrizione:
+Tenta di creare e aggiungere una scheda IO di sicurezza, gestendo input e output associati.
+
+
+
MakeCardAndAddToLayout()
+
+Descrizione:
+Metodo interno che istanzia la scheda IO, imposta le proprietà comuni e la inserisce ordinatamente nel layout UI, rispettando la sincronizzazione con i semafori.
+
+
+
SetCardCommonProperties()
+
+Descrizione:
+Imposta variabili comuni della scheda (come indice, nome, colori LED) per assicurare la corretta rappresentazione grafica e funzionale.
+
+
+
🗂️ Esempio di configurazione YAML (io_card_config.yaml)
+
normalIoCards:
+ AB:1734_DI8:C:0:
+ type: IB8
+ nodeType: IOCard_8B
+ iODirection: I
+ colors:
+ card: 0xff1b83df
+ led_on: 0xff00fa7e
+ led_off: 0xff0f4d29
+
+ AB:1734_DOB8:C:0:
+ type: OB8
+ nodeType: IOCard_8B
+ iODirection: O
+ colors:
+ card: 0xff40aa84
+ led_on: 0xffea2e2e
+ led_off: 0xff500f0f
+
+safetyIoCards:
+ AB:1734_IB8S_Safety2:I:0:
+ outputType: AB:1734_IB8S:O:0
+ type: IB8S
+ nodeType: IOCard_8BS
+ iODirection: I
+ colors:
+ card: 0xffe4564b
+ led_on: 0xff00fa7e
+ led_off: 0xff0f4d29
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/tpdAlarmManager/index.html b/site/Rockwell/Optix/DotNet/tpdAlarmManager/index.html
new file mode 100644
index 0000000..1f29537
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/tpdAlarmManager/index.html
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tpdAlarmManager : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
⚙️ tpdAlarmManager
+
La classe tpdAlarmManager è una NetLogic che si occupa di importare traduzioni e allarmi da file Excel (.xlsx) presenti in una cartella specificata.
+
Questo componente automatizza il caricamento di dizionari di allarmi, facilitando l’integrazione e la gestione centralizzata dei dati di allarme nel progetto.
+
+
🚦 Panoramica generale
+
Il metodo principale della classe è:
+
+ImportTranslationsAndAlarms(): Importa i file Excel di allarmi e traduzioni dalla cartella configurata, permette all’utente di selezionare quali dizionari caricare, quindi importa i dati all’interno del progetto HMI.
+
+
+
🛠️ Funzionamento principale
+
+
+
+Metodo
+Descrizione
+
+
+
+
+ImportTranslationsAndAlarms()
+Esegue la scansione della cartella degli allarmi, filtra i file .xlsx, mostra una selezione all’utente e importa i dizionari scelti.
+
+
+
+
+
🔄 Flusso di lavoro del metodo ImportTranslationsAndAlarms
+
Recupera il percorso completo della cartella allarmi tramite la variabile AlarmFolder.
+Controlla che la cartella esista; altrimenti lancia un’eccezione con messaggio in dialetto veneto.
+Cerca tutti i file .xlsx nella cartella specificata.
+Crea un dizionario che mappa il nome del file (senza estensione) al percorso completo.
+Invoca uno script che presenta una lista di opzioni all’utente per selezionare i dizionari da importare.
+Per ogni dizionario selezionato, richiama Owner.ImportAlarmsInsideOwner per importare i dati nel progetto.
+
+
+
💡 Dettagli importanti
+
+La funzione utilizza un metodo di utilità Utils.GetFullPath() per risolvere il percorso della cartella allarmi.
+Viene utilizzata una cartella temporanea tramite Utils.GetTempFolder() per eventuali operazioni intermedie.
+L’utente interagisce con uno script generato dinamicamente per scegliere i file da importare, tramite ConsoleLauncher.Launch.
+I nomi dei file senza estensione sono usati come chiavi per la selezione.
+L’eccezione lanciata in caso di cartella inesistente ha un tono molto colloquiale e colorito (dialetto veneto).
+È presente un codice commentato per una versione parallela di importazione (con Parallel.ForEach) che potrebbe essere abilitata per migliorare performance.
+
+
+
🧰 Metodi principali
+
+
+
+Metodo
+Descrizione
+
+
+
+
+ImportTranslationsAndAlarms()
+Metodo esportato che gestisce il processo completo di importazione degli allarmi e traduzioni da file Excel.
+
+
+
+
+
🔍 In Depth: Funzioni di tpdAlarmManager
+
+
ImportTranslationsAndAlarms()
+
+Descrizione:
+Metodo che esegue l’importazione di dizionari di allarmi e traduzioni da file .xlsx presenti in una cartella specificata nel progetto.
+Permette la selezione interattiva dei file da importare e li carica nel progetto tramite chiamata a Owner.ImportAlarmsInsideOwner.
+
+
+Dettagli tecnici:
+
+Risolve il percorso della cartella allarmi.
+Controlla l’esistenza della cartella (eccezione in caso negativo).
+Recupera i file Excel .xlsx.
+Presenta all’utente un menu di selezione.
+Importa i dizionari selezionati.
+
+
+
+Eccezione:
+Lancia un’eccezione se la cartella degli allarmi non esiste, con messaggio in dialetto veneto.
+
+
+Esempio d’uso:
+alarmManager.ImportTranslationsAndAlarms();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/DotNet/tpdDiangosticGenerator/index.html b/site/Rockwell/Optix/DotNet/tpdDiangosticGenerator/index.html
new file mode 100644
index 0000000..d559dbb
--- /dev/null
+++ b/site/Rockwell/Optix/DotNet/tpdDiangosticGenerator/index.html
@@ -0,0 +1,638 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tpdDiangosticGenerator : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
⚙️ tpdDiangosticGenerator
+
La classe tpdDiangosticGenerator è il cuore pulsante del sistema diagnostico. Si occupa di generare automaticamente i modelli diagnostici e i pulsanti di navigazione per diverse componenti hardware e di sicurezza del progetto.
+
Con questa classe, la configurazione e la gestione della diagnostica diventano semplici, rapide e centralizzate.
+
+
🚦 Panoramica generale
+
Il generatore lavora su due fronti principali:
+
+Modelli diagnostici : rappresentazioni strutturate di assi, alimentatori, sicurezza, ecc.
+Pulsanti di navigazione : bottoni che permettono di accedere rapidamente alle schermate diagnostiche relative ai modelli.
+
+
+
🛠️ Metodi principali
+
+
+
+Metodo
+Descrizione
+Note
+
+
+
+
+GenerateALL()
+Genera tutti i modelli e i pulsanti, invocando i metodi specifici sottostanti.
+Metodo “one-shot”
+
+
+GenerateAllModels()
+Invoca la generazione di tutti i modelli specifici (assi, PSU, sicurezza, ecc.)
+
+
+
+GenerateAllButtons()
+Invoca la generazione di tutti i pulsanti specifici per ogni modello diagnostico
+
+
+
+GenerateAxisModel()
+Genera i modelli degli assi sulla base dei tag stStandardAxis.
+Usa AxisType
+
+
+GenerateAxisButtons()
+Crea i pulsanti di navigazione collegati agli assi, puntando alla pagina diagnostica asse _810_DiagAxis
+
+
+
+GeneratePSUModel()
+Genera i modelli per le unità di alimentazione (PSUType).
+
+
+
+GeneratePSUButtons()
+Pulsanti per le PSU, con link alla pagina _814_DiagPSU.
+
+
+
+GenerateDCSModel()
+Genera modelli per i componenti di sicurezza SafetyDCSType basati su tag DCI_STOP.
+
+
+
+GenerateCROUTModel()
+Modelli sicurezza SafetyCROUTType basati su tag CONFIGURABLE_ROUT.
+
+
+
+GenerateFPMSModel()
+Modelli sicurezza SafetyFPMSType basati su tag FIVE_POS_MODE_SELECTOR.
+
+
+
+GenerateSafetyButtons()
+Pulsanti per la sicurezza, puntano a _830_DiagSafety.
+
+
+
+
+
+
🧰 Come funziona “sotto il cofano”
+
Il fulcro del generatore è il metodo privato GenerateModels, che:
+
Cerca nelle cartelle di comunicazione i tag corrispondenti al tipo specificato (es. stStandardAxis).
+Per ogni tag, crea (o trova) un modello corrispondente nella cartella modelli.
+Imposta un nome leggibile e associa un puntatore al tag originale.
+
+
Analogamente, GenerateButtons crea per ogni modello un pulsante di navigazione nella pagina diagnostica dedicata, utilizzando un template di pulsante personalizzato.
+
+
💡 Funzioni di supporto utili
+
+ExtractReadableName(string variableName): estrae un nome utente-friendly da un nome di variabile tecnica, inserendo spazi e capitalizzando correttamente.
+Es.: "Axis_X1" → "X 1"
+
+
+
🔍 In Depth: Funzioni di tpdDiangosticGenerator
+
+
GenerateALL()
+
+Descrizione:
+Metodo principale “one-shot” che rigenera tutti i modelli diagnostici e tutti i pulsanti di navigazione in un solo colpo.
+È pensato per un uso “a caldo” dopo modifiche estese ai tag o alla struttura del progetto.
+
+
+Dettagli tecnici:
+Invoca internamente GenerateAllModels() e GenerateAllButtons(), orchestrando così la generazione completa della diagnostica.
+
+
+Esempio d’uso:
+diagnosticGenerator.GenerateALL();
+
+
+
+Nota da interfaccia Optix:
+È possibile eseguire questo metodo cliccando con il tasto destro sull’oggetto design time NetLogic o sul suo genitore e selezionando Execute GenerateALL .
+
+
+
GenerateAllModels()
+
+Descrizione:
+Chiama i generatori specifici per ogni categoria di modello diagnostico (assi, PSU, sicurezza), in modo ordinato e modulare.
+
+
+Modelli generati:
+
+Assi (Axis)
+Alimentatori (PSU)
+Componenti di sicurezza (DCS, CROUT, FPMS)
+
+
+
+
+
+Descrizione:
+Genera i pulsanti di navigazione associati ai modelli diagnostici appena creati, suddivisi per categoria (assi, PSU, sicurezza).
+
+
+
GenerateAxisModel()
+
+Descrizione:
+Scansiona i tag di tipo stStandardAxis presenti nei driver di comunicazione e genera i modelli AxisType corrispondenti.
+
+
+Dettagli:
+Imposta la proprietà AxisPointer del modello con il riferimento al tag originale.
+
+
+
+
+Descrizione:
+Per ogni modello asse generato, crea un pulsante di navigazione che punta alla schermata diagnostica asse _810_DiagAxis.
+
+
+
GeneratePSUModel()
+
+Descrizione:
+Genera i modelli PSUType per tutti i tag di tipo stPowerSupply trovati, collegandoli opportunamente.
+
+
+
+
+Descrizione:
+Crea i pulsanti di navigazione per ogni modello PSU, collegati alla pagina _814_DiagPSU.
+
+
+
GenerateDCSModel()
+
+Descrizione:
+Genera modelli diagnostici per i componenti di sicurezza SafetyDCSType basandosi sui tag DCI_STOP.
+
+
+
GenerateCROUTModel()
+
+Descrizione:
+Genera modelli SafetyCROUTType per tag CONFIGURABLE_ROUT correlati ai sistemi di sicurezza configurabili.
+
+
+
GenerateFPMSModel()
+
+Descrizione:
+Genera modelli SafetyFPMSType basati sui tag FIVE_POS_MODE_SELECTOR, tipici di selettori modalità a 5 posizioni.
+
+
+
+
+Descrizione:
+Crea i pulsanti di navigazione per tutti i modelli di sicurezza, puntando alla schermata _830_DiagSafety.
+
+
+
+
+Descrizione:
+Estrae un nome leggibile e “user-friendly” da un nome tecnico di variabile.
+Ad esempio: "Axis_X1" diventa "X 1".
+
+
+Come funziona:
+
+Prende l’ultima parte dopo l’ultimo underscore
+Inserisce spazi prima di lettere maiuscole o cifre
+Formattta la stringa con la prima lettera maiuscola, il resto minuscolo
+
+
+
+
GenerateModels(string modelFolderPath, string tagTypeName, Type modelType, string pointerVariableName)
+
+Descrizione:
+Metodo generico interno per creare i modelli diagnostici.
+
+Cerca nelle cartelle di comunicazione i tag con il tipo specificato.
+Per ciascun tag, crea o recupera un modello corrispondente nella cartella modelli.
+Imposta il nome leggibile e il puntatore al tag originale.
+
+
+
+
GenerateButtons(string modelFolderPath, string diagnosticPagePath)
+
+Descrizione:
+Per ogni modello nella cartella indicata, crea (o riusa) un pulsante di navigazione nella pagina diagnostica specificata.
+Usa un template di pulsante predefinito per mantenere l’uniformità grafica e funzionale.
+
+
+
+
+Descrizione:
+Crea un nuovo oggetto modello con il nome del tag e del tipo specificato, e lo inserisce nella cartella dei modelli.
+
+
+
+
+Descrizione:
+Riempie il modello con un nome leggibile e imposta la variabile puntatore con il NodeId del tag originale.
+
+
+
+
+Descrizione:
+Crea un nuovo pulsante di navigazione utilizzando il template tpButtNavigationDiagnostic, lo aggiunge al layout della schermata diagnostica e lo restituisce per ulteriori configurazioni.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/OptixIntroduzione/index.html b/site/Rockwell/Optix/OptixIntroduzione/index.html
new file mode 100644
index 0000000..edfef2b
--- /dev/null
+++ b/site/Rockwell/Optix/OptixIntroduzione/index.html
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Introduzione ad Optix : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
import useBaseUrl from ‘@docusaurus/useBaseUrl’;
+
+
<img
+src={useBaseUrl(‘/img/logos/optix-logo.png’)}
+alt=“Logo Optix”
+style={{ maxWidth: ‘220px’, marginBottom: ‘2rem’ }}
+/>
+
🌟Benvenuto su Optix🌟
+
+ Questa guida ti spiegherà come usare al meglio il nuovo prototipo del pannello Optix .
+ Grandi cose ti aspettano, giovane Padawan!
+
+
<a className=‘pagination-nav__link’ style={{width: ‘300px’, margin: ‘0 auto’}} href={useBaseUrl(‘/docs/Rockwell/Optix/OverviewDelPannello’)}>🚀 Inizia Ora
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Optix/OverviewDelPannello/index.html b/site/Rockwell/Optix/OverviewDelPannello/index.html
new file mode 100644
index 0000000..982af01
--- /dev/null
+++ b/site/Rockwell/Optix/OverviewDelPannello/index.html
@@ -0,0 +1,443 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Struttura dell'interfaccia HMI : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
import useBaseUrl from ‘@docusaurus/useBaseUrl’;
+
🧭 Struttura Principale della GUI Tecnopack su FactoryTalk Optix
+
Questa sezione descrive la struttura dell’interfaccia grafica principale (GUI) adottata nei pannelli Tecnopack , sviluppata utilizzando FactoryTalk Optix .
+
L’interfaccia è suddivisa in aree funzionali ben definite, ciascuna dedicata a una specifica categoria di interazione o informazione.
+
+
🖼️ Panoramica generale
+
<img src={useBaseUrl(‘/img/screenshots/optix/main-gui-overview.jpg’)} alt=“Panoramica GUI Tecnopack” style={{ maxWidth: ‘100%’, borderRadius: ‘8px’, marginTop: ‘1rem’ }} />
+
+
🧩 Composizione dell’interfaccia
+
+
+Logo aziendale : posizionato in alto a sinistra, identifica il marchio (TECNOPACK GROUP).
+Informazioni di pagina : accanto al logo si trovano due etichette:
+
+Il numero pagina , utilizzato per riferimenti interni e logiche PLC.
+Il nome pagina , visualizzato come Localized Text , derivato dal dizionario traduzioni.
+
+
+Utente attivo : un pulsante mostra l’utente attualmente connesso. Cliccandoci, si accede alla gestione utenti/login.
+
+
+
📚 Menù laterale sinistro (navigazione principale)
+
Il pannello laterale sinistro ospita il menù di navigazione principale , sempre visibile, composto da pulsanti con icona + etichetta .
+
+
+
+Etichetta
+Funzione
+
+
+
+
+🏠 Home
+Dashboard principale
+
+
+⚠️ Allarmi
+Visualizzazione e gestione degli allarmi
+
+
+⚙️ Modalità operativa
+Selezione delle modalità macchina (es. manuale, automatico)
+
+
+♨️ Masse saldanti
+Configurazione delle temperature
+
+
+🔑 Abilitazioni
+Gestione delle abilitazioni dei dispositivi collegati
+
+
+🛠️ Mini-Setup
+Accesso ai parametri di ricetta della macchina
+
+
+🧩 Menù avanzato
+Accesso all’explorer contenente funzionalità e sezioni avanzate
+
+
+
+
+📌 Nota : Il menù laterale è sempre accessibile, garantendo una navigazione rapida e coerente.
+
+
+
🧾 Area centrale (contenuti dinamici)
+
La zona centrale dello schermo contiene un Panel Loader , ovvero un contenitore dinamico in cui vengono caricate tutte le schermate in base alla navigazione effettuata dall’utente.
+
È il cuore operativo dell’HMI e varia in base al contesto selezionato nel menù laterale.
+
+
+
La barra inferiore include informazioni in tempo reale:
+
+Stato macchina
+Ricetta attiva : con codice identificativo e nome
+Data e ora : visualizzate in basso a destra in formato persistente
+
+
+
📐 Struttura e layout
+
L’interfaccia adotta un layout a griglia rigida , conforme agli standard delle HMI industriali:
+
+Colonna sinistra : fissa, destinata alla navigazione
+Area centrale : strutturata a griglia (es. 3×2 o 3×3) per i contenuti dinamici
+Header e footer : sempre visibili, garantendo continuità informativa
+
+
+
✅ Obiettivi dell’interfaccia
+
L’interfaccia è progettata per:
+
+Garantire chiarezza visiva e semplicità d’uso
+Offrire un accesso rapido alle funzioni principali
+Visualizzare dati in tempo reale in modo affidabile
+Mantenere una struttura coerente tra le diverse schermate
+
+
+
🎯 Questo layout rappresenta lo standard base per le HMI Tecnopack su piattaforma Optix. Tutte le pagine sviluppate dovrebbero mantenere coerenza con questa struttura per garantire un’esperienza utente uniforme e professionale.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Prototipi/Flowpack/Flowpack/index.html b/site/Rockwell/Prototipi/Flowpack/Flowpack/index.html
new file mode 100644
index 0000000..250af61
--- /dev/null
+++ b/site/Rockwell/Prototipi/Flowpack/Flowpack/index.html
@@ -0,0 +1,505 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Introduzione al Prototipo Flowpack : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🧩 Prototipo Flowpack
+
Benvenuto nel prototipo Flowpack per la piattaforma Rockwell.
+Questo progetto rappresenta un template modulare e riutilizzabile per la realizzazione di macchine confezionatrici a film continuo.
+
Il prototipo è pensato per essere scalabile e configurabile , con supporto a diverse varianti hardware e HMI.
+Tutti i file sono organizzati in modo strutturato per facilitare manutenzione, personalizzazione e deployment.
+
+
📦 Repository GitLab
+
👉 Vai alla repository del prototipo Flowpack
+
+Assicurati di avere accesso alla rete interna o VPN aziendale per poter consultare il repository.
+
+
+
🧱 Struttura del Progetto
+
La repository è suddivisa in due sezioni principali :
+
Docs/ – Documentazione tecnica
+
Contiene materiali utili allo studio e alla configurazione della macchina:
+
+001 - Report : documenti Word con analisi e report
+002 - Commenti al software : fogli Excel per gerarchie, mappe di rete
+003 - Schemi elettrici : wiring e connessioni (con readme.md)
+004 - Pagine HMI : screenshot e layout dell’interfaccia operatore (con readme.md)
+005 - Immagini : risorse grafiche di supporto (con readme.md)
+006 - Dati tecnici : parametri e specifiche tecniche (con readme.md)
+
+
+
Software/ – Codice e template modulari
+
Organizzato per supportare diversi pannelli HMI , configurazioni PLC e soluzioni di sicurezza.
+
🔹 HMI (FactoryTalk View ME)
+
+File progetto .apa per pannelli PanelView
+ChangeLog - V30.txt: registro modifiche
+Supporto a layout multipli e componenti riutilizzabili
+
+
+⚠️ Nota : Il prototipo FactoryTalk View è in fase di deprecazione . Si consiglia di migrare a Optix Studio.
+
+
🔹 OrientalMotor
+
+File di configurazione .mx2 per motori OrientalMotor
+
+
🔹 PLC (Rockwell Studio 5000)
+
+File progetto .ACD con template aggiornati
+ChangeLog - V30.txt: cronologia modifiche
+Progetti compatibili con CPU Allen-Bradley CompactLogix/ControlLogix
+
+
🔹 Safety Unit (Pilz)
+
+File .mpnoz per configurazione moduli sicurezza Pilz
+Supporto a due topologie principali:
+
+Flowpack Longitudinale (LTS)
+Flowpack Rotativa (ROT)
+
+
+
+
+⚠️ DEPRECATO : Questa soluzione Safety non è più mantenuta. Si consiglia di adottare le nuove CPU con safety integrata.
+
+
+
🛠 Modularità del Prototipo
+
Il progetto è costruito per essere modulare e adattabile .
+Le principali varianti gestite includono:
+
+
+
+Componente
+Descrizione
+
+
+
+
+🧠 PLC
+Configurazioni differenziate per taglia macchina
+
+
+🖥 HMI
+Supporto a più pannelli (PanelView, OptixPanel, ecc.)
+
+
+🦺 Sicurezza
+Pilz Safety con modelli rotativi o longitudinali
+
+
+📋 Ricette
+Gestione centralizzata tramite file Recipes.yaml
+
+
+🔐 Accessi
+Sistema utenti, ruoli e sicurezza multilivello
+
+
+
+
+
🧭 Come iniziare
+
Clona la repository
+
+
git clone https://gitlab.tecnopackspa.it/prototipi/rockwell/flowpack.git
+
+
Apri il progetto desiderato
+
+
+HMI
+
+FactoryTalk View : utilizza i file .apa in Software/HMI
+
+⚠️ In fase di deprecazione: preferire Optix Studio.
+
+
+Optix Studio : ancora da integrare, struttura basata su file .optix, .yaml e .cs (citato per futura disponibilità)
+
+
+PLC
+
+Usa i file .ACD in Software/PLC
+
+
+Safety Unit
+
+Progetti Pilz nella cartella Software/Safety Unit
+
+⚠️ DEPRECATO : progetto non più mantenuto. Valutare nuova soluzione safety integrata.
+
+
+
+
+
+
Consulta la documentazione in Docs/
+
+
+001 - Report: analisi e documentazione generale, report modifiche e changelog della commessa
+002 - Commenti al software: gerarchie assi e mappature rete
+003 - Schemi elettrici: dettagli wiring e connessioni
+004 - Pagine HMI: screenshot e dettagli UI
+005 - Immagini: immagini della macchina utili per il pannello o la manualistica
+006 - Dati tecnici: parametri macchina
+
+
+
📚 Documentazione correlata
+
+
+
Questo documento sarà aggiornato con l’evoluzione del prototipo e l’integrazione di Optix Studio.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Prototipi/Linea a moduli/Linea a moduli/index.html b/site/Rockwell/Prototipi/Linea a moduli/Linea a moduli/index.html
new file mode 100644
index 0000000..660b51c
--- /dev/null
+++ b/site/Rockwell/Prototipi/Linea a moduli/Linea a moduli/index.html
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Rockwell/Rockwell/index.html b/site/Rockwell/Rockwell/index.html
new file mode 100644
index 0000000..7035927
--- /dev/null
+++ b/site/Rockwell/Rockwell/index.html
@@ -0,0 +1,403 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rockwell : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
👋 Benvenuto nella sezione Rockwell
+
Questa sezione raccoglie la documentazione tecnica e funzionale legata alle soluzioni sviluppate con tecnologie Rockwell Automation .
+
Il nostro obiettivo?
+🔧 Accelerare lo sviluppo delle applicazioni e degli impianti per macchine da packaging , fornendo componenti riutilizzabili, templates e best practices.
+
+
🧪 Prototipi
+
Raccolta di template di macchina per diverse tipologie di impianti.
+Ogni prototipo rappresenta una base solida per lo sviluppo di applicazioni su piattaforma Rockwell.
+
📦 Prototipi disponibili:
+
+
+
+Categoria
+Stato
+Link
+
+
+
+
+🌀 Flowpack
+🚧 In sviluppo
+Vai ›
+
+
+🧩 Linea a Moduli
+🚧 In sviluppo
+Vai ›
+
+
+🤖 Isola Robotizzata
+🚧 In sviluppo
+(in arrivo)
+
+
+🏗️ Formatrice
+🚧 In sviluppo
+(in arrivo)
+
+
+🤏 Pick and Place
+🚧 In sviluppo
+(in arrivo)
+
+
+
+
Ogni template include:
+
+Struttura software
+Layout HMI
+Logiche base
+Integrazione con I/O e diagnostica
+
+
+
+
La piattaforma Rockwell per la creazione di interfacce HMI moderne, scalabili e completamente personalizzabili.
+
In questa sezione troverai:
+
+
+
🚀 Perché questa documentazione
+
+Standardizzare, riutilizzare, innovare.
+Questa documentazione serve come punto di partenza per sviluppatori, tecnici e integratori che lavorano su impianti con tecnologia Rockwell.
+
+
📘 Documentazione chiara
+♻️ Componenti riutilizzabili
+🤝 Condivisione tra team
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Schneider/Schneider/index.html b/site/Schneider/Schneider/index.html
new file mode 100644
index 0000000..6c2ef2d
--- /dev/null
+++ b/site/Schneider/Schneider/index.html
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/Secomea/setup-1549dev/index.html b/site/Secomea/setup-1549dev/index.html
new file mode 100644
index 0000000..fb3efda
--- /dev/null
+++ b/site/Secomea/setup-1549dev/index.html
@@ -0,0 +1,375 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Secomea SiteManager 1549 Dev Separation : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Term
+Definition for the term.
+Another definition for the same term.
+Another Term
+Definition of another term.
+
+
:::info Obiettivo
+Avere due reti separate e sicure, accessibili in modo indipendente tramite GateManager.
+
Questa guida è pensata per tecnici e amministratori di sistema che devono configurare un SiteManager per isolare la rete di una macchina (DEV2) dalla rete di impianto principale (DEV1).
+
1️⃣ Accesso all’interfaccia di Configurazione
+
1️
+
Prima di iniziare, accedi all’interfaccia web del SiteManager.
+
+
Apri un browser e collegati all’indirizzo IP del SiteManager.
+
Accedi tramite la rete locale (porta DEV1) o, se già configurato, attraverso il GateManager.
+
Una volta dentro, naviga nel menu
+
System per visualizzare tutte le interfacce di rete.
+
2️⃣ Configurazione della Porta DEV2
+Ora configuriamo la porta DEV2 per operare come una rete indipendente.
+
Dal menu
+
System, clicca sulla scheda DEV2.
+
Imposta i seguenti parametri nella pagina di configurazione:
+
Mode: Seleziona Separation dal menu a tendina.
+
IP Address: Assegna l’indirizzo IP che farà da gateway per la nuova rete (es. 172.16.223.254).
+
Subnet Mask: Inserisci la maschera di sottorete corrispondente (es. 255.255.240.0).
+
Clicca su
+
Save per memorizzare le impostazioni.
+
Apparirà un avviso per il riavvio. Clicca sul pulsante
+
Reboot per rendere effettive le modifiche.
+
+
+
:::danger Attenzione
+Il riavvio è un passaggio obbligatorio. Senza di esso, la porta DEV2 non funzionerà nella nuova modalità. Il riavvio cancella i log di sistema.
+
3️⃣ Creazione dell’Agente Layer 2
+Dopo il riavvio, la porta DEV2 è attiva sulla sua nuova rete. Ora dobbiamo creare un “Agente” per potervi accedere da remoto.
+
Spostati nella sezione GateManager -> Agents.
+
Crea un nuovo agente.
+
Come
+
Device Type, seleziona Layer2 (GENERIC).
+
Una volta creato, clicca sull’icona
+
Edit (matita) per configurarlo.
+
4️⃣ Associazione Agente-Interfaccia
+Questo è il passaggio cruciale per collegare l’agente software alla porta fisica corretta.
+
All’interno delle impostazioni dell’agente, trova il menu a tendina Interface.
+
Seleziona
+
DEV2 dall’elenco.
+
Clicca su
+
Save e poi su Back per tornare alla lista agenti.
+
+
+
:::tip
+Non è necessario compilare i campi “Device IP Address” o “Device MAC Address” a meno che tu non voglia limitare l’accesso a un singolo dispositivo specifico su quella rete.
+
5️⃣ ✔️ Verifica Finale
+Se la configurazione è andata a buon fine, il risultato sarà immediatamente visibile sul GateManager.
+
Doppia Connessione: Vedrai due agenti Layer 2 attivi per lo stesso SiteManager:
+
Un agente per la rete su
+
DEV1.
+
Un agente per la nuova rete su
+
DEV2.
+
Questo conferma che le reti sono isolate e accessibili in modo indipendente.
+
:::info Nota Pratica
+Per convenzione, su alcuni impianti (es. Rockwell) si preferisce usare le porte
+
DEV1 e DEV3. La procedura per configurare la porta DEV3 è identica a quella descritta per la DEV2.
+
🔗 Risorse Utili
+
Help Online del SiteManager: L’interfaccia del dispositivo contiene una sezione di aiuto dettagliata per ogni parametro di configurazione.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/VisualStudio/Comandi/index.html b/site/VisualStudio/Comandi/index.html
new file mode 100644
index 0000000..7cc6547
--- /dev/null
+++ b/site/VisualStudio/Comandi/index.html
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Guida Visual Studio con Git : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🧑💻 Guida Git da riga di comando in Visual Studio
+
Questa guida mostra tutti i comandi principali per usare Git direttamente dalla riga di comando in Visual Studio su un progetto.
+
+
📂 1. Inizializzare un repository
+
git init
+✅ Crea un nuovo repository Git nella cartella del progetto.
+
+💡 Dopo questo comando, la cartella .git contiene tutte le informazioni di controllo versione.
+
+🔗 2. Collegare un repository remoto
+bash
+Copy
+Edit
+git remote add origin <URL-del-repo>
+✅ Collega il repository locale a un repository remoto (ad esempio su GitHub o GitLab).
+
+💡 origin è il nome predefinito per il repository remoto principale.
+
+📊 3. Controllare lo stato del repository
+bash
+Copy
+Edit
+git status
+✅ Mostra i file modificati, aggiunti o eliminati.
+
+💡 Utile per capire cosa è pronto per il commit.
+npm server
+➕ 4. Aggiungere file all’area di staging
+bash
+Copy
+Edit
+git add <nome-file>
+git add .
+✅ Sposta i file nello staging area pronti per il commit.
+
+💡 Usa . per aggiungere tutti i file modificati.
+
+✏️ 5. Creare un commit
+bash
+Copy
+Edit
+git commit -m "Messaggio del commit"
+✅ Salva le modifiche nell’history del repository.
+
+💡 Il messaggio dovrebbe essere chiaro e descrivere le modifiche apportate.
+
+🚀 6. Inviare le modifiche al repository remoto
+bash
+Copy
+Edit
+git push origin main
+✅ Carica i commit sul repository remoto.
+
+💡 Sostituisci main con il branch corrente se diverso.
+
+⬇️ 7. Scaricare modifiche dal repository remoto
+bash
+Copy
+Edit
+git pull origin main
+✅ Aggiorna il repository locale con le ultime modifiche dal remoto.
+
+💡 Risolve automaticamente i cambiamenti se non ci sono conflitti.
+
+🌿 8. Creare un nuovo branch
+bash
+Copy
+Edit
+git branch <nome-branch>
+git checkout <nome-branch>
+✅ Permette di lavorare su nuove funzionalità senza modificare il branch principale.
+
+💡 Puoi combinare i due comandi con git checkout -b <nome-branch>.
+
+🔄 9. Unire branch
+bash
+Copy
+Edit
+git merge <nome-branch>
+✅ Unisce le modifiche di un branch nel branch corrente.
+
+💡 Risolvi eventuali conflitti prima di completare il merge.
+
+📜 10. Visualizzare la cronologia dei commit
+bash
+Copy
+Edit
+git log
+✅ Mostra la lista dei commit con autore, data e messaggio.
+
+💡 git log --oneline per una versione compatta.
+
+🧹 11. Ignorare file
+Crea un file .gitignore nella root del progetto e aggiungi i file o le cartelle da ignorare:
+
+text
+Copy
+Edit
+
+bin/
+obj/
+*.exe
+*.log
+✅ Evita di aggiungere file temporanei o di build al repository.
+
+⚙️ 12. Configurare Git
+bash
+Copy
+Edit
+git config --global user.name "Nome Cognome"
+git config --global user.email "email@example.com"
+✅ Imposta il nome e la mail per i commit.
+
+💡 --global applica la configurazione a tutti i repository locali.
+
+🔍 13. Controllare i remote
+bash
+Copy
+Edit
+git remote -v
+✅ Mostra gli URL dei repository remoti collegati.
+
+🧩 14. Annullare modifiche
+Annullare modifiche non salvate:
+
+bash
+Copy
+Edit
+git checkout -- <file>
+Rimuovere file dallo staging:
+
+bash
+Copy
+Edit
+git reset <file>
+Annullare l’ultimo commit mantenendo le modifiche locali:
+
+bash
+Copy
+Edit
+git reset --soft HEAD~1
+💡 Suggerimenti
+Usa il terminale integrato di Visual Studio (Ctrl + ) per eseguire tutti i comandi.
+
+Tieni sempre aggiornato il branch principale prima di fare nuove modifiche (git pull).
+
+Commit frequenti aiutano a tracciare meglio le modifiche.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/VisualStudio/c2/index.html b/site/VisualStudio/c2/index.html
new file mode 100644
index 0000000..5e1951c
--- /dev/null
+++ b/site/VisualStudio/c2/index.html
@@ -0,0 +1,481 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Git da riga di comando in Visual Studio : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🖼️ Git da riga di comando in Visual Studio
+
+
🟢 Staging & Commit
+
+
+
+Comando
+Descrizione
+Esempio
+
+
+
+
+➕ git add <file>
+Aggiunge file allo staging
+git add main.pygit add .
+
+
+✏️ git commit -m "msg"
+Salva le modifiche nello storico
+git commit -m "Aggiunto modulo login"
+
+
+🧹 git reset <file>
+Rimuove file dallo staging
+git reset main.py
+
+
+🧩 git checkout -- <file>
+Annulla modifiche non committate
+git checkout -- main.py
+
+
+
+
+
🔵 Branch & Merge
+
+
+
+Comando
+Descrizione
+Esempio
+
+
+
+
+🌿 git branch <nome>
+Crea un nuovo branch
+git branch feature/login
+
+
+🌿 git checkout <branch>
+Passa a un branch esistente
+git checkout feature/login
+
+
+🌿 git checkout -b <branch>
+Crea e passa a un nuovo branch
+git checkout -b feature/signup
+
+
+🔄 git merge <branch>
+Unisce un branch nel branch corrente
+git merge feature/login
+
+
+
+
+
🟠 Remoto
+
+
+
+Comando
+Descrizione
+Esempio
+
+
+
+
+🔗 git remote add origin <URL>
+Collega repository locale a remoto
+git remote add origin https://github.com/user/repo.git
+
+
+🚀 git push origin <branch>
+Invia commit al repository remoto
+git push origin main
+
+
+⬇️ git pull origin <branch>
+Scarica modifiche dal remoto
+git pull origin main
+
+
+🔍 git remote -v
+Mostra repository remoti collegati
+git remote -v
+
+
+
+
+
🟣 Info & Config
+
+
+
+Comando
+Descrizione
+Esempio
+
+
+
+
+📜 git log
+Mostra cronologia dei commit
+git loggit log --oneline
+
+
+⚙️ git config --global user.name "Nome"
+Imposta nome autore
+git config --global user.name "Mario Rossi"
+
+
+⚙️ git config --global user.email "email"
+Imposta email autore
+git config --global user.email "mario@example.com"
+
+
+📂 git init
+Inizializza un repository locale
+git init
+
+
+
+
+
💡 Suggerimenti rapidi
+
+🟢 Staging / Commit → commit frequenti
+🔵 Branch / Merge → lavora sempre su branch separati
+🟠 Remoto → pull prima di push
+🟣 Info / Config → controlla sempre lo stato con git status
+
+
+
+🔗 Risorse utili: Git Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/VisualStudio/c3/index.html b/site/VisualStudio/c3/index.html
new file mode 100644
index 0000000..1693e8b
--- /dev/null
+++ b/site/VisualStudio/c3/index.html
@@ -0,0 +1,368 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Git Passo-Passo per Principianti : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🐣 Git Passo-Passo per Principianti
+
+🎨 Versione guidata per chi parte da zero
+💡 L’obiettivo: lavorare sempre su branch separati e non rompere il repository principale
+
+
+
1️⃣ Clona il repository (se non l’hai già)
+
Prima di iniziare a modificare, devi avere il repository sul tuo computer.
+
git clone [URL-DEL-REPOSITORY]
+cd [NOME-REPO]
+
+
🔹 [URL-DEL-REPOSITORY] → indirizzo del repository remoto
+🔹 [NOME-REPO] → la cartella del progetto
+
2️⃣ Controlla lo stato del repository
+
git status
+
+
Ti mostra quali file sono stati modificati e se ci sono modifiche non salvate.
+
3️⃣ Crea un nuovo branch
+Sempre creare un branch nuovo per ogni modifica!
+Così il branch principale (main o master) rimane sicuro.
+
git checkout -b feature/nome-modifica
+
+
🔹 Usa un nome chiaro, es: feature/login
+
4️⃣ Modifica i file
+Fai le modifiche necessarie nei file del progetto.
+
5️⃣ Aggiungi i file allo staging
+
git add <file >
+
+
🔹 [file] → il file specifico che vuoi salvare
+🔹 Usa . per aggiungere tutti i file modificati
+
6️⃣ Salva le modifiche con un commit
+
git commit -m "Messaggio chiaro sulla modifica"
+
+
🔹 Usa un messaggio chiaro: es. Aggiunto modulo login o Corretto bug funzione X
+
7️⃣ Aggiorna il branch remoto
+Prima di inviare le modifiche, assicurati di avere l’ultima versione del repository remoto:
+
git pull origin main
+
+
Poi invia il tuo branch:
+
git push origin feature/nome-modifica
+
+
8️⃣ Apri una Pull Request (PR)
+🔹 Vai sul repository remoto (GitHub, GitLab, ecc.)
+🔹 Apri una PR dal tuo branch verso main
+🔹 Descrivi cosa hai fatto e richiedi revisione
+
9️⃣ Dopo che la PR è approvata
+Torna sul branch principale aggiornato:
+
git checkout main
+git pull origin main
+
+
Puoi cancellare il branch locale se non serve più:
+
git branch -d feature/nome-modifica
+
+
💡 Suggerimenti rapidi
+✅ Sempre lavorare su un branch nuovo
+✅ Commit frequenti e chiari
+✅ Pull prima di push
+✅ Controlla sempre git status
+
🔗 Risorse utili: Git Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/assets/css/docmd-highlight-dark.css b/site/assets/css/docmd-highlight-dark.css
new file mode 100644
index 0000000..5344ee3
--- /dev/null
+++ b/site/assets/css/docmd-highlight-dark.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}
\ No newline at end of file
diff --git a/site/assets/css/docmd-highlight-light.css b/site/assets/css/docmd-highlight-light.css
new file mode 100644
index 0000000..df0268a
--- /dev/null
+++ b/site/assets/css/docmd-highlight-light.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}
\ No newline at end of file
diff --git a/site/assets/css/docmd-main.css b/site/assets/css/docmd-main.css
new file mode 100644
index 0000000..041e398
--- /dev/null
+++ b/site/assets/css/docmd-main.css
@@ -0,0 +1,7 @@
+/* Source file from the docmd project — https://github.com/mgks/docmd */
+
+/*
+ * Main CSS file for docmd
+ */
+
+.docmd-container.steps-reset .docmd-container.steps-reset ol.steps-list>li.step-item::before,.docmd-container.steps-reset ol.steps-list>li.step-item::before,.docmd-container.steps-reset ol.steps-list[start]>li.step-item::before{content:counter(list-counter) ".";font-weight:700;margin-right:.5em;color:var(--accent-color,#007acc)}.docmd-tab-pane.active,.logo-link img,.logo-link img.logo-light,.tab-panel.active,.theme-toggle-button .icon-sun,body.sidebar-collapsible .sidebar-toggle-button,html[data-theme=dark] .logo-link img.logo-dark,html[data-theme=dark] .theme-toggle-button .icon-moon,img{display:block}:root{--font-family-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--font-family-mono:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;--bg-color:#ffffff;--text-color:#333333;--sidebar-bg:#f4f7f9;--sidebar-text:#2c3e50;--sidebar-link-active-bg:#e0e7ec;--sidebar-link-active-parent-bg:#e9eff3;--link-color:#007bff;--border-color:#e0e0e0;--code-bg:#f8f8f8;--code-text:#333;--header-bg:#ffffff;--header-border:#e0e0e0;--image-border-color:#e0e0e0;--image-shadow:0 2px 8px rgba(0, 0, 0, 0.1);--image-caption-bg:#f8f8f8;--image-caption-text:#666;--lightbox-bg:rgba(0, 0, 0, 0.9);--lightbox-text:#fff}[data-theme=dark]{--bg-color:#1a1a1a;--text-color:#e0e0e0;--sidebar-bg:#2c2c2c;--sidebar-text:#bdc3c7;--sidebar-link-active-bg:#3a3a3a;--sidebar-link-active-parent-bg:#343434;--link-color:#58a6ff;--border-color:#444444;--code-bg:#282c34;--code-text:#abb2bf;--header-bg:#1a1a1a;--header-border:#444444;--image-border-color:#444444;--image-shadow:0 2px 8px rgba(0, 0, 0, 0.3);--image-caption-bg:#2c2c2c;--image-caption-text:#bdc3c7;--lightbox-bg:rgba(0, 0, 0, 0.95);--lightbox-text:#fff}body{font-family:var(--font-family-sans);background-color:var(--bg-color);color:var(--text-color);margin:0;display:flex;min-height:100vh;line-height:1.6}code,pre{font-family:var(--font-family-mono);background-color:var(--code-bg)}.sidebar{width:260px;background-color:var(--sidebar-bg);color:var(--sidebar-text);padding:20px;border-right:1px solid var(--border-color);height:100vh;position:fixed;top:0;left:0;overflow-y:auto;box-sizing:border-box;flex-shrink:0}.sidebar h1{font-size:1.5em;margin-top:0;margin-bottom:20px;padding-bottom:10px;border-bottom:1px solid var(--border-color)}.sidebar nav ul{list-style:none;padding:0;margin:0}.sidebar nav li a{display:block;padding:8px 10px;text-decoration:none;color:var(--sidebar-text);border-radius:4px;transition:background-color .2s}.copy-code-button:hover,.docmd-tabs-nav-item:hover,.sidebar nav li a.active,.sidebar nav li a:hover,.theme-toggle-button:hover{background-color:var(--sidebar-link-active-bg)}.sidebar nav li a.active{font-weight:600;color:var(--link-color)}.sidebar nav li.active-parent>a{background-color:var(--sidebar-link-active-parent-bg);font-weight:500;position:relative}.sidebar nav li.active-parent>a::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background-color:var(--link-color);opacity:.5}.copy-code-button:hover,.sidebar nav li.active-parent>a.active::before,div:hover>.copy-code-button{opacity:1}.sidebar nav ul ul{padding-left:20px;margin-top:5px}.sidebar-toggle-button{background:0 0;border:1px solid transparent;color:var(--text-color);cursor:pointer;padding:0;margin:.5em 0 0;display:none;border-radius:4px}.sidebar-toggle-button:hover{background-color:var(--sidebar-bg);border-color:var(--border-color)}.sidebar-toggle-button .lucide-icon{width:2em;height:2em}body.sidebar-collapsed .sidebar{transform:translateX(-100%);visibility:hidden}.toc-level-2,body.sidebar-collapsed .main-content-wrapper{margin-left:0}.main-content-wrapper,.sidebar{transition:transform .3s,margin-left .3s,visibility .3s}.main-content-wrapper{margin-left:260px;flex-grow:1;display:flex;flex-direction:column;overflow:hidden}.header-left,.page-header{align-items:center;display:flex}.page-header{padding:15px 30px;border-bottom:1px solid var(--header-border);background-color:var(--header-bg);justify-content:space-between;min-height:2.5em}.header-left{gap:15px}.header-right{display:flex;align-items:center}.page-header h1{margin:0;font-size:1.8em}.theme-toggle-header{padding:8px;background:var(--content-bg);border:1px solid var(--border-color);border-radius:6px;cursor:pointer;transition:.2s}.theme-toggle-header:hover{background:var(--sidebar-bg);border-color:var(--accent-color)}.card .card-title,.sidebar-header{border-bottom:1px solid var(--border-color)}.content-area{padding:2.5rem 2rem;max-width:1200px;margin:0 auto;width:100%;box-sizing:border-box}pre{color:var(--code-text);padding:1em;border-radius:4px;overflow-x:auto;position:relative}code{padding:.2em .4em;border-radius:3px;font-size:.9em}pre code{background-color:transparent;padding:0;font-size:inherit}.sidebar-header{padding-bottom:10px;margin-bottom:10px;text-align:center;height:2.5em}.sidebar-header h1{font-size:1.5em;margin-top:0;margin-bottom:0}.logo-link img{max-height:40px;width:auto;margin:0 auto}.docmd-tab-pane,.logo-link img.logo-dark,.tab-panel,.theme-toggle-button .icon-moon,html[data-theme=dark] .logo-link img.logo-light,html[data-theme=dark] .theme-toggle-button .icon-sun,.sidebar nav li.collapsible:not([aria-expanded=true])>.submenu{display:none}.sidebar-nav .lucide-icon{width:1em;height:1em;margin-right:.5em;vertical-align:-.15em;stroke-width:2}.sidebar-nav .nav-external-icon{width:1em;height:1.5em;float:right;margin-left:.3em;opacity:.7}.theme-toggle-button{background:0 0;border:1px solid var(--border-color);color:var(--sidebar-text);padding:8px;border-radius:4px;cursor:pointer;margin-top:.5em;display:flex;align-items:center;justify-content:center;width:100%}.next-page,.prev-page,.step::before{color:var(--link-color);display:flex}.callout .callout-content>:first-child,.card .card-content>:first-child,.docmd-container>:first-child,.step-content>:first-child,.step-title{margin-top:0}.theme-toggle-button .lucide-icon{width:1.2em;height:1.2em}.docmd-container{padding:1rem 1.5rem;margin-bottom:1.5rem;border-radius:6px;border:1px solid var(--border-color);background-color:var(--code-bg)}.callout .callout-content>:last-child,.card .card-content>:last-child,.docmd-container>:last-child,.step-content>:last-child{margin-bottom:0}.callout{border-left-width:5px;background-color:transparent}.callout-title{font-weight:700;margin-bottom:.5em}.callout-info{border-left-color:#3498db;background-color:rgba(52,152,219,.07)}.callout-warning{border-left-color:#f39c12;background-color:rgba(243,156,18,.07)}.callout-success,.callout-tip{border-left-color:#2ecc71;background-color:rgba(46,204,113,.07)}.callout-danger{border-left-color:#e74c3c;background-color:rgba(231,76,60,.07)}.card .card-title{font-weight:700;font-size:1.1em;margin:-1rem -1.5rem 1rem;padding:.75rem 1.5rem}.docmd-container.steps{position:relative;padding-left:3rem;border:none;background:0 0;box-shadow:none}.docmd-container.steps::before{content:"";position:absolute;top:1rem;bottom:1rem;left:2.5rem;width:2px;background-color:var(--border-color)}.step{position:relative;padding-bottom:1.5rem}.step:last-child{padding-bottom:0}.step::before{content:attr(data-step);position:absolute;left:-3rem;top:.1rem;width:2.5rem;height:2.5rem;background-color:var(--bg-color);border:2px solid var(--border-color);border-radius:50%;align-items:center;justify-content:center;font-size:1rem;font-weight:600;z-index:1}.step-title{font-size:1.25rem;font-weight:600;margin-bottom:.5rem}.docmd-container.steps-reset{counter-reset:step-counter 0}.docmd-container.steps-reset ol.steps-list{counter-reset:list-counter 0;list-style:none}.docmd-container.steps-reset ol.steps-list>li.step-item{counter-increment:list-counter 1;position:relative;padding-left:0;margin-bottom:2.5rem}.docmd-container.steps-reset ol.steps-list>li.step-item::before{font-size:2rem}.docmd-container.steps-reset .docmd-container.steps-reset ol.steps-list,.docmd-container.steps-reset ol.steps-list[start]{counter-reset:list-counter 0}.docmd-container.steps-reset .docmd-container.steps-reset ol.steps-list>li.step-item,.docmd-container.steps-reset ol.steps-list[start]>li.step-item{counter-increment:list-counter 1}.docmd-container.steps-reset ol:not(.steps-list)::before,.docmd-container.steps-reset ol:not(.steps-list)>li::before,.docmd-container.steps-reset ul::before,.docmd-container.steps-reset ul>li::before{width:.75rem;height:.75rem;left:-1.5rem;top:.5rem;content:""!important}:focus-visible{outline:2px solid var(--link-color);outline-offset:2px}:focus:not(:focus-visible){outline:currentcolor}.sidebar nav li a:focus-visible{background-color:var(--sidebar-link-active-bg);outline:2px solid var(--link-color);outline-offset:-2px}.theme-toggle-button:focus-visible{border-color:var(--link-color);box-shadow:0 0 0 2px var(--link-color)}.page-footer,.page-navigation{border-top:1px solid var(--border-color)}.page-navigation{display:flex;justify-content:space-between;margin-top:3rem;padding-top:1.5rem}.next-page,.prev-page{align-items:center;text-decoration:none;padding:.75rem;border-radius:6px;transition:background-color .2s;width:48%;max-width:48%}.next-page:hover,.prev-page:hover{background-color:rgba(0,0,0,.05);text-decoration:none}[data-theme=dark] .next-page:hover,[data-theme=dark] .prev-page:hover{background-color:rgba(255,255,255,.05)}.prev-page{justify-content:flex-start}.next-page{justify-content:flex-end;text-align:right}.next-page-placeholder,.prev-page-placeholder{width:48%}.next-page span,.prev-page span{display:flex;flex-direction:column}.next-page small,.prev-page small{font-size:.8rem;opacity:.8;margin-bottom:.25rem}.next-page strong,.prev-page strong{font-weight:500}.page-nav-icon{width:1.2rem;height:1.2rem}.prev-page .page-nav-icon{margin-right:.75rem}.next-page .page-nav-icon{margin-left:.75rem}.page-footer{text-align:center;padding:20px 30px;margin-top:auto;font-size:.9em;color:var(--text-color);background-color:var(--sidebar-bg)}.footer-content{display:flex;justify-content:space-between;align-items:center;margin:0 auto;width:100%}.user-footer{text-align:left}.branding-footer{text-align:right;opacity:.9;font-weight:500}.branding-footer svg{color:#fb3a3a}.page-footer a{color:var(--link-color);text-decoration:none}.page-footer a:hover,.toc-link:hover{text-decoration:underline}.content-layout{display:flex;gap:2rem;width:100%}.main-content{flex:1 1 0%;min-inline-size:0px}.toc-container{margin:0;padding:0;border:none;background-color:transparent}.docmd-container figure img,.toc-title{margin-bottom:.5rem}.toc-title{margin-top:0;font-size:1rem;font-weight:700;color:var(--text-muted)}.toc-list{list-style:none;padding-left:0;margin:0}.toc-item{margin-bottom:.25rem;line-height:1.4}.toc-link{text-decoration:none;color:var(--link-color);display:inline-block;padding:.1rem 0;font-size:.9rem;font-weight:500}.toc-level-3{margin-left:.75rem;font-size:.85rem}.toc-level-4{margin-left:1.5rem;font-size:.8rem}.toc-sidebar{width:180px;position:sticky;top:2rem;max-height:calc(-4rem + 100vh);overflow-y:auto;align-self:flex-start}@media (max-width:1024px){.content-layout{display:flex;flex-direction:column-reverse}.toc-sidebar{width:100%;position:static;margin-bottom:1rem}}.docmd-tabs,img{margin:1.5rem 0}img{max-width:100%;height:auto}img.align-left{float:left;margin-right:1.5rem;margin-bottom:1rem}img.align-center{margin-left:auto;margin-right:auto}img.align-right{float:right;margin-left:1.5rem;margin-bottom:1rem}img.size-small{max-width:300px}img.size-medium{max-width:500px}img.size-large{max-width:800px}img.with-border{border:1px solid var(--image-border-color);padding:4px}img.with-shadow{box-shadow:var(--image-shadow)}.docmd-container figure{margin:2rem 0}.docmd-container figcaption{font-size:.9rem;color:var(--image-caption-text);text-align:center;padding:.5rem;background-color:var(--image-caption-bg);border-radius:0 0 4px 4px}.docmd-container .image-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:1rem;margin:2rem 0}.docmd-container .image-gallery figure{margin:0}.docmd-container .clear-float::after{content:"";display:table;clear:both}.docmd-tabs{border:1px solid var(--border-color);border-radius:6px;overflow:hidden;box-shadow:rgba(0,0,0,.05) 0 1px 3px}.docmd-tabs-nav{display:flex;background-color:var(--sidebar-bg);border-bottom:1px solid var(--border-color);overflow:auto hidden}.docmd-tabs-nav-item{padding:.75rem 1.25rem;cursor:pointer;border-bottom:3px solid transparent;margin-bottom:-1px;font-weight:500;color:var(--sidebar-text);white-space:nowrap}.docmd-tabs-nav-item.active{color:var(--link-color);border-bottom-color:var(--link-color);background-color:var(--bg-color)}.docmd-tabs-content{padding:1.5rem}.tabs-container{margin:1rem 0;border:1px solid #e1e5e9;border-radius:.375rem}.tab-navigation{display:flex;background-color:#f8f9fa;border-bottom:1px solid #e1e5e9;border-radius:.375rem .375rem 0 0}.tab-button{padding:.75rem 1rem;border-width:medium medium 2px;border-style:none none solid;border-color:currentcolor currentcolor transparent;border-image:none;background:0 0;cursor:pointer;transition:.2s}.tab-button:hover{background-color:#e9ecef}.tab-button.active{border-bottom-color:#007bff;background-color:#fff}.tab-content{padding:1rem}.docmd-lightbox{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:var(--lightbox-bg);z-index:9999;justify-content:center;align-items:center;flex-direction:column}.copy-code-button svg,.sponsor-icon{width:1rem;height:1rem}.docmd-lightbox-content{position:relative;max-width:90%;max-height:90%;text-align:center}.docmd-lightbox-content img{max-width:100%;max-height:80vh;object-fit:contain;margin:0 auto;box-shadow:rgba(0,0,0,.3) 0 0 20px}.docmd-lightbox-caption{color:var(--lightbox-text);padding:1rem;font-size:1rem;max-width:100%}.docmd-lightbox-close{position:absolute;top:20px;right:30px;color:var(--lightbox-text);font-size:2.5rem;cursor:pointer;z-index:10000}.docmd-lightbox-close:hover{color:#ddd}.docmd-button,.sponsor-link,.sponsor-link:hover{color:#fff;text-decoration:none}.docmd-container .image-gallery img,img.lightbox{cursor:zoom-in}.docmd-button{display:inline-block;padding:.6rem 1.2rem;margin:.5rem;border-radius:6px;background-color:var(--link-color);font-weight:500;transition:background-color .2s,transform .2s;border:none;cursor:pointer}.docmd-button:hover{text-decoration:none;filter:brightness(90%);transform:translateY(-1px)}.sponsor-ribbon{position:fixed;bottom:75px;right:10px;z-index:1000;transform:rotate(0);transform-origin:center center;opacity:.75;transition:.5s}.sponsor-ribbon:hover{opacity:1}.sponsor-link{display:flex;align-items:center;gap:.5rem;background:linear-gradient(135deg,#ff6b6b,#ee5a24);padding:.75rem 1.5rem;border-radius:5px;box-shadow:rgba(255,107,107,.3) 0 4px 12px;font-weight:600;font-size:.875rem;transition:.3s;white-space:nowrap}.sponsor-link:hover{transform:scale(1.02);box-shadow:rgba(255,107,107,.4) 0 6px 20px}.sponsor-icon{animation:2s ease-in-out infinite heartbeat}.sponsor-text{font-family:inherit}@keyframes heartbeat{0%,100%{transform:scale(1)}50%{transform:scale(1.1)}}@media (max-width:768px){body{flex-direction:column}.sidebar{width:100%;height:auto;position:static;border-right:currentcolor;border-bottom:1px solid var(--border-color)}.sidebar-toggle-button{display:block}.main-content-wrapper{margin-left:0}.content-area{padding:15px}.footer-content,.page-navigation{flex-direction:column;gap:1rem}.branding-footer,.user-footer{text-align:center}.next-page,.next-page-placeholder,.prev-page,.prev-page-placeholder{width:100%;max-width:100%}img.align-left,img.align-right{float:none;margin-left:auto;margin-right:auto}.docmd-container .image-gallery{grid-template-columns:1fr}.sponsor-ribbon{bottom:10px;right:10px}.sponsor-link{padding:.5rem 1rem;font-size:.75rem}.sponsor-icon{width:.875rem;height:.875rem}}html[data-theme=dark] .sponsor-link{background:linear-gradient(135deg,#ff6b6b,#c44569);box-shadow:rgba(255,107,107,.2) 0 4px 12px}html[data-theme=dark] .sponsor-link:hover{box-shadow:rgba(255,107,107,.3) 0 6px 20px}.copy-code-button{position:absolute;top:.75rem;right:.75rem;padding:.5rem;background-color:var(--code-bg);border:1px solid var(--border-color);border-radius:6px;cursor:pointer;opacity:0;transition:opacity .2s ease-in-out,background-color .2s;color:var(--sidebar-text);display:flex;align-items:center;justify-content:center;z-index:10;pointer-events:auto}.copy-code-button.copied{color:#10b981;opacity:1}.sidebar nav li.collapsible>a{display:flex;justify-content:space-between;align-items:center}.sidebar nav li.collapsible>a .nav-item-title{flex-grow:1}.sidebar nav .collapse-icon{transition:transform .2s ease-in-out;flex-shrink:0;margin-left:.5em}.sidebar nav li.collapsible[aria-expanded=true]>a>.collapse-icon{transform:rotate(90deg)}hr{color:rgba(245,245,245,.27);border-top-width:1px}
\ No newline at end of file
diff --git a/site/assets/css/docmd-theme-retro.css b/site/assets/css/docmd-theme-retro.css
new file mode 100644
index 0000000..684414b
--- /dev/null
+++ b/site/assets/css/docmd-theme-retro.css
@@ -0,0 +1,9 @@
+/* Source file from the docmd project — https://github.com/mgks/docmd */
+
+/*
+ * docmd Retro Theme
+ * Inspired by 1980s-90s computing aesthetics
+ * Features: Neon colors, scanlines, terminal styling, glow effects
+ */
+
+a,h1,h2,h3,h4,h5,h6{color:var(--retro-accent)}a,body{position:relative}html[data-theme=light] pre,pre{color:var(--retro-text)!important;background:var(--retro-secondary)!important}html[data-theme=light] code,html[data-theme=light] pre,pre{background:var(--retro-secondary)!important}body,pre::before{background:var(--retro-primary)}.page-header::after,html[data-theme=light] .page-header::after{background:linear-gradient(90deg,transparent,var(--retro-accent),transparent)}.btn,.docmd-button,.docmd-tabs-nav-item,.theme-toggle-button,button{cursor:pointer;transition:.3s;font-family:var(--retro-font-family)}.btn,.docmd-button,.docmd-tabs-nav-item,.sidebar-nav a,.theme-toggle-button,body,button,code,h1,h2,h3,h4,h5,h6{font-family:var(--retro-font-family)}:root{--retro-primary:#0a0a0a;--retro-secondary:#1a1a1a;--retro-bg-light:#0f0f0f;--retro-text:#00ff41;--retro-text-secondary:#ffb000;--retro-text-muted:#888888;--retro-accent:#00ffff;--retro-danger:#ff1493;--retro-warning:#ffb000;--retro-success:#00ff41;--retro-info:#0066ff;--retro-border:#333333;--retro-border-bright:#00ffff;--retro-glow:0 0 10px currentColor;--retro-glow-soft:0 0 5px currentColor;--retro-shadow:0 0 20px rgba(0, 255, 255, 0.3);--retro-font-family:'Fira Code','Courier New','Consolas',monospace;--retro-font-family-alt:'Share Tech Mono','Courier New',monospace;--retro-spacing:1rem;--retro-spacing-small:0.5rem;--retro-spacing-large:2rem}html[data-theme=light]{--retro-primary:#f0f0f0;--retro-secondary:#e0e0e0;--retro-bg-light:#f5f5f5;--retro-text:#2d5d2d;--retro-text-secondary:#8b4500;--retro-text-muted:#666666;--retro-accent:#006666;--retro-danger:#b71c42;--retro-warning:#b8860b;--retro-success:#228b22;--retro-info:#4169e1;--retro-border:#cccccc;--retro-border-bright:#006666;--retro-glow:0 0 5px currentColor;--retro-glow-soft:0 0 3px currentColor;--retro-shadow:0 0 15px rgba(0, 102, 102, 0.2)}*{box-sizing:border-box}body{color:var(--retro-text);line-height:1.6;margin:0;padding:0;min-height:100vh;overflow-x:hidden}body::before{content:'';position:fixed;top:0;left:0;width:100%;height:100%;background:linear-gradient(transparent 50%,rgba(0,255,65,.03) 50%);background-size:100% 4px;pointer-events:none;z-index:1000;animation:.1s linear infinite scanlines}html[data-theme=light]::before{background:linear-gradient(transparent 50%,rgba(45,93,45,.02) 50%)}html[data-theme=light] .page-header{box-shadow:0 2px 10px rgba(0,102,102,.2)}@keyframes scanlines{0%{transform:translateY(0)}100%{transform:translateY(4px)}}@keyframes flicker{0%,100%{opacity:1}98%{opacity:.98}99%{opacity:.99}}.page-container{animation:3s infinite flicker}h1,h2,h3,h4,h5,h6{text-transform:uppercase;letter-spacing:2px;text-shadow:var(--retro-glow-soft);margin:var(--retro-spacing-large) 0 var(--retro-spacing)}code,h2{color:var(--retro-text-secondary)}h1{font-size:2.5rem;border-bottom:2px solid var(--retro-accent);padding-bottom:.5rem;animation:2s ease-in-out infinite alternate glow-pulse}@keyframes glow-pulse{from{text-shadow:0 0 5px var(--retro-accent)}to{text-shadow:0 0 15px var(--retro-accent),0 0 25px var(--retro-accent)}}h2{font-size:2rem}h3,html[data-theme=light] .sidebar-nav a{color:var(--retro-text)}h3{font-size:1.5rem}p{margin:var(--retro-spacing) 0;text-shadow:0 0 2px currentColor}.callout-title,a{text-shadow:var(--retro-glow-soft)}a{text-decoration:none;transition:.3s}a:hover{color:var(--retro-danger);text-shadow:var(--retro-glow)}.page-content a:before,.sidebar-nav a:before{content:'>';margin-right:.25rem;animation:1s infinite blink}.docmd-button:before,.docmd-container.steps ol.steps-list>li.step-item:last-child::after,.docmd-container.steps ol:not(.steps-list) li::before,.docmd-container.steps ul li::before,.page-header a:before,.page-nav a:before{display:none}@keyframes blink{0%,50%{opacity:1}100%,51%{opacity:0}}code{background:var(--retro-secondary);padding:.2rem .4rem;border-radius:3px;border:1px solid var(--retro-border);box-shadow:inset 0 0 5px rgba(0,255,65,.2)}.page-header,pre{padding:var(--retro-spacing);position:relative}pre{border-radius:8px;border:1px solid var(--retro-border-bright);box-shadow:var(--retro-shadow);overflow-x:auto;padding-top:2rem}.docmd-container::before,pre::before{position:absolute;border:1px solid var(--retro-border-bright)}html[data-theme=light] code{color:var(--retro-text-secondary)!important;box-shadow:inset 0 0 5px rgba(45,93,45,.2)}pre::before{content:'[TERMINAL]';top:5px;left:5px;color:var(--retro-accent);padding:.2rem .5rem;font-size:.7rem;border-radius:3px}.page-header{background:linear-gradient(45deg,var(--retro-secondary),var(--retro-bg-light));border-bottom:2px solid var(--retro-border-bright);box-shadow:0 2px 10px rgba(0,255,255,.3)}.page-header::after{content:'';position:absolute;bottom:-2px;left:0;width:100%;height:2px;animation:2s ease-in-out infinite scan}@keyframes scan{0%,100%{transform:scaleX(0)}50%{transform:scaleX(1)}}.sidebar{background:var(--retro-secondary);border-right:2px solid var(--retro-border-bright);box-shadow:2px 0 10px rgba(0,255,255,.2)}.sidebar-nav a{display:block;padding:.75rem var(--retro-spacing);border-bottom:1px solid var(--retro-border);transition:.3s}.sidebar-nav a.active,.sidebar-nav a:hover{background:var(--retro-bg-light);border-left:4px solid var(--retro-accent);box-shadow:inset 0 0 10px rgba(0,255,255,.2)}html[data-theme=light] .sidebar-nav a.active,html[data-theme=light] .sidebar-nav a:hover{background:var(--retro-bg-light);border-left:4px solid var(--retro-accent);box-shadow:inset 0 0 10px rgba(0,102,102,.2)}.btn,.docmd-button,button{background:linear-gradient(145deg,var(--retro-secondary),var(--retro-bg-light));color:var(--retro-accent);border:2px solid var(--retro-border-bright);padding:.75rem 1.5rem;font-weight:700;text-transform:uppercase;letter-spacing:1px;position:relative;text-decoration:none;display:inline-block;box-shadow:0 4px 15px rgba(0,255,255,.3)}.btn:hover,.docmd-button:hover,button:hover,th{background:linear-gradient(145deg,var(--retro-bg-light),var(--retro-secondary))}.docmd-container.steps::before,.docmd-tabs-nav-item{color:var(--retro-text-secondary);letter-spacing:1px}.docmd-container,td,th{padding:var(--retro-spacing)}.docmd-container,.docmd-tabs{background:var(--retro-secondary);box-shadow:var(--retro-shadow);position:relative}.btn:hover,.docmd-button:hover,button:hover{color:var(--retro-danger);box-shadow:0 6px 20px rgba(255,20,147,.4);transform:translateY(-2px)}.btn:active,.docmd-button:active,button:active{transform:translateY(0);box-shadow:0 2px 10px rgba(0,255,255,.5)}.docmd-container{border:2px solid var(--retro-border);border-radius:8px;margin:var(--retro-spacing) 0}.docmd-container::before{content:attr(data-type);top:-15px;left:5px;background:var(--retro-primary);color:var(--retro-accent);padding:.25rem .75rem;border-radius:3px;font-size:.8rem;text-transform:uppercase;letter-spacing:1px}.docmd-container.callout.info{border-color:var(--retro-info);box-shadow:0 0 15px rgba(0,102,255,.3)}.docmd-container.callout.warning{border-color:var(--retro-warning);box-shadow:0 0 15px rgba(255,176,0,.3)}.docmd-container.callout.danger{border-color:var(--retro-danger);box-shadow:0 0 15px rgba(255,20,147,.3)}.docmd-container.callout.success,.docmd-container.callout.tip{border-color:var(--retro-success);box-shadow:0 0 15px rgba(0,255,65,.3)}.docmd-tabs-nav,th{border-bottom:2px solid var(--retro-border-bright)}.callout-title{font-weight:700;margin-bottom:.75em;display:flex;align-items:center;text-transform:uppercase;letter-spacing:1px}.callout-title::before{margin-right:.5rem;font-size:1.2em;text-shadow:none}.docmd-container.steps::before,.docmd-tabs::before{top:-12px;left:20px;padding:.25rem .75rem;font-size:.7rem;position:absolute;text-transform:uppercase}.callout-info .callout-title::before{content:"🖥️"}.callout-warning .callout-title::before{content:"⚠️"}.callout-tip .callout-title::before{content:"💾"}.callout-danger .callout-title::before{content:"🚨"}.callout-success .callout-title::before{content:"✅"}.docmd-container.card{background:linear-gradient(145deg,var(--retro-secondary),var(--retro-bg-light));border:1px solid var(--retro-border-bright);box-shadow:0 4px 15px rgba(0,255,255,.2),inset 0 0 10px rgba(0,255,65,.1)}.docmd-tabs{border:2px solid var(--retro-border-bright);border-radius:8px;overflow:hidden}.theme-toggle-button,img{box-shadow:0 0 10px rgba(0,255,255,.3)}.docmd-tabs::before{content:'[TABS]';background:var(--retro-primary);color:var(--retro-accent);border:1px solid var(--retro-border-bright);border-radius:3px;z-index:1}.docmd-tabs-nav{background:linear-gradient(90deg,var(--retro-bg-light),var(--retro-secondary));display:flex}.theme-toggle-button,table{background:var(--retro-secondary)}.docmd-tabs-nav-item{padding:1rem 1.5rem;font-weight:700;border-right:1px solid var(--retro-border);position:relative;text-transform:uppercase}.docmd-tabs-nav-item:hover,.theme-toggle-button,th{color:var(--retro-accent)}.docmd-tabs-nav-item:last-child{border-right:none}.docmd-tabs-nav-item:hover{background:var(--retro-bg-light);box-shadow:inset 0 0 10px rgba(0,255,255,.2)}.docmd-tabs-nav-item.active{background:var(--retro-primary);color:var(--retro-accent);border-bottom:2px solid var(--retro-accent);box-shadow:0 0 15px rgba(0,255,255,.5)}.docmd-container.steps,table{box-shadow:var(--retro-shadow)}.docmd-tabs-nav-item.active::after{content:'_';animation:1s infinite blink;margin-left:.25rem}.docmd-tab-pane{display:none;padding:var(--retro-spacing-large);animation:.5s fadeInCRT}.docmd-tab-pane.active{display:block}@keyframes fadeInCRT{0%{opacity:0;transform:scaleY(.1) scaleX(1);filter:brightness(2)}50%{opacity:.5;transform:scaleY(.5) scaleX(1)}100%{opacity:1;transform:scaleY(1) scaleX(1);filter:brightness(1)}}.docmd-container.steps{background:linear-gradient(145deg,var(--retro-secondary),var(--retro-bg-light));border:2px solid var(--retro-border-bright);border-radius:8px;padding:var(--retro-spacing-large);position:relative}.docmd-container.steps::before{content:'[SEQUENCE]';background:var(--retro-primary);border:1px solid var(--retro-border-bright);border-radius:3px}.docmd-container.steps ol.steps-list{counter-reset:step-counter;list-style:none;padding-left:0}.docmd-container.steps ol.steps-list>li.step-item{counter-increment:step-counter;position:relative;padding:var(--retro-spacing) 0 var(--retro-spacing) 4rem;border-bottom:1px solid var(--retro-border);margin-bottom:var(--retro-spacing)}.docmd-container.steps ol.steps-list>li.step-item:last-child{border-bottom:none;margin-bottom:0}.docmd-container.steps ol.steps-list>li.step-item::before{content:counter(step-counter);position:absolute;left:0;top:var(--retro-spacing);width:2.5rem;height:2.5rem;background:linear-gradient(145deg,var(--retro-accent),var(--retro-info));color:var(--retro-primary);border:2px solid var(--retro-border-bright);border-radius:4px;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1.2rem;text-shadow:none;box-shadow:0 0 10px rgba(0,255,255,.5),inset 0 0 5px rgba(0,0,0,.3);animation:2s ease-in-out infinite pulse-glow}@keyframes pulse-glow{0%,100%{box-shadow:0 0 10px rgba(0,255,255,.5),inset 0 0 5px rgba(0,0,0,.3)}50%{box-shadow:0 0 20px rgba(0,255,255,.8),inset 0 0 10px rgba(0,0,0,.5)}}.docmd-container.steps ol.steps-list>li.step-item::after{content:'';position:absolute;left:1.2rem;top:4rem;bottom:-1rem;width:2px;background:linear-gradient(180deg,var(--retro-accent),transparent);box-shadow:0 0 3px var(--retro-accent)}.docmd-container.steps ol:not(.steps-list),.docmd-container.steps ul{list-style:initial;padding-left:2rem;margin:var(--retro-spacing) 0}.docmd-container.steps ol:not(.steps-list) li,.docmd-container.steps ul li{padding:.25rem 0;border:none;margin:0}.logo-link img{border:0;box-shadow:none}img{max-width:100%;height:auto;border:1px solid var(--retro-border);border-radius:4px;filter:brightness(.9) contrast(1.1)}table{width:100%;border-collapse:collapse;border:2px solid var(--retro-border-bright);border-radius:8px;overflow:hidden}th{text-transform:uppercase;letter-spacing:1px}td{border-bottom:1px solid var(--retro-border)}tr:hover{background:var(--retro-bg-light);box-shadow:inset 0 0 10px rgba(0,255,65,.1)}html[data-theme=light] tr:hover{box-shadow:inset 0 0 10px rgba(45,93,45,.1)}@media (max-width:768px){body::before{background-size:100% 2px}@keyframes scanlines{0%{transform:translateY(0)}100%{transform:translateY(2px)}}h1{font-size:2rem}.docmd-tabs-nav{flex-direction:column}.docmd-tabs-nav-item{border-right:none;border-bottom:1px solid var(--retro-border)}.docmd-container.steps ol.steps-list>li.step-item{padding-left:3rem}.docmd-container.steps ol.steps-list>li.step-item::before{width:2rem;height:2rem;font-size:1rem}.docmd-container.steps ol.steps-list>li.step-item::after{left:1rem}}.theme-toggle-button{border:2px solid var(--retro-accent);padding:.5rem;border-radius:4px;text-transform:uppercase;font-size:.8rem;letter-spacing:1px}.theme-toggle-button:hover{background:var(--retro-accent);color:var(--retro-primary);box-shadow:0 0 15px rgba(0,255,255,.6)}html[data-theme=light] .theme-toggle-button{box-shadow:0 0 10px rgba(0,102,102,.3)}html[data-theme=light] .theme-toggle-button:hover{box-shadow:0 0 15px rgba(0,102,102,.6)}.terminal-cursor::after{content:'█';animation:1s infinite blink;color:var(--retro-accent)}.retro-divider{height:2px;background:linear-gradient(90deg,transparent,var(--retro-accent),var(--retro-danger),var(--retro-accent),transparent);margin:var(--retro-spacing-large) 0;animation:3s ease-in-out infinite scan}@media (prefers-reduced-motion:reduce){*,::after,::before{animation-duration:0s!important;animation-iteration-count:1!important;transition-duration:0s!important}body::before{display:none}}@media print{body::before{display:none}.docmd-container{box-shadow:none;border:1px solid #000}*{text-shadow:none!important;box-shadow:none!important}}
\ No newline at end of file
diff --git a/site/assets/css/docmd-theme-ruby.css b/site/assets/css/docmd-theme-ruby.css
new file mode 100644
index 0000000..1eb5723
--- /dev/null
+++ b/site/assets/css/docmd-theme-ruby.css
@@ -0,0 +1,9 @@
+/* Source file from the docmd project — https://github.com/mgks/docmd */
+
+/*
+ * docmd Ruby Theme
+ * Inspired by the beauty of gemstones
+ * Features: Deep ruby red, elegant serif fonts, subtle gem-like effects
+ */
+
+@import url(https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=Source+Sans+Pro:wght@300;400;600;700&display=swap);.docmd-container,.sidebar,pre,table{box-shadow:var(--shadow-sm)}h1,h2{padding-bottom:.5rem}.sidebar nav li a.active,pre{border-left:3px solid var(--ruby-primary)}pre,table{margin:1.5em 0}a:hover,th{color:var(--ruby-primary-dark)}.sidebar-header,th{border-bottom:2px solid var(--ruby-border)}td,th{padding:.75rem 1rem}.content-area a:not(.button):not(.no-underline)::after,.docmd-container::before,h1::after{background:linear-gradient(90deg,var(--ruby-primary),var(--ruby-accent));position:absolute;left:0}.callout,.docmd-container,.steps,.steps h4,a,h1{position:relative}.callout-info .callout-title,.docmd-container.steps-reset ol.steps-list>li.step-item::before,.sidebar nav li a:hover{color:var(--ruby-primary)}.card .card-content,.card .card-title{padding:1rem 1.5rem}figure img,img{max-width:100%}.image-gallery img,.image-gallery.zoom img{transition:transform .3s}:root{--ruby-font-family-sans:"Source Sans Pro",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--ruby-font-family-serif:"Playfair Display",Georgia,"Times New Roman",serif;--ruby-font-family-mono:"JetBrains Mono","SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace}:root[data-theme=light]{--ruby-primary:#b30000;--ruby-primary-light:#ffebee;--ruby-primary-dark:#8e0000;--ruby-accent:#7b1fa2;--ruby-accent-light:#f3e5f5;--ruby-text:#2d2d2d;--ruby-text-light:#5a5a5a;--ruby-text-lightest:#757575;--ruby-background:#ffffff;--ruby-background-alt:#fafafa;--ruby-border:#e0e0e0;--ruby-border-light:#f0f0f0;--bg-color:var(--ruby-background);--text-color:var(--ruby-text);--sidebar-bg:#f8f5f5;--sidebar-text:var(--ruby-text-light);--sidebar-link-active-bg:#f8e7e7;--sidebar-link-active-text:var(--ruby-primary);--link-color:var(--ruby-primary);--border-color:var(--ruby-border);--code-bg:var(--ruby-primary-light);--code-text:var(--ruby-primary-dark);--header-bg:var(--ruby-background);--header-border:var(--ruby-border);--shadow-sm:0 2px 4px rgba(179, 0, 0, 0.05);--shadow-md:0 4px 8px rgba(179, 0, 0, 0.1);--shadow-lg:0 8px 16px rgba(179, 0, 0, 0.15);--image-border-color:var(--ruby-border);--image-shadow:var(--shadow-md);--image-caption-bg:var(--ruby-background-alt);--image-caption-text:var(--ruby-text-light);--image-hover-transform:translateY(-3px);--image-hover-shadow:var(--shadow-lg);--image-border-radius:6px;--image-transition:all 0.3s ease}:root[data-theme=dark]{--ruby-primary:#ff5252;--ruby-primary-light:#3c1a1a;--ruby-primary-dark:#ff7b7b;--ruby-accent:#ce93d8;--ruby-accent-light:#2a1a2a;--ruby-text:#f0f0f0;--ruby-text-light:#c0c0c0;--ruby-text-lightest:#a0a0a0;--ruby-background:#1a0a0a;--ruby-background-alt:#2a1515;--ruby-border:#3a2020;--ruby-border-light:#2a1818;--bg-color:var(--ruby-background);--text-color:var(--ruby-text);--sidebar-bg:#1a0a0a;--sidebar-text:var(--ruby-text-light);--sidebar-link-active-bg:#2a1515;--sidebar-link-active-text:var(--ruby-primary);--link-color:var(--ruby-primary);--border-color:var(--ruby-border);--code-bg:var(--ruby-primary-light);--code-text:var(--ruby-text);--header-bg:var(--ruby-background);--header-border:var(--ruby-border);--shadow-sm:0 2px 4px rgba(0, 0, 0, 0.3);--shadow-md:0 4px 8px rgba(0, 0, 0, 0.4);--shadow-lg:0 8px 16px rgba(0, 0, 0, 0.5);--image-border-color:var(--ruby-border);--image-shadow:0 4px 8px rgba(0, 0, 0, 0.5);--image-caption-bg:var(--ruby-background-alt);--image-caption-text:var(--ruby-text-light);--image-hover-transform:translateY(-3px);--image-hover-shadow:0 6px 12px rgba(0, 0, 0, 0.7);--image-border-radius:6px;--image-transition:all 0.3s ease}body{font-family:var(--ruby-font-family-sans);line-height:1.7;letter-spacing:.01em}.callout-title,.card .card-title,.steps h4,figure.polaroid figcaption,h1,h2,h3,h4,h5,h6{font-family:var(--ruby-font-family-serif)}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.3;margin-top:2em;margin-bottom:.7em;color:var(--ruby-text);letter-spacing:-.01em}h1{font-size:2.5rem;font-weight:700;margin-top:0}h1::after{content:"";bottom:0;width:60px;height:3px;border-radius:3px}h2{font-size:1.9rem;border-bottom:1px solid var(--ruby-border-light)}h3{font-size:1.6rem}h4{font-size:1.3rem}a{color:var(--link-color);text-decoration:none;transition:color .2s}.content-area a:not(.button):not(.no-underline)::after{content:"";width:100%;height:1px;bottom:0;transform:scaleX(0);transform-origin:right bottom;transition:transform .3s}.content-area a:not(.button):not(.no-underline):hover::after{transform:scaleX(1);transform-origin:left bottom}p{margin:.7em 0;padding:.3em 0;line-height:1.8}.sidebar{border-right:1px solid var(--ruby-border)}.sidebar-header{margin-bottom:1.5rem;padding-bottom:1rem}.sidebar nav li a{border-radius:4px;margin-bottom:3px;transition:.3s;padding:.6rem .8rem;font-weight:400}.sidebar nav li a:hover{background-color:var(--sidebar-link-active-bg);transform:translateX(3px)}.sidebar nav li a.active{background-color:var(--sidebar-link-active-bg);color:var(--sidebar-link-active-text);font-weight:600}.content-area{padding:2.5rem 5%}pre{background-color:var(--code-bg);border-radius:6px;padding:1.25em}code{font-family:var(--ruby-font-family-mono);font-size:.9em;border-radius:4px;padding:.2em .4em}.docmd-container,table{border-radius:6px;overflow:hidden}table{width:100%;border-collapse:separate;border-spacing:0px}th{background-color:var(--ruby-primary-light);text-align:left;font-weight:600}td{border-top:1px solid var(--ruby-border-light)}tr:hover{background-color:var(--ruby-background-alt)}.docmd-container{padding:1.2rem 1.5rem;margin:1.75rem 0;border:1px solid var(--ruby-border-light);background-color:var(--ruby-background)}.docmd-container::before{content:"";top:0;width:100%;height:3px}.docmd-container.steps::before{height:initial!important}.callout{border-width:medium medium medium 4px;border-style:none none none solid;border-color:currentcolor;border-image:none;background-color:var(--ruby-background-alt)}.callout-title{font-weight:600;margin-bottom:.75em;display:flex;align-items:center;font-size:1.1em}.callout-title::before{margin-right:.5rem;font-size:1.1em}.callout-info{border-left-color:var(--ruby-primary)}.callout-warning{border-left-color:#f39c12}.callout-warning .callout-title{color:#f39c12}.callout-success,.callout-tip{border-left-color:#2ecc71}.callout-success .callout-title,.callout-tip .callout-title{color:#2ecc71}.callout-danger{border-left-color:#e74c3c}.callout-danger .callout-title{color:#e74c3c}.card{border:none;border-radius:6px;background:linear-gradient(135deg,var(--ruby-background) 0,var(--ruby-background-alt) 100%);box-shadow:var(--shadow-md);transition:.3s;overflow:hidden}.button,.steps h4::before,button{background:linear-gradient(135deg,var(--ruby-primary) 0,var(--ruby-accent) 100%);font-weight:600;box-shadow:var(--shadow-sm)}.card:hover{transform:translateY(-5px);box-shadow:var(--shadow-lg)}.card .card-title{font-weight:600;margin:0;background:linear-gradient(90deg,var(--ruby-primary-light),var(--ruby-accent-light));color:var(--ruby-primary-dark);border-bottom:1px solid var(--ruby-border)}.steps{counter-reset:step-counter 0;padding-left:1rem}.steps h4{padding-left:2.5rem;margin-top:2rem;margin-bottom:1rem}.steps h4::before{content:counter(step-counter);counter-increment:step-counter 1;position:absolute;left:0;top:50%;transform:translateY(-50%);width:1.8rem;height:1.8rem;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.9rem}.button,button{color:#fff;border:none;padding:.6rem 1.2rem;border-radius:4px;cursor:pointer;transition:.3s}.image-gallery figcaption,figcaption{background-color:var(--image-caption-bg);color:var(--image-caption-text)}figure,img{transition:var(--image-transition)}.docmd-button:hover{color:#fff}.button:hover,button:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}figure:hover,img.with-shadow:hover{transform:var(--image-hover-transform)}.theme-toggle-button{background:0 0;color:var(--ruby-text-light);box-shadow:none}.theme-toggle-button:hover{background:var(--ruby-background-alt);color:var(--ruby-primary);box-shadow:var(--shadow-sm);transform:translateY(0)}img{height:auto;border-radius:var(--image-border-radius)}img.with-border{border:1px solid var(--image-border-color);padding:4px}.image-gallery figure,figure img{border-radius:var(--image-border-radius)}img.with-shadow{box-shadow:var(--image-shadow)}img.with-shadow:hover{box-shadow:var(--image-hover-shadow)}figure{margin:1.5em 0;text-align:center}figcaption{padding:.5em;font-size:.9em;border-radius:0 0 var(--image-border-radius) var(--image-border-radius);font-style:italic}.image-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:1rem;margin:1.5em 0}.image-gallery figure{margin:0;height:100%;display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-sm)}.image-gallery figure:hover{box-shadow:var(--shadow-md)}.image-gallery img{width:100%;height:100%;object-fit:cover;border-radius:var(--image-border-radius) var(--image-border-radius) 0 0}.image-gallery figcaption{padding:.5rem;font-size:.85rem;border-radius:0}.image-gallery.zoom figure:hover img{transform:scale(1.05)}img.lightbox{cursor:zoom-in}img.framed{border:8px solid #fff;box-shadow:0 0 0 1px var(--ruby-border),var(--shadow-md);border-radius:3px}figure.polaroid{background:#fff;padding:10px 10px 20px;box-shadow:var(--shadow-md);border-radius:3px}figure.polaroid img{border-radius:2px}figure.polaroid figcaption{background:#fff;color:var(--ruby-text);font-style:italic}@media (max-width:768px){.content-area{padding:1.5rem 1rem}h1{font-size:2rem}h2{font-size:1.6rem}h3{font-size:1.3rem}.image-gallery{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.image-gallery img{height:120px}}.page-header{border-bottom:1px solid var(--ruby-border)}
\ No newline at end of file
diff --git a/site/assets/css/docmd-theme-sky.css b/site/assets/css/docmd-theme-sky.css
new file mode 100644
index 0000000..38e2960
--- /dev/null
+++ b/site/assets/css/docmd-theme-sky.css
@@ -0,0 +1,9 @@
+/* Source file from the docmd project — https://github.com/mgks/docmd */
+
+/*
+ * docmd Sky Theme
+ * Inspired by the clear blue sky
+ * Features: Blue tones, clean lines, subtle gradients
+ */
+
+.sidebar nav li a.active,.sidebar nav li a:hover{background-color:var(--sidebar-link-active-bg);color:var(--sidebar-link-active-text)}pre,table{margin:1.5em 0;border-radius:8px;box-shadow:var(--shadow-sm)}td,th{padding:.75rem 1rem}th,tr:hover{background-color:var(--sky-background-alt)}.callout,.steps{position:relative}.card,figure,table{overflow:hidden}.docmd-container,.sidebar,figure,pre,table{box-shadow:var(--shadow-sm)}.card .card-content>:last-child,figure img{margin-bottom:0}:root[data-theme=light]{--font-family-sans:'Inter',system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;--font-family-mono:'JetBrains Mono','SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;--sky-primary:#0097ff;--sky-primary-light:#e5f4ff;--sky-primary-dark:#0078cc;--sky-text:#1a1f36;--sky-text-light:#4a5568;--sky-text-lightest:#718096;--sky-background:#ffffff;--sky-background-alt:#f9fafb;--sky-border:#e2e8f0;--sky-border-light:#edf2f7;--bg-color:var(--sky-background);--text-color:var(--sky-text);--sidebar-bg:#f7fafc;--sidebar-text:var(--sky-text-light);--sidebar-link-active-bg:#e5f4ff;--sidebar-link-active-text:var(--sky-primary);--link-color:var(--sky-primary);--border-color:var(--sky-border);--code-bg:var(--sky-primary-light);--code-text:var(--sky-primary-dark);--header-bg:var(--sky-background);--header-border:var(--sky-border);--shadow-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--shadow-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--shadow-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--image-border-color:var(--sky-border);--image-shadow:var(--shadow-md);--image-caption-bg:var(--sky-background-alt);--image-caption-text:var(--sky-text-light);--image-hover-transform:translateY(-2px);--image-hover-shadow:var(--shadow-lg);--image-border-radius:8px;--image-transition:all 0.3s ease}:root[data-theme=dark]{--sky-primary:#3b82f6;--sky-primary-light:#1e293b;--sky-primary-dark:#60a5fa;--sky-text:#f1f5f9;--sky-text-light:#cbd5e1;--sky-text-lightest:#94a3b8;--sky-background:#0f172a;--sky-background-alt:#1e293b;--sky-border:#334155;--sky-border-light:#1e293b;--bg-color:var(--sky-background);--text-color:var(--sky-text);--sidebar-bg:#0f172a;--sidebar-text:var(--sky-text-light);--sidebar-link-active-bg:#1e293b;--sidebar-link-active-text:var(--sky-primary);--link-color:var(--sky-primary);--border-color:var(--sky-border);--code-bg:var(--sky-primary-light);--code-text:var(--sky-text);--header-bg:var(--sky-background);--header-border:var(--sky-border);--shadow-sm:0 1px 2px 0 rgba(0, 0, 0, 0.3);--shadow-md:0 4px 6px -1px rgba(0, 0, 0, 0.3),0 2px 4px -1px rgba(0, 0, 0, 0.2);--shadow-lg:0 10px 15px -3px rgba(0, 0, 0, 0.3),0 4px 6px -2px rgba(0, 0, 0, 0.2);--image-border-color:var(--sky-border);--image-shadow:0 4px 8px rgba(0, 0, 0, 0.5);--image-caption-bg:var(--sky-background-alt);--image-caption-text:var(--sky-text-light);--image-hover-transform:translateY(-2px);--image-hover-shadow:0 6px 12px rgba(0, 0, 0, 0.7);--image-border-radius:8px;--image-transition:all 0.3s ease}body{font-feature-settings:"salt","ss01","ss02";letter-spacing:-.01em}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.3;margin-top:2em;margin-bottom:.5em;color:var(--sky-text)}.card .card-content>:first-child,h1{margin-top:0}h1{font-size:2.25rem;font-weight:700}h2{font-size:1.75rem;border-bottom:1px solid var(--sky-border-light);padding-bottom:.5rem}h3{font-size:1.5rem}h4{font-size:1.25rem}a{color:var(--link-color);text-decoration:none;transition:color .2s}a:hover{text-decoration:underline}p{margin:.5em 0;padding:.5em 0;line-height:1.7}.sidebar nav li a{border-radius:6px;margin-bottom:2px;transition:.2s}.sidebar nav li a.active{font-weight:500}.content-area{padding:2.5rem 5%}pre{background-color:var(--code-bg);padding:1.25em}code{font-size:.9em;border-radius:4px;padding:.2em .4em}table{width:100%;border-collapse:separate;border-spacing:0}th{text-align:left;font-weight:600}td{border-top:1px solid var(--sky-border-light)}.docmd-container{padding:.5rem 1.5rem;margin:1.75rem 0;border-radius:10px;border:1px solid var(--sky-border-light);background-color:var(--sky-background)}.callout,.card{background-color:var(--card-bg)}.callout{border:none;border-left:5px solid}.callout-title{font-weight:600;margin-bottom:.75em;display:flex;align-items:center}.callout-title::before{margin-right:.5rem;font-size:1.1em}.callout-info{border-left-color:var(--sky-primary)}.callout-info .callout-title::before{content:"ℹ️"}.callout-warning{border-left-color:#f59e0b}.callout-warning .callout-title::before{content:"⚠️"}.callout-success,.callout-tip{border-left-color:#10b981}.callout-tip .callout-title::before{content:"💡"}.callout-danger{border-left-color:#ef4444}.callout-danger .callout-title::before{content:"🚨"}.callout-success .callout-title::before{content:"✅"}.card{border:1px solid var(--sky-border);box-shadow:var(--text-color);transition:transform .2s,box-shadow .2s;display:flex;flex-direction:column}.card:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}.card .card-title{padding:.5rem 1.5rem 1rem;border-bottom:1px solid var(--sky-border);font-weight:600;margin-top:0}.card .card-content{flex:1;padding:.25rem}.steps{counter-reset:step-counter;border:none;background-color:transparent;box-shadow:none;padding:0;margin-left:1rem}.steps::before{content:'';position:absolute;top:0;bottom:0!important;left:1.5rem!important;width:3px!important;background-color:var(--sky-border);transform:translateX(-50%);z-index:0}.steps .step{position:relative;padding:.5rem 2.5em;border-radius:10px;margin-bottom:1em;display:block;background-color:var(--card-bg)}.steps .step:last-child{padding-bottom:0}.steps h4,.steps ol li strong:first-child,.steps ol li:first-child{position:relative;counter-increment:step-counter;margin-bottom:1rem;font-weight:600;font-size:1.1rem;display:block}.steps h4::before,.steps ol li::before{content:counter(list-counter)!important;position:absolute;left:-2.55rem;top:.5rem;width:2rem;height:2rem;background-color:var(--sky-primary);color:#fff!important;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:1rem!important;font-weight:500!important;z-index:1}.steps .step h4,.steps .step ol,.steps .step>div,.steps .step>p,.steps .step>pre,.steps ol,.steps ol li{display:block}.step-content,.step-content>div,.step-content>p,.step-content>pre{display:block;margin-top:.5rem;margin-bottom:1rem}.steps ol+*,.steps pre{margin-top:1rem}.steps ol{list-style:none;padding-left:0;margin-left:0}.steps ol li{position:relative;margin-bottom:1rem}.steps .step h4{font-weight:600;margin-bottom:1rem}.steps .step ol{counter-reset:none;list-style:decimal;padding-left:1.5rem;margin-top:.5rem}.steps .step ol li{padding-left:0;margin-bottom:.5rem;display:list-item}.steps .step ol li::before{display:none}.steps pre{margin-bottom:1rem}.button,button{padding:.5rem 1rem;background-color:var(--sky-primary);color:#fff;border:none;border-radius:6px;font-weight:500;cursor:pointer;transition:background-color .2s}.image-gallery figure,figure,img{transition:var(--image-transition)}.button:hover,button:hover{background-color:var(--sky-primary-dark)}.theme-toggle-button{background-color:var(--sky-background-alt);border-color:var(--sky-border-light);border-radius:6px;transition:.2s}.theme-toggle-button:hover{background-color:var(--sky-primary-light)}img{border-radius:var(--image-border-radius)}img.with-border{border:1px solid var(--image-border-color);padding:8px;background-color:var(--bg-color)}img.with-shadow{box-shadow:var(--image-shadow)}img.with-shadow:hover{box-shadow:var(--image-hover-shadow)}figure{border-radius:var(--image-border-radius)}figure:hover{box-shadow:var(--shadow-md)}figure img{border-radius:var(--image-border-radius) var(--image-border-radius) 0 0}figcaption{background-color:var(--image-caption-bg);color:var(--image-caption-text);padding:.75rem 1rem;font-size:.9rem;font-weight:500}.image-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1.5rem;margin:2rem 0}.image-gallery figure{height:100%;display:flex;flex-direction:column;margin:0}.image-gallery figure:hover{transform:var(--image-hover-transform)}.image-gallery img{height:200px;width:100%;object-fit:cover;margin:0}.image-gallery figcaption{flex:1;display:flex;align-items:center;justify-content:center;text-align:center}.image-gallery.zoom img{transition:transform .5s}.image-gallery.zoom figure:hover img{transform:scale(1.05)}img.lightbox{cursor:zoom-in}img.framed{border:8px solid #fff;box-shadow:0 0 0 1px var(--image-border-color),var(--image-shadow);box-sizing:border-box}figure.polaroid{background:#fff;padding:10px 10px 30px;box-shadow:var(--shadow-md)}figure.polaroid img{border-radius:0;box-shadow:none}figure.polaroid figcaption{background:#fff;color:var(--sky-text);font-family:Caveat,cursive,var(--font-family-sans);font-size:1.1rem}@media (max-width:768px){.content-area{padding:1.5rem 1rem}h1{font-size:1.75rem}h2{font-size:1.5rem}h3{font-size:1.25rem}.image-gallery{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.image-gallery img{height:150px}}
\ No newline at end of file
diff --git a/site/assets/favicon.ico b/site/assets/favicon.ico
new file mode 100644
index 0000000..6ca3522
Binary files /dev/null and b/site/assets/favicon.ico differ
diff --git a/site/assets/images/docmd-logo-dark.png b/site/assets/images/docmd-logo-dark.png
new file mode 100644
index 0000000..f678de6
Binary files /dev/null and b/site/assets/images/docmd-logo-dark.png differ
diff --git a/site/assets/images/docmd-logo-light.png b/site/assets/images/docmd-logo-light.png
new file mode 100644
index 0000000..bed4c5c
Binary files /dev/null and b/site/assets/images/docmd-logo-light.png differ
diff --git a/site/assets/images/docmd-logo.png b/site/assets/images/docmd-logo.png
new file mode 100644
index 0000000..a719137
Binary files /dev/null and b/site/assets/images/docmd-logo.png differ
diff --git a/site/assets/images/docmd-preview.png b/site/assets/images/docmd-preview.png
new file mode 100644
index 0000000..be1ca8b
Binary files /dev/null and b/site/assets/images/docmd-preview.png differ
diff --git a/site/assets/js/docmd-image-lightbox.js b/site/assets/js/docmd-image-lightbox.js
new file mode 100644
index 0000000..18b9d57
--- /dev/null
+++ b/site/assets/js/docmd-image-lightbox.js
@@ -0,0 +1,74 @@
+// Source file from the docmd project — https://github.com/mgks/docmd
+
+/*
+ * A simple lightbox implementation for docmd images
+ */
+
+document.addEventListener('DOMContentLoaded', function() {
+ // Create lightbox elements
+ const lightbox = document.createElement('div');
+ lightbox.className = 'docmd-lightbox';
+ lightbox.innerHTML = `
+
+
+
+
+ ×
+ `;
+ document.body.appendChild(lightbox);
+
+ const lightboxImg = lightbox.querySelector('img');
+ const lightboxCaption = lightbox.querySelector('.docmd-lightbox-caption');
+ const lightboxClose = lightbox.querySelector('.docmd-lightbox-close');
+
+ // Find all images with lightbox class or in image galleries
+ const lightboxImages = document.querySelectorAll('img.lightbox, .image-gallery img');
+
+ // Add click event to each image
+ lightboxImages.forEach(function(img) {
+ img.style.cursor = 'zoom-in';
+
+ img.addEventListener('click', function() {
+ // Get the image source and caption
+ const src = this.getAttribute('src');
+ let caption = this.getAttribute('alt') || '';
+
+ // If image is inside a figure with figcaption, use that caption
+ const figure = this.closest('figure');
+ if (figure) {
+ const figcaption = figure.querySelector('figcaption');
+ if (figcaption) {
+ caption = figcaption.textContent;
+ }
+ }
+
+ // Set the lightbox content
+ lightboxImg.setAttribute('src', src);
+ lightboxCaption.textContent = caption;
+
+ // Show the lightbox
+ lightbox.style.display = 'flex';
+ document.body.style.overflow = 'hidden'; // Prevent scrolling
+ });
+ });
+
+ // Close lightbox when clicking the close button or outside the image
+ lightboxClose.addEventListener('click', closeLightbox);
+ lightbox.addEventListener('click', function(e) {
+ if (e.target === lightbox) {
+ closeLightbox();
+ }
+ });
+
+ // Close lightbox when pressing Escape key
+ document.addEventListener('keydown', function(e) {
+ if (e.key === 'Escape' && lightbox.style.display === 'flex') {
+ closeLightbox();
+ }
+ });
+
+ function closeLightbox() {
+ lightbox.style.display = 'none';
+ document.body.style.overflow = ''; // Restore scrolling
+ }
+});
\ No newline at end of file
diff --git a/site/assets/js/docmd-main.js b/site/assets/js/docmd-main.js
new file mode 100644
index 0000000..b0f7435
--- /dev/null
+++ b/site/assets/js/docmd-main.js
@@ -0,0 +1,232 @@
+// Source file from the docmd project — https://github.com/mgks/docmd
+
+/*
+ * Main client-side script for docmd UI interactions
+ */
+// --- Collapsible Navigation Logic ---
+function initializeCollapsibleNav() {
+ const nav = document.querySelector('.sidebar-nav');
+ if (!nav) return;
+
+ let navStates = {};
+ try {
+ // Use sessionStorage to remember state only for the current session
+ navStates = JSON.parse(sessionStorage.getItem('docmd-nav-states')) || {};
+ } catch (e) { /* silent fail */ }
+
+ nav.querySelectorAll('li.collapsible').forEach(item => {
+ const navId = item.dataset.navId;
+ const anchor = item.querySelector('a');
+ const submenu = item.querySelector('.submenu');
+
+ if (!navId || !anchor || !submenu) return;
+
+ const isParentActive = item.classList.contains('active-parent');
+ // Default to expanded if it's a parent of the active page, otherwise check stored state.
+ let isExpanded = isParentActive || (navStates[navId] === true);
+
+ const toggleSubmenu = (expand) => {
+ item.setAttribute('aria-expanded', expand);
+ submenu.style.display = expand ? 'block' : 'none';
+ navStates[navId] = expand;
+ sessionStorage.setItem('docmd-nav-states', JSON.stringify(navStates));
+ };
+
+ // Set initial state on page load
+ toggleSubmenu(isExpanded);
+
+ anchor.addEventListener('click', (e) => {
+ // If the click target is the icon, ALWAYS prevent navigation and toggle.
+ if (e.target.closest('.collapse-icon')) {
+ e.preventDefault();
+ toggleSubmenu(item.getAttribute('aria-expanded') !== 'true');
+ }
+ // If the link is just a placeholder, also prevent navigation and toggle.
+ else if (anchor.getAttribute('href') === '#') {
+ e.preventDefault();
+ toggleSubmenu(item.getAttribute('aria-expanded') !== 'true');
+ }
+ // Otherwise, let the click proceed to navigate to the link.
+ });
+ });
+}
+
+// --- Sidebar Scroll Preservation ---
+function initializeSidebarScroll() {
+ const sidebar = document.querySelector('.sidebar');
+ if (!sidebar) return;
+
+ setTimeout(() => {
+ const activeElement = sidebar.querySelector('a.active') || sidebar.querySelector('.active-parent > a');
+
+ if (activeElement) {
+ const sidebarRect = sidebar.getBoundingClientRect();
+ const elementRect = activeElement.getBoundingClientRect();
+
+ // Check if the element's top or bottom is outside the sidebar's visible area
+ const isNotInView = elementRect.top < sidebarRect.top || elementRect.bottom > sidebarRect.bottom;
+
+ if (isNotInView) {
+ activeElement.scrollIntoView({
+ behavior: 'auto',
+ block: 'center',
+ inline: 'nearest'
+ });
+ }
+ }
+ }, 10);
+}
+
+// --- Theme Toggle Logic ---
+function setupThemeToggleListener() {
+ const themeToggleButton = document.getElementById('theme-toggle-button');
+
+ function applyTheme(theme) {
+ document.documentElement.setAttribute('data-theme', theme);
+ document.body.setAttribute('data-theme', theme);
+ localStorage.setItem('docmd-theme', theme);
+
+ // Switch highlight.js theme
+ const highlightThemeLink = document.getElementById('highlight-theme');
+ if (highlightThemeLink) {
+ const newHref = highlightThemeLink.getAttribute('data-base-href') + `docmd-highlight-${theme}.css`;
+ highlightThemeLink.setAttribute('href', newHref);
+ }
+ }
+
+ // Add click listener to the toggle button
+ if (themeToggleButton) {
+ themeToggleButton.addEventListener('click', () => {
+ const currentTheme = document.documentElement.getAttribute('data-theme');
+ const newTheme = currentTheme === 'light' ? 'dark' : 'light';
+ applyTheme(newTheme);
+ });
+ }
+}
+
+// --- Sidebar Collapse Logic ---
+function initializeSidebarToggle() {
+ const toggleButton = document.getElementById('sidebar-toggle-button');
+ const body = document.body;
+
+ if (!body.classList.contains('sidebar-collapsible') || !toggleButton) {
+ return;
+ }
+
+ const defaultConfigCollapsed = body.dataset.defaultCollapsed === 'true';
+ let isCollapsed = localStorage.getItem('docmd-sidebar-collapsed');
+
+ if (isCollapsed === null) {
+ isCollapsed = defaultConfigCollapsed;
+ } else {
+ isCollapsed = isCollapsed === 'true';
+ }
+
+ if (isCollapsed) {
+ body.classList.add('sidebar-collapsed');
+ }
+
+ toggleButton.addEventListener('click', () => {
+ body.classList.toggle('sidebar-collapsed');
+ const currentlyCollapsed = body.classList.contains('sidebar-collapsed');
+ localStorage.setItem('docmd-sidebar-collapsed', currentlyCollapsed);
+ });
+}
+
+// --- Tabs Container Logic ---
+function initializeTabs() {
+ document.querySelectorAll('.docmd-tabs').forEach(tabsContainer => {
+ const navItems = tabsContainer.querySelectorAll('.docmd-tabs-nav-item');
+ const tabPanes = tabsContainer.querySelectorAll('.docmd-tab-pane');
+
+ navItems.forEach((navItem, index) => {
+ navItem.addEventListener('click', () => {
+ navItems.forEach(item => item.classList.remove('active'));
+ tabPanes.forEach(pane => pane.classList.remove('active'));
+
+ navItem.classList.add('active');
+ if(tabPanes[index]) {
+ tabPanes[index].classList.add('active');
+ }
+ });
+ });
+ });
+}
+
+// --- Copy Code Button Logic ---
+function initializeCopyCodeButtons() {
+ if (document.body.dataset.copyCodeEnabled !== 'true') {
+ return;
+ }
+
+ const copyIconSvg = ` `;
+ const checkIconSvg = ` `;
+
+ document.querySelectorAll('pre').forEach(preElement => {
+ const codeElement = preElement.querySelector('code');
+ if (!codeElement) return;
+
+ // Create a wrapper div around the pre element
+ const wrapper = document.createElement('div');
+ wrapper.style.position = 'relative';
+ wrapper.style.display = 'block';
+
+ // Insert the wrapper before the pre element
+ preElement.parentNode.insertBefore(wrapper, preElement);
+
+ // Move the pre element into the wrapper
+ wrapper.appendChild(preElement);
+
+ // Remove the relative positioning from pre since wrapper handles it
+ preElement.style.position = 'static';
+
+ const copyButton = document.createElement('button');
+ copyButton.className = 'copy-code-button';
+ copyButton.innerHTML = copyIconSvg;
+ copyButton.setAttribute('aria-label', 'Copy code to clipboard');
+ wrapper.appendChild(copyButton);
+
+ copyButton.addEventListener('click', () => {
+ navigator.clipboard.writeText(codeElement.innerText).then(() => {
+ copyButton.innerHTML = checkIconSvg;
+ copyButton.classList.add('copied');
+ setTimeout(() => {
+ copyButton.innerHTML = copyIconSvg;
+ copyButton.classList.remove('copied');
+ }, 2000);
+ }).catch(err => {
+ console.error('Failed to copy text: ', err);
+ copyButton.innerText = 'Error';
+ });
+ });
+ });
+}
+
+// --- Theme Sync Function ---
+function syncBodyTheme() {
+ const currentTheme = document.documentElement.getAttribute('data-theme');
+ if (currentTheme && document.body) {
+ document.body.setAttribute('data-theme', currentTheme);
+ }
+
+ // Also ensure highlight CSS matches the current theme
+ const highlightThemeLink = document.getElementById('highlight-theme');
+ if (highlightThemeLink && currentTheme) {
+ const baseHref = highlightThemeLink.getAttribute('data-base-href');
+ if (baseHref) {
+ const newHref = baseHref + `docmd-highlight-${currentTheme}.css`;
+ highlightThemeLink.setAttribute('href', newHref);
+ }
+ }
+}
+
+// --- Main Execution ---
+document.addEventListener('DOMContentLoaded', () => {
+ syncBodyTheme(); // Sync body theme with html theme
+ setupThemeToggleListener();
+ initializeSidebarToggle();
+ initializeTabs();
+ initializeCopyCodeButtons();
+ initializeCollapsibleNav();
+ initializeSidebarScroll();
+});
\ No newline at end of file
diff --git a/site/index.html b/site/index.html
new file mode 100644
index 0000000..1f47297
--- /dev/null
+++ b/site/index.html
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Welcome : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Hello, docmd!
+
Start writing your Markdown content here.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/intro/index.html b/site/intro/index.html
new file mode 100644
index 0000000..747a717
--- /dev/null
+++ b/site/intro/index.html
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Benvenuto : docmd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
import useBaseUrl from ‘@docusaurus/useBaseUrl’;
+import styles from ‘./intro.module.css’;
+
+
🤖 Benvenuto nel Portale Automazione DFFM.it
+
+ Scopri la documentazione tecnica per tre delle principali piattaforme di automazione:
+ Omron , Rockwell e Schneider Electric .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 9d031b9..b47d22f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,163 +2,190 @@
# yarn lockfile v1
-"@algolia/abtesting@1.1.0":
- version "1.1.0"
- resolved "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz"
- integrity sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==
+"@ai-sdk/gateway@1.0.30":
+ version "1.0.30"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/gateway/-/gateway-1.0.30.tgz#2315a3d61c75ab192221b6ab3a5f7dbb95da8ee0"
+ integrity sha512-QdrSUryr/CLcsCISokLHOImcHj1adGXk1yy4B3qipqLhcNc33Kj/O/3crI790Qp85oDx7sc4vm7R4raf9RA/kg==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@ai-sdk/provider" "2.0.0"
+ "@ai-sdk/provider-utils" "3.0.10"
-"@algolia/autocomplete-core@1.17.9":
- version "1.17.9"
- resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz"
- integrity sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==
+"@ai-sdk/provider-utils@3.0.10":
+ version "3.0.10"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/provider-utils/-/provider-utils-3.0.10.tgz#f76010c78445bb25cfc102bcd7e162103e6e7d96"
+ integrity sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ==
dependencies:
- "@algolia/autocomplete-plugin-algolia-insights" "1.17.9"
- "@algolia/autocomplete-shared" "1.17.9"
+ "@ai-sdk/provider" "2.0.0"
+ "@standard-schema/spec" "^1.0.0"
+ eventsource-parser "^3.0.5"
-"@algolia/autocomplete-plugin-algolia-insights@1.17.9":
- version "1.17.9"
- resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz"
- integrity sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==
+"@ai-sdk/provider@2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/provider/-/provider-2.0.0.tgz#b853c739d523b33675bc74b6c506b2c690bc602b"
+ integrity sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==
dependencies:
- "@algolia/autocomplete-shared" "1.17.9"
+ json-schema "^0.4.0"
-"@algolia/autocomplete-preset-algolia@1.17.9":
- version "1.17.9"
- resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz"
- integrity sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==
+"@ai-sdk/react@^2.0.30":
+ version "2.0.54"
+ resolved "https://registry.yarnpkg.com/@ai-sdk/react/-/react-2.0.54.tgz#33187c9ba9eaeaa4260d47f3c5ae68bba5b75c6e"
+ integrity sha512-wbszephe+WR7y8DXwYN/SMr56pwU1N505/h3fOTz4NPHCW0sex6LzZ7DuhFR0J6ij3n3sLA11aEliFEa6B2FiA==
dependencies:
- "@algolia/autocomplete-shared" "1.17.9"
+ "@ai-sdk/provider-utils" "3.0.10"
+ ai "5.0.54"
+ swr "^2.2.5"
+ throttleit "2.1.0"
-"@algolia/autocomplete-shared@1.17.9":
- version "1.17.9"
- resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz"
- integrity sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==
-
-"@algolia/client-abtesting@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz"
- integrity sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==
+"@algolia/abtesting@1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.4.0.tgz#d607790222f4ce9d183cc535fccc3bf7849318db"
+ integrity sha512-N0blWT/C0KOZ/OJ9GXBX66odJZlrYjMj3M+01y8ob1mjBFnBaBo7gOCyHBDQy60+H4pJXp3pSGlJOqJIueBH+A==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
-"@algolia/client-analytics@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz"
- integrity sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==
+"@algolia/autocomplete-core@1.19.2":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz#702df67a08cb3cfe8c33ee1111ef136ec1a9e232"
+ integrity sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/autocomplete-plugin-algolia-insights" "1.19.2"
+ "@algolia/autocomplete-shared" "1.19.2"
-"@algolia/client-common@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz"
- integrity sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==
-
-"@algolia/client-insights@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz"
- integrity sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==
+"@algolia/autocomplete-plugin-algolia-insights@1.19.2":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz#3584b625b9317e333d1ae43664d02358e175c52d"
+ integrity sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/autocomplete-shared" "1.19.2"
-"@algolia/client-personalization@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz"
- integrity sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==
- dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+"@algolia/autocomplete-shared@1.19.2":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz#c0b7b8dc30a5c65b70501640e62b009535e4578f"
+ integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==
-"@algolia/client-query-suggestions@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz"
- integrity sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==
+"@algolia/client-abtesting@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.38.0.tgz#3362d7aa3c6732f800665d3e24e98eb9046779d1"
+ integrity sha512-15d6zv8vtj2l9pnnp/EH7Rhq3/snCCHRz56NnX6xIUPrbJl5gCsIYXAz8C2IEkwOpoDb0r5G6ArY2gKdVMNezw==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
-"@algolia/client-search@>= 4.9.1 < 6", "@algolia/client-search@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz"
- integrity sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==
+"@algolia/client-analytics@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.38.0.tgz#711a199f207a692e9e3d7ed28df99729743e8f1b"
+ integrity sha512-jJIbYAhYvTG3+gEAP5Q5Dp6PFJfUR+atz5rsqm5KjAKK+faLFdHJbM2IbOo0xdyGd+SH259MzfQKLJ9mZZ27dQ==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
+
+"@algolia/client-common@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.38.0.tgz#f17f03822d377f6980aa5ff389c607bcb57fee42"
+ integrity sha512-aMCXzVPGJTeQnVU3Sdf30TfMN2+QyWcjfPTCCHyqVVgjPipb6RnK40aISGoO+rlYjh9LunDsNVFLwv+JEIF8bQ==
+
+"@algolia/client-insights@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.38.0.tgz#22a7f9be1990492693cb5f30a6e221a84acdbd6f"
+ integrity sha512-4c3FbpMiJX+VcaAj0rYaQdTLS/CkrdOn4hW+5y1plPov7KC7iSHai/VBbirmHuAfW1hVPCIh1w/4erKKTKuo+Q==
+ dependencies:
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
+
+"@algolia/client-personalization@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.38.0.tgz#9e73041c2499ca2c296b09e5c26753ae7a1247d7"
+ integrity sha512-FzLs6c8TBL4FSgNfnH2NL7O33ktecGiaKO4ZFG51QYORUzD5d6YwB9UBteaIYu/sgFoEdY57diYU4vyBH8R6iA==
+ dependencies:
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
+
+"@algolia/client-query-suggestions@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.38.0.tgz#8a212c86416763dfeb21316ac2a23c6a29851c8f"
+ integrity sha512-7apiahlgZLvOqrh0+hAYAp/UWjqz6AfSJrCwnsoQNzgIT09dLSPIKREelkuQeUrKy38vHWWpSQE3M0zWSp/YrA==
+ dependencies:
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
+
+"@algolia/client-search@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.38.0.tgz#ec10e2105d7c0fa8c4ee7b1e4b9b7fb5117bf165"
+ integrity sha512-PTAFMJOpVtJweExEYYgdmSCC6n4V/R+ctDL3fRQy77ulZM/p+zMLIQC9c7HCQE1zqpauvVck3f2zYSejaUTtrw==
+ dependencies:
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
"@algolia/events@^4.0.1":
version "4.0.1"
resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz"
integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==
-"@algolia/ingestion@1.35.0":
- version "1.35.0"
- resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz"
- integrity sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==
+"@algolia/ingestion@1.38.0":
+ version "1.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.38.0.tgz#bb34e09d8852d3257f8f83be7303136ea23ae66a"
+ integrity sha512-qGSUGgceJHGyJLZ06bFLwVe2Tpf9KwabmoBjFvFscVmMmU5scKya6voCYd9bdX7V0Xy1qya9MGbmTm4zlLuveQ==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
-"@algolia/monitoring@1.35.0":
- version "1.35.0"
- resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz"
- integrity sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==
+"@algolia/monitoring@1.38.0":
+ version "1.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.38.0.tgz#5e89d1a9e62a97c213efeb28d0aa89c3870fe700"
+ integrity sha512-VnCtAUcHirvv/dDHg9jK1Z5oo4QOC5FKDxe40x8qloru2qDcjueT34jiAsB0gRos3VWf9v4iPSYTqMIFOcADpQ==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
-"@algolia/recommend@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz"
- integrity sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==
+"@algolia/recommend@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.38.0.tgz#0db13cfde331091fd02dc086775ca0dd7313abf8"
+ integrity sha512-fqgeU9GqxQorFUeGP4et1MyY28ccf9PCeciHwDPSbPYYiTqBItHdUIiytsNpjC5Dnc0RWtuXWCltLwSw9wN/bQ==
dependencies:
- "@algolia/client-common" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/client-common" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
-"@algolia/requester-browser-xhr@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz"
- integrity sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==
+"@algolia/requester-browser-xhr@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.38.0.tgz#10ad28e7d282afa3b875185fa3dd08c43f8cbb74"
+ integrity sha512-nAUKbv4YQIXbpPi02AQvSPisD5FDDbT8XeYSh9HFoYP0Z3IpBLLDg7R4ahPvzd7gGsVKgEbXzRPWESXSji5yIg==
dependencies:
- "@algolia/client-common" "5.35.0"
+ "@algolia/client-common" "5.38.0"
-"@algolia/requester-fetch@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz"
- integrity sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==
+"@algolia/requester-fetch@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.38.0.tgz#7d6d189d918c4b39c715cd42798ae496825202ce"
+ integrity sha512-bkuAHaadC6OxJd3SVyQQnU1oJ9G/zdCqua7fwr1tJDrA/v7KzeS5np4/m6BuRUpTgVgFZHSewGnMcgj9DLBoaQ==
dependencies:
- "@algolia/client-common" "5.35.0"
+ "@algolia/client-common" "5.38.0"
-"@algolia/requester-node-http@5.35.0":
- version "5.35.0"
- resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz"
- integrity sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==
+"@algolia/requester-node-http@5.38.0":
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.38.0.tgz#29ebeb651fc5264c8b2b97c2a2998840520ca7f9"
+ integrity sha512-yHDKZTnMPR3/4bY0CVC1/uRnnbAaJ+pctRuX7G/HflBkKOrnUBDEGtQQHzEfMz2FHZ/tbCL+Q9r6mvwTSGp8nw==
dependencies:
- "@algolia/client-common" "5.35.0"
+ "@algolia/client-common" "5.38.0"
"@ampproject/remapping@^2.2.0":
version "2.3.0"
@@ -204,7 +231,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz"
integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==
-"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.21.3", "@babel/core@^7.24.4", "@babel/core@^7.25.9", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0":
+"@babel/core@^7.21.3", "@babel/core@^7.24.4", "@babel/core@^7.25.9":
version "7.28.3"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz"
integrity sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==
@@ -1471,20 +1498,23 @@
resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz"
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
-"@docsearch/css@3.9.0":
- version "3.9.0"
- resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz"
- integrity sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==
+"@docsearch/css@4.1.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-4.1.0.tgz#e156e011539d73624b2354dc8be8e96ac9be9ddc"
+ integrity sha512-nuNKGjHj/FQeWgE9t+i83QD/V67QiaAmGY7xS9TVCRUiCqSljOgIKlsLoQZKKVwEG8f+OWKdznzZkJxGZ7d06A==
-"@docsearch/react@^3.9.0":
- version "3.9.0"
- resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz"
- integrity sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==
+"@docsearch/react@^3.9.0 || ^4.1.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-4.1.0.tgz#a04f22324067f2e39dbe12f0e1247e7e0341d26d"
+ integrity sha512-4GHI7TT3sJZ2Vs4Kjadv7vAkMrTsJqHvzvxO3JA7UT8iPRKaDottG5o5uNshPWhVVaBYPC35Ukf8bfCotGpjSg==
dependencies:
- "@algolia/autocomplete-core" "1.17.9"
- "@algolia/autocomplete-preset-algolia" "1.17.9"
- "@docsearch/css" "3.9.0"
- algoliasearch "^5.14.2"
+ "@ai-sdk/react" "^2.0.30"
+ "@algolia/autocomplete-core" "1.19.2"
+ "@docsearch/css" "4.1.0"
+ ai "^5.0.30"
+ algoliasearch "^5.28.0"
+ marked "^16.3.0"
+ zod "^4.1.8"
"@docusaurus/babel@3.8.1":
version "3.8.1"
@@ -1507,6 +1537,27 @@
fs-extra "^11.1.1"
tslib "^2.6.0"
+"@docusaurus/babel@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.9.0.tgz#934e717bd14e0d992b0372aa5ddd76747100354e"
+ integrity sha512-QcZ+Rey0OvlLK9SPN4/+VWL+ut/tuADVdunA1fmC96fytdYjatdJrcw1koYdp/c+3k6lVYlwg9DDVNDecyLCAA==
+ dependencies:
+ "@babel/core" "^7.25.9"
+ "@babel/generator" "^7.25.9"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-transform-runtime" "^7.25.9"
+ "@babel/preset-env" "^7.25.9"
+ "@babel/preset-react" "^7.25.9"
+ "@babel/preset-typescript" "^7.25.9"
+ "@babel/runtime" "^7.25.9"
+ "@babel/runtime-corejs3" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ babel-plugin-dynamic-import-node "^2.3.3"
+ fs-extra "^11.1.1"
+ tslib "^2.6.0"
+
"@docusaurus/bundler@3.8.1":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.1.tgz"
@@ -1537,7 +1588,37 @@
webpack "^5.95.0"
webpackbar "^6.0.1"
-"@docusaurus/core@^3.8.1", "@docusaurus/core@3.8.1":
+"@docusaurus/bundler@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.9.0.tgz#0e8b8efab712e4d0da7b20c6befe8e2a3b475ea3"
+ integrity sha512-HaRLSmiwnJQ3uHBV3rd/BRDM9S/nHAshRk54djRZ+RX9ze4ONuFAovdD5es20ZDj7PRTjo38GVnBtHvuL/SwsQ==
+ dependencies:
+ "@babel/core" "^7.25.9"
+ "@docusaurus/babel" "3.9.0"
+ "@docusaurus/cssnano-preset" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ babel-loader "^9.2.1"
+ clean-css "^5.3.3"
+ copy-webpack-plugin "^11.0.0"
+ css-loader "^6.11.0"
+ css-minimizer-webpack-plugin "^5.0.1"
+ cssnano "^6.1.2"
+ file-loader "^6.2.0"
+ html-minifier-terser "^7.2.0"
+ mini-css-extract-plugin "^2.9.2"
+ null-loader "^4.0.1"
+ postcss "^8.5.4"
+ postcss-loader "^7.3.4"
+ postcss-preset-env "^10.2.1"
+ terser-webpack-plugin "^5.3.9"
+ tslib "^2.6.0"
+ url-loader "^4.1.1"
+ webpack "^5.95.0"
+ webpackbar "^6.0.1"
+
+"@docusaurus/core@3.8.1":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz"
integrity sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==
@@ -1585,6 +1666,54 @@
webpack-dev-server "^4.15.2"
webpack-merge "^6.0.1"
+"@docusaurus/core@3.9.0", "@docusaurus/core@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.9.0.tgz#630267efb7b2c1291adf3947ad8039e1f1770b56"
+ integrity sha512-sEJ4MW/zuh1MfPORCRbSwnW/PjsVmOigWwBU6clcxm221/CNdnI/XqgfBrl2jj/zocSdNoQM8E3IP2W8dygi6g==
+ dependencies:
+ "@docusaurus/babel" "3.9.0"
+ "@docusaurus/bundler" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/mdx-loader" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
+ boxen "^6.2.1"
+ chalk "^4.1.2"
+ chokidar "^3.5.3"
+ cli-table3 "^0.6.3"
+ combine-promises "^1.1.0"
+ commander "^5.1.0"
+ core-js "^3.31.1"
+ detect-port "^1.5.1"
+ escape-html "^1.0.3"
+ eta "^2.2.0"
+ eval "^0.1.8"
+ execa "5.1.1"
+ fs-extra "^11.1.1"
+ html-tags "^3.3.1"
+ html-webpack-plugin "^5.6.0"
+ leven "^3.1.0"
+ lodash "^4.17.21"
+ open "^8.4.0"
+ p-map "^4.0.0"
+ prompts "^2.4.2"
+ react-helmet-async "npm:@slorber/react-helmet-async@1.3.0"
+ react-loadable "npm:@docusaurus/react-loadable@6.0.0"
+ react-loadable-ssr-addon-v5-slorber "^1.0.1"
+ react-router "^5.3.4"
+ react-router-config "^5.1.1"
+ react-router-dom "^5.3.4"
+ semver "^7.5.4"
+ serve-handler "^6.1.6"
+ tinypool "^1.0.2"
+ tslib "^2.6.0"
+ update-notifier "^6.0.2"
+ webpack "^5.95.0"
+ webpack-bundle-analyzer "^4.10.2"
+ webpack-dev-server "^5.2.2"
+ webpack-merge "^6.0.1"
+
"@docusaurus/cssnano-preset@3.8.1":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz"
@@ -1595,6 +1724,16 @@
postcss-sort-media-queries "^5.2.0"
tslib "^2.6.0"
+"@docusaurus/cssnano-preset@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.0.tgz#ab7cbeac162759611aa903c71f7edab5745fbc6a"
+ integrity sha512-prCJXUcoJZBlovJzSFkfnfWr1gXd53VZfE+17fIpUWS6Zioc7WE4FPoXPi5ldAGZ8brhXre5xQ8NWDE90XP9yw==
+ dependencies:
+ cssnano-preset-advanced "^6.1.2"
+ postcss "^8.5.4"
+ postcss-sort-media-queries "^5.2.0"
+ tslib "^2.6.0"
+
"@docusaurus/logger@3.8.1":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.1.tgz"
@@ -1603,6 +1742,14 @@
chalk "^4.1.2"
tslib "^2.6.0"
+"@docusaurus/logger@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.9.0.tgz#a02a041377682a4de8d19fe438846427790ea1ca"
+ integrity sha512-lDtThsocWTF8ZrVF01ltfctA/xgtD/3oXWqEkKIDzF4fCWsWXH7hC4LCqT23xSuxZTIo8N+y02XSPvA/8DLInw==
+ dependencies:
+ chalk "^4.1.2"
+ tslib "^2.6.0"
+
"@docusaurus/mdx-loader@3.8.1":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz"
@@ -1633,6 +1780,36 @@
vfile "^6.0.1"
webpack "^5.88.1"
+"@docusaurus/mdx-loader@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.9.0.tgz#13b62a712b7967641725e73650a4c695324ab5c0"
+ integrity sha512-9bfJYdkZFE+REwevkT4CYdTJ2f6ydgkbUFylkzTXrNGtBXtx25TRJGdn2cVzm3eVkeWdJrGkG/ypwrIWnbu5UA==
+ dependencies:
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
+ "@mdx-js/mdx" "^3.0.0"
+ "@slorber/remark-comment" "^1.0.0"
+ escape-html "^1.0.3"
+ estree-util-value-to-estree "^3.0.1"
+ file-loader "^6.2.0"
+ fs-extra "^11.1.1"
+ image-size "^2.0.2"
+ mdast-util-mdx "^3.0.0"
+ mdast-util-to-string "^4.0.0"
+ rehype-raw "^7.0.0"
+ remark-directive "^3.0.0"
+ remark-emoji "^4.0.0"
+ remark-frontmatter "^5.0.0"
+ remark-gfm "^4.0.0"
+ stringify-object "^3.3.0"
+ tslib "^2.6.0"
+ unified "^11.0.3"
+ unist-util-visit "^5.0.0"
+ url-loader "^4.1.1"
+ vfile "^6.0.1"
+ webpack "^5.88.1"
+
"@docusaurus/module-type-aliases@3.8.1":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz"
@@ -1646,19 +1823,32 @@
react-helmet-async "npm:@slorber/react-helmet-async@1.3.0"
react-loadable "npm:@docusaurus/react-loadable@6.0.0"
-"@docusaurus/plugin-content-blog@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz"
- integrity sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==
+"@docusaurus/module-type-aliases@3.9.0", "@docusaurus/module-type-aliases@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.0.tgz#86de439129bb7dfd2d07c5ca34612de84869a932"
+ integrity sha512-0ucYr79FpTCebN+l3ZlKqoW7HbMqSKT8JdsEg6QoUtxD3C7trF6KZiK/X6Yh+xekO1w3zzXYgPcIYTF2DV81tQ==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/logger" "3.8.1"
- "@docusaurus/mdx-loader" "3.8.1"
- "@docusaurus/theme-common" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-common" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/types" "3.9.0"
+ "@types/history" "^4.7.11"
+ "@types/react" "*"
+ "@types/react-router-config" "*"
+ "@types/react-router-dom" "*"
+ react-helmet-async "npm:@slorber/react-helmet-async@1.3.0"
+ react-loadable "npm:@docusaurus/react-loadable@6.0.0"
+
+"@docusaurus/plugin-content-blog@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.0.tgz#ae1080ab75059db91f92362a5b4d9b6564f01cc0"
+ integrity sha512-XZXJ/rQgi2jT0XWNXOnSKooJgtGHPzkjaBjww6K9PD+YevNMTP9U8Y5sA7cLA5Bwuqrpee4i8NO3tSrjhhDW5w==
+ dependencies:
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/mdx-loader" "3.9.0"
+ "@docusaurus/theme-common" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
cheerio "1.0.0-rc.12"
feed "^4.2.2"
fs-extra "^11.1.1"
@@ -1670,7 +1860,31 @@
utility-types "^3.10.0"
webpack "^5.88.1"
-"@docusaurus/plugin-content-docs@*", "@docusaurus/plugin-content-docs@^2 || ^3", "@docusaurus/plugin-content-docs@3.8.1":
+"@docusaurus/plugin-content-docs@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.0.tgz#2b5db24d01b338e4f299d774498a56db6f9df2a6"
+ integrity sha512-PP+iDJg+lj4cn/7GbbmiguaQ8OX08YxnzQ17KqRC4ufJm11jdyXD33wA7vVtbeG/BkkgkiB/K7YyPHCPwmfVhg==
+ dependencies:
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/mdx-loader" "3.9.0"
+ "@docusaurus/module-type-aliases" "3.9.0"
+ "@docusaurus/theme-common" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
+ "@types/react-router-config" "^5.0.7"
+ combine-promises "^1.1.0"
+ fs-extra "^11.1.1"
+ js-yaml "^4.1.0"
+ lodash "^4.17.21"
+ schema-dts "^1.1.2"
+ tslib "^2.6.0"
+ utility-types "^3.10.0"
+ webpack "^5.88.1"
+
+"@docusaurus/plugin-content-docs@^2 || ^3":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz"
integrity sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==
@@ -1694,89 +1908,89 @@
utility-types "^3.10.0"
webpack "^5.88.1"
-"@docusaurus/plugin-content-pages@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz"
- integrity sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==
+"@docusaurus/plugin-content-pages@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.0.tgz#643574fbf05cb0b892f07bf9261096a750be0522"
+ integrity sha512-ngetCpAZuivlaHC0l8a5KoK6PQWGuZ8742VwK7dbXeIW0Y70P4xwuocBdsCIQ9J6nB9rlTXRYMpNVyYyCpD7/Q==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/mdx-loader" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/mdx-loader" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
fs-extra "^11.1.1"
tslib "^2.6.0"
webpack "^5.88.1"
-"@docusaurus/plugin-css-cascade-layers@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz"
- integrity sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==
+"@docusaurus/plugin-css-cascade-layers@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.0.tgz#2e8e135f5e6729405f00633735099f9f21ec951b"
+ integrity sha512-giPTCjEzeaamMn8EHY/oDvsPDxF5ei1/q5lPUFQLldbc65jFQ1k6pPwKjtOznYy3TSfClCF1F1DNpYWIx7B5LA==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
tslib "^2.6.0"
-"@docusaurus/plugin-debug@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz"
- integrity sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==
+"@docusaurus/plugin-debug@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.9.0.tgz#9d05be0eb044382f613193c25d0f8d74b0df56f8"
+ integrity sha512-DuFOZya+bcrYiL54qBEn2rdKuoWWNyOV5IoHI2MURLzwuYaKu/J9Gi618XUsj3N3qvqG2uxWQiXZcs9ecfMadA==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
fs-extra "^11.1.1"
react-json-view-lite "^2.3.0"
tslib "^2.6.0"
-"@docusaurus/plugin-google-analytics@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz"
- integrity sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==
+"@docusaurus/plugin-google-analytics@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.0.tgz#dafeb62f0d63923ce7b813ad29b4ca025f27400f"
+ integrity sha512-mUXvpasTDR2pXdnkkhGxEgB9frVAvLGc+T3fp6SGT2F+YoEQtjcmz9D43zubQawLn+W1KEhoj+vPusYe+HAl+A==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
tslib "^2.6.0"
-"@docusaurus/plugin-google-gtag@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz"
- integrity sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==
+"@docusaurus/plugin-google-gtag@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.0.tgz#791259897b7135964499a7484d58a5d970ba5063"
+ integrity sha512-L4tCKYnmcyLV6VQs7XWQ3r7YSllagAU2GylZzdvz7NRMcXE12uSW5MCC2aSltbk09MYlqrYv1Ntp+ESsMvptYw==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
"@types/gtag.js" "^0.0.12"
tslib "^2.6.0"
-"@docusaurus/plugin-google-tag-manager@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz"
- integrity sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==
+"@docusaurus/plugin-google-tag-manager@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.0.tgz#07611a3f0818249567db2dd8fa8abc9347dae3f4"
+ integrity sha512-+jWO3tkrvsMUKQ69KTIj9ZBf8sKY5kodLcP4yIaEkPzfWq9IEpE+ekQCtFWlrAmkJUtSxbjHK6HNZZkUNwwq7w==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
tslib "^2.6.0"
-"@docusaurus/plugin-pwa@^3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-pwa/-/plugin-pwa-3.8.1.tgz"
- integrity sha512-gRFJ0V1XR0BkdGPrH2F1sOGMu2Ulf4tsJ1Qw2eGytSiJU0enh3aSwbAUmY1l02RI0T0gh77N6gOuuL+mXYunkQ==
+"@docusaurus/plugin-pwa@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-pwa/-/plugin-pwa-3.9.0.tgz#06fe930eaf6a8dbf787479b5e8662e82ccc188ce"
+ integrity sha512-YYYn+46I0N8uY4RaI7zjcDkV47b26ukXXghXP/fJtSmjnPOYVq1NW9K0/p34nwDPye7M/Wl6D+1F5MpiIugrEQ==
dependencies:
"@babel/core" "^7.25.9"
"@babel/preset-env" "^7.25.9"
- "@docusaurus/bundler" "3.8.1"
- "@docusaurus/core" "3.8.1"
- "@docusaurus/logger" "3.8.1"
- "@docusaurus/theme-common" "3.8.1"
- "@docusaurus/theme-translations" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/bundler" "3.9.0"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/theme-common" "3.9.0"
+ "@docusaurus/theme-translations" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
babel-loader "^9.2.1"
clsx "^2.0.0"
core-js "^3.31.1"
@@ -1787,77 +2001,76 @@
workbox-precaching "^7.0.0"
workbox-window "^7.0.0"
-"@docusaurus/plugin-sitemap@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz"
- integrity sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==
+"@docusaurus/plugin-sitemap@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.0.tgz#49ef8eb2887b4f1dd00263f19e335b372ca7850c"
+ integrity sha512-QOyLooWuF+On4q2RDGVZtKY0tlfdZwD9e/p7g1sJLUfOwN518V2Bo+kZtU82Or42SCKjyJ0lhSqAUOZfbeFhFw==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/logger" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-common" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
fs-extra "^11.1.1"
sitemap "^7.1.1"
tslib "^2.6.0"
-"@docusaurus/plugin-svgr@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz"
- integrity sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==
+"@docusaurus/plugin-svgr@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.0.tgz#9fb628ac42961b94fdbb7519fb546dafc1c7d58c"
+ integrity sha512-pUZIfnhFtAYDmDwimFiBY+sxNUigyJnKbCwI9pTiXr3uGp43CsSsN8gwl/i8jBmqfsZzvNnGZNxc75wy9v6RXA==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
"@svgr/core" "8.1.0"
"@svgr/webpack" "^8.1.0"
tslib "^2.6.0"
webpack "^5.88.1"
-"@docusaurus/preset-classic@^3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz"
- integrity sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==
+"@docusaurus/preset-classic@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.9.0.tgz#b15fd5785a87b281ce1a3bbff37c08be37257f0b"
+ integrity sha512-nLoiDxf8bDNNxDSZ28+pFfSfT+QRi08Pn2K0zIvbjkM/X/otMs4ho0K8+2FpoLOoGApifaSuNfJXpGYnQV3rGA==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/plugin-content-blog" "3.8.1"
- "@docusaurus/plugin-content-docs" "3.8.1"
- "@docusaurus/plugin-content-pages" "3.8.1"
- "@docusaurus/plugin-css-cascade-layers" "3.8.1"
- "@docusaurus/plugin-debug" "3.8.1"
- "@docusaurus/plugin-google-analytics" "3.8.1"
- "@docusaurus/plugin-google-gtag" "3.8.1"
- "@docusaurus/plugin-google-tag-manager" "3.8.1"
- "@docusaurus/plugin-sitemap" "3.8.1"
- "@docusaurus/plugin-svgr" "3.8.1"
- "@docusaurus/theme-classic" "3.8.1"
- "@docusaurus/theme-common" "3.8.1"
- "@docusaurus/theme-search-algolia" "3.8.1"
- "@docusaurus/types" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/plugin-content-blog" "3.9.0"
+ "@docusaurus/plugin-content-docs" "3.9.0"
+ "@docusaurus/plugin-content-pages" "3.9.0"
+ "@docusaurus/plugin-css-cascade-layers" "3.9.0"
+ "@docusaurus/plugin-debug" "3.9.0"
+ "@docusaurus/plugin-google-analytics" "3.9.0"
+ "@docusaurus/plugin-google-gtag" "3.9.0"
+ "@docusaurus/plugin-google-tag-manager" "3.9.0"
+ "@docusaurus/plugin-sitemap" "3.9.0"
+ "@docusaurus/plugin-svgr" "3.9.0"
+ "@docusaurus/theme-classic" "3.9.0"
+ "@docusaurus/theme-common" "3.9.0"
+ "@docusaurus/theme-search-algolia" "3.9.0"
+ "@docusaurus/types" "3.9.0"
-"@docusaurus/theme-classic@^3.8.1", "@docusaurus/theme-classic@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz"
- integrity sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==
+"@docusaurus/theme-classic@3.9.0", "@docusaurus/theme-classic@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.9.0.tgz#a4fcd746c09f294e06c951ab735cfb104feceef7"
+ integrity sha512-RToUIabJOyX41nMIxkFn8LPeA+uHgySzyd6Ak/gsINqWHHTLDMoYPxBUmNm3S+okcfuMI54kNYvD6TY+6TIYDA==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/logger" "3.8.1"
- "@docusaurus/mdx-loader" "3.8.1"
- "@docusaurus/module-type-aliases" "3.8.1"
- "@docusaurus/plugin-content-blog" "3.8.1"
- "@docusaurus/plugin-content-docs" "3.8.1"
- "@docusaurus/plugin-content-pages" "3.8.1"
- "@docusaurus/theme-common" "3.8.1"
- "@docusaurus/theme-translations" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-common" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/mdx-loader" "3.9.0"
+ "@docusaurus/module-type-aliases" "3.9.0"
+ "@docusaurus/plugin-content-blog" "3.9.0"
+ "@docusaurus/plugin-content-docs" "3.9.0"
+ "@docusaurus/plugin-content-pages" "3.9.0"
+ "@docusaurus/theme-common" "3.9.0"
+ "@docusaurus/theme-translations" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
"@mdx-js/react" "^3.0.0"
clsx "^2.0.0"
- copy-text-to-clipboard "^3.2.0"
infima "0.2.0-alpha.45"
lodash "^4.17.21"
nprogress "^0.2.0"
@@ -1869,7 +2082,7 @@
tslib "^2.6.0"
utility-types "^3.10.0"
-"@docusaurus/theme-common@^2 || ^3", "@docusaurus/theme-common@3.8.1":
+"@docusaurus/theme-common@3.8.1":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz"
integrity sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==
@@ -1887,34 +2100,52 @@
tslib "^2.6.0"
utility-types "^3.10.0"
-"@docusaurus/theme-mermaid@^3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.1.tgz"
- integrity sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg==
+"@docusaurus/theme-common@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.9.0.tgz#b719cff930ac2b11feb97099264fd6b5a52e9da3"
+ integrity sha512-pqNoQgttIpk7Ndm6N8OGbhi+1wBIQXQPYM7bPf1HDraXfvVpOzhcDty1yyK4coPWl0M7NxednZvKw4atfQ70Ew==
dependencies:
- "@docusaurus/core" "3.8.1"
- "@docusaurus/module-type-aliases" "3.8.1"
- "@docusaurus/theme-common" "3.8.1"
- "@docusaurus/types" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
+ "@docusaurus/mdx-loader" "3.9.0"
+ "@docusaurus/module-type-aliases" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ "@types/history" "^4.7.11"
+ "@types/react" "*"
+ "@types/react-router-config" "*"
+ clsx "^2.0.0"
+ parse-numeric-range "^1.3.0"
+ prism-react-renderer "^2.3.0"
+ tslib "^2.6.0"
+ utility-types "^3.10.0"
+
+"@docusaurus/theme-mermaid@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.0.tgz#8441d1d5634845ded538b84023465bc334faffad"
+ integrity sha512-muPD/5pipsg1IHAlsw8EAgVbFyAvzwocItXm+O/7cLEmUET+ofeOLsY19LyvAY7lyHvW1GoMVY+Wju31UKMmrw==
+ dependencies:
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/module-type-aliases" "3.9.0"
+ "@docusaurus/theme-common" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
mermaid ">=11.6.0"
tslib "^2.6.0"
-"@docusaurus/theme-search-algolia@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz"
- integrity sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==
+"@docusaurus/theme-search-algolia@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.0.tgz#0808f43e4e9db597f9ff83f1bc84c3fae2b26518"
+ integrity sha512-nbY7ZJVA10kTiBLJtscxK1aECeYvYFz+Sno9PkCE9KeFXqRDr6omtNmLVkbvyl4b6xgz+6yOIBdO/idLPVDpWg==
dependencies:
- "@docsearch/react" "^3.9.0"
- "@docusaurus/core" "3.8.1"
- "@docusaurus/logger" "3.8.1"
- "@docusaurus/plugin-content-docs" "3.8.1"
- "@docusaurus/theme-common" "3.8.1"
- "@docusaurus/theme-translations" "3.8.1"
- "@docusaurus/utils" "3.8.1"
- "@docusaurus/utils-validation" "3.8.1"
- algoliasearch "^5.17.1"
- algoliasearch-helper "^3.22.6"
+ "@docsearch/react" "^3.9.0 || ^4.1.0"
+ "@docusaurus/core" "3.9.0"
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/plugin-content-docs" "3.9.0"
+ "@docusaurus/theme-common" "3.9.0"
+ "@docusaurus/theme-translations" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-validation" "3.9.0"
+ algoliasearch "^5.37.0"
+ algoliasearch-helper "^3.26.0"
clsx "^2.0.0"
eta "^2.2.0"
fs-extra "^11.1.1"
@@ -1922,7 +2153,15 @@
tslib "^2.6.0"
utility-types "^3.10.0"
-"@docusaurus/theme-translations@^2 || ^3", "@docusaurus/theme-translations@3.8.1":
+"@docusaurus/theme-translations@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.9.0.tgz#8a328b71ea152f64a9fb9ca41ee4088ce1c44b0c"
+ integrity sha512-4HUELBsE+rhtlnR1MsaNB9nJXPFZANeDQa5If1GfFVlis5mWUfdmXmbGangR7PfpK2tc56UETMtzjKrX5L5UWw==
+ dependencies:
+ fs-extra "^11.1.1"
+ tslib "^2.6.0"
+
+"@docusaurus/theme-translations@^2 || ^3":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz"
integrity sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==
@@ -1930,10 +2169,10 @@
fs-extra "^11.1.1"
tslib "^2.6.0"
-"@docusaurus/tsconfig@3.8.1":
- version "3.8.1"
- resolved "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.8.1.tgz"
- integrity sha512-XBWCcqhRHhkhfolnSolNL+N7gj3HVE3CoZVqnVjfsMzCoOsuQw2iCLxVVHtO+rePUUfouVZHURDgmqIySsF66A==
+"@docusaurus/tsconfig@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/tsconfig/-/tsconfig-3.9.0.tgz#c076e8289337ad774231b06244b0716f9a7a8268"
+ integrity sha512-DPD1NcEAqBov2e2Rgwy/oNuExbWzU/eGc+DEAxl8tttfQ+xxN6iFXNMCzBuMeAvMC8OwUO+i9mZHYFP95903DA==
"@docusaurus/types@3.8.1":
version "3.8.1"
@@ -1950,7 +2189,23 @@
webpack "^5.95.0"
webpack-merge "^5.9.0"
-"@docusaurus/utils-common@^2 || ^3", "@docusaurus/utils-common@3.8.1":
+"@docusaurus/types@3.9.0", "@docusaurus/types@^3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.9.0.tgz#df324f6eb26a9517371f4dfe3e6923c3b49d72bb"
+ integrity sha512-0klJLhHFHqkYoxIVp1LD7dnU1ASRTfSX+HFDiELOdz+YQUkOSfuU5hDa46zD8bLxrYffCb8FtJI7Z6BWAmVodg==
+ dependencies:
+ "@mdx-js/mdx" "^3.0.0"
+ "@types/history" "^4.7.11"
+ "@types/mdast" "^4.0.2"
+ "@types/react" "*"
+ commander "^5.1.0"
+ joi "^17.9.2"
+ react-helmet-async "npm:@slorber/react-helmet-async@1.3.0"
+ utility-types "^3.10.0"
+ webpack "^5.95.0"
+ webpack-merge "^5.9.0"
+
+"@docusaurus/utils-common@3.8.1", "@docusaurus/utils-common@^2 || ^3":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.1.tgz"
integrity sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==
@@ -1958,7 +2213,15 @@
"@docusaurus/types" "3.8.1"
tslib "^2.6.0"
-"@docusaurus/utils-validation@^2 || ^3", "@docusaurus/utils-validation@3.8.1":
+"@docusaurus/utils-common@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.9.0.tgz#139b568fa7c2841b7eb9a4f953788e0233c8a748"
+ integrity sha512-zpmzRn2mniMnrx8ZEYyyDsr0/7EksVgUXL9IuODp0DSK+R19nDGCY7w2NaMGRmGnrQQKsT3t0NDZzBk0V6N9Iw==
+ dependencies:
+ "@docusaurus/types" "3.9.0"
+ tslib "^2.6.0"
+
+"@docusaurus/utils-validation@3.8.1", "@docusaurus/utils-validation@^2 || ^3":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz"
integrity sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==
@@ -1972,7 +2235,21 @@
lodash "^4.17.21"
tslib "^2.6.0"
-"@docusaurus/utils@^2 || ^3", "@docusaurus/utils@3.8.1":
+"@docusaurus/utils-validation@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.9.0.tgz#be78feef0890b125d77ae5558391cc12f7ff3d2d"
+ integrity sha512-xpVLdFPpsE5dYuE7hOtghccCrRWRhM6tUQ4YpfSy5snCDWgROITG5Mj22fGstd/HBqTzKD8NFs7qPPs42qjgWg==
+ dependencies:
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/utils" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ fs-extra "^11.2.0"
+ joi "^17.9.2"
+ js-yaml "^4.1.0"
+ lodash "^4.17.21"
+ tslib "^2.6.0"
+
+"@docusaurus/utils@3.8.1", "@docusaurus/utils@^2 || ^3":
version "3.8.1"
resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.1.tgz"
integrity sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==
@@ -1999,6 +2276,33 @@
utility-types "^3.10.0"
webpack "^5.88.1"
+"@docusaurus/utils@3.9.0":
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.9.0.tgz#f73688ebe9f5c8933966d6abac62770f009123f6"
+ integrity sha512-wpVRQbDhXxqbb1llhkpu++aD4UdHHQ5M7J8DmJELDphlwmpI44TdS5elQZOsjzPfGyITZyQLekcDXjyteJ0/bw==
+ dependencies:
+ "@docusaurus/logger" "3.9.0"
+ "@docusaurus/types" "3.9.0"
+ "@docusaurus/utils-common" "3.9.0"
+ escape-string-regexp "^4.0.0"
+ execa "5.1.1"
+ file-loader "^6.2.0"
+ fs-extra "^11.1.1"
+ github-slugger "^1.5.0"
+ globby "^11.1.0"
+ gray-matter "^4.0.3"
+ jiti "^1.20.0"
+ js-yaml "^4.1.0"
+ lodash "^4.17.21"
+ micromatch "^4.0.5"
+ p-queue "^6.6.2"
+ prompts "^2.4.2"
+ resolve-pathname "^3.0.0"
+ tslib "^2.6.0"
+ url-loader "^4.1.1"
+ utility-types "^3.10.0"
+ webpack "^5.88.1"
+
"@easyops-cn/autocomplete.js@^0.38.1":
version "0.38.1"
resolved "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz"
@@ -2136,6 +2440,50 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
+"@jsonjoy.com/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578"
+ integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==
+
+"@jsonjoy.com/buffers@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz#ade6895b7d3883d70f87b5743efaa12c71dfef7a"
+ integrity sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==
+
+"@jsonjoy.com/codegen@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207"
+ integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==
+
+"@jsonjoy.com/json-pack@^1.11.0":
+ version "1.14.0"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz#eda5255ccdaeafb3aa811ff1ae4814790b958b4f"
+ integrity sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==
+ dependencies:
+ "@jsonjoy.com/base64" "^1.1.2"
+ "@jsonjoy.com/buffers" "^1.0.0"
+ "@jsonjoy.com/codegen" "^1.0.0"
+ "@jsonjoy.com/json-pointer" "^1.0.1"
+ "@jsonjoy.com/util" "^1.9.0"
+ hyperdyperid "^1.2.0"
+ thingies "^2.5.0"
+
+"@jsonjoy.com/json-pointer@^1.0.1":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408"
+ integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==
+ dependencies:
+ "@jsonjoy.com/codegen" "^1.0.0"
+ "@jsonjoy.com/util" "^1.9.0"
+
+"@jsonjoy.com/util@^1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46"
+ integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==
+ dependencies:
+ "@jsonjoy.com/buffers" "^1.0.0"
+ "@jsonjoy.com/codegen" "^1.0.0"
+
"@leichtgewicht/ip-codec@^2.0.1":
version "2.0.5"
resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz"
@@ -2294,7 +2642,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -2307,6 +2655,11 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@opentelemetry/api@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe"
+ integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==
+
"@pnpm/config.env-replace@^1.1.0":
version "1.1.0"
resolved "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz"
@@ -2428,6 +2781,11 @@
micromark-util-character "^1.1.0"
micromark-util-symbol "^1.0.1"
+"@standard-schema/spec@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c"
+ integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==
+
"@surma/rollup-plugin-off-main-thread@^2.2.3":
version "2.2.3"
resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz"
@@ -2492,7 +2850,7 @@
"@svgr/babel-plugin-transform-react-native-svg" "8.1.0"
"@svgr/babel-plugin-transform-svg-component" "8.0.0"
-"@svgr/core@*", "@svgr/core@8.1.0":
+"@svgr/core@8.1.0":
version "8.1.0"
resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz"
integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==
@@ -2571,14 +2929,14 @@
"@types/connect" "*"
"@types/node" "*"
-"@types/bonjour@^3.5.9":
+"@types/bonjour@^3.5.13", "@types/bonjour@^3.5.9":
version "3.5.13"
resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz"
integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==
dependencies:
"@types/node" "*"
-"@types/connect-history-api-fallback@^1.3.5":
+"@types/connect-history-api-fallback@^1.3.5", "@types/connect-history-api-fallback@^1.5.4":
version "1.5.4"
resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz"
integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==
@@ -2853,7 +3211,7 @@
"@types/range-parser" "*"
"@types/send" "*"
-"@types/express-serve-static-core@^4.17.33":
+"@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33":
version "4.19.6"
resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz"
integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==
@@ -2863,7 +3221,7 @@
"@types/range-parser" "*"
"@types/send" "*"
-"@types/express@*", "@types/express@^4.17.13":
+"@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.21":
version "4.17.23"
resolved "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz"
integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==
@@ -3023,7 +3381,7 @@
"@types/history" "^4.7.11"
"@types/react" "*"
-"@types/react@*", "@types/react@>= 16.8.0 < 20.0.0", "@types/react@>=16":
+"@types/react@*":
version "19.1.10"
resolved "https://registry.npmjs.org/@types/react/-/react-19.1.10.tgz"
integrity sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==
@@ -3040,6 +3398,11 @@
resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz"
integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==
+"@types/retry@0.12.2":
+ version "0.12.2"
+ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a"
+ integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==
+
"@types/sax@^1.2.1":
version "1.2.7"
resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz"
@@ -3055,14 +3418,14 @@
"@types/mime" "^1"
"@types/node" "*"
-"@types/serve-index@^1.9.1":
+"@types/serve-index@^1.9.1", "@types/serve-index@^1.9.4":
version "1.9.4"
resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz"
integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==
dependencies:
"@types/express" "*"
-"@types/serve-static@*", "@types/serve-static@^1.13.10":
+"@types/serve-static@*", "@types/serve-static@^1.13.10", "@types/serve-static@^1.15.5":
version "1.15.8"
resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz"
integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==
@@ -3071,7 +3434,7 @@
"@types/node" "*"
"@types/send" "*"
-"@types/sockjs@^0.3.33":
+"@types/sockjs@^0.3.33", "@types/sockjs@^0.3.36":
version "0.3.36"
resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz"
integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==
@@ -3093,7 +3456,7 @@
resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz"
integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==
-"@types/ws@^8.5.5":
+"@types/ws@^8.5.10", "@types/ws@^8.5.5":
version "8.18.1"
resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz"
integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==
@@ -3117,7 +3480,7 @@
resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz"
integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==
-"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1":
+"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
version "1.14.1"
resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz"
integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
@@ -3218,7 +3581,7 @@
"@webassemblyjs/wasm-gen" "1.14.1"
"@webassemblyjs/wasm-parser" "1.14.1"
-"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1":
+"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1":
version "1.14.1"
resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz"
integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
@@ -3273,7 +3636,7 @@ acorn-walk@^8.0.0:
dependencies:
acorn "^8.11.0"
-"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0:
+acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0:
version "8.15.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
@@ -3291,6 +3654,16 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
+ai@5.0.54, ai@^5.0.30:
+ version "5.0.54"
+ resolved "https://registry.yarnpkg.com/ai/-/ai-5.0.54.tgz#690ce642fd412ae81236d123ecfb3f866f71b80d"
+ integrity sha512-eM3EH4VVCWRMfs17r8HF8RtCN/+vBdpWOQoHSVooIfB0BZerOHyrktrVoDP6G6xatUzGLTvJT3rMKLkbPTLPBg==
+ dependencies:
+ "@ai-sdk/gateway" "1.0.30"
+ "@ai-sdk/provider" "2.0.0"
+ "@ai-sdk/provider-utils" "3.0.10"
+ "@opentelemetry/api" "1.9.0"
+
ajv-formats@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz"
@@ -3310,7 +3683,7 @@ ajv-keywords@^5.1.0:
dependencies:
fast-deep-equal "^3.1.3"
-ajv@^6.12.5, ajv@^6.9.1:
+ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -3320,7 +3693,7 @@ ajv@^6.12.5, ajv@^6.9.1:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.2, ajv@^8.9.0, ajv@>=8:
+ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0:
version "8.17.1"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
@@ -3330,32 +3703,32 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.2, ajv@^8.9.0, ajv@>=8:
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
-algoliasearch-helper@^3.22.6:
+algoliasearch-helper@^3.26.0:
version "3.26.0"
- resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz"
+ resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz#d6e283396a9fc5bf944f365dc3b712570314363f"
integrity sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==
dependencies:
"@algolia/events" "^4.0.1"
-algoliasearch@^5.14.2, algoliasearch@^5.17.1, "algoliasearch@>= 3.1 < 6", "algoliasearch@>= 4.9.1 < 6":
- version "5.35.0"
- resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz"
- integrity sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==
+algoliasearch@^5.28.0, algoliasearch@^5.37.0:
+ version "5.38.0"
+ resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.38.0.tgz#43615d81c493ca4a4efd74edb93910b2e71c91e1"
+ integrity sha512-8VJKIzheeI9cjuVJhU1hYEVetOTe7LvA+CujAI7yqvYsPtZfVEvv1pg9AeFNtHBg/ZoSLGU5LPijhcY5l3Ea9g==
dependencies:
- "@algolia/abtesting" "1.1.0"
- "@algolia/client-abtesting" "5.35.0"
- "@algolia/client-analytics" "5.35.0"
- "@algolia/client-common" "5.35.0"
- "@algolia/client-insights" "5.35.0"
- "@algolia/client-personalization" "5.35.0"
- "@algolia/client-query-suggestions" "5.35.0"
- "@algolia/client-search" "5.35.0"
- "@algolia/ingestion" "1.35.0"
- "@algolia/monitoring" "1.35.0"
- "@algolia/recommend" "5.35.0"
- "@algolia/requester-browser-xhr" "5.35.0"
- "@algolia/requester-fetch" "5.35.0"
- "@algolia/requester-node-http" "5.35.0"
+ "@algolia/abtesting" "1.4.0"
+ "@algolia/client-abtesting" "5.38.0"
+ "@algolia/client-analytics" "5.38.0"
+ "@algolia/client-common" "5.38.0"
+ "@algolia/client-insights" "5.38.0"
+ "@algolia/client-personalization" "5.38.0"
+ "@algolia/client-query-suggestions" "5.38.0"
+ "@algolia/client-search" "5.38.0"
+ "@algolia/ingestion" "1.38.0"
+ "@algolia/monitoring" "1.38.0"
+ "@algolia/recommend" "5.38.0"
+ "@algolia/requester-browser-xhr" "5.38.0"
+ "@algolia/requester-fetch" "5.38.0"
+ "@algolia/requester-node-http" "5.38.0"
ansi-align@^3.0.1:
version "3.0.1"
@@ -3575,7 +3948,7 @@ body-parser@1.20.3:
type-is "~1.6.18"
unpipe "1.0.0"
-bonjour-service@^1.0.11:
+bonjour-service@^1.0.11, bonjour-service@^1.2.1:
version "1.3.0"
resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz"
integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==
@@ -3638,7 +4011,7 @@ braces@^3.0.3, braces@~3.0.2:
dependencies:
fill-range "^7.1.1"
-browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.0, browserslist@^4.25.1, "browserslist@>= 4.21.0":
+browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.0, browserslist@^4.25.1:
version "4.25.3"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz"
integrity sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==
@@ -3653,6 +4026,13 @@ buffer-from@^1.0.0:
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+bundle-name@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889"
+ integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==
+ dependencies:
+ run-applescript "^7.0.0"
+
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
@@ -3800,6 +4180,19 @@ cheerio-select@^2.1.0:
domhandler "^5.0.3"
domutils "^3.0.1"
+cheerio@1.0.0-rc.12:
+ version "1.0.0-rc.12"
+ resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz"
+ integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==
+ dependencies:
+ cheerio-select "^2.1.0"
+ dom-serializer "^2.0.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+ htmlparser2 "^8.0.1"
+ parse5 "^7.0.0"
+ parse5-htmlparser2-tree-adapter "^7.0.0"
+
cheerio@^1.0.0:
version "1.1.2"
resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz"
@@ -3817,19 +4210,6 @@ cheerio@^1.0.0:
undici "^7.12.0"
whatwg-mimetype "^4.0.0"
-cheerio@1.0.0-rc.12:
- version "1.0.0-rc.12"
- resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz"
- integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==
- dependencies:
- cheerio-select "^2.1.0"
- dom-serializer "^2.0.0"
- domhandler "^5.0.3"
- domutils "^3.0.1"
- htmlparser2 "^8.0.1"
- parse5 "^7.0.0"
- parse5-htmlparser2-tree-adapter "^7.0.0"
-
chevrotain-allstar@~0.3.0:
version "0.3.1"
resolved "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz"
@@ -3837,7 +4217,7 @@ chevrotain-allstar@~0.3.0:
dependencies:
lodash-es "^4.17.21"
-chevrotain@^11.0.0, chevrotain@~11.0.3:
+chevrotain@~11.0.3:
version "11.0.3"
resolved "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz"
integrity sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==
@@ -3849,7 +4229,7 @@ chevrotain@^11.0.0, chevrotain@~11.0.3:
"@chevrotain/utils" "11.0.3"
lodash-es "4.17.21"
-chokidar@^3.5.3:
+chokidar@^3.5.3, chokidar@^3.6.0:
version "3.6.0"
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
@@ -3956,6 +4336,11 @@ comma-separated-tokens@^2.0.0:
resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz"
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
+commander@7, commander@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
commander@^10.0.0:
version "10.0.1"
resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz"
@@ -3971,21 +4356,11 @@ commander@^5.1.0:
resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz"
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
-commander@^7.2.0:
- version "7.2.0"
- resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
- integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
commander@^8.3.0:
version "8.3.0"
resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz"
integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
-commander@7:
- version "7.2.0"
- resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
- integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
common-path-prefix@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz"
@@ -4092,11 +4467,6 @@ cookie@0.7.1:
resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz"
integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
-copy-text-to-clipboard@^3.2.0:
- version "3.2.0"
- resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz"
- integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==
-
copy-webpack-plugin@^11.0.0:
version "11.0.0"
resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz"
@@ -4369,18 +4739,11 @@ cytoscape-fcose@^2.2.0:
dependencies:
cose-base "^2.2.0"
-cytoscape@^3.2.0, cytoscape@^3.29.3:
+cytoscape@^3.29.3:
version "3.33.1"
resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz"
integrity sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==
-d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3:
- version "3.2.4"
- resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
- integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
- dependencies:
- internmap "1 - 2"
-
"d3-array@1 - 2":
version "2.12.1"
resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz"
@@ -4388,6 +4751,13 @@ d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3",
dependencies:
internmap "^1.0.0"
+"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0:
+ version "3.2.4"
+ resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
+ integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
+ dependencies:
+ internmap "1 - 2"
+
d3-axis@3:
version "3.0.0"
resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz"
@@ -4497,16 +4867,16 @@ d3-hierarchy@3:
dependencies:
d3-color "1 - 3"
-d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3:
- version "3.1.0"
- resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"
- integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
-
d3-path@1:
version "1.0.9"
resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz"
integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
+"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"
+ integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
+
d3-polygon@3:
version "3.0.1"
resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz"
@@ -4554,13 +4924,6 @@ d3-scale@4:
resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz"
integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
-d3-shape@^1.2.0:
- version "1.3.7"
- resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz"
- integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
- dependencies:
- d3-path "1"
-
d3-shape@3:
version "3.2.0"
resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz"
@@ -4568,6 +4931,13 @@ d3-shape@3:
dependencies:
d3-path "^3.1.0"
+d3-shape@^1.2.0:
+ version "1.3.7"
+ resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz"
+ integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
+ dependencies:
+ d3-path "1"
+
"d3-time-format@2 - 4", d3-time-format@4:
version "4.1.0"
resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz"
@@ -4690,13 +5060,6 @@ debounce@^1.2.1:
resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz"
integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
-debug@^4.0.0, debug@^4.1.0, debug@^4.2.0, debug@^4.3.1, debug@^4.4.0, debug@^4.4.1, debug@4:
- version "4.4.1"
- resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz"
- integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
- dependencies:
- ms "^2.1.3"
-
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
@@ -4704,6 +5067,13 @@ debug@2.6.9:
dependencies:
ms "2.0.0"
+debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.2.0, debug@^4.3.1, debug@^4.4.0, debug@^4.4.1:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz"
+ integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
+ dependencies:
+ ms "^2.1.3"
+
decode-named-character-reference@^1.0.0:
version "1.2.0"
resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz"
@@ -4728,6 +5098,19 @@ deepmerge@^4.2.2, deepmerge@^4.3.1:
resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+default-browser-id@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26"
+ integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==
+
+default-browser@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf"
+ integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==
+ dependencies:
+ bundle-name "^4.1.0"
+ default-browser-id "^5.0.0"
+
default-gateway@^6.0.3:
version "6.0.3"
resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz"
@@ -4754,6 +5137,11 @@ define-lazy-prop@^2.0.0:
resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz"
integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+define-lazy-prop@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
+ integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
+
define-properties@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz"
@@ -4770,17 +5158,17 @@ delaunator@5:
dependencies:
robust-predicates "^3.0.2"
-depd@~1.1.2:
- version "1.1.2"
- resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
- integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
-
depd@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-dequal@^2.0.0:
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
+ integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
+
+dequal@^2.0.0, dequal@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
@@ -5302,7 +5690,12 @@ events@^3.2.0:
resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-execa@^5.0.0, execa@5.1.1:
+eventsource-parser@^3.0.5:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.6.tgz#292e165e34cacbc936c3c92719ef326d4aeb4e90"
+ integrity sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==
+
+execa@5.1.1, execa@^5.0.0:
version "5.1.1"
resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
@@ -5317,7 +5710,7 @@ execa@^5.0.0, execa@5.1.1:
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
-express@^4.17.3:
+express@^4.17.3, express@^4.21.2:
version "4.21.2"
resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz"
integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
@@ -5432,7 +5825,7 @@ figures@^3.2.0:
dependencies:
escape-string-regexp "^1.0.5"
-file-loader@*, file-loader@^6.2.0:
+file-loader@^6.2.0:
version "6.2.0"
resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz"
integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
@@ -5657,6 +6050,11 @@ glob-parent@^6.0.1:
dependencies:
is-glob "^4.0.3"
+glob-to-regex.js@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz#f71cc9cb8441471a9318626160bc8a35e1306b21"
+ integrity sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==
+
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
@@ -5739,16 +6137,16 @@ got@^12.1.0:
p-cancelable "^3.0.0"
responselike "^3.0.0"
-graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
- version "4.2.11"
- resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
- integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-
graceful-fs@4.2.10:
version "4.2.10"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
+ version "4.2.11"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
gray-matter@^4.0.3:
version "4.0.3"
resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz"
@@ -6069,16 +6467,6 @@ http-deceiver@^1.2.7:
resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
-http-errors@~1.6.2:
- version "1.6.3"
- resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
- integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
- dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.0"
- statuses ">= 1.4.0 < 2"
-
http-errors@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
@@ -6090,12 +6478,22 @@ http-errors@2.0.0:
statuses "2.0.1"
toidentifier "1.0.1"
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
+ integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
http-parser-js@>=0.5.1:
version "0.5.10"
resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz"
integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==
-http-proxy-middleware@^2.0.3:
+http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.9:
version "2.0.9"
resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz"
integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==
@@ -6128,12 +6526,10 @@ human-signals@^2.1.0:
resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-iconv-lite@^0.6.3:
- version "0.6.3"
- resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
- integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
- dependencies:
- safer-buffer ">= 2.1.2 < 3.0.0"
+hyperdyperid@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b"
+ integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==
iconv-lite@0.4.24:
version "0.4.24"
@@ -6142,14 +6538,7 @@ iconv-lite@0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
-iconv-lite@0.6:
- version "0.6.3"
- resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
- integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
- dependencies:
- safer-buffer ">= 2.1.2 < 3.0.0"
-
-iconv-lite@0.6.3:
+iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -6217,7 +6606,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -6227,21 +6616,16 @@ inherits@2.0.3:
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
-ini@^1.3.4:
- version "1.3.8"
- resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
-ini@~1.3.0:
- version "1.3.8"
- resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
ini@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz"
integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
inline-style-parser@0.2.4:
version "0.2.4"
resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz"
@@ -6256,16 +6640,16 @@ internal-slot@^1.1.0:
hasown "^2.0.2"
side-channel "^1.1.0"
-internmap@^1.0.0:
- version "1.0.1"
- resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz"
- integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
-
"internmap@1 - 2":
version "2.0.3"
resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
+internmap@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz"
+ integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
+
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
@@ -6273,16 +6657,16 @@ invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
-ipaddr.js@^2.0.1:
- version "2.2.0"
- resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz"
- integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
-
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+ipaddr.js@^2.0.1, ipaddr.js@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz"
+ integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
+
is-alphabetical@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz"
@@ -6389,6 +6773,11 @@ is-docker@^2.0.0, is-docker@^2.1.1:
resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+is-docker@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
+ integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+
is-extendable@^0.1.0:
version "0.1.1"
resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
@@ -6433,6 +6822,13 @@ is-hexadecimal@^2.0.0:
resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz"
integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==
+is-inside-container@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
+ integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
+ dependencies:
+ is-docker "^3.0.0"
+
is-installed-globally@^0.4.0:
version "0.4.0"
resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz"
@@ -6456,6 +6852,11 @@ is-negative-zero@^2.0.3:
resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz"
integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+is-network-error@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.0.tgz#2ce62cbca444abd506f8a900f39d20b898d37512"
+ integrity sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==
+
is-npm@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz"
@@ -6594,11 +6995,23 @@ is-wsl@^2.2.0:
dependencies:
is-docker "^2.0.0"
+is-wsl@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2"
+ integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==
+ dependencies:
+ is-inside-container "^1.0.0"
+
is-yarn-global@^0.4.0:
version "0.4.1"
resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz"
integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
+ integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
+
isarray@^2.0.5:
version "2.0.5"
resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
@@ -6609,11 +7022,6 @@ isarray@~1.0.0:
resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
- integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
-
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
@@ -6813,7 +7221,7 @@ latest-version@^7.0.0:
dependencies:
package-json "^8.1.0"
-launch-editor@^2.6.0:
+launch-editor@^2.6.0, launch-editor@^2.6.1:
version "2.11.1"
resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz"
integrity sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==
@@ -6876,7 +7284,7 @@ locate-path@^7.1.0:
dependencies:
p-locate "^6.0.0"
-lodash-es@^4.17.21, lodash-es@4.17.21:
+lodash-es@4.17.21, lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
@@ -6981,6 +7389,11 @@ marked@^16.0.0:
resolved "https://registry.npmjs.org/marked/-/marked-16.2.0.tgz"
integrity sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg==
+marked@^16.3.0:
+ version "16.3.0"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-16.3.0.tgz#2f513891f867d6edc4772b4a026db9cc331eb94f"
+ integrity sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==
+
math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
@@ -7226,6 +7639,18 @@ memfs@^3.4.3:
dependencies:
fs-monkey "^1.0.4"
+memfs@^4.43.1:
+ version "4.46.1"
+ resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.46.1.tgz#835332e5a21ed03373184d889c7958ba9a1db534"
+ integrity sha512-2wjHDg7IjP+ufAqqqSxjiNePFDrvWviA79ajUwG9lkHhk3HzZOLBzzoUG8cx9vCagj6VvBQD7oXuLuFz5LaAOQ==
+ dependencies:
+ "@jsonjoy.com/json-pack" "^1.11.0"
+ "@jsonjoy.com/util" "^1.9.0"
+ glob-to-regex.js "^1.0.1"
+ thingies "^2.5.0"
+ tree-dump "^1.0.3"
+ tslib "^2.0.0"
+
merge-descriptors@1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz"
@@ -7696,7 +8121,12 @@ micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8:
braces "^3.0.3"
picomatch "^2.3.1"
-"mime-db@>= 1.43.0 < 2":
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0:
version "1.54.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
@@ -7706,45 +8136,26 @@ mime-db@~1.33.0:
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz"
integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==
-mime-db@1.52.0:
- version "1.52.0"
- resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
- integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-
-mime-types@^2.1.27:
- version "2.1.35"
- resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
- dependencies:
- mime-db "1.52.0"
-
-mime-types@^2.1.31:
- version "2.1.35"
- resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
- dependencies:
- mime-db "1.52.0"
-
-mime-types@~2.1.17, mime-types@2.1.18:
+mime-types@2.1.18, mime-types@~2.1.17:
version "2.1.18"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz"
integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==
dependencies:
mime-db "~1.33.0"
-mime-types@~2.1.24:
+mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
-mime-types@~2.1.34:
- version "2.1.35"
- resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+mime-types@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce"
+ integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==
dependencies:
- mime-db "1.52.0"
+ mime-db "^1.54.0"
mime@1.6.0:
version "1.6.0"
@@ -7779,7 +8190,7 @@ minimalistic-assert@^1.0.0:
resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-minimatch@^3.1.1, minimatch@3.1.2:
+minimatch@3.1.2, minimatch@^3.1.1:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -7813,16 +8224,16 @@ mrmime@^2.0.0:
resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz"
integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==
-ms@^2.1.3, ms@2.1.3:
- version "2.1.3"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+ms@2.1.3, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
multicast-dns@^7.2.5:
version "7.2.5"
resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz"
@@ -7836,16 +8247,16 @@ nanoid@^3.3.11:
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
-negotiator@~0.6.4:
- version "0.6.4"
- resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
- integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
-
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+negotiator@~0.6.4:
+ version "0.6.4"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
+ integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
+
neo-async@^2.6.2:
version "2.6.2"
resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
@@ -7953,7 +8364,7 @@ obuf@^1.0.0, obuf@^1.1.2:
resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz"
integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
-on-finished@2.4.1:
+on-finished@2.4.1, on-finished@^2.4.1:
version "2.4.1"
resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
@@ -7979,6 +8390,16 @@ onetime@^5.1.2:
dependencies:
mimic-fn "^2.1.0"
+open@^10.0.3:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c"
+ integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==
+ dependencies:
+ default-browser "^5.2.1"
+ define-lazy-prop "^3.0.0"
+ is-inside-container "^1.0.0"
+ wsl-utils "^0.1.0"
+
open@^8.0.9, open@^8.4.0:
version "8.4.2"
resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz"
@@ -8049,6 +8470,15 @@ p-retry@^4.5.0:
"@types/retry" "0.12.0"
retry "^0.13.1"
+p-retry@^6.2.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af"
+ integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==
+ dependencies:
+ "@types/retry" "0.12.2"
+ is-network-error "^1.0.0"
+ retry "^0.13.1"
+
p-timeout@^3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz"
@@ -8149,7 +8579,7 @@ pascal-case@^3.1.2:
no-case "^3.0.4"
tslib "^2.0.3"
-path-data-parser@^0.1.0, path-data-parser@0.1.0:
+path-data-parser@0.1.0, path-data-parser@^0.1.0:
version "0.1.0"
resolved "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz"
integrity sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==
@@ -8179,13 +8609,6 @@ path-parse@^1.0.7:
resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-path-to-regexp@^1.7.0:
- version "1.9.0"
- resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz"
- integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==
- dependencies:
- isarray "0.0.1"
-
path-to-regexp@0.1.12:
version "0.1.12"
resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz"
@@ -8196,6 +8619,13 @@ path-to-regexp@3.3.0:
resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz"
integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==
+path-to-regexp@^1.7.0:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz"
+ integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==
+ dependencies:
+ isarray "0.0.1"
+
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
@@ -8246,7 +8676,7 @@ pkg-types@^2.3.0:
exsolve "^1.0.7"
pathe "^2.0.3"
-points-on-curve@^0.2.0, points-on-curve@0.2.0:
+points-on-curve@0.2.0, points-on-curve@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz"
integrity sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==
@@ -8812,7 +9242,7 @@ postcss-zindex@^6.0.2:
resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz"
integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==
-"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.2, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.24, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.6, postcss@^8.5.4:
+postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4:
version "8.5.6"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
@@ -8938,21 +9368,16 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.0"
-range-parser@^1.2.1:
- version "1.2.1"
- resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
- integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-
-range-parser@~1.2.1:
- version "1.2.1"
- resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
- integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-
range-parser@1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz"
integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==
+range-parser@^1.2.1, range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
raw-body@2.5.2:
version "2.5.2"
resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz"
@@ -8973,7 +9398,7 @@ rc@1.2.8:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-dom@*, "react-dom@^16.14.0 || 17 || ^18 || ^19", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.0.0, "react-dom@>= 16.8.0 < 20.0.0":
+react-dom@^19.0.0:
version "19.1.1"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz"
integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==
@@ -9013,7 +9438,7 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1:
dependencies:
"@babel/runtime" "^7.10.3"
-react-loadable@*, "react-loadable@npm:@docusaurus/react-loadable@6.0.0":
+"react-loadable@npm:@docusaurus/react-loadable@6.0.0":
version "6.0.0"
resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz"
integrity sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==
@@ -9040,7 +9465,7 @@ react-router-dom@^5.3.4:
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
-react-router@^5.3.4, react-router@>=5, react-router@5.3.4:
+react-router@5.3.4, react-router@^5.3.4:
version "5.3.4"
resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz"
integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==
@@ -9055,7 +9480,7 @@ react-router@^5.3.4, react-router@>=5, react-router@5.3.4:
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
-react@*, "react@^16.14.0 || ^17 || ^18 || ^19", "react@^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.1.1, "react@>= 16.8.0 < 20.0.0", react@>=15, react@>=16, react@>=16.0.0:
+react@^19.0.0:
version "19.1.1"
resolved "https://registry.npmjs.org/react/-/react-19.1.1.tgz"
integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==
@@ -9393,7 +9818,7 @@ robust-predicates@^3.0.2:
resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz"
integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==
-"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.0.0||^3.0.0||^4.0.0, rollup@^2.43.1, rollup@^2.78.0||^3.0.0||^4.0.0:
+rollup@^2.43.1:
version "2.79.2"
resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz"
integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==
@@ -9420,6 +9845,11 @@ rtlcss@^4.1.0:
postcss "^8.4.21"
strip-json-comments "^3.1.1"
+run-applescript@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911"
+ integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==
+
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
@@ -9443,7 +9873,7 @@ safe-array-concat@^1.1.3:
has-symbols "^1.1.0"
isarray "^2.0.5"
-safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1:
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -9499,7 +9929,7 @@ schema-utils@^3.0.0:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
-schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.3.0, schema-utils@^4.3.2:
+schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.2:
version "4.3.2"
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz"
integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==
@@ -9509,11 +9939,6 @@ schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.3.0, schema-utils@^4.3
ajv-formats "^2.1.1"
ajv-keywords "^5.1.0"
-"search-insights@>= 1 < 3":
- version "2.17.3"
- resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz"
- integrity sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==
-
section-matter@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz"
@@ -9527,7 +9952,7 @@ select-hose@^2.0.0:
resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==
-selfsigned@^2.1.1:
+selfsigned@^2.1.1, selfsigned@^2.4.1:
version "2.4.1"
resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz"
integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==
@@ -9810,7 +10235,7 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@^0.6.0:
+source-map@^0.6.0, source-map@~0.6.0:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -9827,11 +10252,6 @@ source-map@^0.8.0-beta.0:
dependencies:
whatwg-url "^7.0.0"
-source-map@~0.6.0:
- version "0.6.1"
- resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
sourcemap-codec@^1.4.8:
version "1.4.8"
resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
@@ -9875,16 +10295,16 @@ srcset@^4.0.0:
resolved "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz"
integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==
-"statuses@>= 1.4.0 < 2":
- version "1.5.0"
- resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
- integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
-
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+"statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+ integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
std-env@^3.7.0:
version "3.9.0"
resolved "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz"
@@ -9898,30 +10318,7 @@ stop-iteration-iterator@^1.1.0:
es-errors "^1.3.0"
internal-slot "^1.1.0"
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
-string-width@^4.1.0:
- version "4.2.3"
- resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
- integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.1"
-
-string-width@^4.2.0:
+string-width@^4.1.0, string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -9990,6 +10387,20 @@ string.prototype.trimstart@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
stringify-entities@^4.0.0:
version "4.0.4"
resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz"
@@ -10110,6 +10521,14 @@ svgo@^3.0.2, svgo@^3.2.0:
csso "^5.0.5"
picocolors "^1.0.0"
+swr@^2.2.5:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/swr/-/swr-2.3.6.tgz#5fee0ee8a0762a16871ee371075cb09422b64f50"
+ integrity sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==
+ dependencies:
+ dequal "^2.0.3"
+ use-sync-external-store "^1.4.0"
+
tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
version "2.2.2"
resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz"
@@ -10151,6 +10570,16 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.17.4, terser@^5.31.1:
commander "^2.20.0"
source-map-support "~0.5.20"
+thingies@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f"
+ integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==
+
+throttleit@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-2.1.0.tgz#a7e4aa0bf4845a5bd10daa39ea0c783f631a07b4"
+ integrity sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==
+
thunky@^1.0.2:
version "1.1.0"
resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
@@ -10200,6 +10629,11 @@ tr46@^1.0.1:
dependencies:
punycode "^2.1.0"
+tree-dump@^1.0.3:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4"
+ integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==
+
trim-lines@^3.0.0:
version "3.0.1"
resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz"
@@ -10215,7 +10649,7 @@ ts-dedent@^2.2.0:
resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz"
integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==
-tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0:
+tslib@^2.0.0, tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0:
version "2.8.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -10300,7 +10734,7 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
-typescript@>=4.9.5, typescript@~5.6.2:
+typescript@~5.6.2:
version "5.6.3"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz"
integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==
@@ -10435,7 +10869,7 @@ universalify@^2.0.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz"
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
-unpipe@~1.0.0, unpipe@1.0.0:
+unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@@ -10489,6 +10923,11 @@ url-loader@^4.1.1:
mime-types "^2.1.27"
schema-utils "^3.0.0"
+use-sync-external-store@^1.4.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0"
+ integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==
+
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
@@ -10642,6 +11081,18 @@ webpack-dev-middleware@^5.3.4:
range-parser "^1.2.1"
schema-utils "^4.0.0"
+webpack-dev-middleware@^7.4.2:
+ version "7.4.5"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz#d4e8720aa29cb03bc158084a94edb4594e3b7ac0"
+ integrity sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==
+ dependencies:
+ colorette "^2.0.10"
+ memfs "^4.43.1"
+ mime-types "^3.0.1"
+ on-finished "^2.4.1"
+ range-parser "^1.2.1"
+ schema-utils "^4.0.0"
+
webpack-dev-server@^4.15.2:
version "4.15.2"
resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz"
@@ -10678,6 +11129,40 @@ webpack-dev-server@^4.15.2:
webpack-dev-middleware "^5.3.4"
ws "^8.13.0"
+webpack-dev-server@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz#96a143d50c58fef0c79107e61df911728d7ceb39"
+ integrity sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==
+ dependencies:
+ "@types/bonjour" "^3.5.13"
+ "@types/connect-history-api-fallback" "^1.5.4"
+ "@types/express" "^4.17.21"
+ "@types/express-serve-static-core" "^4.17.21"
+ "@types/serve-index" "^1.9.4"
+ "@types/serve-static" "^1.15.5"
+ "@types/sockjs" "^0.3.36"
+ "@types/ws" "^8.5.10"
+ ansi-html-community "^0.0.8"
+ bonjour-service "^1.2.1"
+ chokidar "^3.6.0"
+ colorette "^2.0.10"
+ compression "^1.7.4"
+ connect-history-api-fallback "^2.0.0"
+ express "^4.21.2"
+ graceful-fs "^4.2.6"
+ http-proxy-middleware "^2.0.9"
+ ipaddr.js "^2.1.0"
+ launch-editor "^2.6.1"
+ open "^10.0.3"
+ p-retry "^6.2.0"
+ schema-utils "^4.2.0"
+ selfsigned "^2.4.1"
+ serve-index "^1.9.1"
+ sockjs "^0.3.24"
+ spdy "^4.0.2"
+ webpack-dev-middleware "^7.4.2"
+ ws "^8.18.0"
+
webpack-merge@^5.9.0:
version "5.10.0"
resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz"
@@ -10701,7 +11186,7 @@ webpack-sources@^3.3.3:
resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz"
integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==
-"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.88.1, webpack@^5.95.0, "webpack@>=4.41.1 || 5.x", webpack@>=5, "webpack@3 || 4 || 5":
+webpack@^5.88.1, webpack@^5.95.0:
version "5.101.3"
resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz"
integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==
@@ -10746,7 +11231,7 @@ webpackbar@^6.0.1:
std-env "^3.7.0"
wrap-ansi "^7.0.0"
-websocket-driver@^0.7.4, websocket-driver@>=0.5.1:
+websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
version "0.7.4"
resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
@@ -10948,7 +11433,7 @@ workbox-navigation-preload@7.3.0:
dependencies:
workbox-core "7.3.0"
-workbox-precaching@^7.0.0, workbox-precaching@7.3.0:
+workbox-precaching@7.3.0, workbox-precaching@^7.0.0:
version "7.3.0"
resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz"
integrity sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==
@@ -11003,7 +11488,7 @@ workbox-sw@7.3.0:
resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz"
integrity sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==
-workbox-window@^7.0.0, workbox-window@7.3.0:
+workbox-window@7.3.0, workbox-window@^7.0.0:
version "7.3.0"
resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz"
integrity sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==
@@ -11049,11 +11534,18 @@ ws@^7.3.1:
resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
-ws@^8.13.0:
+ws@^8.13.0, ws@^8.18.0:
version "8.18.3"
resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz"
integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==
+wsl-utils@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab"
+ integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==
+ dependencies:
+ is-wsl "^3.1.0"
+
xdg-basedir@^5.0.1, xdg-basedir@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz"
@@ -11076,6 +11568,11 @@ yocto-queue@^1.0.0:
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz"
integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==
+zod@^4.1.8:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.11.tgz#4aab62f76cfd45e6c6166519ba31b2ea019f75f5"
+ integrity sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==
+
zwitch@^2.0.0:
version "2.0.4"
resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz"