@opensip-cli/dashboard 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/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/catalog-provenance.test.d.ts +11 -0
- package/dist/__tests__/catalog-provenance.test.d.ts.map +1 -0
- package/dist/__tests__/catalog-provenance.test.js +130 -0
- package/dist/__tests__/catalog-provenance.test.js.map +1 -0
- package/dist/__tests__/coupling-attribution.test.d.ts +9 -0
- package/dist/__tests__/coupling-attribution.test.d.ts.map +1 -0
- package/dist/__tests__/coupling-attribution.test.js +99 -0
- package/dist/__tests__/coupling-attribution.test.js.map +1 -0
- package/dist/__tests__/dashboard-bundle-weight.test.d.ts +16 -0
- package/dist/__tests__/dashboard-bundle-weight.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-bundle-weight.test.js +73 -0
- package/dist/__tests__/dashboard-bundle-weight.test.js.map +1 -0
- package/dist/__tests__/dashboard-cell-containment.test.d.ts +2 -0
- package/dist/__tests__/dashboard-cell-containment.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-cell-containment.test.js +49 -0
- package/dist/__tests__/dashboard-cell-containment.test.js.map +1 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts +10 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.js +40 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.js.map +1 -0
- package/dist/__tests__/dashboard-editor-link.test.d.ts +5 -0
- package/dist/__tests__/dashboard-editor-link.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-editor-link.test.js +36 -0
- package/dist/__tests__/dashboard-editor-link.test.js.map +1 -0
- package/dist/__tests__/dashboard-filters.test.d.ts +9 -0
- package/dist/__tests__/dashboard-filters.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-filters.test.js +95 -0
- package/dist/__tests__/dashboard-filters.test.js.map +1 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.d.ts +9 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.js +87 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.js.map +1 -0
- package/dist/__tests__/dashboard-function-card.test.d.ts +10 -0
- package/dist/__tests__/dashboard-function-card.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-function-card.test.js +403 -0
- package/dist/__tests__/dashboard-function-card.test.js.map +1 -0
- package/dist/__tests__/dashboard-function-row.test.d.ts +11 -0
- package/dist/__tests__/dashboard-function-row.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-function-row.test.js +101 -0
- package/dist/__tests__/dashboard-function-row.test.js.map +1 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts +9 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.js +75 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +1 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts +13 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.js +55 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +1 -0
- package/dist/__tests__/dashboard-graph-scc.test.d.ts +17 -0
- package/dist/__tests__/dashboard-graph-scc.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-graph-scc.test.js +89 -0
- package/dist/__tests__/dashboard-graph-scc.test.js.map +1 -0
- package/dist/__tests__/dashboard-graph-view-model.test.d.ts +12 -0
- package/dist/__tests__/dashboard-graph-view-model.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-graph-view-model.test.js +331 -0
- package/dist/__tests__/dashboard-graph-view-model.test.js.map +1 -0
- package/dist/__tests__/dashboard-help-drawer.test.d.ts +9 -0
- package/dist/__tests__/dashboard-help-drawer.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-help-drawer.test.js +101 -0
- package/dist/__tests__/dashboard-help-drawer.test.js.map +1 -0
- package/dist/__tests__/dashboard-html.test.d.ts +2 -0
- package/dist/__tests__/dashboard-html.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-html.test.js +169 -0
- package/dist/__tests__/dashboard-html.test.js.map +1 -0
- package/dist/__tests__/dashboard-indexes.test.d.ts +9 -0
- package/dist/__tests__/dashboard-indexes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-indexes.test.js +211 -0
- package/dist/__tests__/dashboard-indexes.test.js.map +1 -0
- package/dist/__tests__/dashboard-path-utils.test.d.ts +6 -0
- package/dist/__tests__/dashboard-path-utils.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-path-utils.test.js +54 -0
- package/dist/__tests__/dashboard-path-utils.test.js.map +1 -0
- package/dist/__tests__/dashboard-search.test.d.ts +5 -0
- package/dist/__tests__/dashboard-search.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-search.test.js +46 -0
- package/dist/__tests__/dashboard-search.test.js.map +1 -0
- package/dist/__tests__/dashboard-sessions.test.d.ts +14 -0
- package/dist/__tests__/dashboard-sessions.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-sessions.test.js +330 -0
- package/dist/__tests__/dashboard-sessions.test.js.map +1 -0
- package/dist/__tests__/dashboard-trace.test.d.ts +5 -0
- package/dist/__tests__/dashboard-trace.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-trace.test.js +147 -0
- package/dist/__tests__/dashboard-trace.test.js.map +1 -0
- package/dist/__tests__/dashboard-validation.integration.test.d.ts +14 -0
- package/dist/__tests__/dashboard-validation.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-validation.integration.test.js +221 -0
- package/dist/__tests__/dashboard-validation.integration.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-conformance.test.d.ts +12 -0
- package/dist/__tests__/dashboard-view-conformance.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-conformance.test.js +58 -0
- package/dist/__tests__/dashboard-view-conformance.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-coupling.test.d.ts +7 -0
- package/dist/__tests__/dashboard-view-coupling.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-coupling.test.js +381 -0
- package/dist/__tests__/dashboard-view-coupling.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-distribution.test.d.ts +10 -0
- package/dist/__tests__/dashboard-view-distribution.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-distribution.test.js +272 -0
- package/dist/__tests__/dashboard-view-distribution.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-graph.test.d.ts +13 -0
- package/dist/__tests__/dashboard-view-graph.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-graph.test.js +332 -0
- package/dist/__tests__/dashboard-view-graph.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-template.test.d.ts +21 -0
- package/dist/__tests__/dashboard-view-template.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-template.test.js +153 -0
- package/dist/__tests__/dashboard-view-template.test.js.map +1 -0
- package/dist/__tests__/dashboard.test.d.ts +2 -0
- package/dist/__tests__/dashboard.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard.test.js +129 -0
- package/dist/__tests__/dashboard.test.js.map +1 -0
- package/dist/__tests__/graph-tab.test.d.ts +10 -0
- package/dist/__tests__/graph-tab.test.d.ts.map +1 -0
- package/dist/__tests__/graph-tab.test.js +76 -0
- package/dist/__tests__/graph-tab.test.js.map +1 -0
- package/dist/checks.d.ts +7 -0
- package/dist/checks.d.ts.map +1 -0
- package/dist/checks.js +283 -0
- package/dist/checks.js.map +1 -0
- package/dist/code-paths/__tests__/views-registry.test.d.ts +13 -0
- package/dist/code-paths/__tests__/views-registry.test.d.ts.map +1 -0
- package/dist/code-paths/__tests__/views-registry.test.js +39 -0
- package/dist/code-paths/__tests__/views-registry.test.js.map +1 -0
- package/dist/code-paths/catalog-provenance.d.ts +22 -0
- package/dist/code-paths/catalog-provenance.d.ts.map +1 -0
- package/dist/code-paths/catalog-provenance.js +108 -0
- package/dist/code-paths/catalog-provenance.js.map +1 -0
- package/dist/code-paths/catalog-recipes-tables.d.ts +11 -0
- package/dist/code-paths/catalog-recipes-tables.d.ts.map +1 -0
- package/dist/code-paths/catalog-recipes-tables.js +86 -0
- package/dist/code-paths/catalog-recipes-tables.js.map +1 -0
- package/dist/code-paths/cytoscape-vendor.d.ts +27 -0
- package/dist/code-paths/cytoscape-vendor.d.ts.map +1 -0
- package/dist/code-paths/cytoscape-vendor.js +68 -0
- package/dist/code-paths/cytoscape-vendor.js.map +1 -0
- package/dist/code-paths/editor-link.d.ts +10 -0
- package/dist/code-paths/editor-link.d.ts.map +1 -0
- package/dist/code-paths/editor-link.js +20 -0
- package/dist/code-paths/editor-link.js.map +1 -0
- package/dist/code-paths/filters.d.ts +19 -0
- package/dist/code-paths/filters.d.ts.map +1 -0
- package/dist/code-paths/filters.js +47 -0
- package/dist/code-paths/filters.js.map +1 -0
- package/dist/code-paths/function-card.d.ts +15 -0
- package/dist/code-paths/function-card.d.ts.map +1 -0
- package/dist/code-paths/function-card.js +169 -0
- package/dist/code-paths/function-card.js.map +1 -0
- package/dist/code-paths/function-row.d.ts +17 -0
- package/dist/code-paths/function-row.d.ts.map +1 -0
- package/dist/code-paths/function-row.js +77 -0
- package/dist/code-paths/function-row.js.map +1 -0
- package/dist/code-paths/graph-controls.d.ts +27 -0
- package/dist/code-paths/graph-controls.d.ts.map +1 -0
- package/dist/code-paths/graph-controls.js +257 -0
- package/dist/code-paths/graph-controls.js.map +1 -0
- package/dist/code-paths/graph-scc.d.ts +32 -0
- package/dist/code-paths/graph-scc.d.ts.map +1 -0
- package/dist/code-paths/graph-scc.js +136 -0
- package/dist/code-paths/graph-scc.js.map +1 -0
- package/dist/code-paths/graph-stylesheet.d.ts +22 -0
- package/dist/code-paths/graph-stylesheet.d.ts.map +1 -0
- package/dist/code-paths/graph-stylesheet.js +121 -0
- package/dist/code-paths/graph-stylesheet.js.map +1 -0
- package/dist/code-paths/graph-view-model.d.ts +120 -0
- package/dist/code-paths/graph-view-model.d.ts.map +1 -0
- package/dist/code-paths/graph-view-model.js +199 -0
- package/dist/code-paths/graph-view-model.js.map +1 -0
- package/dist/code-paths/help-drawer.d.ts +18 -0
- package/dist/code-paths/help-drawer.d.ts.map +1 -0
- package/dist/code-paths/help-drawer.js +54 -0
- package/dist/code-paths/help-drawer.js.map +1 -0
- package/dist/code-paths/indexes.d.ts +28 -0
- package/dist/code-paths/indexes.d.ts.map +1 -0
- package/dist/code-paths/indexes.js +97 -0
- package/dist/code-paths/indexes.js.map +1 -0
- package/dist/code-paths/path-utils.d.ts +15 -0
- package/dist/code-paths/path-utils.d.ts.map +1 -0
- package/dist/code-paths/path-utils.js +47 -0
- package/dist/code-paths/path-utils.js.map +1 -0
- package/dist/code-paths/search.d.ts +14 -0
- package/dist/code-paths/search.d.ts.map +1 -0
- package/dist/code-paths/search.js +54 -0
- package/dist/code-paths/search.js.map +1 -0
- package/dist/code-paths/trace.d.ts +11 -0
- package/dist/code-paths/trace.d.ts.map +1 -0
- package/dist/code-paths/trace.js +60 -0
- package/dist/code-paths/trace.js.map +1 -0
- package/dist/code-paths/view-coupling.d.ts +22 -0
- package/dist/code-paths/view-coupling.d.ts.map +1 -0
- package/dist/code-paths/view-coupling.js +218 -0
- package/dist/code-paths/view-coupling.js.map +1 -0
- package/dist/code-paths/view-distribution.d.ts +20 -0
- package/dist/code-paths/view-distribution.d.ts.map +1 -0
- package/dist/code-paths/view-distribution.js +82 -0
- package/dist/code-paths/view-distribution.js.map +1 -0
- package/dist/code-paths/view-graph.d.ts +35 -0
- package/dist/code-paths/view-graph.d.ts.map +1 -0
- package/dist/code-paths/view-graph.js +379 -0
- package/dist/code-paths/view-graph.js.map +1 -0
- package/dist/code-paths/view-template.d.ts +154 -0
- package/dist/code-paths/view-template.d.ts.map +1 -0
- package/dist/code-paths/view-template.js +218 -0
- package/dist/code-paths/view-template.js.map +1 -0
- package/dist/code-paths/views-registry.d.ts +13 -0
- package/dist/code-paths/views-registry.d.ts.map +1 -0
- package/dist/code-paths/views-registry.js +53 -0
- package/dist/code-paths/views-registry.js.map +1 -0
- package/dist/code-paths.d.ts +69 -0
- package/dist/code-paths.d.ts.map +1 -0
- package/dist/code-paths.js +356 -0
- package/dist/code-paths.js.map +1 -0
- package/dist/css/cards.d.ts +9 -0
- package/dist/css/cards.d.ts.map +1 -0
- package/dist/css/cards.js +36 -0
- package/dist/css/cards.js.map +1 -0
- package/dist/css/code-paths.d.ts +9 -0
- package/dist/css/code-paths.d.ts.map +1 -0
- package/dist/css/code-paths.js +111 -0
- package/dist/css/code-paths.js.map +1 -0
- package/dist/css/data-table.d.ts +12 -0
- package/dist/css/data-table.d.ts.map +1 -0
- package/dist/css/data-table.js +103 -0
- package/dist/css/data-table.js.map +1 -0
- package/dist/css/function-card.d.ts +6 -0
- package/dist/css/function-card.d.ts.map +1 -0
- package/dist/css/function-card.js +26 -0
- package/dist/css/function-card.js.map +1 -0
- package/dist/css/help-drawer.d.ts +6 -0
- package/dist/css/help-drawer.d.ts.map +1 -0
- package/dist/css/help-drawer.js +22 -0
- package/dist/css/help-drawer.js.map +1 -0
- package/dist/css/tabs.d.ts +9 -0
- package/dist/css/tabs.d.ts.map +1 -0
- package/dist/css/tabs.js +28 -0
- package/dist/css/tabs.js.map +1 -0
- package/dist/css/theme.d.ts +8 -0
- package/dist/css/theme.d.ts.map +1 -0
- package/dist/css/theme.js +34 -0
- package/dist/css/theme.js.map +1 -0
- package/dist/css.d.ts +13 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +30 -0
- package/dist/css.js.map +1 -0
- package/dist/generator.d.ts +33 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +161 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/overview.d.ts +13 -0
- package/dist/overview.d.ts.map +1 -0
- package/dist/overview.js +91 -0
- package/dist/overview.js.map +1 -0
- package/dist/recipes.d.ts +6 -0
- package/dist/recipes.d.ts.map +1 -0
- package/dist/recipes.js +68 -0
- package/dist/recipes.js.map +1 -0
- package/dist/sessions.d.ts +6 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +288 -0
- package/dist/sessions.js.map +1 -0
- package/dist/shared/el.d.ts +13 -0
- package/dist/shared/el.d.ts.map +1 -0
- package/dist/shared/el.js +27 -0
- package/dist/shared/el.js.map +1 -0
- package/dist/shared/pagination.d.ts +15 -0
- package/dist/shared/pagination.d.ts.map +1 -0
- package/dist/shared/pagination.js +113 -0
- package/dist/shared/pagination.js.map +1 -0
- package/dist/shared/sortable.d.ts +14 -0
- package/dist/shared/sortable.d.ts.map +1 -0
- package/dist/shared/sortable.js +101 -0
- package/dist/shared/sortable.js.map +1 -0
- package/dist/shared/tab-activators.d.ts +16 -0
- package/dist/shared/tab-activators.d.ts.map +1 -0
- package/dist/shared/tab-activators.js +33 -0
- package/dist/shared/tab-activators.js.map +1 -0
- package/dist/shared/tab-bar.d.ts +8 -0
- package/dist/shared/tab-bar.d.ts.map +1 -0
- package/dist/shared/tab-bar.js +20 -0
- package/dist/shared/tab-bar.js.map +1 -0
- package/dist/shared.d.ts +26 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +39 -0
- package/dist/shared.js.map +1 -0
- package/dist/subtab-bar.d.ts +23 -0
- package/dist/subtab-bar.d.ts.map +1 -0
- package/dist/subtab-bar.js +77 -0
- package/dist/subtab-bar.js.map +1 -0
- package/dist/tool-tab-registry.d.ts +76 -0
- package/dist/tool-tab-registry.d.ts.map +1 -0
- package/dist/tool-tab-registry.js +44 -0
- package/dist/tool-tab-registry.js.map +1 -0
- package/dist/tool-tabs-registrations.d.ts +19 -0
- package/dist/tool-tabs-registrations.d.ts.map +1 -0
- package/dist/tool-tabs-registrations.js +46 -0
- package/dist/tool-tabs-registrations.js.map +1 -0
- package/dist/tool-tabs.d.ts +12 -0
- package/dist/tool-tabs.d.ts.map +1 -0
- package/dist/tool-tabs.js +80 -0
- package/dist/tool-tabs.js.map +1 -0
- package/dist/vendor/cytoscape-bundle.js +600 -0
- package/package.json +52 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data tables — the `.data-table` shell used by every list view —
|
|
3
|
+
* plus check rows, findings, expander rows, badges, pagination, the
|
|
4
|
+
* search/filter bar, the long-description block, and the pass-rate
|
|
5
|
+
* progress bar.
|
|
6
|
+
*
|
|
7
|
+
* One file because all of these only ever appear inside a card body
|
|
8
|
+
* around a `.data-table`; splitting further would just create a pile
|
|
9
|
+
* of two-rule files.
|
|
10
|
+
*/
|
|
11
|
+
export function dashboardCssDataTable() {
|
|
12
|
+
return String.raw `
|
|
13
|
+
/* Table */
|
|
14
|
+
.data-table { width: 100%; border-collapse: collapse; }
|
|
15
|
+
/* Containment contract (defensive default).
|
|
16
|
+
- Headers are short labels: keep them on one line.
|
|
17
|
+
- Body cells WRAP and break long unbreakable tokens (file paths, regex,
|
|
18
|
+
code snippets in suggestions) so a free-text column can never overrun
|
|
19
|
+
the card edge and bleed past the page boundary.
|
|
20
|
+
- Short metric columns (timestamps, durations, counts) opt OUT with
|
|
21
|
+
the .cell-nowrap class to stay on a single line.
|
|
22
|
+
This makes "no horizontal bleed" the behaviour a view gets for free;
|
|
23
|
+
bleeding now requires a deliberate .cell-nowrap opt-out on long text. */
|
|
24
|
+
.data-table th { white-space: nowrap; }
|
|
25
|
+
.data-table td { white-space: normal; overflow-wrap: anywhere; }
|
|
26
|
+
.data-table td.cell-nowrap { white-space: nowrap; }
|
|
27
|
+
.data-table th { text-align: left; padding: 8px 12px; font-size: 12px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); font-weight: 600; cursor: pointer; }
|
|
28
|
+
.data-table th:hover { color: var(--text-muted); }
|
|
29
|
+
.data-table th[data-sort="asc"]::after { content: ' ▲'; font-size: 10px; }
|
|
30
|
+
.data-table th[data-sort="desc"]::after { content: ' ▼'; font-size: 10px; }
|
|
31
|
+
/* Shared cell baseline: every .data-table body cell renders in the standard
|
|
32
|
+
site font at a consistent size, so views don't drift or force monospace.
|
|
33
|
+
Set at the root here rather than per-view (item 13). */
|
|
34
|
+
.data-table td { padding: 8px 12px; border-bottom: 1px solid var(--border); font-size: 13px; font-family: var(--font); }
|
|
35
|
+
.data-table tr:hover { background: var(--bg-hover); }
|
|
36
|
+
.data-table tr.clickable { cursor: pointer; }
|
|
37
|
+
.data-table tr.selected { background: var(--bg-hover); border-left: 2px solid var(--accent); }
|
|
38
|
+
|
|
39
|
+
/* Check rows and findings */
|
|
40
|
+
.check-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border); }
|
|
41
|
+
.check-row:last-child { border-bottom: none; }
|
|
42
|
+
.check-icon { width: 20px; text-align: center; font-size: 14px; }
|
|
43
|
+
.check-icon.pass { color: var(--success); } .check-icon.fail { color: var(--error); }
|
|
44
|
+
.check-slug { font-weight: 500; flex: 1; }
|
|
45
|
+
.check-duration { color: var(--text-dim); font-size: 12px; min-width: 60px; text-align: right; }
|
|
46
|
+
.findings-toggle { background: none; border: none; color: var(--accent); cursor: pointer; font-size: 12px; padding: 2px 8px; border-radius: var(--radius-sm); }
|
|
47
|
+
.findings-toggle:hover { background: var(--bg-hover); }
|
|
48
|
+
.findings-list { display: none; padding: 8px 0 8px 32px; }
|
|
49
|
+
.findings-list.open { display: block; }
|
|
50
|
+
.finding-item { padding: 4px 0; font-size: 13px; color: var(--text-muted); border-left: 2px solid var(--border); padding-left: 12px; margin-bottom: 4px; }
|
|
51
|
+
.finding-file { color: var(--text-dim); font-size: 11px; }
|
|
52
|
+
.finding-sev { font-size: 11px; padding: 1px 6px; border-radius: 3px; font-weight: 500; }
|
|
53
|
+
.finding-sev.error { background: var(--error-light); color: var(--error); }
|
|
54
|
+
.finding-sev.warning { background: var(--warning-light); color: var(--warning); }
|
|
55
|
+
|
|
56
|
+
/* Expander rows */
|
|
57
|
+
.expander-row { display: none; }
|
|
58
|
+
.expander-row.open { display: table-row; }
|
|
59
|
+
.expander-content { padding: 8px 12px 16px 36px; background: var(--bg); border-left: 2px solid var(--accent); margin-left: 12px; }
|
|
60
|
+
.data-table tr.expanded td:first-child { color: var(--accent); }
|
|
61
|
+
.data-table tr.clickable:hover td:first-child { color: var(--accent); }
|
|
62
|
+
|
|
63
|
+
.badge { font-size: 11px; padding: 2px 8px; border-radius: 3px; font-weight: 500; display: inline-block; }
|
|
64
|
+
.badge-pass { background: var(--success-light); color: var(--success); }
|
|
65
|
+
.badge-fail { background: var(--error-light); color: var(--error); }
|
|
66
|
+
.badge-warn { background: var(--warning-light); color: var(--warning); }
|
|
67
|
+
|
|
68
|
+
/* Pagination */
|
|
69
|
+
.pagination { display: flex; align-items: center; justify-content: space-between; padding: 10px 0; margin-top: 8px; }
|
|
70
|
+
.pagination-info { font-size: 12px; color: var(--text-dim); }
|
|
71
|
+
.pagination-btns { display: flex; gap: 4px; }
|
|
72
|
+
.pagination-btn { background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 4px 12px; color: var(--text-muted); font-size: 12px; cursor: pointer; }
|
|
73
|
+
.pagination-btn:hover { background: var(--bg-hover); color: var(--text); }
|
|
74
|
+
.pagination-btn.disabled { opacity: 0.3; cursor: default; pointer-events: none; }
|
|
75
|
+
.pagination-btn.active { background: var(--accent); color: var(--bg); border-color: var(--accent); }
|
|
76
|
+
|
|
77
|
+
/* Tag badges */
|
|
78
|
+
.tag-badge { font-size: 10px; padding: 1px 6px; border-radius: 3px; background: var(--bg-hover); color: var(--text-muted); display: inline-block; margin-right: 3px; margin-bottom: 2px; white-space: nowrap; }
|
|
79
|
+
|
|
80
|
+
/* Confidence badges */
|
|
81
|
+
.badge-high { background: rgba(143,188,143,0.2); color: var(--success); }
|
|
82
|
+
.badge-medium { background: rgba(212,165,116,0.2); color: var(--warning); }
|
|
83
|
+
.badge-low { background: rgba(199,91,74,0.15); color: var(--text-dim); }
|
|
84
|
+
|
|
85
|
+
/* Search & filter bar */
|
|
86
|
+
.filter-bar { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }
|
|
87
|
+
.search-input { background: var(--bg-surface); color: var(--text); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 6px 10px; font-size: 13px; font-family: var(--font); width: 240px; }
|
|
88
|
+
.search-input::placeholder { color: var(--text-dim); }
|
|
89
|
+
.search-input:focus { outline: none; border-color: var(--accent); }
|
|
90
|
+
.filter-select { background: var(--bg-surface); color: var(--text); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 6px 8px; font-size: 12px; cursor: pointer; font-family: var(--font); }
|
|
91
|
+
|
|
92
|
+
/* Check long description */
|
|
93
|
+
.check-long-desc { padding: 12px 16px; color: var(--text-muted); font-size: 13px; line-height: 1.7; max-width: 800px; }
|
|
94
|
+
.check-long-desc strong { color: var(--text); font-weight: 600; }
|
|
95
|
+
.check-long-desc code { background: var(--bg-hover); padding: 1px 4px; border-radius: 2px; font-size: 12px; }
|
|
96
|
+
|
|
97
|
+
/* Pass rate bar */
|
|
98
|
+
.pass-rate-bar { display: inline-flex; align-items: center; gap: 6px; }
|
|
99
|
+
.pass-rate-track { width: 48px; height: 6px; border-radius: 3px; background: var(--bg-hover); overflow: hidden; display: inline-block; vertical-align: middle; }
|
|
100
|
+
.pass-rate-fill { height: 6px; border-radius: 3px; display: block; }
|
|
101
|
+
`;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=data-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table.js","sourceRoot":"","sources":["../../src/css/data-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFlB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-card.d.ts","sourceRoot":"","sources":["../../src/css/function-card.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAoBjD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Function Card overlay — the modal that appears when you click a
|
|
3
|
+
* function row in any Code Paths view.
|
|
4
|
+
*/
|
|
5
|
+
export function dashboardCssFunctionCard() {
|
|
6
|
+
return String.raw `
|
|
7
|
+
/* Function Card overlay */
|
|
8
|
+
.function-card-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.55); display: flex; align-items: flex-start; justify-content: center; padding: 60px 16px 16px; z-index: 1000; overflow-y: auto; }
|
|
9
|
+
.function-card { background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 18px 20px; max-width: 720px; width: 100%; max-height: calc(100vh - 80px); overflow-y: auto; box-shadow: 0 8px 24px rgba(0,0,0,0.4); }
|
|
10
|
+
.function-card h3 { color: var(--accent); text-transform: none; letter-spacing: 0; font-size: 16px; margin-bottom: 4px; }
|
|
11
|
+
.function-card .fc-loc { color: var(--text-dim); font-size: 12px; margin-bottom: 10px; word-break: break-all; }
|
|
12
|
+
.function-card .fc-meta { color: var(--text-muted); font-size: 12px; margin-bottom: 10px; }
|
|
13
|
+
.function-card .fc-section { border-top: 1px solid var(--border); padding-top: 10px; margin-top: 10px; }
|
|
14
|
+
.function-card .fc-section h4 { font-size: 12px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; font-weight: 600; }
|
|
15
|
+
.function-card .fc-list { list-style: none; padding: 0; margin: 0; }
|
|
16
|
+
.function-card .fc-list li { padding: 4px 0; font-size: 13px; cursor: pointer; color: var(--text); border-left: 2px solid transparent; padding-left: 8px; }
|
|
17
|
+
.function-card .fc-list li[data-body-hash]:hover { background: var(--bg-hover); border-left-color: var(--accent); }
|
|
18
|
+
.function-card .fc-list li.external { color: var(--text-dim); cursor: default; }
|
|
19
|
+
.function-card .fc-actions { display: flex; gap: 8px; margin-top: 12px; }
|
|
20
|
+
.function-card .fc-action { background: var(--bg-hover); color: var(--text); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 6px 12px; font-size: 12px; cursor: pointer; text-decoration: none; display: inline-block; }
|
|
21
|
+
.function-card .fc-action:hover { background: var(--accent); color: var(--bg); border-color: var(--accent); }
|
|
22
|
+
.function-card .fc-close { float: right; background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 18px; padding: 0 6px; }
|
|
23
|
+
.function-card .fc-close:hover { color: var(--text); }
|
|
24
|
+
`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=function-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-card.js","sourceRoot":"","sources":["../../src/css/function-card.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;CAkBlB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-drawer.d.ts","sourceRoot":"","sources":["../../src/css/help-drawer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAgB/C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help drawer — the right-side slide-out triggered by the inline `ⓘ`
|
|
3
|
+
* button next to each Code Paths view's section heading.
|
|
4
|
+
*/
|
|
5
|
+
export function dashboardCssHelpDrawer() {
|
|
6
|
+
return String.raw `
|
|
7
|
+
/* Help drawer (right-side slide-out) */
|
|
8
|
+
.help-drawer-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0); transition: background 0.2s ease; z-index: 1100; pointer-events: none; }
|
|
9
|
+
.help-drawer-overlay.open { background: rgba(0,0,0,0.45); pointer-events: auto; }
|
|
10
|
+
.help-drawer { position: absolute; top: 0; right: 0; height: 100vh; width: 420px; max-width: 90vw; background: var(--bg-surface); border-left: 1px solid var(--border); box-shadow: -8px 0 24px rgba(0,0,0,0.4); display: flex; flex-direction: column; transform: translateX(100%); transition: transform 0.25s ease; }
|
|
11
|
+
.help-drawer-overlay.open .help-drawer { transform: translateX(0); }
|
|
12
|
+
.help-drawer-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 20px; border-bottom: 1px solid var(--border); }
|
|
13
|
+
.help-drawer-header h3 { font-size: 16px; color: var(--accent); text-transform: none; letter-spacing: 0; margin: 0; }
|
|
14
|
+
.help-drawer-close { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 22px; line-height: 1; padding: 0 4px; }
|
|
15
|
+
.help-drawer-close:hover { color: var(--text); }
|
|
16
|
+
.help-drawer-body { padding: 16px 20px 24px; overflow-y: auto; flex: 1; }
|
|
17
|
+
.help-drawer-body h4 { font-size: 12px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.05em; margin: 14px 0 6px; font-weight: 600; }
|
|
18
|
+
.help-drawer-body h4:first-child { margin-top: 0; }
|
|
19
|
+
.help-drawer-body p { font-size: 13px; color: var(--text); margin: 0 0 10px; line-height: 1.6; }
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=help-drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-drawer.js","sourceRoot":"","sources":["../../src/css/help-drawer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;CAclB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level tabs and per-panel subtabs.
|
|
3
|
+
*
|
|
4
|
+
* Covers `.tab-bar` / `.tab` / `.tab-panel` (top of page) plus
|
|
5
|
+
* `.subtab-bar` / `.subtab` / `.subtab-panel` (within a tool tab,
|
|
6
|
+
* see subtab-bar.ts for the runtime helper).
|
|
7
|
+
*/
|
|
8
|
+
export declare function dashboardCssTabs(): string;
|
|
9
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/css/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAmBzC"}
|
package/dist/css/tabs.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level tabs and per-panel subtabs.
|
|
3
|
+
*
|
|
4
|
+
* Covers `.tab-bar` / `.tab` / `.tab-panel` (top of page) plus
|
|
5
|
+
* `.subtab-bar` / `.subtab` / `.subtab-panel` (within a tool tab,
|
|
6
|
+
* see subtab-bar.ts for the runtime helper).
|
|
7
|
+
*/
|
|
8
|
+
export function dashboardCssTabs() {
|
|
9
|
+
return String.raw `
|
|
10
|
+
/* Tabs */
|
|
11
|
+
.tab-bar { display: flex; gap: 0; border-bottom: 1px solid var(--border); margin-bottom: 24px; }
|
|
12
|
+
.tab { padding: 10px 20px; cursor: pointer; color: var(--text-dim); font-size: 13px; font-weight: 500; border-bottom: 2px solid transparent; transition: color 0.15s, border-color 0.15s; display: flex; align-items: center; gap: 6px; }
|
|
13
|
+
.tab svg { vertical-align: middle; }
|
|
14
|
+
.tab:hover { color: var(--text-secondary); }
|
|
15
|
+
.tab.active { color: var(--accent); border-bottom-color: var(--accent); }
|
|
16
|
+
.tab-panel { display: none; }
|
|
17
|
+
.tab-panel.active { display: block; }
|
|
18
|
+
|
|
19
|
+
/* Subtabs (within a tab panel) */
|
|
20
|
+
.subtab-bar { display: flex; gap: 0; border-bottom: 1px solid var(--border); margin-bottom: 16px; }
|
|
21
|
+
.subtab { padding: 8px 16px; cursor: pointer; color: var(--text-dim); font-size: 13px; font-weight: 500; border-bottom: 2px solid transparent; transition: color 0.15s; }
|
|
22
|
+
.subtab:hover { color: var(--text-secondary); }
|
|
23
|
+
.subtab.active { color: var(--text); border-bottom-color: var(--accent); }
|
|
24
|
+
.subtab-panel { display: none; }
|
|
25
|
+
.subtab-panel.active { display: block; }
|
|
26
|
+
`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/css/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;CAiBlB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard theme — `:root` design tokens, base reset, header.
|
|
3
|
+
*
|
|
4
|
+
* Defines colour palette, spacing radii, and typography variables
|
|
5
|
+
* that every other CSS file consumes. Must be concatenated first.
|
|
6
|
+
*/
|
|
7
|
+
export declare function dashboardCssTheme(): string;
|
|
8
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/css/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA0B1C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard theme — `:root` design tokens, base reset, header.
|
|
3
|
+
*
|
|
4
|
+
* Defines colour palette, spacing radii, and typography variables
|
|
5
|
+
* that every other CSS file consumes. Must be concatenated first.
|
|
6
|
+
*/
|
|
7
|
+
export function dashboardCssTheme() {
|
|
8
|
+
return String.raw `
|
|
9
|
+
:root {
|
|
10
|
+
--bg: #1a1210; --bg-surface: #231a16; --bg-card: #231a16;
|
|
11
|
+
--bg-hover: #3a2e27; --text: #f4ede5; --text-secondary: #e6ddd2;
|
|
12
|
+
--text-muted: #c0b2a2; --text-dim: #958474; --accent: #c49a6c;
|
|
13
|
+
--accent-fitness: #7ca068; --accent-sim: #9b8aa5;
|
|
14
|
+
--success: #8fbc8f; --success-light: rgba(143,188,143,0.2);
|
|
15
|
+
--warning: #d4a574; --warning-light: rgba(212,165,116,0.2);
|
|
16
|
+
--error: #c75b4a; --error-light: rgba(199,91,74,0.2);
|
|
17
|
+
--border: #3a2e27; --border-light: #483a31;
|
|
18
|
+
--font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
19
|
+
--font-display: "Fraunces", Georgia, "Times New Roman", serif;
|
|
20
|
+
--radius: 8px; --radius-sm: 4px;
|
|
21
|
+
}
|
|
22
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
23
|
+
body { background: var(--bg); color: var(--text); font-family: var(--font); font-size: 14px; line-height: 1.6; padding: 24px; max-width: 1200px; margin: 0 auto; }
|
|
24
|
+
h1 { font-family: var(--font-display); font-size: 22px; font-weight: 500; margin-bottom: 4px; }
|
|
25
|
+
h1 .brand-open { color: var(--accent); }
|
|
26
|
+
h3 { font-size: 14px; font-weight: 600; margin-bottom: 8px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; }
|
|
27
|
+
.header { display: flex; align-items: center; gap: 16px; margin-bottom: 24px; }
|
|
28
|
+
.header-icon { color: var(--accent); display: flex; align-items: center; }
|
|
29
|
+
.header-brand { color: var(--accent); font-size: 13px; font-weight: 500; }
|
|
30
|
+
.footer { color: var(--text-dim); font-size: 12px; text-align: center; padding: 24px 0; border-top: 1px solid var(--border); margin-top: 32px; }
|
|
31
|
+
.footer a { color: var(--accent); text-decoration: none; }
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/css/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;CAwBlB,CAAC;AACF,CAAC"}
|
package/dist/css.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard CSS — concatenates the per-concern stylesheets in
|
|
3
|
+
* `css/` into the single `<style>` block the generator inlines.
|
|
4
|
+
*
|
|
5
|
+
* Pre-F12 this was a 220-line `String.raw` literal mixing eight
|
|
6
|
+
* concerns (theme tokens, header, tabs, subtabs, cards/stats,
|
|
7
|
+
* data-table, pagination, badges, code-paths views, function-card
|
|
8
|
+
* overlay, help-drawer). Each concern is now its own file in
|
|
9
|
+
* `css/`; the order below matches the original source order so
|
|
10
|
+
* the emitted stylesheet remains byte-stable for snapshot tests.
|
|
11
|
+
*/
|
|
12
|
+
export declare function dashboardCss(): string;
|
|
13
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,wBAAgB,YAAY,IAAI,MAAM,CAUrC"}
|
package/dist/css.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard CSS — concatenates the per-concern stylesheets in
|
|
3
|
+
* `css/` into the single `<style>` block the generator inlines.
|
|
4
|
+
*
|
|
5
|
+
* Pre-F12 this was a 220-line `String.raw` literal mixing eight
|
|
6
|
+
* concerns (theme tokens, header, tabs, subtabs, cards/stats,
|
|
7
|
+
* data-table, pagination, badges, code-paths views, function-card
|
|
8
|
+
* overlay, help-drawer). Each concern is now its own file in
|
|
9
|
+
* `css/`; the order below matches the original source order so
|
|
10
|
+
* the emitted stylesheet remains byte-stable for snapshot tests.
|
|
11
|
+
*/
|
|
12
|
+
import { dashboardCssCards } from './css/cards.js';
|
|
13
|
+
import { dashboardCssCodePaths } from './css/code-paths.js';
|
|
14
|
+
import { dashboardCssDataTable } from './css/data-table.js';
|
|
15
|
+
import { dashboardCssFunctionCard } from './css/function-card.js';
|
|
16
|
+
import { dashboardCssHelpDrawer } from './css/help-drawer.js';
|
|
17
|
+
import { dashboardCssTabs } from './css/tabs.js';
|
|
18
|
+
import { dashboardCssTheme } from './css/theme.js';
|
|
19
|
+
export function dashboardCss() {
|
|
20
|
+
return [
|
|
21
|
+
dashboardCssTheme(),
|
|
22
|
+
dashboardCssTabs(),
|
|
23
|
+
dashboardCssCards(),
|
|
24
|
+
dashboardCssDataTable(),
|
|
25
|
+
dashboardCssCodePaths(),
|
|
26
|
+
dashboardCssFunctionCard(),
|
|
27
|
+
dashboardCssHelpDrawer(),
|
|
28
|
+
].join('\n');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=css.js.map
|
package/dist/css.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL,iBAAiB,EAAE;QACnB,gBAAgB,EAAE;QAClB,iBAAiB,EAAE;QACnB,qBAAqB,EAAE;QACvB,qBAAqB,EAAE;QACvB,wBAAwB,EAAE;QAC1B,sBAAsB,EAAE;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard HTML generator — orchestrates all modules into a single self-contained HTML file.
|
|
3
|
+
*
|
|
4
|
+
* Composes CSS, shared JS, and tab-specific JS into one HTML string with all data inlined.
|
|
5
|
+
* Each tool tab (Fitness, Simulation) has subtabs: Sessions, Catalog, Recipes.
|
|
6
|
+
*/
|
|
7
|
+
import './tool-tabs-registrations.js';
|
|
8
|
+
import type { StoredSession, GraphCatalog } from '@opensip-cli/contracts';
|
|
9
|
+
/**
|
|
10
|
+
* Inputs to the dashboard HTML generator.
|
|
11
|
+
*
|
|
12
|
+
* `sessions` is required; everything else has a sensible default
|
|
13
|
+
* (empty array / null) so a Tool that does not produce a catalog or
|
|
14
|
+
* recipes can call `generateDashboardHtml({ sessions })` and get a
|
|
15
|
+
* working dashboard.
|
|
16
|
+
*
|
|
17
|
+
* Future tool-shaped data — alarm history, dependency graphs, simulation
|
|
18
|
+
* traces — will land as new optional fields on this interface rather
|
|
19
|
+
* than as new positional parameters. That keeps the call site
|
|
20
|
+
* order-independent and the public API source-stable.
|
|
21
|
+
*/
|
|
22
|
+
export interface DashboardInput {
|
|
23
|
+
sessions: StoredSession[];
|
|
24
|
+
checkCatalog?: readonly unknown[];
|
|
25
|
+
recipeCatalog?: readonly unknown[];
|
|
26
|
+
graphCatalog?: GraphCatalog | null;
|
|
27
|
+
graphRuleCatalog?: readonly unknown[];
|
|
28
|
+
graphRecipeCatalog?: readonly unknown[];
|
|
29
|
+
editorProtocol?: string | null;
|
|
30
|
+
}
|
|
31
|
+
/** Renders a self-contained HTML dashboard string from sessions and catalog inputs. */
|
|
32
|
+
export declare function generateDashboardHtml(input: DashboardInput): string;
|
|
33
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,8BAA8B,CAAC;AAGtC,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAM1B,YAAY,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAMnC,gBAAgB,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,kBAAkB,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAiDD,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CA2GnE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard HTML generator — orchestrates all modules into a single self-contained HTML file.
|
|
3
|
+
*
|
|
4
|
+
* Composes CSS, shared JS, and tab-specific JS into one HTML string with all data inlined.
|
|
5
|
+
* Each tool tab (Fitness, Simulation) has subtabs: Sessions, Catalog, Recipes.
|
|
6
|
+
*/
|
|
7
|
+
import { dashboardChecksJs } from './checks.js';
|
|
8
|
+
import { projectCatalogToGraphViewModel } from './code-paths/graph-view-model.js';
|
|
9
|
+
import { dashboardCodePathsJs } from './code-paths.js';
|
|
10
|
+
import { dashboardCss } from './css.js';
|
|
11
|
+
import { dashboardOverviewJs } from './overview.js';
|
|
12
|
+
import { dashboardRecipesJs } from './recipes.js';
|
|
13
|
+
import { dashboardSessionsJs } from './sessions.js';
|
|
14
|
+
import { dashboardSharedJs } from './shared.js';
|
|
15
|
+
import { dashboardSubtabBarJs } from './subtab-bar.js';
|
|
16
|
+
import { listToolTabs } from './tool-tab-registry.js';
|
|
17
|
+
import './tool-tabs-registrations.js'; // side-effect: registers fit/sim/graph
|
|
18
|
+
import { dashboardToolTabsJs } from './tool-tabs.js';
|
|
19
|
+
// Escape all < and > to prevent script injection in HTML <script> context
|
|
20
|
+
function escapeForScriptContext(json) {
|
|
21
|
+
return json.replaceAll('<', String.raw `\u003c`).replaceAll('>', String.raw `\u003e`);
|
|
22
|
+
}
|
|
23
|
+
// Coerce a session.score into a finite number safe for HTML interpolation
|
|
24
|
+
// in the <title> tag. Returns 0 for non-finite values so the rendered
|
|
25
|
+
// title remains well-formed even if a legacy or corrupted session row
|
|
26
|
+
// somehow carries a non-numeric score.
|
|
27
|
+
function coerceScoreForTitle(score) {
|
|
28
|
+
const n = Number(score);
|
|
29
|
+
return Number.isFinite(n) ? n : 0;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Serialize an optional value into either a `<script type="application/json">`
|
|
33
|
+
* blob (kind `'json'`) or a JS `const X = …;` literal (kind `'literal'`).
|
|
34
|
+
*
|
|
35
|
+
* Both call sites used to inline the same escape-then-stringify dance;
|
|
36
|
+
* folding them into one helper means the script-context escape is
|
|
37
|
+
* applied uniformly and the null-vs-supplied branching is in one place.
|
|
38
|
+
*
|
|
39
|
+
* - `'json'`: emits `<script type="application/json" id="<id>">…</script>`
|
|
40
|
+
* when `value` is not null/undefined; emits the empty string otherwise.
|
|
41
|
+
* - `'literal'`: emits `const <id> = …;` always — `null` is rendered as
|
|
42
|
+
* the JS literal `null`, anything else as `JSON.stringify(value)`.
|
|
43
|
+
*/
|
|
44
|
+
function serializeOptionalBlob(id, value, kind) {
|
|
45
|
+
switch (kind) {
|
|
46
|
+
case 'json': {
|
|
47
|
+
if (value === null || value === undefined)
|
|
48
|
+
return '';
|
|
49
|
+
const escaped = escapeForScriptContext(JSON.stringify(value));
|
|
50
|
+
return `<script type="application/json" id="${id}">${escaped}</script>`;
|
|
51
|
+
}
|
|
52
|
+
case 'literal': {
|
|
53
|
+
// Apply the same script-context escape as the 'json' arm — without it,
|
|
54
|
+
// a value containing the literal sequence `</script>` would close the
|
|
55
|
+
// surrounding inline <script> block (JSON.stringify does not escape `<`).
|
|
56
|
+
const rendered = value === null || value === undefined
|
|
57
|
+
? 'null'
|
|
58
|
+
: escapeForScriptContext(JSON.stringify(value));
|
|
59
|
+
return `const ${id} = ${rendered};`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Renders a self-contained HTML dashboard string from sessions and catalog inputs. */
|
|
64
|
+
export function generateDashboardHtml(input) {
|
|
65
|
+
const { sessions, checkCatalog = [], recipeCatalog = [], graphCatalog = null, graphRuleCatalog = [], graphRecipeCatalog = [], editorProtocol = null, } = input;
|
|
66
|
+
const latest = sessions[0];
|
|
67
|
+
// Coerce score to a finite number before interpolating into the <title>
|
|
68
|
+
// tag — `latest.score` is typed `number` but originates from a SQLite
|
|
69
|
+
// column and a corrupt or legacy row could carry an arbitrary value.
|
|
70
|
+
// Number(NaN-ish) on a string still yields NaN; we substitute 0 to keep
|
|
71
|
+
// the page title well-formed in the pathological case.
|
|
72
|
+
const latestScoreSafe = latest ? coerceScoreForTitle(latest.score) : 0;
|
|
73
|
+
const safeDataJson = escapeForScriptContext(JSON.stringify(sessions));
|
|
74
|
+
const safeCatalogJson = escapeForScriptContext(JSON.stringify(checkCatalog));
|
|
75
|
+
const safeRecipeJson = escapeForScriptContext(JSON.stringify(recipeCatalog));
|
|
76
|
+
const safeGraphRuleCatalogJson = escapeForScriptContext(JSON.stringify(graphRuleCatalog));
|
|
77
|
+
const safeGraphRecipeCatalogJson = escapeForScriptContext(JSON.stringify(graphRecipeCatalog));
|
|
78
|
+
const graphCatalogBlock = serializeOptionalBlob('graph-catalog', graphCatalog, 'json');
|
|
79
|
+
// The Visualization view (view-graph.ts) consumes a slim, pre-projected
|
|
80
|
+
// view-model rather than the raw catalog: projection aggregates the
|
|
81
|
+
// function call graph up to PACKAGE nodes + package→package edges (with
|
|
82
|
+
// coupling weights + cross-package SCCs) here at generation time and embeds
|
|
83
|
+
// it as its own JSON blob, sized for the renderer rather than for storage.
|
|
84
|
+
// See code-paths/graph-view-model.ts.
|
|
85
|
+
const graphViewModel = graphCatalog ? projectCatalogToGraphViewModel(graphCatalog) : null;
|
|
86
|
+
const graphViewModelBlock = serializeOptionalBlob('graph-view-model', graphViewModel, 'json');
|
|
87
|
+
const editorProtocolJs = serializeOptionalBlob('EDITOR_PROTOCOL', editorProtocol, 'literal');
|
|
88
|
+
// Tool tabs are registered into a single registry; Overview is a
|
|
89
|
+
// cross-tool aggregate kept fixed at position 0. The HTML tab
|
|
90
|
+
// buttons, panel containers, and the renderXxxTab() invocation list
|
|
91
|
+
// all derive from the same iteration so adding a new tab is a single
|
|
92
|
+
// defineToolTab() call (see tool-tabs-registrations.ts).
|
|
93
|
+
const toolTabs = listToolTabs();
|
|
94
|
+
const toolTabButtons = toolTabs
|
|
95
|
+
.map((t) => ` <div class="tab" data-tab="${t.id}">${t.icon} ${t.label}</div>`)
|
|
96
|
+
.join('\n');
|
|
97
|
+
const toolTabPanels = toolTabs
|
|
98
|
+
.map((t) => `<div id="panel-${t.id}" class="tab-panel"></div>`)
|
|
99
|
+
.join('\n');
|
|
100
|
+
const toolTabRenderCalls = toolTabs.map((t) => `${t.renderFunctionName}();`).join('\n');
|
|
101
|
+
return `<!DOCTYPE html>
|
|
102
|
+
<html lang="en">
|
|
103
|
+
<head>
|
|
104
|
+
<meta charset="utf-8">
|
|
105
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
106
|
+
<title>OpenSIP CLI${latest ? ` — Pass Rate: ${latestScoreSafe}%` : ''}</title>
|
|
107
|
+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M4 8h12a4 4 0 0 1 0 8h-1M4 8v8a4 4 0 0 0 4 4h4a4 4 0 0 0 4-4V8M4 8H2M6 4c0 1 .5 2 1 2.5M10 3c0 1.5.5 2.5 1 3M14 4c0 1 .5 2 1 2.5' stroke='%23c4956a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E">
|
|
108
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
109
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&display=swap" rel="stylesheet">
|
|
110
|
+
<style>
|
|
111
|
+
${dashboardCss()}
|
|
112
|
+
</style>
|
|
113
|
+
</head>
|
|
114
|
+
<body>
|
|
115
|
+
|
|
116
|
+
<div class="header">
|
|
117
|
+
<span class="header-icon"><svg width="28" height="28" viewBox="0 0 24 24" fill="none"><path d="M4 8h12a4 4 0 0 1 0 8h-1M4 8v8a4 4 0 0 0 4 4h4a4 4 0 0 0 4-4V8M4 8H2M6 4c0 1 .5 2 1 2.5M10 3c0 1.5.5 2.5 1 3M14 4c0 1 .5 2 1 2.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
|
|
118
|
+
<div><h1><span class="brand-open">Open</span>SIP Tools</h1></div>
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
<div class="tab-bar" id="tab-bar">
|
|
122
|
+
<div class="tab active" data-tab="overview"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="9" x="3" y="3" rx="1"/><rect width="7" height="5" x="14" y="3" rx="1"/><rect width="7" height="9" x="14" y="12" rx="1"/><rect width="7" height="5" x="3" y="16" rx="1"/></svg> Overview</div>
|
|
123
|
+
${toolTabButtons}
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div id="panel-overview" class="tab-panel active"></div>
|
|
127
|
+
${toolTabPanels}
|
|
128
|
+
|
|
129
|
+
<div class="footer">Generated by <strong>OpenSIP CLI</strong> — <a href="https://opensip.ai">opensip.ai</a></div>
|
|
130
|
+
|
|
131
|
+
${graphCatalogBlock}
|
|
132
|
+
${graphViewModelBlock}
|
|
133
|
+
<script>
|
|
134
|
+
const sessions = ${safeDataJson};
|
|
135
|
+
const checkCatalog = ${safeCatalogJson};
|
|
136
|
+
const recipeCatalog = ${safeRecipeJson};
|
|
137
|
+
const graphRuleCatalog = ${safeGraphRuleCatalogJson};
|
|
138
|
+
const graphRecipeCatalog = ${safeGraphRecipeCatalogJson};
|
|
139
|
+
${editorProtocolJs}
|
|
140
|
+
const fitSessions = sessions.filter(s => s.tool === 'fit');
|
|
141
|
+
const simSessions = sessions.filter(s => s.tool === 'sim');
|
|
142
|
+
|
|
143
|
+
${dashboardSharedJs()}
|
|
144
|
+
${dashboardSubtabBarJs()}
|
|
145
|
+
${dashboardOverviewJs()}
|
|
146
|
+
${dashboardSessionsJs()}
|
|
147
|
+
${dashboardChecksJs()}
|
|
148
|
+
${dashboardRecipesJs()}
|
|
149
|
+
${dashboardToolTabsJs()}
|
|
150
|
+
${dashboardCodePathsJs()}
|
|
151
|
+
|
|
152
|
+
// =======================================================
|
|
153
|
+
// RENDER TABS
|
|
154
|
+
// =======================================================
|
|
155
|
+
renderOverview();
|
|
156
|
+
${toolTabRenderCalls}
|
|
157
|
+
</script>
|
|
158
|
+
</body>
|
|
159
|
+
</html>`;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @opensip-cli/dashboard — self-contained HTML report generator.
|
|
3
|
+
*
|
|
4
|
+
* Renders the OpenSIP CLI dashboard from a list of stored sessions, a
|
|
5
|
+
* fitness check catalog, a recipe catalog, and (optionally) a graph
|
|
6
|
+
* catalog. The output is a single self-contained HTML string with all
|
|
7
|
+
* CSS and JS inlined — no external assets, no fetches, no server.
|
|
8
|
+
*
|
|
9
|
+
* The `GraphCatalog` and per-shape types live in
|
|
10
|
+
* `@opensip-cli/contracts` because they are the contract surface
|
|
11
|
+
* between the graph tool (catalog producer) and this package
|
|
12
|
+
* (consumer); both depend on contracts.
|
|
13
|
+
*
|
|
14
|
+
* This package depends only on `@opensip-cli/contracts` for type
|
|
15
|
+
* shapes (sessions, catalog entries, graph catalog). It MUST NOT
|
|
16
|
+
* depend on `@opensip-cli/core`, any tool engine, the CLI, or any
|
|
17
|
+
* UI framework — its job is one pure transformation.
|
|
18
|
+
*/
|
|
19
|
+
export { generateDashboardHtml } from './generator.js';
|
|
20
|
+
export type { DashboardInput } from './generator.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @opensip-cli/dashboard — self-contained HTML report generator.
|
|
3
|
+
*
|
|
4
|
+
* Renders the OpenSIP CLI dashboard from a list of stored sessions, a
|
|
5
|
+
* fitness check catalog, a recipe catalog, and (optionally) a graph
|
|
6
|
+
* catalog. The output is a single self-contained HTML string with all
|
|
7
|
+
* CSS and JS inlined — no external assets, no fetches, no server.
|
|
8
|
+
*
|
|
9
|
+
* The `GraphCatalog` and per-shape types live in
|
|
10
|
+
* `@opensip-cli/contracts` because they are the contract surface
|
|
11
|
+
* between the graph tool (catalog producer) and this package
|
|
12
|
+
* (consumer); both depend on contracts.
|
|
13
|
+
*
|
|
14
|
+
* This package depends only on `@opensip-cli/contracts` for type
|
|
15
|
+
* shapes (sessions, catalog entries, graph catalog). It MUST NOT
|
|
16
|
+
* depend on `@opensip-cli/core`, any tool engine, the CLI, or any
|
|
17
|
+
* UI framework — its job is one pure transformation.
|
|
18
|
+
*/
|
|
19
|
+
export { generateDashboardHtml } from './generator.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Overview tab — cross-tool recent activity table.
|
|
3
|
+
* Returns JS code as a string.
|
|
4
|
+
*
|
|
5
|
+
* The `toolBadgeStyles` and `tabMap` literals spliced into the emitted
|
|
6
|
+
* JS are derived from the `defineToolTab` registry rather than
|
|
7
|
+
* hard-coded — every registered tool tab contributes one entry to
|
|
8
|
+
* each map. Adding a new tool is a `defineToolTab` call; this
|
|
9
|
+
* function picks it up automatically. (F1/F8.)
|
|
10
|
+
*/
|
|
11
|
+
import './tool-tabs-registrations.js';
|
|
12
|
+
export declare function dashboardOverviewJs(): string;
|
|
13
|
+
//# sourceMappingURL=overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../src/overview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,8BAA8B,CAAC;AAEtC,wBAAgB,mBAAmB,IAAI,MAAM,CA6E5C"}
|