@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,143 @@
|
|
|
1
|
+
import { LitElement, html, nothing, type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
+
import { property } from 'lit/decorators.js';
|
|
3
|
+
import { repeat } from 'lit/directives/repeat.js';
|
|
4
|
+
import { withDefaults } from '../core/strings.js';
|
|
5
|
+
import { legend, legendStyles, type LegendItem } from '../primitives/legend.js';
|
|
6
|
+
import { base } from '../styles/index.js';
|
|
7
|
+
import { barBox, fitRange, stack } from './stack.js';
|
|
8
|
+
import { lanesStyles } from './styles.js';
|
|
9
|
+
import { DEFAULT_LANES_STRINGS, type Lane, type LaneStyle, type LanesStrings, type TimeRange } from './types.js';
|
|
10
|
+
|
|
11
|
+
/** A span shorter than this shows seconds on its axis (else every tick reads the same minute). */
|
|
12
|
+
const SECONDS_BELOW_MS = 10 * 60e3;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Bars on a time axis, a lane per group: each bar as long as it took, the
|
|
16
|
+
* overlapping bars of a lane stacked, a running bar (`end` null) growing until
|
|
17
|
+
* now and a line at now. A bar's look is its style in `barStyles`, whose
|
|
18
|
+
* labels are the legend (a row per `group`). The bars grow in when they are
|
|
19
|
+
* first drawn.
|
|
20
|
+
*
|
|
21
|
+
* Its look: `--cae-lanes-label-width` (the lanes' labels; 112px, 78px on a
|
|
22
|
+
* narrow screen) and the parts.
|
|
23
|
+
*
|
|
24
|
+
* @tagname cae-lanes
|
|
25
|
+
* @csspart axis - the times above the lanes
|
|
26
|
+
* @csspart lane - each lane
|
|
27
|
+
* @csspart lane-label - a lane's label
|
|
28
|
+
* @csspart track - the area of a lane's bars
|
|
29
|
+
* @csspart bar - each bar
|
|
30
|
+
* @csspart now - the line at now, while a bar runs
|
|
31
|
+
* @csspart legend - each row of the legend
|
|
32
|
+
* @csspart empty - what the element shows with no bars
|
|
33
|
+
* @slot empty - what the element shows with no bars, instead of `strings.empty`
|
|
34
|
+
*/
|
|
35
|
+
export class CaeLanes extends LitElement {
|
|
36
|
+
static override styles = [base, legendStyles, lanesStyles];
|
|
37
|
+
|
|
38
|
+
@property({ attribute: false }) lanes: readonly Lane[] = [];
|
|
39
|
+
/** A look per style key of the bars, in legend order. */
|
|
40
|
+
@property({ attribute: false }) barStyles: Readonly<Record<string, LaneStyle>> = {};
|
|
41
|
+
/** The time the axis spans; null fits the bars (`fitRange`). */
|
|
42
|
+
@property({ attribute: false }) range: TimeRange | null = null;
|
|
43
|
+
/** Draws again every second, so the running bars and the line at now move. */
|
|
44
|
+
@property({ type: Boolean }) live = false;
|
|
45
|
+
/** Bars the host left out, as a note after the legend. */
|
|
46
|
+
@property({ type: Number }) omitted = 0;
|
|
47
|
+
/** The language of the axis' times; by default the page's (`lang`). */
|
|
48
|
+
@property() locale = '';
|
|
49
|
+
@property({ attribute: false }) strings: Partial<LanesStrings> = {};
|
|
50
|
+
|
|
51
|
+
private timer: ReturnType<typeof setInterval> | null = null;
|
|
52
|
+
/** The bars have been drawn once: later bars do not grow in. */
|
|
53
|
+
private drawn = false;
|
|
54
|
+
|
|
55
|
+
override connectedCallback(): void {
|
|
56
|
+
super.connectedCallback();
|
|
57
|
+
this.tick(this.live);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
override disconnectedCallback(): void {
|
|
61
|
+
super.disconnectedCallback();
|
|
62
|
+
this.tick(false);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
protected override updated(changed: PropertyValues<this>): void {
|
|
66
|
+
if (changed.has('live')) this.tick(this.live);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private tick(on: boolean): void {
|
|
70
|
+
if (on && !this.timer) this.timer = setInterval(() => this.requestUpdate(), 1000);
|
|
71
|
+
if (!on && this.timer) {
|
|
72
|
+
clearInterval(this.timer);
|
|
73
|
+
this.timer = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private time(t: number, seconds: boolean): string {
|
|
78
|
+
const locale = this.locale || document.documentElement.lang || undefined;
|
|
79
|
+
return new Date(t).toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit', ...(seconds ? { second: '2-digit' } : {}), hourCycle: 'h23' });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
override render() {
|
|
83
|
+
const s = withDefaults(DEFAULT_LANES_STRINGS, this.strings);
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
const range = this.range ?? fitRange(this.lanes, now);
|
|
86
|
+
if (!range) return html`<div part="empty"><slot name="empty">${s.empty}</slot></div>`;
|
|
87
|
+
const animate = !this.drawn;
|
|
88
|
+
this.drawn = true;
|
|
89
|
+
const span = Math.max(1, range.end - range.start);
|
|
90
|
+
const running = this.lanes.some((l) => l.bars.some((b) => b.end === null));
|
|
91
|
+
const seconds = span < SECONDS_BELOW_MS;
|
|
92
|
+
const nowAt = Math.min(1, (now - range.start) / span);
|
|
93
|
+
return html`<div class="lanes ${animate ? 'anim' : ''}">
|
|
94
|
+
<div class="axis" part="axis">${[0, 0.25, 0.5, 0.75, 1].map((k) => html`<span>${this.time(range.start + span * k, seconds)}</span>`)}</div>
|
|
95
|
+
${repeat(this.lanes, (l) => l.id, (l) => this.lane(l, range, now))}
|
|
96
|
+
${running
|
|
97
|
+
? html`<span class="now" part="now" style="left:calc(var(--label) + 8px + (100% - var(--label) - 8px) * ${nowAt.toFixed(4)})"></span>`
|
|
98
|
+
: nothing}
|
|
99
|
+
</div>
|
|
100
|
+
${this.legends(s)}`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private lane(l: Lane, range: TimeRange, now: number): TemplateResult {
|
|
104
|
+
const placed = stack(l.bars);
|
|
105
|
+
const rows = Math.max(1, ...placed.map((p) => p.row + 1));
|
|
106
|
+
return html`<div class="lane" part="lane">
|
|
107
|
+
<span class="name" part="lane-label" title=${l.label}>${l.label}</span>
|
|
108
|
+
<div class="track" part="track" style="--rows:${rows}">
|
|
109
|
+
${placed.map(({ bar, row }) => {
|
|
110
|
+
const box = barBox(bar, range, now);
|
|
111
|
+
const look = this.barStyles[bar.style];
|
|
112
|
+
return html`<span class="bar ${bar.end === null ? 'running' : ''}" part="bar" data-style=${bar.style}
|
|
113
|
+
data-pattern=${look?.pattern ?? 'solid'} title=${bar.label}
|
|
114
|
+
style="--bar:${look?.color ?? 'var(--line2)'};--row:${row};left:min(${box.left.toFixed(3)}%, 100% - max(3px, ${box.width.toFixed(3)}%));width:${box.width.toFixed(3)}%"></span>`;
|
|
115
|
+
})}
|
|
116
|
+
</div>
|
|
117
|
+
</div>`;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** A legend row per group of styles, in key order; the note of omitted bars ends the last. */
|
|
121
|
+
private legends(s: LanesStrings): TemplateResult[] {
|
|
122
|
+
const groups: LegendItem[][] = [];
|
|
123
|
+
for (const look of Object.values(this.barStyles)) {
|
|
124
|
+
const g = look.group ?? 0;
|
|
125
|
+
(groups[g] ??= []).push({
|
|
126
|
+
label: look.label,
|
|
127
|
+
icon: html`<i data-pattern=${look.pattern ?? 'solid'} style="--bar:${look.color}"></i>`,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
const rows = groups.filter(Boolean);
|
|
131
|
+
if (this.omitted) {
|
|
132
|
+
if (!rows.length) rows.push([]);
|
|
133
|
+
rows[rows.length - 1]!.push({ label: s.omitted(this.omitted) });
|
|
134
|
+
}
|
|
135
|
+
return rows.map((items) => legend(items));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
declare global {
|
|
140
|
+
interface HTMLElementTagNameMap {
|
|
141
|
+
'cae-lanes': CaeLanes;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Where the bars of `<cae-lanes>` go: their row in a lane, their box on the
|
|
2
|
+
// axis, and the axis when the host does not set one. Pure.
|
|
3
|
+
import type { Lane, TimeRange } from './types.js';
|
|
4
|
+
|
|
5
|
+
interface Span {
|
|
6
|
+
start: number;
|
|
7
|
+
end: number | null;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The bars of a lane in order of start, each on the first row whose last bar
|
|
12
|
+
* has ended, so overlapping bars do not hide each other. A running bar (`end`
|
|
13
|
+
* null) keeps its row.
|
|
14
|
+
*/
|
|
15
|
+
export function stack<B extends Span>(bars: readonly B[]): { bar: B; row: number }[] {
|
|
16
|
+
const ends: number[] = [];
|
|
17
|
+
return [...bars]
|
|
18
|
+
.sort((a, b) => a.start - b.start)
|
|
19
|
+
.map((bar) => {
|
|
20
|
+
const end = bar.end ?? Infinity;
|
|
21
|
+
let row = ends.findIndex((e) => e <= bar.start);
|
|
22
|
+
if (row < 0) row = ends.push(end) - 1;
|
|
23
|
+
else ends[row] = end;
|
|
24
|
+
return { bar, row };
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** A running bar extends the axis to now plus this margin, rounded up to `STEP_MS`. */
|
|
29
|
+
const MARGIN_MS = 20e3;
|
|
30
|
+
const STEP_MS = 60e3;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The axis that fits the bars: from the first start to the last end; with a
|
|
34
|
+
* running bar, to `now` plus 20 seconds, rounded up to the minute. Null with no bars.
|
|
35
|
+
*/
|
|
36
|
+
export function fitRange(lanes: readonly Lane[], now: number): TimeRange | null {
|
|
37
|
+
const bars = lanes.flatMap((l) => l.bars);
|
|
38
|
+
if (!bars.length) return null;
|
|
39
|
+
const start = Math.min(...bars.map((b) => b.start));
|
|
40
|
+
const running = bars.some((b) => b.end === null);
|
|
41
|
+
const end = running ? start + Math.ceil((now - start + MARGIN_MS) / STEP_MS) * STEP_MS : Math.max(...bars.map((b) => b.end ?? now));
|
|
42
|
+
return { start, end };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** A bar's left edge and width, in percent of the range; a running bar grows to `now`, within the range. */
|
|
46
|
+
export function barBox(b: Span, range: TimeRange, now: number): { left: number; width: number } {
|
|
47
|
+
const span = Math.max(1, range.end - range.start);
|
|
48
|
+
const left = ((b.start - range.start) / span) * 100;
|
|
49
|
+
const w = (((b.end ?? now) - b.start) / span) * 100;
|
|
50
|
+
return { left, width: Math.max(0.4, b.end === null ? Math.min(100 - left, w) : w) };
|
|
51
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// The look of `<cae-lanes>`: a label column, then a track per lane with its
|
|
2
|
+
// bars; a bar's look is its colour (`--bar`) and its pattern (`data-pattern`),
|
|
3
|
+
// the same on the bar and on its swatch in the legend.
|
|
4
|
+
import { css } from 'lit';
|
|
5
|
+
|
|
6
|
+
export const lanesStyles = css`
|
|
7
|
+
:host { display: block; container-type: inline-size; --label: var(--cae-lanes-label-width, 112px); }
|
|
8
|
+
/* narrow (the host is a container): a narrower label column, and the axis' first, middle and last times only */
|
|
9
|
+
@container (max-width: 760px) { .lanes { --label: var(--cae-lanes-label-width, 78px); } }
|
|
10
|
+
@container (max-width: 480px) { .axis span:nth-child(even) { display: none; } }
|
|
11
|
+
.lanes { position: relative; }
|
|
12
|
+
.axis { display: flex; justify-content: space-between; font-family: var(--mono); font-size: 10px; color: var(--text-muted); margin: 0 0 6px calc(var(--label) + 8px); }
|
|
13
|
+
.lane { display: grid; grid-template-columns: var(--label) minmax(0, 1fr); gap: 8px; align-items: center; min-height: 24px; padding: 4px 0; }
|
|
14
|
+
.name { font-size: 11.5px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
15
|
+
.track { position: relative; height: calc(var(--rows, 1) * 14px + 2px); border-radius: 4px;
|
|
16
|
+
background: repeating-linear-gradient(90deg, color-mix(in srgb, var(--text) 5%, transparent) 0 1px, transparent 1px 10%); }
|
|
17
|
+
.bar { position: absolute; top: calc(var(--row, 0) * 14px + 2px); height: 12px; border-radius: 4px; min-width: 3px; cursor: default;
|
|
18
|
+
transform-origin: left center; transition: width 1s linear; }
|
|
19
|
+
.anim .bar:not(.running) { animation: growx 0.6s var(--ease) both; }
|
|
20
|
+
:is(.bar, .legend i)[data-pattern] { background: var(--bar); }
|
|
21
|
+
:is(.bar, .legend i)[data-pattern='hatched'] { background: repeating-linear-gradient(135deg, var(--bar) 0 3px, color-mix(in srgb, var(--bar) 55%, var(--bg)) 3px 5px); }
|
|
22
|
+
:is(.bar, .legend i)[data-pattern='outline'] { background: none; box-shadow: inset 0 0 0 1.5px var(--bar); }
|
|
23
|
+
:is(.bar, .legend i)[data-pattern='striped'] { background: repeating-linear-gradient(45deg, var(--bar) 0 6px, color-mix(in srgb, var(--bar) 60%, var(--bg)) 6px 12px);
|
|
24
|
+
background-size: 17px 17px; }
|
|
25
|
+
.bar[data-pattern='striped'] { animation: stripes 0.8s linear infinite; box-shadow: 0 0 12px color-mix(in srgb, var(--bar) 45%, transparent); }
|
|
26
|
+
.bar:hover { filter: brightness(1.2); }
|
|
27
|
+
.now { position: absolute; top: -4px; bottom: -4px; width: 2px; background: var(--status-running); border-radius: 2px; box-shadow: 0 0 10px var(--status-running); }
|
|
28
|
+
.legend { margin-top: 10px; }
|
|
29
|
+
.legend + .legend { margin-top: 4px; }
|
|
30
|
+
`;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// What `<cae-lanes>` shows: bars on a time axis, a lane per group.
|
|
2
|
+
|
|
3
|
+
/** Something that took time: from `start` to `end` (epoch ms); `end` null while it runs. */
|
|
4
|
+
export interface LaneBar {
|
|
5
|
+
id: string;
|
|
6
|
+
start: number;
|
|
7
|
+
/** Null: running, the bar grows to now. */
|
|
8
|
+
end: number | null;
|
|
9
|
+
/** The key of its look in the element's `barStyles`. */
|
|
10
|
+
style: string;
|
|
11
|
+
/** The bar's tooltip: one item per line. */
|
|
12
|
+
label: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** A row of bars; overlapping bars of a lane are stacked (`stack`). */
|
|
16
|
+
export interface Lane {
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
bars: readonly LaneBar[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** How a bar is filled: its colour, hatched, moving stripes, or only an outline. */
|
|
23
|
+
export type LanePattern = 'solid' | 'hatched' | 'striped' | 'outline';
|
|
24
|
+
|
|
25
|
+
/** A look of bars, and its entry in the legend. */
|
|
26
|
+
export interface LaneStyle {
|
|
27
|
+
label: string;
|
|
28
|
+
/** A CSS colour or `var(...)`. */
|
|
29
|
+
color: string;
|
|
30
|
+
pattern?: LanePattern;
|
|
31
|
+
/** The legend row of its entry (0, the first, by default). */
|
|
32
|
+
group?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface LanesStrings {
|
|
36
|
+
/** The note after the legend: bars the host left out. */
|
|
37
|
+
omitted: (n: number) => string;
|
|
38
|
+
/** No bars. */
|
|
39
|
+
empty: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const DEFAULT_LANES_STRINGS: LanesStrings = {
|
|
43
|
+
omitted: (n) => (n === 1 ? '1 bar not shown' : `${n} bars not shown`),
|
|
44
|
+
empty: 'No bars',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** The time the axis spans, epoch ms. */
|
|
48
|
+
export interface TimeRange {
|
|
49
|
+
start: number;
|
|
50
|
+
end: number;
|
|
51
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
2
|
+
import { property, state } from 'lit/decorators.js';
|
|
3
|
+
import { unsafeHTML } from 'lit/directives/unsafe-html.js';
|
|
4
|
+
import { withDefaults } from '../core/strings.js';
|
|
5
|
+
import { base, prose } from '../styles/index.js';
|
|
6
|
+
import { mdFile } from './markdown.js';
|
|
7
|
+
|
|
8
|
+
export interface MarkdownStrings {
|
|
9
|
+
/** The button that shows the text rendered. */
|
|
10
|
+
showRendered: string;
|
|
11
|
+
/** The button that shows the text as it is. */
|
|
12
|
+
showSource: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const DEFAULT_MARKDOWN_STRINGS: Readonly<MarkdownStrings> = { showRendered: 'Show rendered', showSource: 'Show source' };
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A markdown text with a rendered/source switch. `split` may take a leading line
|
|
19
|
+
* off the text, shown apart above the rendered body; the source is the text as
|
|
20
|
+
* it is.
|
|
21
|
+
*
|
|
22
|
+
* @tagname cae-markdown
|
|
23
|
+
* @csspart toggle - the rendered/source button
|
|
24
|
+
*/
|
|
25
|
+
export class CaeMarkdown extends LitElement {
|
|
26
|
+
static override styles = [
|
|
27
|
+
base,
|
|
28
|
+
prose,
|
|
29
|
+
css`
|
|
30
|
+
:host { display: block; }
|
|
31
|
+
/* A path or a URL has no break opportunity; it wraps inside the box instead of widening it. */
|
|
32
|
+
.md-p, .md-h, .md-li, .md-q { overflow-wrap: anywhere; }
|
|
33
|
+
.bar { display: flex; justify-content: flex-end; margin-bottom: 4px; }
|
|
34
|
+
`,
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
@property() text = '';
|
|
38
|
+
/** Takes a leading line off the text (`head`), shown apart above the rendered `body`. */
|
|
39
|
+
@property({ attribute: false }) split?: (text: string) => { head: string; body: string };
|
|
40
|
+
/** Marks up the rendered (escaped) HTML further, as `mdFile`'s `mark`. */
|
|
41
|
+
@property({ attribute: false }) transform?: (html: string) => string;
|
|
42
|
+
/** The visible words; English by default. */
|
|
43
|
+
@property({ attribute: false }) strings: Partial<MarkdownStrings> = {};
|
|
44
|
+
@state() private source = false;
|
|
45
|
+
|
|
46
|
+
override render() {
|
|
47
|
+
const s = withDefaults(DEFAULT_MARKDOWN_STRINGS, this.strings);
|
|
48
|
+
const { head, body } = this.split?.(this.text) ?? { head: '', body: this.text };
|
|
49
|
+
const rendered = mdFile(body, this.transform);
|
|
50
|
+
return html`<div class="bar">
|
|
51
|
+
<button type="button" class="df-tog" part="toggle" @click=${() => (this.source = !this.source)}>
|
|
52
|
+
${this.source ? s.showRendered : s.showSource}</button>
|
|
53
|
+
</div>
|
|
54
|
+
${this.source
|
|
55
|
+
? html`<pre class="df-text">${this.text}</pre>`
|
|
56
|
+
: html`${head ? html`<div class="md-tele jmono">${head}</div>` : nothing}${unsafeHTML(rendered)}`}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
declare global {
|
|
61
|
+
interface HTMLElementTagNameMap {
|
|
62
|
+
'cae-markdown': CaeMarkdown;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Syntax highlighting: a small tokenizer for what plugins and contracts contain
|
|
2
|
+
// (Python, JSON), no library. Returns escaped HTML: every token is escaped
|
|
3
|
+
// before it is wrapped, so no input can inject markup.
|
|
4
|
+
import { esc } from '../core/format.js';
|
|
5
|
+
|
|
6
|
+
const PY_KW = new Set(
|
|
7
|
+
'and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield'.split(
|
|
8
|
+
' ',
|
|
9
|
+
),
|
|
10
|
+
);
|
|
11
|
+
const PY_CONST = new Set(['None', 'True', 'False', 'self', 'cls']);
|
|
12
|
+
const PY_BUILTIN = new Set(
|
|
13
|
+
'str int float bool list dict set tuple bytes object type len range print isinstance super Optional Literal Any Union Path'.split(' '),
|
|
14
|
+
);
|
|
15
|
+
const PY_TOKEN = new RegExp(
|
|
16
|
+
[
|
|
17
|
+
'(#[^\\n]*)', // 1 comment
|
|
18
|
+
'((?:[rRbBfFuU]{0,2})(?:"""[\\s\\S]*?"""|\'\'\'[\\s\\S]*?\'\'\'))', // 2 triple-quoted string (docstrings)
|
|
19
|
+
'((?:[rRbBfFuU]{0,2})(?:"(?:[^"\\\\\\n]|\\\\.)*"|\'(?:[^\'\\\\\\n]|\\\\.)*\'))', // 3 string
|
|
20
|
+
'(@[A-Za-z_][\\w.]*)', // 4 decorator
|
|
21
|
+
'(\\b\\d[\\d_]*(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b)', // 5 number
|
|
22
|
+
'([A-Za-z_]\\w*)', // 6 name
|
|
23
|
+
].join('|'),
|
|
24
|
+
'g',
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
export function hlPython(src: string): string {
|
|
28
|
+
let out = '';
|
|
29
|
+
let last = 0;
|
|
30
|
+
let prevWord = '';
|
|
31
|
+
PY_TOKEN.lastIndex = 0;
|
|
32
|
+
for (let m = PY_TOKEN.exec(src); m; m = PY_TOKEN.exec(src)) {
|
|
33
|
+
out += esc(src.slice(last, m.index));
|
|
34
|
+
last = PY_TOKEN.lastIndex;
|
|
35
|
+
const [tok, com, tri, str, dec, num, name] = m;
|
|
36
|
+
if (com) out += `<span class="hl-c">${esc(tok)}</span>`;
|
|
37
|
+
else if (tri) out += `<span class="hl-s hl-doc">${esc(tok)}</span>`;
|
|
38
|
+
else if (str) out += `<span class="hl-s">${esc(tok)}</span>`;
|
|
39
|
+
else if (dec) out += `<span class="hl-d">${esc(tok)}</span>`;
|
|
40
|
+
else if (num) out += `<span class="hl-n">${esc(tok)}</span>`;
|
|
41
|
+
else if (name) {
|
|
42
|
+
const cls = PY_KW.has(name)
|
|
43
|
+
? 'hl-k'
|
|
44
|
+
: PY_CONST.has(name)
|
|
45
|
+
? 'hl-k hl-const'
|
|
46
|
+
: prevWord === 'class'
|
|
47
|
+
? 'hl-cls'
|
|
48
|
+
: prevWord === 'def'
|
|
49
|
+
? 'hl-f'
|
|
50
|
+
: PY_BUILTIN.has(name)
|
|
51
|
+
? 'hl-b'
|
|
52
|
+
: /^[A-Z]\w*$/.test(name) && name.length > 1 && /[a-z]/.test(name)
|
|
53
|
+
? 'hl-t'
|
|
54
|
+
: '';
|
|
55
|
+
out += cls ? `<span class="${cls}">${esc(name)}</span>` : esc(name);
|
|
56
|
+
prevWord = name;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!/^\s*$/.test(tok)) prevWord = '';
|
|
60
|
+
}
|
|
61
|
+
return out + esc(src.slice(last));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function hlJson(src: string): string {
|
|
65
|
+
const re = /("(?:[^"\\\n]|\\.)*")(\s*:)?|\b(true|false|null)\b|(-?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b)/g;
|
|
66
|
+
let out = '';
|
|
67
|
+
let last = 0;
|
|
68
|
+
for (let m = re.exec(src); m; m = re.exec(src)) {
|
|
69
|
+
out += esc(src.slice(last, m.index));
|
|
70
|
+
last = re.lastIndex;
|
|
71
|
+
const [, str, colon, kw, num] = m;
|
|
72
|
+
out += str
|
|
73
|
+
? colon
|
|
74
|
+
? `<span class="hl-key">${esc(str)}</span>${esc(colon)}`
|
|
75
|
+
: `<span class="hl-s">${esc(str)}</span>`
|
|
76
|
+
: kw
|
|
77
|
+
? `<span class="hl-k hl-const">${kw}</span>`
|
|
78
|
+
: `<span class="hl-n">${num ?? ''}</span>`;
|
|
79
|
+
}
|
|
80
|
+
return out + esc(src.slice(last));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const LANG_OF: Record<string, 'python' | 'json'> = { py: 'python', python: 'python', json: 'json', jsonc: 'json' };
|
|
84
|
+
|
|
85
|
+
function langOf(hint: string | null | undefined): 'python' | 'json' | '' {
|
|
86
|
+
const h = String(hint || '').toLowerCase();
|
|
87
|
+
return LANG_OF[h.replace(/^.*\./, '')] || LANG_OF[h] || '';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Highlighted, escaped HTML. `hint` is a fence language ("python") or a file name ("schema.py"); anything unknown is plain. */
|
|
91
|
+
export function highlight(code: string, hint?: string | null): string {
|
|
92
|
+
const lang = langOf(hint);
|
|
93
|
+
return lang === 'python' ? hlPython(code) : lang === 'json' ? hlJson(code) : esc(code);
|
|
94
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Markdown: what model output and text files actually use. Everything is
|
|
2
|
+
// escaped first, so nothing the text holds can inject markup; links keep only
|
|
3
|
+
// http(s) targets. Returns HTML for `unsafeHTML`.
|
|
4
|
+
import { esc } from '../core/format.js';
|
|
5
|
+
import { highlight } from './highlight.js';
|
|
6
|
+
|
|
7
|
+
function mdInline(t: string): string {
|
|
8
|
+
return t
|
|
9
|
+
.replace(/`([^`\n]+)`/g, '<code>$1</code>')
|
|
10
|
+
.replace(/\*\*([^*\n]+)\*\*/g, '<b>$1</b>')
|
|
11
|
+
.replace(/(^|[^*\w])\*([^*\n]+)\*(?!\w)/g, '$1<i>$2</i>')
|
|
12
|
+
.replace(/\[([^\]\n]+)\]\((https?:\/\/[^)\s]+)\)/g, '<a class="lnk" href="$2" target="_blank" rel="noopener">$1</a>');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface Segment {
|
|
16
|
+
t: 'text' | 'code';
|
|
17
|
+
s: string;
|
|
18
|
+
lang?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Text and fenced code; an unclosed fence (a live stream) runs to the end. */
|
|
22
|
+
function mdSplit(text: string): Segment[] {
|
|
23
|
+
const out: Segment[] = [];
|
|
24
|
+
let pos = 0;
|
|
25
|
+
for (;;) {
|
|
26
|
+
const open = text.indexOf('```', pos);
|
|
27
|
+
if (open < 0) {
|
|
28
|
+
out.push({ t: 'text', s: text.slice(pos) });
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
out.push({ t: 'text', s: text.slice(pos, open) });
|
|
32
|
+
const nl = text.indexOf('\n', open + 3);
|
|
33
|
+
const lang = text.slice(open + 3, nl < 0 ? text.length : nl).trim();
|
|
34
|
+
const start = nl < 0 ? text.length : nl + 1;
|
|
35
|
+
const close = text.indexOf('```', start);
|
|
36
|
+
if (close < 0) {
|
|
37
|
+
out.push({ t: 'code', s: text.slice(start), lang });
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
out.push({ t: 'code', s: text.slice(start, close), lang });
|
|
41
|
+
pos = close + 3;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const TABLE_ROW = /^\s*\|.*\|\s*$/;
|
|
46
|
+
|
|
47
|
+
export function md(text: string | null | undefined): string {
|
|
48
|
+
return mdSplit(String(text || ''))
|
|
49
|
+
.map((seg) => {
|
|
50
|
+
if (seg.t === 'code') return `<pre><code class="hl">${highlight(seg.s, seg.lang)}</code></pre>`;
|
|
51
|
+
const lines = esc(seg.s).split('\n');
|
|
52
|
+
const out: string[] = [];
|
|
53
|
+
for (let k = 0; k < lines.length; k++) {
|
|
54
|
+
const line = lines[k] ?? '';
|
|
55
|
+
let m: RegExpMatchArray | null;
|
|
56
|
+
if ((m = line.match(/^(#{1,6})\s+(.*)$/))) {
|
|
57
|
+
out.push(`<div class="md-h md-h${Math.min(m[1]!.length, 4)}">${mdInline(m[2]!)}</div>`);
|
|
58
|
+
} else if (/^\s*(-{3,}|\*{3,})\s*$/.test(line)) {
|
|
59
|
+
out.push('<hr class="md-hr">');
|
|
60
|
+
} else if ((m = line.match(/^\s*>\s?(.*)$/))) {
|
|
61
|
+
out.push(`<div class="md-q">${mdInline(m[1]!)}</div>`);
|
|
62
|
+
} else if ((m = line.match(/^\s*[-*]\s+(.*)$/))) {
|
|
63
|
+
out.push(`<div class="md-li">${mdInline(m[1]!)}</div>`);
|
|
64
|
+
} else if ((m = line.match(/^\s*(\d+)[.)]\s+(.*)$/))) {
|
|
65
|
+
out.push(`<div class="md-li md-ol"><span class="md-n">${m[1]}.</span>${mdInline(m[2]!)}</div>`);
|
|
66
|
+
} else if (TABLE_ROW.test(line) && /^\s*\|[\s:|-]+\|\s*$/.test(lines[k + 1] ?? '')) {
|
|
67
|
+
const cells = (l: string) =>
|
|
68
|
+
l
|
|
69
|
+
.trim()
|
|
70
|
+
.replace(/^\||\|$/g, '')
|
|
71
|
+
.split('|')
|
|
72
|
+
.map((c) => mdInline(c.trim()));
|
|
73
|
+
const head = cells(line);
|
|
74
|
+
k += 2;
|
|
75
|
+
const rows: string[][] = [];
|
|
76
|
+
while (k < lines.length && TABLE_ROW.test(lines[k] ?? '')) rows.push(cells(lines[k++] ?? ''));
|
|
77
|
+
k--;
|
|
78
|
+
out.push(
|
|
79
|
+
`<table class="md-t"><tr>${head.map((c) => `<th>${c}</th>`).join('')}</tr>` +
|
|
80
|
+
rows.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join('')}</tr>`).join('') +
|
|
81
|
+
'</table>',
|
|
82
|
+
);
|
|
83
|
+
} else {
|
|
84
|
+
out.push(line.trim() === '' ? '<div class="md-gap"></div>' : `<div class="md-p">${mdInline(line)}</div>`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return out.join('');
|
|
88
|
+
})
|
|
89
|
+
.join('');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** A markdown file as a person reads it: its `---` front matter as a small table, then the body. */
|
|
93
|
+
export function mdFile(text: string | null | undefined, mark?: (html: string) => string): string {
|
|
94
|
+
const src = String(text || '');
|
|
95
|
+
const m = src.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
96
|
+
let front = '';
|
|
97
|
+
let body = src;
|
|
98
|
+
if (m) {
|
|
99
|
+
body = m[2] ?? '';
|
|
100
|
+
const rows = (m[1] ?? '')
|
|
101
|
+
.split('\n')
|
|
102
|
+
.map((l) => l.match(/^([\w-]+):\s*(.*)$/))
|
|
103
|
+
.filter((x): x is RegExpMatchArray => !!x)
|
|
104
|
+
.map(([, k, v]) => `<tr><td class="jmono">${esc(k)}</td><td>${esc(v)}</td></tr>`)
|
|
105
|
+
.join('');
|
|
106
|
+
front = rows ? `<table class="md-front">${rows}</table>` : '';
|
|
107
|
+
}
|
|
108
|
+
const html = md(body);
|
|
109
|
+
return `<div class="md-doc">${front}${mark ? mark(html) : html}</div>`;
|
|
110
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Moving across a grid of marks with the keys: the marks of a table of rows and columns.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Where a key moves in a grid of marks (`has[r][c]`: a mark there), from (`r`, `c`):
|
|
5
|
+
* left and right to the next mark in the row, up and down to the nearest row with a
|
|
6
|
+
* mark in the column, Home and End to the row's first and last, with Ctrl to the
|
|
7
|
+
* first and last row's, PageUp and PageDown `page` rows. Null when it does not move.
|
|
8
|
+
*/
|
|
9
|
+
export function gridStep(has: readonly (readonly boolean[])[], r: number, c: number, key: string, ctrl = false, page = 10): [number, number] | null {
|
|
10
|
+
const at = (i: number, j: number) => has[i]?.[j] === true;
|
|
11
|
+
const first = (i: number) => (has[i] ?? []).findIndex(Boolean);
|
|
12
|
+
const last = (i: number) => (has[i] ?? []).lastIndexOf(true);
|
|
13
|
+
const rowWith = (from: number, step: number, col: number): number => {
|
|
14
|
+
for (let i = from; i >= 0 && i < has.length; i += step) if (at(i, col)) return i;
|
|
15
|
+
return -1;
|
|
16
|
+
};
|
|
17
|
+
const near = (i: number): [number, number] | null => {
|
|
18
|
+
// The mark of row i nearest to column c.
|
|
19
|
+
const row = has[i] ?? [];
|
|
20
|
+
let best = -1;
|
|
21
|
+
row.forEach((x, j) => x && (best < 0 || Math.abs(j - c) < Math.abs(best - c)) && (best = j));
|
|
22
|
+
return best < 0 ? null : [i, best];
|
|
23
|
+
};
|
|
24
|
+
switch (key) {
|
|
25
|
+
case 'ArrowRight':
|
|
26
|
+
case 'ArrowLeft': {
|
|
27
|
+
const s = key === 'ArrowRight' ? 1 : -1;
|
|
28
|
+
for (let j = c + s; j >= 0 && j < (has[r]?.length ?? 0); j += s) if (at(r, j)) return [r, j];
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
case 'ArrowDown':
|
|
32
|
+
case 'ArrowUp': {
|
|
33
|
+
const s = key === 'ArrowDown' ? 1 : -1;
|
|
34
|
+
const i = rowWith(r + s, s, c);
|
|
35
|
+
if (i >= 0) return [i, c];
|
|
36
|
+
for (let k = r + s; k >= 0 && k < has.length; k += s) if (first(k) >= 0) return near(k);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
case 'Home': {
|
|
40
|
+
const i = ctrl ? has.findIndex((row) => row.some(Boolean)) : r;
|
|
41
|
+
return i < 0 || first(i) < 0 ? null : [i, first(i)];
|
|
42
|
+
}
|
|
43
|
+
case 'End': {
|
|
44
|
+
let i = r;
|
|
45
|
+
if (ctrl) for (i = has.length - 1; i >= 0 && last(i) < 0; i--);
|
|
46
|
+
return i < 0 || last(i) < 0 ? null : [i, last(i)];
|
|
47
|
+
}
|
|
48
|
+
case 'PageDown':
|
|
49
|
+
case 'PageUp': {
|
|
50
|
+
const s = key === 'PageDown' ? 1 : -1;
|
|
51
|
+
const target = Math.max(0, Math.min(has.length - 1, r + s * page));
|
|
52
|
+
for (let k = target; k !== r; k -= s) if (first(k) >= 0) return near(k);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|