@ponchia/ui 0.6.6 → 0.6.7

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.
Files changed (108) hide show
  1. package/CHANGELOG.md +105 -6
  2. package/README.md +36 -23
  3. package/behaviors/carousel.d.ts.map +1 -1
  4. package/behaviors/carousel.js +3 -0
  5. package/behaviors/dialog.d.ts.map +1 -1
  6. package/behaviors/dialog.js +14 -8
  7. package/behaviors/forms.d.ts.map +1 -1
  8. package/behaviors/forms.js +11 -5
  9. package/behaviors/index.d.ts +2 -0
  10. package/behaviors/index.d.ts.map +1 -1
  11. package/behaviors/index.js +2 -0
  12. package/behaviors/internal.d.ts +2 -1
  13. package/behaviors/internal.d.ts.map +1 -1
  14. package/behaviors/internal.js +23 -3
  15. package/behaviors/legend.d.ts.map +1 -1
  16. package/behaviors/legend.js +41 -9
  17. package/behaviors/splitter.d.ts +26 -0
  18. package/behaviors/splitter.d.ts.map +1 -0
  19. package/behaviors/splitter.js +200 -0
  20. package/behaviors/table.js +3 -3
  21. package/behaviors/theme.js +2 -2
  22. package/classes/classes.json +230 -4
  23. package/classes/index.d.ts +49 -1
  24. package/classes/index.js +56 -1
  25. package/classes/vscode.css-custom-data.json +1 -1
  26. package/css/analytical.css +3 -1
  27. package/css/app.css +4 -4
  28. package/css/clamp.css +92 -0
  29. package/css/figure.css +102 -0
  30. package/css/highlights.css +50 -0
  31. package/css/interval.css +90 -0
  32. package/css/primitives.css +2 -3
  33. package/css/report-kit.css +38 -0
  34. package/css/report.css +23 -4
  35. package/css/sidenote.css +12 -2
  36. package/css/site.css +2 -1
  37. package/css/sources.css +5 -0
  38. package/css/state.css +120 -1
  39. package/css/table.css +4 -0
  40. package/css/tokens.css +9 -9
  41. package/css/workbench.css +101 -8
  42. package/dist/bronto.css +1 -1
  43. package/dist/css/analytical.css +1 -1
  44. package/dist/css/app.css +1 -1
  45. package/dist/css/clamp.css +1 -0
  46. package/dist/css/figure.css +1 -0
  47. package/dist/css/highlights.css +1 -0
  48. package/dist/css/interval.css +1 -0
  49. package/dist/css/primitives.css +1 -1
  50. package/dist/css/report-kit.css +1 -0
  51. package/dist/css/report.css +1 -1
  52. package/dist/css/sidenote.css +1 -1
  53. package/dist/css/site.css +1 -1
  54. package/dist/css/sources.css +1 -1
  55. package/dist/css/state.css +1 -1
  56. package/dist/css/table.css +1 -1
  57. package/dist/css/tokens.css +1 -1
  58. package/dist/css/workbench.css +1 -1
  59. package/docs/adr/0002-scope-and-2026-baseline.md +1 -1
  60. package/docs/architecture.md +67 -43
  61. package/docs/clamp.md +49 -0
  62. package/docs/contrast.md +34 -24
  63. package/docs/d2.md +37 -0
  64. package/docs/figure.md +71 -0
  65. package/docs/frontier-primitives.md +25 -24
  66. package/docs/highlights.md +52 -0
  67. package/docs/interop/tailwind.md +148 -0
  68. package/docs/interval.md +55 -0
  69. package/docs/legends.md +3 -2
  70. package/docs/mermaid.md +6 -0
  71. package/docs/migrations/0.2-to-0.3.md +80 -0
  72. package/docs/migrations/0.3-to-0.4.md +48 -0
  73. package/docs/migrations/0.4-to-0.5.md +96 -0
  74. package/docs/migrations/0.5-to-0.6.md +82 -0
  75. package/docs/package-contract.md +40 -2
  76. package/docs/reference.md +78 -5
  77. package/docs/reporting.md +113 -58
  78. package/docs/sidenote.md +7 -1
  79. package/docs/sources.md +1 -1
  80. package/docs/stability.md +5 -3
  81. package/docs/state.md +67 -10
  82. package/docs/theming.md +10 -2
  83. package/docs/usage.md +31 -11
  84. package/docs/workbench.md +59 -18
  85. package/llms.txt +80 -12
  86. package/package.json +66 -6
  87. package/qwik/index.d.ts +1 -0
  88. package/qwik/index.d.ts.map +1 -1
  89. package/qwik/index.js +26 -21
  90. package/react/index.d.ts +1 -0
  91. package/react/index.d.ts.map +1 -1
  92. package/react/index.js +4 -1
  93. package/schemas/report-claims.v1.schema.json +137 -0
  94. package/solid/index.d.ts +2 -0
  95. package/solid/index.d.ts.map +1 -1
  96. package/solid/index.js +3 -0
  97. package/svelte/index.d.ts +88 -0
  98. package/svelte/index.d.ts.map +1 -0
  99. package/svelte/index.js +166 -0
  100. package/tailwind.css +87 -0
  101. package/tokens/figma.variables.json +2241 -0
  102. package/tokens/index.js +1 -1
  103. package/tokens/index.json +2 -2
  104. package/tokens/resolved.json +3 -3
  105. package/tokens/tokens.dtcg.json +1 -1
  106. package/vue/index.d.ts +79 -0
  107. package/vue/index.d.ts.map +1 -0
  108. package/vue/index.js +197 -0
package/classes/index.js CHANGED
@@ -346,6 +346,16 @@ export const cls = Object.freeze({
346
346
  compare2up: 'ui-compare--2up',
347
347
  compareCol: 'ui-compare__col',
348
348
  compareHead: 'ui-compare__head',
349
+ // figure — analytical/report figure stage (css/figure.css)
350
+ figure: 'ui-figure',
351
+ figureCaption: 'ui-figure__caption',
352
+ figureBody: 'ui-figure__body',
353
+ figureBodyKeyRight: 'ui-figure__body--key-right',
354
+ figureStage: 'ui-figure__stage',
355
+ figureMedia: 'ui-figure__media',
356
+ figureOverlay: 'ui-figure__overlay',
357
+ figureKey: 'ui-figure__key',
358
+ figureData: 'ui-figure__data',
349
359
  // legend (standalone data keys — css/legend.css)
350
360
  legend: 'ui-legend',
351
361
  legendVertical: 'ui-legend--vertical',
@@ -483,6 +493,22 @@ export const cls = Object.freeze({
483
493
  srcReviewed: 'ui-src--reviewed',
484
494
  srcStale: 'ui-src--stale',
485
495
  srcConflict: 'ui-src--conflict',
496
+ // interval — low/high uncertainty span (css/interval.css)
497
+ interval: 'ui-interval',
498
+ intervalTrack: 'ui-interval__track',
499
+ intervalRange: 'ui-interval__range',
500
+ intervalPoint: 'ui-interval__point',
501
+ intervalLabel: 'ui-interval__label',
502
+ intervalBounds: 'ui-interval__bounds',
503
+ // clamp — bounded excerpt + reveal (css/clamp.css)
504
+ clamp: 'ui-clamp',
505
+ clampBody: 'ui-clamp__body',
506
+ clampToggle: 'ui-clamp__toggle',
507
+ clampControl: 'ui-clamp__control',
508
+ clampMore: 'ui-clamp__more',
509
+ clampLess: 'ui-clamp__less',
510
+ // highlights — CSS Custom Highlight API paint host (css/highlights.css)
511
+ highlights: 'ui-highlights',
486
512
  // diff — line/row change-review grammar (css/diff.css)
487
513
  diff: 'ui-diff',
488
514
  diffSplit: 'ui-diff--split',
@@ -558,6 +584,20 @@ export const cls = Object.freeze({
558
584
  stateReviewed: 'ui-state--reviewed',
559
585
  stateNeedsReview: 'ui-state--needs-review',
560
586
  syncbar: 'ui-syncbar',
587
+ job: 'ui-job',
588
+ jobHead: 'ui-job__head',
589
+ jobTitle: 'ui-job__title',
590
+ jobMeta: 'ui-job__meta',
591
+ jobBody: 'ui-job__body',
592
+ jobProgress: 'ui-job__progress',
593
+ jobBar: 'ui-job__bar',
594
+ jobActions: 'ui-job__actions',
595
+ jobCompact: 'ui-job--compact',
596
+ jobQueued: 'ui-job--queued',
597
+ jobRunning: 'ui-job--running',
598
+ jobBlocked: 'ui-job--blocked',
599
+ jobFailed: 'ui-job--failed',
600
+ jobComplete: 'ui-job--complete',
561
601
  // generated content / AI-trust surfaces (css/generated.css)
562
602
  generated: 'ui-generated',
563
603
  generatedLabel: 'ui-generated__label',
@@ -570,7 +610,7 @@ export const cls = Object.freeze({
570
610
  toolCallName: 'ui-tool-call__name',
571
611
  toolCallStatus: 'ui-tool-call__status',
572
612
  toolCallBody: 'ui-tool-call__body',
573
- // workbench — inspector / property / selection bar (css/workbench.css)
613
+ // workbench — inspector / property / selection bar / splitter (css/workbench.css)
574
614
  inspector: 'ui-inspector',
575
615
  inspectorHead: 'ui-inspector__head',
576
616
  inspectorBody: 'ui-inspector__body',
@@ -580,6 +620,11 @@ export const cls = Object.freeze({
580
620
  selectionbar: 'ui-selectionbar',
581
621
  selectionbarCount: 'ui-selectionbar__count',
582
622
  selectionbarActions: 'ui-selectionbar__actions',
623
+ splitter: 'ui-splitter',
624
+ splitterVertical: 'ui-splitter--vertical',
625
+ splitterHorizontal: 'ui-splitter--horizontal',
626
+ splitterPane: 'ui-splitter__pane',
627
+ splitterHandle: 'ui-splitter__handle',
583
628
  // command palette shell (css/command.css + initCommand)
584
629
  command: 'ui-command',
585
630
  commandInput: 'ui-command__input',
@@ -673,6 +718,15 @@ const stateTone = (state) =>
673
718
  'needs-review': cls.stateNeedsReview,
674
719
  })[state] || '';
675
720
 
721
+ const jobTone = (state) =>
722
+ ({
723
+ queued: cls.jobQueued,
724
+ running: cls.jobRunning,
725
+ blocked: cls.jobBlocked,
726
+ failed: cls.jobFailed,
727
+ complete: cls.jobComplete,
728
+ })[state] || '';
729
+
676
730
  // Trust-state → tone class, shared by the source/citation/provenance recipes.
677
731
  // Object-literal lookup to match stateTone above (shorter, greppable, one idiom).
678
732
  const srcTone = (state) =>
@@ -987,6 +1041,7 @@ export const ui = {
987
1041
  tone === 'neg' && cls.bulletMeasureNeg,
988
1042
  ),
989
1043
  state: ({ state, busy } = {}) => j(cls.state, stateTone(state), busy && cls.stateBusy),
1044
+ job: ({ state, compact } = {}) => j(cls.job, jobTone(state), compact && cls.jobCompact),
990
1045
  originLabel: ({ ai } = {}) => j(cls.originLabel, ai && cls.originLabelAi),
991
1046
  };
992
1047
 
@@ -39,7 +39,7 @@
39
39
  },
40
40
  {
41
41
  "name": "--accent-strong",
42
- "description": "Theme token. Light: `color-mix(in srgb, var(--accent) 83%, #000)` · Dark: `color-mix(in srgb, var(--accent) 84%, #fff)`"
42
+ "description": "Theme token. Light: `color-mix(in srgb, var(--accent) 83%, #000)` · Dark: `color-mix(in srgb, var(--accent) 80%, #fff)`"
43
43
  },
44
44
  {
45
45
  "name": "--accent-text",
@@ -1,7 +1,7 @@
1
1
  /* ==========================================================================
2
2
  analytical — convenience roll-up of the opt-in analytical-primitive layers.
3
3
 
4
- Import this one file instead of the seven leaves when you're building
4
+ Import this one file instead of the nine leaves when you're building
5
5
  analytical / generated-report UI:
6
6
 
7
7
  @import '@ponchia/ui';
@@ -13,9 +13,11 @@
13
13
  ========================================================================== */
14
14
 
15
15
  @import url('./annotations.css') layer(bronto);
16
+ @import url('./figure.css') layer(bronto);
16
17
  @import url('./legend.css') layer(bronto);
17
18
  @import url('./marks.css') layer(bronto);
18
19
  @import url('./connectors.css') layer(bronto);
19
20
  @import url('./spotlight.css') layer(bronto);
20
21
  @import url('./crosshair.css') layer(bronto);
21
22
  @import url('./selection.css') layer(bronto);
23
+ @import url('./highlights.css') layer(bronto);
package/css/app.css CHANGED
@@ -1,6 +1,6 @@
1
1
  /* ==========================================================================
2
- app — admin shell (sidebar + topbar + panels + metrics)
3
- For admin / operator dashboards.
2
+ app — service shell (sidebar + topbar + panels + metrics)
3
+ For app, service, admin, and operator dashboards.
4
4
  ========================================================================== */
5
5
 
6
6
  .ui-app-shell {
@@ -103,7 +103,7 @@
103
103
  .ui-app-nav a[aria-current]:not([aria-current='false']) {
104
104
  background: var(--accent-soft);
105
105
  border-inline-start-color: var(--accent);
106
- color: var(--accent-text);
106
+ color: var(--text);
107
107
  }
108
108
 
109
109
  @media (pointer: coarse) {
@@ -257,7 +257,7 @@
257
257
  /* --- Metric tiles ---
258
258
  The metric primitive itself is shell-agnostic and now lives in
259
259
  primitives.css as `.ui-stat` / `.ui-statgrid`; `.ui-app-metric*` and
260
- `.ui-app-metrics` remain as permanent admin-shell aliases (grouped on
260
+ `.ui-app-metrics` remain as permanent app-shell aliases (grouped on
261
261
  the canonical rules there — identical output). Nothing app-specific
262
262
  left to define here. */
263
263
 
package/css/clamp.css ADDED
@@ -0,0 +1,92 @@
1
+ /* ==========================================================================
2
+ clamp — opt-in bounded excerpt + reveal.
3
+
4
+ For source excerpts, claim basis, caveats, and evidence text that should
5
+ scan as a bounded block but remain reachable. Bronto owns the visual clamp
6
+ and optional CSS-only reveal affordance; the host owns content, IDs, and
7
+ whether truncation is appropriate. Not imported by core.css.
8
+ ========================================================================== */
9
+
10
+ .ui-clamp {
11
+ --clamp-lines: 4;
12
+
13
+ display: grid;
14
+ gap: var(--space-2xs);
15
+ min-inline-size: 0;
16
+ position: relative;
17
+ }
18
+
19
+ .ui-clamp__body {
20
+ -webkit-box-orient: vertical;
21
+ -webkit-line-clamp: var(--clamp-lines);
22
+ display: -webkit-box;
23
+ line-clamp: var(--clamp-lines);
24
+ mask-image: linear-gradient(to bottom, #000 72%, transparent 100%);
25
+ overflow: hidden;
26
+ }
27
+
28
+ .ui-clamp:has(> .ui-clamp__toggle:checked) .ui-clamp__body {
29
+ -webkit-line-clamp: unset;
30
+ display: block;
31
+ line-clamp: none;
32
+ mask-image: none;
33
+ }
34
+
35
+ .ui-clamp__toggle {
36
+ block-size: 1px;
37
+ clip-path: inset(50%);
38
+ inline-size: 1px;
39
+ overflow: hidden;
40
+ position: absolute;
41
+ white-space: nowrap;
42
+ }
43
+
44
+ .ui-clamp__control {
45
+ color: var(--accent-text);
46
+ cursor: pointer;
47
+ font-family: var(--mono);
48
+ font-size: var(--text-2xs);
49
+ inline-size: max-content;
50
+ letter-spacing: var(--tracking-wide);
51
+ text-decoration: underline;
52
+ text-decoration-color: color-mix(in srgb, var(--accent) 55%, transparent);
53
+ text-underline-offset: 0.2rem;
54
+ text-transform: uppercase;
55
+ }
56
+
57
+ .ui-clamp__toggle:focus-visible + .ui-clamp__body + .ui-clamp__control {
58
+ outline: 2px solid var(--focus-ring);
59
+ outline-offset: 2px;
60
+ }
61
+
62
+ .ui-clamp__less {
63
+ display: none;
64
+ }
65
+
66
+ .ui-clamp:has(> .ui-clamp__toggle:checked) .ui-clamp__more {
67
+ display: none;
68
+ }
69
+
70
+ .ui-clamp:has(> .ui-clamp__toggle:checked) .ui-clamp__less {
71
+ display: inline;
72
+ }
73
+
74
+ @media (hover: hover) {
75
+ .ui-clamp__control:hover {
76
+ text-decoration-color: currentColor;
77
+ }
78
+ }
79
+
80
+ @media print {
81
+ .ui-clamp__body {
82
+ -webkit-line-clamp: unset;
83
+ display: block;
84
+ line-clamp: none;
85
+ mask-image: none;
86
+ }
87
+
88
+ .ui-clamp__toggle,
89
+ .ui-clamp__control {
90
+ display: none;
91
+ }
92
+ }
package/css/figure.css ADDED
@@ -0,0 +1,102 @@
1
+ /* ==========================================================================
2
+ figure — opt-in analytical/report figure stage.
3
+
4
+ A frame for chart/diagram/media evidence: caption, stable stage, optional
5
+ overlay, key, and fallback data. Bronto owns only the layout grammar. The
6
+ host still owns data, scales, chart rendering, annotation content, and the
7
+ fallback table. Not imported by core.css.
8
+ ========================================================================== */
9
+
10
+ .ui-figure {
11
+ display: grid;
12
+ gap: var(--space-sm);
13
+ margin: 0;
14
+ min-inline-size: 0;
15
+ }
16
+
17
+ .ui-figure > *,
18
+ .ui-figure__body > *,
19
+ .ui-figure__stage > * {
20
+ min-inline-size: 0;
21
+ }
22
+
23
+ .ui-figure__caption {
24
+ color: var(--text-dim);
25
+ font-family: var(--mono);
26
+ font-size: var(--text-2xs);
27
+ letter-spacing: 0;
28
+ line-height: 1.5;
29
+ text-transform: uppercase;
30
+ }
31
+
32
+ .ui-figure__body {
33
+ align-items: start;
34
+ display: grid;
35
+ gap: var(--space-sm);
36
+ }
37
+
38
+ .ui-figure__body--key-right {
39
+ grid-template-columns: minmax(0, 1fr) minmax(min(100%, 10rem), var(--figure-key-width, 14rem));
40
+ }
41
+
42
+ .ui-figure__stage {
43
+ --figure-max-inline: 42rem;
44
+ --figure-min-block: 0px;
45
+
46
+ display: grid;
47
+ inline-size: min(100%, var(--figure-max-inline));
48
+ margin-inline: auto;
49
+ min-block-size: var(--figure-min-block);
50
+ place-items: center;
51
+ position: relative;
52
+ }
53
+
54
+ .ui-figure__media {
55
+ display: block;
56
+ inline-size: 100%;
57
+ max-inline-size: 100%;
58
+ }
59
+
60
+ .ui-figure__stage > :is(canvas, img, picture, svg):not(.ui-figure__overlay) {
61
+ display: block;
62
+ max-inline-size: 100%;
63
+ }
64
+
65
+ .ui-figure__overlay {
66
+ block-size: 100%;
67
+ inline-size: 100%;
68
+ inset: 0;
69
+ overflow: visible;
70
+ pointer-events: none;
71
+ position: absolute;
72
+ }
73
+
74
+ .ui-figure__key,
75
+ .ui-figure__data {
76
+ display: grid;
77
+ gap: var(--space-xs);
78
+ }
79
+
80
+ .ui-figure__data {
81
+ margin-block-start: var(--space-xs);
82
+ }
83
+
84
+ @media (max-width: 44rem) {
85
+ .ui-figure__body--key-right {
86
+ grid-template-columns: 1fr;
87
+ }
88
+ }
89
+
90
+ @media print {
91
+ .ui-figure {
92
+ break-inside: avoid;
93
+ }
94
+
95
+ .ui-figure__body {
96
+ display: block;
97
+ }
98
+
99
+ .ui-figure__body > * + * {
100
+ margin-block-start: var(--space-sm);
101
+ }
102
+ }
@@ -0,0 +1,50 @@
1
+ /* ==========================================================================
2
+ highlights — opt-in CSS Custom Highlight API paint.
3
+
4
+ Named text ranges for cited evidence, search hits, and current match. The
5
+ HOST creates Range objects and registers Highlight instances in CSS.highlights
6
+ under the documented names. Bronto only paints the registered ranges. Not
7
+ imported by core.css.
8
+ ========================================================================== */
9
+
10
+ .ui-highlights {
11
+ --highlight-evidence: var(--accent-soft);
12
+ --highlight-search: var(--warning-soft);
13
+ --highlight-current: color-mix(in srgb, var(--accent) 22%, transparent);
14
+ }
15
+
16
+ .ui-highlights::highlight(bronto-evidence) {
17
+ background-color: var(--highlight-evidence);
18
+ color: inherit;
19
+ text-decoration-color: var(--accent);
20
+ text-decoration-line: underline;
21
+ text-decoration-thickness: 0.1em;
22
+ text-underline-offset: 0.18em;
23
+ }
24
+
25
+ .ui-highlights::highlight(bronto-search) {
26
+ background-color: var(--highlight-search);
27
+ color: inherit;
28
+ }
29
+
30
+ .ui-highlights::highlight(bronto-current) {
31
+ background-color: var(--highlight-current);
32
+ color: var(--text);
33
+ }
34
+
35
+ @media (forced-colors: active) {
36
+ .ui-highlights::highlight(bronto-evidence),
37
+ .ui-highlights::highlight(bronto-search),
38
+ .ui-highlights::highlight(bronto-current) {
39
+ background-color: Highlight;
40
+ color: HighlightText;
41
+ text-decoration-color: HighlightText;
42
+ }
43
+ }
44
+
45
+ @media print {
46
+ .ui-highlights {
47
+ -webkit-print-color-adjust: exact;
48
+ print-color-adjust: exact;
49
+ }
50
+ }
@@ -0,0 +1,90 @@
1
+ /* ==========================================================================
2
+ interval — opt-in low/high uncertainty span.
3
+
4
+ A compact report primitive for "the value is somewhere in this range" —
5
+ confidence intervals, estimates, budget windows, and measured uncertainty.
6
+ Boundary: the HOST normalises `--lo`, `--hi`, and optional `--v` to 0..1 and
7
+ writes the accessible label. Bronto only paints geometry. Not imported by
8
+ core.css.
9
+ ========================================================================== */
10
+
11
+ .ui-interval {
12
+ --lo: 0;
13
+ --hi: 1;
14
+
15
+ display: grid;
16
+ gap: 0.35rem;
17
+ inline-size: 100%;
18
+ min-inline-size: 0;
19
+ }
20
+
21
+ .ui-interval__track {
22
+ background: var(--surface-4);
23
+ block-size: 0.7rem;
24
+ border: 1px solid var(--line);
25
+ border-radius: var(--radius-pill);
26
+ min-inline-size: 8rem;
27
+ position: relative;
28
+ }
29
+
30
+ .ui-interval__range {
31
+ background: color-mix(in srgb, var(--accent) 26%, transparent);
32
+ border: 1px solid color-mix(in srgb, var(--accent) 58%, var(--line));
33
+ border-radius: var(--radius-pill);
34
+ inline-size: max(2px, calc((var(--hi) - var(--lo)) * 100%));
35
+ inset-block: 18%;
36
+ inset-inline-start: calc(var(--lo) * 100%);
37
+ position: absolute;
38
+ }
39
+
40
+ .ui-interval__point {
41
+ background: var(--text);
42
+ border: 2px solid var(--panel);
43
+ border-radius: 50%;
44
+ block-size: 0.72rem;
45
+ box-shadow: 0 0 0 1px var(--line-strong);
46
+ inline-size: 0.72rem;
47
+ inset-block-start: 50%;
48
+ inset-inline-start: calc(var(--v, var(--lo)) * 100%);
49
+ position: absolute;
50
+ transform: translate(-50%, -50%);
51
+ }
52
+
53
+ .ui-interval__label,
54
+ .ui-interval__bounds {
55
+ color: var(--text-dim);
56
+ font-family: var(--mono);
57
+ font-size: var(--text-2xs);
58
+ letter-spacing: 0;
59
+ }
60
+
61
+ .ui-interval__label {
62
+ color: var(--text-soft);
63
+ }
64
+
65
+ .ui-interval__bounds {
66
+ display: flex;
67
+ gap: var(--space-sm);
68
+ justify-content: space-between;
69
+ }
70
+
71
+ @media (forced-colors: active) {
72
+ .ui-interval__track,
73
+ .ui-interval__range,
74
+ .ui-interval__point {
75
+ border-color: CanvasText;
76
+ }
77
+
78
+ .ui-interval__range,
79
+ .ui-interval__point {
80
+ background: CanvasText;
81
+ }
82
+ }
83
+
84
+ @media print {
85
+ .ui-interval__range,
86
+ .ui-interval__point {
87
+ -webkit-print-color-adjust: exact;
88
+ print-color-adjust: exact;
89
+ }
90
+ }
@@ -569,9 +569,8 @@
569
569
  }
570
570
 
571
571
  .ui-chip--accent {
572
- /* accent-strong, not accent: chip text is small uppercase mono and must
573
- clear WCAG AA 4.5:1 — same rule as .ui-eyebrow above. */
574
- color: var(--accent-text);
572
+ /* Tone rides the border + hover tint; text stays neutral-readable. */
573
+ color: var(--text-soft);
575
574
  border-color: var(--accent);
576
575
  }
577
576
 
@@ -0,0 +1,38 @@
1
+ /* ==========================================================================
2
+ report-kit — convenience roll-up for static/PDF report consumers.
3
+
4
+ Import the default bundle first, then this opt-in kit:
5
+
6
+ @import '@ponchia/ui';
7
+ @import '@ponchia/ui/css/report-kit.css';
8
+
9
+ This file deliberately excludes app workbench/command surfaces. Reports can
10
+ still import narrower leaves one by one; this roll-up is the no-build,
11
+ copy-paste path for complete static reports.
12
+ ========================================================================== */
13
+
14
+ @import url('./report.css') layer(bronto);
15
+ @import url('./dataviz.css') layer(bronto);
16
+ @import url('./figure.css') layer(bronto);
17
+ @import url('./annotations.css') layer(bronto);
18
+ @import url('./legend.css') layer(bronto);
19
+ @import url('./marks.css') layer(bronto);
20
+ @import url('./connectors.css') layer(bronto);
21
+ @import url('./spotlight.css') layer(bronto);
22
+ @import url('./crosshair.css') layer(bronto);
23
+ @import url('./selection.css') layer(bronto);
24
+ @import url('./sources.css') layer(bronto);
25
+ @import url('./generated.css') layer(bronto);
26
+ @import url('./state.css') layer(bronto);
27
+ @import url('./interval.css') layer(bronto);
28
+ @import url('./clamp.css') layer(bronto);
29
+ @import url('./highlights.css') layer(bronto);
30
+ @import url('./diff.css') layer(bronto);
31
+ @import url('./code.css') layer(bronto);
32
+ @import url('./spark.css') layer(bronto);
33
+ @import url('./bullet.css') layer(bronto);
34
+ @import url('./sidenote.css') layer(bronto);
35
+ @import url('./textref.css') layer(bronto);
36
+ @import url('./term.css') layer(bronto);
37
+ @import url('./toc.css') layer(bronto);
38
+ @import url('./tree.css') layer(bronto);
package/css/report.css CHANGED
@@ -274,7 +274,7 @@
274
274
 
275
275
  .ui-report__finding-title {
276
276
  color: var(--text);
277
- font-size: var(--text-md);
277
+ font-size: var(--text-base);
278
278
  font-weight: 650;
279
279
  line-height: 1.25;
280
280
  }
@@ -480,7 +480,7 @@
480
480
 
481
481
  .ui-evidence-item__value {
482
482
  color: var(--text);
483
- font-size: var(--text-md);
483
+ font-size: var(--text-base);
484
484
  font-weight: 650;
485
485
  }
486
486
 
@@ -510,13 +510,20 @@
510
510
  padding-block: var(--space-sm);
511
511
  }
512
512
 
513
+ .ui-report__action > :not(.ui-report__action-status) {
514
+ grid-column: 1;
515
+ }
516
+
513
517
  .ui-report__action-status {
514
- align-self: start;
515
518
  color: var(--text-dim);
516
519
  font-family: var(--mono);
517
520
  font-size: var(--text-2xs);
521
+ grid-column: 2;
522
+ grid-row: 1;
518
523
  letter-spacing: var(--tracking-wide);
524
+ place-self: start end;
519
525
  text-transform: uppercase;
526
+ white-space: nowrap;
520
527
  }
521
528
 
522
529
  .ui-report__action-title,
@@ -556,6 +563,12 @@
556
563
  .ui-report__action {
557
564
  grid-template-columns: 1fr;
558
565
  }
566
+
567
+ .ui-report__action-status {
568
+ grid-column: 1;
569
+ grid-row: auto;
570
+ place-self: auto start;
571
+ }
559
572
  }
560
573
 
561
574
  .ui-report__sources,
@@ -720,6 +733,9 @@
720
733
  margin-block-start: var(--space-sm);
721
734
  }
722
735
 
736
+ /* Stat tiles and table rows are guarded at the item level (the tile / the
737
+ row), not the container — a long statgrid or table may legitimately span
738
+ pages, but a sliced tile or row is unreadable. */
723
739
  .ui-report__cover,
724
740
  .ui-report__head,
725
741
  .ui-report__decision,
@@ -730,7 +746,10 @@
730
746
  .ui-report__toc,
731
747
  .ui-claim,
732
748
  .ui-evidence-item,
733
- .ui-report__action {
749
+ .ui-report__action,
750
+ .ui-stat,
751
+ .ui-statgrid > *,
752
+ tr {
734
753
  break-inside: avoid;
735
754
  }
736
755
 
package/css/sidenote.css CHANGED
@@ -14,11 +14,21 @@
14
14
  same breakpoint. Place each note in the DOM right after its `.ui-sidenote__ref`.
15
15
  ========================================================================== */
16
16
 
17
- .ui-sidenote,
18
- .ui-marginnote {
17
+ /* The two knobs are ROOT-scoped on purpose: the documented host contract has
18
+ the CONTAINER reserve the gutter with
19
+ `padding-inline-end: calc(var(--sidenote-width) + var(--sidenote-gap))`,
20
+ and custom properties do not flow upward — declared only on the notes,
21
+ that calc is invalid on any ancestor and silently resolves to NO gutter
22
+ (the floated notes then spill past the page edge). Root scope makes the
23
+ documented calc work anywhere, and overriding either var on the container
24
+ re-sizes the notes and the gutter together. */
25
+ :root {
19
26
  --sidenote-width: 12rem;
20
27
  --sidenote-gap: 2rem;
28
+ }
21
29
 
30
+ .ui-sidenote,
31
+ .ui-marginnote {
22
32
  border-inline-start: 2px solid var(--line);
23
33
  color: var(--text-dim);
24
34
  display: block;
package/css/site.css CHANGED
@@ -318,10 +318,11 @@
318
318
  padding: 0.28rem 0.6rem;
319
319
  }
320
320
 
321
+ /* Tone rides the tint + border; text stays neutral-readable. */
321
322
  .ui-tag--accent {
322
323
  background: var(--accent-soft);
323
324
  border-color: color-mix(in srgb, var(--accent) 42%, var(--line));
324
- color: var(--accent-text);
325
+ color: var(--text-soft);
325
326
  }
326
327
 
327
328
  /* --- Meta row — date · author · read-time, dot-separated --- */
package/css/sources.css CHANGED
@@ -236,4 +236,9 @@
236
236
  .ui-citation[href]::after {
237
237
  content: none !important;
238
238
  }
239
+
240
+ .ui-source-card,
241
+ .ui-source-list__item {
242
+ break-inside: avoid;
243
+ }
239
244
  }