@contraagent/elements 0.0.0-stage → 0.2.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 +83 -2
- package/custom-elements.json +5022 -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/code/code.d.ts +83 -0
- package/dist/code/code.d.ts.map +1 -0
- package/dist/code/code.js +206 -0
- package/dist/code/code.js.map +1 -0
- package/dist/code/highlight.d.ts +25 -0
- package/dist/code/highlight.d.ts.map +1 -0
- package/dist/code/highlight.js +312 -0
- package/dist/code/highlight.js.map +1 -0
- package/dist/code/index.d.ts +3 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +5 -0
- package/dist/code/index.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 +15 -0
- package/dist/define/all.d.ts.map +1 -0
- package/dist/define/all.js +16 -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/code.d.ts +4 -0
- package/dist/define/code.d.ts.map +1 -0
- package/dist/define/code.js +7 -0
- package/dist/define/code.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/define/tree.d.ts +4 -0
- package/dist/define/tree.d.ts.map +1 -0
- package/dist/define/tree.js +7 -0
- package/dist/define/tree.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 +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -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 +2 -0
- package/dist/markdown/highlight.d.ts.map +1 -0
- package/dist/markdown/highlight.js +3 -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 +64 -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/dist/tree/index.d.ts +2 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +4 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/tree.d.ts +83 -0
- package/dist/tree/tree.d.ts.map +1 -0
- package/dist/tree/tree.js +251 -0
- package/dist/tree/tree.js.map +1 -0
- package/docs/charts.md +58 -0
- package/docs/check-table.md +40 -0
- package/docs/code.md +55 -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/code.ts +28 -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/examples/tree.ts +44 -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/tree.md +44 -0
- package/docs/tsconfig.json +20 -0
- package/package.json +177 -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/code/code.ts +199 -0
- package/src/code/highlight.ts +378 -0
- package/src/code/index.ts +4 -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 +15 -0
- package/src/define/charts.ts +17 -0
- package/src/define/check-table.ts +9 -0
- package/src/define/code.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/define/tree.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 +27 -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 +2 -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 +64 -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
- package/src/tree/index.ts +3 -0
- package/src/tree/tree.ts +263 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// A whole page from the generic elements: one run of a made-up CI pipeline.
|
|
2
|
+
// A theme switch, stat tiles, a sortable table of jobs, and a layered graph of
|
|
3
|
+
// the steps (a shard is a series; the end-to-end tests repeat in a retry loop),
|
|
4
|
+
// with a detail panel of the page's own beside them. The page holds the data
|
|
5
|
+
// and the state (the theme, the selection, the order), and answers the events.
|
|
6
|
+
import '@contraagent/elements/segmented/define'; // <cae-segmented>
|
|
7
|
+
import '@contraagent/elements/tiles/define'; // <cae-stat-tiles>
|
|
8
|
+
import '@contraagent/elements/data-table/define'; // <cae-data-table>
|
|
9
|
+
import '@contraagent/elements/graph/define'; // <cae-layered-graph>
|
|
10
|
+
import { adoptThemes } from '@contraagent/elements/themes';
|
|
11
|
+
import { fmtDur, pill, type StateStyles } from '@contraagent/elements';
|
|
12
|
+
import { sortRows, type CaeDataTable, type DataColumn } from '@contraagent/elements/data-table';
|
|
13
|
+
import type { GraphInput, GraphMark, GraphNodeInput } from '@contraagent/elements/graph';
|
|
14
|
+
import type { StatTile } from '@contraagent/elements/tiles';
|
|
15
|
+
|
|
16
|
+
// ---- The data: a step is a node, a job is one run of a step (or of one shard of it).
|
|
17
|
+
|
|
18
|
+
type State = 'done' | 'failed' | 'running' | 'queued';
|
|
19
|
+
|
|
20
|
+
interface Job {
|
|
21
|
+
id: string;
|
|
22
|
+
step: string;
|
|
23
|
+
/** The shard ('1' to '3'), or null for a step that runs once. */
|
|
24
|
+
shard: string | null;
|
|
25
|
+
/** The pass of the retry loop it ran in (1 outside the loop). */
|
|
26
|
+
pass: number;
|
|
27
|
+
state: State;
|
|
28
|
+
seconds: number;
|
|
29
|
+
runner: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const steps = [
|
|
33
|
+
{ id: 'lint', label: 'lint', loop: false },
|
|
34
|
+
{ id: 'unit', label: 'unit tests', loop: false },
|
|
35
|
+
{ id: 'build', label: 'build', loop: false },
|
|
36
|
+
{ id: 'e2e', label: 'e2e tests', loop: true },
|
|
37
|
+
{ id: 'triage', label: 'triage failures', loop: true },
|
|
38
|
+
{ id: 'deploy', label: 'deploy preview', loop: false },
|
|
39
|
+
];
|
|
40
|
+
const shards = ['1', '2', '3'];
|
|
41
|
+
|
|
42
|
+
const job = (step: string, shard: string | null, pass: number, state: State, seconds: number, runner: string): Job => ({
|
|
43
|
+
id: `${step}${shard ? `/${shard}` : ''}#${pass}`,
|
|
44
|
+
step,
|
|
45
|
+
shard,
|
|
46
|
+
pass,
|
|
47
|
+
state,
|
|
48
|
+
seconds,
|
|
49
|
+
runner,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const jobs: Job[] = [
|
|
53
|
+
job('lint', null, 1, 'done', 41, 'small-1'),
|
|
54
|
+
job('unit', '1', 1, 'done', 188, 'large-1'),
|
|
55
|
+
job('unit', '2', 1, 'done', 203, 'large-2'),
|
|
56
|
+
job('unit', '3', 1, 'done', 176, 'large-3'),
|
|
57
|
+
job('build', null, 1, 'done', 315, 'large-1'),
|
|
58
|
+
job('e2e', '1', 1, 'done', 402, 'large-2'),
|
|
59
|
+
job('e2e', '2', 1, 'failed', 377, 'large-3'),
|
|
60
|
+
job('e2e', '3', 1, 'done', 395, 'large-1'),
|
|
61
|
+
job('triage', null, 1, 'done', 12, 'small-1'),
|
|
62
|
+
job('e2e', '2', 2, 'done', 381, 'large-2'),
|
|
63
|
+
job('triage', null, 2, 'done', 9, 'small-1'),
|
|
64
|
+
job('deploy', null, 1, 'running', 74, 'deploy-1'),
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
// ---- What each state looks like: a word, a tone, a shape (the legend follows this order).
|
|
68
|
+
|
|
69
|
+
const states: StateStyles = {
|
|
70
|
+
done: { label: 'done', tone: 'done', shape: 'round', rank: 0 },
|
|
71
|
+
queued: { label: 'queued', tone: 'muted', shape: 'ring', rank: 1 },
|
|
72
|
+
running: { label: 'running', tone: 'running', shape: 'round', rank: 2 },
|
|
73
|
+
failed: { label: 'failed', tone: 'failed', shape: 'square', rank: 3 },
|
|
74
|
+
};
|
|
75
|
+
const toneOf = (s: State) => states[s]!.tone;
|
|
76
|
+
const jobName = (j: Job) => `${steps.find((s) => s.id === j.step)!.label}${j.shard ? ` shard ${j.shard}` : ''}`;
|
|
77
|
+
|
|
78
|
+
// ---- The graph: a mark per shard (or one loose mark), the last pass's state, the passes as a badge.
|
|
79
|
+
|
|
80
|
+
/** The id of a mark: a step's shard, or the step's single job. */
|
|
81
|
+
const markId = (j: Job) => `${j.step}/${j.shard ?? '-'}`;
|
|
82
|
+
|
|
83
|
+
function mark(runs: Job[]): GraphMark {
|
|
84
|
+
const last = runs[runs.length - 1]!;
|
|
85
|
+
const passes = runs.length > 1 ? `${runs.length} passes` : '1 pass';
|
|
86
|
+
return { id: markId(last), state: last.state, label: `${jobName(last)} | ${last.state} | ${passes}`, tip: jobName(last), badge: runs.length > 1 ? String(runs.length) : undefined };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function node(step: (typeof steps)[number]): GraphNodeInput {
|
|
90
|
+
const own = jobs.filter((j) => j.step === step.id);
|
|
91
|
+
const runsOf = (shard: string | null) => own.filter((j) => j.shard === shard);
|
|
92
|
+
const sharded = own.some((j) => j.shard);
|
|
93
|
+
const marks = sharded ? shards.map((s) => (runsOf(s).length ? mark(runsOf(s)) : null)) : [];
|
|
94
|
+
const loose = sharded ? [] : [mark(runsOf(null))];
|
|
95
|
+
// `counts` and `progress` ("2/3") default to what the marks say.
|
|
96
|
+
// A job that failed in an earlier pass is not in the marks: the line under them names it.
|
|
97
|
+
const failed = own.filter((j) => j.state === 'failed').length;
|
|
98
|
+
return {
|
|
99
|
+
id: step.id,
|
|
100
|
+
label: step.label,
|
|
101
|
+
cluster: step.loop ? 'retry' : null,
|
|
102
|
+
marks,
|
|
103
|
+
loose,
|
|
104
|
+
notes: failed ? [{ text: `${failed} failed ${failed === 1 ? 'job' : 'jobs'}`, tone: 'failed' }] : [],
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const graph: GraphInput = {
|
|
109
|
+
series: shards,
|
|
110
|
+
nodes: steps.map(node),
|
|
111
|
+
clusters: [{ id: 'retry', parent: null, label: 'retry loop', note: 'up to 3 passes', cycle: true }],
|
|
112
|
+
edges: [
|
|
113
|
+
{ from: 'lint', to: 'build', style: 'solid', weight: 1, ranks: true },
|
|
114
|
+
{ from: 'unit', to: 'build', style: 'solid', weight: 3, ranks: true },
|
|
115
|
+
{ from: 'build', to: 'e2e', style: 'solid', weight: 3, ranks: true },
|
|
116
|
+
{ from: 'e2e', to: 'triage', style: 'solid', weight: 3, ranks: true },
|
|
117
|
+
// The next pass: from triage back to the tests. It does not set the layers.
|
|
118
|
+
{ from: 'triage', to: 'e2e', style: 'solid', weight: 1, ranks: false },
|
|
119
|
+
{ from: 'triage', to: 'deploy', style: 'solid', weight: 1, ranks: true },
|
|
120
|
+
],
|
|
121
|
+
stubs: [{ id: 'push', label: 'push to main', to: 'lint', style: 'solid', weight: 1 }],
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// ---- The table: a row per job; every column sorts.
|
|
125
|
+
|
|
126
|
+
const columns: DataColumn<Job>[] = [
|
|
127
|
+
{ id: 'job', header: 'Job', rowHeader: true, cell: jobName, sortable: true },
|
|
128
|
+
{ id: 'pass', header: 'Pass', align: 'end', width: '72px', cell: (j) => j.pass, compare: (a, b) => a.pass - b.pass },
|
|
129
|
+
{ id: 'state', header: 'State', width: '120px', cell: (j) => pill({ text: j.state, tone: toneOf(j.state) }), compare: (a, b) => states[a.state]!.rank - states[b.state]!.rank },
|
|
130
|
+
{ id: 'time', header: 'Time', align: 'end', width: '96px', cell: (j) => fmtDur(j.seconds), compare: (a, b) => a.seconds - b.seconds },
|
|
131
|
+
{ id: 'runner', header: 'Runner', width: '120px', cell: (j) => j.runner, sortable: true },
|
|
132
|
+
];
|
|
133
|
+
|
|
134
|
+
// ---- The tiles.
|
|
135
|
+
|
|
136
|
+
const failed = jobs.filter((j) => j.state === 'failed');
|
|
137
|
+
const passes = Math.max(...jobs.map((j) => j.pass));
|
|
138
|
+
const count = (s: State) => jobs.filter((j) => j.state === s).length;
|
|
139
|
+
const tiles: StatTile[] = [
|
|
140
|
+
{ id: 'jobs', label: 'Jobs', value: jobs.length, sub: [[`${count('done')} done`, `${count('running')} running`]] },
|
|
141
|
+
{ id: 'failed', label: 'Failed jobs', value: failed.length, tone: failed.length ? 'failed' : undefined, sub: [failed.length ? failed.map((j) => `${jobName(j)}, pass ${j.pass}`) : ['All jobs passed']] },
|
|
142
|
+
{ id: 'passes', label: 'Passes of the retry loop', value: passes, sub: [['Up to 3']] },
|
|
143
|
+
{ id: 'time', label: 'Job time', value: fmtDur(jobs.reduce((t, j) => t + j.seconds, 0)), tip: 'Sum over all jobs' },
|
|
144
|
+
];
|
|
145
|
+
|
|
146
|
+
// ---- The page's own styles. Its colours are the theme's, so the page changes with the switch.
|
|
147
|
+
|
|
148
|
+
const css = `
|
|
149
|
+
.ci-page {
|
|
150
|
+
background: var(--ca-bg);
|
|
151
|
+
color: var(--ca-text);
|
|
152
|
+
font: 14px/1.45 system-ui, sans-serif;
|
|
153
|
+
padding: 16px;
|
|
154
|
+
display: grid;
|
|
155
|
+
gap: 16px;
|
|
156
|
+
container-type: inline-size;
|
|
157
|
+
}
|
|
158
|
+
.ci-page header { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
|
|
159
|
+
.ci-page h2 { font-size: 18px; margin: 0; flex: 1; color: var(--ca-text); }
|
|
160
|
+
.ci-page h3 { font-size: 13px; font-weight: 600; margin: 0 0 8px; color: var(--ca-text-secondary); }
|
|
161
|
+
.ci-page .body { display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) 260px; align-items: start; }
|
|
162
|
+
.ci-page .main { display: grid; gap: 16px; min-width: 0; }
|
|
163
|
+
.ci-page aside { background: var(--ca-card); border: 1px solid var(--ca-line); border-radius: 8px; padding: 12px; position: sticky; top: 0; }
|
|
164
|
+
.ci-page dl { display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; margin: 0; }
|
|
165
|
+
.ci-page dt { color: var(--ca-text-muted); }
|
|
166
|
+
.ci-page dd { margin: 0; }
|
|
167
|
+
@container (max-width: 760px) { .ci-page .body { grid-template-columns: minmax(0, 1fr); } }
|
|
168
|
+
`;
|
|
169
|
+
|
|
170
|
+
// ---- The page: build it, then answer the events.
|
|
171
|
+
|
|
172
|
+
export function mount(host: HTMLElement): void {
|
|
173
|
+
adoptThemes(document);
|
|
174
|
+
host.dataset['caTheme'] = 'contraagent-dark';
|
|
175
|
+
|
|
176
|
+
const page = document.createElement('div');
|
|
177
|
+
page.className = 'ci-page';
|
|
178
|
+
page.innerHTML = `<style>${css}</style>
|
|
179
|
+
<header><h2>web-app | pipeline 482 | main</h2></header>
|
|
180
|
+
<div class="body">
|
|
181
|
+
<div class="main">
|
|
182
|
+
<section><h3>Pipeline</h3></section>
|
|
183
|
+
<section></section>
|
|
184
|
+
</div>
|
|
185
|
+
<aside aria-live="polite"><h3>Selected</h3><div class="detail">No selection</div></aside>
|
|
186
|
+
</div>`;
|
|
187
|
+
const [graphBox, tableBox] = page.querySelectorAll('section');
|
|
188
|
+
const detail = page.querySelector<HTMLElement>('.detail')!;
|
|
189
|
+
|
|
190
|
+
// The theme: `data-ca-theme` on the box that holds the page.
|
|
191
|
+
const theme = document.createElement('cae-segmented');
|
|
192
|
+
theme.label = 'Theme';
|
|
193
|
+
theme.options = [
|
|
194
|
+
{ value: 'contraagent-dark', label: 'Dark' },
|
|
195
|
+
{ value: 'contraagent-light', label: 'Light' },
|
|
196
|
+
{ value: 'high-contrast', label: 'High contrast' },
|
|
197
|
+
];
|
|
198
|
+
theme.value = 'contraagent-dark';
|
|
199
|
+
theme.addEventListener('cae-change', (e) => {
|
|
200
|
+
theme.value = e.detail.value;
|
|
201
|
+
host.dataset['caTheme'] = e.detail.value;
|
|
202
|
+
});
|
|
203
|
+
page.querySelector('header')!.append(theme);
|
|
204
|
+
|
|
205
|
+
const stats = document.createElement('cae-stat-tiles');
|
|
206
|
+
stats.columns = 4;
|
|
207
|
+
stats.tiles = tiles;
|
|
208
|
+
page.querySelector('header')!.after(stats);
|
|
209
|
+
|
|
210
|
+
const table = document.createElement('cae-data-table') as CaeDataTable<Job>;
|
|
211
|
+
table.caption = 'Jobs of pipeline 482';
|
|
212
|
+
table.columns = columns;
|
|
213
|
+
table.rowKey = (j) => j.id;
|
|
214
|
+
table.rows = jobs;
|
|
215
|
+
table.addEventListener('cae-sort', (e) => {
|
|
216
|
+
table.sort = e.detail;
|
|
217
|
+
table.rows = sortRows(jobs, columns, e.detail);
|
|
218
|
+
});
|
|
219
|
+
tableBox!.append(table);
|
|
220
|
+
|
|
221
|
+
const view = document.createElement('cae-layered-graph');
|
|
222
|
+
view.key = 'pipeline-482'; // a new key is a new graph: the frame shows all of it again
|
|
223
|
+
view.graph = graph;
|
|
224
|
+
view.states = states;
|
|
225
|
+
view.strings = { cycle: 'next pass', badge: 'number of passes' };
|
|
226
|
+
graphBox!.append(view);
|
|
227
|
+
|
|
228
|
+
/** The selection: the graph shows it, the panel describes it. */
|
|
229
|
+
const select = (id: string | null) => {
|
|
230
|
+
view.selected = id;
|
|
231
|
+
detail.replaceChildren(describe(id));
|
|
232
|
+
};
|
|
233
|
+
view.addEventListener('cae-select', (e) => select(e.detail.id));
|
|
234
|
+
// A row of the table selects its job's mark in the graph.
|
|
235
|
+
table.addEventListener('cae-activate', (e) => select(markId(jobs.find((j) => j.id === e.detail.id)!)));
|
|
236
|
+
|
|
237
|
+
host.replaceChildren(page);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** The panel's content for a mark, a node or the loop. */
|
|
241
|
+
function describe(id: string | null): Node {
|
|
242
|
+
const runs = jobs.filter((j) => markId(j) === id);
|
|
243
|
+
const step = steps.find((s) => s.id === id);
|
|
244
|
+
let title = 'No selection';
|
|
245
|
+
let rows: [string, string][] = [];
|
|
246
|
+
if (runs.length) {
|
|
247
|
+
const last = runs[runs.length - 1]!;
|
|
248
|
+
title = jobName(last);
|
|
249
|
+
rows = [['State', last.state], ['Passes', String(runs.length)], ...runs.map((j): [string, string] => [`Pass ${j.pass}`, `${j.state} | ${fmtDur(j.seconds)} | ${j.runner}`])];
|
|
250
|
+
} else if (step) {
|
|
251
|
+
const own = jobs.filter((j) => j.step === step.id);
|
|
252
|
+
title = step.label;
|
|
253
|
+
rows = [['Jobs', String(own.length)], ['Failed', String(own.filter((j) => j.state === 'failed').length)], ['Time', fmtDur(own.reduce((t, j) => t + j.seconds, 0))]];
|
|
254
|
+
} else if (id === 'retry') {
|
|
255
|
+
title = 'retry loop';
|
|
256
|
+
rows = [['Passes', `${passes} of up to 3`], ['Rerun', jobs.filter((j) => j.pass > 1 && j.shard).map(jobName).join(', ')]];
|
|
257
|
+
}
|
|
258
|
+
const box = document.createElement('div');
|
|
259
|
+
const h = document.createElement('strong');
|
|
260
|
+
h.textContent = title;
|
|
261
|
+
const dl = document.createElement('dl');
|
|
262
|
+
for (const [k, v] of rows) {
|
|
263
|
+
const dt = document.createElement('dt');
|
|
264
|
+
const dd = document.createElement('dd');
|
|
265
|
+
dt.textContent = k;
|
|
266
|
+
dd.textContent = v;
|
|
267
|
+
dl.append(dt, dd);
|
|
268
|
+
}
|
|
269
|
+
box.append(h, dl);
|
|
270
|
+
return box;
|
|
271
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Code: a hand-written script, numbered from line 12, two of its lines marked; and
|
|
2
|
+
// the same element on a text too long to show whole.
|
|
3
|
+
import '@contraagent/elements/code/define';
|
|
4
|
+
|
|
5
|
+
const script = `def build(target: str, jobs: int = 4) -> bool:
|
|
6
|
+
"""Build one target; True when it passed."""
|
|
7
|
+
result = run(["make", f"-j{jobs}", target])
|
|
8
|
+
if result.returncode != 0:
|
|
9
|
+
log.error("build of %s failed", target) # the log names the target
|
|
10
|
+
return False
|
|
11
|
+
return True
|
|
12
|
+
`;
|
|
13
|
+
|
|
14
|
+
export function mount(host: HTMLElement): void {
|
|
15
|
+
const code = document.createElement('cae-code');
|
|
16
|
+
code.code = script;
|
|
17
|
+
code.language = 'python';
|
|
18
|
+
code.path = 'ci/build.py';
|
|
19
|
+
code.start = 12;
|
|
20
|
+
code.highlight = [15, [16, 17]];
|
|
21
|
+
|
|
22
|
+
const long = document.createElement('cae-code');
|
|
23
|
+
long.code = Array.from({ length: 40 }, (_, i) => `step ${i + 1}: ok`).join('\n');
|
|
24
|
+
long.path = 'logs/steps.txt';
|
|
25
|
+
long.maxLines = 6;
|
|
26
|
+
long.style.marginTop = '12px';
|
|
27
|
+
host.replaceChildren(code, long);
|
|
28
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// A data table: hand-written rows, one sortable column, a row's action. The
|
|
2
|
+
// host holds the rows and the order, and answers the events.
|
|
3
|
+
import '@contraagent/elements/data-table/define';
|
|
4
|
+
import { sortRows, type CaeDataTable, type DataColumn } from '@contraagent/elements/data-table';
|
|
5
|
+
import { pill } from '@contraagent/elements';
|
|
6
|
+
|
|
7
|
+
interface Job {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
minutes: number;
|
|
11
|
+
state: 'done' | 'failed' | 'running';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const jobs: Job[] = [
|
|
15
|
+
{ id: 'j1', name: 'Build', minutes: 4, state: 'done' },
|
|
16
|
+
{ id: 'j2', name: 'Unit tests', minutes: 11, state: 'failed' },
|
|
17
|
+
{ id: 'j3', name: 'Deploy preview', minutes: 2, state: 'running' },
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
const columns: DataColumn<Job>[] = [
|
|
21
|
+
{ id: 'name', header: 'Job', rowHeader: true, cell: (j) => j.name },
|
|
22
|
+
{ id: 'minutes', header: 'Minutes', align: 'end', width: '96px', cell: (j) => j.minutes, compare: (a, b) => a.minutes - b.minutes },
|
|
23
|
+
{ id: 'state', header: 'State', width: '120px', cell: (j) => pill({ text: j.state, tone: j.state }) },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export function mount(host: HTMLElement): void {
|
|
27
|
+
const table = document.createElement('cae-data-table') as CaeDataTable<Job>;
|
|
28
|
+
table.caption = 'Jobs';
|
|
29
|
+
table.columns = columns;
|
|
30
|
+
table.rowKey = (j) => j.id;
|
|
31
|
+
table.rows = jobs;
|
|
32
|
+
table.addEventListener('cae-sort', (e) => {
|
|
33
|
+
table.sort = e.detail;
|
|
34
|
+
table.rows = sortRows(jobs, columns, e.detail);
|
|
35
|
+
});
|
|
36
|
+
const shown = document.createElement('p');
|
|
37
|
+
table.addEventListener('cae-activate', (e) => (shown.textContent = `Opened: ${e.detail.id}`));
|
|
38
|
+
host.replaceChildren(table, shown);
|
|
39
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// A layered graph: a hand-written build pipeline of three steps, the last two in a
|
|
2
|
+
// cluster that repeats (a retry loop), one mark per service in each step. The host
|
|
3
|
+
// keeps the selection and the order, and answers the events.
|
|
4
|
+
import '@contraagent/elements/graph/define';
|
|
5
|
+
import type { GraphInput, GraphMark, GraphNodeInput } from '@contraagent/elements/graph';
|
|
6
|
+
import type { StateStyles } from '@contraagent/elements/primitives';
|
|
7
|
+
|
|
8
|
+
const states: StateStyles = {
|
|
9
|
+
ok: { label: 'ok', tone: 'done', shape: 'round', rank: 0 },
|
|
10
|
+
busy: { label: 'busy', tone: 'running', shape: 'round', rank: 2 },
|
|
11
|
+
broken: { label: 'broken', tone: 'failed', shape: 'square', rank: 3 },
|
|
12
|
+
queued: { label: 'queued', tone: 'neutral', shape: 'ring', rank: 1 },
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const services = ['api', 'web', 'worker'];
|
|
16
|
+
|
|
17
|
+
/** One mark per service: its id is unique in the graph, so it is what the graph selects. */
|
|
18
|
+
const marks = (step: string, looks: string[]): GraphMark[] =>
|
|
19
|
+
services.map((s, i) => ({ id: `${step}#${s}`, state: looks[i] ?? 'queued', label: `${step} · ${s} | ${looks[i] ?? 'queued'}`, tip: `${step} · ${s}` }));
|
|
20
|
+
|
|
21
|
+
/** A step: its counts and its header's count ("2/3") come from its marks. */
|
|
22
|
+
const node = (id: string, label: string, looks: string[], cluster: string | null): GraphNodeInput => ({ id, label, cluster, marks: marks(id, looks) });
|
|
23
|
+
|
|
24
|
+
const graph: GraphInput = {
|
|
25
|
+
series: services,
|
|
26
|
+
nodes: [
|
|
27
|
+
node('build', 'build', ['ok', 'ok', 'ok'], null),
|
|
28
|
+
node('test', 'test', ['ok', 'broken', 'ok'], 'retry'),
|
|
29
|
+
node('deploy', 'deploy', ['busy', 'queued', 'ok'], 'retry'),
|
|
30
|
+
],
|
|
31
|
+
clusters: [{ id: 'retry', parent: null, label: 'retry', note: 'up to 3 rounds', cycle: true }],
|
|
32
|
+
edges: [
|
|
33
|
+
{ from: 'build', to: 'test', style: 'solid', weight: 3, ranks: true },
|
|
34
|
+
{ from: 'test', to: 'deploy', style: 'solid', weight: 3, ranks: true },
|
|
35
|
+
// The next round: back from deploy to test; it does not set the layers.
|
|
36
|
+
{ from: 'deploy', to: 'test', style: 'solid', weight: 1, ranks: false },
|
|
37
|
+
],
|
|
38
|
+
stubs: [{ id: 'commit', label: 'commit', to: 'build', style: 'solid', weight: 1 }],
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export function mount(host: HTMLElement): void {
|
|
42
|
+
const el = document.createElement('cae-layered-graph');
|
|
43
|
+
el.graph = graph;
|
|
44
|
+
el.states = states;
|
|
45
|
+
el.key = 'pipeline';
|
|
46
|
+
el.strings = { cycle: 'next round' };
|
|
47
|
+
const card = document.createElement('div');
|
|
48
|
+
card.slot = 'inspector';
|
|
49
|
+
el.append(card);
|
|
50
|
+
const shown = document.createElement('p');
|
|
51
|
+
el.addEventListener('cae-select', (e) => {
|
|
52
|
+
el.selected = e.detail.id;
|
|
53
|
+
card.innerHTML = e.detail.id ? `<h4>${e.detail.id}</h4>` : '';
|
|
54
|
+
});
|
|
55
|
+
el.addEventListener('cae-activate', (e) => (shown.textContent = `Opened: ${e.detail.id}`));
|
|
56
|
+
host.replaceChildren(el, shown);
|
|
57
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Lanes: hand-written jobs on a time axis, a lane per stage, one job running.
|
|
2
|
+
// The host names the looks of the bars; their labels are the legend.
|
|
3
|
+
import '@contraagent/elements/lanes/define';
|
|
4
|
+
import type { Lane, LaneStyle } from '@contraagent/elements/lanes';
|
|
5
|
+
|
|
6
|
+
const barStyles: Record<string, LaneStyle> = {
|
|
7
|
+
passed: { label: 'passed', color: 'var(--ca-status-done)' },
|
|
8
|
+
failed: { label: 'failed', color: 'var(--ca-status-failed)', pattern: 'hatched' },
|
|
9
|
+
running: { label: 'running', color: 'var(--ca-status-running)', pattern: 'striped' },
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export function mount(host: HTMLElement): void {
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
const min = 60e3;
|
|
15
|
+
const lanes: Lane[] = [
|
|
16
|
+
{
|
|
17
|
+
id: 'build',
|
|
18
|
+
label: 'Build',
|
|
19
|
+
bars: [
|
|
20
|
+
{ id: 'b1', start: now - 9 * min, end: now - 6 * min, style: 'failed', label: 'Build #1\nfailed' },
|
|
21
|
+
{ id: 'b2', start: now - 6 * min, end: now - 3 * min, style: 'passed', label: 'Build #2\npassed' },
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'test',
|
|
26
|
+
label: 'Test',
|
|
27
|
+
bars: [
|
|
28
|
+
{ id: 't1', start: now - 3 * min, end: null, style: 'running', label: 'Unit tests\nrunning' },
|
|
29
|
+
{ id: 't2', start: now - 2.5 * min, end: now - 1 * min, style: 'passed', label: 'Lint\npassed' },
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
const el = document.createElement('cae-lanes');
|
|
34
|
+
el.lanes = lanes;
|
|
35
|
+
el.barStyles = barStyles;
|
|
36
|
+
el.live = true;
|
|
37
|
+
el.omitted = 3;
|
|
38
|
+
el.strings = { omitted: (n) => `${n} older jobs not shown` };
|
|
39
|
+
host.replaceChildren(el);
|
|
40
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// A mark matrix: a hand-written week of nightly checks, a row per service, a column
|
|
2
|
+
// per check under a group per night. The host sorts the rows and keeps the selection.
|
|
3
|
+
import '@contraagent/elements/matrix/define';
|
|
4
|
+
import type { MarkMatrixInput, MatrixRowInput } from '@contraagent/elements/matrix';
|
|
5
|
+
import type { StateStyles } from '@contraagent/elements/primitives';
|
|
6
|
+
|
|
7
|
+
const states: StateStyles = {
|
|
8
|
+
pass: { label: 'pass', tone: 'done', shape: 'round', rank: 0 },
|
|
9
|
+
fail: { label: 'fail', tone: 'failed', shape: 'square', rank: 2 },
|
|
10
|
+
skip: { label: 'skip', tone: 'muted', shape: 'round', rank: 1 },
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const nights = ['Mon', 'Tue'];
|
|
14
|
+
const checks = ['lint', 'unit'];
|
|
15
|
+
const results: Record<string, string[]> = { api: ['pass', 'pass', 'pass', 'fail'], web: ['pass', 'skip', 'pass', 'pass'], worker: ['fail', 'fail', 'pass', 'pass'] };
|
|
16
|
+
|
|
17
|
+
const rows: MatrixRowInput[] = Object.entries(results).map(([service, rs]) => ({
|
|
18
|
+
id: service,
|
|
19
|
+
label: service,
|
|
20
|
+
value: rs.filter((r) => r === 'fail').length,
|
|
21
|
+
strong: rs.includes('fail'),
|
|
22
|
+
cells: rs.map((state, i) => {
|
|
23
|
+
const at = `${nights[Math.floor(i / 2)]} ${checks[i % 2]}`;
|
|
24
|
+
return { id: `${service}|${i}`, state, label: `${service} | ${at} | ${state}`, tip: `${service}, ${at}` };
|
|
25
|
+
}),
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
const byFailures = (rs: readonly MatrixRowInput[]) => [...rs].sort((a, b) => Number(b.value) - Number(a.value));
|
|
29
|
+
|
|
30
|
+
const matrix = (sort: string): MarkMatrixInput => ({
|
|
31
|
+
caption: 'Nightly checks',
|
|
32
|
+
label: 'Nightly checks by service',
|
|
33
|
+
facts: ['2 nights', '3 services'],
|
|
34
|
+
head: [
|
|
35
|
+
nights.map((n) => ({ id: n, label: n, span: 2, rows: 1, type: 'group' as const })),
|
|
36
|
+
nights.flatMap((n) => checks.map((c) => ({ id: `${n}|${c}`, label: c, span: 1, rows: 1, type: 'column' as const }))),
|
|
37
|
+
],
|
|
38
|
+
columns: nights.flatMap((n) => checks.map((c) => ({ id: `${n}|${c}`, groups: [n] }))),
|
|
39
|
+
rows: sort === 'failures' ? byFailures(rows) : rows,
|
|
40
|
+
value: { label: 'Failures' },
|
|
41
|
+
sorts: [
|
|
42
|
+
{ id: 'name', label: 'Name' },
|
|
43
|
+
{ id: 'failures', label: 'Failures' },
|
|
44
|
+
],
|
|
45
|
+
sort,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export function mount(host: HTMLElement): void {
|
|
49
|
+
const el = document.createElement('cae-mark-matrix');
|
|
50
|
+
el.matrix = matrix('name');
|
|
51
|
+
el.states = states;
|
|
52
|
+
el.strings = { rowsHeader: 'Service' };
|
|
53
|
+
el.addEventListener('cae-sort', (e) => (el.matrix = matrix(e.detail.id)));
|
|
54
|
+
el.addEventListener('cae-select', (e) => (el.selected = e.detail.id));
|
|
55
|
+
host.replaceChildren(el);
|
|
56
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* A page of your own in its elements' theme. With <html data-ca-theme="nord">
|
|
2
|
+
and the themes' rules in the document (adoptThemes(document)), the page's own
|
|
3
|
+
CSS reads the same --ca-* properties as the elements. */
|
|
4
|
+
body {
|
|
5
|
+
margin: 0;
|
|
6
|
+
color-scheme: var(--ca-color-scheme);
|
|
7
|
+
background: var(--ca-bg);
|
|
8
|
+
color: var(--ca-text);
|
|
9
|
+
font: 13px/1.5 system-ui, sans-serif;
|
|
10
|
+
}
|
|
11
|
+
.card {
|
|
12
|
+
background: var(--ca-card);
|
|
13
|
+
border: 1px solid var(--ca-line);
|
|
14
|
+
border-radius: 8px;
|
|
15
|
+
padding: 16px;
|
|
16
|
+
}
|
|
17
|
+
.caption {
|
|
18
|
+
color: var(--ca-text-secondary);
|
|
19
|
+
}
|
|
20
|
+
.unit {
|
|
21
|
+
color: var(--ca-text-muted);
|
|
22
|
+
}
|
|
23
|
+
a {
|
|
24
|
+
color: var(--ca-accent);
|
|
25
|
+
}
|
|
26
|
+
:focus-visible {
|
|
27
|
+
outline: var(--ca-focus-width) solid var(--ca-focus);
|
|
28
|
+
}
|
|
29
|
+
/* A property with one default for every theme (a tint, a type size) has its
|
|
30
|
+
value only inside the elements: compute it the way the elements do. */
|
|
31
|
+
.failed-badge {
|
|
32
|
+
color: var(--ca-status-failed);
|
|
33
|
+
background: color-mix(in srgb, var(--ca-status-failed) var(--ca-tint), transparent);
|
|
34
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// A segmented control: one choice among a few. The host holds the value and
|
|
2
|
+
// answers `cae-change`; the words are the host's.
|
|
3
|
+
import '@contraagent/elements/segmented/define';
|
|
4
|
+
|
|
5
|
+
export function mount(host: HTMLElement): void {
|
|
6
|
+
const control = document.createElement('cae-segmented');
|
|
7
|
+
control.label = 'Period';
|
|
8
|
+
control.options = [
|
|
9
|
+
{ value: 'day', label: 'Day' },
|
|
10
|
+
{ value: 'week', label: 'Week' },
|
|
11
|
+
{ value: 'month', label: 'Month', title: 'The last 30 days' },
|
|
12
|
+
];
|
|
13
|
+
control.value = 'week';
|
|
14
|
+
const shown = document.createElement('p');
|
|
15
|
+
shown.textContent = `Showing: ${control.value}`;
|
|
16
|
+
control.addEventListener('cae-change', (e) => (shown.textContent = `Showing: ${e.detail.value}`));
|
|
17
|
+
host.replaceChildren(control, shown);
|
|
18
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Statuses, a legend and a row of facts, drawn by the primitives into an element
|
|
2
|
+
// of your own: its styles start from `base` (the tokens and the status rules),
|
|
3
|
+
// plus `legendStyles` for the legend.
|
|
4
|
+
import { base, factLine, legend, legendStyles, pill, statusWord } from '@contraagent/elements';
|
|
5
|
+
import { LitElement, html } from 'lit';
|
|
6
|
+
|
|
7
|
+
class BuildSummary extends LitElement {
|
|
8
|
+
static override styles = [base, legendStyles];
|
|
9
|
+
|
|
10
|
+
override render() {
|
|
11
|
+
return html`<p>
|
|
12
|
+
${pill({ text: 'passed', tone: 'done' })} ${pill({ text: 'failed', tone: 'failed', title: 'exit code 2' })}
|
|
13
|
+
${pill({ text: 'running', tone: 'running' })} ${statusWord({ text: 'queued', tone: 'attention' })}
|
|
14
|
+
</p>
|
|
15
|
+
<p class="meta words">${factLine(['12 jobs', { text: '1 failed', tone: 'failed' }, '4m 05s'])}</p>
|
|
16
|
+
${legend(
|
|
17
|
+
[
|
|
18
|
+
{ label: 'passed', tone: 'done', shape: 'round' },
|
|
19
|
+
{ label: 'failed', tone: 'failed', shape: 'square' },
|
|
20
|
+
{ label: 'queued', tone: 'attention', shape: 'ring' },
|
|
21
|
+
],
|
|
22
|
+
{ label: 'Job states' },
|
|
23
|
+
)}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function mount(host: HTMLElement): void {
|
|
28
|
+
if (!customElements.get('build-summary')) customElements.define('build-summary', BuildSummary);
|
|
29
|
+
host.replaceChildren(document.createElement('build-summary'));
|
|
30
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* A theme of your own: Solarized Light (https://ethanschoonover.com/solarized/,
|
|
2
|
+
MIT, (c) Ethan Schoonover), built the way the built-in themes are.
|
|
3
|
+
Every colour is a --ca-* property, inherited through the elements' shadow
|
|
4
|
+
roots; one set here overrides the built-in theme's value, token by token.
|
|
5
|
+
|
|
6
|
+
Surfaces and text come from the palette's base tones, the accent is its blue,
|
|
7
|
+
the statuses its red, yellow, green and cyan, the code colours its syntax
|
|
8
|
+
colours. Solarized's accents are mid-tones: where one reads under 4.5:1 on
|
|
9
|
+
these surfaces, it is darkened in lightness only, with its hue kept. */
|
|
10
|
+
.solarized-light {
|
|
11
|
+
--ca-color-scheme: light;
|
|
12
|
+
/* surfaces and text: base3, base2 and base02 to base01 */
|
|
13
|
+
--ca-backdrop: #eee8d5;
|
|
14
|
+
--ca-bg: #eee8d5;
|
|
15
|
+
--ca-card: #fdf6e3;
|
|
16
|
+
--ca-panel: #fdf6e3;
|
|
17
|
+
--ca-panel2: #fdf6e3;
|
|
18
|
+
--ca-raise: #eee8d5;
|
|
19
|
+
--ca-well: #f5efdc;
|
|
20
|
+
--ca-track: #e4ddc8;
|
|
21
|
+
--ca-line: #e4ddc8;
|
|
22
|
+
--ca-line2: #93a1a1;
|
|
23
|
+
--ca-shadow: #586e7533;
|
|
24
|
+
--ca-text: #073642;
|
|
25
|
+
--ca-text-secondary: #365059;
|
|
26
|
+
--ca-text-muted: #4b6068;
|
|
27
|
+
/* interaction: blue */
|
|
28
|
+
--ca-accent: #02629b;
|
|
29
|
+
--ca-focus: #268bd2;
|
|
30
|
+
--ca-selection: #268bd233;
|
|
31
|
+
/* status: red, yellow, green, cyan, base01 */
|
|
32
|
+
--ca-status-failed: #bd0112;
|
|
33
|
+
--ca-status-attention: #7a5b01;
|
|
34
|
+
--ca-status-done: #586604;
|
|
35
|
+
--ca-status-running: #046b64;
|
|
36
|
+
--ca-status-muted: #4e646c;
|
|
37
|
+
--ca-tint: 10%;
|
|
38
|
+
/* identity: violet, and the token bars */
|
|
39
|
+
--ca-agent: #5a5eaf;
|
|
40
|
+
--ca-meter: #93a1a1;
|
|
41
|
+
--ca-tok-input: #268bd2;
|
|
42
|
+
--ca-tok-cache-read: #e4ddc8;
|
|
43
|
+
--ca-tok-cache-write: #93a1a1;
|
|
44
|
+
--ca-tok-output: #6c71c4;
|
|
45
|
+
/* code */
|
|
46
|
+
--ca-code-keyword: #657402;
|
|
47
|
+
--ca-code-string: #077a73;
|
|
48
|
+
--ca-code-number: #c82979;
|
|
49
|
+
--ca-code-constant: #c14204;
|
|
50
|
+
--ca-code-comment: #626f6f;
|
|
51
|
+
--ca-code-function: #0071b3;
|
|
52
|
+
--ca-code-type: #896705;
|
|
53
|
+
--ca-code-name: #0071b3;
|
|
54
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Stat tiles: hand-written figures, one with a tone and a link. The host holds
|
|
2
|
+
// the figures and answers `cae-action`.
|
|
3
|
+
import '@contraagent/elements/tiles/define';
|
|
4
|
+
import type { StatTile } from '@contraagent/elements/tiles';
|
|
5
|
+
|
|
6
|
+
const tiles: StatTile[] = [
|
|
7
|
+
{ id: 'jobs', label: 'Jobs', value: 24, sub: [[{ text: '22 passed' }, { text: '2 failed', tone: 'failed' }]] },
|
|
8
|
+
{
|
|
9
|
+
id: 'failed',
|
|
10
|
+
label: 'Failed jobs',
|
|
11
|
+
value: 2,
|
|
12
|
+
tone: 'failed',
|
|
13
|
+
sub: [['Unit tests', 'Lint']],
|
|
14
|
+
action: { id: 'list', label: 'Failed jobs in the log' },
|
|
15
|
+
},
|
|
16
|
+
{ id: 'time', label: 'Build time', value: '14m 05s', sub: [['Longest: Unit tests']], tip: 'Sum over all jobs' },
|
|
17
|
+
{ id: 'queued', label: 'Queued', value: 0, sub: [['No jobs waiting']] },
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
export function mount(host: HTMLElement): void {
|
|
21
|
+
const grid = document.createElement('cae-stat-tiles');
|
|
22
|
+
grid.columns = 4;
|
|
23
|
+
grid.tiles = tiles;
|
|
24
|
+
const shown = document.createElement('p');
|
|
25
|
+
grid.addEventListener('cae-action', (e) => (shown.textContent = `Action: ${e.detail.action} of ${e.detail.id}`));
|
|
26
|
+
host.replaceChildren(grid, shown);
|
|
27
|
+
}
|