@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,821 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `dashboard()` — the authoring API's contract.
|
|
3
|
-
*
|
|
4
|
-
* The promise being tested is the one the user asked for: "does our API
|
|
5
|
-
* contain an easy way to create dashboards for developers", by exact analogy
|
|
6
|
-
* with `erDiagram()`. So these tests assert the DECLARATIVE surface — what you
|
|
7
|
-
* get from pure data, with no hand-assembly — and the typed handles over it.
|
|
8
|
-
*
|
|
9
|
-
* They drive the real engine (DiagramModel + the kit's binder) through a
|
|
10
|
-
* minimal API stub, the same shape `render()` passes to `finalize()`.
|
|
11
|
-
*/
|
|
12
|
-
import { Command, DiagramModel, GroupModel, NodeModel, CommandManager, EventBus } from '@grafloria/engine';
|
|
13
|
-
import { render } from '../grafloria';
|
|
14
|
-
import { dashboard, type DashboardSpec } from './dashboard';
|
|
15
|
-
|
|
16
|
-
/** The slice of a DiagramInstance `finalize()` uses, over a real model. */
|
|
17
|
-
function makeApi(model: DiagramModel) {
|
|
18
|
-
const bus = new EventBus();
|
|
19
|
-
const manager = new CommandManager({ diagram: model, eventBus: bus });
|
|
20
|
-
const container = document.createElement('div');
|
|
21
|
-
document.body.appendChild(container);
|
|
22
|
-
const layer = document.createElement('div');
|
|
23
|
-
layer.className = 'grafloria-html-layer';
|
|
24
|
-
container.appendChild(layer);
|
|
25
|
-
return {
|
|
26
|
-
getModel: () => model,
|
|
27
|
-
getEngine: () => ({ commandManager: manager }),
|
|
28
|
-
container,
|
|
29
|
-
render: () => undefined,
|
|
30
|
-
renderNow: () => undefined,
|
|
31
|
-
viewport: { fitToBounds: () => undefined, clientToWorld: () => ({ x: 0, y: 0 }) },
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Mount a spec the way `render()` does: build nodes, then run finalize. */
|
|
36
|
-
function mount(spec: DashboardSpec) {
|
|
37
|
-
const model = new DiagramModel('dash');
|
|
38
|
-
for (const n of spec.nodes) {
|
|
39
|
-
const raw = n as {
|
|
40
|
-
id: string;
|
|
41
|
-
position: { x: number; y: number };
|
|
42
|
-
size: { width: number; height: number };
|
|
43
|
-
metadata: Record<string, unknown>;
|
|
44
|
-
};
|
|
45
|
-
const node = new NodeModel({
|
|
46
|
-
id: raw.id,
|
|
47
|
-
type: 'widget',
|
|
48
|
-
position: { ...raw.position },
|
|
49
|
-
size: { ...raw.size, depth: 0 },
|
|
50
|
-
});
|
|
51
|
-
for (const [k, v] of Object.entries(raw.metadata)) node.setMetadata(k, v);
|
|
52
|
-
model.addNode(node);
|
|
53
|
-
}
|
|
54
|
-
const api = makeApi(model);
|
|
55
|
-
spec.finalize(api);
|
|
56
|
-
return { model, api, handle: spec.handle };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const SIMPLE = () =>
|
|
60
|
-
dashboard({
|
|
61
|
-
columns: 12,
|
|
62
|
-
views: [
|
|
63
|
-
{
|
|
64
|
-
id: 'overview',
|
|
65
|
-
name: 'Overview',
|
|
66
|
-
widgets: [
|
|
67
|
-
{ id: 'a', kind: 'kpi', span: 3, rows: 1 },
|
|
68
|
-
{ id: 'b', kind: 'kpi', span: 3, rows: 1 },
|
|
69
|
-
{ id: 'c', kind: 'line', span: 6, rows: 2 },
|
|
70
|
-
],
|
|
71
|
-
},
|
|
72
|
-
{ id: 'sales', name: 'Sales', widgets: [{ id: 'd', kind: 'bar', span: 12, rows: 2 }] },
|
|
73
|
-
],
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
describe('dashboard() — the declarative surface', () => {
|
|
77
|
-
it('turns pure data into custom-HTML widget nodes, no hand-assembly', () => {
|
|
78
|
-
const spec = SIMPLE();
|
|
79
|
-
expect(spec.nodes).toHaveLength(4);
|
|
80
|
-
const a = spec.nodes[0] as Record<string, any>;
|
|
81
|
-
expect(a['id']).toBe('a');
|
|
82
|
-
expect(a['custom']).toBe(true); // the un-sanitised HTML host path
|
|
83
|
-
expect(a['metadata'].useHTMLLayer).toBe(true);
|
|
84
|
-
expect(a['metadata'].widgetKind).toBe('kpi');
|
|
85
|
-
// Cells are carried as GridItemConfig, so save/load round-trips for free.
|
|
86
|
-
expect(a['metadata'].gridItem).toEqual({ columnStart: 1, columnEnd: 4, rowStart: 1, rowEnd: 2 });
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('FLOWS widgets that declare no cell — the common case needs no coordinates', () => {
|
|
90
|
-
const spec = dashboard({
|
|
91
|
-
columns: 12,
|
|
92
|
-
widgets: [
|
|
93
|
-
{ id: 'w1', span: 4 },
|
|
94
|
-
{ id: 'w2', span: 4 },
|
|
95
|
-
{ id: 'w3', span: 4 },
|
|
96
|
-
{ id: 'w4', span: 6 }, // wraps to the next row
|
|
97
|
-
],
|
|
98
|
-
});
|
|
99
|
-
const cell = (i: number) => (spec.nodes[i] as Record<string, any>)['metadata'].gridItem;
|
|
100
|
-
expect(cell(0)).toMatchObject({ columnStart: 1, rowStart: 1 });
|
|
101
|
-
expect(cell(1)).toMatchObject({ columnStart: 5, rowStart: 1 });
|
|
102
|
-
expect(cell(2)).toMatchObject({ columnStart: 9, rowStart: 1 });
|
|
103
|
-
expect(cell(3)).toMatchObject({ columnStart: 1, rowStart: 2 }); // wrapped
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('honours explicit cells verbatim and mixes them with flowed ones', () => {
|
|
107
|
-
const spec = dashboard({
|
|
108
|
-
columns: 12,
|
|
109
|
-
widgets: [
|
|
110
|
-
{ id: 'hero', span: 6, rows: 2, x: 6, y: 0 }, // pinned to the right
|
|
111
|
-
{ id: 'flow', span: 3 },
|
|
112
|
-
],
|
|
113
|
-
});
|
|
114
|
-
expect((spec.nodes[0] as Record<string, any>)['metadata'].gridItem).toMatchObject({
|
|
115
|
-
columnStart: 7,
|
|
116
|
-
rowStart: 1,
|
|
117
|
-
columnEnd: 13,
|
|
118
|
-
});
|
|
119
|
-
expect((spec.nodes[1] as Record<string, any>)['metadata'].gridItem).toMatchObject({ columnStart: 1 });
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('finalize() builds one chromeless board per view and adopts its widgets', () => {
|
|
123
|
-
const { model, handle } = mount(SIMPLE());
|
|
124
|
-
const overview = model.getGroup('overview');
|
|
125
|
-
const sales = model.getGroup('sales');
|
|
126
|
-
expect(overview).toBeDefined();
|
|
127
|
-
expect(sales).toBeDefined();
|
|
128
|
-
// A layout container must not paint group chrome (frame + title band).
|
|
129
|
-
expect(overview!.getMetadata('frameChrome')).toBe('none');
|
|
130
|
-
expect([...(overview!.members ?? [])].sort()).toEqual(['a', 'b', 'c']);
|
|
131
|
-
expect([...(sales!.members ?? [])]).toEqual(['d']);
|
|
132
|
-
expect(handle.views).toEqual(['overview', 'sales']);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('DECLARED CELLS REACH THE BOARD — not just the flow order', () => {
|
|
136
|
-
// The regression this locks: the spec's `metadata.gridItem` is inert, so
|
|
137
|
-
// finalize() must write the model's real GridItemConfig. Before it did,
|
|
138
|
-
// the board auto-positioned every widget in declaration order and an
|
|
139
|
-
// out-of-flow cell was silently ignored — invisible whenever the flow
|
|
140
|
-
// happened to agree, and fatal to the toJSON() round-trip when it did not.
|
|
141
|
-
const { handle } = mount(
|
|
142
|
-
dashboard({
|
|
143
|
-
columns: 12,
|
|
144
|
-
widgets: [
|
|
145
|
-
{ id: 'far', span: 3, rows: 1, x: 9, y: 2 }, // nowhere near the flow's first hole
|
|
146
|
-
{ id: 'near', span: 3, rows: 1, x: 0, y: 0 },
|
|
147
|
-
],
|
|
148
|
-
})
|
|
149
|
-
);
|
|
150
|
-
// Declared FIRST, yet it holds the last three columns — auto-positioning
|
|
151
|
-
// would have opened the board with it at x: 0.
|
|
152
|
-
expect(handle.widget('far')!.cell).toMatchObject({ x: 9, w: 3 });
|
|
153
|
-
expect(handle.widget('near')!.cell).toEqual({ x: 0, y: 0, w: 3, h: 1 });
|
|
154
|
-
// …and the row obeys gravity, which is the engine's job, not the spec's:
|
|
155
|
-
// with float off nothing hovers over an empty row.
|
|
156
|
-
expect(handle.widget('far')!.cell!.y).toBe(0);
|
|
157
|
-
const floated = mount(
|
|
158
|
-
dashboard({ float: true, widgets: [{ id: 'far', span: 3, rows: 1, x: 9, y: 2 }] })
|
|
159
|
-
);
|
|
160
|
-
expect(floated.handle.widget('far')!.cell).toEqual({ x: 9, y: 2, w: 3, h: 1 });
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it('parks every non-active view off-camera (the tab pattern)', () => {
|
|
164
|
-
const { model, handle } = mount(SIMPLE());
|
|
165
|
-
expect(handle.activeView).toBe('overview');
|
|
166
|
-
expect(model.getGroup('overview')!.position.x).toBe(0);
|
|
167
|
-
expect(model.getGroup('sales')!.position.x).toBeLessThan(-1000);
|
|
168
|
-
handle.showView('sales');
|
|
169
|
-
expect(handle.activeView).toBe('sales');
|
|
170
|
-
expect(model.getGroup('sales')!.position.x).toBe(0);
|
|
171
|
-
expect(model.getGroup('overview')!.position.x).toBeLessThan(-1000);
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('pinned:true reaches the model as the authoritative lock', () => {
|
|
175
|
-
const { model } = mount(
|
|
176
|
-
dashboard({ widgets: [{ id: 'p', span: 3, pinned: true }, { id: 'q', span: 3 }] })
|
|
177
|
-
);
|
|
178
|
-
expect(model.getNode('p')!.state?.locked).toBe(true);
|
|
179
|
-
expect(model.getNode('q')!.state?.locked).not.toBe(true);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('renderWidget receives the DECLARED widget and a raw host', () => {
|
|
183
|
-
const seen: Array<{ id: string; kind?: string; tag: string }> = [];
|
|
184
|
-
const spec = dashboard({
|
|
185
|
-
widgets: [{ id: 'w', kind: 'donut', title: 'Mix', data: { source: 'region' } }],
|
|
186
|
-
renderWidget: (w, host) => seen.push({ id: w.id, kind: w.kind, tag: host.tagName }),
|
|
187
|
-
});
|
|
188
|
-
const host = document.createElement('div');
|
|
189
|
-
spec.renderCustomNode({ id: 'w' }, host);
|
|
190
|
-
expect(seen).toEqual([{ id: 'w', kind: 'donut', tag: 'DIV' }]);
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('without renderWidget a titled placeholder renders — layouts are testable before charts exist', () => {
|
|
194
|
-
const spec = dashboard({ widgets: [{ id: 'w', title: 'Revenue' }] });
|
|
195
|
-
const host = document.createElement('div');
|
|
196
|
-
spec.renderCustomNode({ id: 'w' }, host);
|
|
197
|
-
expect(host.textContent).toContain('Revenue');
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
describe('render(SPEC, host) — the documented one-liner', () => {
|
|
202
|
-
// A spec that carries BOTH `finalize` and `renderCustomNode` must have both
|
|
203
|
-
// honoured. render() auto-ran finalize but dropped renderCustomNode, so the
|
|
204
|
-
// kit's headline usage — `render(dashboard({…}), host)` — mounted a board
|
|
205
|
-
// whose widgets never painted. The API's own doc comment was false.
|
|
206
|
-
it('paints widgets through render() itself — the whole one-liner', () => {
|
|
207
|
-
// Drives the REAL render() path, not the spec object: the first version of
|
|
208
|
-
// this tooth called spec.renderCustomNode directly and stayed green with
|
|
209
|
-
// the bug in place (render() silently dropped it). Weak teeth are how a
|
|
210
|
-
// documented API stays false.
|
|
211
|
-
const painted: string[] = [];
|
|
212
|
-
const el = document.createElement('div');
|
|
213
|
-
el.style.width = '900px';
|
|
214
|
-
el.style.height = '600px';
|
|
215
|
-
document.body.appendChild(el);
|
|
216
|
-
render(
|
|
217
|
-
dashboard({
|
|
218
|
-
widgets: [{ id: 'w1', kind: 'kpi' }, { id: 'w2', kind: 'line' }],
|
|
219
|
-
renderWidget: (w, host) => {
|
|
220
|
-
painted.push(w.id);
|
|
221
|
-
host.textContent = w.id;
|
|
222
|
-
},
|
|
223
|
-
}) as never,
|
|
224
|
-
el
|
|
225
|
-
);
|
|
226
|
-
expect(painted.sort()).toEqual(['w1', 'w2']);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it('honours a spec-provided renderCustomNode', () => {
|
|
230
|
-
const painted: string[] = [];
|
|
231
|
-
const spec = dashboard({
|
|
232
|
-
widgets: [{ id: 'w', kind: 'kpi' }],
|
|
233
|
-
renderWidget: (w, host) => {
|
|
234
|
-
painted.push(w.id);
|
|
235
|
-
host.textContent = w.id;
|
|
236
|
-
},
|
|
237
|
-
});
|
|
238
|
-
// The exact contract render() relies on: the spec exposes the painter.
|
|
239
|
-
expect(typeof spec.renderCustomNode).toBe('function');
|
|
240
|
-
const host = document.createElement('div');
|
|
241
|
-
spec.renderCustomNode({ id: 'w' }, host);
|
|
242
|
-
expect(painted).toEqual(['w']);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
describe('the typed handles (the erTable/umlClass equivalent)', () => {
|
|
247
|
-
it('widget() exposes the live cell as data', () => {
|
|
248
|
-
const { handle } = mount(SIMPLE());
|
|
249
|
-
expect(handle.widget('a')!.cell).toEqual({ x: 0, y: 0, w: 3, h: 1 });
|
|
250
|
-
expect(handle.widget('c')!.cell).toEqual({ x: 6, y: 0, w: 6, h: 2 });
|
|
251
|
-
expect(handle.widget('nope')).toBeUndefined();
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
it('widgetsOf() lists the active view, or a named one', () => {
|
|
255
|
-
const { handle } = mount(SIMPLE());
|
|
256
|
-
expect(handle.widgetsOf().map((w) => w.id)).toEqual(['a', 'b', 'c']);
|
|
257
|
-
expect(handle.widgetsOf('sales').map((w) => w.id)).toEqual(['d']);
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
it('resize() changes the cell', async () => {
|
|
261
|
-
const { handle } = mount(SIMPLE());
|
|
262
|
-
await handle.widget('a')!.resize(6, 2);
|
|
263
|
-
expect(handle.widget('a')!.cell).toMatchObject({ w: 6, h: 2 });
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
it('moveTo() relocates and the board stays overlap-free', async () => {
|
|
267
|
-
const { handle } = mount(SIMPLE());
|
|
268
|
-
await handle.widget('c')!.moveTo(0, 2);
|
|
269
|
-
const cells = handle.widgetsOf().map((w) => w.cell!);
|
|
270
|
-
for (let i = 0; i < cells.length; i++) {
|
|
271
|
-
for (let j = i + 1; j < cells.length; j++) {
|
|
272
|
-
const p = cells[i];
|
|
273
|
-
const q = cells[j];
|
|
274
|
-
const overlap =
|
|
275
|
-
p.x < q.x + q.w && q.x < p.x + p.w && p.y < q.y + q.h && q.y < p.y + p.h;
|
|
276
|
-
expect(overlap).toBe(false);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
it('pin() toggles the lock both ways', () => {
|
|
282
|
-
const { handle } = mount(SIMPLE());
|
|
283
|
-
const w = handle.widget('a')!;
|
|
284
|
-
expect(w.pinned).toBe(false);
|
|
285
|
-
w.pin();
|
|
286
|
-
expect(w.pinned).toBe(true);
|
|
287
|
-
w.pin(false);
|
|
288
|
-
expect(w.pinned).toBe(false);
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
it('setSizing / setFloat drive every view at once', () => {
|
|
292
|
-
const { handle } = mount(SIMPLE());
|
|
293
|
-
expect(handle.getSizing()).toBe('fit');
|
|
294
|
-
handle.setSizing('grow');
|
|
295
|
-
expect(handle.getSizing()).toBe('grow');
|
|
296
|
-
expect(handle.getFloat()).toBe(false);
|
|
297
|
-
handle.setFloat(true);
|
|
298
|
-
expect(handle.getFloat()).toBe(true);
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
it('remove() drops the widget and it stops being listed', () => {
|
|
302
|
-
const { handle } = mount(SIMPLE());
|
|
303
|
-
handle.widget('b')!.remove();
|
|
304
|
-
expect(handle.widget('b')).toBeUndefined();
|
|
305
|
-
expect(handle.widgetsOf().map((w) => w.id)).toEqual(['a', 'c']);
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
it('toJSON() round-trips: the output is valid dashboard() input', async () => {
|
|
309
|
-
const { handle } = mount(SIMPLE());
|
|
310
|
-
await handle.widget('a')!.resize(6, 1);
|
|
311
|
-
const saved = handle.toJSON();
|
|
312
|
-
expect(saved.views.map((v) => v.id)).toEqual(['overview', 'sales']);
|
|
313
|
-
expect(saved.views[0].widgets.find((w) => w.id === 'a')).toMatchObject({ span: 6, rows: 1 });
|
|
314
|
-
// Feed it straight back — the whole point of a data-first API.
|
|
315
|
-
const reloaded = dashboard({ ...saved, columns: 12 });
|
|
316
|
-
const cellOfA = (reloaded.nodes.find((n) => (n as Record<string, any>)['id'] === 'a') as Record<
|
|
317
|
-
string,
|
|
318
|
-
any
|
|
319
|
-
>)['metadata'].gridItem;
|
|
320
|
-
expect(cellOfA).toMatchObject({ columnStart: 1, columnEnd: 7 });
|
|
321
|
-
// …and MOUNTING that reload really reproduces the saved cells, which is
|
|
322
|
-
// the claim a save/load button depends on (the spec's node metadata alone
|
|
323
|
-
// never reaches the board — finalize() writes the model's GridItemConfig).
|
|
324
|
-
const { handle: h2 } = mount(reloaded);
|
|
325
|
-
expect(h2.widget('a')!.cell).toEqual({ x: 0, y: 0, w: 6, h: 1 });
|
|
326
|
-
expect(h2.widget('c')!.cell).toEqual(handle.widget('c')!.cell);
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
it('onLayoutChange is wired to committed gestures', () => {
|
|
330
|
-
const calls: string[] = [];
|
|
331
|
-
const spec = dashboard({
|
|
332
|
-
widgets: [{ id: 'w', span: 3 }],
|
|
333
|
-
onLayoutChange: (viewId) => calls.push(viewId),
|
|
334
|
-
});
|
|
335
|
-
mount(spec);
|
|
336
|
-
// No gesture yet — the hook must not fire on boot.
|
|
337
|
-
expect(calls).toEqual([]);
|
|
338
|
-
});
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
describe('the closed API gaps (the port\'s bypass list)', () => {
|
|
342
|
-
it('#1 addWidget CREATES the node, wires its metadata, and is UNDOABLE', async () => {
|
|
343
|
-
const { model, api, handle } = mount(SIMPLE());
|
|
344
|
-
const cm = api.getEngine().commandManager;
|
|
345
|
-
expect(model.getNode('fresh')).toBeUndefined();
|
|
346
|
-
const w = handle.addWidget({ id: 'fresh', kind: 'bar', span: 4, rows: 2 });
|
|
347
|
-
expect(w).toBeDefined();
|
|
348
|
-
const node = model.getNode('fresh')!;
|
|
349
|
-
expect(node).toBeDefined();
|
|
350
|
-
expect(node.getMetadata('useHTMLLayer')).toBe(true);
|
|
351
|
-
expect(node.getMetadata('widgetKind')).toBe('bar');
|
|
352
|
-
expect(node.getMetadata('columnSpan')).toBe(4);
|
|
353
|
-
expect([...(model.getGroup('overview')!.members ?? [])]).toContain('fresh');
|
|
354
|
-
// The manager settles its history asynchronously (it awaits internally),
|
|
355
|
-
// so the undo entry lands on the next tick — the node itself is already
|
|
356
|
-
// in the model synchronously, which is what the paint path needs.
|
|
357
|
-
await new Promise((r) => setTimeout(r, 0));
|
|
358
|
-
expect(cm.canUndo()).toBe(true);
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
it('#5 widget nodes are NOT connectable and carry no ports — BOTH paths', () => {
|
|
362
|
-
// The first version of this tooth only exercised addWidget(). Widgets
|
|
363
|
-
// DECLARED in dashboard({views}) travel a different road: they become node
|
|
364
|
-
// SPECS, and the render-input path ignores a spec-level `behavior` (the
|
|
365
|
-
// same trap erDiagram documents for `resizable`), so finalize() has to set
|
|
366
|
-
// it on the live model. Covering one path let the other ship connectable.
|
|
367
|
-
const { model, handle } = mount(SIMPLE());
|
|
368
|
-
for (const id of ['a', 'b', 'c']) {
|
|
369
|
-
const declared = model.getNode(id)!;
|
|
370
|
-
expect(declared.behavior?.connectable).toBe(false);
|
|
371
|
-
expect([...declared.getPorts().values()]).toHaveLength(0);
|
|
372
|
-
}
|
|
373
|
-
handle.addWidget({ id: 'w5', kind: 'kpi' });
|
|
374
|
-
const added = model.getNode('w5')!;
|
|
375
|
-
expect(added.behavior?.connectable).toBe(false);
|
|
376
|
-
expect([...added.getPorts().values()]).toHaveLength(0);
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
it('#3 resize/moveTo report whether the board ACCEPTED the change', async () => {
|
|
380
|
-
const { handle } = mount(SIMPLE());
|
|
381
|
-
await expect(handle.widget('a')!.resize(6, 2)).resolves.toBe(true);
|
|
382
|
-
// Same cells again -> nothing to do -> false, not a silent void.
|
|
383
|
-
const cell = handle.widget('a')!.cell!;
|
|
384
|
-
await expect(handle.widget('a')!.resize(cell.w, cell.h)).resolves.toBe(false);
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
it('#7/#12 the handle exposes the declared spec, the rect and board metrics', () => {
|
|
388
|
-
const { handle } = mount(SIMPLE());
|
|
389
|
-
expect(handle.widget('a')!.spec.kind).toBe('kpi');
|
|
390
|
-
const rect = handle.widget('a')!.rect!;
|
|
391
|
-
expect(rect.width).toBeGreaterThan(0);
|
|
392
|
-
const m = handle.metrics()!;
|
|
393
|
-
expect(m.columns).toBe(12);
|
|
394
|
-
expect(m.rows).toBeGreaterThan(0);
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
it('#11 z-order lives on the handle and is undoable', async () => {
|
|
398
|
-
const { model, api, handle } = mount(SIMPLE());
|
|
399
|
-
handle.widget('a')!.bringToFront();
|
|
400
|
-
await new Promise((r) => setTimeout(r, 0));
|
|
401
|
-
expect(api.getEngine().commandManager.canUndo()).toBe(true);
|
|
402
|
-
expect(typeof model.getNode('a')!.getEffectiveZIndex()).toBe('number');
|
|
403
|
-
handle.widget('a')!.sendToBack();
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
it('#2 remove() USES the gesture\'s already-computed displaced commands', async () => {
|
|
407
|
-
// A weaker version of this tooth passed `[]` and only checked the widget
|
|
408
|
-
// vanished — which stayed green when remove() ignored the argument and
|
|
409
|
-
// re-planned its own. The caller's commands must actually RUN, so hand it
|
|
410
|
-
// an observable one and watch for it.
|
|
411
|
-
let ran = false;
|
|
412
|
-
class Sentinel extends Command {
|
|
413
|
-
constructor() {
|
|
414
|
-
super('Sentinel');
|
|
415
|
-
}
|
|
416
|
-
override execute(): void {
|
|
417
|
-
ran = true;
|
|
418
|
-
}
|
|
419
|
-
override undo(): void {
|
|
420
|
-
ran = false;
|
|
421
|
-
}
|
|
422
|
-
override serialize() {
|
|
423
|
-
return { id: this.id, name: this.name, timestamp: this.timestamp, data: {} };
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
const { handle } = mount(SIMPLE());
|
|
427
|
-
handle.widget('b')!.remove([new Sentinel()]);
|
|
428
|
-
await new Promise((r) => setTimeout(r, 0));
|
|
429
|
-
expect(ran).toBe(true);
|
|
430
|
-
expect(handle.widget('b')).toBeUndefined();
|
|
431
|
-
});
|
|
432
|
-
|
|
433
|
-
it('#6 dispose() takes its boards with it — a rebuild cannot stack them', () => {
|
|
434
|
-
const { model, handle } = mount(SIMPLE());
|
|
435
|
-
expect(model.getGroup('overview')).toBeDefined();
|
|
436
|
-
handle.dispose();
|
|
437
|
-
expect(model.getGroup('overview')).toBeUndefined();
|
|
438
|
-
expect(model.getGroup('sales')).toBeUndefined();
|
|
439
|
-
});
|
|
440
|
-
|
|
441
|
-
it('#4/#9 refresh() and fit() exist and are safe to call', () => {
|
|
442
|
-
const { handle } = mount(SIMPLE());
|
|
443
|
-
expect(() => handle.refresh()).not.toThrow();
|
|
444
|
-
expect(() => handle.fit()).not.toThrow();
|
|
445
|
-
expect(() => handle.fit('sales')).not.toThrow();
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
it('update() swaps the data and repaints through renderWidget', () => {
|
|
449
|
-
const painted: unknown[] = [];
|
|
450
|
-
const spec = dashboard({
|
|
451
|
-
widgets: [{ id: 'u', kind: 'kpi', data: { value: 'one' } }],
|
|
452
|
-
renderWidget: (w, host) => {
|
|
453
|
-
painted.push(w.data);
|
|
454
|
-
host.textContent = String((w.data as { value?: string })?.value ?? '');
|
|
455
|
-
},
|
|
456
|
-
});
|
|
457
|
-
const host = document.createElement('div');
|
|
458
|
-
spec.renderCustomNode({ id: 'u' }, host); // mount captures the host
|
|
459
|
-
mount(spec);
|
|
460
|
-
spec.handle.widget('u')!.update({ data: { value: 'two' } });
|
|
461
|
-
expect(host.textContent).toBe('two');
|
|
462
|
-
expect(spec.handle.widget('u')!.spec.data).toEqual({ value: 'two' });
|
|
463
|
-
});
|
|
464
|
-
});
|
|
465
|
-
|
|
466
|
-
// ===========================================================================
|
|
467
|
-
// PHASE 4 — responsive column count and RTL, through the DATA-FIRST API.
|
|
468
|
-
//
|
|
469
|
-
// The engine spec proves the column-change semantics and the cache; these
|
|
470
|
-
// prove the authoring surface actually reaches them, which is the gap that
|
|
471
|
-
// made this phase's work "not only the binder".
|
|
472
|
-
// ===========================================================================
|
|
473
|
-
|
|
474
|
-
const BOARD = () =>
|
|
475
|
-
dashboard({
|
|
476
|
-
columns: 12,
|
|
477
|
-
width: 1200,
|
|
478
|
-
height: 400,
|
|
479
|
-
views: [
|
|
480
|
-
{
|
|
481
|
-
id: 'main',
|
|
482
|
-
widgets: [
|
|
483
|
-
{ id: 'w1', span: 3, rows: 1, x: 0, y: 0 },
|
|
484
|
-
{ id: 'w2', span: 3, rows: 1, x: 3, y: 0 },
|
|
485
|
-
{ id: 'w3', span: 6, rows: 1, x: 6, y: 0 },
|
|
486
|
-
],
|
|
487
|
-
},
|
|
488
|
-
],
|
|
489
|
-
});
|
|
490
|
-
|
|
491
|
-
describe('dashboard() — responsive column count', () => {
|
|
492
|
-
it('setColumns re-lays the board out and metrics report the LIVE count', () => {
|
|
493
|
-
const { handle } = mount(BOARD());
|
|
494
|
-
expect(handle.getColumns()).toBe(12);
|
|
495
|
-
expect(handle.metrics()!.columns).toBe(12);
|
|
496
|
-
handle.setColumns(6);
|
|
497
|
-
expect(handle.getColumns()).toBe(6);
|
|
498
|
-
expect(handle.metrics()!.columns).toBe(6);
|
|
499
|
-
expect(handle.metrics()!.maxColumns).toBe(12); // the authored width is remembered
|
|
500
|
-
for (const w of handle.widgetsOf()) expect(w.cell!.x + w.cell!.w).toBeLessThanOrEqual(6);
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
it('shrinking then growing back restores every cell EXACTLY (the cache)', () => {
|
|
504
|
-
const { handle } = mount(BOARD());
|
|
505
|
-
const before = handle.widgetsOf().map((w) => ({ id: w.id, ...w.cell! }));
|
|
506
|
-
handle.setColumns(1);
|
|
507
|
-
expect(handle.widgetsOf().every((w) => w.cell!.w === 1)).toBe(true);
|
|
508
|
-
handle.setColumns(12);
|
|
509
|
-
expect(handle.widgetsOf().map((w) => ({ id: w.id, ...w.cell! }))).toEqual(before);
|
|
510
|
-
});
|
|
511
|
-
|
|
512
|
-
it('the column change writes cells through, so a refresh() cannot undo it', () => {
|
|
513
|
-
const { handle } = mount(BOARD());
|
|
514
|
-
handle.setColumns(4);
|
|
515
|
-
const narrow = handle.widgetsOf().map((w) => ({ id: w.id, ...w.cell! }));
|
|
516
|
-
handle.refresh(); // rebuilds every engine from the model
|
|
517
|
-
expect(handle.widgetsOf().map((w) => ({ id: w.id, ...w.cell! }))).toEqual(narrow);
|
|
518
|
-
// …and the cache still survived the rebuild, so growing back still restores.
|
|
519
|
-
handle.setColumns(12);
|
|
520
|
-
expect(handle.widgetsOf().find((w) => w.id === 'w3')!.cell!.w).toBe(6);
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
it('a responsive board derives its count from the board width', () => {
|
|
524
|
-
const spec = dashboard({
|
|
525
|
-
columns: 12,
|
|
526
|
-
width: 600,
|
|
527
|
-
height: 300,
|
|
528
|
-
responsive: { columnWidth: 100 },
|
|
529
|
-
widgets: [
|
|
530
|
-
{ id: 'a', span: 3, rows: 1, x: 0, y: 0 },
|
|
531
|
-
{ id: 'b', span: 3, rows: 1, x: 3, y: 0 },
|
|
532
|
-
],
|
|
533
|
-
});
|
|
534
|
-
const { handle } = mount(spec);
|
|
535
|
-
// 600 / 100 = 6 columns, not the declared 12.
|
|
536
|
-
expect(handle.getColumns()).toBe(6);
|
|
537
|
-
expect(handle.metrics()!.responsive).toBe(true);
|
|
538
|
-
});
|
|
539
|
-
|
|
540
|
-
it('breakpoints pick the first step at least as wide as the board', () => {
|
|
541
|
-
const make = (width: number) =>
|
|
542
|
-
mount(
|
|
543
|
-
dashboard({
|
|
544
|
-
columns: 12,
|
|
545
|
-
width,
|
|
546
|
-
height: 300,
|
|
547
|
-
responsive: { breakpoints: [{ w: 500, c: 1 }, { w: 900, c: 6 }] },
|
|
548
|
-
widgets: [{ id: 'a', span: 6, rows: 1, x: 0, y: 0 }],
|
|
549
|
-
})
|
|
550
|
-
).handle;
|
|
551
|
-
expect(make(400).getColumns()).toBe(1); // <= 500
|
|
552
|
-
expect(make(800).getColumns()).toBe(6); // <= 900
|
|
553
|
-
expect(make(1200).getColumns()).toBe(12); // wider than every step -> the max
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
it('an explicit setColumns PINS the count against the width evaluator', () => {
|
|
557
|
-
const { handle } = mount(
|
|
558
|
-
dashboard({
|
|
559
|
-
columns: 12,
|
|
560
|
-
width: 600,
|
|
561
|
-
height: 300,
|
|
562
|
-
responsive: { columnWidth: 100 },
|
|
563
|
-
widgets: [{ id: 'a', span: 3, rows: 1, x: 0, y: 0 }],
|
|
564
|
-
})
|
|
565
|
-
);
|
|
566
|
-
expect(handle.getColumns()).toBe(6);
|
|
567
|
-
handle.setColumns(12);
|
|
568
|
-
expect(handle.getColumns()).toBe(12);
|
|
569
|
-
expect(handle.metrics()!.responsive).toBe(false);
|
|
570
|
-
handle.refresh(); // would re-evaluate width and snap back to 6 if not pinned
|
|
571
|
-
expect(handle.getColumns()).toBe(12);
|
|
572
|
-
});
|
|
573
|
-
|
|
574
|
-
it('SAVING WHILE NARROW saves the wide layout — toJSON keeps the desktop', () => {
|
|
575
|
-
const { handle } = mount(BOARD());
|
|
576
|
-
const wide = handle.toJSON();
|
|
577
|
-
handle.setColumns(1);
|
|
578
|
-
const narrow = handle.toJSON();
|
|
579
|
-
expect(narrow.views[0].columns).toBe(12); // the view records the widest count
|
|
580
|
-
expect(narrow.views[0].widgets.map((w) => [w.x, w.y, w.span])).toEqual(
|
|
581
|
-
wide.views[0].widgets.map((w) => [w.x, w.y, w.span])
|
|
582
|
-
);
|
|
583
|
-
// …while the board on screen really IS one column wide.
|
|
584
|
-
expect(handle.getColumns()).toBe(1);
|
|
585
|
-
expect(handle.widgetsOf().every((w) => w.cell!.w === 1)).toBe(true);
|
|
586
|
-
});
|
|
587
|
-
|
|
588
|
-
it('that saved JSON feeds straight back into dashboard() as the wide board', () => {
|
|
589
|
-
const { handle } = mount(BOARD());
|
|
590
|
-
handle.setColumns(1);
|
|
591
|
-
const saved = handle.toJSON();
|
|
592
|
-
const rebuilt = mount(dashboard({ ...saved, width: 1200, height: 400 }));
|
|
593
|
-
expect(rebuilt.handle.getColumns()).toBe(12);
|
|
594
|
-
expect(rebuilt.handle.widgetsOf().map((w) => ({ id: w.id, ...w.cell! }))).toEqual(
|
|
595
|
-
handle.toJSON().views[0].widgets.map((w) => ({ id: w.id, x: w.x!, y: w.y!, w: w.span!, h: w.rows! }))
|
|
596
|
-
);
|
|
597
|
-
});
|
|
598
|
-
});
|
|
599
|
-
|
|
600
|
-
describe('dashboard() — RTL', () => {
|
|
601
|
-
/** The same three-widget board, declared once, mounted in each direction. */
|
|
602
|
-
const both = () => {
|
|
603
|
-
const ltr = mount(BOARD());
|
|
604
|
-
const rtlSpec = dashboard({
|
|
605
|
-
columns: 12,
|
|
606
|
-
width: 1200,
|
|
607
|
-
height: 400,
|
|
608
|
-
rtl: true,
|
|
609
|
-
views: [
|
|
610
|
-
{
|
|
611
|
-
id: 'main',
|
|
612
|
-
widgets: [
|
|
613
|
-
{ id: 'w1', span: 3, rows: 1, x: 0, y: 0 },
|
|
614
|
-
{ id: 'w2', span: 3, rows: 1, x: 3, y: 0 },
|
|
615
|
-
{ id: 'w3', span: 6, rows: 1, x: 6, y: 0 },
|
|
616
|
-
],
|
|
617
|
-
},
|
|
618
|
-
],
|
|
619
|
-
});
|
|
620
|
-
return { ltr, rtl: mount(rtlSpec) };
|
|
621
|
-
};
|
|
622
|
-
|
|
623
|
-
it('is direction-agnostic in the MODEL: identical cells, mirrored pixels', () => {
|
|
624
|
-
const { ltr, rtl } = both();
|
|
625
|
-
for (const id of ['w1', 'w2', 'w3']) {
|
|
626
|
-
expect(rtl.handle.widget(id)!.cell).toEqual(ltr.handle.widget(id)!.cell);
|
|
627
|
-
}
|
|
628
|
-
// Column 0 is at the LEFT in LTR and at the RIGHT in RTL.
|
|
629
|
-
const l1 = ltr.handle.widget('w1')!.rect!;
|
|
630
|
-
const r1 = rtl.handle.widget('w1')!.rect!;
|
|
631
|
-
expect(r1.width).toBeCloseTo(l1.width, 5);
|
|
632
|
-
expect(r1.y).toBeCloseTo(l1.y, 5);
|
|
633
|
-
expect(r1.x).toBeGreaterThan(l1.x);
|
|
634
|
-
// The mirror identity, on the frame the board actually has.
|
|
635
|
-
const f = rtl.handle.metrics()!.frame;
|
|
636
|
-
expect(f.x + f.width - (r1.x + r1.width)).toBeCloseTo(l1.x - f.x, 4);
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
it('the LAST column renders at the LEFT edge in RTL', () => {
|
|
640
|
-
const { ltr, rtl } = both();
|
|
641
|
-
const l3 = ltr.handle.widget('w3')!.rect!; // x=6, the right half in LTR
|
|
642
|
-
const r3 = rtl.handle.widget('w3')!.rect!;
|
|
643
|
-
expect(r3.x).toBeLessThan(l3.x);
|
|
644
|
-
const f = rtl.handle.metrics()!.frame;
|
|
645
|
-
expect(r3.x - f.x).toBeCloseTo(ltr.handle.metrics()!.frame.width - (l3.x + l3.width), 4);
|
|
646
|
-
});
|
|
647
|
-
|
|
648
|
-
it('a layout SAVED in one direction re-renders mirrored in the other, same cells', () => {
|
|
649
|
-
const { ltr } = both();
|
|
650
|
-
const saved = ltr.handle.toJSON();
|
|
651
|
-
const mirrored = mount(dashboard({ ...saved, width: 1200, height: 400, rtl: true }));
|
|
652
|
-
for (const id of ['w1', 'w2', 'w3']) {
|
|
653
|
-
expect(mirrored.handle.widget(id)!.cell).toEqual(ltr.handle.widget(id)!.cell);
|
|
654
|
-
}
|
|
655
|
-
expect(mirrored.handle.widget('w1')!.rect!.x).toBeGreaterThan(
|
|
656
|
-
ltr.handle.widget('w1')!.rect!.x
|
|
657
|
-
);
|
|
658
|
-
});
|
|
659
|
-
|
|
660
|
-
it('toggles live without touching a single cell', () => {
|
|
661
|
-
const { ltr } = both();
|
|
662
|
-
const cells = ltr.handle.widgetsOf().map((w) => ({ id: w.id, ...w.cell! }));
|
|
663
|
-
const xBefore = ltr.handle.widget('w1')!.rect!.x;
|
|
664
|
-
ltr.handle.setRtl(true);
|
|
665
|
-
expect(ltr.handle.getRtl()).toBe(true);
|
|
666
|
-
expect(ltr.handle.widgetsOf().map((w) => ({ id: w.id, ...w.cell! }))).toEqual(cells);
|
|
667
|
-
expect(ltr.handle.widget('w1')!.rect!.x).toBeGreaterThan(xBefore);
|
|
668
|
-
ltr.handle.setRtl(false);
|
|
669
|
-
expect(ltr.handle.widget('w1')!.rect!.x).toBeCloseTo(xBefore, 4);
|
|
670
|
-
});
|
|
671
|
-
|
|
672
|
-
it('RTL and responsive compose: mirrored AND width-derived at once', () => {
|
|
673
|
-
const { handle } = mount(
|
|
674
|
-
dashboard({
|
|
675
|
-
columns: 12,
|
|
676
|
-
width: 600,
|
|
677
|
-
height: 300,
|
|
678
|
-
rtl: true,
|
|
679
|
-
responsive: { columnWidth: 100 },
|
|
680
|
-
widgets: [
|
|
681
|
-
{ id: 'a', span: 3, rows: 1, x: 0, y: 0 },
|
|
682
|
-
{ id: 'b', span: 3, rows: 1, x: 3, y: 0 },
|
|
683
|
-
],
|
|
684
|
-
})
|
|
685
|
-
);
|
|
686
|
-
expect(handle.getColumns()).toBe(6);
|
|
687
|
-
expect(handle.getRtl()).toBe(true);
|
|
688
|
-
const f = handle.metrics()!.frame;
|
|
689
|
-
const a = handle.widget('a')!.rect!;
|
|
690
|
-
// x=0 still hugs the RIGHT edge, whatever the column count became.
|
|
691
|
-
expect(f.x + f.width - (a.x + a.width)).toBeCloseTo(handle.metrics()!.padding, 4);
|
|
692
|
-
});
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
describe('dashboard() — exporting a TABBED board', () => {
|
|
696
|
-
// THE BUG THIS PINS. Tabs are a kit feature: `showView()` parks the inactive
|
|
697
|
-
// views at OFFSCREEN_X (-20000) so only one is on camera. That is invisible
|
|
698
|
-
// on screen and catastrophic on export — `api.export()` frames the whole
|
|
699
|
-
// MODEL, so a two-view board writes a ~21000px document that is 95% empty,
|
|
700
|
-
// and the developer gets no signal that anything is wrong.
|
|
701
|
-
//
|
|
702
|
-
// The export layer already scopes correctly via `includeIds`; what was
|
|
703
|
-
// missing is any way for the caller to KNOW which ids the visible board is.
|
|
704
|
-
// Reaching for handle.toJSON() and mapping widget ids looks right and is
|
|
705
|
-
// wrong — it misses the group, so the frame goes and the widgets export
|
|
706
|
-
// unparented.
|
|
707
|
-
it('exportIds() names exactly the visible view — group included', () => {
|
|
708
|
-
const { handle } = mount(SIMPLE());
|
|
709
|
-
const ids = handle!.exportIds();
|
|
710
|
-
|
|
711
|
-
// The group is the frame the widgets live in. Omitting it is the mistake a
|
|
712
|
-
// caller rolling their own set would make, so it is asserted first.
|
|
713
|
-
expect(ids.has('overview')).toBe(true);
|
|
714
|
-
for (const w of ['a', 'b', 'c']) expect(ids.has(w)).toBe(true);
|
|
715
|
-
|
|
716
|
-
// And NOTHING from the parked view — this is the half that shrinks the
|
|
717
|
-
// document. A set that simply returned every id would pass the asserts
|
|
718
|
-
// above and fail here.
|
|
719
|
-
expect(ids.has('sales')).toBe(false);
|
|
720
|
-
expect(ids.has('d')).toBe(false);
|
|
721
|
-
expect(ids.size).toBe(4);
|
|
722
|
-
});
|
|
723
|
-
|
|
724
|
-
it('follows the active view, so exporting after a tab switch is correct', () => {
|
|
725
|
-
const { handle } = mount(SIMPLE());
|
|
726
|
-
handle!.showView('sales');
|
|
727
|
-
const ids = handle!.exportIds();
|
|
728
|
-
expect([...ids].sort()).toEqual(['d', 'sales']);
|
|
729
|
-
});
|
|
730
|
-
|
|
731
|
-
it('takes an explicit view id — exporting a tab you are not looking at', () => {
|
|
732
|
-
const { handle } = mount(SIMPLE());
|
|
733
|
-
expect([...handle!.exportIds('sales')].sort()).toEqual(['d', 'sales']);
|
|
734
|
-
expect(handle!.activeView).toBe('overview'); // asking must not switch tabs
|
|
735
|
-
});
|
|
736
|
-
|
|
737
|
-
it('returns an empty set for a view that does not exist', () => {
|
|
738
|
-
const { handle } = mount(SIMPLE());
|
|
739
|
-
expect(handle!.exportIds('nope').size).toBe(0);
|
|
740
|
-
});
|
|
741
|
-
});
|
|
742
|
-
|
|
743
|
-
describe('handle.toJSON() — the round-trip promise, kept', () => {
|
|
744
|
-
// THE BUG. Three places in this repo claim "toJSON() output IS dashboard()
|
|
745
|
-
// input". It was true only of `views`. `DashboardOptions` also carries
|
|
746
|
-
// columns/gap/sizing/rowHeight/width/height/float/rtl/responsive, and every
|
|
747
|
-
// one of them was dropped — so a board authored in `grow` at a 10-column,
|
|
748
|
-
// 6px-gap geometry came back as a 12-column, default-gap `fit` board. It
|
|
749
|
-
// surfaced the moment anyone PERSISTED a board rather than just reading the
|
|
750
|
-
// layout, which is exactly what a save feature does.
|
|
751
|
-
//
|
|
752
|
-
// `toJSON()` is also what `JSON.stringify(handle)` calls. A save API whose
|
|
753
|
-
// stringify silently drops half the configuration is a permanent footgun, so
|
|
754
|
-
// this is fixed at the source rather than by adding a second method beside it.
|
|
755
|
-
const board = () =>
|
|
756
|
-
dashboard({
|
|
757
|
-
columns: 10,
|
|
758
|
-
gap: 6,
|
|
759
|
-
sizing: 'grow',
|
|
760
|
-
rowHeight: 90,
|
|
761
|
-
float: true,
|
|
762
|
-
width: 1111,
|
|
763
|
-
height: 555,
|
|
764
|
-
responsive: { columnWidth: 100 },
|
|
765
|
-
views: [{ id: 'v', name: 'V', widgets: [{ id: 'a', kind: 'kpi', span: 2, rows: 1 }] }],
|
|
766
|
-
});
|
|
767
|
-
|
|
768
|
-
it('carries the board options, not just the views', () => {
|
|
769
|
-
const { handle } = mount(board());
|
|
770
|
-
const saved = handle!.toJSON();
|
|
771
|
-
|
|
772
|
-
expect(saved.gap).toBe(6);
|
|
773
|
-
expect(saved.sizing).toBe('grow');
|
|
774
|
-
expect(saved.rowHeight).toBe(90);
|
|
775
|
-
expect(saved.float).toBe(true);
|
|
776
|
-
// Asserted per-key rather than with one toEqual: a single object compare
|
|
777
|
-
// would let a future field go missing without a word.
|
|
778
|
-
expect(saved.views.map((v) => v.id)).toEqual(['v']);
|
|
779
|
-
});
|
|
780
|
-
|
|
781
|
-
it('carries the options it does NOT name explicitly', () => {
|
|
782
|
-
// WEAK TOOTH, caught by mutation. The test above passes with the `...options`
|
|
783
|
-
// spread DELETED, because gap/sizing/rowHeight/float are all re-stated by
|
|
784
|
-
// name afterwards. Only width, height and responsive arrive purely through
|
|
785
|
-
// the spread — so they are what actually proves it is there, and they are
|
|
786
|
-
// what proves the Omit<> type's promise that a NEW DashboardOptions field
|
|
787
|
-
// joins the snapshot for free instead of being silently dropped.
|
|
788
|
-
const { handle } = mount(board());
|
|
789
|
-
const saved = handle!.toJSON();
|
|
790
|
-
|
|
791
|
-
expect(saved.width).toBe(1111);
|
|
792
|
-
expect(saved.height).toBe(555);
|
|
793
|
-
expect(saved.responsive).toEqual({ columnWidth: 100 });
|
|
794
|
-
});
|
|
795
|
-
|
|
796
|
-
it('reports the LIVE geometry, not the authored literal', () => {
|
|
797
|
-
// The whole point is restoring what the user is looking at. Reading the
|
|
798
|
-
// options back off the spec would pass the test above and still lose every
|
|
799
|
-
// change the user made after mount.
|
|
800
|
-
const { handle } = mount(board());
|
|
801
|
-
handle!.setSizing('fit');
|
|
802
|
-
handle!.setFloat(false);
|
|
803
|
-
|
|
804
|
-
const saved = handle!.toJSON();
|
|
805
|
-
expect(saved.sizing).toBe('fit');
|
|
806
|
-
expect(saved.float).toBe(false);
|
|
807
|
-
});
|
|
808
|
-
|
|
809
|
-
it('feeds straight back into dashboard() — the documented claim', () => {
|
|
810
|
-
const { handle } = mount(board());
|
|
811
|
-
handle!.setSizing('fit');
|
|
812
|
-
|
|
813
|
-
const rebuilt = mount(dashboard(handle!.toJSON()));
|
|
814
|
-
const again = rebuilt.handle!.toJSON();
|
|
815
|
-
|
|
816
|
-
expect(again.sizing).toBe('fit');
|
|
817
|
-
expect(again.gap).toBe(6);
|
|
818
|
-
expect(again.rowHeight).toBe(90);
|
|
819
|
-
expect(again.views[0].widgets.map((w) => w.id)).toEqual(['a']);
|
|
820
|
-
});
|
|
821
|
-
});
|