@flanksource/clicky-ui 0.3.40 → 0.3.42
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/README.md +24 -0
- package/dist/ai.cjs +14 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +14 -0
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.cjs +3 -1
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +4 -2
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +16 -0
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts +4 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +16 -0
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +4 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/components/AccordionList.cjs +5 -1
- package/dist/components/AccordionList.cjs.map +1 -1
- package/dist/components/AccordionList.d.ts +3 -1
- package/dist/components/AccordionList.d.ts.map +1 -1
- package/dist/components/AccordionList.js +5 -1
- package/dist/components/AccordionList.js.map +1 -1
- package/dist/components/Combobox.cjs +54 -8
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +56 -10
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxMenu.cjs +139 -113
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts +3 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +139 -113
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxMenuTrigger.cjs +87 -0
- package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
- package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
- package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
- package/dist/components/ComboboxMenuTrigger.js +87 -0
- package/dist/components/ComboboxMenuTrigger.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +39 -11
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +38 -10
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SegmentedControl.cjs +20 -3
- package/dist/components/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl.d.ts +11 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl.js +21 -4
- package/dist/components/SegmentedControl.js.map +1 -1
- package/dist/components/combobox-types.d.ts +8 -0
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +3 -1
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
- package/dist/components/json-schema-form-accordion-array.d.ts +4 -1
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.js +3 -1
- package/dist/components/json-schema-form-accordion-array.js.map +1 -1
- package/dist/components/json-schema-form-array-view.cjs +63 -0
- package/dist/components/json-schema-form-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-array-view.d.ts +21 -0
- package/dist/components/json-schema-form-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-array-view.js +63 -0
- package/dist/components/json-schema-form-array-view.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +3 -7
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-conditionals.cjs +67 -0
- package/dist/components/json-schema-form-conditionals.cjs.map +1 -0
- package/dist/components/json-schema-form-conditionals.d.ts +9 -0
- package/dist/components/json-schema-form-conditionals.d.ts.map +1 -0
- package/dist/components/json-schema-form-conditionals.js +67 -0
- package/dist/components/json-schema-form-conditionals.js.map +1 -0
- package/dist/components/json-schema-form-debug-badge.cjs +108 -0
- package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
- package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-badge.js +108 -0
- package/dist/components/json-schema-form-debug-badge.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
- package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
- package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-glyph.js +13 -0
- package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
- package/dist/components/json-schema-form-debug-groups.cjs +56 -0
- package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
- package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-groups.js +56 -0
- package/dist/components/json-schema-form-debug-groups.js.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
- package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
- package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-keywords.js +159 -0
- package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
- package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
- package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug-listeners.js +102 -0
- package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
- package/dist/components/json-schema-form-debug.cjs +31 -0
- package/dist/components/json-schema-form-debug.cjs.map +1 -0
- package/dist/components/json-schema-form-debug.d.ts +11 -0
- package/dist/components/json-schema-form-debug.d.ts.map +1 -0
- package/dist/components/json-schema-form-debug.js +31 -0
- package/dist/components/json-schema-form-debug.js.map +1 -0
- package/dist/components/json-schema-form-defaults.cjs +68 -0
- package/dist/components/json-schema-form-defaults.cjs.map +1 -0
- package/dist/components/json-schema-form-defaults.d.ts +4 -0
- package/dist/components/json-schema-form-defaults.d.ts.map +1 -0
- package/dist/components/json-schema-form-defaults.js +68 -0
- package/dist/components/json-schema-form-defaults.js.map +1 -0
- package/dist/components/json-schema-form-enum-choice.cjs +114 -0
- package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
- package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
- package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
- package/dist/components/json-schema-form-enum-choice.js +114 -0
- package/dist/components/json-schema-form-enum-choice.js.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +49 -31
- package/dist/components/json-schema-form-errors.cjs.map +1 -1
- package/dist/components/json-schema-form-errors.d.ts +4 -2
- package/dist/components/json-schema-form-errors.d.ts.map +1 -1
- package/dist/components/json-schema-form-errors.js +51 -33
- package/dist/components/json-schema-form-errors.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +3 -93
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +1 -91
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-filter.cjs +2 -1
- package/dist/components/json-schema-form-filter.cjs.map +1 -1
- package/dist/components/json-schema-form-filter.js +2 -1
- package/dist/components/json-schema-form-filter.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -2
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -2
- package/dist/components/json-schema-form-item-summary.js.map +1 -1
- package/dist/components/json-schema-form-layout.cjs +28 -19
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +8 -6
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +29 -20
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-listener-paths.cjs +52 -0
- package/dist/components/json-schema-form-listener-paths.cjs.map +1 -0
- package/dist/components/json-schema-form-listener-paths.d.ts +10 -0
- package/dist/components/json-schema-form-listener-paths.d.ts.map +1 -0
- package/dist/components/json-schema-form-listener-paths.js +52 -0
- package/dist/components/json-schema-form-listener-paths.js.map +1 -0
- package/dist/components/json-schema-form-listener-types.d.ts +22 -0
- package/dist/components/json-schema-form-listener-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.cjs +256 -0
- package/dist/components/json-schema-form-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-listeners.d.ts +13 -0
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.js +256 -0
- package/dist/components/json-schema-form-listeners.js.map +1 -0
- package/dist/components/json-schema-form-object-array-view.cjs +62 -0
- package/dist/components/json-schema-form-object-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-object-array-view.d.ts +14 -0
- package/dist/components/json-schema-form-object-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-object-array-view.js +62 -0
- package/dist/components/json-schema-form-object-array-view.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +3 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +3 -0
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +36 -12
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +38 -14
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +6 -99
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -8
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +5 -98
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +16 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +67 -16
- package/dist/components/json-schema-form-table-array.cjs.map +1 -1
- package/dist/components/json-schema-form-table-array.d.ts +4 -1
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.js +70 -19
- package/dist/components/json-schema-form-table-array.js.map +1 -1
- package/dist/components/json-schema-form-tone.cjs +12 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -1
- package/dist/components/json-schema-form-tone.js +12 -0
- package/dist/components/json-schema-form-tone.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +17 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +7 -1
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +2 -1
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +7 -1
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components.cjs +3 -2
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +3 -2
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +2 -1
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +9 -3
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +6 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +9 -3
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.cjs +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.cjs.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.d.ts.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.js +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.js.map +1 -1
- package/dist/data/GraphDiagram.cjs +125 -138
- package/dist/data/GraphDiagram.cjs.map +1 -1
- package/dist/data/GraphDiagram.d.ts +30 -23
- package/dist/data/GraphDiagram.d.ts.map +1 -1
- package/dist/data/GraphDiagram.js +128 -141
- package/dist/data/GraphDiagram.js.map +1 -1
- package/dist/data/GraphDiagramEdges.cjs +208 -0
- package/dist/data/GraphDiagramEdges.cjs.map +1 -0
- package/dist/data/GraphDiagramEdges.d.ts +40 -0
- package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
- package/dist/data/GraphDiagramEdges.js +208 -0
- package/dist/data/GraphDiagramEdges.js.map +1 -0
- package/dist/data/GraphDiagramNodes.cjs +142 -0
- package/dist/data/GraphDiagramNodes.cjs.map +1 -0
- package/dist/data/GraphDiagramNodes.d.ts +22 -0
- package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
- package/dist/data/GraphDiagramNodes.js +142 -0
- package/dist/data/GraphDiagramNodes.js.map +1 -0
- package/dist/data/Tree.cjs +10 -2
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +6 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +10 -2
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
- package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +38 -44
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
- package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
- package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
- package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
- package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.approvals.js +26 -2
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +143 -167
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +5 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.cjs +18 -5
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection.d.ts +2 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts +6 -0
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +18 -5
- package/dist/data/ai/SessionInspector.collection.js.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +24 -2
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +105 -7
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +12 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.js +107 -9
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.js +144 -168
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +116 -0
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts +19 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.js +116 -0
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +3 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +3 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionInspector.plan.cjs +29 -12
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.plan.js +30 -13
- package/dist/data/ai/SessionInspector.plan.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +44 -0
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts +11 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.js +44 -0
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -0
- package/dist/data/ai/SessionInspector.remote.cjs +275 -0
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote.d.ts +57 -0
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote.js +275 -0
- package/dist/data/ai/SessionInspector.remote.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +9 -159
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts +0 -3
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +11 -161
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.tab-state.cjs +15 -0
- package/dist/data/ai/SessionInspector.tab-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts +3 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.js +15 -0
- package/dist/data/ai/SessionInspector.tab-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.tabs.model.cjs +31 -18
- package/dist/data/ai/SessionInspector.tabs.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts +3 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.js +32 -19
- package/dist/data/ai/SessionInspector.tabs.model.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +4 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionInspector.verification.cjs +53 -0
- package/dist/data/ai/SessionInspector.verification.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.verification.d.ts +7 -0
- package/dist/data/ai/SessionInspector.verification.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.verification.js +53 -0
- package/dist/data/ai/SessionInspector.verification.js.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
- package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
- package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-body.js +146 -0
- package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
- package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
- package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +57 -20
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +13 -3
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
- package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
- package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
- package/dist/data/ai/SessionViewer.decision.cjs +21 -0
- package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
- package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.decision.js +21 -0
- package/dist/data/ai/SessionViewer.decision.js.map +1 -0
- package/dist/data/ai/SessionViewer.input.cjs +14 -0
- package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.input.d.ts +5 -0
- package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.input.js +14 -0
- package/dist/data/ai/SessionViewer.input.js.map +1 -1
- package/dist/data/ai/SessionViewer.js +58 -21
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +7 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +25 -3
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +7 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +6 -3
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +6 -3
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.tool-row.js +27 -235
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +17 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.cjs +8 -2
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
- package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
- package/dist/data/ai/SessionViewerMenu.js +8 -2
- package/dist/data/ai/SessionViewerMenu.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/approval-request.cjs +75 -0
- package/dist/data/ai/approval-request.cjs.map +1 -0
- package/dist/data/ai/approval-request.d.ts +155 -0
- package/dist/data/ai/approval-request.d.ts.map +1 -0
- package/dist/data/ai/approval-request.js +75 -0
- package/dist/data/ai/approval-request.js.map +1 -0
- package/dist/data/ai/index.d.ts +6 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
- package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
- package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
- package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
- package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/model.js +73 -0
- package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
- package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
- package/dist/data/ai/runtime-spec-fields.cjs +166 -0
- package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
- package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
- package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
- package/dist/data/ai/runtime-spec-fields.js +166 -0
- package/dist/data/ai/runtime-spec-fields.js.map +1 -0
- package/dist/data/ai/session-categories.cjs +4 -0
- package/dist/data/ai/session-categories.cjs.map +1 -1
- package/dist/data/ai/session-categories.d.ts +1 -0
- package/dist/data/ai/session-categories.d.ts.map +1 -1
- package/dist/data/ai/session-categories.js +4 -0
- package/dist/data/ai/session-categories.js.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +49 -21
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +2 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +49 -21
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +1 -1
- package/dist/data/chat/Chat.runtime.cjs.map +1 -1
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
- package/dist/data/chat/Chat.runtime.js +1 -1
- package/dist/data/chat/Chat.runtime.js.map +1 -1
- package/dist/data/graph-columns-layout.cjs +216 -0
- package/dist/data/graph-columns-layout.cjs.map +1 -0
- package/dist/data/graph-columns-layout.d.ts +56 -0
- package/dist/data/graph-columns-layout.d.ts.map +1 -0
- package/dist/data/graph-columns-layout.js +216 -0
- package/dist/data/graph-columns-layout.js.map +1 -0
- package/dist/data/graph-diagram-model.cjs +73 -0
- package/dist/data/graph-diagram-model.cjs.map +1 -0
- package/dist/data/graph-diagram-model.d.ts +90 -0
- package/dist/data/graph-diagram-model.d.ts.map +1 -0
- package/dist/data/graph-diagram-model.js +73 -0
- package/dist/data/graph-diagram-model.js.map +1 -0
- package/dist/data/graph-edge-routing.cjs +235 -0
- package/dist/data/graph-edge-routing.cjs.map +1 -0
- package/dist/data/graph-edge-routing.d.ts +73 -0
- package/dist/data/graph-edge-routing.d.ts.map +1 -0
- package/dist/data/graph-edge-routing.js +235 -0
- package/dist/data/graph-edge-routing.js.map +1 -0
- package/dist/data/graph-layout.cjs +0 -82
- package/dist/data/graph-layout.cjs.map +1 -1
- package/dist/data/graph-layout.d.ts +1 -28
- package/dist/data/graph-layout.d.ts.map +1 -1
- package/dist/data/graph-layout.js +1 -83
- package/dist/data/graph-layout.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +129 -33
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +13 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +130 -34
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/har/fixtures.d.ts +12 -0
- package/dist/data/har/fixtures.d.ts.map +1 -1
- package/dist/data/har/types.d.ts +12 -0
- package/dist/data/har/types.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +67 -84
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +4 -5
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
- package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
- package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.fields.js +170 -0
- package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +70 -87
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
- package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
- package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.selection.js +56 -0
- package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
- package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
- package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
- package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarActions.js +10 -6
- package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
- package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
- package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
- package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
- package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarLayout.js +95 -0
- package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
- package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
- package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
- package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegment.js +25 -14
- package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
- package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
- package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
- package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeLimitInput.js +41 -0
- package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
- package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
- package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
- package/dist/data/use-edge-focus.cjs +20 -0
- package/dist/data/use-edge-focus.cjs.map +1 -0
- package/dist/data/use-edge-focus.d.ts +23 -0
- package/dist/data/use-edge-focus.d.ts.map +1 -0
- package/dist/data/use-edge-focus.js +20 -0
- package/dist/data/use-edge-focus.js.map +1 -0
- package/dist/data/use-pan-zoom.cjs +159 -0
- package/dist/data/use-pan-zoom.cjs.map +1 -0
- package/dist/data/use-pan-zoom.d.ts +79 -0
- package/dist/data/use-pan-zoom.d.ts.map +1 -0
- package/dist/data/use-pan-zoom.js +159 -0
- package/dist/data/use-pan-zoom.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +5 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -3
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +6 -2
- package/dist/data.js.map +1 -1
- package/dist/devtools/useDebugStream.cjs +5 -1
- package/dist/devtools/useDebugStream.cjs.map +1 -1
- package/dist/devtools/useDebugStream.d.ts.map +1 -1
- package/dist/devtools/useDebugStream.js +6 -2
- package/dist/devtools/useDebugStream.js.map +1 -1
- package/dist/hooks/event-source-provider.cjs +9 -0
- package/dist/hooks/event-source-provider.cjs.map +1 -0
- package/dist/hooks/event-source-provider.d.ts +15 -0
- package/dist/hooks/event-source-provider.d.ts.map +1 -0
- package/dist/hooks/event-source-provider.js +9 -0
- package/dist/hooks/event-source-provider.js.map +1 -0
- package/dist/hooks/event-source.cjs +11 -0
- package/dist/hooks/event-source.cjs.map +1 -0
- package/dist/hooks/event-source.d.ts +22 -0
- package/dist/hooks/event-source.d.ts.map +1 -0
- package/dist/hooks/event-source.js +11 -0
- package/dist/hooks/event-source.js.map +1 -0
- package/dist/hooks/use-log-tail.cjs +5 -1
- package/dist/hooks/use-log-tail.cjs.map +1 -1
- package/dist/hooks/use-log-tail.d.ts.map +1 -1
- package/dist/hooks/use-log-tail.js +5 -1
- package/dist/hooks/use-log-tail.js.map +1 -1
- package/dist/hooks/use-prompts.cjs +5 -1
- package/dist/hooks/use-prompts.cjs.map +1 -1
- package/dist/hooks/use-prompts.d.ts.map +1 -1
- package/dist/hooks/use-prompts.js +6 -2
- package/dist/hooks/use-prompts.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +9 -2
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +10 -3
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/programmingCatalog.cjs +34 -34
- package/dist/icons/programmingCatalog.cjs.map +1 -1
- package/dist/icons/programmingCatalog.js +34 -34
- package/dist/icons/programmingCatalog.js.map +1 -1
- package/dist/index.cjs +14 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/monaco/MonacoEditor.cjs +4 -1
- package/dist/monaco/MonacoEditor.cjs.map +1 -1
- package/dist/monaco/MonacoEditor.d.ts +1 -1
- package/dist/monaco/MonacoEditor.d.ts.map +1 -1
- package/dist/monaco/MonacoEditor.js +4 -1
- package/dist/monaco/MonacoEditor.js.map +1 -1
- package/dist/monaco/types.d.ts +2 -1
- package/dist/monaco/types.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.cjs +14 -4
- package/dist/overlay/CommandPalette.cjs.map +1 -1
- package/dist/overlay/CommandPalette.d.ts +5 -1
- package/dist/overlay/CommandPalette.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.js +14 -4
- package/dist/overlay/CommandPalette.js.map +1 -1
- package/dist/overlay/CommandPaletteList.cjs +5 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -1
- package/dist/overlay/CommandPaletteList.d.ts +4 -2
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -1
- package/dist/overlay/CommandPaletteList.js +5 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +2 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +4 -0
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +2 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +31 -15
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +32 -27
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +11 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +32 -27
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.cjs +62 -256
- package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.js +64 -258
- package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
- package/dist/rpc/OperationEntityPicker.cjs +185 -0
- package/dist/rpc/OperationEntityPicker.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.d.ts +51 -0
- package/dist/rpc/OperationEntityPicker.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.js +185 -0
- package/dist/rpc/OperationEntityPicker.js.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.cjs +39 -0
- package/dist/rpc/OperationEntityPicker.model.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts +27 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.js +39 -0
- package/dist/rpc/OperationEntityPicker.model.js.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.cjs +85 -0
- package/dist/rpc/operationCatalogRowSelection.cjs.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts +57 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.js +85 -0
- package/dist/rpc/operationCatalogRowSelection.js.map +1 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts +13 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts.map +1 -0
- package/dist/rpc/useOperationPages.cjs +6 -1
- package/dist/rpc/useOperationPages.cjs.map +1 -1
- package/dist/rpc/useOperationPages.d.ts +3 -1
- package/dist/rpc/useOperationPages.d.ts.map +1 -1
- package/dist/rpc/useOperationPages.js +6 -1
- package/dist/rpc/useOperationPages.js.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -1
- package/schemas/json-schema-form.schema.json +571 -0
- package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarCombo.js +0 -423
- package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
- package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
- package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarLimits.js +0 -262
- package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
- package/dist/data/runtime/RuntimeBarSegments.js +0 -346
- package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const graphEdgeRouting = require("./graph-edge-routing.cjs");
|
|
4
|
+
const DEFAULT_NODE_WIDTH = 168;
|
|
5
|
+
const DEFAULT_NODE_HEIGHT = 60;
|
|
6
|
+
const DEFAULT_COLUMN_GAP = 96;
|
|
7
|
+
const DEFAULT_ROW_GAP = 20;
|
|
8
|
+
const DEFAULT_GROUP_PADDING = 12;
|
|
9
|
+
const DEFAULT_PADDING = 24;
|
|
10
|
+
const DEFAULT_SWEEPS = 4;
|
|
11
|
+
function mustGet(map, key, what) {
|
|
12
|
+
const value = map.get(key);
|
|
13
|
+
if (value === void 0) {
|
|
14
|
+
throw new Error(`columnsLayout: no ${what} for "${String(key)}"`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function columnMetrics(options) {
|
|
19
|
+
return {
|
|
20
|
+
nodeWidth: options.nodeWidth ?? DEFAULT_NODE_WIDTH,
|
|
21
|
+
nodeHeight: options.nodeHeight ?? DEFAULT_NODE_HEIGHT,
|
|
22
|
+
columnGap: options.columnGap ?? DEFAULT_COLUMN_GAP,
|
|
23
|
+
rowGap: options.rowGap ?? DEFAULT_ROW_GAP,
|
|
24
|
+
groupPadding: options.groupPadding ?? DEFAULT_GROUP_PADDING,
|
|
25
|
+
padding: options.padding ?? DEFAULT_PADDING,
|
|
26
|
+
sweeps: options.sweeps ?? DEFAULT_SWEEPS
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function indexColumns(nodes) {
|
|
30
|
+
const columns = /* @__PURE__ */ new Map();
|
|
31
|
+
const groupRank = /* @__PURE__ */ new Map();
|
|
32
|
+
for (const node of nodes) {
|
|
33
|
+
if (!Number.isFinite(node.level)) {
|
|
34
|
+
throw new Error(`columnsLayout: node "${node.id}" has no finite level (got ${node.level})`);
|
|
35
|
+
}
|
|
36
|
+
if (!groupRank.has(node.group)) groupRank.set(node.group, groupRank.size);
|
|
37
|
+
const column = columns.get(node.level);
|
|
38
|
+
if (column) {
|
|
39
|
+
column.push(node);
|
|
40
|
+
} else {
|
|
41
|
+
columns.set(node.level, [node]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { columns, groupRank };
|
|
45
|
+
}
|
|
46
|
+
function indexNeighbours(nodes, edges) {
|
|
47
|
+
const neighbours = new Map(nodes.map((node) => [node.id, []]));
|
|
48
|
+
for (const edge of edges) {
|
|
49
|
+
const from = neighbours.get(edge.from);
|
|
50
|
+
const to = neighbours.get(edge.to);
|
|
51
|
+
if (!from || !to) {
|
|
52
|
+
const missing = from ? edge.to : edge.from;
|
|
53
|
+
throw new Error(`columnsLayout: edge "${edge.id}" references unknown node "${missing}"`);
|
|
54
|
+
}
|
|
55
|
+
from.push(edge.to);
|
|
56
|
+
to.push(edge.from);
|
|
57
|
+
}
|
|
58
|
+
return neighbours;
|
|
59
|
+
}
|
|
60
|
+
function columnHeight(column, m) {
|
|
61
|
+
const groups = new Set(column.map((node) => node.group));
|
|
62
|
+
groups.delete(void 0);
|
|
63
|
+
return column.length * m.nodeHeight + (column.length - 1) * m.rowGap + 2 * m.groupPadding * groups.size;
|
|
64
|
+
}
|
|
65
|
+
function orderColumn(column, groupRank, weight) {
|
|
66
|
+
const runs = /* @__PURE__ */ new Map();
|
|
67
|
+
column.forEach((node, index) => {
|
|
68
|
+
const rank = mustGet(groupRank, node.group, "group rank");
|
|
69
|
+
const entry = { node, index, weight: weight(node) };
|
|
70
|
+
const run = runs.get(rank);
|
|
71
|
+
if (run) {
|
|
72
|
+
run.push(entry);
|
|
73
|
+
} else {
|
|
74
|
+
runs.set(rank, [entry]);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return [...runs.entries()].sort(([a], [b]) => a - b).map(([, run]) => {
|
|
78
|
+
var _a;
|
|
79
|
+
const nodes = run.sort((a, b) => a.weight - b.weight || a.index - b.index).map((entry) => entry.node);
|
|
80
|
+
return { group: (_a = nodes[0]) == null ? void 0 : _a.group, nodes };
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function stackColumn(runs, origin, m, placed) {
|
|
84
|
+
const boxes = [];
|
|
85
|
+
let cursor = origin.top;
|
|
86
|
+
for (const { group, nodes } of runs) {
|
|
87
|
+
const pad = group === void 0 ? 0 : m.groupPadding;
|
|
88
|
+
const height = nodes.length * m.nodeHeight + (nodes.length - 1) * m.rowGap + 2 * pad;
|
|
89
|
+
nodes.forEach((node, index) => {
|
|
90
|
+
const top = cursor + pad + index * (m.nodeHeight + m.rowGap);
|
|
91
|
+
placed.set(node.id, { x: origin.x, y: top + m.nodeHeight / 2 });
|
|
92
|
+
});
|
|
93
|
+
if (group !== void 0) {
|
|
94
|
+
boxes.push({
|
|
95
|
+
id: `${origin.level}:${group}`,
|
|
96
|
+
group,
|
|
97
|
+
level: origin.level,
|
|
98
|
+
x: origin.x - m.nodeWidth / 2 - pad,
|
|
99
|
+
y: cursor,
|
|
100
|
+
width: m.nodeWidth + 2 * pad,
|
|
101
|
+
height
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
cursor += height + m.rowGap;
|
|
105
|
+
}
|
|
106
|
+
return boxes;
|
|
107
|
+
}
|
|
108
|
+
function meanY(ids, placed) {
|
|
109
|
+
if (ids.length === 0) return Number.POSITIVE_INFINITY;
|
|
110
|
+
return ids.reduce((sum, id) => sum + mustGet(placed, id, "position").y, 0) / ids.length;
|
|
111
|
+
}
|
|
112
|
+
function placementOrder(levels) {
|
|
113
|
+
const anchor = levels.reduce((best, level) => Math.abs(level) < Math.abs(best) ? level : best);
|
|
114
|
+
const outward = (side) => side.map((level, index) => [level, side[index - 1] ?? anchor]);
|
|
115
|
+
return [
|
|
116
|
+
[anchor, void 0],
|
|
117
|
+
...outward(levels.filter((level) => level > anchor)),
|
|
118
|
+
...outward(levels.filter((level) => level < anchor).reverse())
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
function placeColumn(level, references, ctx, into) {
|
|
122
|
+
const runs = orderColumn(
|
|
123
|
+
mustGet(into.order, level, "column"),
|
|
124
|
+
ctx.groupRank,
|
|
125
|
+
(node) => meanY(
|
|
126
|
+
mustGet(ctx.neighbours, node.id, "neighbours").filter(
|
|
127
|
+
(id) => references.includes(mustGet(ctx.levelOf, id, "level"))
|
|
128
|
+
),
|
|
129
|
+
into.placed
|
|
130
|
+
)
|
|
131
|
+
);
|
|
132
|
+
into.order.set(
|
|
133
|
+
level,
|
|
134
|
+
runs.flatMap((run) => run.nodes)
|
|
135
|
+
);
|
|
136
|
+
into.boxes.set(level, stackColumn(runs, ctx.origin(level), ctx.m, into.placed));
|
|
137
|
+
}
|
|
138
|
+
function countCrossings(ctx, placed) {
|
|
139
|
+
const spans = /* @__PURE__ */ new Map();
|
|
140
|
+
for (const edge of ctx.edges) {
|
|
141
|
+
const levels = [mustGet(ctx.levelOf, edge.from, "level"), mustGet(ctx.levelOf, edge.to, "level")];
|
|
142
|
+
const [lower, upper] = levels[0] < levels[1] ? [edge.from, edge.to] : [edge.to, edge.from];
|
|
143
|
+
const index = ctx.levels.indexOf(Math.min(...levels));
|
|
144
|
+
if (levels[0] === levels[1] || ctx.levels[index + 1] !== Math.max(...levels)) continue;
|
|
145
|
+
const span = [mustGet(placed, lower, "position").y, mustGet(placed, upper, "position").y];
|
|
146
|
+
spans.set(index, [...spans.get(index) ?? [], span]);
|
|
147
|
+
}
|
|
148
|
+
let crossings = 0;
|
|
149
|
+
for (const gap of spans.values()) {
|
|
150
|
+
gap.forEach((a, index) => {
|
|
151
|
+
crossings += gap.slice(index + 1).filter((b) => (a[0] - b[0]) * (a[1] - b[1]) < 0).length;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return crossings;
|
|
155
|
+
}
|
|
156
|
+
function sweep(from, sequence, ctx) {
|
|
157
|
+
const next = { order: new Map(from.order), placed: new Map(from.placed), boxes: new Map(from.boxes) };
|
|
158
|
+
for (const level of sequence) {
|
|
159
|
+
const index = ctx.levels.indexOf(level);
|
|
160
|
+
const adjacent = [ctx.levels[index - 1], ctx.levels[index + 1]].filter((other) => other !== void 0);
|
|
161
|
+
placeColumn(level, adjacent, ctx, next);
|
|
162
|
+
}
|
|
163
|
+
return next;
|
|
164
|
+
}
|
|
165
|
+
function arrange(columns, ctx) {
|
|
166
|
+
let current = { order: new Map(columns), placed: /* @__PURE__ */ new Map(), boxes: /* @__PURE__ */ new Map() };
|
|
167
|
+
for (const [level, reference] of placementOrder(ctx.levels)) {
|
|
168
|
+
placeColumn(level, reference === void 0 ? [] : [reference], ctx, current);
|
|
169
|
+
}
|
|
170
|
+
let best = current;
|
|
171
|
+
let fewest = countCrossings(ctx, best.placed);
|
|
172
|
+
for (let pass = 0; pass < ctx.m.sweeps && fewest > 0; pass++) {
|
|
173
|
+
current = sweep(current, pass % 2 === 0 ? [...ctx.levels].reverse() : ctx.levels, ctx);
|
|
174
|
+
const crossings = countCrossings(ctx, current.placed);
|
|
175
|
+
if (crossings < fewest) {
|
|
176
|
+
best = current;
|
|
177
|
+
fewest = crossings;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return best;
|
|
181
|
+
}
|
|
182
|
+
function columnsLayout(nodes, edges, options = {}) {
|
|
183
|
+
const m = columnMetrics(options);
|
|
184
|
+
const { columns, groupRank } = indexColumns(nodes);
|
|
185
|
+
const neighbours = indexNeighbours(nodes, edges);
|
|
186
|
+
const levels = [...columns.keys()].sort((a, b) => a - b);
|
|
187
|
+
if (levels.length === 0) {
|
|
188
|
+
return { width: 2 * m.padding, height: 2 * m.padding, positions: {}, groups: [] };
|
|
189
|
+
}
|
|
190
|
+
const minLevel = Math.min(...levels);
|
|
191
|
+
const tallest = Math.max(...[...columns.values()].map((column) => columnHeight(column, m)));
|
|
192
|
+
const inset = m.padding + (nodes.some((node) => node.group !== void 0) ? m.groupPadding : 0);
|
|
193
|
+
const { placed, boxes } = arrange(columns, {
|
|
194
|
+
m,
|
|
195
|
+
levels,
|
|
196
|
+
levelOf: new Map(nodes.map((node) => [node.id, node.level])),
|
|
197
|
+
groupRank,
|
|
198
|
+
neighbours,
|
|
199
|
+
edges,
|
|
200
|
+
origin: (level) => ({
|
|
201
|
+
x: inset + m.nodeWidth / 2 + (level - minLevel) * (m.nodeWidth + m.columnGap),
|
|
202
|
+
top: m.padding + (tallest - columnHeight(mustGet(columns, level, "column"), m)) / 2,
|
|
203
|
+
level
|
|
204
|
+
})
|
|
205
|
+
});
|
|
206
|
+
const room = graphEdgeRouting.loopOverhang(edges, Object.fromEntries(placed), m);
|
|
207
|
+
const span = (Math.max(...levels) - minLevel) * (m.nodeWidth + m.columnGap) + m.nodeWidth;
|
|
208
|
+
return {
|
|
209
|
+
width: room.left + 2 * inset + span + room.right,
|
|
210
|
+
height: tallest + 2 * m.padding,
|
|
211
|
+
positions: Object.fromEntries([...placed].map(([id, { x, y }]) => [id, { x: x + room.left, y }])),
|
|
212
|
+
groups: [...boxes.values()].flat().map((box) => ({ ...box, x: box.x + room.left })).sort((a, b) => a.level - b.level || a.y - b.y)
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
exports.columnsLayout = columnsLayout;
|
|
216
|
+
//# sourceMappingURL=graph-columns-layout.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-columns-layout.cjs","sources":["../../src/data/graph-columns-layout.ts"],"sourcesContent":["// Level-column layout for GraphDiagram: pure math, no React. Split from\n// graph-layout.ts, which owns the shared types and `ringLayout`.\n\nimport { loopOverhang } from \"./graph-edge-routing\";\nimport type { GraphLayoutEdge, GraphLayoutNode, GraphLayoutPosition, GraphLayoutResult } from \"./graph-layout\";\n\nexport interface ColumnsLayoutNode extends GraphLayoutNode {\n /** Column of the node. May be negative: the lowest level is the first column. */\n level: number;\n /** Nodes sharing a group stay contiguous within their column and are boxed together. */\n group?: string;\n}\n\nexport interface ColumnsLayoutOptions {\n /** Node bounding-box width in px. Defaults to 168. */\n nodeWidth?: number;\n /** Node bounding-box height in px. Defaults to 60. */\n nodeHeight?: number;\n /** Horizontal gap between the node boxes of adjacent columns in px. Defaults to 96. */\n columnGap?: number;\n /** Vertical gap between stacked nodes, and between group rectangles, in px. Defaults to 20. */\n rowGap?: number;\n /** Space between a group's nodes and its rectangle in px. Defaults to 12. */\n groupPadding?: number;\n /** Space reserved around the columns before the viewport edge. Defaults to 24. */\n padding?: number;\n /**\n * Re-ordering passes over all columns after the first placement, alternating direction; a pass\n * is kept only if it leaves fewer crossings. Defaults to 4. 0 keeps the first placement.\n */\n sweeps?: number;\n}\n\nexport interface GraphLayoutGroupBox {\n /** `${level}:${group}` — a group spanning several columns gets one rectangle per column. */\n id: string;\n group: string;\n level: number;\n /** Top-left corner, in the same coordinate space as the layout's `width`/`height`. */\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ColumnsLayoutResult extends GraphLayoutResult {\n groups: GraphLayoutGroupBox[];\n}\n\ntype ColumnMetrics = Required<ColumnsLayoutOptions>;\n\ninterface GroupRun {\n group: string | undefined;\n nodes: ColumnsLayoutNode[];\n}\n\n/** One ordering of every column, stacked: the node centres and group rectangles it gives. */\ninterface Arrangement {\n order: Map<number, ColumnsLayoutNode[]>;\n placed: Map<string, GraphLayoutPosition>;\n boxes: Map<number, GraphLayoutGroupBox[]>;\n}\n\n/** What stays fixed while columns are re-ordered. */\ninterface ColumnsContext {\n m: ColumnMetrics;\n levels: number[];\n levelOf: Map<string, number>;\n groupRank: Map<string | undefined, number>;\n neighbours: Map<string, string[]>;\n edges: readonly GraphLayoutEdge[];\n /** Centre x and top y of a level's column. */\n origin: (level: number) => { x: number; top: number; level: number };\n}\n\nconst DEFAULT_NODE_WIDTH = 168;\nconst DEFAULT_NODE_HEIGHT = 60;\nconst DEFAULT_COLUMN_GAP = 96;\nconst DEFAULT_ROW_GAP = 20;\nconst DEFAULT_GROUP_PADDING = 12;\nconst DEFAULT_PADDING = 24;\nconst DEFAULT_SWEEPS = 4;\n\nfunction mustGet<K, V>(map: ReadonlyMap<K, V>, key: K, what: string): V {\n const value = map.get(key);\n if (value === undefined) {\n throw new Error(`columnsLayout: no ${what} for \"${String(key)}\"`);\n }\n return value;\n}\n\nfunction columnMetrics(options: ColumnsLayoutOptions): ColumnMetrics {\n return {\n nodeWidth: options.nodeWidth ?? DEFAULT_NODE_WIDTH,\n nodeHeight: options.nodeHeight ?? DEFAULT_NODE_HEIGHT,\n columnGap: options.columnGap ?? DEFAULT_COLUMN_GAP,\n rowGap: options.rowGap ?? DEFAULT_ROW_GAP,\n groupPadding: options.groupPadding ?? DEFAULT_GROUP_PADDING,\n padding: options.padding ?? DEFAULT_PADDING,\n sweeps: options.sweeps ?? DEFAULT_SWEEPS,\n };\n}\n\nfunction indexColumns(nodes: readonly ColumnsLayoutNode[]) {\n const columns = new Map<number, ColumnsLayoutNode[]>();\n const groupRank = new Map<string | undefined, number>();\n for (const node of nodes) {\n if (!Number.isFinite(node.level)) {\n throw new Error(`columnsLayout: node \"${node.id}\" has no finite level (got ${node.level})`);\n }\n if (!groupRank.has(node.group)) groupRank.set(node.group, groupRank.size);\n const column = columns.get(node.level);\n if (column) {\n column.push(node);\n } else {\n columns.set(node.level, [node]);\n }\n }\n return { columns, groupRank };\n}\n\nfunction indexNeighbours(\n nodes: readonly ColumnsLayoutNode[],\n edges: readonly GraphLayoutEdge[],\n): Map<string, string[]> {\n const neighbours = new Map<string, string[]>(nodes.map((node) => [node.id, []]));\n for (const edge of edges) {\n const from = neighbours.get(edge.from);\n const to = neighbours.get(edge.to);\n if (!from || !to) {\n const missing = from ? edge.to : edge.from;\n throw new Error(`columnsLayout: edge \"${edge.id}\" references unknown node \"${missing}\"`);\n }\n from.push(edge.to);\n to.push(edge.from);\n }\n return neighbours;\n}\n\nfunction columnHeight(column: readonly ColumnsLayoutNode[], m: ColumnMetrics): number {\n const groups = new Set(column.map((node) => node.group));\n groups.delete(undefined);\n return column.length * m.nodeHeight + (column.length - 1) * m.rowGap + 2 * m.groupPadding * groups.size;\n}\n\n/** Groups in order of first appearance; within a group by ascending weight, the column's order on ties. */\nfunction orderColumn(\n column: readonly ColumnsLayoutNode[],\n groupRank: ReadonlyMap<string | undefined, number>,\n weight: (node: ColumnsLayoutNode) => number,\n): GroupRun[] {\n const runs = new Map<number, { node: ColumnsLayoutNode; index: number; weight: number }[]>();\n column.forEach((node, index) => {\n const rank = mustGet(groupRank, node.group, \"group rank\");\n const entry = { node, index, weight: weight(node) };\n const run = runs.get(rank);\n if (run) {\n run.push(entry);\n } else {\n runs.set(rank, [entry]);\n }\n });\n return [...runs.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, run]) => {\n // Infinity - Infinity is NaN, which falls through to the column-order tiebreak.\n const nodes = run.sort((a, b) => a.weight - b.weight || a.index - b.index).map((entry) => entry.node);\n return { group: nodes[0]?.group, nodes };\n });\n}\n\nfunction stackColumn(\n runs: readonly GroupRun[],\n origin: { x: number; top: number; level: number },\n m: ColumnMetrics,\n placed: Map<string, GraphLayoutPosition>,\n): GraphLayoutGroupBox[] {\n const boxes: GraphLayoutGroupBox[] = [];\n let cursor = origin.top;\n for (const { group, nodes } of runs) {\n const pad = group === undefined ? 0 : m.groupPadding;\n const height = nodes.length * m.nodeHeight + (nodes.length - 1) * m.rowGap + 2 * pad;\n nodes.forEach((node, index) => {\n const top = cursor + pad + index * (m.nodeHeight + m.rowGap);\n placed.set(node.id, { x: origin.x, y: top + m.nodeHeight / 2 });\n });\n if (group !== undefined) {\n boxes.push({\n id: `${origin.level}:${group}`,\n group,\n level: origin.level,\n x: origin.x - m.nodeWidth / 2 - pad,\n y: cursor,\n width: m.nodeWidth + 2 * pad,\n height,\n });\n }\n cursor += height + m.rowGap;\n }\n return boxes;\n}\n\nfunction meanY(ids: readonly string[], placed: ReadonlyMap<string, GraphLayoutPosition>): number {\n if (ids.length === 0) return Number.POSITIVE_INFINITY;\n return ids.reduce((sum, id) => sum + mustGet(placed, id, \"position\").y, 0) / ids.length;\n}\n\n/**\n * Levels in the order they are first laid out — the one nearest 0, then\n * outward on each side — each paired with the already-placed adjacent level\n * its nodes are ordered against.\n */\nfunction placementOrder(levels: readonly number[]): [level: number, reference: number | undefined][] {\n const anchor = levels.reduce((best, level) => (Math.abs(level) < Math.abs(best) ? level : best));\n const outward = (side: readonly number[]) =>\n side.map((level, index): [number, number] => [level, side[index - 1] ?? anchor]);\n return [\n [anchor, undefined],\n ...outward(levels.filter((level) => level > anchor)),\n ...outward(levels.filter((level) => level < anchor).reverse()),\n ];\n}\n\n/** Orders one column by the mean y of its nodes' neighbours in the `references` levels, and stacks it. */\nfunction placeColumn(level: number, references: readonly number[], ctx: ColumnsContext, into: Arrangement): void {\n const runs = orderColumn(mustGet(into.order, level, \"column\"), ctx.groupRank, (node) =>\n meanY(\n mustGet(ctx.neighbours, node.id, \"neighbours\").filter((id) =>\n references.includes(mustGet(ctx.levelOf, id, \"level\")),\n ),\n into.placed,\n ),\n );\n into.order.set(\n level,\n runs.flatMap((run) => run.nodes),\n );\n into.boxes.set(level, stackColumn(runs, ctx.origin(level), ctx.m, into.placed));\n}\n\n/** Pairs of edges between adjacent columns that cross, taking each edge as a straight line. */\nfunction countCrossings(ctx: ColumnsContext, placed: ReadonlyMap<string, GraphLayoutPosition>): number {\n const spans = new Map<number, [lower: number, upper: number][]>();\n for (const edge of ctx.edges) {\n const levels = [mustGet(ctx.levelOf, edge.from, \"level\"), mustGet(ctx.levelOf, edge.to, \"level\")] as const;\n const [lower, upper] = levels[0] < levels[1] ? [edge.from, edge.to] : [edge.to, edge.from];\n const index = ctx.levels.indexOf(Math.min(...levels));\n if (levels[0] === levels[1] || ctx.levels[index + 1] !== Math.max(...levels)) continue;\n const span: [number, number] = [mustGet(placed, lower, \"position\").y, mustGet(placed, upper, \"position\").y];\n spans.set(index, [...(spans.get(index) ?? []), span]);\n }\n let crossings = 0;\n for (const gap of spans.values()) {\n gap.forEach((a, index) => {\n crossings += gap.slice(index + 1).filter((b) => (a[0] - b[0]) * (a[1] - b[1]) < 0).length;\n });\n }\n return crossings;\n}\n\n/** A copy of `from` with every column re-ordered against both its neighbours, in the order given. */\nfunction sweep(from: Arrangement, sequence: readonly number[], ctx: ColumnsContext): Arrangement {\n const next: Arrangement = { order: new Map(from.order), placed: new Map(from.placed), boxes: new Map(from.boxes) };\n for (const level of sequence) {\n const index = ctx.levels.indexOf(level);\n const adjacent = [ctx.levels[index - 1], ctx.levels[index + 1]].filter((other): other is number => other !== undefined);\n placeColumn(level, adjacent, ctx, next);\n }\n return next;\n}\n\n/**\n * Orders the columns. The first pass places the level nearest 0 and works\n * outward, ordering each column against the one just placed. Then up to\n * `sweeps` passes re-order every column against both its neighbours, inward\n * then outward, and the arrangement with the fewest crossings is kept: the\n * first pass's unless a later one strictly beats it.\n */\nfunction arrange(columns: ReadonlyMap<number, ColumnsLayoutNode[]>, ctx: ColumnsContext): Arrangement {\n let current: Arrangement = { order: new Map(columns), placed: new Map(), boxes: new Map() };\n for (const [level, reference] of placementOrder(ctx.levels)) {\n placeColumn(level, reference === undefined ? [] : [reference], ctx, current);\n }\n let best = current;\n let fewest = countCrossings(ctx, best.placed);\n for (let pass = 0; pass < ctx.m.sweeps && fewest > 0; pass++) {\n current = sweep(current, pass % 2 === 0 ? [...ctx.levels].reverse() : ctx.levels, ctx);\n const crossings = countCrossings(ctx, current.placed);\n if (crossings < fewest) {\n best = current;\n fewest = crossings;\n }\n }\n return best;\n}\n\n/**\n * Places nodes in left-to-right columns by `level` (the lowest level first),\n * stacking each column top to bottom and centring it against the tallest one.\n *\n * Within a column, nodes of one group are contiguous, groups appearing in the\n * order they first occur in `nodes`. Inside a group nodes are ordered by the\n * mean y of their neighbours in the adjacent columns, so edges between columns\n * cross less (see `arrange`); nodes with no neighbour there go last, and ties\n * keep input order.\n *\n * Returns node centres plus one rectangle per (column, group). Extra width is\n * reserved on each side for the loops `routeEdges` draws outside the first and\n * last columns.\n */\nexport function columnsLayout(\n nodes: readonly ColumnsLayoutNode[],\n edges: readonly GraphLayoutEdge[],\n options: ColumnsLayoutOptions = {},\n): ColumnsLayoutResult {\n const m = columnMetrics(options);\n const { columns, groupRank } = indexColumns(nodes);\n const neighbours = indexNeighbours(nodes, edges);\n const levels = [...columns.keys()].sort((a, b) => a - b);\n if (levels.length === 0) {\n return { width: 2 * m.padding, height: 2 * m.padding, positions: {}, groups: [] };\n }\n\n const minLevel = Math.min(...levels);\n const tallest = Math.max(...[...columns.values()].map((column) => columnHeight(column, m)));\n const inset = m.padding + (nodes.some((node) => node.group !== undefined) ? m.groupPadding : 0);\n const { placed, boxes } = arrange(columns, {\n m,\n levels,\n levelOf: new Map(nodes.map((node) => [node.id, node.level])),\n groupRank,\n neighbours,\n edges,\n origin: (level) => ({\n x: inset + m.nodeWidth / 2 + (level - minLevel) * (m.nodeWidth + m.columnGap),\n top: m.padding + (tallest - columnHeight(mustGet(columns, level, \"column\"), m)) / 2,\n level,\n }),\n });\n\n const room = loopOverhang(edges, Object.fromEntries(placed), m);\n const span = (Math.max(...levels) - minLevel) * (m.nodeWidth + m.columnGap) + m.nodeWidth;\n return {\n width: room.left + 2 * inset + span + room.right,\n height: tallest + 2 * m.padding,\n positions: Object.fromEntries([...placed].map(([id, { x, y }]) => [id, { x: x + room.left, y }])),\n groups: [...boxes.values()]\n .flat()\n .map((box) => ({ ...box, x: box.x + room.left }))\n .sort((a, b) => a.level - b.level || a.y - b.y),\n };\n}\n"],"names":["loopOverhang"],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { GraphLayoutEdge, GraphLayoutNode, GraphLayoutResult } from './graph-layout.js';
|
|
2
|
+
export interface ColumnsLayoutNode extends GraphLayoutNode {
|
|
3
|
+
/** Column of the node. May be negative: the lowest level is the first column. */
|
|
4
|
+
level: number;
|
|
5
|
+
/** Nodes sharing a group stay contiguous within their column and are boxed together. */
|
|
6
|
+
group?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ColumnsLayoutOptions {
|
|
9
|
+
/** Node bounding-box width in px. Defaults to 168. */
|
|
10
|
+
nodeWidth?: number;
|
|
11
|
+
/** Node bounding-box height in px. Defaults to 60. */
|
|
12
|
+
nodeHeight?: number;
|
|
13
|
+
/** Horizontal gap between the node boxes of adjacent columns in px. Defaults to 96. */
|
|
14
|
+
columnGap?: number;
|
|
15
|
+
/** Vertical gap between stacked nodes, and between group rectangles, in px. Defaults to 20. */
|
|
16
|
+
rowGap?: number;
|
|
17
|
+
/** Space between a group's nodes and its rectangle in px. Defaults to 12. */
|
|
18
|
+
groupPadding?: number;
|
|
19
|
+
/** Space reserved around the columns before the viewport edge. Defaults to 24. */
|
|
20
|
+
padding?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Re-ordering passes over all columns after the first placement, alternating direction; a pass
|
|
23
|
+
* is kept only if it leaves fewer crossings. Defaults to 4. 0 keeps the first placement.
|
|
24
|
+
*/
|
|
25
|
+
sweeps?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface GraphLayoutGroupBox {
|
|
28
|
+
/** `${level}:${group}` — a group spanning several columns gets one rectangle per column. */
|
|
29
|
+
id: string;
|
|
30
|
+
group: string;
|
|
31
|
+
level: number;
|
|
32
|
+
/** Top-left corner, in the same coordinate space as the layout's `width`/`height`. */
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ColumnsLayoutResult extends GraphLayoutResult {
|
|
39
|
+
groups: GraphLayoutGroupBox[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Places nodes in left-to-right columns by `level` (the lowest level first),
|
|
43
|
+
* stacking each column top to bottom and centring it against the tallest one.
|
|
44
|
+
*
|
|
45
|
+
* Within a column, nodes of one group are contiguous, groups appearing in the
|
|
46
|
+
* order they first occur in `nodes`. Inside a group nodes are ordered by the
|
|
47
|
+
* mean y of their neighbours in the adjacent columns, so edges between columns
|
|
48
|
+
* cross less (see `arrange`); nodes with no neighbour there go last, and ties
|
|
49
|
+
* keep input order.
|
|
50
|
+
*
|
|
51
|
+
* Returns node centres plus one rectangle per (column, group). Extra width is
|
|
52
|
+
* reserved on each side for the loops `routeEdges` draws outside the first and
|
|
53
|
+
* last columns.
|
|
54
|
+
*/
|
|
55
|
+
export declare function columnsLayout(nodes: readonly ColumnsLayoutNode[], edges: readonly GraphLayoutEdge[], options?: ColumnsLayoutOptions): ColumnsLayoutResult;
|
|
56
|
+
//# sourceMappingURL=graph-columns-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-columns-layout.d.ts","sourceRoot":"","sources":["../../src/data/graph-columns-layout.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAuB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE/G,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAyPD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,iBAAiB,EAAE,EACnC,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAqCrB"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { loopOverhang } from "./graph-edge-routing.js";
|
|
2
|
+
const DEFAULT_NODE_WIDTH = 168;
|
|
3
|
+
const DEFAULT_NODE_HEIGHT = 60;
|
|
4
|
+
const DEFAULT_COLUMN_GAP = 96;
|
|
5
|
+
const DEFAULT_ROW_GAP = 20;
|
|
6
|
+
const DEFAULT_GROUP_PADDING = 12;
|
|
7
|
+
const DEFAULT_PADDING = 24;
|
|
8
|
+
const DEFAULT_SWEEPS = 4;
|
|
9
|
+
function mustGet(map, key, what) {
|
|
10
|
+
const value = map.get(key);
|
|
11
|
+
if (value === void 0) {
|
|
12
|
+
throw new Error(`columnsLayout: no ${what} for "${String(key)}"`);
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function columnMetrics(options) {
|
|
17
|
+
return {
|
|
18
|
+
nodeWidth: options.nodeWidth ?? DEFAULT_NODE_WIDTH,
|
|
19
|
+
nodeHeight: options.nodeHeight ?? DEFAULT_NODE_HEIGHT,
|
|
20
|
+
columnGap: options.columnGap ?? DEFAULT_COLUMN_GAP,
|
|
21
|
+
rowGap: options.rowGap ?? DEFAULT_ROW_GAP,
|
|
22
|
+
groupPadding: options.groupPadding ?? DEFAULT_GROUP_PADDING,
|
|
23
|
+
padding: options.padding ?? DEFAULT_PADDING,
|
|
24
|
+
sweeps: options.sweeps ?? DEFAULT_SWEEPS
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function indexColumns(nodes) {
|
|
28
|
+
const columns = /* @__PURE__ */ new Map();
|
|
29
|
+
const groupRank = /* @__PURE__ */ new Map();
|
|
30
|
+
for (const node of nodes) {
|
|
31
|
+
if (!Number.isFinite(node.level)) {
|
|
32
|
+
throw new Error(`columnsLayout: node "${node.id}" has no finite level (got ${node.level})`);
|
|
33
|
+
}
|
|
34
|
+
if (!groupRank.has(node.group)) groupRank.set(node.group, groupRank.size);
|
|
35
|
+
const column = columns.get(node.level);
|
|
36
|
+
if (column) {
|
|
37
|
+
column.push(node);
|
|
38
|
+
} else {
|
|
39
|
+
columns.set(node.level, [node]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { columns, groupRank };
|
|
43
|
+
}
|
|
44
|
+
function indexNeighbours(nodes, edges) {
|
|
45
|
+
const neighbours = new Map(nodes.map((node) => [node.id, []]));
|
|
46
|
+
for (const edge of edges) {
|
|
47
|
+
const from = neighbours.get(edge.from);
|
|
48
|
+
const to = neighbours.get(edge.to);
|
|
49
|
+
if (!from || !to) {
|
|
50
|
+
const missing = from ? edge.to : edge.from;
|
|
51
|
+
throw new Error(`columnsLayout: edge "${edge.id}" references unknown node "${missing}"`);
|
|
52
|
+
}
|
|
53
|
+
from.push(edge.to);
|
|
54
|
+
to.push(edge.from);
|
|
55
|
+
}
|
|
56
|
+
return neighbours;
|
|
57
|
+
}
|
|
58
|
+
function columnHeight(column, m) {
|
|
59
|
+
const groups = new Set(column.map((node) => node.group));
|
|
60
|
+
groups.delete(void 0);
|
|
61
|
+
return column.length * m.nodeHeight + (column.length - 1) * m.rowGap + 2 * m.groupPadding * groups.size;
|
|
62
|
+
}
|
|
63
|
+
function orderColumn(column, groupRank, weight) {
|
|
64
|
+
const runs = /* @__PURE__ */ new Map();
|
|
65
|
+
column.forEach((node, index) => {
|
|
66
|
+
const rank = mustGet(groupRank, node.group, "group rank");
|
|
67
|
+
const entry = { node, index, weight: weight(node) };
|
|
68
|
+
const run = runs.get(rank);
|
|
69
|
+
if (run) {
|
|
70
|
+
run.push(entry);
|
|
71
|
+
} else {
|
|
72
|
+
runs.set(rank, [entry]);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return [...runs.entries()].sort(([a], [b]) => a - b).map(([, run]) => {
|
|
76
|
+
var _a;
|
|
77
|
+
const nodes = run.sort((a, b) => a.weight - b.weight || a.index - b.index).map((entry) => entry.node);
|
|
78
|
+
return { group: (_a = nodes[0]) == null ? void 0 : _a.group, nodes };
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function stackColumn(runs, origin, m, placed) {
|
|
82
|
+
const boxes = [];
|
|
83
|
+
let cursor = origin.top;
|
|
84
|
+
for (const { group, nodes } of runs) {
|
|
85
|
+
const pad = group === void 0 ? 0 : m.groupPadding;
|
|
86
|
+
const height = nodes.length * m.nodeHeight + (nodes.length - 1) * m.rowGap + 2 * pad;
|
|
87
|
+
nodes.forEach((node, index) => {
|
|
88
|
+
const top = cursor + pad + index * (m.nodeHeight + m.rowGap);
|
|
89
|
+
placed.set(node.id, { x: origin.x, y: top + m.nodeHeight / 2 });
|
|
90
|
+
});
|
|
91
|
+
if (group !== void 0) {
|
|
92
|
+
boxes.push({
|
|
93
|
+
id: `${origin.level}:${group}`,
|
|
94
|
+
group,
|
|
95
|
+
level: origin.level,
|
|
96
|
+
x: origin.x - m.nodeWidth / 2 - pad,
|
|
97
|
+
y: cursor,
|
|
98
|
+
width: m.nodeWidth + 2 * pad,
|
|
99
|
+
height
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
cursor += height + m.rowGap;
|
|
103
|
+
}
|
|
104
|
+
return boxes;
|
|
105
|
+
}
|
|
106
|
+
function meanY(ids, placed) {
|
|
107
|
+
if (ids.length === 0) return Number.POSITIVE_INFINITY;
|
|
108
|
+
return ids.reduce((sum, id) => sum + mustGet(placed, id, "position").y, 0) / ids.length;
|
|
109
|
+
}
|
|
110
|
+
function placementOrder(levels) {
|
|
111
|
+
const anchor = levels.reduce((best, level) => Math.abs(level) < Math.abs(best) ? level : best);
|
|
112
|
+
const outward = (side) => side.map((level, index) => [level, side[index - 1] ?? anchor]);
|
|
113
|
+
return [
|
|
114
|
+
[anchor, void 0],
|
|
115
|
+
...outward(levels.filter((level) => level > anchor)),
|
|
116
|
+
...outward(levels.filter((level) => level < anchor).reverse())
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
function placeColumn(level, references, ctx, into) {
|
|
120
|
+
const runs = orderColumn(
|
|
121
|
+
mustGet(into.order, level, "column"),
|
|
122
|
+
ctx.groupRank,
|
|
123
|
+
(node) => meanY(
|
|
124
|
+
mustGet(ctx.neighbours, node.id, "neighbours").filter(
|
|
125
|
+
(id) => references.includes(mustGet(ctx.levelOf, id, "level"))
|
|
126
|
+
),
|
|
127
|
+
into.placed
|
|
128
|
+
)
|
|
129
|
+
);
|
|
130
|
+
into.order.set(
|
|
131
|
+
level,
|
|
132
|
+
runs.flatMap((run) => run.nodes)
|
|
133
|
+
);
|
|
134
|
+
into.boxes.set(level, stackColumn(runs, ctx.origin(level), ctx.m, into.placed));
|
|
135
|
+
}
|
|
136
|
+
function countCrossings(ctx, placed) {
|
|
137
|
+
const spans = /* @__PURE__ */ new Map();
|
|
138
|
+
for (const edge of ctx.edges) {
|
|
139
|
+
const levels = [mustGet(ctx.levelOf, edge.from, "level"), mustGet(ctx.levelOf, edge.to, "level")];
|
|
140
|
+
const [lower, upper] = levels[0] < levels[1] ? [edge.from, edge.to] : [edge.to, edge.from];
|
|
141
|
+
const index = ctx.levels.indexOf(Math.min(...levels));
|
|
142
|
+
if (levels[0] === levels[1] || ctx.levels[index + 1] !== Math.max(...levels)) continue;
|
|
143
|
+
const span = [mustGet(placed, lower, "position").y, mustGet(placed, upper, "position").y];
|
|
144
|
+
spans.set(index, [...spans.get(index) ?? [], span]);
|
|
145
|
+
}
|
|
146
|
+
let crossings = 0;
|
|
147
|
+
for (const gap of spans.values()) {
|
|
148
|
+
gap.forEach((a, index) => {
|
|
149
|
+
crossings += gap.slice(index + 1).filter((b) => (a[0] - b[0]) * (a[1] - b[1]) < 0).length;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return crossings;
|
|
153
|
+
}
|
|
154
|
+
function sweep(from, sequence, ctx) {
|
|
155
|
+
const next = { order: new Map(from.order), placed: new Map(from.placed), boxes: new Map(from.boxes) };
|
|
156
|
+
for (const level of sequence) {
|
|
157
|
+
const index = ctx.levels.indexOf(level);
|
|
158
|
+
const adjacent = [ctx.levels[index - 1], ctx.levels[index + 1]].filter((other) => other !== void 0);
|
|
159
|
+
placeColumn(level, adjacent, ctx, next);
|
|
160
|
+
}
|
|
161
|
+
return next;
|
|
162
|
+
}
|
|
163
|
+
function arrange(columns, ctx) {
|
|
164
|
+
let current = { order: new Map(columns), placed: /* @__PURE__ */ new Map(), boxes: /* @__PURE__ */ new Map() };
|
|
165
|
+
for (const [level, reference] of placementOrder(ctx.levels)) {
|
|
166
|
+
placeColumn(level, reference === void 0 ? [] : [reference], ctx, current);
|
|
167
|
+
}
|
|
168
|
+
let best = current;
|
|
169
|
+
let fewest = countCrossings(ctx, best.placed);
|
|
170
|
+
for (let pass = 0; pass < ctx.m.sweeps && fewest > 0; pass++) {
|
|
171
|
+
current = sweep(current, pass % 2 === 0 ? [...ctx.levels].reverse() : ctx.levels, ctx);
|
|
172
|
+
const crossings = countCrossings(ctx, current.placed);
|
|
173
|
+
if (crossings < fewest) {
|
|
174
|
+
best = current;
|
|
175
|
+
fewest = crossings;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return best;
|
|
179
|
+
}
|
|
180
|
+
function columnsLayout(nodes, edges, options = {}) {
|
|
181
|
+
const m = columnMetrics(options);
|
|
182
|
+
const { columns, groupRank } = indexColumns(nodes);
|
|
183
|
+
const neighbours = indexNeighbours(nodes, edges);
|
|
184
|
+
const levels = [...columns.keys()].sort((a, b) => a - b);
|
|
185
|
+
if (levels.length === 0) {
|
|
186
|
+
return { width: 2 * m.padding, height: 2 * m.padding, positions: {}, groups: [] };
|
|
187
|
+
}
|
|
188
|
+
const minLevel = Math.min(...levels);
|
|
189
|
+
const tallest = Math.max(...[...columns.values()].map((column) => columnHeight(column, m)));
|
|
190
|
+
const inset = m.padding + (nodes.some((node) => node.group !== void 0) ? m.groupPadding : 0);
|
|
191
|
+
const { placed, boxes } = arrange(columns, {
|
|
192
|
+
m,
|
|
193
|
+
levels,
|
|
194
|
+
levelOf: new Map(nodes.map((node) => [node.id, node.level])),
|
|
195
|
+
groupRank,
|
|
196
|
+
neighbours,
|
|
197
|
+
edges,
|
|
198
|
+
origin: (level) => ({
|
|
199
|
+
x: inset + m.nodeWidth / 2 + (level - minLevel) * (m.nodeWidth + m.columnGap),
|
|
200
|
+
top: m.padding + (tallest - columnHeight(mustGet(columns, level, "column"), m)) / 2,
|
|
201
|
+
level
|
|
202
|
+
})
|
|
203
|
+
});
|
|
204
|
+
const room = loopOverhang(edges, Object.fromEntries(placed), m);
|
|
205
|
+
const span = (Math.max(...levels) - minLevel) * (m.nodeWidth + m.columnGap) + m.nodeWidth;
|
|
206
|
+
return {
|
|
207
|
+
width: room.left + 2 * inset + span + room.right,
|
|
208
|
+
height: tallest + 2 * m.padding,
|
|
209
|
+
positions: Object.fromEntries([...placed].map(([id, { x, y }]) => [id, { x: x + room.left, y }])),
|
|
210
|
+
groups: [...boxes.values()].flat().map((box) => ({ ...box, x: box.x + room.left })).sort((a, b) => a.level - b.level || a.y - b.y)
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export {
|
|
214
|
+
columnsLayout
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=graph-columns-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-columns-layout.js","sources":["../../src/data/graph-columns-layout.ts"],"sourcesContent":["// Level-column layout for GraphDiagram: pure math, no React. Split from\n// graph-layout.ts, which owns the shared types and `ringLayout`.\n\nimport { loopOverhang } from \"./graph-edge-routing\";\nimport type { GraphLayoutEdge, GraphLayoutNode, GraphLayoutPosition, GraphLayoutResult } from \"./graph-layout\";\n\nexport interface ColumnsLayoutNode extends GraphLayoutNode {\n /** Column of the node. May be negative: the lowest level is the first column. */\n level: number;\n /** Nodes sharing a group stay contiguous within their column and are boxed together. */\n group?: string;\n}\n\nexport interface ColumnsLayoutOptions {\n /** Node bounding-box width in px. Defaults to 168. */\n nodeWidth?: number;\n /** Node bounding-box height in px. Defaults to 60. */\n nodeHeight?: number;\n /** Horizontal gap between the node boxes of adjacent columns in px. Defaults to 96. */\n columnGap?: number;\n /** Vertical gap between stacked nodes, and between group rectangles, in px. Defaults to 20. */\n rowGap?: number;\n /** Space between a group's nodes and its rectangle in px. Defaults to 12. */\n groupPadding?: number;\n /** Space reserved around the columns before the viewport edge. Defaults to 24. */\n padding?: number;\n /**\n * Re-ordering passes over all columns after the first placement, alternating direction; a pass\n * is kept only if it leaves fewer crossings. Defaults to 4. 0 keeps the first placement.\n */\n sweeps?: number;\n}\n\nexport interface GraphLayoutGroupBox {\n /** `${level}:${group}` — a group spanning several columns gets one rectangle per column. */\n id: string;\n group: string;\n level: number;\n /** Top-left corner, in the same coordinate space as the layout's `width`/`height`. */\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface ColumnsLayoutResult extends GraphLayoutResult {\n groups: GraphLayoutGroupBox[];\n}\n\ntype ColumnMetrics = Required<ColumnsLayoutOptions>;\n\ninterface GroupRun {\n group: string | undefined;\n nodes: ColumnsLayoutNode[];\n}\n\n/** One ordering of every column, stacked: the node centres and group rectangles it gives. */\ninterface Arrangement {\n order: Map<number, ColumnsLayoutNode[]>;\n placed: Map<string, GraphLayoutPosition>;\n boxes: Map<number, GraphLayoutGroupBox[]>;\n}\n\n/** What stays fixed while columns are re-ordered. */\ninterface ColumnsContext {\n m: ColumnMetrics;\n levels: number[];\n levelOf: Map<string, number>;\n groupRank: Map<string | undefined, number>;\n neighbours: Map<string, string[]>;\n edges: readonly GraphLayoutEdge[];\n /** Centre x and top y of a level's column. */\n origin: (level: number) => { x: number; top: number; level: number };\n}\n\nconst DEFAULT_NODE_WIDTH = 168;\nconst DEFAULT_NODE_HEIGHT = 60;\nconst DEFAULT_COLUMN_GAP = 96;\nconst DEFAULT_ROW_GAP = 20;\nconst DEFAULT_GROUP_PADDING = 12;\nconst DEFAULT_PADDING = 24;\nconst DEFAULT_SWEEPS = 4;\n\nfunction mustGet<K, V>(map: ReadonlyMap<K, V>, key: K, what: string): V {\n const value = map.get(key);\n if (value === undefined) {\n throw new Error(`columnsLayout: no ${what} for \"${String(key)}\"`);\n }\n return value;\n}\n\nfunction columnMetrics(options: ColumnsLayoutOptions): ColumnMetrics {\n return {\n nodeWidth: options.nodeWidth ?? DEFAULT_NODE_WIDTH,\n nodeHeight: options.nodeHeight ?? DEFAULT_NODE_HEIGHT,\n columnGap: options.columnGap ?? DEFAULT_COLUMN_GAP,\n rowGap: options.rowGap ?? DEFAULT_ROW_GAP,\n groupPadding: options.groupPadding ?? DEFAULT_GROUP_PADDING,\n padding: options.padding ?? DEFAULT_PADDING,\n sweeps: options.sweeps ?? DEFAULT_SWEEPS,\n };\n}\n\nfunction indexColumns(nodes: readonly ColumnsLayoutNode[]) {\n const columns = new Map<number, ColumnsLayoutNode[]>();\n const groupRank = new Map<string | undefined, number>();\n for (const node of nodes) {\n if (!Number.isFinite(node.level)) {\n throw new Error(`columnsLayout: node \"${node.id}\" has no finite level (got ${node.level})`);\n }\n if (!groupRank.has(node.group)) groupRank.set(node.group, groupRank.size);\n const column = columns.get(node.level);\n if (column) {\n column.push(node);\n } else {\n columns.set(node.level, [node]);\n }\n }\n return { columns, groupRank };\n}\n\nfunction indexNeighbours(\n nodes: readonly ColumnsLayoutNode[],\n edges: readonly GraphLayoutEdge[],\n): Map<string, string[]> {\n const neighbours = new Map<string, string[]>(nodes.map((node) => [node.id, []]));\n for (const edge of edges) {\n const from = neighbours.get(edge.from);\n const to = neighbours.get(edge.to);\n if (!from || !to) {\n const missing = from ? edge.to : edge.from;\n throw new Error(`columnsLayout: edge \"${edge.id}\" references unknown node \"${missing}\"`);\n }\n from.push(edge.to);\n to.push(edge.from);\n }\n return neighbours;\n}\n\nfunction columnHeight(column: readonly ColumnsLayoutNode[], m: ColumnMetrics): number {\n const groups = new Set(column.map((node) => node.group));\n groups.delete(undefined);\n return column.length * m.nodeHeight + (column.length - 1) * m.rowGap + 2 * m.groupPadding * groups.size;\n}\n\n/** Groups in order of first appearance; within a group by ascending weight, the column's order on ties. */\nfunction orderColumn(\n column: readonly ColumnsLayoutNode[],\n groupRank: ReadonlyMap<string | undefined, number>,\n weight: (node: ColumnsLayoutNode) => number,\n): GroupRun[] {\n const runs = new Map<number, { node: ColumnsLayoutNode; index: number; weight: number }[]>();\n column.forEach((node, index) => {\n const rank = mustGet(groupRank, node.group, \"group rank\");\n const entry = { node, index, weight: weight(node) };\n const run = runs.get(rank);\n if (run) {\n run.push(entry);\n } else {\n runs.set(rank, [entry]);\n }\n });\n return [...runs.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, run]) => {\n // Infinity - Infinity is NaN, which falls through to the column-order tiebreak.\n const nodes = run.sort((a, b) => a.weight - b.weight || a.index - b.index).map((entry) => entry.node);\n return { group: nodes[0]?.group, nodes };\n });\n}\n\nfunction stackColumn(\n runs: readonly GroupRun[],\n origin: { x: number; top: number; level: number },\n m: ColumnMetrics,\n placed: Map<string, GraphLayoutPosition>,\n): GraphLayoutGroupBox[] {\n const boxes: GraphLayoutGroupBox[] = [];\n let cursor = origin.top;\n for (const { group, nodes } of runs) {\n const pad = group === undefined ? 0 : m.groupPadding;\n const height = nodes.length * m.nodeHeight + (nodes.length - 1) * m.rowGap + 2 * pad;\n nodes.forEach((node, index) => {\n const top = cursor + pad + index * (m.nodeHeight + m.rowGap);\n placed.set(node.id, { x: origin.x, y: top + m.nodeHeight / 2 });\n });\n if (group !== undefined) {\n boxes.push({\n id: `${origin.level}:${group}`,\n group,\n level: origin.level,\n x: origin.x - m.nodeWidth / 2 - pad,\n y: cursor,\n width: m.nodeWidth + 2 * pad,\n height,\n });\n }\n cursor += height + m.rowGap;\n }\n return boxes;\n}\n\nfunction meanY(ids: readonly string[], placed: ReadonlyMap<string, GraphLayoutPosition>): number {\n if (ids.length === 0) return Number.POSITIVE_INFINITY;\n return ids.reduce((sum, id) => sum + mustGet(placed, id, \"position\").y, 0) / ids.length;\n}\n\n/**\n * Levels in the order they are first laid out — the one nearest 0, then\n * outward on each side — each paired with the already-placed adjacent level\n * its nodes are ordered against.\n */\nfunction placementOrder(levels: readonly number[]): [level: number, reference: number | undefined][] {\n const anchor = levels.reduce((best, level) => (Math.abs(level) < Math.abs(best) ? level : best));\n const outward = (side: readonly number[]) =>\n side.map((level, index): [number, number] => [level, side[index - 1] ?? anchor]);\n return [\n [anchor, undefined],\n ...outward(levels.filter((level) => level > anchor)),\n ...outward(levels.filter((level) => level < anchor).reverse()),\n ];\n}\n\n/** Orders one column by the mean y of its nodes' neighbours in the `references` levels, and stacks it. */\nfunction placeColumn(level: number, references: readonly number[], ctx: ColumnsContext, into: Arrangement): void {\n const runs = orderColumn(mustGet(into.order, level, \"column\"), ctx.groupRank, (node) =>\n meanY(\n mustGet(ctx.neighbours, node.id, \"neighbours\").filter((id) =>\n references.includes(mustGet(ctx.levelOf, id, \"level\")),\n ),\n into.placed,\n ),\n );\n into.order.set(\n level,\n runs.flatMap((run) => run.nodes),\n );\n into.boxes.set(level, stackColumn(runs, ctx.origin(level), ctx.m, into.placed));\n}\n\n/** Pairs of edges between adjacent columns that cross, taking each edge as a straight line. */\nfunction countCrossings(ctx: ColumnsContext, placed: ReadonlyMap<string, GraphLayoutPosition>): number {\n const spans = new Map<number, [lower: number, upper: number][]>();\n for (const edge of ctx.edges) {\n const levels = [mustGet(ctx.levelOf, edge.from, \"level\"), mustGet(ctx.levelOf, edge.to, \"level\")] as const;\n const [lower, upper] = levels[0] < levels[1] ? [edge.from, edge.to] : [edge.to, edge.from];\n const index = ctx.levels.indexOf(Math.min(...levels));\n if (levels[0] === levels[1] || ctx.levels[index + 1] !== Math.max(...levels)) continue;\n const span: [number, number] = [mustGet(placed, lower, \"position\").y, mustGet(placed, upper, \"position\").y];\n spans.set(index, [...(spans.get(index) ?? []), span]);\n }\n let crossings = 0;\n for (const gap of spans.values()) {\n gap.forEach((a, index) => {\n crossings += gap.slice(index + 1).filter((b) => (a[0] - b[0]) * (a[1] - b[1]) < 0).length;\n });\n }\n return crossings;\n}\n\n/** A copy of `from` with every column re-ordered against both its neighbours, in the order given. */\nfunction sweep(from: Arrangement, sequence: readonly number[], ctx: ColumnsContext): Arrangement {\n const next: Arrangement = { order: new Map(from.order), placed: new Map(from.placed), boxes: new Map(from.boxes) };\n for (const level of sequence) {\n const index = ctx.levels.indexOf(level);\n const adjacent = [ctx.levels[index - 1], ctx.levels[index + 1]].filter((other): other is number => other !== undefined);\n placeColumn(level, adjacent, ctx, next);\n }\n return next;\n}\n\n/**\n * Orders the columns. The first pass places the level nearest 0 and works\n * outward, ordering each column against the one just placed. Then up to\n * `sweeps` passes re-order every column against both its neighbours, inward\n * then outward, and the arrangement with the fewest crossings is kept: the\n * first pass's unless a later one strictly beats it.\n */\nfunction arrange(columns: ReadonlyMap<number, ColumnsLayoutNode[]>, ctx: ColumnsContext): Arrangement {\n let current: Arrangement = { order: new Map(columns), placed: new Map(), boxes: new Map() };\n for (const [level, reference] of placementOrder(ctx.levels)) {\n placeColumn(level, reference === undefined ? [] : [reference], ctx, current);\n }\n let best = current;\n let fewest = countCrossings(ctx, best.placed);\n for (let pass = 0; pass < ctx.m.sweeps && fewest > 0; pass++) {\n current = sweep(current, pass % 2 === 0 ? [...ctx.levels].reverse() : ctx.levels, ctx);\n const crossings = countCrossings(ctx, current.placed);\n if (crossings < fewest) {\n best = current;\n fewest = crossings;\n }\n }\n return best;\n}\n\n/**\n * Places nodes in left-to-right columns by `level` (the lowest level first),\n * stacking each column top to bottom and centring it against the tallest one.\n *\n * Within a column, nodes of one group are contiguous, groups appearing in the\n * order they first occur in `nodes`. Inside a group nodes are ordered by the\n * mean y of their neighbours in the adjacent columns, so edges between columns\n * cross less (see `arrange`); nodes with no neighbour there go last, and ties\n * keep input order.\n *\n * Returns node centres plus one rectangle per (column, group). Extra width is\n * reserved on each side for the loops `routeEdges` draws outside the first and\n * last columns.\n */\nexport function columnsLayout(\n nodes: readonly ColumnsLayoutNode[],\n edges: readonly GraphLayoutEdge[],\n options: ColumnsLayoutOptions = {},\n): ColumnsLayoutResult {\n const m = columnMetrics(options);\n const { columns, groupRank } = indexColumns(nodes);\n const neighbours = indexNeighbours(nodes, edges);\n const levels = [...columns.keys()].sort((a, b) => a - b);\n if (levels.length === 0) {\n return { width: 2 * m.padding, height: 2 * m.padding, positions: {}, groups: [] };\n }\n\n const minLevel = Math.min(...levels);\n const tallest = Math.max(...[...columns.values()].map((column) => columnHeight(column, m)));\n const inset = m.padding + (nodes.some((node) => node.group !== undefined) ? m.groupPadding : 0);\n const { placed, boxes } = arrange(columns, {\n m,\n levels,\n levelOf: new Map(nodes.map((node) => [node.id, node.level])),\n groupRank,\n neighbours,\n edges,\n origin: (level) => ({\n x: inset + m.nodeWidth / 2 + (level - minLevel) * (m.nodeWidth + m.columnGap),\n top: m.padding + (tallest - columnHeight(mustGet(columns, level, \"column\"), m)) / 2,\n level,\n }),\n });\n\n const room = loopOverhang(edges, Object.fromEntries(placed), m);\n const span = (Math.max(...levels) - minLevel) * (m.nodeWidth + m.columnGap) + m.nodeWidth;\n return {\n width: room.left + 2 * inset + span + room.right,\n height: tallest + 2 * m.padding,\n positions: Object.fromEntries([...placed].map(([id, { x, y }]) => [id, { x: x + room.left, y }])),\n groups: [...boxes.values()]\n .flat()\n .map((box) => ({ ...box, x: box.x + room.left }))\n .sort((a, b) => a.level - b.level || a.y - b.y),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const DENSE_EDGE_COUNT = 32;
|
|
4
|
+
function edgeFocusOn(mode, edgeCount) {
|
|
5
|
+
return mode === "on" || mode === "auto" && edgeCount > DENSE_EDGE_COUNT;
|
|
6
|
+
}
|
|
7
|
+
function focusedEdgeIds(edges, focus) {
|
|
8
|
+
return new Set(
|
|
9
|
+
edges.filter((edge) => focus.edges.includes(edge.id) || focus.nodes.includes(edge.from) || focus.nodes.includes(edge.to)).map((edge) => edge.id)
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
const TONE_TEXT_CLASS = {
|
|
13
|
+
neutral: "text-muted-foreground",
|
|
14
|
+
success: "text-emerald-600 dark:text-emerald-400",
|
|
15
|
+
danger: "text-red-600 dark:text-red-400",
|
|
16
|
+
warning: "text-amber-600 dark:text-amber-400",
|
|
17
|
+
info: "text-sky-600 dark:text-sky-400"
|
|
18
|
+
};
|
|
19
|
+
const TONE_NODE_CLASS = {
|
|
20
|
+
neutral: "border-border bg-card text-foreground",
|
|
21
|
+
success: "border-emerald-500/50 bg-emerald-500/10 text-foreground",
|
|
22
|
+
danger: "border-red-500/50 bg-red-500/10 text-foreground",
|
|
23
|
+
warning: "border-amber-500/50 bg-amber-500/10 text-foreground",
|
|
24
|
+
info: "border-sky-500/50 bg-sky-500/10 text-foreground"
|
|
25
|
+
};
|
|
26
|
+
function nodeName(node) {
|
|
27
|
+
if (node.ariaLabel !== void 0) return node.ariaLabel;
|
|
28
|
+
return typeof node.label === "string" ? node.label : node.id;
|
|
29
|
+
}
|
|
30
|
+
function edgeName(edge, names) {
|
|
31
|
+
const ends = `${requireEntry(names, edge.from, "node name")} to ${requireEntry(names, edge.to, "node name")}`;
|
|
32
|
+
const pill = [edge.iconLabel, edge.label].filter(Boolean).join(" ");
|
|
33
|
+
return pill === "" ? ends : `${ends}: ${pill}`;
|
|
34
|
+
}
|
|
35
|
+
const LABEL_CHAR_WIDTH = 5.4;
|
|
36
|
+
const LABEL_CHROME = 14;
|
|
37
|
+
const LABEL_ICON_SIZE = 14;
|
|
38
|
+
const LABEL_ICON_GAP = 4;
|
|
39
|
+
function edgeLabelWidth(edge) {
|
|
40
|
+
var _a;
|
|
41
|
+
const icon = edge.icon == null ? 0 : LABEL_ICON_SIZE + (edge.label ? LABEL_ICON_GAP : 0);
|
|
42
|
+
return (((_a = edge.label) == null ? void 0 : _a.length) ?? 0) * LABEL_CHAR_WIDTH + icon + LABEL_CHROME;
|
|
43
|
+
}
|
|
44
|
+
function requireEntry(entries, id, what) {
|
|
45
|
+
const entry = entries[id];
|
|
46
|
+
if (entry === void 0) {
|
|
47
|
+
throw new Error(`GraphDiagram: no ${what} computed for "${id}"`);
|
|
48
|
+
}
|
|
49
|
+
return entry;
|
|
50
|
+
}
|
|
51
|
+
function hoverHandlers(id, onHover) {
|
|
52
|
+
const enter = () => onHover(id);
|
|
53
|
+
const leave = () => onHover(void 0);
|
|
54
|
+
return { onMouseEnter: enter, onMouseLeave: leave, onFocus: enter, onBlur: leave };
|
|
55
|
+
}
|
|
56
|
+
function activateOnKey(event, activate) {
|
|
57
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
58
|
+
event.preventDefault();
|
|
59
|
+
activate();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.DENSE_EDGE_COUNT = DENSE_EDGE_COUNT;
|
|
63
|
+
exports.TONE_NODE_CLASS = TONE_NODE_CLASS;
|
|
64
|
+
exports.TONE_TEXT_CLASS = TONE_TEXT_CLASS;
|
|
65
|
+
exports.activateOnKey = activateOnKey;
|
|
66
|
+
exports.edgeFocusOn = edgeFocusOn;
|
|
67
|
+
exports.edgeLabelWidth = edgeLabelWidth;
|
|
68
|
+
exports.edgeName = edgeName;
|
|
69
|
+
exports.focusedEdgeIds = focusedEdgeIds;
|
|
70
|
+
exports.hoverHandlers = hoverHandlers;
|
|
71
|
+
exports.nodeName = nodeName;
|
|
72
|
+
exports.requireEntry = requireEntry;
|
|
73
|
+
//# sourceMappingURL=graph-diagram-model.cjs.map
|