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["📥 RequestReceived
Richiesta SCADA, RecipeChangeRequest / RecipeIndexRequest"] + AckSent["✅ AckSent
ACK inviato a SCADA"] + WaitingForHMI["🧑‍🔧 WaitingForHMI
Popup HMI operatore"] + ProcessingAccepted["🟩 Accepted
RecipeChangeOK (reset dopo 2s)"] + ProcessingRejected["❌ Rejected
RecipeChangeReject (reset dopo 2s)"] + Postponed["⏸️ Postponed
RecipeChangePostpone (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["📥 RequestReceived
Richiesta SCADA, ProductionChangeRequest / ProductionCodeRequest"] + AckSent["✅ AckSent
ACK inviato a SCADA"] + WaitingForHMI["🧑‍🔧 WaitingForHMI
Popup HMI operatore"] + ProcessingAccepted["🟩 Accepted
ProductionChangeOK (reset dopo 2s)"] + ProcessingRejected["❌ Rejected
ProductionChangeReject (reset dopo 2s)"] + Postponed["⏸️ Postponed
ProductionChangePostpone (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["📥 RequestReceived
RecipeChangeRequest / RecipeIndexRequest"] + AckSent["✅ AckSent
ACK inviato a SCADA"] + WaitingForHMI["🧑‍🔧 WaitingForHMI
Popup HMI operatore"] + Accepted["🟩 Accepted
RecipeChangeOK (reset 2s)"] + Rejected["❌ Rejected
RecipeChangeReject (reset 2s)"] + Postponed["⏸️ Postponed
RecipeChangePostpone (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["📦 Production
Totali/Scarti/Buoni"] + Rejects["❌ Rejects
Motivi Scarto"] + Percentages["📊 Percentages
Percentuali"] + ActualSpeed["🚀 ActualSpeed
Pacchi/min attuale"] + ReferenceSpeed["🎯 ReferenceSpeed
Da 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. + + +
+Configurazione Porta DEV2 in Separation Mode + +:::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. + +
+Associazione Agente a Interfaccia DEV2 + +:::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)

+
  1. Apri PowerShell come Amministratore.
  2. +
  3. Esegui il comando seguente per installare tutti i componenti di Hyper-V:
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -All -NoRestart
    +
    +
  4. +
  5. Al termine, riavvia il computer per completare l’installazione.
  6. +
+

Rimozione di versioni precedenti o corrotte (Opzionale)

+

Se sospetti un’installazione problematica, puoi eseguire una pulizia completa.

+
  1. Apri PowerShell come Amministratore.
  2. +
  3. Esegui il comando per disabilitare e rimuovere tutte le funzionalità di Hyper-V:
    Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart
    +
    +
  4. +
+

:::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.

+
  1. Apri PowerShell come Amministratore.
  2. +
  3. Elenca gli switch esistenti per verificarli:
    +powershell Get-VMSwitch
  4. +
  5. Assicurati che tutte le VM siano spente.
  6. +
  7. Rimuovi tutti gli switch con un singolo comando:
    Get-VMSwitch | Remove-VMSwitch -Force
    +
    +
  8. +
+

Creazione dei nuovi Commutatori

+
  1. Apri Gestione Hyper-V dal menu Start.
  2. +
  3. Nel pannello Azioni a destra, clicca su Gestione commutatori virtuali….
  4. +
+
    +
  • 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

+
  1. Copia l’intera cartella VMScript in una directory locale (es. Documenti).
  2. +
  3. Apri PowerShell 7 come Amministratore.
  4. +
  5. Naviga nella cartella dove hai copiato lo script:
    cd ~\Documenti\VMScript
    +
    +
  6. +
+

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

+
  1. Accesso alla rete aziendale (per raggiungere lo script sulla condivisione).
  2. +
  3. Un Personal Access Token (PAT) di GitLab con permessi di lettura sul repository.
  4. +
+

:::

+

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.

+
  1. Apri una console Windows PowerShell. Non è necessario aprirla come Amministratore.

    +
  2. +
  3. 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:

    +
  4. +
+
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.

+
  1. Apri Windows Terminal.
  2. +
  3. Vai su Impostazioni (o Ctrl + ,).
  4. +
  5. 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’ }} />
  6. +
  7. Salva le modifiche.
  8. +
+
+

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 VariabileTipo DatiDescrizione
IsRunningBOOLFlag VERO quando la macchina è in uno stato di marcia.
IsStoppedBOOLFlag VERO quando la macchina è ferma.
IsInEmergencyBOOLFlag VERO quando un’emergenza è attiva.
IsWaitingDownstreamBOOLFlag VERO quando in attesa di un segnale dalla macchina a valle.
IsWaitingUpstreamBOOLFlag VERO quando in attesa di un prodotto dalla macchina a monte.
IsAlarmActiveBOOLFlag VERO quando un qualsiasi allarme macchina è attivo.
+

⚙️ Flag di Handshake e Controllo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome VariabileTipo DatiDescrizione
AckChangeRecipeBOOLConferma (Ack) del PLC a un comando di cambio ricetta.
RemoteControlEnableBOOLFlag che indica se il controllo remoto da SCADA è abilitato.
ProductionChangeOKBOOLConferma del PLC che il cambio produzione è avvenuto con successo.
RecipeChangeOKBOOLConferma del PLC che il cambio ricetta è avvenuto con successo.
RecipeChangeRejectBOOLFlag che indica che il cambio ricetta è stato rifiutato dall’Operatore.
RecipeChangePostponeBOOLFlag che indica che il cambio ricetta è stato rimandato dall’Operatore.
MesCommunicationFaultBOOLFlag VERO se c’è un errore di comunicazione con il MES.
+

⚙️ Informazioni Ricetta e Produzione

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome VariabileTipo DatiDescrizione
ActualRecipeIndexDINTIndice della ricetta attualmente attiva.
ActualRecipeNameSTRING[38]Nome della ricetta attualmente attiva.
ActualProductionInfoSTRING[38]Descrizione del lotto/ordine di produzione attuale.
ActualProductionCodeDINTCodice del lotto/ordine di produzione attuale.
MachineStatusDINTCodice di stato generale della macchina (come da visualizzazione HMI).
+

⚙️ Watchdog di Comunicazione

+ + + + + + + + + + + + + + + +
Nome VariabileTipo DatiDescrizione
PlcWatchdogDINTContatore di watchdog del PLC inviato allo SCADA.
+

⚙️ Strutture Dati di Analisi

+ + + + + + + + + + + + + + + + + + + + +
Nome VariabileTipo DatiDescrizione
TimeAnalyticsST_MachineTimersStatistiche dettagliate basate sul tempo.
ProductionAnalyticsST_ProductionAnalyticsStatistiche dettagliate basate sulla produzione.
+

⚙️ Dati Allarmi

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome VariabileTipo DatiDescrizione
AlarmAnalyticsARRAY[0..1399] OF ST_AlarmAnalyticsDati analitici per ogni singolo allarme.
TopAlarms_ByFrequencyARRAY[0..99] OF ST_TopAlarmEntryClassifica degli allarmi più frequenti.
TopAlarms_ByDowntimeARRAY[0..99] OF ST_TopAlarmEntryClassifica degli allarmi che causano più downtime.
Alarms_PackedARRAY[0..80] OF WORDArray 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 VariabileTipo DatiDescrizione
ProductionChangeRequestBOOLComando da SCADA per richiedere un cambio produzione/lotto.
RecipeChangeRequestBOOLComando da SCADA per richiedere un cambio ricetta.
ResetCountersBOOLComando da SCADA per resettare le statistiche.
RemoteStopMachineBOOLComando da SCADA per arrestare la macchina da remoto.
+

⚙️ Richieste Dati Ricetta e Produzione

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome VariabileTipo DatiDescrizione
RequestRecipeIndexDINTIndice della ricetta richiesta.
RequestProductionQuantityDINTQuantità di produzione richiesta.
RequestProductionCodeDINTCodice del lotto/ordine di produzione richiesto.
RequestProductionInfoSTRING[38]Descrizione del lotto/ordine richiesta.
+

⚙️ Watchdog di Comunicazione

+ + + + + + + + + + + + + + + +
Nome VariabileTipo DatiDescrizione
ScadaWatchdogDINTContatore 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 VariabileTipo DatiDescrizione
HoursDINTLe ore totali accumulate per lo stato.
MinutesDINTI minuti totali accumulati per lo stato (0-59).
PercentageDINTLa 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 VariabileTipo DatiDescrizione
TotalTimeST_StateStatisticsContiene il tempo totale di monitoraggio. La percentuale di questo stato è sempre 100%.
RunTimeST_StateStatisticsContiene i dati relativi al tempo in cui la macchina è stata in marcia (Running).
StopTimeST_StateStatisticsContiene i dati relativi al tempo in cui la macchina è stata in arresto (Stopped).
EmergencyTimeST_StateStatisticsContiene i dati relativi al tempo in cui la macchina è stata in emergenza (Emergency).
DownstreamTimeST_StateStatisticsContiene i dati relativi al tempo passato in attesa di un segnale dalla macchina a valle.
UpstreamTimeST_StateStatisticsContiene 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 VariabileTipo DatiDescrizione
StateBOOLStato attuale dell’allarme (VERO = Attivo).
CountDINTConteggio totale delle occorrenze (Frequenza) di questo allarme.
TotalActiveTime_msLINTTempo totale, in millisecondi, in cui questo allarme è rimasto attivo.
MTTR_secLREALTempo Medio di Riparazione (Mean Time To Repair), in secondi. Indica il tempo medio necessario per risolvere l’allarme.
MTBF_hLREALTempo 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 VariabileTipo DatiDescrizione
AlarmIdDINTL’ID numerico dell’allarme. Un valore di -1 indica uno slot vuoto nella classifica.
ValueLREALIl 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 VariabileTipo DatiDescrizione
AlarmAnalyticsARRAY[0..1399] OF ST_AlarmAnalyticsUn array che contiene i dati analitici dettagliati per ogni singolo allarme.
TopAlarms_ByFrequencyARRAY[0..99] OF ST_TopAlarmEntryLa classifica dei 100 allarmi più frequenti.
TopAlarms_ByDowntimeARRAY[0..99] OF ST_TopAlarmEntryLa classifica dei 100 allarmi che hanno causato il maggior tempo di fermo.
Alarms_PackedARRAY[0..80] OF WORDUn 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 VariabileTipo DatiDescrizione
Products_In_TotalDINTContatore totale dei prodotti in ingresso alla macchina.
Products_Out_GoodDINTContatore totale dei prodotti in uscita conformi (buoni).
Products_Out_RejectedDINTContatore 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 VariabileTipo DatiDescrizione
Reject_EmptyPacketsDINTScarto per buste vuote.
Reject_DoublePacketsDINTScarto per buste doppie.
Reject_CrushedByCrimperDINTScarto per prodotto schiacciato dalle ganasce saldanti.
Reject_ChainPacketsDINTScarto per problemi legati alla catena di trasporto.
Reject_PictureCardMissPacketsDINTScarto per mancata inserzione della figurina/card.
Reject_CameraNoGoodPPacketsDINTScarto 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 VariabileTipo DatiDescrizione
Perc_Good_vs_InDINT% di prodotti buoni rispetto al totale entrato.
Perc_RejectedEmptyPacketsDINTRipartizione % degli scarti per “Buste Vuote”.
Perc_RejectedDoublePacketsDINTRipartizione % degli scarti per “Buste Doppie”.
Perc_RejectedCrushedByCrimperDINTRipartizione % degli scarti per “Schiacciamento Ganasce”.
Perc_RejectedChainPacketsDINTRipartizione % degli scarti per “Problemi Catena”.
Perc_RejectedPictureCardMissPacketsDINTRipartizione % degli scarti per “Mancata Figurina”.
Perc_RejectedCameraNoGoodPPacketsDINTRipartizione % 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 VariabileTipo DatiDescrizione
ProductionST_Flowpack_ProductionCountsLa struttura che contiene i conteggi di produzione IN/OUT.
RejectsST_Flowpack_RejectReasonsLa struttura che contiene i dettagli delle cause di scarto.
PercentagesST_Flowpack_PercentagesLa 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 VariabileTipo DatiDescrizione
— Conteggi Grezzi —
PiecesEnteredDINTPezzi totali entrati sull’impilatore del canale.
Pieces_StackedDINTProdotti totali impilati da questo canale.
Stacks_SentDINTPile totali inviate con successo da questo canale.
StacksRejectedDINTPile totali scartate da questo canale.
Rejects_TrapdoorDINTPezzi scartati alla botola per questo canale (è il totale degli scarti).
Rejects_RecipeMismatchDINTPezzi scartati a causa di ricetta non conforme.
Rejects_JamDINTPezzi scartati a causa di un inceppo nell’impilatore.
Rejects_ClumpDINTPezzi scartati a causa di ammassi o accumuli.
— Percentuali Calcolate (per canale) —
Perc_Rejected_TrapdoorDINT% di pezzi scartati alla botola rispetto al totale entrato.
Perc_Pieces_StackedDINT% di pezzi impilati rispetto al totale entrato.
Perc_Stacks_SentDINT% di pile inviate rispetto al totale pile gestite (inviate + scartate).
Perc_Stacks_RejectedDINT% di pile scartate rispetto al totale pile gestite.
Perc_Reject_RecipeMismatchDINTRipartizione % degli scarti per “Ricetta non conforme”.
Perc_Reject_ClumpDINTRipartizione % degli scarti per “Ammassi”.
Perc_Reject_JamDINTRipartizione % 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 VariabileTipo DatiDescrizione
IncomingRanksDINTRanghi totali inseriti sulla linea di distribuzione.
RanksDischarged_Module1DINTRanghi totali scaricati verso la Flowpack 1.
RanksDischarged_Module2DINTRanghi totali scaricati verso la Flowpack 2.
RanksDischarged_Module3DINTRanghi totali scaricati verso la Flowpack 3.
RanksDischarged_BufferDINTRanghi totali scaricati verso il nastro buffer.
TotalStacksSentDINTPile totali inviate ai moduli a valle.
StacksOnLastRankDINTNumero di pile presenti sull’ultimo rango caricato.
TotalStacksOnStackersDINTNumero istantaneo di pile fisicamente presenti su tutti gli impilatori.
TotalStacksRejectedDINTNumero totale di pile scartate.
TotalProductsEnteredDINTProdotti totali “equivalenti” entrati nella linea.
TotalRejectedProducts_TrapdoorDINTProdotti totali scartati alla botola.
GrandTotalProductsHandledDINTSomma 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 VariabileTipo DatiDescrizione
ChannelsARRAY[0..4] OF ST_ChannelDataUn array che contiene i dati dettagliati per ognuno dei 5 canali.
TotalsST_ProductionTotalsLa 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:

+
  1. Abilitazione (HMI): L’operatore abilita il controllo remoto sull’HMI.

    +
      +
    • HMI -> PLC: Imposta MachineAnalytics.HMI_Interface.RemoteControlEn = TRUE.
    • +
    +
  2. +
  3. 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.
    • +
    +
  4. +
  5. Ack a SCADA (PLC): Il PLC valida la richiesta. Se è corretta, risponde immediatamente:

    +
      +
    • PLC -> SCADA: Invia la conferma di ricezione (Egress.AckChangeRecipe = TRUE).
    • +
    +
  6. +
  7. 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.
    • +
    +
  8. +
  9. 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.

    +
  10. +
  11. Attivazione Pop-up (PLC): Il PLC attiva il flag per l’apertura del pop-up sull’HMI.

    +
      +
    • PLC -> HMI: Imposta HMI_Interface.AckChangeRecipeToHMI = TRUE.
    • +
    +
  12. +
  13. Visualizzazione (HMI): L’HMI mostra il pop-up di conferma all’operatore con i dati della ricetta richiesta.

    +
  14. +
  15. 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.
    • +
    +
  16. +
+
+

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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+

id: flusso-comunicazione1
+sidebar_position: 6
+title: Flusso di Scambio Dati (PLC-HMI-SCADA)
+sidebar_label: Flusso di Comunicazione
+pagination_prev: null
+hide_table_of_contents: true

+

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.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TemplateDescrizione
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:

+
  1. Fai clic destro sul contenitore in cui desideri aggiungerlo (può essere una Panel, una GroupBox, ecc.).
  2. +
  3. Seleziona:
    +New > tpTemplates > tpButtons > Navigation > <tipo desiderato>
  4. +
+

📷 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:

+
  1. Vai nel menu delle proprietà a sinistra
  2. +
  3. Trova il parametro Panel
  4. +
  5. Seleziona la pagina a cui vuoi che il pulsante navighi
  6. +
+

📷 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:

+
  1. Fai clic destro sulla cartella Screens o su una delle sue sottocartelle.
  2. +
  3. Seleziona:
    +New > All > User interface > tpTemplates > tpScreens > tpBaseScreen
  4. +
+

<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:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ParametroDescrizione
PageNumberIl numero identificativo univoco della pagina. Serve sia alla documentazione che alla navigazione gestita da PLC. Deve essere univoco!
PageNameIl 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.
PageTypeDefinisce il tipo di pagina tramite un enumeratore. Questo valore influisce sul colore dell’header e sulla logica di accesso.
FatherIndica 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:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValoreDisplay Name
0Home
1Menù
2Allarmi
3Modalità operativa
4Ricette
5Abilitazioni
6–7–Reserved–
8Masse saldanti
9–Reserved–
10Mini setup
11Full setup
12Diagnostica
13–19–Reserved–
20Altro
+
+

⚠️ 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
typeTipo generico della scheda (es. IB8, OB8, IT2I) che indica la funzione o famiglia della scheda.
nodeTypeNome del template grafico usato per rappresentare la scheda nell’interfaccia utente.
iODirectionDirezione IO, indica se la scheda è di tipo input (“I”) o output (“O”).
colorsDefinizione 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.

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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.

+

Remarks

+

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.

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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.

+ +

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()

+

Remarks

+

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
+>

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

Class InformationModelExtensions

+

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()

+

Remarks

+

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

+

CreateDictionary(string)

+

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.

+

Remarks

+

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.

+

Remarks

+

Questo metodo non esegue il lookup della traduzione, ma crea un riferimento che può essere utilizzato nelle proprietà localizzabili.

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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()
+
+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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

+

FilterOptionsByLetters(string, string[])

+

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);
+// selected = [ "Flowpack", "Shrinkwrapper" ]
+
+

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.

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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.

+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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

+ + + + + + + + + + + + + + + + + + + + + +
ElementoDescrizione
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

+
  1. Alla partenza, recupera le variabili Query e Enabled, e il riferimento al database SQLite.
  2. +
  3. Si iscrive agli eventi di cambio delle variabili Query e Enabled.
  4. +
  5. Quando Query o Enabled cambiano, viene eseguita la query SQL se Enabled è true.
  6. +
  7. Il primo record risultato viene scritto sulle variabili di output, fino a un massimo di variabili disponibili.
  8. +
+
+

💡 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 variabileTipo suggeritoDescrizione
[0]StringPrima colonna risultato query
[1]Int32Seconda colonna risultato query
[2]FloatTerza 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

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MetodoDescrizione
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

+ + + + + + + + + + + + + + + + + + + + + +
ElementoDescrizione
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:

+
  1. Recupera il folder CommDrivers contenente i tag strutturati degli IO rack.
  2. +
  3. Pulisce il layout UI IONodesDisplay per prepararlo a contenere i nuovi pannelli.
  4. +
  5. Costruisce un array con i nomi dei tag attesi (AB:1734_{slot}SLOT:I:0 da 1 a 64).
  6. +
  7. Filtra i nodi di tipo TagStructureType corrispondenti ai nomi attesi.
  8. +
  9. Per ciascun nodo valido, richiama il metodo getRemoteIONodes per creare il pannello remoto.
  10. +
+
+
+

getRemoteIONodes(UAReference r)

+
+

Descrizione:

+
  1. Ottiene il nodo TagStructure di destinazione dal riferimento passato.
  2. +
  3. Estrae il nome del dispositivo remoto (remoteIOName).
  4. +
  5. Crea un pannello (PanelType) figlio del pannello RemoteIO, con nome uguale al dispositivo remoto.
  6. +
  7. Imposta la variabile RemoteIOName del pannello appena creato con il nome del dispositivo remoto.
  8. +
  9. Aggiunge il pannello al layout IONodesDisplay.
  10. +
  11. Effettua una pausa di 250ms (necessaria per problemi di sincronizzazione con dispositivi Rockwell).
  12. +
  13. Invoca il metodo Populate() della NetLogic PopulateIORack contenuta all’interno del pannello per popolare i dettagli.
  14. +
+
+
+

⚠️ 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

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ElementoDescrizione
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

+ + + + + + + + + + + + + +
MetodoDescrizione
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

+
  1. Recupera il percorso completo della cartella allarmi tramite la variabile AlarmFolder.
  2. +
  3. Controlla che la cartella esista; altrimenti lancia un’eccezione con messaggio in dialetto veneto.
  4. +
  5. Cerca tutti i file .xlsx nella cartella specificata.
  6. +
  7. Crea un dizionario che mappa il nome del file (senza estensione) al percorso completo.
  8. +
  9. Invoca uno script che presenta una lista di opzioni all’utente per selezionare i dizionari da importare.
  10. +
  11. Per ogni dizionario selezionato, richiama Owner.ImportAlarmsInsideOwner per importare i dati nel progetto.
  12. +
+
+

💡 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

+ + + + + + + + + + + + + +
MetodoDescrizione
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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MetodoDescrizioneNote
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:

+
  1. Cerca nelle cartelle di comunicazione i tag corrispondenti al tipo specificato (es. stStandardAxis).
  2. +
  3. Per ogni tag, crea (o trova) un modello corrispondente nella cartella modelli.
  4. +
  5. Imposta un nome leggibile e associa un puntatore al tag originale.
  6. +
+

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)
  • +
+
+
+

GenerateAllButtons()

+
+

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.

+
+
+

GenerateAxisButtons()

+
+

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.

+
+
+

GeneratePSUButtons()

+
+

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.

+
+
+

GenerateSafetyButtons()

+
+

Descrizione:
+Crea i pulsanti di navigazione per tutti i modelli di sicurezza, puntando alla schermata _830_DiagSafety.

+
+
+

ExtractReadableName(string variableName)

+
+

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.

+
+
+

CreateModel(TagStructure tag, Type modelType, Folder modelsFolder)

+
+

Descrizione:
+Crea un nuovo oggetto modello con il nome del tag e del tipo specificato, e lo inserisce nella cartella dei modelli.

+
+
+

PopulateModel(IUAObject model, TagStructure tag, string pointerVariableName)

+
+

Descrizione:
+Riempie il modello con un nome leggibile e imposta la variabile puntatore con il NodeId del tag originale.

+
+
+

CreateButton(string browseName, ScreenType diagnosticScreen)

+
+

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

+

🔝 Header superiore

+
    +
  • 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.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EtichettaFunzione
🏠 HomeDashboard principale
⚠️ AllarmiVisualizzazione e gestione degli allarmi
⚙️ Modalità operativaSelezione delle modalità macchina (es. manuale, automatico)
♨️ Masse saldantiConfigurazione delle temperature
🔑 AbilitazioniGestione delle abilitazioni dei dispositivi collegati
🛠️ Mini-SetupAccesso ai parametri di ricetta della macchina
🧩 Menù avanzatoAccesso 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:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponenteDescrizione
🧠 PLCConfigurazioni differenziate per taglia macchina
🖥 HMISupporto a più pannelli (PanelView, OptixPanel, ecc.)
🦺 SicurezzaPilz Safety con modelli rotativi o longitudinali
📋 RicetteGestione centralizzata tramite file Recipes.yaml
🔐 AccessiSistema utenti, ruoli e sicurezza multilivello
+
+

🧭 Come iniziare

+
  1. Clona la repository
  2. +
+
git clone https://gitlab.tecnopackspa.it/prototipi/rockwell/flowpack.git
+
+
  1. Apri il progetto desiderato
  2. +
+
    +
  • 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.

      +
      +
    • +
    +
  • +
+
  1. Consulta la documentazione in Docs/
  2. +
+
    +
  • 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:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoriaStatoLink
🌀 Flowpack🚧 In sviluppoVai ›
🧩 Linea a Moduli🚧 In sviluppoVai ›
🤖 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
  • +
+
+

🔧 Optix

+

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

+
+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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️

+
  1. Prima di iniziare, accedi all’interfaccia web del SiteManager.
  2. +
+

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.

+
+Configurazione Porta DEV2 in Separation Mode +

:::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.

+
+Associazione Agente a Interfaccia DEV2 +

:::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 .   # aggiunge tutti i file modificati
+✅ 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>   # spostarsi sul 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
+# Esempio .gitignore
+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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComandoDescrizioneEsempio
git add <file>Aggiunge file allo staginggit add main.py
git add .
✏️ git commit -m "msg"Salva le modifiche nello storicogit commit -m "Aggiunto modulo login"
🧹 git reset <file>Rimuove file dallo staginggit reset main.py
🧩 git checkout -- <file>Annulla modifiche non committategit checkout -- main.py
+
+

🔵 Branch & Merge

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComandoDescrizioneEsempio
🌿 git branch <nome>Crea un nuovo branchgit branch feature/login
🌿 git checkout <branch>Passa a un branch esistentegit checkout feature/login
🌿 git checkout -b <branch>Crea e passa a un nuovo branchgit checkout -b feature/signup
🔄 git merge <branch>Unisce un branch nel branch correntegit merge feature/login
+
+

🟠 Remoto

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComandoDescrizioneEsempio
🔗 git remote add origin <URL>Collega repository locale a remotogit remote add origin https://github.com/user/repo.git
🚀 git push origin <branch>Invia commit al repository remotogit push origin main
⬇️ git pull origin <branch>Scarica modifiche dal remotogit pull origin main
🔍 git remote -vMostra repository remoti collegatigit remote -v
+
+

🟣 Info & Config

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComandoDescrizioneEsempio
📜 git logMostra cronologia dei commitgit log
git log --oneline
⚙️ git config --global user.name "Nome"Imposta nome autoregit config --global user.name "Mario Rossi"
⚙️ git config --global user.email "email"Imposta email autoregit config --global user.email "mario@example.com"
📂 git initInizializza un repository localegit 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

+
+ + + +
+ + + + +
+ + +
+

On This Page

+ +
+ +
+
+
+ +
+ + + + + + + + + + + + \ 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"