@contraagent/elements 0.0.0-stage → 0.1.0
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 +72 -2
- package/custom-elements.json +4260 -0
- package/dist/charts/bar-chart.d.ts +32 -0
- package/dist/charts/bar-chart.d.ts.map +1 -0
- package/dist/charts/bar-chart.js +70 -0
- package/dist/charts/bar-chart.js.map +1 -0
- package/dist/charts/base.d.ts +48 -0
- package/dist/charts/base.d.ts.map +1 -0
- package/dist/charts/base.js +203 -0
- package/dist/charts/base.js.map +1 -0
- package/dist/charts/column-chart.d.ts +42 -0
- package/dist/charts/column-chart.d.ts.map +1 -0
- package/dist/charts/column-chart.js +146 -0
- package/dist/charts/column-chart.js.map +1 -0
- package/dist/charts/heatmap.d.ts +42 -0
- package/dist/charts/heatmap.d.ts.map +1 -0
- package/dist/charts/heatmap.js +124 -0
- package/dist/charts/heatmap.js.map +1 -0
- package/dist/charts/index.d.ts +9 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +11 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/line-chart.d.ts +36 -0
- package/dist/charts/line-chart.d.ts.map +1 -0
- package/dist/charts/line-chart.js +118 -0
- package/dist/charts/line-chart.js.map +1 -0
- package/dist/charts/scale.d.ts +32 -0
- package/dist/charts/scale.d.ts.map +1 -0
- package/dist/charts/scale.js +50 -0
- package/dist/charts/scale.js.map +1 -0
- package/dist/charts/state-grid.d.ts +64 -0
- package/dist/charts/state-grid.d.ts.map +1 -0
- package/dist/charts/state-grid.js +223 -0
- package/dist/charts/state-grid.js.map +1 -0
- package/dist/charts/types.d.ts +34 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +11 -0
- package/dist/charts/types.js.map +1 -0
- package/dist/checks/check-table.d.ts +32 -0
- package/dist/checks/check-table.d.ts.map +1 -0
- package/dist/checks/check-table.js +94 -0
- package/dist/checks/check-table.js.map +1 -0
- package/dist/checks/index.d.ts +4 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +6 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/styles.d.ts +5 -0
- package/dist/checks/styles.d.ts.map +1 -0
- package/dist/checks/styles.js +30 -0
- package/dist/checks/styles.js.map +1 -0
- package/dist/checks/types.d.ts +35 -0
- package/dist/checks/types.d.ts.map +1 -0
- package/dist/checks/types.js +12 -0
- package/dist/checks/types.js.map +1 -0
- package/dist/core/clock.d.ts +20 -0
- package/dist/core/clock.d.ts.map +1 -0
- package/dist/core/clock.js +45 -0
- package/dist/core/clock.js.map +1 -0
- package/dist/core/define.d.ts +3 -0
- package/dist/core/define.d.ts.map +1 -0
- package/dist/core/define.js +8 -0
- package/dist/core/define.js.map +1 -0
- package/dist/core/events.d.ts +78 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +8 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/format.d.ts +8 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +28 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/frame.d.ts +4 -0
- package/dist/core/frame.d.ts.map +1 -0
- package/dist/core/frame.js +5 -0
- package/dist/core/frame.js.map +1 -0
- package/dist/core/strings.d.ts +3 -0
- package/dist/core/strings.d.ts.map +1 -0
- package/dist/core/strings.js +14 -0
- package/dist/core/strings.js.map +1 -0
- package/dist/core/tone.d.ts +8 -0
- package/dist/core/tone.d.ts.map +1 -0
- package/dist/core/tone.js +9 -0
- package/dist/core/tone.js.map +1 -0
- package/dist/count/count.d.ts +22 -0
- package/dist/count/count.d.ts.map +1 -0
- package/dist/count/count.js +60 -0
- package/dist/count/count.js.map +1 -0
- package/dist/count/elapsed.d.ts +18 -0
- package/dist/count/elapsed.d.ts.map +1 -0
- package/dist/count/elapsed.js +33 -0
- package/dist/count/elapsed.js.map +1 -0
- package/dist/count/index.d.ts +3 -0
- package/dist/count/index.d.ts.map +1 -0
- package/dist/count/index.js +5 -0
- package/dist/count/index.js.map +1 -0
- package/dist/define/all.d.ts +13 -0
- package/dist/define/all.d.ts.map +1 -0
- package/dist/define/all.js +14 -0
- package/dist/define/all.js.map +1 -0
- package/dist/define/charts.d.ts +8 -0
- package/dist/define/charts.d.ts.map +1 -0
- package/dist/define/charts.js +15 -0
- package/dist/define/charts.js.map +1 -0
- package/dist/define/check-table.d.ts +4 -0
- package/dist/define/check-table.d.ts.map +1 -0
- package/dist/define/check-table.js +7 -0
- package/dist/define/check-table.js.map +1 -0
- package/dist/define/count.d.ts +5 -0
- package/dist/define/count.d.ts.map +1 -0
- package/dist/define/count.js +9 -0
- package/dist/define/count.js.map +1 -0
- package/dist/define/data-table.d.ts +4 -0
- package/dist/define/data-table.d.ts.map +1 -0
- package/dist/define/data-table.js +7 -0
- package/dist/define/data-table.js.map +1 -0
- package/dist/define/graph.d.ts +6 -0
- package/dist/define/graph.d.ts.map +1 -0
- package/dist/define/graph.js +9 -0
- package/dist/define/graph.js.map +1 -0
- package/dist/define/json-tree.d.ts +4 -0
- package/dist/define/json-tree.d.ts.map +1 -0
- package/dist/define/json-tree.js +7 -0
- package/dist/define/json-tree.js.map +1 -0
- package/dist/define/lanes.d.ts +4 -0
- package/dist/define/lanes.d.ts.map +1 -0
- package/dist/define/lanes.js +7 -0
- package/dist/define/lanes.js.map +1 -0
- package/dist/define/markdown.d.ts +4 -0
- package/dist/define/markdown.d.ts.map +1 -0
- package/dist/define/markdown.js +7 -0
- package/dist/define/markdown.js.map +1 -0
- package/dist/define/matrix.d.ts +4 -0
- package/dist/define/matrix.d.ts.map +1 -0
- package/dist/define/matrix.js +7 -0
- package/dist/define/matrix.js.map +1 -0
- package/dist/define/segmented.d.ts +4 -0
- package/dist/define/segmented.d.ts.map +1 -0
- package/dist/define/segmented.js +7 -0
- package/dist/define/segmented.js.map +1 -0
- package/dist/define/tiles.d.ts +5 -0
- package/dist/define/tiles.d.ts.map +1 -0
- package/dist/define/tiles.js +9 -0
- package/dist/define/tiles.js.map +1 -0
- package/dist/define/transcript.d.ts +4 -0
- package/dist/define/transcript.d.ts.map +1 -0
- package/dist/define/transcript.js +7 -0
- package/dist/define/transcript.js.map +1 -0
- package/dist/graph/arrange.d.ts +43 -0
- package/dist/graph/arrange.d.ts.map +1 -0
- package/dist/graph/arrange.js +390 -0
- package/dist/graph/arrange.js.map +1 -0
- package/dist/graph/card.d.ts +71 -0
- package/dist/graph/card.d.ts.map +1 -0
- package/dist/graph/card.js +185 -0
- package/dist/graph/card.js.map +1 -0
- package/dist/graph/host.d.ts +82 -0
- package/dist/graph/host.d.ts.map +1 -0
- package/dist/graph/host.js +21 -0
- package/dist/graph/host.js.map +1 -0
- package/dist/graph/icons.d.ts +7 -0
- package/dist/graph/icons.d.ts.map +1 -0
- package/dist/graph/icons.js +18 -0
- package/dist/graph/icons.js.map +1 -0
- package/dist/graph/index.d.ts +15 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +17 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/layered-graph.d.ts +226 -0
- package/dist/graph/layered-graph.d.ts.map +1 -0
- package/dist/graph/layered-graph.js +396 -0
- package/dist/graph/layered-graph.js.map +1 -0
- package/dist/graph/layout.d.ts +80 -0
- package/dist/graph/layout.d.ts.map +1 -0
- package/dist/graph/layout.js +264 -0
- package/dist/graph/layout.js.map +1 -0
- package/dist/graph/marks.d.ts +24 -0
- package/dist/graph/marks.d.ts.map +1 -0
- package/dist/graph/marks.js +38 -0
- package/dist/graph/marks.js.map +1 -0
- package/dist/graph/nav.d.ts +14 -0
- package/dist/graph/nav.d.ts.map +1 -0
- package/dist/graph/nav.js +14 -0
- package/dist/graph/nav.js.map +1 -0
- package/dist/graph/pan-zoom.d.ts +80 -0
- package/dist/graph/pan-zoom.d.ts.map +1 -0
- package/dist/graph/pan-zoom.js +191 -0
- package/dist/graph/pan-zoom.js.map +1 -0
- package/dist/graph/paths.d.ts +9 -0
- package/dist/graph/paths.d.ts.map +1 -0
- package/dist/graph/paths.js +44 -0
- package/dist/graph/paths.js.map +1 -0
- package/dist/graph/place-card.d.ts +36 -0
- package/dist/graph/place-card.d.ts.map +1 -0
- package/dist/graph/place-card.js +68 -0
- package/dist/graph/place-card.js.map +1 -0
- package/dist/graph/strings.d.ts +50 -0
- package/dist/graph/strings.d.ts.map +1 -0
- package/dist/graph/strings.js +37 -0
- package/dist/graph/strings.js.map +1 -0
- package/dist/graph/styles.d.ts +2 -0
- package/dist/graph/styles.d.ts.map +1 -0
- package/dist/graph/styles.js +203 -0
- package/dist/graph/styles.js.map +1 -0
- package/dist/graph/types.d.ts +184 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +2 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/graph/view.d.ts +17 -0
- package/dist/graph/view.d.ts.map +1 -0
- package/dist/graph/view.js +21 -0
- package/dist/graph/view.js.map +1 -0
- package/dist/graph/views/dag.d.ts +10 -0
- package/dist/graph/views/dag.d.ts.map +1 -0
- package/dist/graph/views/dag.js +292 -0
- package/dist/graph/views/dag.js.map +1 -0
- package/dist/graph/views/foot.d.ts +8 -0
- package/dist/graph/views/foot.d.ts.map +1 -0
- package/dist/graph/views/foot.js +103 -0
- package/dist/graph/views/foot.js.map +1 -0
- package/dist/graph/views/node-table.d.ts +17 -0
- package/dist/graph/views/node-table.d.ts.map +1 -0
- package/dist/graph/views/node-table.js +80 -0
- package/dist/graph/views/node-table.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/json/index.d.ts +2 -0
- package/dist/json/index.d.ts.map +1 -0
- package/dist/json/index.js +3 -0
- package/dist/json/index.js.map +1 -0
- package/dist/json/json-tree.d.ts +21 -0
- package/dist/json/json-tree.d.ts.map +1 -0
- package/dist/json/json-tree.js +51 -0
- package/dist/json/json-tree.js.map +1 -0
- package/dist/lanes/index.d.ts +5 -0
- package/dist/lanes/index.d.ts.map +1 -0
- package/dist/lanes/index.js +7 -0
- package/dist/lanes/index.js.map +1 -0
- package/dist/lanes/lanes.d.ts +56 -0
- package/dist/lanes/lanes.d.ts.map +1 -0
- package/dist/lanes/lanes.js +160 -0
- package/dist/lanes/lanes.js.map +1 -0
- package/dist/lanes/stack.d.ts +26 -0
- package/dist/lanes/stack.d.ts.map +1 -0
- package/dist/lanes/stack.js +43 -0
- package/dist/lanes/stack.js.map +1 -0
- package/dist/lanes/styles.d.ts +2 -0
- package/dist/lanes/styles.d.ts.map +1 -0
- package/dist/lanes/styles.js +30 -0
- package/dist/lanes/styles.js.map +1 -0
- package/dist/lanes/types.d.ts +41 -0
- package/dist/lanes/types.d.ts.map +1 -0
- package/dist/lanes/types.js +6 -0
- package/dist/lanes/types.js.map +1 -0
- package/dist/markdown/cae-markdown.d.ts +37 -0
- package/dist/markdown/cae-markdown.d.ts.map +1 -0
- package/dist/markdown/cae-markdown.js +68 -0
- package/dist/markdown/cae-markdown.js.map +1 -0
- package/dist/markdown/highlight.d.ts +5 -0
- package/dist/markdown/highlight.d.ts.map +1 -0
- package/dist/markdown/highlight.js +86 -0
- package/dist/markdown/highlight.js.map +1 -0
- package/dist/markdown/index.d.ts +4 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +6 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/markdown.d.ts +4 -0
- package/dist/markdown/markdown.d.ts.map +1 -0
- package/dist/markdown/markdown.js +105 -0
- package/dist/markdown/markdown.js.map +1 -0
- package/dist/matrix/grid-step.d.ts +8 -0
- package/dist/matrix/grid-step.d.ts.map +1 -0
- package/dist/matrix/grid-step.js +69 -0
- package/dist/matrix/grid-step.js.map +1 -0
- package/dist/matrix/index.d.ts +5 -0
- package/dist/matrix/index.d.ts.map +1 -0
- package/dist/matrix/index.js +7 -0
- package/dist/matrix/index.js.map +1 -0
- package/dist/matrix/mark-matrix.d.ts +97 -0
- package/dist/matrix/mark-matrix.d.ts.map +1 -0
- package/dist/matrix/mark-matrix.js +272 -0
- package/dist/matrix/mark-matrix.js.map +1 -0
- package/dist/matrix/styles.d.ts +4 -0
- package/dist/matrix/styles.d.ts.map +1 -0
- package/dist/matrix/styles.js +47 -0
- package/dist/matrix/styles.js.map +1 -0
- package/dist/matrix/types.d.ts +79 -0
- package/dist/matrix/types.d.ts.map +1 -0
- package/dist/matrix/types.js +5 -0
- package/dist/matrix/types.js.map +1 -0
- package/dist/primitives/fact-line.d.ts +14 -0
- package/dist/primitives/fact-line.d.ts.map +1 -0
- package/dist/primitives/fact-line.js +18 -0
- package/dist/primitives/fact-line.js.map +1 -0
- package/dist/primitives/icon.d.ts +14 -0
- package/dist/primitives/icon.d.ts.map +1 -0
- package/dist/primitives/icon.js +19 -0
- package/dist/primitives/icon.js.map +1 -0
- package/dist/primitives/index.d.ts +10 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +13 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/legend.d.ts +28 -0
- package/dist/primitives/legend.d.ts.map +1 -0
- package/dist/primitives/legend.js +28 -0
- package/dist/primitives/legend.js.map +1 -0
- package/dist/primitives/pill.d.ts +23 -0
- package/dist/primitives/pill.d.ts.map +1 -0
- package/dist/primitives/pill.js +40 -0
- package/dist/primitives/pill.js.map +1 -0
- package/dist/primitives/roving-focus.d.ts +47 -0
- package/dist/primitives/roving-focus.d.ts.map +1 -0
- package/dist/primitives/roving-focus.js +111 -0
- package/dist/primitives/roving-focus.js.map +1 -0
- package/dist/primitives/segmented.d.ts +41 -0
- package/dist/primitives/segmented.d.ts.map +1 -0
- package/dist/primitives/segmented.js +88 -0
- package/dist/primitives/segmented.js.map +1 -0
- package/dist/primitives/share-bar.d.ts +37 -0
- package/dist/primitives/share-bar.d.ts.map +1 -0
- package/dist/primitives/share-bar.js +69 -0
- package/dist/primitives/share-bar.js.map +1 -0
- package/dist/primitives/states.d.ts +19 -0
- package/dist/primitives/states.d.ts.map +1 -0
- package/dist/primitives/states.js +11 -0
- package/dist/primitives/states.js.map +1 -0
- package/dist/primitives/window.d.ts +24 -0
- package/dist/primitives/window.d.ts.map +1 -0
- package/dist/primitives/window.js +56 -0
- package/dist/primitives/window.js.map +1 -0
- package/dist/styles/chips.d.ts +2 -0
- package/dist/styles/chips.d.ts.map +1 -0
- package/dist/styles/chips.js +18 -0
- package/dist/styles/chips.js.map +1 -0
- package/dist/styles/facts.d.ts +2 -0
- package/dist/styles/facts.d.ts.map +1 -0
- package/dist/styles/facts.js +7 -0
- package/dist/styles/facts.js.map +1 -0
- package/dist/styles/index.d.ts +16 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +15 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/layout.d.ts +2 -0
- package/dist/styles/layout.d.ts.map +1 -0
- package/dist/styles/layout.js +33 -0
- package/dist/styles/layout.js.map +1 -0
- package/dist/styles/marks.d.ts +2 -0
- package/dist/styles/marks.d.ts.map +1 -0
- package/dist/styles/marks.js +30 -0
- package/dist/styles/marks.js.map +1 -0
- package/dist/styles/meter.d.ts +3 -0
- package/dist/styles/meter.d.ts.map +1 -0
- package/dist/styles/meter.js +9 -0
- package/dist/styles/meter.js.map +1 -0
- package/dist/styles/motion.d.ts +2 -0
- package/dist/styles/motion.d.ts.map +1 -0
- package/dist/styles/motion.js +27 -0
- package/dist/styles/motion.js.map +1 -0
- package/dist/styles/prose.d.ts +3 -0
- package/dist/styles/prose.d.ts.map +1 -0
- package/dist/styles/prose.js +59 -0
- package/dist/styles/prose.js.map +1 -0
- package/dist/styles/reset.d.ts +2 -0
- package/dist/styles/reset.d.ts.map +1 -0
- package/dist/styles/reset.js +13 -0
- package/dist/styles/reset.js.map +1 -0
- package/dist/styles/status.d.ts +2 -0
- package/dist/styles/status.d.ts.map +1 -0
- package/dist/styles/status.js +52 -0
- package/dist/styles/status.js.map +1 -0
- package/dist/styles/text.d.ts +2 -0
- package/dist/styles/text.d.ts.map +1 -0
- package/dist/styles/text.js +21 -0
- package/dist/styles/text.js.map +1 -0
- package/dist/styles/tokens.d.ts +8 -0
- package/dist/styles/tokens.d.ts.map +1 -0
- package/dist/styles/tokens.js +32 -0
- package/dist/styles/tokens.js.map +1 -0
- package/dist/table/data-table.d.ts +106 -0
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/table/data-table.js +408 -0
- package/dist/table/data-table.js.map +1 -0
- package/dist/table/index.d.ts +4 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/index.js +6 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/styles.d.ts +2 -0
- package/dist/table/styles.d.ts.map +1 -0
- package/dist/table/styles.js +32 -0
- package/dist/table/styles.js.map +1 -0
- package/dist/table/types.d.ts +48 -0
- package/dist/table/types.d.ts.map +1 -0
- package/dist/table/types.js +30 -0
- package/dist/table/types.js.map +1 -0
- package/dist/themes/boot.d.ts +7 -0
- package/dist/themes/boot.d.ts.map +1 -0
- package/dist/themes/boot.js +14 -0
- package/dist/themes/boot.js.map +1 -0
- package/dist/themes/choice.d.ts +16 -0
- package/dist/themes/choice.d.ts.map +1 -0
- package/dist/themes/choice.js +45 -0
- package/dist/themes/choice.js.map +1 -0
- package/dist/themes/data.d.ts +43 -0
- package/dist/themes/data.d.ts.map +1 -0
- package/dist/themes/data.js +408 -0
- package/dist/themes/data.js.map +1 -0
- package/dist/themes/index.d.ts +7 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +11 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/sheet.d.ts +16 -0
- package/dist/themes/sheet.d.ts.map +1 -0
- package/dist/themes/sheet.js +28 -0
- package/dist/themes/sheet.js.map +1 -0
- package/dist/themes/token-meanings.d.ts +3 -0
- package/dist/themes/token-meanings.d.ts.map +1 -0
- package/dist/themes/token-meanings.js +67 -0
- package/dist/themes/token-meanings.js.map +1 -0
- package/dist/themes/tokens-list.d.ts +14 -0
- package/dist/themes/tokens-list.d.ts.map +1 -0
- package/dist/themes/tokens-list.js +69 -0
- package/dist/themes/tokens-list.js.map +1 -0
- package/dist/tiles/index.d.ts +4 -0
- package/dist/tiles/index.d.ts.map +1 -0
- package/dist/tiles/index.js +6 -0
- package/dist/tiles/index.js.map +1 -0
- package/dist/tiles/stat-tiles.d.ts +40 -0
- package/dist/tiles/stat-tiles.d.ts.map +1 -0
- package/dist/tiles/stat-tiles.js +99 -0
- package/dist/tiles/stat-tiles.js.map +1 -0
- package/dist/tiles/styles.d.ts +2 -0
- package/dist/tiles/styles.d.ts.map +1 -0
- package/dist/tiles/styles.js +23 -0
- package/dist/tiles/styles.js.map +1 -0
- package/dist/tiles/types.d.ts +22 -0
- package/dist/tiles/types.d.ts.map +1 -0
- package/dist/tiles/types.js +2 -0
- package/dist/tiles/types.js.map +1 -0
- package/dist/transcript/follow-scroll.d.ts +21 -0
- package/dist/transcript/follow-scroll.d.ts.map +1 -0
- package/dist/transcript/follow-scroll.js +76 -0
- package/dist/transcript/follow-scroll.js.map +1 -0
- package/dist/transcript/index.d.ts +5 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +7 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/styles.d.ts +2 -0
- package/dist/transcript/styles.d.ts.map +1 -0
- package/dist/transcript/styles.js +114 -0
- package/dist/transcript/styles.js.map +1 -0
- package/dist/transcript/tags.d.ts +6 -0
- package/dist/transcript/tags.d.ts.map +1 -0
- package/dist/transcript/tags.js +13 -0
- package/dist/transcript/tags.js.map +1 -0
- package/dist/transcript/tool-card.d.ts +16 -0
- package/dist/transcript/tool-card.d.ts.map +1 -0
- package/dist/transcript/tool-card.js +87 -0
- package/dist/transcript/tool-card.js.map +1 -0
- package/dist/transcript/transcript.d.ts +103 -0
- package/dist/transcript/transcript.d.ts.map +1 -0
- package/dist/transcript/transcript.js +397 -0
- package/dist/transcript/transcript.js.map +1 -0
- package/dist/transcript/types.d.ts +161 -0
- package/dist/transcript/types.d.ts.map +1 -0
- package/dist/transcript/types.js +25 -0
- package/dist/transcript/types.js.map +1 -0
- package/docs/charts.md +58 -0
- package/docs/check-table.md +40 -0
- package/docs/data-table.md +57 -0
- package/docs/examples/charts.ts +61 -0
- package/docs/examples/check-table.ts +19 -0
- package/docs/examples/ci-pipeline.ts +271 -0
- package/docs/examples/data-table.ts +39 -0
- package/docs/examples/graph.ts +57 -0
- package/docs/examples/lanes.ts +40 -0
- package/docs/examples/matrix.ts +56 -0
- package/docs/examples/page.css +34 -0
- package/docs/examples/segmented.ts +18 -0
- package/docs/examples/status.ts +30 -0
- package/docs/examples/theme.css +54 -0
- package/docs/examples/tiles.ts +27 -0
- package/docs/examples/transcript.ts +59 -0
- package/docs/graph.md +112 -0
- package/docs/lanes.md +48 -0
- package/docs/matrix.md +34 -0
- package/docs/page.md +87 -0
- package/docs/primitives.md +57 -0
- package/docs/strings.md +16 -0
- package/docs/theming.md +147 -0
- package/docs/tiles.md +40 -0
- package/docs/transcript.md +73 -0
- package/docs/tsconfig.json +20 -0
- package/package.json +161 -4
- package/src/charts/bar-chart.ts +74 -0
- package/src/charts/base.ts +188 -0
- package/src/charts/column-chart.ts +153 -0
- package/src/charts/heatmap.ts +129 -0
- package/src/charts/index.ts +10 -0
- package/src/charts/line-chart.ts +128 -0
- package/src/charts/scale.ts +61 -0
- package/src/charts/state-grid.ts +245 -0
- package/src/charts/types.ts +48 -0
- package/src/checks/check-table.ts +85 -0
- package/src/checks/index.ts +5 -0
- package/src/checks/styles.ts +31 -0
- package/src/checks/types.ts +48 -0
- package/src/core/clock.ts +46 -0
- package/src/core/define.ts +7 -0
- package/src/core/events.ts +89 -0
- package/src/core/format.ts +25 -0
- package/src/core/frame.ts +5 -0
- package/src/core/strings.ts +11 -0
- package/src/core/tone.ts +14 -0
- package/src/count/count.ts +54 -0
- package/src/count/elapsed.ts +33 -0
- package/src/count/index.ts +4 -0
- package/src/define/all.ts +13 -0
- package/src/define/charts.ts +17 -0
- package/src/define/check-table.ts +9 -0
- package/src/define/count.ts +11 -0
- package/src/define/data-table.ts +9 -0
- package/src/define/graph.ts +11 -0
- package/src/define/json-tree.ts +9 -0
- package/src/define/lanes.ts +9 -0
- package/src/define/markdown.ts +9 -0
- package/src/define/matrix.ts +9 -0
- package/src/define/segmented.ts +9 -0
- package/src/define/tiles.ts +11 -0
- package/src/define/transcript.ts +9 -0
- package/src/graph/arrange.ts +399 -0
- package/src/graph/card.ts +209 -0
- package/src/graph/host.ts +100 -0
- package/src/graph/icons.ts +23 -0
- package/src/graph/index.ts +16 -0
- package/src/graph/layered-graph.ts +417 -0
- package/src/graph/layout.ts +331 -0
- package/src/graph/marks.ts +42 -0
- package/src/graph/nav.ts +19 -0
- package/src/graph/pan-zoom.ts +219 -0
- package/src/graph/paths.ts +41 -0
- package/src/graph/place-card.ts +93 -0
- package/src/graph/strings.ts +86 -0
- package/src/graph/styles.ts +204 -0
- package/src/graph/types.ts +202 -0
- package/src/graph/view.ts +28 -0
- package/src/graph/views/dag.ts +294 -0
- package/src/graph/views/foot.ts +109 -0
- package/src/graph/views/node-table.ts +90 -0
- package/src/index.ts +25 -0
- package/src/json/index.ts +2 -0
- package/src/json/json-tree.ts +49 -0
- package/src/lanes/index.ts +6 -0
- package/src/lanes/lanes.ts +143 -0
- package/src/lanes/stack.ts +51 -0
- package/src/lanes/styles.ts +30 -0
- package/src/lanes/types.ts +51 -0
- package/src/markdown/cae-markdown.ts +64 -0
- package/src/markdown/highlight.ts +94 -0
- package/src/markdown/index.ts +5 -0
- package/src/markdown/markdown.ts +110 -0
- package/src/matrix/grid-step.ts +58 -0
- package/src/matrix/index.ts +6 -0
- package/src/matrix/mark-matrix.ts +285 -0
- package/src/matrix/styles.ts +48 -0
- package/src/matrix/types.ts +83 -0
- package/src/primitives/fact-line.ts +26 -0
- package/src/primitives/icon.ts +26 -0
- package/src/primitives/index.ts +12 -0
- package/src/primitives/legend.ts +56 -0
- package/src/primitives/pill.ts +58 -0
- package/src/primitives/roving-focus.ts +138 -0
- package/src/primitives/segmented.ts +92 -0
- package/src/primitives/share-bar.ts +94 -0
- package/src/primitives/states.ts +28 -0
- package/src/primitives/window.ts +65 -0
- package/src/styles/chips.ts +18 -0
- package/src/styles/facts.ts +7 -0
- package/src/styles/index.ts +19 -0
- package/src/styles/layout.ts +33 -0
- package/src/styles/marks.ts +30 -0
- package/src/styles/meter.ts +9 -0
- package/src/styles/motion.ts +27 -0
- package/src/styles/prose.ts +59 -0
- package/src/styles/reset.ts +13 -0
- package/src/styles/status.ts +52 -0
- package/src/styles/text.ts +21 -0
- package/src/styles/tokens.ts +35 -0
- package/src/table/data-table.ts +367 -0
- package/src/table/index.ts +5 -0
- package/src/table/styles.ts +32 -0
- package/src/table/types.ts +73 -0
- package/src/themes/boot.ts +14 -0
- package/src/themes/choice.ts +47 -0
- package/src/themes/data.ts +433 -0
- package/src/themes/index.ts +10 -0
- package/src/themes/sheet.ts +29 -0
- package/src/themes/token-meanings.ts +67 -0
- package/src/themes/tokens-list.ts +82 -0
- package/src/tiles/index.ts +5 -0
- package/src/tiles/stat-tiles.ts +92 -0
- package/src/tiles/styles.ts +23 -0
- package/src/tiles/types.ts +20 -0
- package/src/transcript/follow-scroll.ts +72 -0
- package/src/transcript/index.ts +6 -0
- package/src/transcript/styles.ts +114 -0
- package/src/transcript/tags.ts +18 -0
- package/src/transcript/tool-card.ts +103 -0
- package/src/transcript/transcript.ts +358 -0
- package/src/transcript/types.ts +167 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { LitElement, type PropertyValues } from 'lit';
|
|
2
|
+
import { property, state } from 'lit/decorators.js';
|
|
3
|
+
|
|
4
|
+
const reducedMotion = () => globalThis.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A number that counts up (or down) to its new value when it changes; at once
|
|
8
|
+
* for a reader who asks for reduced motion.
|
|
9
|
+
*
|
|
10
|
+
* @tagname cae-count
|
|
11
|
+
*/
|
|
12
|
+
export class CaeCount extends LitElement {
|
|
13
|
+
@property({ type: Number }) value = 0;
|
|
14
|
+
@state() private shown = 0;
|
|
15
|
+
private frame = 0;
|
|
16
|
+
|
|
17
|
+
protected override createRenderRoot() {
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
protected override willUpdate(changed: PropertyValues<this>): void {
|
|
22
|
+
if (!changed.has('value')) return;
|
|
23
|
+
const from = this.shown;
|
|
24
|
+
const to = this.value;
|
|
25
|
+
cancelAnimationFrame(this.frame);
|
|
26
|
+
if (reducedMotion() || from === to || !Number.isFinite(to) || !this.isConnected) {
|
|
27
|
+
this.shown = to;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const t0 = performance.now();
|
|
31
|
+
const tick = (now: number) => {
|
|
32
|
+
const k = Math.min(1, (now - t0) / 700);
|
|
33
|
+
this.shown = Math.round(from + (to - from) * (1 - Math.pow(1 - k, 3)));
|
|
34
|
+
if (k < 1) this.frame = requestAnimationFrame(tick);
|
|
35
|
+
};
|
|
36
|
+
this.frame = requestAnimationFrame(tick);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override disconnectedCallback(): void {
|
|
40
|
+
super.disconnectedCallback();
|
|
41
|
+
cancelAnimationFrame(this.frame);
|
|
42
|
+
this.shown = this.value;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
override render() {
|
|
46
|
+
return String(this.shown);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
declare global {
|
|
51
|
+
interface HTMLElementTagNameMap {
|
|
52
|
+
'cae-count': CaeCount;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { property } from 'lit/decorators.js';
|
|
3
|
+
import { ClockController } from '../core/clock.js';
|
|
4
|
+
import { fmtDur } from '../core/format.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Time since `since` (epoch ms), ticking every second: `42s`, `3m 05s`, `1h 02m`.
|
|
8
|
+
*
|
|
9
|
+
* @tagname cae-elapsed
|
|
10
|
+
*/
|
|
11
|
+
export class CaeElapsed extends LitElement {
|
|
12
|
+
@property({ type: Number }) since = 0;
|
|
13
|
+
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
new ClockController(this);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Plain text in the light DOM: it takes the font and colour of where it is put.
|
|
20
|
+
protected override createRenderRoot() {
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
override render() {
|
|
25
|
+
return this.since ? fmtDur((Date.now() - this.since) / 1000) : '';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare global {
|
|
30
|
+
interface HTMLElementTagNameMap {
|
|
31
|
+
'cae-elapsed': CaeElapsed;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Registers every cae-* element.
|
|
2
|
+
import './json-tree.js';
|
|
3
|
+
import './markdown.js';
|
|
4
|
+
import './count.js';
|
|
5
|
+
import './segmented.js';
|
|
6
|
+
import './data-table.js';
|
|
7
|
+
import './tiles.js';
|
|
8
|
+
import './lanes.js';
|
|
9
|
+
import './check-table.js';
|
|
10
|
+
import './matrix.js';
|
|
11
|
+
import './graph.js';
|
|
12
|
+
import './transcript.js';
|
|
13
|
+
import './charts.js';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Registers <cae-column-chart>, <cae-line-chart>, <cae-heatmap>, <cae-state-grid> and <cae-bar-chart>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeBarChart } from '../charts/bar-chart.js';
|
|
4
|
+
import { CaeColumnChart } from '../charts/column-chart.js';
|
|
5
|
+
import { CaeHeatmap } from '../charts/heatmap.js';
|
|
6
|
+
import { CaeLineChart } from '../charts/line-chart.js';
|
|
7
|
+
import { CaeStateGrid } from '../charts/state-grid.js';
|
|
8
|
+
|
|
9
|
+
defineElement('cae-column-chart', CaeColumnChart);
|
|
10
|
+
defineElement('cae-line-chart', CaeLineChart);
|
|
11
|
+
defineElement('cae-heatmap', CaeHeatmap);
|
|
12
|
+
defineElement('cae-state-grid', CaeStateGrid);
|
|
13
|
+
defineElement('cae-bar-chart', CaeBarChart);
|
|
14
|
+
|
|
15
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
16
|
+
export { CaeBarChart, CaeColumnChart, CaeHeatmap, CaeLineChart, CaeStateGrid };
|
|
17
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-check-table>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeCheckTable } from '../checks/check-table.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-check-table', CaeCheckTable);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeCheckTable };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Registers <cae-count> and <cae-elapsed>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeCount } from '../count/count.js';
|
|
4
|
+
import { CaeElapsed } from '../count/elapsed.js';
|
|
5
|
+
|
|
6
|
+
defineElement('cae-count', CaeCount);
|
|
7
|
+
defineElement('cae-elapsed', CaeElapsed);
|
|
8
|
+
|
|
9
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
10
|
+
export { CaeCount, CaeElapsed };
|
|
11
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-data-table>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeDataTable } from '../table/data-table.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-data-table', CaeDataTable);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeDataTable };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Registers <cae-layered-graph>, and the elements it renders: <cae-mark-matrix> and <cae-segmented>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeLayeredGraph } from '../graph/layered-graph.js';
|
|
4
|
+
import './matrix.js';
|
|
5
|
+
import './segmented.js';
|
|
6
|
+
|
|
7
|
+
defineElement('cae-layered-graph', CaeLayeredGraph);
|
|
8
|
+
|
|
9
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
10
|
+
export { CaeLayeredGraph };
|
|
11
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-json-tree>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeJsonTree } from '../json/json-tree.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-json-tree', CaeJsonTree);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeJsonTree };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-lanes>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeLanes } from '../lanes/lanes.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-lanes', CaeLanes);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeLanes };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-markdown>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeMarkdown } from '../markdown/cae-markdown.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-markdown', CaeMarkdown);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeMarkdown };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-mark-matrix>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeMarkMatrix } from '../matrix/mark-matrix.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-mark-matrix', CaeMarkMatrix);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeMarkMatrix };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-segmented>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeSegmented } from '../primitives/segmented.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-segmented', CaeSegmented);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeSegmented };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Registers <cae-stat-tiles> and the <cae-count> it renders.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeCount } from '../count/count.js';
|
|
4
|
+
import { CaeStatTiles } from '../tiles/stat-tiles.js';
|
|
5
|
+
|
|
6
|
+
defineElement('cae-stat-tiles', CaeStatTiles);
|
|
7
|
+
defineElement('cae-count', CaeCount);
|
|
8
|
+
|
|
9
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
10
|
+
export { CaeStatTiles, CaeCount };
|
|
11
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Registers <cae-transcript>.
|
|
2
|
+
import { defineElement } from '../core/define.js';
|
|
3
|
+
import { CaeTranscript } from '../transcript/transcript.js';
|
|
4
|
+
|
|
5
|
+
defineElement('cae-transcript', CaeTranscript);
|
|
6
|
+
|
|
7
|
+
// The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
|
|
8
|
+
export { CaeTranscript };
|
|
9
|
+
export type { CaeEventMap } from '../core/events.js';
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
// The order of a layered drawing: each item's layer by longest path, and the order
|
|
2
|
+
// within each layer that reduces crossings. Reads ids and links only.
|
|
3
|
+
//
|
|
4
|
+
// The drawing is a layered (Sugiyama) layout of a compound graph, by container (the
|
|
5
|
+
// top level, then each cluster, a cluster being one item of its parent): layers by
|
|
6
|
+
// longest path, with the edges that close a cycle (`ranks: false`) left out; a point
|
|
7
|
+
// (`~...`) on every layer a long edge crosses, so no edge runs over a node; crossings
|
|
8
|
+
// reduced by barycentre sweeps. `layoutGraph` then places it from measured sizes.
|
|
9
|
+
// The order depends on the structure only, and keeps a previous order: items that
|
|
10
|
+
// appear later are appended to their layer.
|
|
11
|
+
import type { Arrangement, EdgeStyle, GraphClusterInput, GraphEdgeInput, GraphNodeInput, GraphOrder, GraphStubInput, EdgePathStep } from './types.js';
|
|
12
|
+
|
|
13
|
+
const push = <K, V>(m: Map<K, V[]>, k: K, v: V): void => {
|
|
14
|
+
const xs = m.get(k);
|
|
15
|
+
if (xs) xs.push(v);
|
|
16
|
+
else m.set(k, [v]);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const pairKey = (a: string, b: string) => `${a}\u0000${b}`;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Each id's layer by longest path. Edges that close a cycle (found depth first, in
|
|
23
|
+
* `ids` order) are left out; `fixed` ids keep their layer.
|
|
24
|
+
*/
|
|
25
|
+
export function rankLayers(ids: readonly string[], edges: readonly (readonly [string, string])[], fixed: ReadonlyMap<string, number>): Map<string, number> {
|
|
26
|
+
const known = new Set(ids);
|
|
27
|
+
const all = new Map<string, string[]>(ids.map((id) => [id, []]));
|
|
28
|
+
for (const [a, b] of edges) if (a !== b && known.has(a) && known.has(b) && !all.get(a)?.includes(b)) all.get(a)?.push(b);
|
|
29
|
+
const back = new Set<string>();
|
|
30
|
+
const seen = new Map<string, 1 | 2>();
|
|
31
|
+
for (const root of ids) {
|
|
32
|
+
if (seen.has(root)) continue;
|
|
33
|
+
seen.set(root, 1);
|
|
34
|
+
const stack: [string, number][] = [[root, 0]];
|
|
35
|
+
while (stack.length) {
|
|
36
|
+
const top = stack[stack.length - 1] as [string, number];
|
|
37
|
+
const ss = all.get(top[0]) ?? [];
|
|
38
|
+
if (top[1] < ss.length) {
|
|
39
|
+
const s = ss[top[1]++] as string;
|
|
40
|
+
const st = seen.get(s);
|
|
41
|
+
if (st === 1) back.add(pairKey(top[0], s));
|
|
42
|
+
else if (!st) {
|
|
43
|
+
seen.set(s, 1);
|
|
44
|
+
stack.push([s, 0]);
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
seen.set(top[0], 2);
|
|
48
|
+
stack.pop();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const succ = new Map<string, string[]>(ids.map((id) => [id, []]));
|
|
53
|
+
const pred = new Map<string, string[]>(ids.map((id) => [id, []]));
|
|
54
|
+
for (const [a, ss] of all) {
|
|
55
|
+
for (const b of ss) {
|
|
56
|
+
if (back.has(pairKey(a, b))) continue;
|
|
57
|
+
succ.get(a)?.push(b);
|
|
58
|
+
pred.get(b)?.push(a);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Longest path, in topological order (Kahn's).
|
|
62
|
+
const indeg = new Map(ids.map((id) => [id, pred.get(id)?.length ?? 0]));
|
|
63
|
+
const queue = ids.filter((id) => !indeg.get(id));
|
|
64
|
+
const layer = new Map<string, number>();
|
|
65
|
+
for (let q = queue.shift(); q !== undefined; q = queue.shift()) {
|
|
66
|
+
layer.set(q, fixed.get(q) ?? Math.max(0, ...(pred.get(q) ?? []).map((p) => (layer.get(p) ?? 0) + 1)));
|
|
67
|
+
for (const s of succ.get(q) ?? []) {
|
|
68
|
+
indeg.set(s, (indeg.get(s) ?? 0) - 1);
|
|
69
|
+
if (!indeg.get(s)) queue.push(s);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return layer;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Pairs (a, b) between adjacent layers that cross, for the order `pos`. */
|
|
76
|
+
function crossings(rows: readonly string[][], links: readonly (readonly [string, string])[], pos: ReadonlyMap<string, number>, layerOf: ReadonlyMap<string, number>): number {
|
|
77
|
+
let n = 0;
|
|
78
|
+
const by = new Map<number, [number, number][]>();
|
|
79
|
+
for (const [a, b] of links) {
|
|
80
|
+
const l = layerOf.get(a);
|
|
81
|
+
if (l === undefined) continue;
|
|
82
|
+
push(by, l, [pos.get(a) ?? 0, pos.get(b) ?? 0]);
|
|
83
|
+
}
|
|
84
|
+
for (const ls of by.values())
|
|
85
|
+
for (let i = 0; i < ls.length; i++)
|
|
86
|
+
for (let j = i + 1; j < ls.length; j++) {
|
|
87
|
+
const [a1, b1] = ls[i] as [number, number];
|
|
88
|
+
const [a2, b2] = ls[j] as [number, number];
|
|
89
|
+
if ((a1 - a2) * (b1 - b2) < 0) n++;
|
|
90
|
+
}
|
|
91
|
+
return rows.length ? n : 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** True for a point where an edge crosses a layer. */
|
|
95
|
+
export const isPoint = (id: string): boolean => id.startsWith('~');
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The order within each layer that reduces crossings: barycentre sweeps, down and
|
|
99
|
+
* up, four times, keeping the best. `links` join a slot to one in the next layer.
|
|
100
|
+
* With `keep`, those ids keep their order (a previous layout's, new ones after
|
|
101
|
+
* them) and only the other slots (the points) move between them.
|
|
102
|
+
*/
|
|
103
|
+
export function orderRows(rows: string[][], links: readonly (readonly [string, string])[], keep: boolean): string[][] {
|
|
104
|
+
const layerOf = new Map<string, number>();
|
|
105
|
+
rows.forEach((row, i) => row.forEach((id) => layerOf.set(id, i)));
|
|
106
|
+
const pred = new Map<string, string[]>();
|
|
107
|
+
const succ = new Map<string, string[]>();
|
|
108
|
+
for (const [a, b] of links) {
|
|
109
|
+
push(succ, a, b);
|
|
110
|
+
push(pred, b, a);
|
|
111
|
+
}
|
|
112
|
+
const pos = new Map<string, number>();
|
|
113
|
+
const fix = (row: readonly string[]) => row.forEach((id, i) => pos.set(id, i));
|
|
114
|
+
const cur = rows.map((r) => [...r]);
|
|
115
|
+
cur.forEach(fix);
|
|
116
|
+
const score = () => crossings(cur, links, pos, layerOf);
|
|
117
|
+
let best = cur.map((r) => [...r]);
|
|
118
|
+
let bestN = score();
|
|
119
|
+
const sortRow = (row: string[], near: Map<string, string[]>): string[] => {
|
|
120
|
+
const bc = new Map<string, number>();
|
|
121
|
+
for (const id of row) {
|
|
122
|
+
const ps = (near.get(id) ?? []).map((p) => pos.get(p)).filter((x): x is number => x !== undefined);
|
|
123
|
+
bc.set(id, ps.length ? ps.reduce((a, b) => a + b, 0) / ps.length : (pos.get(id) ?? 0));
|
|
124
|
+
}
|
|
125
|
+
const at = (id: string) => bc.get(id) ?? 0;
|
|
126
|
+
if (!keep) return [...row].sort((a, b) => at(a) - at(b) || (pos.get(a) ?? 0) - (pos.get(b) ?? 0));
|
|
127
|
+
// The kept ids stay in their order; each point goes before the first kept id it is left of.
|
|
128
|
+
const fixed = row.filter((id) => !isPoint(id));
|
|
129
|
+
const points = row.filter(isPoint).sort((a, b) => at(a) - at(b) || (pos.get(a) ?? 0) - (pos.get(b) ?? 0));
|
|
130
|
+
const out: string[] = [];
|
|
131
|
+
let p = 0;
|
|
132
|
+
for (const id of fixed) {
|
|
133
|
+
while (p < points.length && at(points[p] as string) < at(id)) out.push(points[p++] as string);
|
|
134
|
+
out.push(id);
|
|
135
|
+
}
|
|
136
|
+
return [...out, ...points.slice(p)];
|
|
137
|
+
};
|
|
138
|
+
for (let sweep = 0; sweep < 4; sweep++) {
|
|
139
|
+
const down = sweep % 2 === 0;
|
|
140
|
+
const order = down ? cur.map((_, i) => i).slice(1) : cur.map((_, i) => i).reverse().slice(1);
|
|
141
|
+
for (const i of order) {
|
|
142
|
+
const row = sortRow(cur[i] as string[], down ? pred : succ);
|
|
143
|
+
cur[i] = row;
|
|
144
|
+
fix(row);
|
|
145
|
+
}
|
|
146
|
+
const n = score();
|
|
147
|
+
if (n < bestN) {
|
|
148
|
+
bestN = n;
|
|
149
|
+
best = cur.map((r) => [...r]);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return score() <= bestN ? cur : best;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** What `arrange` reads of a graph: ids, where each node is, and the links. */
|
|
156
|
+
export interface GraphShape {
|
|
157
|
+
nodes: readonly Pick<GraphNodeInput, 'id' | 'cluster'>[];
|
|
158
|
+
clusters: readonly (Pick<GraphClusterInput, 'id' | 'parent'> & { cycle?: boolean })[];
|
|
159
|
+
edges: readonly Pick<GraphEdgeInput, 'from' | 'to' | 'style' | 'ranks'>[];
|
|
160
|
+
stubs: readonly Pick<GraphStubInput, 'id' | 'to' | 'style'>[];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const arranged = new WeakMap<GraphShape, { prev: GraphOrder | undefined; down: boolean; out: Arrangement }[]>();
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* The order of `g`'s drawing: each container's layers (the top level, then each
|
|
167
|
+
* cluster, a cluster being one item of its parent), the order within each layer,
|
|
168
|
+
* and the slots each edge passes. Pass a previous `order` of the same graph as
|
|
169
|
+
* `prev` to keep its items where they are (new ones are appended to their layer);
|
|
170
|
+
* `down` lays out the edge paths for a drawing top to bottom (a cluster's label is then on
|
|
171
|
+
* the side its edges come in). The same `g`, `prev` and `down` give the same object.
|
|
172
|
+
*/
|
|
173
|
+
export function arrange(g: GraphShape, prev?: GraphOrder, down = false): Arrangement {
|
|
174
|
+
const seen = arranged.get(g) ?? [];
|
|
175
|
+
const hit = seen.find((x) => x.prev === prev && x.down === down);
|
|
176
|
+
if (hit) return hit.out;
|
|
177
|
+
const out = arrangeNew(g, prev, down);
|
|
178
|
+
arranged.set(g, [...seen.slice(-3), { prev, down, out }]);
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function arrangeNew(g: GraphShape, prev: GraphOrder | undefined, down: boolean): Arrangement {
|
|
183
|
+
const clusterIds = new Set(g.clusters.map((c) => c.id));
|
|
184
|
+
const parentOf = new Map(g.clusters.map((c) => [c.id, c.parent]));
|
|
185
|
+
const boxOf = new Map<string, string>(); // node id -> its innermost cluster
|
|
186
|
+
for (const n of g.nodes) if (n.cluster) boxOf.set(n.id, n.cluster);
|
|
187
|
+
const stubIds = [...new Set(g.stubs.map((s) => s.id))];
|
|
188
|
+
const isStub = new Set(stubIds);
|
|
189
|
+
|
|
190
|
+
// The clusters an id sits in, innermost first (for a cluster id, itself first).
|
|
191
|
+
const boxPath = (id: string): string[] => {
|
|
192
|
+
const out: string[] = [];
|
|
193
|
+
let b: string | null = clusterIds.has(id) ? id : (boxOf.get(id) ?? null);
|
|
194
|
+
while (b) {
|
|
195
|
+
out.push(b);
|
|
196
|
+
b = parentOf.get(b) ?? null;
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
};
|
|
200
|
+
// The direct child of `container` (a cluster, or '' for the top level) that holds a node `id`.
|
|
201
|
+
const itemIn = (id: string, container: string): string | undefined => {
|
|
202
|
+
const bp = boxPath(id);
|
|
203
|
+
if (container === '') return bp[bp.length - 1] ?? id;
|
|
204
|
+
const i = bp.indexOf(container);
|
|
205
|
+
return i < 0 ? undefined : i === 0 ? id : bp[i - 1];
|
|
206
|
+
};
|
|
207
|
+
// The deepest cluster holding both ends of an edge (the top level when none).
|
|
208
|
+
const commonBox = (a: string, b: string): string => {
|
|
209
|
+
const bp = boxPath(a);
|
|
210
|
+
return bp.find((x) => boxPath(b).includes(x)) ?? '';
|
|
211
|
+
};
|
|
212
|
+
// The container a slot is in: a stub's is the top level.
|
|
213
|
+
const containerOf = (id: string): string => (isStub.has(id) ? '' : (boxOf.get(id) ?? ''));
|
|
214
|
+
|
|
215
|
+
// Layers, by container: the top level, then each cluster (its own nodes and the
|
|
216
|
+
// clusters nested in it). Each cluster is one item of its parent.
|
|
217
|
+
const containers = ['', ...g.clusters.map((c) => c.id)];
|
|
218
|
+
const kidsOf = new Map<string, string[]>(containers.map((c) => [c, []]));
|
|
219
|
+
for (const { id } of g.nodes) {
|
|
220
|
+
for (const c of containers) {
|
|
221
|
+
const it = itemIn(id, c);
|
|
222
|
+
if (it !== undefined && !kidsOf.get(c)?.includes(it)) kidsOf.get(c)?.push(it);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const lay = new Map<string, Map<string, number>>();
|
|
226
|
+
for (const c of containers) {
|
|
227
|
+
const kids = kidsOf.get(c) ?? [];
|
|
228
|
+
const prevRows = c === '' ? prev?.layers : prev?.clusters[c];
|
|
229
|
+
const fixed = new Map<string, number>();
|
|
230
|
+
prevRows?.forEach((row, i) => row.forEach((id) => kids.includes(id) && fixed.set(id, i)));
|
|
231
|
+
// An edge that closes a cycle does not set the layers.
|
|
232
|
+
const es = g.edges
|
|
233
|
+
.filter((e) => e.ranks && commonBox(e.from, e.to) === c)
|
|
234
|
+
.map((e) => [itemIn(e.from, c) as string, itemIn(e.to, c) as string] as const);
|
|
235
|
+
lay.set(c, rankLayers(kids, es, fixed));
|
|
236
|
+
}
|
|
237
|
+
// Stubs, in the top level: in the layer before the first they lead to (a new first layer when that is the first).
|
|
238
|
+
const top = lay.get('') as Map<string, number>;
|
|
239
|
+
const prevTop = new Map<string, number>();
|
|
240
|
+
prev?.layers.forEach((row, i) => row.forEach((id) => prevTop.set(id, i)));
|
|
241
|
+
const stubAt = new Map(
|
|
242
|
+
stubIds.map((id) => [id, prevTop.get(id) ?? Math.min(...g.stubs.filter((s) => s.id === id).map((s) => top.get(itemIn(s.to, '') as string) ?? 0)) - 1]),
|
|
243
|
+
);
|
|
244
|
+
if ([...stubAt.values()].some((l) => l < 0)) {
|
|
245
|
+
for (const [id, l] of top) top.set(id, l + 1);
|
|
246
|
+
for (const [id, l] of stubAt) stubAt.set(id, l + 1);
|
|
247
|
+
}
|
|
248
|
+
for (const [id, l] of stubAt) top.set(id, l);
|
|
249
|
+
const layerOf = (c: string, id: string): number => lay.get(c)?.get(id) ?? 0;
|
|
250
|
+
const lastLayer = (c: string): number => Math.max(0, ...(lay.get(c)?.values() ?? []));
|
|
251
|
+
|
|
252
|
+
// Every edge whose end is not in a later layer than its start goes back: not drawn.
|
|
253
|
+
const isBack = (from: string, to: string): boolean => {
|
|
254
|
+
const c = commonBox(from, to);
|
|
255
|
+
return layerOf(c, itemIn(from, c) as string) >= layerOf(c, itemIn(to, c) as string);
|
|
256
|
+
};
|
|
257
|
+
const back = g.edges.map((e) => isBack(e.from, e.to));
|
|
258
|
+
|
|
259
|
+
// Each container's rows: its items by layer, a previous order kept, new items after it.
|
|
260
|
+
const rows = new Map<string, string[][]>();
|
|
261
|
+
for (const c of containers) {
|
|
262
|
+
const prevRows = c === '' ? prev?.layers : prev?.clusters[c];
|
|
263
|
+
const kept = (prevRows ?? []).flat();
|
|
264
|
+
const ids = [...(c === '' ? [...stubIds] : []), ...(kidsOf.get(c) ?? [])];
|
|
265
|
+
ids.sort((a, b) => {
|
|
266
|
+
const ka = kept.indexOf(a);
|
|
267
|
+
const kb = kept.indexOf(b);
|
|
268
|
+
return (ka < 0 ? Infinity : ka) - (kb < 0 ? Infinity : kb);
|
|
269
|
+
});
|
|
270
|
+
const r: string[][] = Array.from({ length: lastLayer(c) + 1 }, () => []);
|
|
271
|
+
for (const id of ids) r[layerOf(c, id)]?.push(id);
|
|
272
|
+
rows.set(c, r);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Edge paths: the drawn edges through points on the layers they cross. The points of
|
|
276
|
+
// edges from one place (of one style) are shared, so their lines run as one.
|
|
277
|
+
const edgePaths: Arrangement['edgePaths'] = [];
|
|
278
|
+
const points = new Set<string>();
|
|
279
|
+
const point = (c: string, origin: string, style: string, l: number): EdgePathStep => {
|
|
280
|
+
const id = `~${c}|${origin}|${style}|${l}`;
|
|
281
|
+
if (!points.has(id)) {
|
|
282
|
+
points.add(id);
|
|
283
|
+
rows.get(c)?.[l]?.push(id);
|
|
284
|
+
}
|
|
285
|
+
return { id, in: c };
|
|
286
|
+
};
|
|
287
|
+
// A point beside a cluster, in its layer of the container around it: an edge that leaves or
|
|
288
|
+
// enters the cluster through its side, between two of its layers, passes there.
|
|
289
|
+
const byPoint = (c: string, box: string, origin: string, style: string): EdgePathStep => {
|
|
290
|
+
const l = layerOf(c, box);
|
|
291
|
+
const id = `~${c}|by:${box}|${origin}|${style}|${l}`;
|
|
292
|
+
if (!points.has(id)) {
|
|
293
|
+
points.add(id);
|
|
294
|
+
rows.get(c)?.[l]?.push(id);
|
|
295
|
+
}
|
|
296
|
+
return { id, in: c };
|
|
297
|
+
};
|
|
298
|
+
// An edge enters a cluster at its near side only to reach the cluster's first layer (and,
|
|
299
|
+
// top to bottom, not even then: the cluster's label is on that side); else through its
|
|
300
|
+
// side, next to the layer it goes to. It leaves at the far side only from the cluster's
|
|
301
|
+
// last layer, else through its side. So it runs inside a cluster only where it starts or ends.
|
|
302
|
+
const edgePath = (from: string, to: string, style: EdgeStyle): EdgePathStep[] => {
|
|
303
|
+
const c = isStub.has(from) ? '' : commonBox(from, to);
|
|
304
|
+
let curIn = containerOf(from);
|
|
305
|
+
let cur = from;
|
|
306
|
+
const steps: EdgePathStep[] = [{ id: from, in: curIn }];
|
|
307
|
+
// Out of the clusters around the source, up to the common container.
|
|
308
|
+
while (curIn !== c) {
|
|
309
|
+
const up = parentOf.get(curIn) ?? '';
|
|
310
|
+
steps.push({ id: curIn, in: up });
|
|
311
|
+
if (layerOf(curIn, cur) < lastLayer(curIn)) steps.push(byPoint(up, curIn, cur, style));
|
|
312
|
+
cur = curIn;
|
|
313
|
+
curIn = up;
|
|
314
|
+
}
|
|
315
|
+
// Across the common container, then into the clusters around the target.
|
|
316
|
+
const target = itemIn(to, c) as string;
|
|
317
|
+
for (let l = layerOf(c, cur) + 1; l < layerOf(c, target); l++) steps.push(point(c, cur, style, l));
|
|
318
|
+
const bp = boxPath(to);
|
|
319
|
+
const inward = bp.slice(0, c === '' ? bp.length : bp.indexOf(c)).reverse();
|
|
320
|
+
const origin = `>${c}:${cur}`;
|
|
321
|
+
let k = c;
|
|
322
|
+
for (const box of inward) {
|
|
323
|
+
const n = itemIn(to, box) as string;
|
|
324
|
+
if (layerOf(box, n) > 0 || down) steps.push(byPoint(k, box, origin, style));
|
|
325
|
+
steps.push({ id: box, in: k });
|
|
326
|
+
k = box;
|
|
327
|
+
}
|
|
328
|
+
steps.push({ id: to, in: k });
|
|
329
|
+
return steps;
|
|
330
|
+
};
|
|
331
|
+
g.edges.forEach((e, i) => {
|
|
332
|
+
if (!back[i]) edgePaths.push({ from: e.from, to: e.to, style: e.style, steps: edgePath(e.from, e.to, e.style) });
|
|
333
|
+
});
|
|
334
|
+
for (const s of g.stubs) edgePaths.push({ from: s.id, to: s.to, style: s.style, steps: edgePath(s.id, s.to, s.style) });
|
|
335
|
+
|
|
336
|
+
// The order within each layer.
|
|
337
|
+
const slots: Record<string, string[][]> = {};
|
|
338
|
+
for (const c of containers) {
|
|
339
|
+
const links: [string, string][] = [];
|
|
340
|
+
const lv = new Map((rows.get(c) ?? []).flatMap((r, i) => r.map((id) => [id, i] as const)));
|
|
341
|
+
for (const r of edgePaths)
|
|
342
|
+
for (let i = 1; i < r.steps.length; i++) {
|
|
343
|
+
const a = r.steps[i - 1] as EdgePathStep;
|
|
344
|
+
const b = r.steps[i] as EdgePathStep;
|
|
345
|
+
if (a.in === c && b.in === c && lv.get(a.id) !== lv.get(b.id)) links.push([a.id, b.id]);
|
|
346
|
+
}
|
|
347
|
+
const hasPrev = c === '' ? !!prev : !!prev?.clusters[c];
|
|
348
|
+
// A point beside a cluster is right after it.
|
|
349
|
+
slots[c] = orderRows(rows.get(c) ?? [], links, hasPrev).map((row) => {
|
|
350
|
+
const by = row.filter((id) => id.includes('|by:'));
|
|
351
|
+
const rest = row.filter((id) => !id.includes('|by:'));
|
|
352
|
+
return rest.flatMap((id) => [id, ...by.filter((p) => p.includes(`|by:${id}|`))]);
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
const real = (r: readonly string[][]) => r.map((row) => row.filter((id) => !isPoint(id)));
|
|
356
|
+
const clusters = g.clusters.map((c) => ({ id: c.id, parent: c.parent, cycle: !!c.cycle, layers: real(slots[c.id] ?? []).filter((r) => r.length) }));
|
|
357
|
+
const outerRows = real(slots[''] ?? []).map((row) => row.filter((id) => !isStub.has(id)));
|
|
358
|
+
const byId = new Map(clusters.map((c) => [c.id, c]));
|
|
359
|
+
// Every node id, in drawing order: expand each cluster to the nodes nested in it.
|
|
360
|
+
const expand = (ids: readonly string[]): string[] =>
|
|
361
|
+
ids.flatMap((id) => (clusterIds.has(id) ? expand((byId.get(id)?.layers ?? []).flat()) : [id]));
|
|
362
|
+
return {
|
|
363
|
+
drawn: expand(outerRows.flat()),
|
|
364
|
+
layers: outerRows.filter((r) => r.length),
|
|
365
|
+
clusters,
|
|
366
|
+
back,
|
|
367
|
+
slots,
|
|
368
|
+
edgePaths,
|
|
369
|
+
order: { layers: real(slots[''] ?? []), clusters: Object.fromEntries(clusters.map((c) => [c.id, real(slots[c.id] ?? [])])) },
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* How many layers the drawing spans along its flow, and how many items it stacks across
|
|
375
|
+
* it at most, counting a cluster as what it holds: an estimate of the drawing's shape,
|
|
376
|
+
* before it is measured (`span` items wide left to right, `stack` items high).
|
|
377
|
+
*/
|
|
378
|
+
export function extentOf(a: Pick<Arrangement, 'layers' | 'clusters'>): { span: number; stack: number } {
|
|
379
|
+
const byId = new Map(a.clusters.map((c) => [c.id, c]));
|
|
380
|
+
const memo = new Map<string, { span: number; stack: number }>();
|
|
381
|
+
const of = (layers: readonly string[][]): { span: number; stack: number } => {
|
|
382
|
+
let span = 0;
|
|
383
|
+
let stack = 0;
|
|
384
|
+
for (const row of layers) {
|
|
385
|
+
let deep = 0;
|
|
386
|
+
let across = 0;
|
|
387
|
+
for (const id of row) {
|
|
388
|
+
const c = byId.get(id);
|
|
389
|
+
const e = c ? (memo.get(id) ?? memo.set(id, of(c.layers)).get(id) ?? { span: 1, stack: 1 }) : { span: 1, stack: 1 };
|
|
390
|
+
deep = Math.max(deep, e.span);
|
|
391
|
+
across += e.stack;
|
|
392
|
+
}
|
|
393
|
+
span += deep;
|
|
394
|
+
stack = Math.max(stack, across);
|
|
395
|
+
}
|
|
396
|
+
return { span, stack };
|
|
397
|
+
};
|
|
398
|
+
return of(a.layers);
|
|
399
|
+
}
|