@industry-theme/principal-view-panels 0.4.46 → 0.4.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/panels.bundle.js +298 -298
  2. package/dist/panels.bundle.js.map +1 -1
  3. package/package.json +2 -2
  4. package/dist/adapters/PanelFileSystemAdapter.d.ts +0 -82
  5. package/dist/adapters/PanelFileSystemAdapter.d.ts.map +0 -1
  6. package/dist/demo/DemoApp.d.ts +0 -13
  7. package/dist/demo/DemoApp.d.ts.map +0 -1
  8. package/dist/demo/DemoApp.stories.d.ts +0 -71
  9. package/dist/demo/DemoApp.stories.d.ts.map +0 -1
  10. package/dist/demo/api/browser.d.ts +0 -15
  11. package/dist/demo/api/browser.d.ts.map +0 -1
  12. package/dist/demo/api/handlers.d.ts +0 -8
  13. package/dist/demo/api/handlers.d.ts.map +0 -1
  14. package/dist/demo/components/BookDetails/BookDetails.d.ts +0 -16
  15. package/dist/demo/components/BookDetails/BookDetails.d.ts.map +0 -1
  16. package/dist/demo/components/CardCatalog/CardCatalog.d.ts +0 -16
  17. package/dist/demo/components/CardCatalog/CardCatalog.d.ts.map +0 -1
  18. package/dist/demo/components/ReadingRoom/ReadingRoom.d.ts +0 -17
  19. package/dist/demo/components/ReadingRoom/ReadingRoom.d.ts.map +0 -1
  20. package/dist/demo/data/mockData.d.ts +0 -33
  21. package/dist/demo/data/mockData.d.ts.map +0 -1
  22. package/dist/demo/data/types.d.ts +0 -166
  23. package/dist/demo/data/types.d.ts.map +0 -1
  24. package/dist/index.d.ts +0 -63
  25. package/dist/index.d.ts.map +0 -1
  26. package/dist/mocks/panelContext.d.ts +0 -31
  27. package/dist/mocks/panelContext.d.ts.map +0 -1
  28. package/dist/mocks/vvfConfigs.d.ts +0 -32
  29. package/dist/mocks/vvfConfigs.d.ts.map +0 -1
  30. package/dist/panels/AgentMonitoringGapExplainerPanel.d.ts +0 -6
  31. package/dist/panels/AgentMonitoringGapExplainerPanel.d.ts.map +0 -1
  32. package/dist/panels/AgentMonitoringGapExplainerPanel.stories.d.ts +0 -12
  33. package/dist/panels/AgentMonitoringGapExplainerPanel.stories.d.ts.map +0 -1
  34. package/dist/panels/BookAnalogyExplainerPanel.d.ts +0 -7
  35. package/dist/panels/BookAnalogyExplainerPanel.d.ts.map +0 -1
  36. package/dist/panels/BookAnalogyExplainerPanel.stories.d.ts +0 -33
  37. package/dist/panels/BookAnalogyExplainerPanel.stories.d.ts.map +0 -1
  38. package/dist/panels/CanvasDetailPanel.d.ts +0 -58
  39. package/dist/panels/CanvasDetailPanel.d.ts.map +0 -1
  40. package/dist/panels/CanvasDetailPanel.stories.d.ts +0 -105
  41. package/dist/panels/CanvasDetailPanel.stories.d.ts.map +0 -1
  42. package/dist/panels/CanvasEditorPanel.d.ts +0 -29
  43. package/dist/panels/CanvasEditorPanel.d.ts.map +0 -1
  44. package/dist/panels/CanvasEditorPanel.stories.d.ts +0 -32
  45. package/dist/panels/CanvasEditorPanel.stories.d.ts.map +0 -1
  46. package/dist/panels/CanvasListPanel.d.ts +0 -13
  47. package/dist/panels/CanvasListPanel.d.ts.map +0 -1
  48. package/dist/panels/CanvasListPanel.stories.d.ts +0 -62
  49. package/dist/panels/CanvasListPanel.stories.d.ts.map +0 -1
  50. package/dist/panels/CanvasTypesExplainerPanel.d.ts +0 -7
  51. package/dist/panels/CanvasTypesExplainerPanel.d.ts.map +0 -1
  52. package/dist/panels/CanvasTypesExplainerPanel.stories.d.ts +0 -33
  53. package/dist/panels/CanvasTypesExplainerPanel.stories.d.ts.map +0 -1
  54. package/dist/panels/ChangeImpactAnalysisExplainerPanel.d.ts +0 -7
  55. package/dist/panels/ChangeImpactAnalysisExplainerPanel.d.ts.map +0 -1
  56. package/dist/panels/ChangeImpactAnalysisExplainerPanel.stories.d.ts +0 -33
  57. package/dist/panels/ChangeImpactAnalysisExplainerPanel.stories.d.ts.map +0 -1
  58. package/dist/panels/ControlTowerIntegration.stories.d.ts +0 -12
  59. package/dist/panels/ControlTowerIntegration.stories.d.ts.map +0 -1
  60. package/dist/panels/EventControllerPanel.d.ts +0 -32
  61. package/dist/panels/EventControllerPanel.d.ts.map +0 -1
  62. package/dist/panels/EventControllerPanel.stories.d.ts +0 -53
  63. package/dist/panels/EventControllerPanel.stories.d.ts.map +0 -1
  64. package/dist/panels/EventRecorderPanel.d.ts +0 -54
  65. package/dist/panels/EventRecorderPanel.d.ts.map +0 -1
  66. package/dist/panels/EventRecorderPanel.stories.d.ts +0 -12
  67. package/dist/panels/EventRecorderPanel.stories.d.ts.map +0 -1
  68. package/dist/panels/EventRecordingIntegration.stories.d.ts +0 -21
  69. package/dist/panels/EventRecordingIntegration.stories.d.ts.map +0 -1
  70. package/dist/panels/HierarchicalCanvasCompositionExplainerPanel.d.ts +0 -7
  71. package/dist/panels/HierarchicalCanvasCompositionExplainerPanel.d.ts.map +0 -1
  72. package/dist/panels/HierarchicalCanvasCompositionExplainerPanel.stories.d.ts +0 -33
  73. package/dist/panels/HierarchicalCanvasCompositionExplainerPanel.stories.d.ts.map +0 -1
  74. package/dist/panels/LibraryAnchoringExplainerPanel.d.ts +0 -7
  75. package/dist/panels/LibraryAnchoringExplainerPanel.d.ts.map +0 -1
  76. package/dist/panels/LibraryAnchoringExplainerPanel.stories.d.ts +0 -33
  77. package/dist/panels/LibraryAnchoringExplainerPanel.stories.d.ts.map +0 -1
  78. package/dist/panels/MonorepoComposabilityExplainerPanel.d.ts +0 -7
  79. package/dist/panels/MonorepoComposabilityExplainerPanel.d.ts.map +0 -1
  80. package/dist/panels/MonorepoComposabilityExplainerPanel.stories.d.ts +0 -33
  81. package/dist/panels/MonorepoComposabilityExplainerPanel.stories.d.ts.map +0 -1
  82. package/dist/panels/MultipleCanvasViewsExplainerPanel.d.ts +0 -7
  83. package/dist/panels/MultipleCanvasViewsExplainerPanel.d.ts.map +0 -1
  84. package/dist/panels/MultipleCanvasViewsExplainerPanel.stories.d.ts +0 -33
  85. package/dist/panels/MultipleCanvasViewsExplainerPanel.stories.d.ts.map +0 -1
  86. package/dist/panels/NarrativeExplainerPanel.d.ts +0 -7
  87. package/dist/panels/NarrativeExplainerPanel.d.ts.map +0 -1
  88. package/dist/panels/NarrativeExplainerPanel.stories.d.ts +0 -23
  89. package/dist/panels/NarrativeExplainerPanel.stories.d.ts.map +0 -1
  90. package/dist/panels/ProductionDebuggingExplainerPanel.d.ts +0 -7
  91. package/dist/panels/ProductionDebuggingExplainerPanel.d.ts.map +0 -1
  92. package/dist/panels/ProductionDebuggingExplainerPanel.stories.d.ts +0 -33
  93. package/dist/panels/ProductionDebuggingExplainerPanel.stories.d.ts.map +0 -1
  94. package/dist/panels/RuntimeValidationExplainerPanel.d.ts +0 -7
  95. package/dist/panels/RuntimeValidationExplainerPanel.d.ts.map +0 -1
  96. package/dist/panels/RuntimeValidationExplainerPanel.stories.d.ts +0 -33
  97. package/dist/panels/RuntimeValidationExplainerPanel.stories.d.ts.map +0 -1
  98. package/dist/panels/ScenarioEnumerationExplainerPanel.d.ts +0 -7
  99. package/dist/panels/ScenarioEnumerationExplainerPanel.d.ts.map +0 -1
  100. package/dist/panels/ScenarioEnumerationExplainerPanel.stories.d.ts +0 -33
  101. package/dist/panels/ScenarioEnumerationExplainerPanel.stories.d.ts.map +0 -1
  102. package/dist/panels/SkillInstallation.stories.d.ts +0 -45
  103. package/dist/panels/SkillInstallation.stories.d.ts.map +0 -1
  104. package/dist/panels/SystemStoriesSolutionExplainerPanel.d.ts +0 -6
  105. package/dist/panels/SystemStoriesSolutionExplainerPanel.d.ts.map +0 -1
  106. package/dist/panels/SystemStoriesSolutionExplainerPanel.stories.d.ts +0 -12
  107. package/dist/panels/SystemStoriesSolutionExplainerPanel.stories.d.ts.map +0 -1
  108. package/dist/panels/TelemetryCoverageExplainerPanel.d.ts +0 -7
  109. package/dist/panels/TelemetryCoverageExplainerPanel.d.ts.map +0 -1
  110. package/dist/panels/TelemetryCoverageExplainerPanel.stories.d.ts +0 -33
  111. package/dist/panels/TelemetryCoverageExplainerPanel.stories.d.ts.map +0 -1
  112. package/dist/panels/TestVsProductionExplainerPanel.d.ts +0 -7
  113. package/dist/panels/TestVsProductionExplainerPanel.d.ts.map +0 -1
  114. package/dist/panels/TestVsProductionExplainerPanel.stories.d.ts +0 -33
  115. package/dist/panels/TestVsProductionExplainerPanel.stories.d.ts.map +0 -1
  116. package/dist/panels/WhyNowAgentRevolutionExplainerPanel.d.ts +0 -6
  117. package/dist/panels/WhyNowAgentRevolutionExplainerPanel.d.ts.map +0 -1
  118. package/dist/panels/WhyNowAgentRevolutionExplainerPanel.stories.d.ts +0 -12
  119. package/dist/panels/WhyNowAgentRevolutionExplainerPanel.stories.d.ts.map +0 -1
  120. package/dist/panels/canvas-list/components/CanvasCard.d.ts +0 -13
  121. package/dist/panels/canvas-list/components/CanvasCard.d.ts.map +0 -1
  122. package/dist/panels/canvas-list/hooks/useCanvasData.d.ts +0 -18
  123. package/dist/panels/canvas-list/hooks/useCanvasData.d.ts.map +0 -1
  124. package/dist/panels/canvas-list/hooks/useCanvasNarrativeData.d.ts +0 -25
  125. package/dist/panels/canvas-list/hooks/useCanvasNarrativeData.d.ts.map +0 -1
  126. package/dist/panels/execution-viewer/EventNodeMapper.d.ts +0 -46
  127. package/dist/panels/execution-viewer/EventNodeMapper.d.ts.map +0 -1
  128. package/dist/panels/execution-viewer/ExecutionLoader.d.ts +0 -121
  129. package/dist/panels/execution-viewer/ExecutionLoader.d.ts.map +0 -1
  130. package/dist/panels/execution-viewer/ExecutionStats.d.ts +0 -11
  131. package/dist/panels/execution-viewer/ExecutionStats.d.ts.map +0 -1
  132. package/dist/panels/execution-viewer/NarrativeLoader.d.ts +0 -65
  133. package/dist/panels/execution-viewer/NarrativeLoader.d.ts.map +0 -1
  134. package/dist/panels/execution-viewer/NarrativeRenderer.d.ts +0 -25
  135. package/dist/panels/execution-viewer/NarrativeRenderer.d.ts.map +0 -1
  136. package/dist/panels/execution-viewer/NarrativeTemplatePanel.d.ts +0 -13
  137. package/dist/panels/execution-viewer/NarrativeTemplatePanel.d.ts.map +0 -1
  138. package/dist/panels/execution-viewer/ScenarioDetailsPanel.d.ts +0 -60
  139. package/dist/panels/execution-viewer/ScenarioDetailsPanel.d.ts.map +0 -1
  140. package/dist/panels/execution-viewer/narrative-converter.d.ts +0 -44
  141. package/dist/panels/execution-viewer/narrative-converter.d.ts.map +0 -1
  142. package/dist/panels/principal-view/ConfigLoader.d.ts +0 -43
  143. package/dist/panels/principal-view/ConfigLoader.d.ts.map +0 -1
  144. package/dist/panels/principal-view/EmptyStateContent.d.ts +0 -12
  145. package/dist/panels/principal-view/EmptyStateContent.d.ts.map +0 -1
  146. package/dist/panels/principal-view/ErrorStateContent.d.ts +0 -14
  147. package/dist/panels/principal-view/ErrorStateContent.d.ts.map +0 -1
  148. package/dist/stubs/codebase-quality-lenses-stub.d.ts +0 -26
  149. package/dist/stubs/codebase-quality-lenses-stub.d.ts.map +0 -1
  150. package/dist/tools/index.d.ts +0 -32
  151. package/dist/tools/index.d.ts.map +0 -1
  152. package/dist/types/index.d.ts +0 -7
  153. package/dist/types/index.d.ts.map +0 -1
@@ -3,7 +3,7 @@
3
3
  try {
4
4
  if (typeof document != "undefined") {
5
5
  var elementStyle = document.createElement("style");
6
- elementStyle.appendChild(document.createTextNode('/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */\n.react-flow {\n direction: ltr;\n\n --xy-edge-stroke-default: #b1b1b7;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #555;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);\n\n --xy-minimap-background-color-default: #fff;\n --xy-minimap-mask-background-color-default: rgb(240, 240, 240, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #e2e2e2;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: transparent;\n --xy-background-pattern-dots-color-default: #91919a;\n --xy-background-pattern-lines-color-default: #eee;\n --xy-background-pattern-cross-color-default: #e2e2e2;\n background-color: var(--xy-background-color, var(--xy-background-color-default));\n --xy-node-color-default: inherit;\n --xy-node-border-default: 1px solid #1a192b;\n --xy-node-background-color-default: #fff;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;\n --xy-node-border-radius-default: 3px;\n\n --xy-handle-background-color-default: #1a192b;\n --xy-handle-border-color-default: #fff;\n\n --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);\n\n --xy-controls-button-background-color-default: #fefefe;\n --xy-controls-button-background-color-hover-default: #f4f4f4;\n --xy-controls-button-color-default: inherit;\n --xy-controls-button-color-hover-default: inherit;\n --xy-controls-button-border-color-default: #eee;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #ffffff;\n --xy-edge-label-color-default: inherit;\n --xy-resize-background-color-default: #3367d9;\n}\n.react-flow.dark {\n --xy-edge-stroke-default: #3e3e3e;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #727272;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);\n\n --xy-minimap-background-color-default: #141414;\n --xy-minimap-mask-background-color-default: rgb(60, 60, 60, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #2b2b2b;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: #141414;\n --xy-background-pattern-dots-color-default: #777;\n --xy-background-pattern-lines-color-default: #777;\n --xy-background-pattern-cross-color-default: #777;\n --xy-node-color-default: #f8f8f8;\n --xy-node-border-default: 1px solid #3c3c3c;\n --xy-node-background-color-default: #1e1e1e;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;\n\n --xy-handle-background-color-default: #bebebe;\n --xy-handle-border-color-default: #1e1e1e;\n\n --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);\n\n --xy-controls-button-background-color-default: #2b2b2b;\n --xy-controls-button-background-color-hover-default: #3e3e3e;\n --xy-controls-button-color-default: #f8f8f8;\n --xy-controls-button-color-hover-default: #fff;\n --xy-controls-button-border-color-default: #5b5b5b;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #141414;\n --xy-edge-label-color-default: #f8f8f8;\n}\n.react-flow__background {\n background-color: var(--xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)));\n pointer-events: none;\n z-index: -1;\n}\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n}\n.react-flow__pane.selection {\n cursor: pointer;\n }\n.react-flow__pane.draggable {\n cursor: grab;\n }\n.react-flow__pane.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selection {\n z-index: 6;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow__edge-path {\n stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));\n fill: none;\n}\n.react-flow__connection-path {\n stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));\n stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));\n fill: none;\n}\n.react-flow__edges {\n position: absolute;\n}\n.react-flow__edges svg {\n overflow: visible;\n position: absolute;\n pointer-events: none;\n }\n.react-flow__edge {\n pointer-events: visibleStroke;\n}\n.react-flow__edge.selectable {\n cursor: pointer;\n }\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge.selectable:focus .react-flow__edge-path,\n .react-flow__edge.selectable:focus-visible .react-flow__edge-path {\n stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection .animated {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\nsvg.react-flow__connectionline {\n z-index: 1001;\n overflow: visible;\n position: absolute;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: default;\n}\n.react-flow__node.selectable {\n cursor: pointer;\n }\n.react-flow__node.draggable {\n cursor: grab;\n pointer-events: all;\n }\n.react-flow__node.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));\n border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));\n border-radius: 100%;\n}\n.react-flow__handle.connectingfrom {\n pointer-events: all;\n }\n.react-flow__handle.connectionindicator {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: 0;\n transform: translate(-50%, 50%);\n }\n.react-flow__handle-top {\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-left {\n top: 50%;\n left: 0;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-right {\n top: 50%;\n right: 0;\n transform: translate(50%, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.center {\n left: 50%;\n transform: translateX(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n left: 0;\n top: 0;\n}\n.react-flow__viewport-portal {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.react-flow__minimap {\n background: var(\n --xy-minimap-background-color-props,\n var(--xy-minimap-background-color, var(--xy-minimap-background-color-default))\n );\n}\n.react-flow__minimap-svg {\n display: block;\n }\n.react-flow__minimap-mask {\n fill: var(\n --xy-minimap-mask-background-color-props,\n var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default))\n );\n stroke: var(\n --xy-minimap-mask-stroke-color-props,\n var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-mask-stroke-width-props,\n var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default))\n );\n }\n.react-flow__minimap-node {\n fill: var(\n --xy-minimap-node-background-color-props,\n var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default))\n );\n stroke: var(\n --xy-minimap-node-stroke-color-props,\n var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-node-stroke-width-props,\n var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default))\n );\n }\n.react-flow__background-pattern.dots {\n fill: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default))\n );\n }\n.react-flow__background-pattern.lines {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default))\n );\n }\n.react-flow__background-pattern.cross {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default))\n );\n }\n.react-flow__controls {\n display: flex;\n flex-direction: column;\n box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));\n}\n.react-flow__controls.horizontal {\n flex-direction: row;\n }\n.react-flow__controls-button {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 26px;\n width: 26px;\n padding: 4px;\n border: none;\n background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));\n border-bottom: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n color: var(\n --xy-controls-button-color-props,\n var(--xy-controls-button-color, var(--xy-controls-button-color-default))\n );\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n fill: currentColor;\n }\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node.selectable:focus,\n .react-flow__node.selectable:focus-visible {\n outline: none;\n }\n.react-flow__node-input,\n.react-flow__node-default,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));\n width: 150px;\n font-size: 12px;\n color: var(--xy-node-color, var(--xy-node-color-default));\n text-align: center;\n border: var(--xy-node-border, var(--xy-node-border-default));\n background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));\n}\n.react-flow__node-input.selectable:hover, .react-flow__node-default.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));\n }\n.react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));\n }\n.react-flow__node-group {\n background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));\n border: var(--xy-selection-border, var(--xy-selection-border-default));\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls-button:hover {\n background: var(\n --xy-controls-button-background-color-hover-props,\n var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default))\n );\n color: var(\n --xy-controls-button-color-hover-props,\n var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default))\n );\n }\n.react-flow__controls-button:disabled {\n pointer-events: none;\n }\n.react-flow__controls-button:disabled svg {\n fill-opacity: 0.4;\n }\n.react-flow__controls-button:last-child {\n border-bottom: none;\n }\n.react-flow__resize-control {\n position: absolute;\n}\n.react-flow__resize-control.left,\n.react-flow__resize-control.right {\n cursor: ew-resize;\n}\n.react-flow__resize-control.top,\n.react-flow__resize-control.bottom {\n cursor: ns-resize;\n}\n.react-flow__resize-control.top.left,\n.react-flow__resize-control.bottom.right {\n cursor: nwse-resize;\n}\n.react-flow__resize-control.bottom.left,\n.react-flow__resize-control.top.right {\n cursor: nesw-resize;\n}\n/* handle styles */\n.react-flow__resize-control.handle {\n width: 4px;\n height: 4px;\n border: 1px solid #fff;\n border-radius: 1px;\n background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n transform: translate(-50%, -50%);\n}\n.react-flow__resize-control.handle.left {\n left: 0;\n top: 50%;\n}\n.react-flow__resize-control.handle.right {\n left: 100%;\n top: 50%;\n}\n.react-flow__resize-control.handle.top {\n left: 50%;\n top: 0;\n}\n.react-flow__resize-control.handle.bottom {\n left: 50%;\n top: 100%;\n}\n.react-flow__resize-control.handle.top.left {\n left: 0;\n}\n.react-flow__resize-control.handle.bottom.left {\n left: 0;\n}\n.react-flow__resize-control.handle.top.right {\n left: 100%;\n}\n.react-flow__resize-control.handle.bottom.right {\n left: 100%;\n}\n/* line styles */\n.react-flow__resize-control.line {\n border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n border-width: 0;\n border-style: solid;\n}\n.react-flow__resize-control.line.left,\n.react-flow__resize-control.line.right {\n width: 1px;\n transform: translate(-50%, 0);\n top: 0;\n height: 100%;\n}\n.react-flow__resize-control.line.left {\n left: 0;\n border-left-width: 1px;\n}\n.react-flow__resize-control.line.right {\n left: 100%;\n border-right-width: 1px;\n}\n.react-flow__resize-control.line.top,\n.react-flow__resize-control.line.bottom {\n height: 1px;\n transform: translate(0, -50%);\n left: 0;\n width: 100%;\n}\n.react-flow__resize-control.line.top {\n top: 0;\n border-top-width: 1px;\n}\n.react-flow__resize-control.line.bottom {\n border-bottom-width: 1px;\n top: 100%;\n}\n.react-flow__edge-textbg {\n fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));\n}\n.react-flow__edge-text {\n fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));\n}\n.animated-resizable-layout{width:100%;height:100%;position:relative;background-color:var(--panel-background)}.hybrid-panel{overflow:auto;height:100%;background-color:var(--panel-background)}.resize-handle{width:8px;background-color:var(--panel-handle);display:flex;justify-content:center;align-items:center;cursor:col-resize;position:relative;transition:background-color .2s,opacity .3s,width .3s}.resize-handle.collapsed{opacity:0;pointer-events:none}.resize-handle:hover{background-color:var(--panel-handle-hover)}.resize-handle:active{background-color:var(--panel-handle-active)}.handle-bar{height:100%;width:100%;display:flex;align-items:center;justify-content:center;position:relative}.collapse-toggle{position:absolute;background:var(--panel-button-bg);border:1px solid var(--panel-button-border);padding:4px 8px;cursor:pointer;color:var(--panel-button-icon);font-size:14px;outline:none;display:flex;align-items:center;justify-content:center;border-radius:4px;z-index:10;transition:all .2s;box-shadow:0 2px 4px #0000001a}.animated-vertical-layout{width:100%;height:100%;position:relative;background-color:var(--panel-background)}.vertical-panel{overflow:auto;width:100%;background-color:var(--panel-background)}.panel-content-wrapper{width:100%;height:100%;overflow:auto}.vertical-resize-handle{height:8px;background-color:var(--panel-handle);display:flex;justify-content:center;align-items:center;cursor:row-resize;position:relative;transition:background-color .2s,opacity .3s,height .3s}.vertical-resize-handle.collapsed{opacity:0;pointer-events:none}.vertical-resize-handle:hover{background-color:var(--panel-handle-hover)}.vertical-resize-handle:active{background-color:var(--panel-handle-active)}.handle-bar{width:100%;height:100%;display:flex;align-items:center;justify-content:center;gap:8px;position:relative}.collapse-toggle{background:var(--panel-button-bg);border:1px solid var(--panel-button-border);padding:4px 8px;cursor:pointer;color:var(--panel-button-icon);font-size:14px;outline:none;display:flex;align-items:center;justify-content:center;border-radius:4px;z-index:10;transition:all .2s;box-shadow:0 2px 4px #0000001a}.collapse-toggle:hover:not(:disabled){background-color:var(--panel-button-hover);box-shadow:0 2px 6px #00000026}.collapse-toggle:active:not(:disabled){opacity:.8}.three-panel-item.collapsible-panel.collapsed{flex:0!important;min-width:0!important}.panel-content-wrapper{flex:1;overflow:auto;will-change:opacity;box-sizing:border-box}.resize-handle.collapsed{width:0!important}.tab-group{display:flex;height:100%;width:100%;overflow:hidden}.tab-group.tab-position-top,.tab-group.tab-position-bottom{flex-direction:column}.tab-group.tab-position-left,.tab-group.tab-position-right{flex-direction:row}.tab-list{display:flex;background:var(--tab-list-bg, #f5f5f5);border-bottom:1px solid var(--tab-border, #ddd);gap:0;padding:0;flex-shrink:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.tab-list::-webkit-scrollbar{display:none}.tab-position-top .tab-list,.tab-position-bottom .tab-list{width:100%}.tab-list.centered{justify-content:flex-start}@media (min-width:0){.tab-list.centered{justify-content:center}.tab-list.centered:has(.tab-button:nth-child(n)){justify-content:flex-start}}.tab-position-bottom .tab-list{border-bottom:none;border-top:none}.tab-position-left .tab-list,.tab-position-right .tab-list{flex-direction:column;border-bottom:none;border-right:none;width:auto;min-width:120px}.tab-position-top .tab-button,.tab-position-bottom .tab-button{flex:1 1 0;min-width:40px;max-width:100%}.tab-button{background:var(--tab-bg, #fff);border:1px solid var(--tab-border, #ddd);border-radius:0;padding:8px 16px;cursor:pointer;font-size:14px;font-weight:500;color:var(--tab-text, #333);transition:all .2s ease;white-space:nowrap;display:flex;align-items:center;justify-content:center;gap:6px;height:39px;line-height:1;box-sizing:border-box;container-type:inline-size}.tab-position-top .tab-button{border-bottom:none;border-top:none;border-left:none}.tab-position-top .tab-button:last-child{border-right:none}.tab-position-bottom .tab-button{border-top:none;border-bottom:none;border-left:none}.tab-position-bottom .tab-button:last-child{border-right:none}.tab-position-left .tab-button{border-right:none;border-bottom:none}.tab-position-left .tab-button:last-child{border-bottom:1px solid var(--tab-border, #ddd)}.tab-position-right .tab-button{border-left:none;border-bottom:none}.tab-position-right .tab-button:last-child{border-bottom:1px solid var(--tab-border, #ddd)}.tab-icon{display:inline-flex;align-items:center;justify-content:center}.tab-label{display:none}@container (min-width: 250px){.tab-label{display:inline}.tab-icon{display:none}}.tab-button:hover{background:var(--tab-bg-hover, #f9f9f9)}.tab-button.active{background:var(--tab-bg-active, #007bff);color:var(--tab-text-active, #fff);border-color:var(--tab-border-active, #007bff)}.tab-button:focus-visible{outline:2px solid var(--tab-focus, #007bff);outline-offset:2px}.tab-content{flex:1;overflow:auto;background:var(--tab-content-bg, #fff)}.tab-group-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--tab-empty-text, #999);font-style:italic}.three-panel-layout{height:100%;width:100%;display:flex;flex-direction:column;position:relative;background-color:var(--panel-background);box-sizing:border-box}.three-panel-item{display:flex;flex-direction:column;overflow:hidden;position:relative;background-color:var(--panel-background);box-sizing:border-box}.three-panel-item[data-edit-mode=true]{background-color:var(--panel-accent-bg);border-radius:12px}.three-panel-item.collapsible-panel{will-change:flex}.three-panel-item.collapsible-panel.animating{pointer-events:none}.three-panel-item.collapsible-panel.collapsed{flex:0!important;min-width:0!important;max-width:0!important;width:0!important;overflow:hidden!important;visibility:hidden}.three-panel-item.middle-panel{flex:1;min-width:200px}.panel-content-wrapper{flex:1;overflow-x:hidden;overflow-y:auto;will-change:opacity;box-sizing:border-box}.resize-handle{position:relative;display:flex;align-items:center;justify-content:center;width:1px!important;cursor:col-resize;background:var(--panel-border);overflow:visible!important}.resize-handle:before{content:"";position:absolute;top:0;right:-10px;bottom:0;left:-10px;background:transparent}.resize-handle:after{content:"";position:absolute;top:0;right:-10px;bottom:0;left:-10px;background:var(--panel-handle);opacity:0;transition:opacity .2s ease;z-index:-1}.resize-handle:hover:after{opacity:1}.resize-handle:hover{background:var(--panel-handle-hover)}.resize-handle:active:after{opacity:1;background:var(--panel-handle-active)}.resize-handle:active{background:var(--panel-handle-active)}.resize-handle.collapsed{width:0!important;visibility:hidden}.resize-handle.left-handle.collapsed{margin-right:-1px}.resize-handle.right-handle.collapsed{margin-left:-1px}.handle-bar{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;z-index:2}.collapse-toggle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:20px;height:40px;background:var(--panel-button-bg);border:1px solid var(--panel-button-border);border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:12px;color:var(--panel-button-icon);transition:all .2s ease;z-index:10;padding:0;line-height:1}.collapse-toggle:hover{background:var(--panel-button-hover)}.collapse-toggle:active{opacity:.8}.collapse-toggle:disabled{opacity:.5;cursor:not-allowed}@media (max-width:768px){.resize-handle:before{left:-8px;right:-8px}.resize-handle:after{left:-8px;right:-8px}.collapse-toggle{width:24px;height:48px;font-size:14px}}.snap-carousel-container{display:flex;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;scroll-behavior:smooth;gap:var(--snap-carousel-gap, 0px);padding:0;margin:0;width:100%;height:100%;background-color:var(--panel-background);box-sizing:border-box;position:relative;left:0;transform:none;container-type:inline-size;-ms-overflow-style:none;scrollbar-width:none}.snap-carousel-container::-webkit-scrollbar{display:none}.snap-carousel-panel{flex:0 0 auto;scroll-snap-align:start;scroll-snap-stop:always;width:var(--snap-carousel-panel-width, 33.33%);height:100%;box-sizing:border-box;overflow:hidden}@media (max-width:540px){.snap-carousel-panel{min-width:280px}}@keyframes wiggle{0%{transform:rotate(0)}25%{transform:rotate(1deg)}50%{transform:rotate(0)}75%{transform:rotate(-1deg)}to{transform:rotate(0)}}@keyframes scaleIn{0%{transform:scale(.95);opacity:0}to{transform:scale(1);opacity:1}}@keyframes pulse{0%,to{box-shadow:0 0 #3b82f666}50%{box-shadow:0 0 0 8px #3b82f600}}.editable-panel-layout{position:relative;width:100%;height:100%}.editable-panel-layout.edit-mode-active{background:#0000000d}[data-slot][data-edit-mode=true]{transform:scale(.95);transform-origin:center center;cursor:grab;will-change:transform;transition:transform .3s cubic-bezier(.4,0,.2,1)}[data-slot][data-edit-mode=true]:active{cursor:grabbing}[data-slot][data-dragging=true]{cursor:grabbing!important;transform:scale(.95)!important;transition:none!important}.edit-mode-active [data-slot][data-edit-mode=true]{transform-origin:center center}.slot-with-overlay{position:relative;width:100%;height:100%}.slot-with-overlay.dragging{opacity:0;pointer-events:none}.slot-edit-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;border:none;pointer-events:auto;cursor:grab;z-index:100;display:flex;flex-direction:column;align-items:center;justify-content:center}.slot-edit-overlay:hover{background:#3b82f608}.slot-edit-overlay:active{cursor:grabbing}.drag-indicator,.slot-position-label{display:none}.edit-mode-toggle{position:absolute;top:16px;right:16px;z-index:1000;padding:8px 16px;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#374151;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 4px #0000001a}.edit-mode-toggle:hover{background:#f9fafb;box-shadow:0 4px 6px #0000001a}.edit-mode-toggle.active{background:#3b82f6;color:#fff;border-color:#2563eb}.edit-mode-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000004d;z-index:998;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.edit-mode-configurator{position:relative;z-index:999;padding:20px;animation:scaleIn .3s ease}.panel-slot{position:relative;min-height:120px;border:2px dashed transparent;border-radius:12px;transition:all .3s ease;padding:12px}.panel-slot.edit-mode{border-color:#d1d5db;background:#ffffff80}.panel-slot.drag-over{border-color:#3b82f6;background:#3b82f61a;box-shadow:0 0 0 4px #3b82f61a}.panel-slot.empty{display:flex;align-items:center;justify-content:center;color:#9ca3af;font-size:14px}.draggable-panel{position:relative;padding:12px 16px;margin:8px 0;border-radius:8px;background:#fff;border:1px solid #e5e7eb;cursor:grab;transition:all .2s ease;-webkit-user-select:none;user-select:none}.draggable-panel:hover{border-color:#3b82f6;box-shadow:0 2px 8px #0000001a}.draggable-panel.dragging{opacity:.5;cursor:grabbing}.draggable-panel.edit-mode{animation:wiggle .4s ease-in-out infinite;transform-origin:center}.draggable-panel.edit-mode:nth-child(odd){animation-delay:.1s}.draggable-panel.edit-mode:nth-child(2n){animation-delay:.2s}.remove-button{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#ef4444;color:#fff;border:2px solid white;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:12px;font-weight:700;opacity:0;transform:scale(0);transition:all .2s ease;z-index:10;box-shadow:0 2px 4px #0003}.draggable-panel.edit-mode .remove-button{opacity:1;transform:scale(1);animation:pulse 2s infinite}.remove-button:hover{background:#dc2626;transform:scale(1.1)}.panel-label{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;color:#374151}.panel-icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center}.drag-handle{display:none;width:24px;height:24px;opacity:.4;cursor:grab}.edit-mode .drag-handle{display:flex;align-items:center;justify-content:center}.drag-overlay{padding:12px 16px;border-radius:8px;background:#fff;border:2px solid #3b82f6;box-shadow:0 8px 16px #0003;cursor:grabbing;opacity:.9}.panel-group{border:2px solid #e5e7eb;border-radius:12px;padding:8px;background:#fff}.panel-group.edit-mode{animation:wiggle .5s ease-in-out infinite;border-color:#3b82f6}.panel-group-header{display:flex;justify-content:space-between;align-items:center;padding:8px;border-bottom:1px solid #e5e7eb;margin-bottom:8px}.panel-group-title{font-size:12px;font-weight:600;color:#6b7280;text-transform:uppercase}.available-panels{background:#fff;border-radius:12px;padding:16px;box-shadow:0 4px 6px #0000001a}.available-panels-title{font-size:16px;font-weight:600;color:#374151;margin-bottom:12px}.available-panels-list{display:flex;flex-direction:column;gap:8px}.slot-label{font-size:12px;font-weight:600;color:#6b7280;text-transform:uppercase;margin-bottom:8px;display:flex;align-items:center;gap:8px}.slot-indicator{width:8px;height:8px;border-radius:50%;background:#d1d5db}.slot-indicator.active{background:#3b82f6}.action-buttons{position:fixed;bottom:24px;left:50%;transform:translate(-50%);z-index:1001;display:flex;gap:12px;padding:12px 24px;background:#fff;border-radius:12px;box-shadow:0 8px 16px #00000026;animation:scaleIn .3s ease}.action-button{padding:10px 20px;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#374151;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.action-button:hover{background:#f9fafb}.action-button.primary{background:#3b82f6;color:#fff;border-color:#2563eb}.action-button.primary:hover{background:#2563eb}@media (max-width:768px){.edit-mode-toggle{top:8px;right:8px;padding:6px 12px;font-size:12px}.action-buttons{bottom:16px;padding:10px 16px}.action-button{padding:8px 16px;font-size:13px}}@media (prefers-color-scheme:dark){.edit-mode-toggle{background:#1f2937;color:#f9fafb;border-color:#374151}.edit-mode-toggle:hover{background:#374151}.draggable-panel{background:#1f2937;color:#f9fafb;border-color:#374151}.available-panels{background:#1f2937}.panel-label{color:#f9fafb}.action-buttons{background:#1f2937}.action-button{background:#1f2937;color:#f9fafb;border-color:#374151}.action-button:hover{background:#374151}}.panel-configurator{display:flex;flex-direction:column;gap:2rem;padding:1.5rem;background:var(--configurator-bg);border-radius:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.configurator-section{display:flex;flex-direction:column;gap:1rem}.section-title{margin:0;font-size:.875rem;font-weight:600;color:var(--configurator-title);text-transform:uppercase;letter-spacing:.05em;text-align:center}.slots-container{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;width:75%;margin:0 auto;align-items:start}.slot{position:relative;aspect-ratio:1 / 1.3;width:100%;padding:2.5rem 1rem 1rem;background:var(--slot-bg);border:2px solid var(--slot-border);border-radius:6px;cursor:pointer;transition:all .2s ease;display:flex;flex-direction:column;gap:.5rem;overflow:hidden;box-sizing:border-box}.slot:hover{border-color:var(--slot-border-hover);box-shadow:0 2px 4px #0000000d}.slot.selected{border-color:var(--slot-border-selected);background:var(--slot-bg-selected);box-shadow:0 0 0 3px var(--slot-bg-selected)}.slot.empty{border-style:dashed}.slot-label{font-size:.75rem;font-weight:600;color:var(--slot-label);text-transform:capitalize;text-align:left}.slot[data-position=middle] .slot-label,.slot[data-position=middle] .slot-panel-name,.slot[data-position=middle] .slot-empty-state{text-align:center}.slot[data-position=right] .slot-label,.slot[data-position=right] .slot-panel-name,.slot[data-position=right] .slot-empty-state{text-align:right}.slot-content{flex:1;display:flex;flex-direction:column;gap:.5rem;overflow-y:auto;min-height:0}.slot-panel-name{font-weight:600;color:var(--slot-content-text);font-size:.875rem}.slot-preview{flex:1;display:flex;align-items:center;justify-content:center;padding:.5rem;background:var(--slot-preview-bg);border-radius:4px;border:1px solid var(--slot-preview-border);font-size:.75rem;color:var(--slot-preview-text)}.slot-empty-state{flex:1;display:flex;align-items:center;justify-content:center;color:var(--slot-empty-text);font-size:.875rem;font-style:italic;min-height:0}.slot-clear-btn{position:absolute;top:.25rem;right:.25rem;width:24px;height:24px;padding:0;background:var(--clear-btn-bg);color:var(--clear-btn-text);border:none;border-radius:4px;cursor:pointer;font-size:1.25rem;line-height:1;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s ease}.slot:hover .slot-clear-btn{opacity:1}.slot-clear-btn:hover{background:var(--clear-btn-hover);transform:scale(1.1)}.available-panels{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:.75rem;width:75%;margin:0 auto}.available-panel{min-height:80px;padding:.75rem;background:var(--panel-bg);border:2px solid var(--panel-border);border-radius:6px;cursor:pointer;transition:all .2s ease;display:flex;flex-direction:column;gap:.5rem}.available-panel:hover{border-color:var(--panel-border-hover);box-shadow:0 2px 4px #0000000d;transform:translateY(-2px)}.available-panel.selected{border-color:var(--panel-border-selected);background:var(--panel-bg-selected);box-shadow:0 0 0 3px var(--panel-bg-selected)}.available-panel.in-use{opacity:.5;border-style:dashed}.available-panel.in-use:hover{transform:translateY(0);opacity:.6}.panel-label{font-weight:600;color:var(--panel-label-text);font-size:.875rem}.panel-preview{flex:1;display:flex;align-items:center;justify-content:center;padding:.5rem;background:var(--panel-preview-bg);border-radius:4px;font-size:.75rem;color:var(--panel-preview-text)}.selection-hint{padding:.75rem 1rem;background:var(--hint-bg);border:1px solid var(--hint-border);border-radius:6px;color:var(--hint-text);font-size:.875rem;text-align:center}.available-panel.multi-selected{border-color:var(--panel-border-selected);background:var(--panel-bg-selected);box-shadow:0 0 0 2px var(--panel-bg-selected)}.multi-select-badge{margin-left:.5rem;padding:.25rem .5rem;background:var(--panel-border-selected);color:#fff;font-size:.75rem;border-radius:12px;font-weight:400}.multi-select-hint{background:var(--panel-bg-selected);border-color:var(--panel-border-selected)}.slot.tab-group{border-style:solid}.group-content{position:relative;overflow-y:auto;min-height:0}.group-badge{font-size:.75rem;font-weight:600;color:var(--panel-border-selected);margin-bottom:.5rem}.group-panels{display:flex;flex-direction:column;gap:.25rem;flex:1;overflow-y:auto;min-height:0}.group-panel-label{font-size:.75rem;color:var(--slot-content-text);padding:.25rem .5rem;background:var(--slot-preview-bg);border-radius:3px;border-left:3px solid var(--panel-border-selected)}.slot-panel-label{font-weight:600;color:var(--slot-content-text);font-size:.875rem;text-align:center}.create-tab-group-btn{margin-top:.5rem;padding:.5rem .75rem;background:var(--panel-border-selected);color:#fff;border:none;border-radius:4px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all .2s ease}.create-tab-group-btn:hover{transform:scale(1.05);box-shadow:0 2px 4px #0000001a}.tab-mode-toggle{position:absolute;top:.5rem;left:.5rem;padding:.25rem .5rem;background:var(--slot-bg);border:1px solid var(--slot-border);border-radius:4px;font-size:.85rem;cursor:pointer;transition:all .2s ease;z-index:10;opacity:.7;color:var(--slot-content-text)}.tab-mode-toggle svg{display:block}.tab-mode-toggle:hover{opacity:1;border-color:var(--slot-border-hover);background:var(--slot-preview-bg)}.tab-mode-toggle.active{opacity:1;background:var(--panel-border-selected);color:#fff;border-color:var(--panel-border-selected)}.tab-config-controls{margin-bottom:.5rem}.tab-config-label{display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:var(--slot-label)}.tab-config-label select{padding:.25rem .5rem;border:1px solid var(--slot-border);border-radius:3px;background:var(--slot-bg);color:var(--slot-content-text);font-size:.7rem;cursor:pointer}.group-panel-item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.25rem .5rem;background:var(--slot-preview-bg);border-radius:3px;border-left:3px solid var(--panel-border-selected)}.group-panel-label{flex:1;font-size:.75rem;color:var(--slot-content-text);display:flex;align-items:center;gap:.25rem}.default-badge{color:var(--panel-border-selected);font-size:.9em}.remove-from-group-btn{width:18px;height:18px;padding:0;background:var(--clear-btn-bg);color:var(--clear-btn-text);border:none;border-radius:3px;cursor:pointer;font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;opacity:.7;transition:all .2s ease}.remove-from-group-btn:hover{opacity:1;transform:scale(1.1)}.usage-hint{padding:.75rem 1rem;background:var(--slot-preview-bg);border:1px solid var(--slot-border);border-radius:6px;color:var(--hint-text);font-size:.875rem;text-align:center}'));
6
+ elementStyle.appendChild(document.createTextNode('/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */\n.react-flow {\n direction: ltr;\n\n --xy-edge-stroke-default: #b1b1b7;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #555;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);\n\n --xy-minimap-background-color-default: #fff;\n --xy-minimap-mask-background-color-default: rgb(240, 240, 240, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #e2e2e2;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: transparent;\n --xy-background-pattern-dots-color-default: #91919a;\n --xy-background-pattern-lines-color-default: #eee;\n --xy-background-pattern-cross-color-default: #e2e2e2;\n background-color: var(--xy-background-color, var(--xy-background-color-default));\n --xy-node-color-default: inherit;\n --xy-node-border-default: 1px solid #1a192b;\n --xy-node-background-color-default: #fff;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;\n --xy-node-border-radius-default: 3px;\n\n --xy-handle-background-color-default: #1a192b;\n --xy-handle-border-color-default: #fff;\n\n --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);\n\n --xy-controls-button-background-color-default: #fefefe;\n --xy-controls-button-background-color-hover-default: #f4f4f4;\n --xy-controls-button-color-default: inherit;\n --xy-controls-button-color-hover-default: inherit;\n --xy-controls-button-border-color-default: #eee;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #ffffff;\n --xy-edge-label-color-default: inherit;\n --xy-resize-background-color-default: #3367d9;\n}\n.react-flow.dark {\n --xy-edge-stroke-default: #3e3e3e;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #727272;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);\n\n --xy-minimap-background-color-default: #141414;\n --xy-minimap-mask-background-color-default: rgb(60, 60, 60, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #2b2b2b;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: #141414;\n --xy-background-pattern-dots-color-default: #777;\n --xy-background-pattern-lines-color-default: #777;\n --xy-background-pattern-cross-color-default: #777;\n --xy-node-color-default: #f8f8f8;\n --xy-node-border-default: 1px solid #3c3c3c;\n --xy-node-background-color-default: #1e1e1e;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;\n\n --xy-handle-background-color-default: #bebebe;\n --xy-handle-border-color-default: #1e1e1e;\n\n --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);\n\n --xy-controls-button-background-color-default: #2b2b2b;\n --xy-controls-button-background-color-hover-default: #3e3e3e;\n --xy-controls-button-color-default: #f8f8f8;\n --xy-controls-button-color-hover-default: #fff;\n --xy-controls-button-border-color-default: #5b5b5b;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #141414;\n --xy-edge-label-color-default: #f8f8f8;\n}\n.react-flow__background {\n background-color: var(--xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)));\n pointer-events: none;\n z-index: -1;\n}\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n}\n.react-flow__pane.selection {\n cursor: pointer;\n }\n.react-flow__pane.draggable {\n cursor: grab;\n }\n.react-flow__pane.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selection {\n z-index: 6;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow__edge-path {\n stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));\n fill: none;\n}\n.react-flow__connection-path {\n stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));\n stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));\n fill: none;\n}\n.react-flow__edges {\n position: absolute;\n}\n.react-flow__edges svg {\n overflow: visible;\n position: absolute;\n pointer-events: none;\n }\n.react-flow__edge {\n pointer-events: visibleStroke;\n}\n.react-flow__edge.selectable {\n cursor: pointer;\n }\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge.selectable:focus .react-flow__edge-path,\n .react-flow__edge.selectable:focus-visible .react-flow__edge-path {\n stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection .animated {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\nsvg.react-flow__connectionline {\n z-index: 1001;\n overflow: visible;\n position: absolute;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: default;\n}\n.react-flow__node.selectable {\n cursor: pointer;\n }\n.react-flow__node.draggable {\n cursor: grab;\n pointer-events: all;\n }\n.react-flow__node.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));\n border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));\n border-radius: 100%;\n}\n.react-flow__handle.connectingfrom {\n pointer-events: all;\n }\n.react-flow__handle.connectionindicator {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: 0;\n transform: translate(-50%, 50%);\n }\n.react-flow__handle-top {\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-left {\n top: 50%;\n left: 0;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-right {\n top: 50%;\n right: 0;\n transform: translate(50%, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.center {\n left: 50%;\n transform: translateX(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n left: 0;\n top: 0;\n}\n.react-flow__viewport-portal {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.react-flow__minimap {\n background: var(\n --xy-minimap-background-color-props,\n var(--xy-minimap-background-color, var(--xy-minimap-background-color-default))\n );\n}\n.react-flow__minimap-svg {\n display: block;\n }\n.react-flow__minimap-mask {\n fill: var(\n --xy-minimap-mask-background-color-props,\n var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default))\n );\n stroke: var(\n --xy-minimap-mask-stroke-color-props,\n var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-mask-stroke-width-props,\n var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default))\n );\n }\n.react-flow__minimap-node {\n fill: var(\n --xy-minimap-node-background-color-props,\n var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default))\n );\n stroke: var(\n --xy-minimap-node-stroke-color-props,\n var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-node-stroke-width-props,\n var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default))\n );\n }\n.react-flow__background-pattern.dots {\n fill: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default))\n );\n }\n.react-flow__background-pattern.lines {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default))\n );\n }\n.react-flow__background-pattern.cross {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default))\n );\n }\n.react-flow__controls {\n display: flex;\n flex-direction: column;\n box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));\n}\n.react-flow__controls.horizontal {\n flex-direction: row;\n }\n.react-flow__controls-button {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 26px;\n width: 26px;\n padding: 4px;\n border: none;\n background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));\n border-bottom: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n color: var(\n --xy-controls-button-color-props,\n var(--xy-controls-button-color, var(--xy-controls-button-color-default))\n );\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n fill: currentColor;\n }\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node.selectable:focus,\n .react-flow__node.selectable:focus-visible {\n outline: none;\n }\n.react-flow__node-input,\n.react-flow__node-default,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));\n width: 150px;\n font-size: 12px;\n color: var(--xy-node-color, var(--xy-node-color-default));\n text-align: center;\n border: var(--xy-node-border, var(--xy-node-border-default));\n background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));\n}\n.react-flow__node-input.selectable:hover, .react-flow__node-default.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));\n }\n.react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));\n }\n.react-flow__node-group {\n background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));\n border: var(--xy-selection-border, var(--xy-selection-border-default));\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls-button:hover {\n background: var(\n --xy-controls-button-background-color-hover-props,\n var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default))\n );\n color: var(\n --xy-controls-button-color-hover-props,\n var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default))\n );\n }\n.react-flow__controls-button:disabled {\n pointer-events: none;\n }\n.react-flow__controls-button:disabled svg {\n fill-opacity: 0.4;\n }\n.react-flow__controls-button:last-child {\n border-bottom: none;\n }\n.react-flow__resize-control {\n position: absolute;\n}\n.react-flow__resize-control.left,\n.react-flow__resize-control.right {\n cursor: ew-resize;\n}\n.react-flow__resize-control.top,\n.react-flow__resize-control.bottom {\n cursor: ns-resize;\n}\n.react-flow__resize-control.top.left,\n.react-flow__resize-control.bottom.right {\n cursor: nwse-resize;\n}\n.react-flow__resize-control.bottom.left,\n.react-flow__resize-control.top.right {\n cursor: nesw-resize;\n}\n/* handle styles */\n.react-flow__resize-control.handle {\n width: 4px;\n height: 4px;\n border: 1px solid #fff;\n border-radius: 1px;\n background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n transform: translate(-50%, -50%);\n}\n.react-flow__resize-control.handle.left {\n left: 0;\n top: 50%;\n}\n.react-flow__resize-control.handle.right {\n left: 100%;\n top: 50%;\n}\n.react-flow__resize-control.handle.top {\n left: 50%;\n top: 0;\n}\n.react-flow__resize-control.handle.bottom {\n left: 50%;\n top: 100%;\n}\n.react-flow__resize-control.handle.top.left {\n left: 0;\n}\n.react-flow__resize-control.handle.bottom.left {\n left: 0;\n}\n.react-flow__resize-control.handle.top.right {\n left: 100%;\n}\n.react-flow__resize-control.handle.bottom.right {\n left: 100%;\n}\n/* line styles */\n.react-flow__resize-control.line {\n border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n border-width: 0;\n border-style: solid;\n}\n.react-flow__resize-control.line.left,\n.react-flow__resize-control.line.right {\n width: 1px;\n transform: translate(-50%, 0);\n top: 0;\n height: 100%;\n}\n.react-flow__resize-control.line.left {\n left: 0;\n border-left-width: 1px;\n}\n.react-flow__resize-control.line.right {\n left: 100%;\n border-right-width: 1px;\n}\n.react-flow__resize-control.line.top,\n.react-flow__resize-control.line.bottom {\n height: 1px;\n transform: translate(0, -50%);\n left: 0;\n width: 100%;\n}\n.react-flow__resize-control.line.top {\n top: 0;\n border-top-width: 1px;\n}\n.react-flow__resize-control.line.bottom {\n border-bottom-width: 1px;\n top: 100%;\n}\n.react-flow__edge-textbg {\n fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));\n}\n.react-flow__edge-text {\n fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));\n}\n.animated-resizable-layout{width:100%;height:100%;position:relative;background-color:var(--panel-background)}.hybrid-panel{overflow:auto;height:100%;background-color:var(--panel-background)}.resize-handle{width:8px;background-color:var(--panel-handle);display:flex;justify-content:center;align-items:center;cursor:col-resize;position:relative;transition:background-color .2s,opacity .3s,width .3s}.resize-handle.collapsed{opacity:0;pointer-events:none}.resize-handle:hover{background-color:var(--panel-handle-hover)}.resize-handle:active{background-color:var(--panel-handle-active)}.handle-bar{height:100%;width:100%;display:flex;align-items:center;justify-content:center;position:relative}.collapse-toggle{position:absolute;background:var(--panel-button-bg);border:1px solid var(--panel-button-border);padding:4px 8px;cursor:pointer;color:var(--panel-button-icon);font-size:14px;outline:none;display:flex;align-items:center;justify-content:center;border-radius:4px;z-index:10;transition:all .2s;box-shadow:0 2px 4px #0000001a}.animated-vertical-layout{width:100%;height:100%;position:relative;background-color:var(--panel-background)}.vertical-panel{overflow:auto;width:100%;background-color:var(--panel-background)}.panel-content-wrapper{width:100%;height:100%;overflow:auto}.vertical-resize-handle{height:8px;background-color:var(--panel-handle);display:flex;justify-content:center;align-items:center;cursor:row-resize;position:relative;transition:background-color .2s,opacity .3s,height .3s}.vertical-resize-handle.collapsed{opacity:0;pointer-events:none}.vertical-resize-handle:hover{background-color:var(--panel-handle-hover)}.vertical-resize-handle:active{background-color:var(--panel-handle-active)}.handle-bar{width:100%;height:100%;display:flex;align-items:center;justify-content:center;gap:8px;position:relative}.collapse-toggle{background:var(--panel-button-bg);border:1px solid var(--panel-button-border);padding:4px 8px;cursor:pointer;color:var(--panel-button-icon);font-size:14px;outline:none;display:flex;align-items:center;justify-content:center;border-radius:4px;z-index:10;transition:all .2s;box-shadow:0 2px 4px #0000001a}.collapse-toggle:hover:not(:disabled){background-color:var(--panel-button-hover);box-shadow:0 2px 6px #00000026}.collapse-toggle:active:not(:disabled){opacity:.8}.tab-group{display:flex;height:100%;width:100%;overflow:hidden}.tab-group.tab-position-top,.tab-group.tab-position-bottom{flex-direction:column}.tab-group.tab-position-left,.tab-group.tab-position-right{flex-direction:row}.tab-list{display:flex;background:var(--tab-list-bg, #f5f5f5);border-bottom:1px solid var(--tab-border, #ddd);gap:0;padding:0;flex-shrink:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none}.tab-list::-webkit-scrollbar{display:none}.tab-position-top .tab-list,.tab-position-bottom .tab-list{width:100%}.tab-list.centered{justify-content:flex-start}@media (min-width:0){.tab-list.centered{justify-content:center}.tab-list.centered:has(.tab-button:nth-child(n)){justify-content:flex-start}}.tab-position-bottom .tab-list{border-bottom:none;border-top:none}.tab-position-left .tab-list,.tab-position-right .tab-list{flex-direction:column;border-bottom:none;border-right:none;width:auto;min-width:120px}.tab-position-top .tab-button,.tab-position-bottom .tab-button{flex:1 1 0;min-width:40px;max-width:100%}.tab-button{background:var(--tab-bg, #fff);border:1px solid var(--tab-border, #ddd);border-radius:0;padding:8px 16px;cursor:pointer;font-family:var(--tab-font-family, inherit);font-size:var(--tab-font-size, 14px);font-weight:var(--tab-font-weight, 500);color:var(--tab-text, #333);transition:all .2s ease;white-space:nowrap;display:flex;align-items:center;justify-content:center;gap:6px;height:39px;line-height:1;box-sizing:border-box;container-type:inline-size}.tab-position-top .tab-button{border-bottom:none;border-top:none;border-left:none}.tab-position-top .tab-button:last-child{border-right:none}.tab-position-bottom .tab-button{border-top:none;border-bottom:none;border-left:none}.tab-position-bottom .tab-button:last-child{border-right:none}.tab-position-left .tab-button{border-right:none;border-bottom:none}.tab-position-left .tab-button:last-child{border-bottom:1px solid var(--tab-border, #ddd)}.tab-position-right .tab-button{border-left:none;border-bottom:none}.tab-position-right .tab-button:last-child{border-bottom:1px solid var(--tab-border, #ddd)}.tab-icon{display:inline-flex;align-items:center;justify-content:center}.tab-label{display:none}@container (min-width: 100px){.tab-label{display:inline}.tab-icon{display:none}}.tab-button:hover{background:var(--tab-bg-hover, #f9f9f9)}.tab-button.active{background:var(--tab-bg-active, #007bff);color:var(--tab-text-active, #fff);border-color:var(--tab-border-active, #007bff)}.tab-button:focus-visible{outline:2px solid var(--tab-focus, #007bff);outline-offset:2px}.tab-content{flex:1;overflow:auto;background:var(--tab-content-bg, #fff)}.tab-group-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--tab-empty-text, #999);font-style:italic}.three-panel-layout{height:100%;width:100%;display:flex;flex-direction:column;position:relative;background-color:var(--panel-background);box-sizing:border-box}.three-panel-item{display:flex;flex-direction:column;overflow:hidden;position:relative;background-color:var(--panel-background);box-sizing:border-box}.three-panel-item[data-edit-mode=true]{background-color:var(--panel-accent-bg);border-radius:12px}.three-panel-item.collapsible-panel{will-change:flex}.three-panel-item.collapsible-panel.animating{pointer-events:none}.three-panel-item.collapsible-panel.collapsed{flex:0!important;min-width:0!important;max-width:0!important;width:0!important;overflow:hidden!important;visibility:hidden}.three-panel-item.middle-panel{flex:1;min-width:200px}.panel-content-wrapper{flex:1;overflow-x:hidden;overflow-y:auto;will-change:opacity;box-sizing:border-box}.resize-handle{position:relative;display:flex;align-items:center;justify-content:center;width:1px!important;cursor:col-resize;background:var(--panel-border);overflow:visible!important}.resize-handle:before{content:"";position:absolute;top:0;right:-10px;bottom:0;left:-10px;background:transparent}.resize-handle:after{content:"";position:absolute;top:0;right:-10px;bottom:0;left:-10px;background:var(--panel-handle);opacity:0;transition:opacity .2s ease;z-index:-1}.resize-handle:hover:after{opacity:1}.resize-handle:hover{background:var(--panel-handle-hover)}.resize-handle:active:after{opacity:1;background:var(--panel-handle-active)}.resize-handle:active{background:var(--panel-handle-active)}.resize-handle.collapsed{width:0!important;visibility:hidden}.resize-handle.left-handle.collapsed{margin-right:-1px}.resize-handle.right-handle.collapsed{margin-left:-1px}.handle-bar{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;z-index:2}.collapse-toggle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:20px;height:40px;background:var(--panel-button-bg);border:1px solid var(--panel-button-border);border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:12px;color:var(--panel-button-icon);transition:all .2s ease;z-index:10;padding:0;line-height:1}.collapse-toggle:hover{background:var(--panel-button-hover)}.collapse-toggle:active{opacity:.8}.collapse-toggle:disabled{opacity:.5;cursor:not-allowed}@media (max-width:768px){.resize-handle:before{left:-8px;right:-8px}.resize-handle:after{left:-8px;right:-8px}.collapse-toggle{width:24px;height:48px;font-size:14px}}.snap-carousel-container{display:flex;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;scroll-behavior:smooth;gap:var(--snap-carousel-gap, 0px);padding:0;margin:0;width:100%;height:100%;background-color:var(--panel-background);box-sizing:border-box;position:relative;left:0;transform:none;container-type:inline-size;-ms-overflow-style:none;scrollbar-width:none}.snap-carousel-container::-webkit-scrollbar{display:none}.snap-carousel-container.swipe-disabled{touch-action:pan-y pinch-zoom;overscroll-behavior-x:none}.snap-carousel-panel{flex:0 0 auto;scroll-snap-align:start;scroll-snap-stop:always;width:var(--snap-carousel-panel-width, 33.33%);height:100%;box-sizing:border-box;overflow:hidden}@media (max-width:540px){.snap-carousel-panel{min-width:280px}}.mobile-tab-layout{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden}.mobile-tab-content{flex:1;overflow:hidden;min-height:0}.mobile-tab-nav{display:flex;background:var(--tab-list-bg, #f5f5f5);border-top:1px solid var(--tab-border, #ddd);flex-shrink:0;padding:0;margin:0}.mobile-tab-button{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;background:transparent;border:none;padding:14px 4px;padding-bottom:calc(14px + min(12px,env(safe-area-inset-bottom,0px)));cursor:pointer;font-family:var(--tab-font-family, inherit);font-size:var(--tab-font-size, 11px);font-weight:var(--tab-font-weight, 500);color:var(--tab-text, #666);transition:color .2s ease;min-width:0}.mobile-tab-button:hover{color:var(--tab-text-hover, #333)}.mobile-tab-button.active{color:var(--mobile-tab-text-active, #007bff)}.mobile-tab-button .tab-icon{display:flex;align-items:center;justify-content:center;font-size:24px;color:var(--tab-icon-color, #999);transition:color .2s ease}.mobile-tab-button.active .tab-icon{color:var(--mobile-tab-icon-active, #007bff)}.mobile-tab-button .tab-label{display:block;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;line-height:1.2;color:inherit;opacity:1}.mobile-tab-button:focus-visible{outline:2px solid var(--tab-focus, #007bff);outline-offset:-2px;z-index:1}@keyframes wiggle{0%{transform:rotate(0)}25%{transform:rotate(1deg)}50%{transform:rotate(0)}75%{transform:rotate(-1deg)}to{transform:rotate(0)}}@keyframes scaleIn{0%{transform:scale(.95);opacity:0}to{transform:scale(1);opacity:1}}@keyframes pulse{0%,to{box-shadow:0 0 #3b82f666}50%{box-shadow:0 0 0 8px #3b82f600}}.editable-panel-layout{position:relative;width:100%;height:100%}.editable-panel-layout.edit-mode-active{background:#0000000d}[data-slot][data-edit-mode=true]{transform:scale(.95);transform-origin:center center;cursor:grab;will-change:transform;transition:transform .3s cubic-bezier(.4,0,.2,1)}[data-slot][data-edit-mode=true]:active{cursor:grabbing}[data-slot][data-dragging=true]{cursor:grabbing!important;transform:scale(.95)!important;transition:none!important}.edit-mode-active [data-slot][data-edit-mode=true]{transform-origin:center center}.slot-with-overlay{position:relative;width:100%;height:100%}.slot-with-overlay.dragging{opacity:0;pointer-events:none}.slot-edit-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:transparent;border:none;pointer-events:auto;cursor:grab;z-index:100;display:flex;flex-direction:column;align-items:center;justify-content:center}.slot-edit-overlay:hover{background:#3b82f608}.slot-edit-overlay:active{cursor:grabbing}.drag-indicator,.slot-position-label{display:none}.edit-mode-toggle{position:absolute;top:16px;right:16px;z-index:1000;padding:8px 16px;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#374151;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 4px #0000001a}.edit-mode-toggle:hover{background:#f9fafb;box-shadow:0 4px 6px #0000001a}.edit-mode-toggle.active{background:#3b82f6;color:#fff;border-color:#2563eb}.edit-mode-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000004d;z-index:998;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.edit-mode-configurator{position:relative;z-index:999;padding:20px;animation:scaleIn .3s ease}.panel-slot{position:relative;min-height:120px;border:2px dashed transparent;border-radius:12px;transition:all .3s ease;padding:12px}.panel-slot.edit-mode{border-color:#d1d5db;background:#ffffff80}.panel-slot.drag-over{border-color:#3b82f6;background:#3b82f61a;box-shadow:0 0 0 4px #3b82f61a}.panel-slot.empty{display:flex;align-items:center;justify-content:center;color:#9ca3af;font-size:14px}.draggable-panel{position:relative;padding:12px 16px;margin:8px 0;border-radius:8px;background:#fff;border:1px solid #e5e7eb;cursor:grab;transition:all .2s ease;-webkit-user-select:none;user-select:none}.draggable-panel:hover{border-color:#3b82f6;box-shadow:0 2px 8px #0000001a}.draggable-panel.dragging{opacity:.5;cursor:grabbing}.draggable-panel.edit-mode{animation:wiggle .4s ease-in-out infinite;transform-origin:center}.draggable-panel.edit-mode:nth-child(odd){animation-delay:.1s}.draggable-panel.edit-mode:nth-child(2n){animation-delay:.2s}.remove-button{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#ef4444;color:#fff;border:2px solid white;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:12px;font-weight:700;opacity:0;transform:scale(0);transition:all .2s ease;z-index:10;box-shadow:0 2px 4px #0003}.draggable-panel.edit-mode .remove-button{opacity:1;transform:scale(1);animation:pulse 2s infinite}.remove-button:hover{background:#dc2626;transform:scale(1.1)}.panel-label{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;color:#374151}.panel-icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center}.drag-handle{display:none;width:24px;height:24px;opacity:.4;cursor:grab}.edit-mode .drag-handle{display:flex;align-items:center;justify-content:center}.drag-overlay{padding:12px 16px;border-radius:8px;background:#fff;border:2px solid #3b82f6;box-shadow:0 8px 16px #0003;cursor:grabbing;opacity:.9}.panel-group{border:2px solid #e5e7eb;border-radius:12px;padding:8px;background:#fff}.panel-group.edit-mode{animation:wiggle .5s ease-in-out infinite;border-color:#3b82f6}.panel-group-header{display:flex;justify-content:space-between;align-items:center;padding:8px;border-bottom:1px solid #e5e7eb;margin-bottom:8px}.panel-group-title{font-size:12px;font-weight:600;color:#6b7280;text-transform:uppercase}.available-panels{background:#fff;border-radius:12px;padding:16px;box-shadow:0 4px 6px #0000001a}.available-panels-title{font-size:16px;font-weight:600;color:#374151;margin-bottom:12px}.available-panels-list{display:flex;flex-direction:column;gap:8px}.slot-label{font-size:12px;font-weight:600;color:#6b7280;text-transform:uppercase;margin-bottom:8px;display:flex;align-items:center;gap:8px}.slot-indicator{width:8px;height:8px;border-radius:50%;background:#d1d5db}.slot-indicator.active{background:#3b82f6}.action-buttons{position:fixed;bottom:24px;left:50%;transform:translate(-50%);z-index:1001;display:flex;gap:12px;padding:12px 24px;background:#fff;border-radius:12px;box-shadow:0 8px 16px #00000026;animation:scaleIn .3s ease}.action-button{padding:10px 20px;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#374151;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.action-button:hover{background:#f9fafb}.action-button.primary{background:#3b82f6;color:#fff;border-color:#2563eb}.action-button.primary:hover{background:#2563eb}@media (max-width:768px){.edit-mode-toggle{top:8px;right:8px;padding:6px 12px;font-size:12px}.action-buttons{bottom:16px;padding:10px 16px}.action-button{padding:8px 16px;font-size:13px}}@media (prefers-color-scheme:dark){.edit-mode-toggle{background:#1f2937;color:#f9fafb;border-color:#374151}.edit-mode-toggle:hover{background:#374151}.draggable-panel{background:#1f2937;color:#f9fafb;border-color:#374151}.available-panels{background:#1f2937}.panel-label{color:#f9fafb}.action-buttons{background:#1f2937}.action-button{background:#1f2937;color:#f9fafb;border-color:#374151}.action-button:hover{background:#374151}}.panel-configurator{display:flex;flex-direction:column;gap:2rem;padding:1.5rem;background:var(--configurator-bg);border-radius:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.configurator-section{display:flex;flex-direction:column;gap:1rem}.section-title{margin:0;font-size:.875rem;font-weight:600;color:var(--configurator-title);text-transform:uppercase;letter-spacing:.05em;text-align:center}.slots-container{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;width:75%;margin:0 auto;align-items:start}.slot{position:relative;aspect-ratio:1 / 1.3;width:100%;padding:2.5rem 1rem 1rem;background:var(--slot-bg);border:2px solid var(--slot-border);border-radius:6px;cursor:pointer;transition:all .2s ease;display:flex;flex-direction:column;gap:.5rem;overflow:hidden;box-sizing:border-box}.slot:hover{border-color:var(--slot-border-hover);box-shadow:0 2px 4px #0000000d}.slot.selected{border-color:var(--slot-border-selected);background:var(--slot-bg-selected);box-shadow:0 0 0 3px var(--slot-bg-selected)}.slot.empty{border-style:dashed}.slot-label{font-size:.75rem;font-weight:600;color:var(--slot-label);text-transform:capitalize;text-align:left}.slot[data-position=middle] .slot-label,.slot[data-position=middle] .slot-panel-name,.slot[data-position=middle] .slot-empty-state{text-align:center}.slot[data-position=right] .slot-label,.slot[data-position=right] .slot-panel-name,.slot[data-position=right] .slot-empty-state{text-align:right}.slot-content{flex:1;display:flex;flex-direction:column;gap:.5rem;overflow-y:auto;min-height:0}.slot-panel-name{font-weight:600;color:var(--slot-content-text);font-size:.875rem}.slot-preview{flex:1;display:flex;align-items:center;justify-content:center;padding:.5rem;background:var(--slot-preview-bg);border-radius:4px;border:1px solid var(--slot-preview-border);font-size:.75rem;color:var(--slot-preview-text)}.slot-empty-state{flex:1;display:flex;align-items:center;justify-content:center;color:var(--slot-empty-text);font-size:.875rem;font-style:italic;min-height:0}.slot-clear-btn{position:absolute;top:.25rem;right:.25rem;width:24px;height:24px;padding:0;background:var(--clear-btn-bg);color:var(--clear-btn-text);border:none;border-radius:4px;cursor:pointer;font-size:1.25rem;line-height:1;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s ease}.slot:hover .slot-clear-btn{opacity:1}.slot-clear-btn:hover{background:var(--clear-btn-hover);transform:scale(1.1)}.available-panels{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:.75rem;width:75%;margin:0 auto}.available-panel{min-height:80px;padding:.75rem;background:var(--panel-bg);border:2px solid var(--panel-border);border-radius:6px;cursor:pointer;transition:all .2s ease;display:flex;flex-direction:column;gap:.5rem}.available-panel:hover{border-color:var(--panel-border-hover);box-shadow:0 2px 4px #0000000d;transform:translateY(-2px)}.available-panel.selected{border-color:var(--panel-border-selected);background:var(--panel-bg-selected);box-shadow:0 0 0 3px var(--panel-bg-selected)}.available-panel.in-use{opacity:.5;border-style:dashed}.available-panel.in-use:hover{transform:translateY(0);opacity:.6}.panel-label{font-weight:600;color:var(--panel-label-text);font-size:.875rem}.panel-preview{flex:1;display:flex;align-items:center;justify-content:center;padding:.5rem;background:var(--panel-preview-bg);border-radius:4px;font-size:.75rem;color:var(--panel-preview-text)}.selection-hint{padding:.75rem 1rem;background:var(--hint-bg);border:1px solid var(--hint-border);border-radius:6px;color:var(--hint-text);font-size:.875rem;text-align:center}.available-panel.multi-selected{border-color:var(--panel-border-selected);background:var(--panel-bg-selected);box-shadow:0 0 0 2px var(--panel-bg-selected)}.multi-select-badge{margin-left:.5rem;padding:.25rem .5rem;background:var(--panel-border-selected);color:#fff;font-size:.75rem;border-radius:12px;font-weight:400}.multi-select-hint{background:var(--panel-bg-selected);border-color:var(--panel-border-selected)}.slot.tab-group{border-style:solid}.group-content{position:relative;overflow-y:auto;min-height:0}.group-badge{font-size:.75rem;font-weight:600;color:var(--panel-border-selected);margin-bottom:.5rem}.group-panels{display:flex;flex-direction:column;gap:.25rem;flex:1;overflow-y:auto;min-height:0}.group-panel-label{font-size:.75rem;color:var(--slot-content-text);padding:.25rem .5rem;background:var(--slot-preview-bg);border-radius:3px;border-left:3px solid var(--panel-border-selected)}.slot-panel-label{font-weight:600;color:var(--slot-content-text);font-size:.875rem;text-align:center}.create-tab-group-btn{margin-top:.5rem;padding:.5rem .75rem;background:var(--panel-border-selected);color:#fff;border:none;border-radius:4px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all .2s ease}.create-tab-group-btn:hover{transform:scale(1.05);box-shadow:0 2px 4px #0000001a}.tab-mode-toggle{position:absolute;top:.5rem;left:.5rem;padding:.25rem .5rem;background:var(--slot-bg);border:1px solid var(--slot-border);border-radius:4px;font-size:.85rem;cursor:pointer;transition:all .2s ease;z-index:10;opacity:.7;color:var(--slot-content-text)}.tab-mode-toggle svg{display:block}.tab-mode-toggle:hover{opacity:1;border-color:var(--slot-border-hover);background:var(--slot-preview-bg)}.tab-mode-toggle.active{opacity:1;background:var(--panel-border-selected);color:#fff;border-color:var(--panel-border-selected)}.tab-config-controls{margin-bottom:.5rem}.tab-config-label{display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:var(--slot-label)}.tab-config-label select{padding:.25rem .5rem;border:1px solid var(--slot-border);border-radius:3px;background:var(--slot-bg);color:var(--slot-content-text);font-size:.7rem;cursor:pointer}.group-panel-item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.25rem .5rem;background:var(--slot-preview-bg);border-radius:3px;border-left:3px solid var(--panel-border-selected)}.group-panel-label{flex:1;font-size:.75rem;color:var(--slot-content-text);display:flex;align-items:center;gap:.25rem}.default-badge{color:var(--panel-border-selected);font-size:.9em}.remove-from-group-btn{width:18px;height:18px;padding:0;background:var(--clear-btn-bg);color:var(--clear-btn-text);border:none;border-radius:3px;cursor:pointer;font-size:1rem;line-height:1;display:flex;align-items:center;justify-content:center;opacity:.7;transition:all .2s ease}.remove-from-group-btn:hover{opacity:1;transform:scale(1.1)}.usage-hint{padding:.75rem 1rem;background:var(--slot-preview-bg);border:1px solid var(--slot-border);border-radius:6px;color:var(--hint-text);font-size:.875rem;text-align:center}'));
7
7
  document.head.appendChild(elementStyle);
8
8
  }
9
9
  } catch (e) {
@@ -12,12 +12,12 @@
12
12
  })();
13
13
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
14
14
  import * as React2 from "react";
15
- import React2__default, { createContext, useContext, useState, memo, useCallback, useMemo, forwardRef, useLayoutEffect, useEffect, useRef, createElement, useImperativeHandle } from "react";
15
+ import React2__default, { createContext, useContext, useState, useCallback, useMemo, memo, forwardRef, useRef, useEffect, useLayoutEffect, createElement, useImperativeHandle } from "react";
16
16
  import { createPortal } from "react-dom";
17
17
  import { CanvasConverter, renderNarrative, computeAggregates, selectScenario, parseTemplate, ExecutionValidator, CanvasDiscovery } from "@principal-ai/principal-view-core";
18
18
  import { CanvasNarrativeTreeCore } from "@principal-ade/dynamic-file-tree";
19
- var ThemeContext$1;
20
- var getThemeContext$1 = () => {
19
+ var ThemeContext;
20
+ var getThemeContext = () => {
21
21
  if (typeof window !== "undefined") {
22
22
  const globalWindow = window;
23
23
  if (!globalWindow.__principlemd_theme_context__) {
@@ -25,15 +25,15 @@ var getThemeContext$1 = () => {
25
25
  }
26
26
  return globalWindow.__principlemd_theme_context__;
27
27
  } else {
28
- if (!ThemeContext$1) {
29
- ThemeContext$1 = createContext(void 0);
28
+ if (!ThemeContext) {
29
+ ThemeContext = createContext(void 0);
30
30
  }
31
- return ThemeContext$1;
31
+ return ThemeContext;
32
32
  }
33
33
  };
34
- var ThemeContextSingleton$1 = getThemeContext$1();
35
- var useTheme$1 = () => {
36
- const context = useContext(ThemeContextSingleton$1);
34
+ var ThemeContextSingleton = getThemeContext();
35
+ var useTheme = () => {
36
+ const context = useContext(ThemeContextSingleton);
37
37
  if (!context) {
38
38
  throw new Error("useTheme must be used within a ThemeProvider");
39
39
  }
@@ -1563,21 +1563,21 @@ function tanh(x) {
1563
1563
  }
1564
1564
  const interpolateZoom = (function zoomRho(rho, rho2, rho4) {
1565
1565
  function zoom2(p0, p1) {
1566
- var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S2;
1566
+ var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;
1567
1567
  if (d2 < epsilon2) {
1568
- S2 = Math.log(w1 / w0) / rho;
1568
+ S = Math.log(w1 / w0) / rho;
1569
1569
  i = function(t) {
1570
1570
  return [
1571
1571
  ux0 + t * dx,
1572
1572
  uy0 + t * dy,
1573
- w0 * Math.exp(rho * t * S2)
1573
+ w0 * Math.exp(rho * t * S)
1574
1574
  ];
1575
1575
  };
1576
1576
  } else {
1577
1577
  var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
1578
- S2 = (r1 - r0) / rho;
1578
+ S = (r1 - r0) / rho;
1579
1579
  i = function(t) {
1580
- var s = t * S2, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
1580
+ var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
1581
1581
  return [
1582
1582
  ux0 + u * dx,
1583
1583
  uy0 + u * dy,
@@ -1585,7 +1585,7 @@ const interpolateZoom = (function zoomRho(rho, rho2, rho4) {
1585
1585
  ];
1586
1586
  };
1587
1587
  }
1588
- i.duration = S2 * 1e3 * rho / Math.SQRT2;
1588
+ i.duration = S * 1e3 * rho / Math.SQRT2;
1589
1589
  return i;
1590
1590
  }
1591
1591
  zoom2.rho = function(_) {
@@ -4974,152 +4974,135 @@ function getDefaultExportFromCjs(x) {
4974
4974
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
4975
4975
  }
4976
4976
  var withSelector = { exports: {} };
4977
- var withSelector_production = {};
4977
+ var withSelector_production_min = {};
4978
4978
  var shim = { exports: {} };
4979
- var useSyncExternalStoreShim_production = {};
4979
+ var useSyncExternalStoreShim_production_min = {};
4980
4980
  /**
4981
4981
  * @license React
4982
- * use-sync-external-store-shim.production.js
4982
+ * use-sync-external-store-shim.production.min.js
4983
4983
  *
4984
- * Copyright (c) Meta Platforms, Inc. and affiliates.
4984
+ * Copyright (c) Facebook, Inc. and its affiliates.
4985
4985
  *
4986
4986
  * This source code is licensed under the MIT license found in the
4987
4987
  * LICENSE file in the root directory of this source tree.
4988
4988
  */
4989
- var hasRequiredUseSyncExternalStoreShim_production;
4990
- function requireUseSyncExternalStoreShim_production() {
4991
- if (hasRequiredUseSyncExternalStoreShim_production) return useSyncExternalStoreShim_production;
4992
- hasRequiredUseSyncExternalStoreShim_production = 1;
4993
- var React = React2__default;
4994
- function is(x, y) {
4995
- return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y;
4996
- }
4997
- var objectIs = "function" === typeof Object.is ? Object.is : is, useState2 = React.useState, useEffect2 = React.useEffect, useLayoutEffect2 = React.useLayoutEffect, useDebugValue2 = React.useDebugValue;
4998
- function useSyncExternalStore$2(subscribe, getSnapshot) {
4999
- var value = getSnapshot(), _useState = useState2({ inst: { value, getSnapshot } }), inst = _useState[0].inst, forceUpdate = _useState[1];
5000
- useLayoutEffect2(
5001
- function() {
5002
- inst.value = value;
5003
- inst.getSnapshot = getSnapshot;
5004
- checkIfSnapshotChanged(inst) && forceUpdate({ inst });
5005
- },
5006
- [subscribe, value, getSnapshot]
5007
- );
5008
- useEffect2(
5009
- function() {
5010
- checkIfSnapshotChanged(inst) && forceUpdate({ inst });
5011
- return subscribe(function() {
5012
- checkIfSnapshotChanged(inst) && forceUpdate({ inst });
5013
- });
5014
- },
5015
- [subscribe]
5016
- );
5017
- useDebugValue2(value);
5018
- return value;
4989
+ var hasRequiredUseSyncExternalStoreShim_production_min;
4990
+ function requireUseSyncExternalStoreShim_production_min() {
4991
+ if (hasRequiredUseSyncExternalStoreShim_production_min) return useSyncExternalStoreShim_production_min;
4992
+ hasRequiredUseSyncExternalStoreShim_production_min = 1;
4993
+ var e = React2__default;
4994
+ function h(a, b) {
4995
+ return a === b && (0 !== a || 1 / a === 1 / b) || a !== a && b !== b;
4996
+ }
4997
+ var k = "function" === typeof Object.is ? Object.is : h, l = e.useState, m = e.useEffect, n = e.useLayoutEffect, p = e.useDebugValue;
4998
+ function q(a, b) {
4999
+ var d = b(), f = l({ inst: { value: d, getSnapshot: b } }), c = f[0].inst, g = f[1];
5000
+ n(function() {
5001
+ c.value = d;
5002
+ c.getSnapshot = b;
5003
+ r(c) && g({ inst: c });
5004
+ }, [a, d, b]);
5005
+ m(function() {
5006
+ r(c) && g({ inst: c });
5007
+ return a(function() {
5008
+ r(c) && g({ inst: c });
5009
+ });
5010
+ }, [a]);
5011
+ p(d);
5012
+ return d;
5019
5013
  }
5020
- function checkIfSnapshotChanged(inst) {
5021
- var latestGetSnapshot = inst.getSnapshot;
5022
- inst = inst.value;
5014
+ function r(a) {
5015
+ var b = a.getSnapshot;
5016
+ a = a.value;
5023
5017
  try {
5024
- var nextValue = latestGetSnapshot();
5025
- return !objectIs(inst, nextValue);
5026
- } catch (error) {
5018
+ var d = b();
5019
+ return !k(a, d);
5020
+ } catch (f) {
5027
5021
  return true;
5028
5022
  }
5029
5023
  }
5030
- function useSyncExternalStore$1(subscribe, getSnapshot) {
5031
- return getSnapshot();
5024
+ function t(a, b) {
5025
+ return b();
5032
5026
  }
5033
- var shim2 = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2;
5034
- useSyncExternalStoreShim_production.useSyncExternalStore = void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim2;
5035
- return useSyncExternalStoreShim_production;
5027
+ var u = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? t : q;
5028
+ useSyncExternalStoreShim_production_min.useSyncExternalStore = void 0 !== e.useSyncExternalStore ? e.useSyncExternalStore : u;
5029
+ return useSyncExternalStoreShim_production_min;
5036
5030
  }
5037
5031
  var hasRequiredShim;
5038
5032
  function requireShim() {
5039
5033
  if (hasRequiredShim) return shim.exports;
5040
5034
  hasRequiredShim = 1;
5041
5035
  {
5042
- shim.exports = requireUseSyncExternalStoreShim_production();
5036
+ shim.exports = requireUseSyncExternalStoreShim_production_min();
5043
5037
  }
5044
5038
  return shim.exports;
5045
5039
  }
5046
5040
  /**
5047
5041
  * @license React
5048
- * use-sync-external-store-shim/with-selector.production.js
5042
+ * use-sync-external-store-shim/with-selector.production.min.js
5049
5043
  *
5050
- * Copyright (c) Meta Platforms, Inc. and affiliates.
5044
+ * Copyright (c) Facebook, Inc. and its affiliates.
5051
5045
  *
5052
5046
  * This source code is licensed under the MIT license found in the
5053
5047
  * LICENSE file in the root directory of this source tree.
5054
5048
  */
5055
- var hasRequiredWithSelector_production;
5056
- function requireWithSelector_production() {
5057
- if (hasRequiredWithSelector_production) return withSelector_production;
5058
- hasRequiredWithSelector_production = 1;
5059
- var React = React2__default, shim2 = requireShim();
5060
- function is(x, y) {
5061
- return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y;
5062
- }
5063
- var objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore = shim2.useSyncExternalStore, useRef2 = React.useRef, useEffect2 = React.useEffect, useMemo2 = React.useMemo, useDebugValue2 = React.useDebugValue;
5064
- withSelector_production.useSyncExternalStoreWithSelector = function(subscribe, getSnapshot, getServerSnapshot, selector2, isEqual) {
5065
- var instRef = useRef2(null);
5066
- if (null === instRef.current) {
5067
- var inst = { hasValue: false, value: null };
5068
- instRef.current = inst;
5069
- } else inst = instRef.current;
5070
- instRef = useMemo2(
5071
- function() {
5072
- function memoizedSelector(nextSnapshot) {
5073
- if (!hasMemo) {
5074
- hasMemo = true;
5075
- memoizedSnapshot = nextSnapshot;
5076
- nextSnapshot = selector2(nextSnapshot);
5077
- if (void 0 !== isEqual && inst.hasValue) {
5078
- var currentSelection = inst.value;
5079
- if (isEqual(currentSelection, nextSnapshot))
5080
- return memoizedSelection = currentSelection;
5081
- }
5082
- return memoizedSelection = nextSnapshot;
5049
+ var hasRequiredWithSelector_production_min;
5050
+ function requireWithSelector_production_min() {
5051
+ if (hasRequiredWithSelector_production_min) return withSelector_production_min;
5052
+ hasRequiredWithSelector_production_min = 1;
5053
+ var h = React2__default, n = requireShim();
5054
+ function p(a, b) {
5055
+ return a === b && (0 !== a || 1 / a === 1 / b) || a !== a && b !== b;
5056
+ }
5057
+ var q = "function" === typeof Object.is ? Object.is : p, r = n.useSyncExternalStore, t = h.useRef, u = h.useEffect, v = h.useMemo, w = h.useDebugValue;
5058
+ withSelector_production_min.useSyncExternalStoreWithSelector = function(a, b, e, l, g) {
5059
+ var c = t(null);
5060
+ if (null === c.current) {
5061
+ var f = { hasValue: false, value: null };
5062
+ c.current = f;
5063
+ } else f = c.current;
5064
+ c = v(function() {
5065
+ function a2(a3) {
5066
+ if (!c2) {
5067
+ c2 = true;
5068
+ d2 = a3;
5069
+ a3 = l(a3);
5070
+ if (void 0 !== g && f.hasValue) {
5071
+ var b2 = f.value;
5072
+ if (g(b2, a3)) return k = b2;
5083
5073
  }
5084
- currentSelection = memoizedSelection;
5085
- if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;
5086
- var nextSelection = selector2(nextSnapshot);
5087
- if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))
5088
- return memoizedSnapshot = nextSnapshot, currentSelection;
5089
- memoizedSnapshot = nextSnapshot;
5090
- return memoizedSelection = nextSelection;
5074
+ return k = a3;
5091
5075
  }
5092
- var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot;
5093
- return [
5094
- function() {
5095
- return memoizedSelector(getSnapshot());
5096
- },
5097
- null === maybeGetServerSnapshot ? void 0 : function() {
5098
- return memoizedSelector(maybeGetServerSnapshot());
5099
- }
5100
- ];
5101
- },
5102
- [getSnapshot, getServerSnapshot, selector2, isEqual]
5103
- );
5104
- var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);
5105
- useEffect2(
5106
- function() {
5107
- inst.hasValue = true;
5108
- inst.value = value;
5109
- },
5110
- [value]
5111
- );
5112
- useDebugValue2(value);
5113
- return value;
5076
+ b2 = k;
5077
+ if (q(d2, a3)) return b2;
5078
+ var e2 = l(a3);
5079
+ if (void 0 !== g && g(b2, e2)) return b2;
5080
+ d2 = a3;
5081
+ return k = e2;
5082
+ }
5083
+ var c2 = false, d2, k, m = void 0 === e ? null : e;
5084
+ return [function() {
5085
+ return a2(b());
5086
+ }, null === m ? void 0 : function() {
5087
+ return a2(m());
5088
+ }];
5089
+ }, [b, e, l, g]);
5090
+ var d = r(a, c[0], c[1]);
5091
+ u(function() {
5092
+ f.hasValue = true;
5093
+ f.value = d;
5094
+ }, [d]);
5095
+ w(d);
5096
+ return d;
5114
5097
  };
5115
- return withSelector_production;
5098
+ return withSelector_production_min;
5116
5099
  }
5117
5100
  var hasRequiredWithSelector;
5118
5101
  function requireWithSelector() {
5119
5102
  if (hasRequiredWithSelector) return withSelector.exports;
5120
5103
  hasRequiredWithSelector = 1;
5121
5104
  {
5122
- withSelector.exports = requireWithSelector_production();
5105
+ withSelector.exports = requireWithSelector_production_min();
5123
5106
  }
5124
5107
  return withSelector.exports;
5125
5108
  }
@@ -5185,7 +5168,8 @@ function shallow$1(objA, objB) {
5185
5168
  return false;
5186
5169
  }
5187
5170
  if (objA instanceof Map && objB instanceof Map) {
5188
- if (objA.size !== objB.size) return false;
5171
+ if (objA.size !== objB.size)
5172
+ return false;
5189
5173
  for (const [key, value] of objA) {
5190
5174
  if (!Object.is(value, objB.get(key))) {
5191
5175
  return false;
@@ -5194,7 +5178,8 @@ function shallow$1(objA, objB) {
5194
5178
  return true;
5195
5179
  }
5196
5180
  if (objA instanceof Set && objB instanceof Set) {
5197
- if (objA.size !== objB.size) return false;
5181
+ if (objA.size !== objB.size)
5182
+ return false;
5198
5183
  for (const value of objA) {
5199
5184
  if (!objB.has(value)) {
5200
5185
  return false;
@@ -5206,8 +5191,8 @@ function shallow$1(objA, objB) {
5206
5191
  if (keysA.length !== Object.keys(objB).length) {
5207
5192
  return false;
5208
5193
  }
5209
- for (const keyA of keysA) {
5210
- if (!Object.prototype.hasOwnProperty.call(objB, keyA) || !Object.is(objA[keyA], objB[keyA])) {
5194
+ for (let i = 0; i < keysA.length; i++) {
5195
+ if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
5211
5196
  return false;
5212
5197
  }
5213
5198
  }
@@ -8184,29 +8169,6 @@ function NodeResizer({ nodeId, isVisible = true, handleClassName, handleStyle, l
8184
8169
  }
8185
8170
  return jsxs(Fragment, { children: [XY_RESIZER_LINE_POSITIONS.map((position) => jsx(NodeResizeControl, { className: lineClassName, style: lineStyle, nodeId, position, variant: ResizeControlVariant.Line, color: color2, minWidth, minHeight, maxWidth, maxHeight, onResizeStart, keepAspectRatio, shouldResize, onResize, onResizeEnd }, position)), XY_RESIZER_HANDLE_POSITIONS.map((position) => jsx(NodeResizeControl, { className: handleClassName, style: handleStyle, nodeId, position, color: color2, minWidth, minHeight, maxWidth, maxHeight, onResizeStart, keepAspectRatio, shouldResize, onResize, onResizeEnd }, position))] });
8186
8171
  }
8187
- var ThemeContext;
8188
- var getThemeContext = () => {
8189
- if (typeof window !== "undefined") {
8190
- const globalWindow = window;
8191
- if (!globalWindow.__principlemd_theme_context__) {
8192
- globalWindow.__principlemd_theme_context__ = createContext(void 0);
8193
- }
8194
- return globalWindow.__principlemd_theme_context__;
8195
- } else {
8196
- if (!ThemeContext) {
8197
- ThemeContext = createContext(void 0);
8198
- }
8199
- return ThemeContext;
8200
- }
8201
- };
8202
- var ThemeContextSingleton = getThemeContext();
8203
- var useTheme = () => {
8204
- const context = useContext(ThemeContextSingleton);
8205
- if (!context) {
8206
- throw new Error("useTheme must be used within a ThemeProvider");
8207
- }
8208
- return context;
8209
- };
8210
8172
  /**
8211
8173
  * @license lucide-react v0.554.0 - ISC
8212
8174
  *
@@ -47470,7 +47432,7 @@ const CanvasEditorPanel = ({
47470
47432
  canvasFileInfo
47471
47433
  }) => {
47472
47434
  var _a, _b;
47473
- const { theme } = useTheme$1();
47435
+ const { theme } = useTheme();
47474
47436
  const graphRef = useRef(null);
47475
47437
  const [dimensions, setDimensions] = useState({ width: 800, height: 600 });
47476
47438
  const resizeObserverRef = useRef(null);
@@ -48183,7 +48145,7 @@ const NarrativeRenderer = ({
48183
48145
  activeEventIndex,
48184
48146
  showOnlySummary = false
48185
48147
  }) => {
48186
- const { theme } = useTheme$1();
48148
+ const { theme } = useTheme();
48187
48149
  const activeEventRef = React2__default.useRef(null);
48188
48150
  const [contextMenu, setContextMenu] = React2__default.useState({ visible: false, x: 0, y: 0, event: null });
48189
48151
  React2__default.useEffect(() => {
@@ -48718,7 +48680,7 @@ const ScenarioDetailsPanel = ({
48718
48680
  selectedScenario
48719
48681
  }) => {
48720
48682
  var _a;
48721
- const { theme } = useTheme$1();
48683
+ const { theme } = useTheme();
48722
48684
  const [showHelp, setShowHelp] = useState(false);
48723
48685
  const [showExecutionSelector, setShowExecutionSelector] = useState(false);
48724
48686
  const highlightTemplateVariables = (text) => {
@@ -50321,7 +50283,7 @@ const sections$c = [
50321
50283
  { id: "workflow", title: "End-to-End Workflow", component: Step7Workflow }
50322
50284
  ];
50323
50285
  const NarrativeExplainerPanel = ({ className }) => {
50324
- const { theme } = useTheme$1();
50286
+ const { theme } = useTheme();
50325
50287
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["what"]));
50326
50288
  const toggleSection = (id2) => {
50327
50289
  const newExpanded = new Set(expandedSections);
@@ -50476,11 +50438,14 @@ const NarrativeExplainerPanel = ({ className }) => {
50476
50438
  };
50477
50439
  const NarrativeTemplatePanel = ({
50478
50440
  narrativeTemplate,
50441
+ availableExecutions = [],
50442
+ executionScenarioMap = {},
50443
+ onExecutionSelect,
50479
50444
  onScenarioHover,
50480
50445
  onScenarioClick
50481
50446
  }) => {
50482
50447
  var _a;
50483
- const { theme } = useTheme$1();
50448
+ const { theme } = useTheme();
50484
50449
  const handleScenarioClick = (scenarioId, scenario) => {
50485
50450
  if (onScenarioClick) {
50486
50451
  onScenarioClick(scenarioId, scenario);
@@ -50532,7 +50497,11 @@ const NarrativeTemplatePanel = ({
50532
50497
  }
50533
50498
  ),
50534
50499
  /* @__PURE__ */ jsx("div", { style: { flex: 1, overflow: "auto" }, children: (_a = narrativeTemplate.scenarios) == null ? void 0 : _a.map((scenario, index2) => {
50535
- return /* @__PURE__ */ jsx(
50500
+ const scenarioId = scenario.id || String(index2);
50501
+ const matchingExecutions = availableExecutions.filter(
50502
+ (exec) => executionScenarioMap[exec.id] === scenarioId
50503
+ );
50504
+ return /* @__PURE__ */ jsxs(
50536
50505
  "div",
50537
50506
  {
50538
50507
  style: {
@@ -50540,36 +50509,77 @@ const NarrativeTemplatePanel = ({
50540
50509
  borderBottom: `1px solid ${theme.colors.border}`,
50541
50510
  overflow: "hidden"
50542
50511
  },
50543
- children: /* @__PURE__ */ jsx(
50544
- "div",
50545
- {
50546
- onClick: () => handleScenarioClick(scenario.id || String(index2), scenario),
50547
- style: {
50548
- padding: "12px 12px 12px 20px",
50549
- cursor: "pointer",
50550
- display: "flex",
50551
- alignItems: "center",
50552
- transition: "background 0.2s",
50553
- background: "transparent"
50554
- },
50555
- onMouseEnter: (e) => {
50556
- e.currentTarget.style.background = theme.colors.backgroundSecondary;
50557
- if (onScenarioHover) {
50558
- const eventNames = getScenarioEventNames(scenario);
50559
- onScenarioHover(eventNames);
50560
- }
50561
- },
50562
- onMouseLeave: (e) => {
50563
- e.currentTarget.style.background = "transparent";
50564
- if (onScenarioHover) {
50565
- onScenarioHover(null);
50566
- }
50512
+ children: [
50513
+ /* @__PURE__ */ jsx(
50514
+ "div",
50515
+ {
50516
+ onClick: () => handleScenarioClick(scenarioId, scenario),
50517
+ style: {
50518
+ padding: "12px 12px 12px 20px",
50519
+ cursor: "pointer",
50520
+ display: "flex",
50521
+ alignItems: "center",
50522
+ transition: "background 0.2s",
50523
+ background: "transparent"
50524
+ },
50525
+ onMouseEnter: (e) => {
50526
+ e.currentTarget.style.background = theme.colors.backgroundSecondary;
50527
+ if (onScenarioHover) {
50528
+ const eventNames = getScenarioEventNames(scenario);
50529
+ onScenarioHover(eventNames);
50530
+ }
50531
+ },
50532
+ onMouseLeave: (e) => {
50533
+ e.currentTarget.style.background = "transparent";
50534
+ if (onScenarioHover) {
50535
+ onScenarioHover(null);
50536
+ }
50537
+ },
50538
+ children: /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
50539
+ /* @__PURE__ */ jsx("h3", { style: { margin: 0, fontSize: theme.fontSizes[1], fontWeight: 600 }, children: scenarioId.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") }),
50540
+ matchingExecutions.length > 0 && /* @__PURE__ */ jsxs("div", { style: {
50541
+ marginTop: "4px",
50542
+ fontSize: theme.fontSizes[0],
50543
+ color: theme.colors.textSecondary
50544
+ }, children: [
50545
+ matchingExecutions.length,
50546
+ " execution",
50547
+ matchingExecutions.length !== 1 ? "s" : ""
50548
+ ] })
50549
+ ] })
50550
+ }
50551
+ ),
50552
+ matchingExecutions.length > 0 && /* @__PURE__ */ jsx("div", { style: { paddingLeft: "20px", paddingBottom: "8px" }, children: matchingExecutions.map((exec) => /* @__PURE__ */ jsx(
50553
+ "div",
50554
+ {
50555
+ onClick: (e) => {
50556
+ e.stopPropagation();
50557
+ if (onExecutionSelect) {
50558
+ onExecutionSelect(exec.id);
50559
+ }
50560
+ },
50561
+ style: {
50562
+ padding: "6px 12px",
50563
+ marginBottom: "4px",
50564
+ background: theme.colors.backgroundSecondary,
50565
+ borderRadius: "4px",
50566
+ cursor: "pointer",
50567
+ fontSize: theme.fontSizes[0],
50568
+ transition: "background 0.2s"
50569
+ },
50570
+ onMouseEnter: (e) => {
50571
+ e.currentTarget.style.background = theme.colors.border;
50572
+ },
50573
+ onMouseLeave: (e) => {
50574
+ e.currentTarget.style.background = theme.colors.backgroundSecondary;
50575
+ },
50576
+ children: exec.name
50567
50577
  },
50568
- children: /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsx("h3", { style: { margin: 0, fontSize: theme.fontSizes[1], fontWeight: 600 }, children: scenario.id.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") }) })
50569
- }
50570
- )
50578
+ exec.id
50579
+ )) })
50580
+ ]
50571
50581
  },
50572
- scenario.id || index2
50582
+ scenarioId
50573
50583
  );
50574
50584
  }) })
50575
50585
  ]
@@ -50801,7 +50811,7 @@ const CanvasDetailPanel = ({
50801
50811
  narrativeFileInfo: narrativeFileInfoProp
50802
50812
  }) => {
50803
50813
  var _a, _b;
50804
- const { theme } = useTheme$1();
50814
+ const { theme } = useTheme();
50805
50815
  const [state, setState] = useState({
50806
50816
  canvas: null,
50807
50817
  execution: null,
@@ -53314,21 +53324,24 @@ function panelDataHelper(panelDataArray, panelData, layout) {
53314
53324
  pivotIndices
53315
53325
  };
53316
53326
  }
53317
- function S(e) {
53327
+ function C(e) {
53318
53328
  return { "--panel-background": e.colors.background, "--panel-border": e.colors.border, "--panel-handle": e.colors.backgroundSecondary, "--panel-handle-hover": e.colors.backgroundHover, "--panel-handle-active": e.colors.primary, "--panel-button-bg": e.colors.surface, "--panel-button-hover": e.colors.backgroundHover, "--panel-button-border": e.colors.border, "--panel-button-icon": e.colors.textSecondary, "--panel-accent-bg": e.colors.primary + "15" };
53319
53329
  }
53320
- const z = forwardRef(({ panels: o, className: a = "", style: s, theme: d, minPanelWidth: u = 350, idealPanelWidth: p = 0.333, showSeparator: h = false, onPanelChange: m, preventKeyboardScroll: f = true }, g) => {
53321
- const v = useRef(null), b = S(d);
53322
- useImperativeHandle(g, () => ({ scrollToPanel: (e) => {
53323
- if (!v.current) return;
53324
- const t = v.current, n = t.children[e];
53330
+ const z = forwardRef(({ panels: o, className: a = "", style: s, theme: d, minPanelWidth: u = 350, idealPanelWidth: p = 0.333, showSeparator: h = false, onPanelChange: m, preventKeyboardScroll: f = true, disableSwipe: g = false }, v) => {
53331
+ const b = useRef(null), y = useRef(false), w = useRef(null), x = C(d);
53332
+ useImperativeHandle(v, () => ({ scrollToPanel: (e) => {
53333
+ if (!b.current) return;
53334
+ const t = b.current, n = t.children[e];
53325
53335
  if (n) {
53336
+ y.current = true, w.current && clearTimeout(w.current);
53326
53337
  const e2 = n.offsetLeft;
53327
- t.scrollTo({ left: e2, behavior: "smooth" });
53338
+ t.scrollTo({ left: e2, behavior: "smooth" }), w.current = setTimeout(() => {
53339
+ y.current = false;
53340
+ }, 500);
53328
53341
  }
53329
53342
  }, getCurrentPanel: () => {
53330
- if (!v.current || 0 === v.current.children.length) return 0;
53331
- const e = v.current, t = e.getBoundingClientRect().left;
53343
+ if (!b.current || 0 === b.current.children.length) return 0;
53344
+ const e = b.current, t = e.getBoundingClientRect().left;
53332
53345
  let n = 0, r = 1 / 0;
53333
53346
  for (let o2 = 0; o2 < e.children.length; o2++) {
53334
53347
  const i = e.children[o2].getBoundingClientRect(), a2 = Math.abs(i.left - t);
@@ -53337,8 +53350,8 @@ const z = forwardRef(({ panels: o, className: a = "", style: s, theme: d, minPan
53337
53350
  return n;
53338
53351
  } }));
53339
53352
  useEffect(() => {
53340
- if (!f || !v.current) return;
53341
- const e = v.current, t = (e2) => {
53353
+ if (!f || !b.current) return;
53354
+ const e = b.current, t = (e2) => {
53342
53355
  const t2 = e2.target;
53343
53356
  if ("INPUT" === t2.tagName || "TEXTAREA" === t2.tagName || "SELECT" === t2.tagName || t2.isContentEditable || null !== t2.closest(".xterm") || null !== t2.closest('[contenteditable="true"]')) return;
53344
53357
  [" ", "Space", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "PageUp", "PageDown"].includes(e2.key) && e2.preventDefault();
@@ -53346,37 +53359,40 @@ const z = forwardRef(({ panels: o, className: a = "", style: s, theme: d, minPan
53346
53359
  return e.addEventListener("keydown", t), () => {
53347
53360
  e.removeEventListener("keydown", t);
53348
53361
  };
53349
- }, [f]);
53350
- const y = o.length, w = 2 * u;
53351
- let x;
53352
- x = 1 === y || 2 === y ? "100%" : `max(${u}px, ${100 * p}%)`;
53353
- const C = React2__default.useId().replace(/:/g, "_");
53362
+ }, [f]), useEffect(() => () => {
53363
+ w.current && clearTimeout(w.current);
53364
+ }, []);
53365
+ const S = o.length, R = 2 * u;
53366
+ let N;
53367
+ N = 1 === S || 2 === S ? "100%" : `max(${u}px, ${100 * p}%)`;
53368
+ const E = React2__default.useId().replace(/:/g, "_");
53354
53369
  return jsxs(Fragment, { children: [
53355
- 2 === y && /* @__PURE__ */ jsx("style", { children: `
53356
- .snap-carousel-container[data-carousel-id="${C}"][data-panel-count="2"] .snap-carousel-panel {
53370
+ 2 === S && /* @__PURE__ */ jsx("style", { children: `
53371
+ .snap-carousel-container[data-carousel-id="${E}"][data-panel-count="2"] .snap-carousel-panel {
53357
53372
  width: 100%;
53358
53373
  }
53359
- @container (min-width: ${w}px) {
53360
- .snap-carousel-container[data-carousel-id="${C}"][data-panel-count="2"] .snap-carousel-panel {
53374
+ @container (min-width: ${R}px) {
53375
+ .snap-carousel-container[data-carousel-id="${E}"][data-panel-count="2"] .snap-carousel-panel {
53361
53376
  width: 50%;
53362
53377
  }
53363
53378
  }
53364
53379
  ` }),
53365
- /* @__PURE__ */ jsx("div", { ref: v, className: `snap-carousel-container ${a}`, style: { ...b, ...s, "--snap-carousel-min-width": `${u}px`, "--snap-carousel-ideal-width": 100 * p + "%", "--snap-carousel-gap": h ? "1px" : "0px", "--snap-carousel-panel-width": x, "--snap-carousel-panel-count": y, "--snap-carousel-two-panel-threshold": `${w}px` }, onScroll: (e) => {
53366
- if (!m || !v.current || 0 === v.current.children.length) return;
53367
- const t = v.current, n = t.getBoundingClientRect().left;
53380
+ /* @__PURE__ */ jsx("div", { ref: b, className: `snap-carousel-container ${g ? "swipe-disabled" : ""} ${a}`, style: { ...x, ...s, "--snap-carousel-min-width": `${u}px`, "--snap-carousel-ideal-width": 100 * p + "%", "--snap-carousel-gap": h ? "1px" : "0px", "--snap-carousel-panel-width": N, "--snap-carousel-panel-count": S, "--snap-carousel-two-panel-threshold": `${R}px` }, onScroll: (e) => {
53381
+ if (!m || !b.current || 0 === b.current.children.length) return;
53382
+ if (y.current) return;
53383
+ const t = b.current, n = t.getBoundingClientRect().left;
53368
53384
  let r = 0, o2 = 1 / 0;
53369
53385
  for (let i = 0; i < t.children.length; i++) {
53370
53386
  const e2 = t.children[i].getBoundingClientRect(), a2 = Math.abs(e2.left - n);
53371
53387
  a2 < o2 && (o2 = a2, r = i);
53372
53388
  }
53373
53389
  m(r);
53374
- }, "data-panel-count": y, "data-carousel-id": C, children: o.map((t, n) => /* @__PURE__ */ jsx("div", { className: "snap-carousel-panel", children: t }, n)) })
53390
+ }, "data-panel-count": S, "data-carousel-id": E, children: o.map((t, n) => /* @__PURE__ */ jsx("div", { className: "snap-carousel-panel", children: t }, n)) })
53375
53391
  ] });
53376
53392
  });
53377
53393
  z.displayName = "SnapCarousel";
53378
- var le, se;
53379
- (se = le || (le = {})).DragStart = "dragStart", se.DragMove = "dragMove", se.DragEnd = "dragEnd", se.DragCancel = "dragCancel", se.DragOver = "dragOver", se.RegisterDroppable = "registerDroppable", se.SetDroppableDisabled = "setDroppableDisabled", se.UnregisterDroppable = "unregisterDroppable";
53394
+ var le$1, se;
53395
+ (se = le$1 || (le$1 = {})).DragStart = "dragStart", se.DragMove = "dragMove", se.DragEnd = "dragEnd", se.DragCancel = "dragCancel", se.DragOver = "dragOver", se.RegisterDroppable = "registerDroppable", se.SetDroppableDisabled = "setDroppableDisabled", se.UnregisterDroppable = "unregisterDroppable";
53380
53396
  const de = /* @__PURE__ */ Object.freeze({ x: 0, y: 0 });
53381
53397
  var Te, Ae;
53382
53398
  (Ae = Te || (Te = {}))[Ae.Forward = 1] = "Forward", Ae[Ae.Backward = -1] = "Backward";
@@ -53385,8 +53401,8 @@ var _e, je, He, Ke;
53385
53401
  ({ start: [He.Space, He.Enter], cancel: [He.Esc], end: [He.Space, He.Enter, He.Tab] });
53386
53402
  var rt, ot;
53387
53403
  (ot = rt || (rt = {}))[ot.RightClick = 2] = "RightClick";
53388
- var at$1, lt, st, ct;
53389
- (lt = at$1 || (at$1 = {}))[lt.Pointer = 0] = "Pointer", lt[lt.DraggableRect = 1] = "DraggableRect", (ct = st || (st = {}))[ct.TreeOrder = 0] = "TreeOrder", ct[ct.ReversedTreeOrder = 1] = "ReversedTreeOrder";
53404
+ var at, lt, st, ct;
53405
+ (lt = at || (at = {}))[lt.Pointer = 0] = "Pointer", lt[lt.DraggableRect = 1] = "DraggableRect", (ct = st || (st = {}))[ct.TreeOrder = 0] = "TreeOrder", ct[ct.ReversedTreeOrder = 1] = "ReversedTreeOrder";
53390
53406
  ({ x: { [Te.Backward]: false, [Te.Forward]: false }, y: { [Te.Backward]: false, [Te.Forward]: false } });
53391
53407
  var pt, ht, mt;
53392
53408
  (ht = pt || (pt = {}))[ht.Always = 0] = "Always", ht[ht.BeforeDragging = 1] = "BeforeDragging", ht[ht.WhileDragging = 2] = "WhileDragging", (mt || (mt = {})).Optimized = "optimized";
@@ -53402,13 +53418,13 @@ var Ut;
53402
53418
  }
53403
53419
  return Ut || (Ut = createContext(void 0)), Ut;
53404
53420
  })();
53405
- var Pe = Object.defineProperty;
53406
- var We = (o, e, t) => e in o ? Pe(o, e, { enumerable: true, configurable: true, writable: true, value: t }) : o[e] = t;
53407
- var Y = (o, e, t) => We(o, typeof e != "symbol" ? e + "" : e, t);
53408
- class Le {
53421
+ var Ee = Object.defineProperty;
53422
+ var Re = (o, e, t) => e in o ? Ee(o, e, { enumerable: true, configurable: true, writable: true, value: t }) : o[e] = t;
53423
+ var le = (o, e, t) => Re(o, typeof e != "symbol" ? e + "" : e, t);
53424
+ class Me {
53409
53425
  constructor() {
53410
- Y(this, "PRESETS_KEY", "panel-layouts:workspace-presets");
53411
- Y(this, "REPO_STATE_PREFIX", "panel-layouts:repo-state:");
53426
+ le(this, "PRESETS_KEY", "panel-layouts:workspace-presets");
53427
+ le(this, "REPO_STATE_PREFIX", "panel-layouts:repo-state:");
53412
53428
  }
53413
53429
  /**
53414
53430
  * Load all user-created workspace presets
@@ -53468,14 +53484,14 @@ class Le {
53468
53484
  for (let t = 0; t < localStorage.length; t++) {
53469
53485
  const r = localStorage.key(t);
53470
53486
  if (r && r.startsWith(this.REPO_STATE_PREFIX)) {
53471
- const n = r.substring(this.REPO_STATE_PREFIX.length), a = localStorage.getItem(r);
53472
- if (a)
53487
+ const s = r.substring(this.REPO_STATE_PREFIX.length), i = localStorage.getItem(r);
53488
+ if (i)
53473
53489
  try {
53474
- e[n] = JSON.parse(a);
53475
- } catch (i) {
53490
+ e[s] = JSON.parse(i);
53491
+ } catch (a) {
53476
53492
  console.error(
53477
- `Failed to parse repository state for ${n}:`,
53478
- i
53493
+ `Failed to parse repository state for ${s}:`,
53494
+ a
53479
53495
  );
53480
53496
  }
53481
53497
  }
@@ -53486,7 +53502,7 @@ class Le {
53486
53502
  }
53487
53503
  }
53488
53504
  }
53489
- class D {
53505
+ class O {
53490
53506
  /**
53491
53507
  * Configure a custom storage adapter (for Electron IPC or remote storage)
53492
53508
  */
@@ -53513,7 +53529,7 @@ class D {
53513
53529
  * Create a new workspace layout
53514
53530
  */
53515
53531
  static async createWorkspaceLayout(e) {
53516
- const t = await this.adapter.loadWorkspacePresets(), r = this.generateWorkspaceId(e.name), n = {
53532
+ const t = await this.adapter.loadWorkspacePresets(), r = this.generateWorkspaceId(e.name), s = {
53517
53533
  id: r,
53518
53534
  name: e.name,
53519
53535
  description: e.description,
@@ -53523,34 +53539,34 @@ class D {
53523
53539
  createdAt: Date.now(),
53524
53540
  updatedAt: Date.now(),
53525
53541
  isBuiltIn: false
53526
- }, a = {
53542
+ }, i = {
53527
53543
  ...t,
53528
- [r]: n
53544
+ [r]: s
53529
53545
  };
53530
- return await this.adapter.saveWorkspacePresets(a), n;
53546
+ return await this.adapter.saveWorkspacePresets(i), s;
53531
53547
  }
53532
53548
  /**
53533
53549
  * Update an existing workspace layout
53534
53550
  */
53535
53551
  static async updateWorkspaceLayout(e, t) {
53536
- const r = await this.adapter.loadWorkspacePresets(), n = r[e];
53537
- if (!n)
53552
+ const r = await this.adapter.loadWorkspacePresets(), s = r[e];
53553
+ if (!s)
53538
53554
  return console.error(`Workspace layout ${e} not found`), null;
53539
- if (n.isBuiltIn)
53555
+ if (s.isBuiltIn)
53540
53556
  return console.error(`Cannot update built-in workspace layout ${e}`), null;
53541
- const a = {
53542
- ...n,
53557
+ const i = {
53558
+ ...s,
53543
53559
  ...t,
53544
53560
  id: e,
53545
53561
  // Preserve ID
53546
- createdAt: n.createdAt,
53562
+ createdAt: s.createdAt,
53547
53563
  // Preserve creation time
53548
53564
  updatedAt: Date.now()
53549
- }, i = {
53565
+ }, a = {
53550
53566
  ...r,
53551
- [e]: a
53567
+ [e]: i
53552
53568
  };
53553
- return await this.adapter.saveWorkspacePresets(i), a;
53569
+ return await this.adapter.saveWorkspacePresets(a), i;
53554
53570
  }
53555
53571
  /**
53556
53572
  * Delete a workspace layout
@@ -53561,8 +53577,8 @@ class D {
53561
53577
  return console.error(`Workspace layout ${e} not found`), false;
53562
53578
  if (r.isBuiltIn)
53563
53579
  return console.error(`Cannot delete built-in workspace layout ${e}`), false;
53564
- const n = { ...t };
53565
- return delete n[e], await this.adapter.saveWorkspacePresets(n), true;
53580
+ const s = { ...t };
53581
+ return delete s[e], await this.adapter.saveWorkspacePresets(s), true;
53566
53582
  }
53567
53583
  /**
53568
53584
  * Get repository state (which workspace + current sizes/collapsed)
@@ -53600,23 +53616,23 @@ class D {
53600
53616
  * Check if repository state differs from workspace defaults
53601
53617
  */
53602
53618
  static hasStateDeviation(e, t) {
53603
- const r = t.defaultSizes ? JSON.stringify(e.sizes) !== JSON.stringify(t.defaultSizes) : false, n = t.defaultCollapsed ? JSON.stringify(e.collapsed) !== JSON.stringify(t.defaultCollapsed) : false;
53604
- return { hasSizeDeviation: r, hasCollapsedDeviation: n };
53619
+ const r = t.defaultSizes ? JSON.stringify(e.sizes) !== JSON.stringify(t.defaultSizes) : false, s = t.defaultCollapsed ? JSON.stringify(e.collapsed) !== JSON.stringify(t.defaultCollapsed) : false;
53620
+ return { hasSizeDeviation: r, hasCollapsedDeviation: s };
53605
53621
  }
53606
53622
  /**
53607
53623
  * Update workspace defaults from repository state
53608
53624
  */
53609
53625
  static async updateWorkspaceFromRepositoryState(e, t) {
53610
- const r = await this.getWorkspaceLayout(e), n = await this.getRepositoryState(t);
53611
- if (!r || !n || r.isBuiltIn) {
53626
+ const r = await this.getWorkspaceLayout(e), s = await this.getRepositoryState(t);
53627
+ if (!r || !s || r.isBuiltIn) {
53612
53628
  console.error(
53613
53629
  "Cannot update built-in workspace or workspace/state not found"
53614
53630
  );
53615
53631
  return;
53616
53632
  }
53617
53633
  await this.updateWorkspaceLayout(e, {
53618
- defaultSizes: n.sizes,
53619
- defaultCollapsed: n.collapsed
53634
+ defaultSizes: s.sizes,
53635
+ defaultCollapsed: s.collapsed
53620
53636
  });
53621
53637
  }
53622
53638
  /**
@@ -53628,9 +53644,9 @@ class D {
53628
53644
  console.error(`Workspace ${t} not found`);
53629
53645
  return;
53630
53646
  }
53631
- const n = await this.getRepositoryState(e);
53632
- n && await this.setRepositoryState(e, {
53633
- ...n,
53647
+ const s = await this.getRepositoryState(e);
53648
+ s && await this.setRepositoryState(e, {
53649
+ ...s,
53634
53650
  sizes: r.defaultSizes || { left: 20, middle: 45, right: 35 },
53635
53651
  collapsed: r.defaultCollapsed || { left: false, right: false }
53636
53652
  });
@@ -53646,8 +53662,8 @@ class D {
53646
53662
  */
53647
53663
  static async findMatchingWorkspace(e) {
53648
53664
  const t = await this.getWorkspaceLayouts();
53649
- for (const [r, n] of Object.entries(t))
53650
- if (this.isLayoutMatchingWorkspace(e, n))
53665
+ for (const [r, s] of Object.entries(t))
53666
+ if (this.isLayoutMatchingWorkspace(e, s))
53651
53667
  return r;
53652
53668
  return null;
53653
53669
  }
@@ -53875,17 +53891,17 @@ class D {
53875
53891
  Object.keys(e).length;
53876
53892
  }
53877
53893
  }
53878
- Y(D, "adapter", new Le());
53879
- function at(o, e, t, r) {
53894
+ le(O, "adapter", new Me());
53895
+ function gt(o, e, t, r) {
53880
53896
  useEffect(() => {
53881
- const n = e.on(
53897
+ const s = e.on(
53882
53898
  "panel:focus",
53883
- (i) => {
53884
- i.payload.panelId === o && t();
53899
+ (a) => {
53900
+ a.payload.panelId === o && t();
53885
53901
  }
53886
53902
  );
53887
53903
  return () => {
53888
- n();
53904
+ s();
53889
53905
  };
53890
53906
  }, [o, e, t, r]);
53891
53907
  }
@@ -54043,9 +54059,9 @@ const CanvasListPanel = ({
54043
54059
  actions,
54044
54060
  events
54045
54061
  }) => {
54046
- const { theme } = useTheme$1();
54062
+ const { theme } = useTheme();
54047
54063
  const panelRef = useRef(null);
54048
- at("canvas-list", events, () => {
54064
+ gt("canvas-list", events, () => {
54049
54065
  var _a;
54050
54066
  return (_a = panelRef.current) == null ? void 0 : _a.focus();
54051
54067
  });
@@ -54078,7 +54094,7 @@ const CanvasListPanel = ({
54078
54094
  return filtered;
54079
54095
  }, [canvases, searchQuery]);
54080
54096
  const handleTreeNodeClick = useCallback((node) => {
54081
- if (node.type === "canvas" && node.canvas) {
54097
+ if (node.type === "storyboard" && node.canvas) {
54082
54098
  setSelectedCanvasId(node.canvas.id);
54083
54099
  if (events) {
54084
54100
  const canvasFileInfo = getCanvasFileInfo(node.canvas.path);
@@ -54087,10 +54103,12 @@ const CanvasListPanel = ({
54087
54103
  source: "canvas-list-panel",
54088
54104
  timestamp: Date.now(),
54089
54105
  payload: {
54090
- action: "selectCanvas",
54106
+ action: "openCanvas",
54091
54107
  canvasId: node.canvas.id,
54092
54108
  canvas: node.canvas,
54093
- canvasFileInfo
54109
+ canvasFileInfo,
54110
+ openMode: "editor"
54111
+ // Indicates canvas editor should be opened
54094
54112
  }
54095
54113
  });
54096
54114
  }
@@ -54104,38 +54122,21 @@ const CanvasListPanel = ({
54104
54122
  source: "canvas-list-panel",
54105
54123
  timestamp: Date.now(),
54106
54124
  payload: {
54107
- action: "selectCanvas",
54125
+ action: "openCanvas",
54108
54126
  canvasId: node.canvas.id,
54109
54127
  canvas: node.canvas,
54110
54128
  canvasFileInfo,
54111
54129
  narrativeId: node.narrative.id,
54112
54130
  narrative: node.narrative,
54113
54131
  narrativeTemplate: node.narrativeTemplate,
54114
- narrativeFileInfo
54132
+ narrativeFileInfo,
54133
+ openMode: "detail"
54134
+ // Indicates canvas detail should be opened
54115
54135
  }
54116
54136
  });
54117
54137
  }
54118
54138
  }
54119
54139
  }, [events, getCanvasFileInfo]);
54120
- const handleOpenCanvas = useCallback((canvas) => {
54121
- if (actions == null ? void 0 : actions.openFile) {
54122
- actions.openFile(canvas.path);
54123
- }
54124
- if (events) {
54125
- const canvasFileInfo = getCanvasFileInfo(canvas.path);
54126
- events.emit({
54127
- type: "custom",
54128
- source: "canvas-list-panel",
54129
- timestamp: Date.now(),
54130
- payload: {
54131
- action: "openCanvas",
54132
- canvasId: canvas.id,
54133
- canvas,
54134
- canvasFileInfo
54135
- }
54136
- });
54137
- }
54138
- }, [actions, events, getCanvasFileInfo]);
54139
54140
  const handleRefresh = () => {
54140
54141
  setIsRefreshing(true);
54141
54142
  if (events) {
@@ -54402,7 +54403,6 @@ const CanvasListPanel = ({
54402
54403
  narratives,
54403
54404
  theme,
54404
54405
  onClick: handleTreeNodeClick,
54405
- onOpenCanvas: handleOpenCanvas,
54406
54406
  selectedNodeId: selectedCanvasId ? `canvas:${selectedCanvasId}` : void 0,
54407
54407
  defaultOpen: false,
54408
54408
  horizontalNodePadding: "clamp(16px, 4vw, 24px)",
@@ -54669,7 +54669,7 @@ const EventControllerPanel = ({
54669
54669
  autoPlay = false,
54670
54670
  loop = false
54671
54671
  }) => {
54672
- const { theme } = useTheme$1();
54672
+ const { theme } = useTheme();
54673
54673
  const [status, setStatus] = useState("stopped");
54674
54674
  const [currentIndex, setCurrentIndex] = useState(-1);
54675
54675
  const [speed, setSpeed] = useState(defaultSpeed);
@@ -55585,7 +55585,7 @@ const sections$b = [
55585
55585
  { id: "workflow", title: "End-to-End Workflow", component: Step7EndToEnd$1 }
55586
55586
  ];
55587
55587
  const LibraryAnchoringExplainerPanel = ({ className }) => {
55588
- const { theme } = useTheme$1();
55588
+ const { theme } = useTheme();
55589
55589
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["what"]));
55590
55590
  const toggleSection = (id2) => {
55591
55591
  const newExpanded = new Set(expandedSections);
@@ -56166,7 +56166,7 @@ const sections$a = [
56166
56166
  { id: "workflow", title: "Complete Workflow", component: Step7EndToEnd }
56167
56167
  ];
56168
56168
  const RuntimeValidationExplainerPanel = ({ className }) => {
56169
- const { theme } = useTheme$1();
56169
+ const { theme } = useTheme();
56170
56170
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["problem"]));
56171
56171
  const toggleSection = (id2) => {
56172
56172
  const newExpanded = new Set(expandedSections);
@@ -56757,7 +56757,7 @@ const sections$9 = [
56757
56757
  { id: "together", title: "How They Work Together", component: Step7WorkingTogether }
56758
56758
  ];
56759
56759
  const TestVsProductionExplainerPanel = ({ className }) => {
56760
- const { theme } = useTheme$1();
56760
+ const { theme } = useTheme();
56761
56761
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["infrastructure"]));
56762
56762
  const toggleSection = (id2) => {
56763
56763
  const newExpanded = new Set(expandedSections);
@@ -57302,7 +57302,7 @@ const sections$8 = [
57302
57302
  { id: "benefits", title: "Why This Matters", component: Step7Benefits$4 }
57303
57303
  ];
57304
57304
  const ScenarioEnumerationExplainerPanel = ({ className }) => {
57305
- const { theme } = useTheme$1();
57305
+ const { theme } = useTheme();
57306
57306
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["problem"]));
57307
57307
  const toggleSection = (id2) => {
57308
57308
  const newExpanded = new Set(expandedSections);
@@ -57916,7 +57916,7 @@ const sections$7 = [
57916
57916
  { id: "evolution", title: "Evolution Path", component: Step7Evolution }
57917
57917
  ];
57918
57918
  const CanvasTypesExplainerPanel = ({ className }) => {
57919
- const { theme } = useTheme$1();
57919
+ const { theme } = useTheme();
57920
57920
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["types"]));
57921
57921
  const toggleSection = (id2) => {
57922
57922
  const newExpanded = new Set(expandedSections);
@@ -58468,7 +58468,7 @@ const sections$6 = [
58468
58468
  { id: "benefits", title: "Benefits of Composability", component: Step7Benefits$3 }
58469
58469
  ];
58470
58470
  const MonorepoComposabilityExplainerPanel = ({ className }) => {
58471
- const { theme } = useTheme$1();
58471
+ const { theme } = useTheme();
58472
58472
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["challenge"]));
58473
58473
  const toggleSection = (id2) => {
58474
58474
  const newExpanded = new Set(expandedSections);
@@ -59037,7 +59037,7 @@ const sections$5 = [
59037
59037
  { id: "benefits", title: "Why It Matters", component: Step7Benefits$2 }
59038
59038
  ];
59039
59039
  const HierarchicalCanvasCompositionExplainerPanel = ({ className }) => {
59040
- const { theme } = useTheme$1();
59040
+ const { theme } = useTheme();
59041
59041
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["pattern"]));
59042
59042
  const toggleSection = (id2) => {
59043
59043
  const newExpanded = new Set(expandedSections);
@@ -59556,7 +59556,7 @@ const sections$4 = [
59556
59556
  { id: "why", title: "Why This Analogy Works", component: Step7WhyItWorks }
59557
59557
  ];
59558
59558
  const BookAnalogyExplainerPanel = ({ className }) => {
59559
- const { theme } = useTheme$1();
59559
+ const { theme } = useTheme();
59560
59560
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["structure"]));
59561
59561
  const toggleSection = (id2) => {
59562
59562
  const newExpanded = new Set(expandedSections);
@@ -60062,7 +60062,7 @@ const sections$3 = [
60062
60062
  { id: "benefits", title: "Why This Works", component: Step7Benefits$1 }
60063
60063
  ];
60064
60064
  const ProductionDebuggingExplainerPanel = ({ className }) => {
60065
- const { theme } = useTheme$1();
60065
+ const { theme } = useTheme();
60066
60066
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["scenario"]));
60067
60067
  const toggleSection = (id2) => {
60068
60068
  const newExpanded = new Set(expandedSections);
@@ -60635,7 +60635,7 @@ const sections$2 = [
60635
60635
  { id: "benefits", title: "Why It Matters", component: Step6Benefits$1 }
60636
60636
  ];
60637
60637
  const MultipleCanvasViewsExplainerPanel = ({ className }) => {
60638
- const { theme } = useTheme$1();
60638
+ const { theme } = useTheme();
60639
60639
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["onetrace"]));
60640
60640
  const toggleSection = (id2) => {
60641
60641
  const newExpanded = new Set(expandedSections);
@@ -61138,7 +61138,7 @@ const sections$1 = [
61138
61138
  { id: "implementation", title: "Implementation", component: Step7Implementation }
61139
61139
  ];
61140
61140
  const TelemetryCoverageExplainerPanel = ({ className }) => {
61141
- const { theme } = useTheme$1();
61141
+ const { theme } = useTheme();
61142
61142
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["problem"]));
61143
61143
  const toggleSection = (id2) => {
61144
61144
  const newExpanded = new Set(expandedSections);
@@ -61629,7 +61629,7 @@ const sections = [
61629
61629
  { id: "benefits", title: "Why It Matters", component: Step7Benefits }
61630
61630
  ];
61631
61631
  const ChangeImpactAnalysisExplainerPanel = ({ className }) => {
61632
- const { theme } = useTheme$1();
61632
+ const { theme } = useTheme();
61633
61633
  const [expandedSections, setExpandedSections] = useState(/* @__PURE__ */ new Set(["problem"]));
61634
61634
  const toggleSection = (id2) => {
61635
61635
  const newExpanded = new Set(expandedSections);