@grafloria/element 0.3.19 → 0.3.20
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.
- package/{src/index.ts → esm/src/index.js} +60 -569
- package/esm/src/lib/dashboard-kit/dashboard.js +590 -0
- package/esm/src/lib/dashboard-kit/grid-binder.js +1633 -0
- package/esm/src/lib/dashboard-kit/grid-mapping.js +164 -0
- package/esm/src/lib/dashboard-kit/index.js +8 -0
- package/{src/lib/dashboard-kit/styles.ts → esm/src/lib/dashboard-kit/styles.js} +8 -9
- package/esm/src/lib/dashboard-kit/widgets.js +379 -0
- package/esm/src/lib/diagram-kit/card.js +199 -0
- package/esm/src/lib/diagram-kit/editing.js +448 -0
- package/esm/src/lib/diagram-kit/er.js +160 -0
- package/esm/src/lib/diagram-kit/handles.js +312 -0
- package/esm/src/lib/diagram-kit/index.js +15 -0
- package/esm/src/lib/diagram-kit/join-guidance.js +322 -0
- package/esm/src/lib/diagram-kit/rows.js +144 -0
- package/{src/lib/diagram-kit/styles.ts → esm/src/lib/diagram-kit/styles.js} +10 -10
- package/esm/src/lib/diagram-kit/uml.js +135 -0
- package/esm/src/lib/diagram-kit/update.js +244 -0
- package/esm/src/lib/grafloria-flow-element.js +266 -0
- package/esm/src/lib/grafloria.js +69 -0
- package/esm/src/lib/load.js +252 -0
- package/esm/src/lib/node-type-registry.js +42 -0
- package/esm/src/lib/stencil-kit/builders.js +18 -0
- package/esm/src/lib/stencil-kit/card-builders.js +105 -0
- package/esm/src/lib/stencil-kit/index.js +9 -0
- package/esm/src/lib/stencil-kit/palette.js +427 -0
- package/esm/src/lib/stencil-kit/shape-data.js +537 -0
- package/{src/lib/stencil-kit/styles.ts → esm/src/lib/stencil-kit/styles.js} +9 -9
- package/package.json +12 -3
- package/jest.config.ts +0 -16
- package/project.json +0 -44
- package/src/front-door-probe.spec.ts +0 -173
- package/src/index.js.map +0 -1
- package/src/lib/dashboard-kit/dashboard.js.map +0 -1
- package/src/lib/dashboard-kit/dashboard.spec.ts +0 -821
- package/src/lib/dashboard-kit/dashboard.ts +0 -906
- package/src/lib/dashboard-kit/grid-binder.js.map +0 -1
- package/src/lib/dashboard-kit/grid-binder.ts +0 -1976
- package/src/lib/dashboard-kit/grid-mapping.js.map +0 -1
- package/src/lib/dashboard-kit/grid-mapping.spec.ts +0 -308
- package/src/lib/dashboard-kit/grid-mapping.ts +0 -283
- package/src/lib/dashboard-kit/index.js.map +0 -1
- package/src/lib/dashboard-kit/index.ts +0 -56
- package/src/lib/dashboard-kit/styles.js.map +0 -1
- package/src/lib/dashboard-kit/widgets.js.map +0 -1
- package/src/lib/dashboard-kit/widgets.spec.ts +0 -239
- package/src/lib/dashboard-kit/widgets.ts +0 -484
- package/src/lib/diagram-kit/card.js.map +0 -1
- package/src/lib/diagram-kit/card.ts +0 -219
- package/src/lib/diagram-kit/diagram-kit.spec.ts +0 -465
- package/src/lib/diagram-kit/editing.js.map +0 -1
- package/src/lib/diagram-kit/editing.spec.ts +0 -172
- package/src/lib/diagram-kit/editing.ts +0 -493
- package/src/lib/diagram-kit/er.js.map +0 -1
- package/src/lib/diagram-kit/er.ts +0 -246
- package/src/lib/diagram-kit/handles.js.map +0 -1
- package/src/lib/diagram-kit/handles.spec.ts +0 -224
- package/src/lib/diagram-kit/handles.ts +0 -375
- package/src/lib/diagram-kit/index.js.map +0 -1
- package/src/lib/diagram-kit/index.ts +0 -66
- package/src/lib/diagram-kit/join-guidance.js.map +0 -1
- package/src/lib/diagram-kit/join-guidance.spec.ts +0 -241
- package/src/lib/diagram-kit/join-guidance.ts +0 -390
- package/src/lib/diagram-kit/rows.js.map +0 -1
- package/src/lib/diagram-kit/rows.ts +0 -174
- package/src/lib/diagram-kit/styles.js.map +0 -1
- package/src/lib/diagram-kit/uml.js.map +0 -1
- package/src/lib/diagram-kit/uml.ts +0 -213
- package/src/lib/diagram-kit/update.js.map +0 -1
- package/src/lib/diagram-kit/update.spec.ts +0 -208
- package/src/lib/diagram-kit/update.ts +0 -324
- package/src/lib/grafloria-flow-element.js.map +0 -1
- package/src/lib/grafloria-flow-element.spec.ts +0 -290
- package/src/lib/grafloria-flow-element.ts +0 -298
- package/src/lib/grafloria.js.map +0 -1
- package/src/lib/grafloria.ts +0 -151
- package/src/lib/load.js.map +0 -1
- package/src/lib/load.spec.ts +0 -565
- package/src/lib/load.ts +0 -359
- package/src/lib/node-type-registry.js.map +0 -1
- package/src/lib/node-type-registry.ts +0 -76
- package/src/lib/stencil-kit/builders.js.map +0 -1
- package/src/lib/stencil-kit/builders.ts +0 -58
- package/src/lib/stencil-kit/card-builders.js.map +0 -1
- package/src/lib/stencil-kit/card-builders.ts +0 -113
- package/src/lib/stencil-kit/index.js.map +0 -1
- package/src/lib/stencil-kit/index.ts +0 -17
- package/src/lib/stencil-kit/palette.js.map +0 -1
- package/src/lib/stencil-kit/palette.ts +0 -482
- package/src/lib/stencil-kit/shape-data.js.map +0 -1
- package/src/lib/stencil-kit/shape-data.spec.ts +0 -470
- package/src/lib/stencil-kit/shape-data.ts +0 -680
- package/src/lib/stencil-kit/styles.js.map +0 -1
- package/src/libs/element/src/index.js.map +0 -1
- package/src/libs/element/src/lib/dashboard-kit/dashboard.js.map +0 -1
- package/src/libs/element/src/lib/dashboard-kit/grid-binder.js.map +0 -1
- package/src/libs/element/src/lib/dashboard-kit/grid-mapping.js.map +0 -1
- package/src/libs/element/src/lib/dashboard-kit/index.js.map +0 -1
- package/src/libs/element/src/lib/dashboard-kit/styles.js.map +0 -1
- package/src/libs/element/src/lib/dashboard-kit/widgets.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/card.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/editing.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/er.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/handles.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/index.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/join-guidance.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/rows.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/styles.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/uml.js.map +0 -1
- package/src/libs/element/src/lib/diagram-kit/update.js.map +0 -1
- package/src/libs/element/src/lib/grafloria-flow-element.js.map +0 -1
- package/src/libs/element/src/lib/grafloria.js.map +0 -1
- package/src/libs/element/src/lib/load.js.map +0 -1
- package/src/libs/element/src/lib/node-type-registry.js.map +0 -1
- package/src/libs/element/src/lib/stencil-kit/builders.js.map +0 -1
- package/src/libs/element/src/lib/stencil-kit/card-builders.js.map +0 -1
- package/src/libs/element/src/lib/stencil-kit/index.js.map +0 -1
- package/src/libs/element/src/lib/stencil-kit/palette.js.map +0 -1
- package/src/libs/element/src/lib/stencil-kit/shape-data.js.map +0 -1
- package/src/libs/element/src/lib/stencil-kit/styles.js.map +0 -1
- package/src/libs/engine/src/adapters/component-adapter.interface.js.map +0 -1
- package/src/libs/engine/src/adapters/index.js.map +0 -1
- package/src/libs/engine/src/clipboard/ClipboardManager.js.map +0 -1
- package/src/libs/engine/src/clipboard/index.js.map +0 -1
- package/src/libs/engine/src/collab/apply-op.js.map +0 -1
- package/src/libs/engine/src/collab/capture.js.map +0 -1
- package/src/libs/engine/src/collab/index.js.map +0 -1
- package/src/libs/engine/src/collab/integrity.js.map +0 -1
- package/src/libs/engine/src/collab/lww.js.map +0 -1
- package/src/libs/engine/src/collab/op-log.js.map +0 -1
- package/src/libs/engine/src/collab/op.js.map +0 -1
- package/src/libs/engine/src/collab/replica.js.map +0 -1
- package/src/libs/engine/src/collab/undo.js.map +0 -1
- package/src/libs/engine/src/commands/Command.js.map +0 -1
- package/src/libs/engine/src/commands/CommandManager.js.map +0 -1
- package/src/libs/engine/src/commands/basic/AddGroupCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/AddLinkCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/AddNodeCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/AddToGroupCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/AlignCommands.js.map +0 -1
- package/src/libs/engine/src/commands/basic/CollapseGroupCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/CopyCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/CutCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/DeleteSelectionCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/DuplicateCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/ExpandGroupCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/MoveGroupCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/MoveNodeCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/NodeZOrderCommands.js.map +0 -1
- package/src/libs/engine/src/commands/basic/PasteCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/PortCommands.js.map +0 -1
- package/src/libs/engine/src/commands/basic/ReconnectLinkCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/RemoveFromGroupCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/RemoveGroupCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/RemoveLinkCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/RemoveNodeCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/ResizeNodeCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/RotateNodeCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetFlexItemCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetGridItemCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetLayoutCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetLinkDisplayLabelCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetLinkLabelCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetLinkLabelsCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetLinkPathTypeCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetLinkPointsCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetNodeDataCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetNodeLabelCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetNodeShapeConfigCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetNodeStyleCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetParentCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/SetStrokePointsCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/StrokeLifecycleCommands.js.map +0 -1
- package/src/libs/engine/src/commands/basic/UpdateLinkStyleCommand.js.map +0 -1
- package/src/libs/engine/src/commands/basic/index.js.map +0 -1
- package/src/libs/engine/src/commands/basic/remapNodePortIds.js.map +0 -1
- package/src/libs/engine/src/commands/basic/resolveLinkNodeIds.js.map +0 -1
- package/src/libs/engine/src/commands/composite/BatchCommand.js.map +0 -1
- package/src/libs/engine/src/commands/composite/MacroCommand.js.map +0 -1
- package/src/libs/engine/src/commands/composite/index.js.map +0 -1
- package/src/libs/engine/src/commands/index.js.map +0 -1
- package/src/libs/engine/src/comments/comment-store.js.map +0 -1
- package/src/libs/engine/src/comments/index.js.map +0 -1
- package/src/libs/engine/src/comments/mentions.js.map +0 -1
- package/src/libs/engine/src/comments/read-state.js.map +0 -1
- package/src/libs/engine/src/comments/types.js.map +0 -1
- package/src/libs/engine/src/config/InteractionConfig.js.map +0 -1
- package/src/libs/engine/src/config/index.js.map +0 -1
- package/src/libs/engine/src/dsl/DSL.js.map +0 -1
- package/src/libs/engine/src/dsl/advanced/StyleParser.js.map +0 -1
- package/src/libs/engine/src/dsl/advanced/TemplateParser.js.map +0 -1
- package/src/libs/engine/src/dsl/advanced/index.js.map +0 -1
- package/src/libs/engine/src/dsl/detector/LayoutDetector.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/BPMNGenerator.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/BPMNParser.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/ERDGenerator.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/ERDParser.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/ERDTransformer.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/UMLGenerator.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/UMLParser.js.map +0 -1
- package/src/libs/engine/src/dsl/extended/index.js.map +0 -1
- package/src/libs/engine/src/dsl/generator/DSLFormatter.js.map +0 -1
- package/src/libs/engine/src/dsl/generator/DSLGenerator.js.map +0 -1
- package/src/libs/engine/src/dsl/generator/DiagramAnalyzer.js.map +0 -1
- package/src/libs/engine/src/dsl/index.js.map +0 -1
- package/src/libs/engine/src/dsl/lexer/Lexer.js.map +0 -1
- package/src/libs/engine/src/dsl/mermaid/MermaidClass.js.map +0 -1
- package/src/libs/engine/src/dsl/mermaid/MermaidER.js.map +0 -1
- package/src/libs/engine/src/dsl/mermaid/MermaidState.js.map +0 -1
- package/src/libs/engine/src/dsl/mermaid/index.js.map +0 -1
- package/src/libs/engine/src/dsl/mermaid/layout.js.map +0 -1
- package/src/libs/engine/src/dsl/mermaid/lines.js.map +0 -1
- package/src/libs/engine/src/dsl/parser/Parser.js.map +0 -1
- package/src/libs/engine/src/dsl/sync/BidirectionalSync.js.map +0 -1
- package/src/libs/engine/src/dsl/sync/IntegratedSyncManager.js.map +0 -1
- package/src/libs/engine/src/dsl/sync/LayoutApplicator.js.map +0 -1
- package/src/libs/engine/src/dsl/sync/SyncStateManager.js.map +0 -1
- package/src/libs/engine/src/dsl/sync/index.js.map +0 -1
- package/src/libs/engine/src/dsl/transformer/ASTTransformer.js.map +0 -1
- package/src/libs/engine/src/dsl/types/ASTNode.js.map +0 -1
- package/src/libs/engine/src/dsl/types/Token.js.map +0 -1
- package/src/libs/engine/src/engine/DiagramEngine.js.map +0 -1
- package/src/libs/engine/src/engine/DiagramMode.js.map +0 -1
- package/src/libs/engine/src/engine/DiagramModeTypes.js.map +0 -1
- package/src/libs/engine/src/engine/ModeManager.js.map +0 -1
- package/src/libs/engine/src/engine/index.js.map +0 -1
- package/src/libs/engine/src/events/EventBus.js.map +0 -1
- package/src/libs/engine/src/events/index.js.map +0 -1
- package/src/libs/engine/src/index.js.map +0 -1
- package/src/libs/engine/src/interaction/GroupCollapseService.js.map +0 -1
- package/src/libs/engine/src/interaction/GroupMembershipService.js.map +0 -1
- package/src/libs/engine/src/interaction/SemanticMembershipService.js.map +0 -1
- package/src/libs/engine/src/interaction/SwimlaneService.js.map +0 -1
- package/src/libs/engine/src/interaction/index.js.map +0 -1
- package/src/libs/engine/src/interop/drawio/importDrawio.js.map +0 -1
- package/src/libs/engine/src/interop/drawio/index.js.map +0 -1
- package/src/libs/engine/src/interop/drawio/xml.js.map +0 -1
- package/src/libs/engine/src/layout/CompoundLayoutService.js.map +0 -1
- package/src/libs/engine/src/layout/ILayoutAlgorithm.js.map +0 -1
- package/src/libs/engine/src/layout/LayoutManager.js.map +0 -1
- package/src/libs/engine/src/layout/SmartSpacingCalculator.js.map +0 -1
- package/src/libs/engine/src/layout/ViewportTransform.js.map +0 -1
- package/src/libs/engine/src/layout/algorithms/ForceDirectedLayoutAlgorithm.js.map +0 -1
- package/src/libs/engine/src/layout/algorithms/GridLayoutAlgorithm.js.map +0 -1
- package/src/libs/engine/src/layout/algorithms/HierarchicalLayoutAlgorithm.js.map +0 -1
- package/src/libs/engine/src/layout/algorithms/HybridLayoutAlgorithm.js.map +0 -1
- package/src/libs/engine/src/layout/community-layout-adapter.js.map +0 -1
- package/src/libs/engine/src/layout/component-packing.js.map +0 -1
- package/src/libs/engine/src/layout/dagre-layout-adapter.js.map +0 -1
- package/src/libs/engine/src/layout/edge-bundling.interface.js.map +0 -1
- package/src/libs/engine/src/layout/elk-layout-adapter.js.map +0 -1
- package/src/libs/engine/src/layout/elk-loader.js.map +0 -1
- package/src/libs/engine/src/layout/force-layout-adapter.js.map +0 -1
- package/src/libs/engine/src/layout/grid-pack/grid-pack-engine.js.map +0 -1
- package/src/libs/engine/src/layout/incremental/mental-map.js.map +0 -1
- package/src/libs/engine/src/layout/incremental-layout.interface.js.map +0 -1
- package/src/libs/engine/src/layout/index.js.map +0 -1
- package/src/libs/engine/src/layout/layout-adapter.interface.js.map +0 -1
- package/src/libs/engine/src/layout/layout-auto-select.js.map +0 -1
- package/src/libs/engine/src/layout/layout-constraints.interface.js.map +0 -1
- package/src/libs/engine/src/layout/layout-graph.js.map +0 -1
- package/src/libs/engine/src/layout/layout-history.js.map +0 -1
- package/src/libs/engine/src/layout/layout-host.js.map +0 -1
- package/src/libs/engine/src/layout/layout-presets.js.map +0 -1
- package/src/libs/engine/src/layout/layout-quality-extended.js.map +0 -1
- package/src/libs/engine/src/layout/layout-quality-metrics.js.map +0 -1
- package/src/libs/engine/src/layout/layout-registry.js.map +0 -1
- package/src/libs/engine/src/layout/layout.service.js.map +0 -1
- package/src/libs/engine/src/layout/overlap-removal.js.map +0 -1
- package/src/libs/engine/src/layout/port-aware-layout.interface.js.map +0 -1
- package/src/libs/engine/src/layout/port-label-bridge.js.map +0 -1
- package/src/libs/engine/src/layout/portfolio-layouts.js.map +0 -1
- package/src/libs/engine/src/layout/rng.js.map +0 -1
- package/src/libs/engine/src/layout/spectral-layout-adapter.js.map +0 -1
- package/src/libs/engine/src/layout/steppable-layout.js.map +0 -1
- package/src/libs/engine/src/layout/subgraph-layout.interface.js.map +0 -1
- package/src/libs/engine/src/layout/sugiyama/layered-layout.js.map +0 -1
- package/src/libs/engine/src/layout/sugiyama/sugiyama.js.map +0 -1
- package/src/libs/engine/src/layout/tree-layout.js.map +0 -1
- package/src/libs/engine/src/layout/types.js.map +0 -1
- package/src/libs/engine/src/lib/performance/mobile-performance.service.js.map +0 -1
- package/src/libs/engine/src/models/DiagramEntity.js.map +0 -1
- package/src/libs/engine/src/models/DiagramModel.js.map +0 -1
- package/src/libs/engine/src/models/GroupModel.js.map +0 -1
- package/src/libs/engine/src/models/LinkModel.js.map +0 -1
- package/src/libs/engine/src/models/NodeModel.js.map +0 -1
- package/src/libs/engine/src/models/PortModel.js.map +0 -1
- package/src/libs/engine/src/models/StrokeModel.js.map +0 -1
- package/src/libs/engine/src/models/index.js.map +0 -1
- package/src/libs/engine/src/models/readonly-lock.js.map +0 -1
- package/src/libs/engine/src/performance/LRUCache.js.map +0 -1
- package/src/libs/engine/src/performance/PerformanceMonitor.js.map +0 -1
- package/src/libs/engine/src/performance/SpatialIndex.js.map +0 -1
- package/src/libs/engine/src/performance/index.js.map +0 -1
- package/src/libs/engine/src/plugins/PluginManager.js.map +0 -1
- package/src/libs/engine/src/plugins/index.js.map +0 -1
- package/src/libs/engine/src/ports/connection-rules.js.map +0 -1
- package/src/libs/engine/src/ports/dynamic-ports.js.map +0 -1
- package/src/libs/engine/src/ports/index.js.map +0 -1
- package/src/libs/engine/src/ports/port-groups.js.map +0 -1
- package/src/libs/engine/src/ports/port-type-registry.js.map +0 -1
- package/src/libs/engine/src/ports/port-types.js.map +0 -1
- package/src/libs/engine/src/rendering/HtmlTemplateRenderer.js.map +0 -1
- package/src/libs/engine/src/rendering/LemonadeJSRenderer.js.map +0 -1
- package/src/libs/engine/src/rendering/index.js.map +0 -1
- package/src/libs/engine/src/routing/LiveReroutingEngine.js.map +0 -1
- package/src/libs/engine/src/routing/ObstacleIndex.js.map +0 -1
- package/src/libs/engine/src/routing/ObstacleMap.js.map +0 -1
- package/src/libs/engine/src/routing/ObstacleMapBuilder.js.map +0 -1
- package/src/libs/engine/src/routing/PathSimplifier.js.map +0 -1
- package/src/libs/engine/src/routing/RoutingEngine.js.map +0 -1
- package/src/libs/engine/src/routing/algorithms/AStarRouter.js.map +0 -1
- package/src/libs/engine/src/routing/algorithms/DijkstraRouter.js.map +0 -1
- package/src/libs/engine/src/routing/algorithms/ElkRouter.js.map +0 -1
- package/src/libs/engine/src/routing/algorithms/ManhattanRouter.js.map +0 -1
- package/src/libs/engine/src/routing/algorithms/OrthogonalRouter.js.map +0 -1
- package/src/libs/engine/src/routing/algorithms/StraightRouter.js.map +0 -1
- package/src/libs/engine/src/routing/algorithms/VisibilityGraphRouter.js.map +0 -1
- package/src/libs/engine/src/routing/global/GlobalRouteSolver.js.map +0 -1
- package/src/libs/engine/src/routing/global/solver-host.js.map +0 -1
- package/src/libs/engine/src/routing/index.js.map +0 -1
- package/src/libs/engine/src/routing/types.js.map +0 -1
- package/src/libs/engine/src/selection/SelectionManager.js.map +0 -1
- package/src/libs/engine/src/selection/index.js.map +0 -1
- package/src/libs/engine/src/serialization/DiagramMigrations.js.map +0 -1
- package/src/libs/engine/src/serialization/DiagramValidator.js.map +0 -1
- package/src/libs/engine/src/serialization/DocumentEnvelope.js.map +0 -1
- package/src/libs/engine/src/serialization/Incremental.js.map +0 -1
- package/src/libs/engine/src/serialization/Serializer.js.map +0 -1
- package/src/libs/engine/src/serialization/Subgraph.js.map +0 -1
- package/src/libs/engine/src/serialization/TextFormat.js.map +0 -1
- package/src/libs/engine/src/state/ConnectionStateManager.js.map +0 -1
- package/src/libs/engine/src/state/DiagramStore.js.map +0 -1
- package/src/libs/engine/src/state/index.js.map +0 -1
- package/src/libs/engine/src/sync/awareness.js.map +0 -1
- package/src/libs/engine/src/sync/batcher.js.map +0 -1
- package/src/libs/engine/src/sync/causal-buffer.js.map +0 -1
- package/src/libs/engine/src/sync/index.js.map +0 -1
- package/src/libs/engine/src/sync/protocol.js.map +0 -1
- package/src/libs/engine/src/sync/sync-adapter.js.map +0 -1
- package/src/libs/engine/src/sync/transport.js.map +0 -1
- package/src/libs/engine/src/sync/transports/broadcast-channel.js.map +0 -1
- package/src/libs/engine/src/sync/transports/memory.js.map +0 -1
- package/src/libs/engine/src/sync/transports/unreliable.js.map +0 -1
- package/src/libs/engine/src/sync/transports/websocket.js.map +0 -1
- package/src/libs/engine/src/sync/version-vector.js.map +0 -1
- package/src/libs/engine/src/template-library/common-templates.js.map +0 -1
- package/src/libs/engine/src/template-library/data-viz-templates.js.map +0 -1
- package/src/libs/engine/src/template-library/erd-templates.js.map +0 -1
- package/src/libs/engine/src/template-library/index.js.map +0 -1
- package/src/libs/engine/src/template-library/integration.js.map +0 -1
- package/src/libs/engine/src/template-library/workflow-templates.js.map +0 -1
- package/src/libs/engine/src/templates/NodeFactory.js.map +0 -1
- package/src/libs/engine/src/templates/NodeTemplate.js.map +0 -1
- package/src/libs/engine/src/templates/TemplateLoader.js.map +0 -1
- package/src/libs/engine/src/templates/TemplateRegistry.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-business-rule-task.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-end-event.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-error-event.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-exclusive-gateway.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-inclusive-gateway.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-intermediate-event.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-manual-task.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-message-event.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-parallel-gateway.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-script-task.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-service-task.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-start-event.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-task.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-timer-event.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-user-task.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/bpmn/index.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-associative-entity.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-attribute.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-bridge-entity.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-composite-attribute.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-derived-attribute.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-discriminator.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-entity.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-isa.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-key-attribute.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-multivalued-attribute.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-optional-attribute.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-partial-key.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-relationship.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-subtype.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-supertype.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-table.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-view.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-weak-entity.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/erd-weak-relationship.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/erd/index.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-connector.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-data.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-decision.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-delay.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-display.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-document.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-input.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-operation.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-merge.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-or.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-predefined-process.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-preparation.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-process.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-stored-data.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-summing-junction.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-terminal.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/flowchart/index.js.map +0 -1
- package/src/libs/engine/src/templates/generated/index.js.map +0 -1
- package/src/libs/engine/src/templates/generated/register.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/index.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-abstract-class.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-activation.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-activity-partition.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-activity.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-actor.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-class.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-collaboration.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-component.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-datatype.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-decision.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-enum.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-final-node.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-final-state.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-fork.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-initial-node.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-initial-state.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-interface.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-join.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-lifeline.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-merge.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-node.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-note.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-object.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-package.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-part.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-port.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-primitive-type.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-signal.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-state.template.js.map +0 -1
- package/src/libs/engine/src/templates/generated/uml/uml-use-case.template.js.map +0 -1
- package/src/libs/engine/src/templates/index.js.map +0 -1
- package/src/libs/engine/src/templates/stencils.js.map +0 -1
- package/src/libs/engine/src/types/domain/bpmn.js.map +0 -1
- package/src/libs/engine/src/types/domain/erd.js.map +0 -1
- package/src/libs/engine/src/types/domain/flowchart.js.map +0 -1
- package/src/libs/engine/src/types/domain/index.js.map +0 -1
- package/src/libs/engine/src/types/domain/uml.js.map +0 -1
- package/src/libs/engine/src/types/event.types.js.map +0 -1
- package/src/libs/engine/src/types/geometry.types.js.map +0 -1
- package/src/libs/engine/src/types/index.js.map +0 -1
- package/src/libs/engine/src/types/layout.types.js.map +0 -1
- package/src/libs/engine/src/types/model.types.js.map +0 -1
- package/src/libs/engine/src/types/performance.types.js.map +0 -1
- package/src/libs/engine/src/types/plugin.types.js.map +0 -1
- package/src/libs/engine/src/utils/deep-clone.js.map +0 -1
- package/src/libs/engine/src/utils/geometry.js.map +0 -1
- package/src/libs/engine/src/utils/id.js.map +0 -1
- package/src/libs/engine/src/utils/index.js.map +0 -1
- package/src/libs/engine/src/utils/transform.js.map +0 -1
- package/src/libs/engine/src/validation/ConnectionGroupValidator.js.map +0 -1
- package/src/libs/engine/src/validation/TypeRegistry.js.map +0 -1
- package/src/libs/engine/src/validation/ValidationEngine.js.map +0 -1
- package/src/libs/engine/src/validation/index.js.map +0 -1
- package/src/libs/renderer/src/a11y/diagram-outline.js.map +0 -1
- package/src/libs/renderer/src/a11y/focus-containment.js.map +0 -1
- package/src/libs/renderer/src/a11y/graph-topology.js.map +0 -1
- package/src/libs/renderer/src/a11y/index.js.map +0 -1
- package/src/libs/renderer/src/a11y/live-region.js.map +0 -1
- package/src/libs/renderer/src/a11y/outline-view.js.map +0 -1
- package/src/libs/renderer/src/a11y/reduced-motion.js.map +0 -1
- package/src/libs/renderer/src/a11y/semantics.js.map +0 -1
- package/src/libs/renderer/src/canvas/canvas-context.js.map +0 -1
- package/src/libs/renderer/src/canvas/canvas-renderer.js.map +0 -1
- package/src/libs/renderer/src/canvas/dirty-region.js.map +0 -1
- package/src/libs/renderer/src/canvas/index.js.map +0 -1
- package/src/libs/renderer/src/canvas/path-geometry.js.map +0 -1
- package/src/libs/renderer/src/canvas/render-backend.js.map +0 -1
- package/src/libs/renderer/src/canvas/style-resolution.js.map +0 -1
- package/src/libs/renderer/src/canvas/tier-policy.js.map +0 -1
- package/src/libs/renderer/src/canvas/vnode-painter.js.map +0 -1
- package/src/libs/renderer/src/comments/comment-overlay.js.map +0 -1
- package/src/libs/renderer/src/comments/comment-panel.js.map +0 -1
- package/src/libs/renderer/src/comments/comment-pins.js.map +0 -1
- package/src/libs/renderer/src/comments/index.js.map +0 -1
- package/src/libs/renderer/src/export/assets.js.map +0 -1
- package/src/libs/renderer/src/export/batch.js.map +0 -1
- package/src/libs/renderer/src/export/bounds.js.map +0 -1
- package/src/libs/renderer/src/export/capture-host.js.map +0 -1
- package/src/libs/renderer/src/export/custom-nodes.js.map +0 -1
- package/src/libs/renderer/src/export/index.js.map +0 -1
- package/src/libs/renderer/src/export/node-raster.js.map +0 -1
- package/src/libs/renderer/src/export/pagination.js.map +0 -1
- package/src/libs/renderer/src/export/pdf/flate.js.map +0 -1
- package/src/libs/renderer/src/export/pdf/index.js.map +0 -1
- package/src/libs/renderer/src/export/pdf/pdf-export.js.map +0 -1
- package/src/libs/renderer/src/export/pdf/pdf-path.js.map +0 -1
- package/src/libs/renderer/src/export/pdf/pdf-primitives.js.map +0 -1
- package/src/libs/renderer/src/export/pdf/png.js.map +0 -1
- package/src/libs/renderer/src/export/raster.js.map +0 -1
- package/src/libs/renderer/src/export/round-trip.js.map +0 -1
- package/src/libs/renderer/src/export/scope.js.map +0 -1
- package/src/libs/renderer/src/export/style-flattener.js.map +0 -1
- package/src/libs/renderer/src/export/svg-export.js.map +0 -1
- package/src/libs/renderer/src/export/vnode-serializer.js.map +0 -1
- package/src/libs/renderer/src/ext/capabilities.js.map +0 -1
- package/src/libs/renderer/src/ext/capability-factory.js.map +0 -1
- package/src/libs/renderer/src/ext/components/attach.js.map +0 -1
- package/src/libs/renderer/src/ext/components/background.js.map +0 -1
- package/src/libs/renderer/src/ext/components/controls.js.map +0 -1
- package/src/libs/renderer/src/ext/components/minimap.js.map +0 -1
- package/src/libs/renderer/src/ext/diagram-registry.js.map +0 -1
- package/src/libs/renderer/src/ext/disposable.js.map +0 -1
- package/src/libs/renderer/src/ext/extension-host.js.map +0 -1
- package/src/libs/renderer/src/ext/index.js.map +0 -1
- package/src/libs/renderer/src/ext/link-pipeline.js.map +0 -1
- package/src/libs/renderer/src/ext/manifest.js.map +0 -1
- package/src/libs/renderer/src/ext/node-component.js.map +0 -1
- package/src/libs/renderer/src/ext/plugins-loader.js.map +0 -1
- package/src/libs/renderer/src/ext/portal.js.map +0 -1
- package/src/libs/renderer/src/ext/public-api.js.map +0 -1
- package/src/libs/renderer/src/ext/registry-scope.js.map +0 -1
- package/src/libs/renderer/src/ext/tools.js.map +0 -1
- package/src/libs/renderer/src/index.js.map +0 -1
- package/src/libs/renderer/src/instance/create-diagram.js.map +0 -1
- package/src/libs/renderer/src/instance/diagram-instance.js.map +0 -1
- package/src/libs/renderer/src/instance/dom-event-binder.js.map +0 -1
- package/src/libs/renderer/src/instance/index.js.map +0 -1
- package/src/libs/renderer/src/instance/layers.js.map +0 -1
- package/src/libs/renderer/src/instance/model-input.js.map +0 -1
- package/src/libs/renderer/src/instance/render-scheduler.js.map +0 -1
- package/src/libs/renderer/src/instance/wheel-scroll-yield.js.map +0 -1
- package/src/libs/renderer/src/interaction/ControlPointEditor.js.map +0 -1
- package/src/libs/renderer/src/interaction/WaypointEditor.js.map +0 -1
- package/src/libs/renderer/src/interaction/highlighters.js.map +0 -1
- package/src/libs/renderer/src/interaction/in-place-editor.js.map +0 -1
- package/src/libs/renderer/src/interaction/index.js.map +0 -1
- package/src/libs/renderer/src/interaction/ink-overlay.js.map +0 -1
- package/src/libs/renderer/src/interaction/interaction-controller.js.map +0 -1
- package/src/libs/renderer/src/interaction/keyboard-navigation.js.map +0 -1
- package/src/libs/renderer/src/interaction/selection-tools.js.map +0 -1
- package/src/libs/renderer/src/interaction/snapping.js.map +0 -1
- package/src/libs/renderer/src/interaction/touch-gestures.js.map +0 -1
- package/src/libs/renderer/src/interaction/whiteboard-tools.js.map +0 -1
- package/src/libs/renderer/src/lazy/host-culling.js.map +0 -1
- package/src/libs/renderer/src/lazy/index.js.map +0 -1
- package/src/libs/renderer/src/lazy/progressive-mounter.js.map +0 -1
- package/src/libs/renderer/src/lazy/types.js.map +0 -1
- package/src/libs/renderer/src/lazy/view-lifecycle.js.map +0 -1
- package/src/libs/renderer/src/perf/index.js.map +0 -1
- package/src/libs/renderer/src/perf/perf-hud.js.map +0 -1
- package/src/libs/renderer/src/perf/quality-governor.js.map +0 -1
- package/src/libs/renderer/src/platform/index.js.map +0 -1
- package/src/libs/renderer/src/platform/platform.js.map +0 -1
- package/src/libs/renderer/src/presence/bind-presence.js.map +0 -1
- package/src/libs/renderer/src/presence/index.js.map +0 -1
- package/src/libs/renderer/src/presence/presence-overlay.js.map +0 -1
- package/src/libs/renderer/src/presentation/index.js.map +0 -1
- package/src/libs/renderer/src/presentation/presentation.js.map +0 -1
- package/src/libs/renderer/src/presentation/viewport-channel.js.map +0 -1
- package/src/libs/renderer/src/services/animation-lifecycle.js.map +0 -1
- package/src/libs/renderer/src/services/animation-performance.service.js.map +0 -1
- package/src/libs/renderer/src/services/animation-sequencer.js.map +0 -1
- package/src/libs/renderer/src/services/animation.service.js.map +0 -1
- package/src/libs/renderer/src/services/custom-animation-registry.js.map +0 -1
- package/src/libs/renderer/src/ssr/index.js.map +0 -1
- package/src/libs/renderer/src/ssr/render-to-static.js.map +0 -1
- package/src/libs/renderer/src/svg/ArrowRenderer.js.map +0 -1
- package/src/libs/renderer/src/svg/JumpPointDetector.js.map +0 -1
- package/src/libs/renderer/src/svg/JumpPointRenderer.js.map +0 -1
- package/src/libs/renderer/src/svg/LabelRenderer.js.map +0 -1
- package/src/libs/renderer/src/svg/auto-size.js.map +0 -1
- package/src/libs/renderer/src/svg/channel-nudging.js.map +0 -1
- package/src/libs/renderer/src/svg/edge-optimizer.js.map +0 -1
- package/src/libs/renderer/src/svg/edge-templates.js.map +0 -1
- package/src/libs/renderer/src/svg/html-node.js.map +0 -1
- package/src/libs/renderer/src/svg/index.js.map +0 -1
- package/src/libs/renderer/src/svg/link-fanout.js.map +0 -1
- package/src/libs/renderer/src/svg/link-hit-test.js.map +0 -1
- package/src/libs/renderer/src/svg/motion-tracker.js.map +0 -1
- package/src/libs/renderer/src/svg/node-sizing.js.map +0 -1
- package/src/libs/renderer/src/svg/node-toolbar.js.map +0 -1
- package/src/libs/renderer/src/svg/notation-shapes.js.map +0 -1
- package/src/libs/renderer/src/svg/paint-servers.js.map +0 -1
- package/src/libs/renderer/src/svg/panel.js.map +0 -1
- package/src/libs/renderer/src/svg/path-outline.js.map +0 -1
- package/src/libs/renderer/src/svg/port-glyph.js.map +0 -1
- package/src/libs/renderer/src/svg/port-label.js.map +0 -1
- package/src/libs/renderer/src/svg/port-layout.js.map +0 -1
- package/src/libs/renderer/src/svg/port-positioning.js.map +0 -1
- package/src/libs/renderer/src/svg/port-spots.js.map +0 -1
- package/src/libs/renderer/src/svg/route-memo.js.map +0 -1
- package/src/libs/renderer/src/svg/route-solver-bridge.js.map +0 -1
- package/src/libs/renderer/src/svg/shape-registry.js.map +0 -1
- package/src/libs/renderer/src/svg/stroke-layer.js.map +0 -1
- package/src/libs/renderer/src/svg/svg-renderer.js.map +0 -1
- package/src/libs/renderer/src/svg/text-block.js.map +0 -1
- package/src/libs/renderer/src/themes/color-mode.js.map +0 -1
- package/src/libs/renderer/src/themes/contrast.js.map +0 -1
- package/src/libs/renderer/src/themes/default-dark-theme.js.map +0 -1
- package/src/libs/renderer/src/themes/default-light-theme.js.map +0 -1
- package/src/libs/renderer/src/themes/default-theme-set.js.map +0 -1
- package/src/libs/renderer/src/themes/high-contrast-theme.js.map +0 -1
- package/src/libs/renderer/src/themes/index.js.map +0 -1
- package/src/libs/renderer/src/themes/style-cascade.js.map +0 -1
- package/src/libs/renderer/src/themes/style-registry.js.map +0 -1
- package/src/libs/renderer/src/themes/theme-a11y.js.map +0 -1
- package/src/libs/renderer/src/themes/theme-css.js.map +0 -1
- package/src/libs/renderer/src/themes/theme-ref.js.map +0 -1
- package/src/libs/renderer/src/themes/theme-vars.js.map +0 -1
- package/src/libs/renderer/src/themes/token-bridge.js.map +0 -1
- package/src/libs/renderer/src/types/geometry.types.js.map +0 -1
- package/src/libs/renderer/src/types/index.js.map +0 -1
- package/src/libs/renderer/src/types/property-schema/conditions.js.map +0 -1
- package/src/libs/renderer/src/types/property-schema/editor-types.js.map +0 -1
- package/src/libs/renderer/src/types/property-schema/groups.js.map +0 -1
- package/src/libs/renderer/src/types/property-schema/index.js.map +0 -1
- package/src/libs/renderer/src/types/property-schema/property-definition.js.map +0 -1
- package/src/libs/renderer/src/types/property-schema/schema.js.map +0 -1
- package/src/libs/renderer/src/types/property-schema/validation.js.map +0 -1
- package/src/libs/renderer/src/types/renderer.interface.js.map +0 -1
- package/src/libs/renderer/src/types/theme.types.js.map +0 -1
- package/src/libs/renderer/src/types/vnode.types.js.map +0 -1
- package/src/libs/renderer/src/utils/animation-presets.js.map +0 -1
- package/src/libs/renderer/src/utils/animation-priority.js.map +0 -1
- package/src/libs/renderer/src/utils/animation-utils.js.map +0 -1
- package/src/libs/renderer/src/utils/lru-cache.js.map +0 -1
- package/src/libs/renderer/src/viewport/index.js.map +0 -1
- package/src/libs/renderer/src/viewport/viewport-controller.js.map +0 -1
- package/src/libs/renderer/src/vnode/container-id-generator.js.map +0 -1
- package/src/libs/renderer/src/vnode/foreign-object.js.map +0 -1
- package/src/libs/renderer/src/vnode/index.js.map +0 -1
- package/src/libs/renderer/src/vnode/patch.js.map +0 -1
- package/src/reachability.spec.ts +0 -173
- package/tsconfig.esm.json +0 -9
- package/tsconfig.json +0 -24
- package/tsconfig.lib.json +0 -10
- package/tsconfig.spec.json +0 -14
|
@@ -1,906 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `dashboard({ views, widgets })` — the DATA-FIRST dashboard authoring API.
|
|
3
|
-
*
|
|
4
|
-
* The exact shape `erDiagram()` / `umlDiagram()` have for ER and UML: you
|
|
5
|
-
* describe WHAT the dashboard is, `render()` runs the returned `finalize(api)`
|
|
6
|
-
* automatically, and every interactive part (the pack grid, drag/resize with
|
|
7
|
-
* live push and a truthful placeholder, fit/grow, float, pin, undoable
|
|
8
|
-
* commands) wires itself.
|
|
9
|
-
*
|
|
10
|
-
* Before this, a developer got `bindDashboardGrid()` — a gesture BINDER one
|
|
11
|
-
* layer down — and had to hand-assemble everything above it: a GroupModel per
|
|
12
|
-
* view, a NodeModel per widget, `useHTMLLayer` / `widgetKind` metadata, grid
|
|
13
|
-
* cells, membership, then the bind. The demo page needed ~143 lines just to
|
|
14
|
-
* build its boards. That was the missing authoring layer; this is it:
|
|
15
|
-
*
|
|
16
|
-
* ```js
|
|
17
|
-
* const SPEC = dashboard({
|
|
18
|
-
* columns: 12,
|
|
19
|
-
* sizing: 'fit',
|
|
20
|
-
* views: [{
|
|
21
|
-
* id: 'overview', name: 'Overview',
|
|
22
|
-
* widgets: [
|
|
23
|
-
* { id: 'rev', kind: 'kpi', span: 3, rows: 1, data: {…} },
|
|
24
|
-
* { id: 'trend', kind: 'line', span: 8, rows: 2, data: {…} },
|
|
25
|
-
* { id: 'mix', kind: 'donut', span: 4, rows: 2, pinned: true },
|
|
26
|
-
* ],
|
|
27
|
-
* }],
|
|
28
|
-
* renderWidget: (widget, host) => { … }, // optional: your charts
|
|
29
|
-
* });
|
|
30
|
-
* render(SPEC, host);
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* WHAT IT DELIBERATELY DOES NOT DO: pick a charting library. `renderWidget` is
|
|
34
|
-
* the seam — the kit hands you the widget and a raw HTML host (the renderer's
|
|
35
|
-
* custom-node path, which unlike `metadata.html` is not sanitised, so real
|
|
36
|
-
* `<svg>`/`<canvas>` is fine). Omit it and `defaultWidgetRenderer` (widgets.ts)
|
|
37
|
-
* draws the declared `kind` from your own `data` with hand-rolled inline SVG —
|
|
38
|
-
* kpi / line / bar / donut / funnel / table, no dependency, no sample dataset —
|
|
39
|
-
* falling back to a titled frame for kinds it does not know, so a layout is
|
|
40
|
-
* testable before any chart exists.
|
|
41
|
-
*
|
|
42
|
-
* Cells are the truth and live in the existing `GridItemConfig`, so save/load
|
|
43
|
-
* round-trips with no extra work — same as every other kit.
|
|
44
|
-
*/
|
|
45
|
-
|
|
46
|
-
import {
|
|
47
|
-
AddToGroupCommand,
|
|
48
|
-
BatchCommand,
|
|
49
|
-
BringNodeToFrontCommand,
|
|
50
|
-
Command,
|
|
51
|
-
GroupModel,
|
|
52
|
-
NodeModel,
|
|
53
|
-
RemoveFromGroupCommand,
|
|
54
|
-
RemoveNodeCommand,
|
|
55
|
-
SendNodeToBackCommand,
|
|
56
|
-
type GridColumnLayout,
|
|
57
|
-
} from '@grafloria/engine';
|
|
58
|
-
import {
|
|
59
|
-
bindDashboardGrid,
|
|
60
|
-
type DashboardGridHandle,
|
|
61
|
-
type DashboardGridOptions,
|
|
62
|
-
type DashboardResponsiveOptions,
|
|
63
|
-
} from './grid-binder';
|
|
64
|
-
import { gridItemFromCell } from './grid-mapping';
|
|
65
|
-
import { ensureDashboardKitStyles } from './styles';
|
|
66
|
-
import { defaultWidgetRenderer } from './widgets';
|
|
67
|
-
|
|
68
|
-
/** A widget, declared as data. */
|
|
69
|
-
export interface DashboardWidgetSpec {
|
|
70
|
-
id: string;
|
|
71
|
-
/** Free-form kind string handed back to `renderWidget` (e.g. 'kpi', 'line'). */
|
|
72
|
-
kind?: string;
|
|
73
|
-
/** Column span (default 3) and row span (default 1). */
|
|
74
|
-
span?: number;
|
|
75
|
-
rows?: number;
|
|
76
|
-
/**
|
|
77
|
-
* Explicit cell. Omit and widgets flow in declaration order, wrapping at
|
|
78
|
-
* the column count — the common case needs no coordinates at all.
|
|
79
|
-
*/
|
|
80
|
-
x?: number;
|
|
81
|
-
y?: number;
|
|
82
|
-
/** Pinned: never pushed, refuses the mover, survives every reflow. */
|
|
83
|
-
pinned?: boolean;
|
|
84
|
-
/** Your payload — passed straight back to `renderWidget`. */
|
|
85
|
-
data?: Record<string, unknown>;
|
|
86
|
-
/** Optional title used by the built-in fallback renderer. */
|
|
87
|
-
title?: string;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** One board. Multiple views are the tab pattern: only one is on-camera. */
|
|
91
|
-
export interface DashboardViewSpec {
|
|
92
|
-
id: string;
|
|
93
|
-
name?: string;
|
|
94
|
-
widgets: DashboardWidgetSpec[];
|
|
95
|
-
/** Per-view overrides of the dashboard-level geometry. */
|
|
96
|
-
columns?: number;
|
|
97
|
-
width?: number;
|
|
98
|
-
height?: number;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export interface DashboardOptions {
|
|
102
|
-
/** Column count for every view (default 12). */
|
|
103
|
-
columns?: number;
|
|
104
|
-
/** Gap between widgets AND the board padding, px (default 8). */
|
|
105
|
-
gap?: number;
|
|
106
|
-
/** Sizing mode (default 'fit' — squeeze rows; 'grow' extends the board). */
|
|
107
|
-
sizing?: 'fit' | 'grow';
|
|
108
|
-
/** Row height in 'grow' mode, px (default 130). */
|
|
109
|
-
rowHeight?: number;
|
|
110
|
-
/** Board size, px (default 1180 × 660). */
|
|
111
|
-
width?: number;
|
|
112
|
-
height?: number;
|
|
113
|
-
/** Engine float mode (default false → gravity packs upward). */
|
|
114
|
-
float?: boolean;
|
|
115
|
-
/**
|
|
116
|
-
* RIGHT-TO-LEFT boards: column x=0 renders at the RIGHT edge and columns run
|
|
117
|
-
* leftwards. Cells are untouched — the same `widgets` array describes the
|
|
118
|
-
* same layout in both directions, and a layout saved in one renders mirrored
|
|
119
|
-
* in the other with identical cells.
|
|
120
|
-
*/
|
|
121
|
-
rtl?: boolean;
|
|
122
|
-
/**
|
|
123
|
-
* RESPONSIVE COLUMN COUNT: derive the live count from each board's width.
|
|
124
|
-
* `{ columnWidth: 100 }` gives one column per ~100px (capped by `columns`);
|
|
125
|
-
* `{ breakpoints: [{ w: 480, c: 1 }, { w: 900, c: 6 }] }` names the steps.
|
|
126
|
-
* The count changes through the engine's per-column layout CACHE, so
|
|
127
|
-
* narrowing and widening again restores the wide layout exactly, and
|
|
128
|
-
* `toJSON()` keeps serialising the widest layout however narrow the board is.
|
|
129
|
-
*/
|
|
130
|
-
responsive?: DashboardResponsiveOptions;
|
|
131
|
-
/** One view, or many (the tab pattern). Mutually exclusive with `widgets`. */
|
|
132
|
-
views?: DashboardViewSpec[];
|
|
133
|
-
/** Shorthand for a single unnamed view. */
|
|
134
|
-
widgets?: DashboardWidgetSpec[];
|
|
135
|
-
/**
|
|
136
|
-
* Paint a widget into its host element. Called once per widget when it
|
|
137
|
-
* mounts (the host is reused across re-renders, so this is not a per-frame
|
|
138
|
-
* hook). Omit for a titled placeholder frame.
|
|
139
|
-
*/
|
|
140
|
-
renderWidget?: (widget: DashboardWidgetSpec, host: HTMLElement) => void;
|
|
141
|
-
/** Fires after any committed gesture, with the view whose layout changed. */
|
|
142
|
-
onLayoutChange?: (viewId: string, widgets: DashboardWidgetSpec[]) => void;
|
|
143
|
-
/** Extra binder options, merged last (escape hatch to the layer below). */
|
|
144
|
-
binder?: Partial<DashboardGridOptions>;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/** What `dashboard()` returns — a render spec plus the runtime handle. */
|
|
148
|
-
export interface DashboardSpec {
|
|
149
|
-
nodes: Array<Record<string, unknown>>;
|
|
150
|
-
edges: Array<Record<string, unknown>>;
|
|
151
|
-
renderCustomNode: (node: unknown, host: HTMLElement) => void;
|
|
152
|
-
finalize: (api: unknown) => void;
|
|
153
|
-
/** Live handle, populated by finalize(). */
|
|
154
|
-
readonly handle: DashboardHandle;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* A whole board as plain data: every `DashboardOptions` field except the
|
|
159
|
-
* function seams. `dashboard({ ...snapshot, renderWidget })` rebuilds it.
|
|
160
|
-
*
|
|
161
|
-
* Typed as an Omit rather than a hand-written twin on purpose — a field added
|
|
162
|
-
* to `DashboardOptions` then joins the snapshot automatically instead of being
|
|
163
|
-
* silently dropped, which is the exact failure this type exists to end.
|
|
164
|
-
*/
|
|
165
|
-
export type DashboardSnapshot = Omit<
|
|
166
|
-
DashboardOptions,
|
|
167
|
-
'renderWidget' | 'onLayoutChange' | 'views'
|
|
168
|
-
> & { views: DashboardViewSpec[] };
|
|
169
|
-
|
|
170
|
-
/** The typed façade — the `erTable`/`umlClass` equivalent for dashboards. */
|
|
171
|
-
export interface DashboardHandle {
|
|
172
|
-
/** The view ids, in declaration order. */
|
|
173
|
-
readonly views: string[];
|
|
174
|
-
/** Show a view (the others park off-camera) and frame it. */
|
|
175
|
-
showView(id: string): void;
|
|
176
|
-
/** The currently shown view id. */
|
|
177
|
-
readonly activeView: string;
|
|
178
|
-
/** A widget handle by id (undefined when unknown). */
|
|
179
|
-
widget(id: string): WidgetHandle | undefined;
|
|
180
|
-
/** Every widget handle of a view (default: the active one). */
|
|
181
|
-
widgetsOf(viewId?: string): WidgetHandle[];
|
|
182
|
-
/** Live sizing/float switches — the two prototype toggles. */
|
|
183
|
-
setSizing(mode: 'fit' | 'grow'): void;
|
|
184
|
-
getSizing(): 'fit' | 'grow';
|
|
185
|
-
setFloat(on: boolean): void;
|
|
186
|
-
getFloat(): boolean;
|
|
187
|
-
/**
|
|
188
|
-
* Set the COLUMN COUNT of every board (or one view), live. Goes through the
|
|
189
|
-
* engine's per-column layout cache, so shrinking then growing back restores
|
|
190
|
-
* the wide layout rather than re-deriving it. An explicit call PINS the
|
|
191
|
-
* count — the width-driven `responsive` evaluator stops overriding it.
|
|
192
|
-
*/
|
|
193
|
-
setColumns(n: number, layout?: GridColumnLayout, viewId?: string): void;
|
|
194
|
-
/** The LIVE column count of a view (default: the active one). */
|
|
195
|
-
getColumns(viewId?: string): number;
|
|
196
|
-
/** RTL mirroring, live — pixels only, cells never change. */
|
|
197
|
-
setRtl(on: boolean): void;
|
|
198
|
-
getRtl(): boolean;
|
|
199
|
-
/**
|
|
200
|
-
* Add a widget to a view. CREATES the node (you do not pre-build one), wires
|
|
201
|
-
* its metadata, and commits node + membership as ONE undoable step.
|
|
202
|
-
* Auto-positions when the spec names no cell.
|
|
203
|
-
*/
|
|
204
|
-
addWidget(spec: DashboardWidgetSpec, viewId?: string): WidgetHandle | undefined;
|
|
205
|
-
/**
|
|
206
|
-
* Re-read every board from the model — call after undo/redo, or any
|
|
207
|
-
* out-of-band mutation, so the grid and the projection agree again.
|
|
208
|
-
*/
|
|
209
|
-
refresh(): void;
|
|
210
|
-
/** Re-frame the camera on a view (default: the active one). */
|
|
211
|
-
fit(viewId?: string): void;
|
|
212
|
-
/** Live geometry of a view's board (columns, gap, rows, rowHeight, frame…). */
|
|
213
|
-
metrics(viewId?: string): ReturnType<DashboardGridHandle['metrics']> | undefined;
|
|
214
|
-
/**
|
|
215
|
-
* The whole board as plain data — feed it straight back to `dashboard()`:
|
|
216
|
-
*
|
|
217
|
-
* ```ts
|
|
218
|
-
* dashboard({ ...handle.toJSON(), renderWidget }); // a true round trip
|
|
219
|
-
* ```
|
|
220
|
-
*
|
|
221
|
-
* Everything `DashboardOptions` takes EXCEPT the function seams
|
|
222
|
-
* (`renderWidget`, `onLayoutChange`), which cannot be written to a file and
|
|
223
|
-
* must be supplied again on the way back in.
|
|
224
|
-
*
|
|
225
|
-
* Values are read from the LIVE board, not from the authored literal, so a
|
|
226
|
-
* mode or column count the user changed after mount is what you get back.
|
|
227
|
-
*
|
|
228
|
-
* This used to return only `views`, which made the round-trip claim true of
|
|
229
|
-
* the layout and false of the board: a board authored `grow` at a 10-column,
|
|
230
|
-
* 6px-gap geometry reloaded as a 12-column `fit` one. It is also what
|
|
231
|
-
* `JSON.stringify(handle)` calls, so the partial answer was a permanent
|
|
232
|
-
* footgun in a save API rather than merely an omission.
|
|
233
|
-
*/
|
|
234
|
-
toJSON(): DashboardSnapshot;
|
|
235
|
-
/**
|
|
236
|
-
* The node ids ONE view occupies — pass straight to `includeIds` to export
|
|
237
|
-
* just that board:
|
|
238
|
-
*
|
|
239
|
-
* ```ts
|
|
240
|
-
* api.export('pdf', { includeIds: handle.exportIds() });
|
|
241
|
-
* ```
|
|
242
|
-
*
|
|
243
|
-
* WHY THIS EXISTS. Tabs park the inactive views far off-camera, which is
|
|
244
|
-
* invisible on screen and ruinous on export: `export()` frames the whole
|
|
245
|
-
* MODEL, so a two-view board writes a ~21,000px document that is almost
|
|
246
|
-
* entirely empty — with no warning, because nothing is technically wrong.
|
|
247
|
-
* Scoping was always possible; knowing WHAT to scope to was not.
|
|
248
|
-
*
|
|
249
|
-
* The set includes the view's GROUP as well as its widgets. Rolling this by
|
|
250
|
-
* hand from `toJSON()` looks equivalent and is not — it drops the group, and
|
|
251
|
-
* the widgets export without the frame they sit in.
|
|
252
|
-
*/
|
|
253
|
-
exportIds(viewId?: string): Set<string>;
|
|
254
|
-
/**
|
|
255
|
-
* THE DOCUMENTED ESCAPE HATCH: the view's own `bindDashboardGrid` handle
|
|
256
|
-
* (default: the active view). Reach for it only for what this façade does
|
|
257
|
-
* not cover yet — palette drag-in (`beginPaletteDrag`), board `metrics()`,
|
|
258
|
-
* `cellRectOf`, `planRemoval`, and re-`sync()` after an external undo. Every
|
|
259
|
-
* call site is a named gap in this API, not a normal way to drive a board.
|
|
260
|
-
*/
|
|
261
|
-
binderOf(viewId?: string): DashboardGridHandle | undefined;
|
|
262
|
-
dispose(): void;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/** One widget's OO surface (mirrors ErTable/UmlClass). */
|
|
266
|
-
export interface WidgetHandle {
|
|
267
|
-
readonly id: string;
|
|
268
|
-
readonly viewId: string;
|
|
269
|
-
readonly node: NodeModel | undefined;
|
|
270
|
-
/** The DECLARED spec — read it back (title/kind/data) without a side map. */
|
|
271
|
-
readonly spec: DashboardWidgetSpec;
|
|
272
|
-
/** Current cell, as data. */
|
|
273
|
-
readonly cell: { x: number; y: number; w: number; h: number } | undefined;
|
|
274
|
-
/** The world rect the current cell projects to. */
|
|
275
|
-
readonly rect: { x: number; y: number; width: number; height: number } | undefined;
|
|
276
|
-
/** Resize in CELLS. Resolves TRUE when the board accepted it. */
|
|
277
|
-
resize(span: number, rows: number): Promise<boolean>;
|
|
278
|
-
/** Move to a cell. Resolves TRUE when the board accepted it. */
|
|
279
|
-
moveTo(x: number, y: number): Promise<boolean>;
|
|
280
|
-
/** Pin / unpin (a pinned widget refuses the mover and never gets pushed). */
|
|
281
|
-
pin(on?: boolean): void;
|
|
282
|
-
readonly pinned: boolean;
|
|
283
|
-
/** Raise / lower — one undoable step each (mirrors the toolbar commands). */
|
|
284
|
-
bringToFront(): void;
|
|
285
|
-
sendToBack(): void;
|
|
286
|
-
/**
|
|
287
|
-
* Remove it — ONE undoable step including the survivors' re-pack.
|
|
288
|
-
* `displaced` accepts the commands a drag-out gesture already computed;
|
|
289
|
-
* omit it and the handle plans them itself.
|
|
290
|
-
*/
|
|
291
|
-
remove(displaced?: unknown[]): void;
|
|
292
|
-
/** Replace the widget's `data` (and optionally title) and repaint. */
|
|
293
|
-
update(patch: Partial<Pick<DashboardWidgetSpec, 'data' | 'title' | 'kind'>>): void;
|
|
294
|
-
/** Repaint through `renderWidget` (after your data changed). */
|
|
295
|
-
repaint(): void;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Add a widget node AND its board membership as ONE undoable step.
|
|
300
|
-
*
|
|
301
|
-
* A `BatchCommand([AddNodeCommand, AddToGroupCommand])` cannot express this:
|
|
302
|
-
* the manager validates the whole batch up front, and
|
|
303
|
-
* `AddToGroupCommand.canExecute` pre-gates on the node ALREADY being in the
|
|
304
|
-
* diagram — which it is not until the first command runs. Sequencing two
|
|
305
|
-
* commands works but costs two undo steps, so an interactive "add widget"
|
|
306
|
-
* would need two Ctrl-Z. This composite does both in its own execute(), and
|
|
307
|
-
* unwinds both in undo().
|
|
308
|
-
*/
|
|
309
|
-
class AddWidgetCommand extends Command {
|
|
310
|
-
constructor(
|
|
311
|
-
private node: NodeModel,
|
|
312
|
-
private groupId: string
|
|
313
|
-
) {
|
|
314
|
-
super('Add widget');
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
override execute(context: { diagram?: unknown }): void {
|
|
318
|
-
const diagram = context.diagram as
|
|
319
|
-
| { addNode(n: NodeModel): void; getGroup(id: string): GroupModel | undefined }
|
|
320
|
-
| undefined;
|
|
321
|
-
if (!diagram) return;
|
|
322
|
-
diagram.addNode(this.node);
|
|
323
|
-
diagram.getGroup(this.groupId)?.addMember(this.node.id);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
override undo(context: { diagram?: unknown }): void {
|
|
327
|
-
const diagram = context.diagram as
|
|
328
|
-
| { removeNode(id: string): unknown; getGroup(id: string): GroupModel | undefined }
|
|
329
|
-
| undefined;
|
|
330
|
-
if (!diagram) return;
|
|
331
|
-
diagram.getGroup(this.groupId)?.removeMember(this.node.id);
|
|
332
|
-
diagram.removeNode(this.node.id);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
override serialize() {
|
|
336
|
-
return {
|
|
337
|
-
id: this.id,
|
|
338
|
-
name: this.name,
|
|
339
|
-
timestamp: this.timestamp,
|
|
340
|
-
data: { nodeId: this.node.id, groupId: this.groupId },
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const DEFAULTS = { columns: 12, gap: 8, rowHeight: 130, width: 1180, height: 660 };
|
|
346
|
-
const OFFSCREEN_X = -20000;
|
|
347
|
-
let autoId = 0;
|
|
348
|
-
|
|
349
|
-
/** The node a widget spec becomes — one place, so addWidget() and the initial
|
|
350
|
-
* spec build can never drift apart on metadata. */
|
|
351
|
-
function buildWidgetNode(w: DashboardWidgetSpec, rowHeight: number): NodeModel {
|
|
352
|
-
const node = new NodeModel({
|
|
353
|
-
id: w.id,
|
|
354
|
-
type: 'widget',
|
|
355
|
-
position: { x: 0, y: 0 },
|
|
356
|
-
size: { width: 120, height: rowHeight, depth: 0 },
|
|
357
|
-
});
|
|
358
|
-
node.setMetadata('useHTMLLayer', true);
|
|
359
|
-
node.setMetadata('widgetKind', w.kind ?? 'widget');
|
|
360
|
-
node.setMetadata('widgetSpec', w.data ?? {});
|
|
361
|
-
// The TITLE was the one authored field that never reached the node — so a
|
|
362
|
-
// document-level reload rebuilt every card with `titleOf()` falling through to
|
|
363
|
-
// the kind, and a board of "Revenue vs target" / "Top reps by revenue" came
|
|
364
|
-
// back as "line" / "table". Only written when authored, so an untitled widget
|
|
365
|
-
// serialises exactly as it always did.
|
|
366
|
-
if (w.title !== undefined) node.setMetadata('widgetTitle', w.title);
|
|
367
|
-
node.setMetadata('columnSpan', w.span ?? 3);
|
|
368
|
-
node.setMetadata('rowSpan', w.rows ?? 1);
|
|
369
|
-
if (w.x !== undefined && w.y !== undefined) {
|
|
370
|
-
node.setGridItem({
|
|
371
|
-
columnStart: w.x + 1,
|
|
372
|
-
columnEnd: w.x + 1 + (w.span ?? 3),
|
|
373
|
-
rowStart: w.y + 1,
|
|
374
|
-
rowEnd: w.y + 1 + (w.rows ?? 1),
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
// A dashboard widget is not a wiring endpoint: no ports, no hover glyphs.
|
|
378
|
-
node.setBehavior({ connectable: false });
|
|
379
|
-
for (const p of [...node.getPorts().values()]) node.removePort(p.id);
|
|
380
|
-
return node;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
/** Flow widgets that declared no cell: left-to-right, wrapping at `columns`. */
|
|
384
|
-
function assignCells(widgets: DashboardWidgetSpec[], columns: number): void {
|
|
385
|
-
let x = 0;
|
|
386
|
-
let y = 0;
|
|
387
|
-
let rowMax = 0;
|
|
388
|
-
for (const w of widgets) {
|
|
389
|
-
const span = Math.max(1, Math.min(columns, w.span ?? 3));
|
|
390
|
-
const rows = Math.max(1, w.rows ?? 1);
|
|
391
|
-
if (w.x === undefined || w.y === undefined) {
|
|
392
|
-
if (x + span > columns) {
|
|
393
|
-
x = 0;
|
|
394
|
-
y += rowMax || 1;
|
|
395
|
-
rowMax = 0;
|
|
396
|
-
}
|
|
397
|
-
w.x = x;
|
|
398
|
-
w.y = y;
|
|
399
|
-
x += span;
|
|
400
|
-
rowMax = Math.max(rowMax, rows);
|
|
401
|
-
}
|
|
402
|
-
w.span = span;
|
|
403
|
-
w.rows = rows;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* The API surface the handle drives — the slice of a DiagramInstance both
|
|
409
|
-
* `dashboard().finalize` and `fromDocument().finalize` hand in. Named (was an
|
|
410
|
-
* inline type on the old `apiRef` local) because two call sites now share it.
|
|
411
|
-
*/
|
|
412
|
-
export interface DashboardApiRef {
|
|
413
|
-
getModel(): {
|
|
414
|
-
getNode(id: string): NodeModel | undefined;
|
|
415
|
-
addGroup(g: GroupModel): void;
|
|
416
|
-
getGroup(id: string): GroupModel | undefined;
|
|
417
|
-
removeGroup?(id: string): unknown;
|
|
418
|
-
};
|
|
419
|
-
getEngine?: () => { commandManager: { execute(c: unknown): unknown } };
|
|
420
|
-
renderNow(): void;
|
|
421
|
-
viewport?: { fitToBounds(r: unknown, pad: number, o?: unknown): void };
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Everything one `DashboardHandle` closes over, gathered into ONE object so a
|
|
426
|
-
* single builder can serve both `dashboard()` (context built from the authored
|
|
427
|
-
* literal) and `fromDocument()` (context reconstructed from the loaded model).
|
|
428
|
-
*
|
|
429
|
-
* `active` and `apiRef` are the two MUTABLE cells: the handle READS them on
|
|
430
|
-
* every call and the builder WRITES them (showView reassigns `active`, the
|
|
431
|
-
* caller's finalize sets `apiRef`). They live here rather than as free `let`s
|
|
432
|
-
* precisely because there are now two call sites — a boxed cell one builder
|
|
433
|
-
* reads and writes is the whole reason a second handle implementation, which
|
|
434
|
-
* would silently drift, is not needed.
|
|
435
|
-
*/
|
|
436
|
-
export interface DashboardHandleContext {
|
|
437
|
-
/** The views — MUTATED in place by addWidget (push) and remove (filter). */
|
|
438
|
-
views: DashboardViewSpec[];
|
|
439
|
-
groups: Map<string, GroupModel>;
|
|
440
|
-
binders: Map<string, DashboardGridHandle>;
|
|
441
|
-
specById: Map<string, DashboardWidgetSpec>;
|
|
442
|
-
viewOfWidget: Map<string, string>;
|
|
443
|
-
hosts: Map<string, HTMLElement>;
|
|
444
|
-
renderWidget: (widget: DashboardWidgetSpec, host: HTMLElement) => void;
|
|
445
|
-
columns: number;
|
|
446
|
-
gap: number;
|
|
447
|
-
rowHeight: number;
|
|
448
|
-
boardW: number;
|
|
449
|
-
boardH: number;
|
|
450
|
-
/**
|
|
451
|
-
* Spread verbatim into `toJSON()` output — carries width/height/responsive
|
|
452
|
-
* and any other authored option so a new `DashboardOptions` field round-trips
|
|
453
|
-
* for free (dashboard() passes the whole `options`; fromDocument() passes the
|
|
454
|
-
* geometry it can recover from the persisted board metadata).
|
|
455
|
-
*/
|
|
456
|
-
optionsBase: Partial<DashboardOptions>;
|
|
457
|
-
/** MUTABLE — reassigned by showView(). */
|
|
458
|
-
active: string;
|
|
459
|
-
/** MUTABLE — set by the caller's finalize once the render API exists. */
|
|
460
|
-
apiRef: DashboardApiRef | null;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
/**
|
|
464
|
-
* Build THE `DashboardHandle` — the one and only implementation, shared by
|
|
465
|
-
* `dashboard()` and `fromDocument()`. Reads/writes the mutable `ctx.active` /
|
|
466
|
-
* `ctx.apiRef` cells so the caller's finalize can wire the API in afterwards.
|
|
467
|
-
*/
|
|
468
|
-
export function createDashboardHandle(ctx: DashboardHandleContext): DashboardHandle {
|
|
469
|
-
const { views, groups, binders, specById, viewOfWidget } = ctx;
|
|
470
|
-
|
|
471
|
-
const hostOf = (id: string): HTMLElement | undefined => ctx.hosts.get(id);
|
|
472
|
-
|
|
473
|
-
const execCommand = (cmd: unknown): void => {
|
|
474
|
-
try {
|
|
475
|
-
const r = ctx.apiRef?.getEngine?.()?.commandManager.execute(cmd) as {
|
|
476
|
-
catch?: (f: () => void) => void;
|
|
477
|
-
};
|
|
478
|
-
// Fire-and-forget like the binder's own commits, but never leave an
|
|
479
|
-
// unhandled rejection: a refused command is a no-op, not a crash.
|
|
480
|
-
r?.catch?.(() => undefined);
|
|
481
|
-
} catch {
|
|
482
|
-
/* a refused command must not break the caller */
|
|
483
|
-
}
|
|
484
|
-
};
|
|
485
|
-
|
|
486
|
-
const handle: DashboardHandle = {
|
|
487
|
-
get views() {
|
|
488
|
-
return views.map((v) => v.id);
|
|
489
|
-
},
|
|
490
|
-
get activeView() {
|
|
491
|
-
return ctx.active;
|
|
492
|
-
},
|
|
493
|
-
showView(id) {
|
|
494
|
-
if (!groups.has(id)) return;
|
|
495
|
-
ctx.active = id;
|
|
496
|
-
for (const [vid, g] of groups) {
|
|
497
|
-
const x = vid === id ? 0 : OFFSCREEN_X;
|
|
498
|
-
const s = g.size ?? { width: ctx.boardW, height: ctx.boardH };
|
|
499
|
-
if (g.position.x !== x) g.setFrame({ x, y: 0, width: s.width, height: s.height });
|
|
500
|
-
}
|
|
501
|
-
binders.get(id)?.sync();
|
|
502
|
-
ctx.apiRef?.renderNow();
|
|
503
|
-
const g = groups.get(id)!;
|
|
504
|
-
const gs = g.size ?? { width: ctx.boardW, height: ctx.boardH };
|
|
505
|
-
ctx.apiRef?.viewport?.fitToBounds(
|
|
506
|
-
{ x: g.position.x, y: g.position.y, width: gs.width, height: gs.height },
|
|
507
|
-
26,
|
|
508
|
-
{ maxZoom: 1 }
|
|
509
|
-
);
|
|
510
|
-
},
|
|
511
|
-
widget(id) {
|
|
512
|
-
return makeWidgetHandle(id);
|
|
513
|
-
},
|
|
514
|
-
widgetsOf(viewId) {
|
|
515
|
-
const v = views.find((x) => x.id === (viewId ?? ctx.active));
|
|
516
|
-
return (v?.widgets ?? []).map((w) => makeWidgetHandle(w.id)).filter(Boolean) as WidgetHandle[];
|
|
517
|
-
},
|
|
518
|
-
setSizing(mode) {
|
|
519
|
-
for (const b of binders.values()) b.setSizing(mode);
|
|
520
|
-
ctx.apiRef?.renderNow();
|
|
521
|
-
},
|
|
522
|
-
getSizing: () => binders.get(ctx.active)?.getSizing() ?? (ctx.optionsBase.sizing ?? 'fit'),
|
|
523
|
-
setFloat(on) {
|
|
524
|
-
for (const b of binders.values()) b.setFloat(on);
|
|
525
|
-
ctx.apiRef?.renderNow();
|
|
526
|
-
},
|
|
527
|
-
getFloat: () => binders.get(ctx.active)?.getFloat() ?? (ctx.optionsBase.float ?? false),
|
|
528
|
-
setColumns(n, layout, viewId) {
|
|
529
|
-
const targets = viewId ? [binders.get(viewId)] : [...binders.values()];
|
|
530
|
-
for (const b of targets) b?.setColumns(n, layout);
|
|
531
|
-
ctx.apiRef?.renderNow();
|
|
532
|
-
},
|
|
533
|
-
getColumns: (viewId) => binders.get(viewId ?? ctx.active)?.getColumns() ?? ctx.columns,
|
|
534
|
-
setRtl(on) {
|
|
535
|
-
for (const b of binders.values()) b.setRtl(on);
|
|
536
|
-
ctx.apiRef?.renderNow();
|
|
537
|
-
},
|
|
538
|
-
getRtl: () => binders.get(ctx.active)?.getRtl() ?? (ctx.optionsBase.rtl ?? false),
|
|
539
|
-
addWidget(spec, viewId) {
|
|
540
|
-
const vid = viewId ?? ctx.active;
|
|
541
|
-
const v = views.find((x) => x.id === vid);
|
|
542
|
-
const model = ctx.apiRef?.getModel();
|
|
543
|
-
const group = groups.get(vid);
|
|
544
|
-
if (!v || !model || !group) return undefined;
|
|
545
|
-
const w: DashboardWidgetSpec = {
|
|
546
|
-
...spec,
|
|
547
|
-
id: spec.id || `w-${++autoId}`,
|
|
548
|
-
span: spec.span ?? 3,
|
|
549
|
-
rows: spec.rows ?? 1,
|
|
550
|
-
};
|
|
551
|
-
// REGISTER FIRST: a custom node mounts exactly once, and the painter
|
|
552
|
-
// returns early for an id the spec does not know — so the widget must be
|
|
553
|
-
// known before the node reaches the model, or it paints blank forever.
|
|
554
|
-
v.widgets.push(w);
|
|
555
|
-
specById.set(w.id, w);
|
|
556
|
-
viewOfWidget.set(w.id, vid);
|
|
557
|
-
|
|
558
|
-
const existing = model.getNode(w.id);
|
|
559
|
-
const node = existing ?? buildWidgetNode(w, ctx.rowHeight);
|
|
560
|
-
if (w.pinned) node.setState({ locked: true });
|
|
561
|
-
// ONE undoable step (see AddWidgetCommand for why this cannot be a batch).
|
|
562
|
-
execCommand(existing ? new AddToGroupCommand(group.id, w.id) : new AddWidgetCommand(node, group.id));
|
|
563
|
-
|
|
564
|
-
binders.get(vid)?.sync();
|
|
565
|
-
ctx.apiRef?.renderNow();
|
|
566
|
-
return makeWidgetHandle(w.id);
|
|
567
|
-
},
|
|
568
|
-
refresh() {
|
|
569
|
-
for (const b of binders.values()) b.sync();
|
|
570
|
-
ctx.apiRef?.renderNow();
|
|
571
|
-
},
|
|
572
|
-
fit(viewId) {
|
|
573
|
-
const g = groups.get(viewId ?? ctx.active);
|
|
574
|
-
if (!g) return;
|
|
575
|
-
const gs = g.size ?? { width: ctx.boardW, height: ctx.boardH };
|
|
576
|
-
ctx.apiRef?.viewport?.fitToBounds(
|
|
577
|
-
{ x: g.position.x, y: g.position.y, width: gs.width, height: gs.height },
|
|
578
|
-
26,
|
|
579
|
-
{ maxZoom: 1 }
|
|
580
|
-
);
|
|
581
|
-
},
|
|
582
|
-
metrics(viewId) {
|
|
583
|
-
return binders.get(viewId ?? ctx.active)?.metrics();
|
|
584
|
-
},
|
|
585
|
-
binderOf(viewId) {
|
|
586
|
-
return binders.get(viewId ?? ctx.active);
|
|
587
|
-
},
|
|
588
|
-
exportIds(viewId) {
|
|
589
|
-
const id = viewId ?? ctx.active;
|
|
590
|
-
const ids = new Set<string>();
|
|
591
|
-
// A view with no group is a view that was never finalized — an empty set
|
|
592
|
-
// is the honest answer, and scoping an export to nothing is a visible
|
|
593
|
-
// failure rather than a silently enormous document.
|
|
594
|
-
if (!groups.has(id)) return ids;
|
|
595
|
-
ids.add(id);
|
|
596
|
-
// Read the SPEC, not the group's member Set: membership is maintained by
|
|
597
|
-
// commands and an in-flight drag can have a widget momentarily reparented.
|
|
598
|
-
// The spec is what the view IS.
|
|
599
|
-
for (const w of views.find((v) => v.id === id)?.widgets ?? []) ids.add(w.id);
|
|
600
|
-
return ids;
|
|
601
|
-
},
|
|
602
|
-
toJSON() {
|
|
603
|
-
// SAVING ON A PHONE SAVES THE DESKTOP LAYOUT. The binder serialises from
|
|
604
|
-
// the engine's LARGEST cached column count (gridstack's `save()`), so a
|
|
605
|
-
// board currently squeezed to 1 column still writes out the 12-column
|
|
606
|
-
// layout its user authored — and the view's `columns` is that count, so
|
|
607
|
-
// feeding this straight back into dashboard() rebuilds the wide board.
|
|
608
|
-
const savedViews = views.map((v) => {
|
|
609
|
-
const saved = binders.get(v.id)?.saveLayout();
|
|
610
|
-
return {
|
|
611
|
-
...v,
|
|
612
|
-
...(saved ? { columns: saved.columns } : {}),
|
|
613
|
-
widgets: v.widgets.map((w) => {
|
|
614
|
-
const cell = saved?.cells.get(w.id) ?? binders.get(v.id)?.cellOf(w.id);
|
|
615
|
-
return cell ? { ...w, x: cell.x, y: cell.y, span: cell.w, rows: cell.h } : { ...w };
|
|
616
|
-
}),
|
|
617
|
-
};
|
|
618
|
-
});
|
|
619
|
-
|
|
620
|
-
// Board options come off the LIVE board wherever the handle can see it —
|
|
621
|
-
// `sizing` and `float` are the two a user changes from the toolbar, and
|
|
622
|
-
// reading them from the authored literal would restore the board they
|
|
623
|
-
// started with rather than the one they are looking at.
|
|
624
|
-
return {
|
|
625
|
-
...ctx.optionsBase,
|
|
626
|
-
renderWidget: undefined,
|
|
627
|
-
onLayoutChange: undefined,
|
|
628
|
-
columns: ctx.columns,
|
|
629
|
-
gap: ctx.gap,
|
|
630
|
-
rowHeight: ctx.rowHeight,
|
|
631
|
-
sizing: handle.getSizing(),
|
|
632
|
-
float: handle.getFloat(),
|
|
633
|
-
rtl: handle.getRtl(),
|
|
634
|
-
views: savedViews,
|
|
635
|
-
} as DashboardSnapshot;
|
|
636
|
-
},
|
|
637
|
-
dispose() {
|
|
638
|
-
for (const b of binders.values()) b.dispose();
|
|
639
|
-
binders.clear();
|
|
640
|
-
// The groups finalize() created are ours to clean up — leaving them
|
|
641
|
-
// behind made a rebuild stack a second set of boards on the first.
|
|
642
|
-
const model = ctx.apiRef?.getModel();
|
|
643
|
-
for (const id of groups.keys()) model?.removeGroup?.(id);
|
|
644
|
-
groups.clear();
|
|
645
|
-
ctx.hosts.clear();
|
|
646
|
-
},
|
|
647
|
-
};
|
|
648
|
-
|
|
649
|
-
function makeWidgetHandle(id: string): WidgetHandle | undefined {
|
|
650
|
-
const spec = specById.get(id);
|
|
651
|
-
const viewId = viewOfWidget.get(id);
|
|
652
|
-
if (!spec || !viewId) return undefined;
|
|
653
|
-
const binder = () => binders.get(viewId);
|
|
654
|
-
const node = () => ctx.apiRef?.getModel().getNode(id);
|
|
655
|
-
return {
|
|
656
|
-
id,
|
|
657
|
-
viewId,
|
|
658
|
-
get node() {
|
|
659
|
-
return node();
|
|
660
|
-
},
|
|
661
|
-
get spec() {
|
|
662
|
-
return spec;
|
|
663
|
-
},
|
|
664
|
-
get cell() {
|
|
665
|
-
return binder()?.cellOf(id);
|
|
666
|
-
},
|
|
667
|
-
get rect() {
|
|
668
|
-
return binder()?.cellRectOf(id);
|
|
669
|
-
},
|
|
670
|
-
get pinned() {
|
|
671
|
-
return node()?.state?.locked === true;
|
|
672
|
-
},
|
|
673
|
-
async resize(span, rows) {
|
|
674
|
-
return (await binder()?.resizeTo(id, span, rows)) ?? false;
|
|
675
|
-
},
|
|
676
|
-
async moveTo(x, y) {
|
|
677
|
-
return (await binder()?.moveTo(id, x, y)) ?? false;
|
|
678
|
-
},
|
|
679
|
-
pin(on) {
|
|
680
|
-
const n = node();
|
|
681
|
-
if (!n) return;
|
|
682
|
-
n.setState({ locked: on ?? !(n.state?.locked === true) });
|
|
683
|
-
// Re-sync so the ENGINE's locked flag (never pushed, drags refused)
|
|
684
|
-
// and the hidden corner handle take effect on this frame, not the next
|
|
685
|
-
// gesture.
|
|
686
|
-
binder()?.sync();
|
|
687
|
-
ctx.apiRef?.renderNow();
|
|
688
|
-
},
|
|
689
|
-
bringToFront() {
|
|
690
|
-
execCommand(new BringNodeToFrontCommand(id));
|
|
691
|
-
ctx.apiRef?.renderNow();
|
|
692
|
-
},
|
|
693
|
-
sendToBack() {
|
|
694
|
-
execCommand(new SendNodeToBackCommand(id));
|
|
695
|
-
ctx.apiRef?.renderNow();
|
|
696
|
-
},
|
|
697
|
-
update(patch) {
|
|
698
|
-
if (patch.data !== undefined) spec.data = patch.data;
|
|
699
|
-
if (patch.title !== undefined) spec.title = patch.title;
|
|
700
|
-
if (patch.kind !== undefined) spec.kind = patch.kind;
|
|
701
|
-
const host = hostOf(id);
|
|
702
|
-
if (host) ctx.renderWidget(spec, host);
|
|
703
|
-
},
|
|
704
|
-
remove(displaced) {
|
|
705
|
-
const n = node();
|
|
706
|
-
const group = groups.get(viewId);
|
|
707
|
-
const b = binder();
|
|
708
|
-
if (!n || !group || !b) return;
|
|
709
|
-
// ONE undoable step, survivors' re-pack folded in — the same atomic
|
|
710
|
-
// shape the kit's own drag-out-to-remove uses. A gesture that ALREADY
|
|
711
|
-
// computed the survivors passes them in: after a drag-out the tile is
|
|
712
|
-
// gone from the engine, so planRemoval() would return [] and the
|
|
713
|
-
// survivors' cells would never commit.
|
|
714
|
-
const survivors = (displaced as never[] | undefined) ?? b.planRemoval(id);
|
|
715
|
-
const cmds = [...survivors, new RemoveFromGroupCommand(group.id, id), new RemoveNodeCommand(id)];
|
|
716
|
-
void execCommand(new BatchCommand('Remove widget', cmds));
|
|
717
|
-
const v = views.find((x) => x.id === viewId);
|
|
718
|
-
if (v) v.widgets = v.widgets.filter((w) => w.id !== id);
|
|
719
|
-
specById.delete(id);
|
|
720
|
-
viewOfWidget.delete(id);
|
|
721
|
-
b.sync();
|
|
722
|
-
ctx.apiRef?.renderNow();
|
|
723
|
-
},
|
|
724
|
-
repaint() {
|
|
725
|
-
const host = hostOf(id);
|
|
726
|
-
if (host) ctx.renderWidget(spec, host);
|
|
727
|
-
},
|
|
728
|
-
// (hosts are captured in renderCustomNode, so repaint works for every
|
|
729
|
-
// widget the renderer has mounted — including after a rebuild.)
|
|
730
|
-
};
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
return handle;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
export function dashboard(options: DashboardOptions): DashboardSpec {
|
|
737
|
-
ensureDashboardKitStyles();
|
|
738
|
-
|
|
739
|
-
const columns = options.columns ?? DEFAULTS.columns;
|
|
740
|
-
const gap = options.gap ?? DEFAULTS.gap;
|
|
741
|
-
const rowHeight = options.rowHeight ?? DEFAULTS.rowHeight;
|
|
742
|
-
const boardW = options.width ?? DEFAULTS.width;
|
|
743
|
-
const boardH = options.height ?? DEFAULTS.height;
|
|
744
|
-
|
|
745
|
-
const views: DashboardViewSpec[] = options.views
|
|
746
|
-
? options.views.map((v) => ({ ...v, widgets: v.widgets.map((w) => ({ ...w })) }))
|
|
747
|
-
: [{ id: 'main', widgets: (options.widgets ?? []).map((w) => ({ ...w })) }];
|
|
748
|
-
for (const v of views) assignCells(v.widgets, v.columns ?? columns);
|
|
749
|
-
|
|
750
|
-
// -- the render spec: one custom-HTML node per widget ----------------------
|
|
751
|
-
const nodes: Array<Record<string, unknown>> = [];
|
|
752
|
-
const specById = new Map<string, DashboardWidgetSpec>();
|
|
753
|
-
const viewOfWidget = new Map<string, string>();
|
|
754
|
-
for (const v of views) {
|
|
755
|
-
for (const w of v.widgets) {
|
|
756
|
-
specById.set(w.id, w);
|
|
757
|
-
viewOfWidget.set(w.id, v.id);
|
|
758
|
-
nodes.push({
|
|
759
|
-
id: w.id,
|
|
760
|
-
type: 'widget',
|
|
761
|
-
position: { x: 0, y: 0 },
|
|
762
|
-
size: { width: 100, height: rowHeight },
|
|
763
|
-
custom: true,
|
|
764
|
-
metadata: {
|
|
765
|
-
useHTMLLayer: true,
|
|
766
|
-
widgetKind: w.kind ?? 'widget',
|
|
767
|
-
widgetSpec: w.data ?? {},
|
|
768
|
-
// See buildWidgetNode(): the title has to reach the node or a reload
|
|
769
|
-
// cannot rebuild the card's header. These two paths are the drift the
|
|
770
|
-
// comment on buildWidgetNode warns about — they must agree.
|
|
771
|
-
...(w.title !== undefined ? { widgetTitle: w.title } : {}),
|
|
772
|
-
columnSpan: w.span,
|
|
773
|
-
rowSpan: w.rows,
|
|
774
|
-
gridItem: { columnStart: w.x! + 1, columnEnd: w.x! + 1 + w.span!, rowStart: w.y! + 1, rowEnd: w.y! + 1 + w.rows! },
|
|
775
|
-
},
|
|
776
|
-
});
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
// No renderWidget → the built-in renderers draw the declared `kind` from the
|
|
781
|
-
// developer's own `data` (widgets.ts), unknown kinds landing on the titled
|
|
782
|
-
// frame they always did.
|
|
783
|
-
const renderWidget = options.renderWidget ?? defaultWidgetRenderer;
|
|
784
|
-
|
|
785
|
-
// -- runtime: ONE shared handle over a boxed context -----------------------
|
|
786
|
-
// The two MUTABLE cells the handle used to close over as free `let`s —
|
|
787
|
-
// `active` (showView reassigns it) and `apiRef` (finalize sets it) — are boxed
|
|
788
|
-
// on `ctx`, so the SAME builder that fromDocument() calls reads and writes
|
|
789
|
-
// them. Everything else is the stable state; the handle is identical to what
|
|
790
|
-
// was inline here, moved verbatim into createDashboardHandle().
|
|
791
|
-
const ctx: DashboardHandleContext = {
|
|
792
|
-
views,
|
|
793
|
-
groups: new Map<string, GroupModel>(),
|
|
794
|
-
binders: new Map<string, DashboardGridHandle>(),
|
|
795
|
-
specById,
|
|
796
|
-
viewOfWidget,
|
|
797
|
-
hosts: new Map<string, HTMLElement>(),
|
|
798
|
-
renderWidget,
|
|
799
|
-
columns,
|
|
800
|
-
gap,
|
|
801
|
-
rowHeight,
|
|
802
|
-
boardW,
|
|
803
|
-
boardH,
|
|
804
|
-
optionsBase: options,
|
|
805
|
-
active: views[0]?.id ?? 'main',
|
|
806
|
-
apiRef: null,
|
|
807
|
-
};
|
|
808
|
-
const { binders, groups } = ctx;
|
|
809
|
-
const handle = createDashboardHandle(ctx);
|
|
810
|
-
|
|
811
|
-
return {
|
|
812
|
-
nodes,
|
|
813
|
-
edges: [],
|
|
814
|
-
renderCustomNode: (node: unknown, host: HTMLElement) => {
|
|
815
|
-
const n = node as { id: string };
|
|
816
|
-
const spec = specById.get(n.id);
|
|
817
|
-
if (!spec) return;
|
|
818
|
-
ctx.hosts.set(n.id, host);
|
|
819
|
-
renderWidget(spec, host);
|
|
820
|
-
},
|
|
821
|
-
get handle() {
|
|
822
|
-
return handle;
|
|
823
|
-
},
|
|
824
|
-
finalize: (api: unknown) => {
|
|
825
|
-
const a = api as DashboardApiRef | null;
|
|
826
|
-
if (!a) return;
|
|
827
|
-
ctx.apiRef = a;
|
|
828
|
-
const model = a.getModel();
|
|
829
|
-
|
|
830
|
-
for (const v of views) {
|
|
831
|
-
// One board per view; the group is a pure LAYOUT CONTAINER, so its
|
|
832
|
-
// chrome is suppressed (frameChrome) exactly as a dashboard needs.
|
|
833
|
-
const g = new GroupModel({ id: v.id, name: v.name ?? v.id });
|
|
834
|
-
model.addGroup(g);
|
|
835
|
-
g.setMetadata('frameChrome', 'none');
|
|
836
|
-
// THE BOARD'S GEOMETRY, PERSISTED. Cells alone do not describe a board:
|
|
837
|
-
// the column count, gap and sizing mode are what turn them into pixels,
|
|
838
|
-
// and they live only in the `dashboard()` call. Without them a reloaded
|
|
839
|
-
// document could paint the widgets but never rebind the grid — the
|
|
840
|
-
// reload would be a picture of a dashboard rather than a dashboard.
|
|
841
|
-
// Serializable values only: the binder's callbacks belong to the app.
|
|
842
|
-
g.setMetadata('dashboardBoard', {
|
|
843
|
-
columns: v.columns ?? columns,
|
|
844
|
-
gap,
|
|
845
|
-
padding: gap,
|
|
846
|
-
sizing: options.sizing ?? 'fit',
|
|
847
|
-
baseRowHeight: rowHeight,
|
|
848
|
-
designHeight: v.height ?? boardH,
|
|
849
|
-
float: options.float ?? false,
|
|
850
|
-
rtl: options.rtl ?? false,
|
|
851
|
-
});
|
|
852
|
-
g.size = { width: v.width ?? boardW, height: v.height ?? boardH, depth: 0 };
|
|
853
|
-
g.position = { x: v.id === ctx.active ? 0 : OFFSCREEN_X, y: 0 };
|
|
854
|
-
groups.set(v.id, g);
|
|
855
|
-
for (const w of v.widgets) {
|
|
856
|
-
const n = model.getNode(w.id);
|
|
857
|
-
if (!n) continue;
|
|
858
|
-
// DECLARED CELLS ARE AUTHORITATIVE. `metadata.gridItem` on the node
|
|
859
|
-
// SPEC is inert — the model's GridItemConfig is a real field
|
|
860
|
-
// (`setGridItem`), and it is the only thing the binder reads. Without
|
|
861
|
-
// this write the board silently auto-positioned instead, which
|
|
862
|
-
// matched the declaration only while flow order happened to agree,
|
|
863
|
-
// and made toJSON() → dashboard() NOT round-trip (a saved layout
|
|
864
|
-
// rebuilt back into its declaration order rather than its cells).
|
|
865
|
-
if (w.x !== undefined && w.y !== undefined) {
|
|
866
|
-
n.setGridItem(gridItemFromCell({ x: w.x, y: w.y, w: w.span ?? 3, h: w.rows ?? 1 }));
|
|
867
|
-
}
|
|
868
|
-
if (w.pinned) n.setState({ locked: true });
|
|
869
|
-
// A dashboard widget is not a wiring endpoint. This MUST happen here
|
|
870
|
-
// rather than on the node spec: the render-input path IGNORES a
|
|
871
|
-
// spec-level `behavior` (the same trap erDiagram documents for
|
|
872
|
-
// `resizable`), so a DECLARED widget shipped connectable with four
|
|
873
|
-
// default ports and sprouted glyphs on hover — while addWidget()'s
|
|
874
|
-
// directly-built nodes were already correct. One path being right is
|
|
875
|
-
// exactly what hid it, and why the tooth now covers both.
|
|
876
|
-
n.setBehavior({ connectable: false });
|
|
877
|
-
for (const p of [...n.getPorts().values()]) n.removePort(p.id);
|
|
878
|
-
g.addMember(w.id);
|
|
879
|
-
}
|
|
880
|
-
binders.set(
|
|
881
|
-
v.id,
|
|
882
|
-
bindDashboardGrid(a as never, g, {
|
|
883
|
-
columns: v.columns ?? columns,
|
|
884
|
-
gap,
|
|
885
|
-
padding: gap,
|
|
886
|
-
sizing: options.sizing ?? 'fit',
|
|
887
|
-
baseRowHeight: rowHeight,
|
|
888
|
-
designHeight: v.height ?? boardH,
|
|
889
|
-
float: options.float ?? false,
|
|
890
|
-
rtl: options.rtl ?? false,
|
|
891
|
-
...(options.responsive ? { responsive: options.responsive } : {}),
|
|
892
|
-
...(options.binder ?? {}),
|
|
893
|
-
onGesture: (e) => {
|
|
894
|
-
if (e.type === 'commit' && options.onLayoutChange) {
|
|
895
|
-
const snapshot = handle.toJSON().views.find((x) => x.id === v.id);
|
|
896
|
-
if (snapshot) options.onLayoutChange(v.id, snapshot.widgets);
|
|
897
|
-
}
|
|
898
|
-
options.binder?.onGesture?.(e);
|
|
899
|
-
},
|
|
900
|
-
})
|
|
901
|
-
);
|
|
902
|
-
}
|
|
903
|
-
handle.showView(ctx.active);
|
|
904
|
-
},
|
|
905
|
-
};
|
|
906
|
-
}
|