@ponchia/ui 0.6.5 → 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 +170 -0
  2. package/README.md +43 -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 +51 -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 +48 -23
  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 +79 -6
  77. package/docs/reporting.md +132 -56
  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 +82 -14
  86. package/package.json +68 -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
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$comment": "@ponchia/ui class vocabulary as language-neutral data — validate emitted markup without executing the ESM cls map or parsing the .d.ts. Generated from classes/index.js — do not edit by hand; run `npm run classes:json:build`. Drift-checked in CI. `groups[].base` is null for a parts-only namespace (no standalone base class — do NOT emit it). A modifier whose name contains `__` (e.g. `ui-spark__bar--pos`) attaches to THAT part, not the base host. `states` is the author-applied `is-*` hooks (runtime/behavior-managed hooks are excluded); `behaviorAttributes` are the `data-bronto-*` wiring hooks the optional behaviors delegate on; `requiredAria` is the role/aria a generator must emit per component. `states` + `customProperties` are documented in docs/reference.md and ship outside `cls` by design.",
3
3
  "counts": {
4
- "classes": 593,
5
- "groups": 171
4
+ "classes": 634,
5
+ "groups": 177
6
6
  },
7
7
  "groups": {
8
8
  "ui-accordion": {
@@ -322,6 +322,17 @@
322
322
  "ui-claim__status"
323
323
  ]
324
324
  },
325
+ "ui-clamp": {
326
+ "base": "ui-clamp",
327
+ "modifiers": [],
328
+ "parts": [
329
+ "ui-clamp__body",
330
+ "ui-clamp__control",
331
+ "ui-clamp__less",
332
+ "ui-clamp__more",
333
+ "ui-clamp__toggle"
334
+ ]
335
+ },
325
336
  "ui-cluster": {
326
337
  "base": "ui-cluster",
327
338
  "modifiers": [
@@ -583,6 +594,21 @@
583
594
  "modifiers": [],
584
595
  "parts": []
585
596
  },
597
+ "ui-figure": {
598
+ "base": "ui-figure",
599
+ "modifiers": [
600
+ "ui-figure__body--key-right"
601
+ ],
602
+ "parts": [
603
+ "ui-figure__body",
604
+ "ui-figure__caption",
605
+ "ui-figure__data",
606
+ "ui-figure__key",
607
+ "ui-figure__media",
608
+ "ui-figure__overlay",
609
+ "ui-figure__stage"
610
+ ]
611
+ },
586
612
  "ui-file": {
587
613
  "base": "ui-file",
588
614
  "modifiers": [],
@@ -613,6 +639,11 @@
613
639
  "modifiers": [],
614
640
  "parts": []
615
641
  },
642
+ "ui-highlights": {
643
+ "base": "ui-highlights",
644
+ "modifiers": [],
645
+ "parts": []
646
+ },
616
647
  "ui-hint": {
617
648
  "base": "ui-hint",
618
649
  "modifiers": [
@@ -654,6 +685,37 @@
654
685
  "ui-inspector__head"
655
686
  ]
656
687
  },
688
+ "ui-interval": {
689
+ "base": "ui-interval",
690
+ "modifiers": [],
691
+ "parts": [
692
+ "ui-interval__bounds",
693
+ "ui-interval__label",
694
+ "ui-interval__point",
695
+ "ui-interval__range",
696
+ "ui-interval__track"
697
+ ]
698
+ },
699
+ "ui-job": {
700
+ "base": "ui-job",
701
+ "modifiers": [
702
+ "ui-job--blocked",
703
+ "ui-job--compact",
704
+ "ui-job--complete",
705
+ "ui-job--failed",
706
+ "ui-job--queued",
707
+ "ui-job--running"
708
+ ],
709
+ "parts": [
710
+ "ui-job__actions",
711
+ "ui-job__bar",
712
+ "ui-job__body",
713
+ "ui-job__head",
714
+ "ui-job__meta",
715
+ "ui-job__progress",
716
+ "ui-job__title"
717
+ ]
718
+ },
657
719
  "ui-kbd": {
658
720
  "base": "ui-kbd",
659
721
  "modifiers": [],
@@ -1134,6 +1196,17 @@
1134
1196
  "modifiers": [],
1135
1197
  "parts": []
1136
1198
  },
1199
+ "ui-splitter": {
1200
+ "base": "ui-splitter",
1201
+ "modifiers": [
1202
+ "ui-splitter--horizontal",
1203
+ "ui-splitter--vertical"
1204
+ ],
1205
+ "parts": [
1206
+ "ui-splitter__handle",
1207
+ "ui-splitter__pane"
1208
+ ]
1209
+ },
1137
1210
  "ui-spotlight": {
1138
1211
  "base": "ui-spotlight",
1139
1212
  "modifiers": [
@@ -1554,6 +1627,12 @@
1554
1627
  "ui-claim__scope",
1555
1628
  "ui-claim__statement",
1556
1629
  "ui-claim__status",
1630
+ "ui-clamp",
1631
+ "ui-clamp__body",
1632
+ "ui-clamp__control",
1633
+ "ui-clamp__less",
1634
+ "ui-clamp__more",
1635
+ "ui-clamp__toggle",
1557
1636
  "ui-cluster",
1558
1637
  "ui-cluster--between",
1559
1638
  "ui-code",
@@ -1667,6 +1746,15 @@
1667
1746
  "ui-eyebrow--muted",
1668
1747
  "ui-eyebrow--sm",
1669
1748
  "ui-field",
1749
+ "ui-figure",
1750
+ "ui-figure__body",
1751
+ "ui-figure__body--key-right",
1752
+ "ui-figure__caption",
1753
+ "ui-figure__data",
1754
+ "ui-figure__key",
1755
+ "ui-figure__media",
1756
+ "ui-figure__overlay",
1757
+ "ui-figure__stage",
1670
1758
  "ui-file",
1671
1759
  "ui-generated",
1672
1760
  "ui-generated__label",
@@ -1675,6 +1763,7 @@
1675
1763
  "ui-glossary__term",
1676
1764
  "ui-grid",
1677
1765
  "ui-halftone",
1766
+ "ui-highlights",
1678
1767
  "ui-hint",
1679
1768
  "ui-hint--error",
1680
1769
  "ui-icon",
@@ -1687,6 +1776,26 @@
1687
1776
  "ui-inspector",
1688
1777
  "ui-inspector__body",
1689
1778
  "ui-inspector__head",
1779
+ "ui-interval",
1780
+ "ui-interval__bounds",
1781
+ "ui-interval__label",
1782
+ "ui-interval__point",
1783
+ "ui-interval__range",
1784
+ "ui-interval__track",
1785
+ "ui-job",
1786
+ "ui-job--blocked",
1787
+ "ui-job--compact",
1788
+ "ui-job--complete",
1789
+ "ui-job--failed",
1790
+ "ui-job--queued",
1791
+ "ui-job--running",
1792
+ "ui-job__actions",
1793
+ "ui-job__bar",
1794
+ "ui-job__body",
1795
+ "ui-job__head",
1796
+ "ui-job__meta",
1797
+ "ui-job__progress",
1798
+ "ui-job__title",
1690
1799
  "ui-kbd",
1691
1800
  "ui-keep",
1692
1801
  "ui-key-value",
@@ -1895,6 +2004,11 @@
1895
2004
  "ui-spark__bar--neg",
1896
2005
  "ui-spark__bar--pos",
1897
2006
  "ui-spinner",
2007
+ "ui-splitter",
2008
+ "ui-splitter--horizontal",
2009
+ "ui-splitter--vertical",
2010
+ "ui-splitter__handle",
2011
+ "ui-splitter__pane",
1898
2012
  "ui-spotlight",
1899
2013
  "ui-spotlight--ring",
1900
2014
  "ui-spotlight__hole",
@@ -2026,7 +2140,7 @@
2026
2140
  {
2027
2141
  "class": "is-open",
2028
2142
  "scope": "controlled .ui-modal / .ui-popover",
2029
- "effect": "open state (focus-trap is the host's)"
2143
+ "effect": "open visibility state; focus management belongs to the matching behavior/host"
2030
2144
  },
2031
2145
  {
2032
2146
  "class": "is-active",
@@ -2090,6 +2204,13 @@
2090
2204
  "example": "92",
2091
2205
  "note": "measured value as a UNITLESS number 0..100 (registered <number>, never a %). Set it on the meter/progress host — it inherits to the __fill/__bar. Prefer attrs.meter(value)/attrs.progress(value) from @ponchia/ui/classes, which sets it plus role + aria-valuenow/min/max together."
2092
2206
  },
2207
+ {
2208
+ "name": "--job-progress",
2209
+ "on": ".ui-job",
2210
+ "type": "percentage",
2211
+ "example": "64%",
2212
+ "note": "determinate background-job progress. Set it on the .ui-job host; pair the .ui-job__progress element with role=\"progressbar\" and matching aria-valuenow/min/max when the value is known."
2213
+ },
2093
2214
  {
2094
2215
  "name": "--icon-mask",
2095
2216
  "on": ".ui-icon",
@@ -2142,6 +2263,27 @@
2142
2263
  "example": "var(--accent-soft)",
2143
2264
  "note": "the ::target-text highlight wash for the matched cited sentence (default var(--accent-soft)). The host builds the #:~:text= href; Bronto owns the paint — see docs/textref.md."
2144
2265
  },
2266
+ {
2267
+ "name": "--figure-max-inline",
2268
+ "on": ".ui-figure__stage",
2269
+ "type": "length",
2270
+ "example": "32rem",
2271
+ "note": "maximum inline size of the centered figure stage (default 42rem). The host still owns chart/media dimensions and data mapping."
2272
+ },
2273
+ {
2274
+ "name": "--figure-min-block",
2275
+ "on": ".ui-figure__stage",
2276
+ "type": "length",
2277
+ "example": "16rem",
2278
+ "note": "minimum block size reserved for a live or late-rendered figure stage (default 0px)."
2279
+ },
2280
+ {
2281
+ "name": "--figure-key-width",
2282
+ "on": ".ui-figure__body--key-right",
2283
+ "type": "length",
2284
+ "example": "12rem",
2285
+ "note": "width of the right-side key column before the figure body collapses to one column (default 14rem)."
2286
+ },
2145
2287
  {
2146
2288
  "name": "--v",
2147
2289
  "on": ".ui-bullet__measure",
@@ -2178,6 +2320,78 @@
2178
2320
  "example": "1rem",
2179
2321
  "note": "the sticky inset from the top of the scroll container (default var(--space-md))."
2180
2322
  },
2323
+ {
2324
+ "name": "--lo",
2325
+ "on": ".ui-interval",
2326
+ "type": "number 0..1",
2327
+ "example": "0.22",
2328
+ "required": true,
2329
+ "note": "REQUIRED — normalised lower bound of the interval. The host normalises; Bronto only paints."
2330
+ },
2331
+ {
2332
+ "name": "--hi",
2333
+ "on": ".ui-interval",
2334
+ "type": "number 0..1",
2335
+ "example": "0.68",
2336
+ "required": true,
2337
+ "note": "REQUIRED — normalised upper bound of the interval. The host normalises; Bronto only paints."
2338
+ },
2339
+ {
2340
+ "name": "--v",
2341
+ "on": ".ui-interval__point",
2342
+ "type": "number 0..1",
2343
+ "example": "0.52",
2344
+ "note": "optional normalised point estimate inside the interval. Omit the point element when there is no point estimate."
2345
+ },
2346
+ {
2347
+ "name": "--clamp-lines",
2348
+ "on": ".ui-clamp",
2349
+ "type": "integer",
2350
+ "example": "3",
2351
+ "note": "number of lines shown before the optional reveal control expands the excerpt (default 4)."
2352
+ },
2353
+ {
2354
+ "name": "--highlight-evidence",
2355
+ "on": ".ui-highlights",
2356
+ "type": "color",
2357
+ "example": "var(--accent-soft)",
2358
+ "note": "CSS Custom Highlight API wash for host-registered bronto-evidence ranges."
2359
+ },
2360
+ {
2361
+ "name": "--highlight-search",
2362
+ "on": ".ui-highlights",
2363
+ "type": "color",
2364
+ "example": "var(--warning-soft)",
2365
+ "note": "CSS Custom Highlight API wash for host-registered bronto-search ranges."
2366
+ },
2367
+ {
2368
+ "name": "--highlight-current",
2369
+ "on": ".ui-highlights",
2370
+ "type": "color",
2371
+ "example": "color-mix(in srgb, var(--accent) 22%, transparent)",
2372
+ "note": "CSS Custom Highlight API wash for the host-registered bronto-current range."
2373
+ },
2374
+ {
2375
+ "name": "--splitter-pos",
2376
+ "on": ".ui-splitter",
2377
+ "type": "percentage",
2378
+ "example": "36%",
2379
+ "note": "first pane size in the splitter axis. initSplitter keeps this and aria-valuenow in sync; the host may persist the last value."
2380
+ },
2381
+ {
2382
+ "name": "--splitter-handle",
2383
+ "on": ".ui-splitter",
2384
+ "type": "length",
2385
+ "example": "0.75rem",
2386
+ "note": "fixed size of the separator handle track (default 0.75rem)."
2387
+ },
2388
+ {
2389
+ "name": "--splitter-pane-min",
2390
+ "on": ".ui-splitter",
2391
+ "type": "length",
2392
+ "example": "12rem",
2393
+ "note": "minimum first-pane size before the grid track clamps (default 0px); pair with matching aria-valuemin when the limit is user-visible."
2394
+ },
2181
2395
  {
2182
2396
  "name": "--stack-gap",
2183
2397
  "on": ".ui-stack",
@@ -2488,7 +2702,7 @@
2488
2702
  "name": "data-bronto-modal",
2489
2703
  "on": "a controlled (non-<dialog>) .ui-modal overlay",
2490
2704
  "behavior": "initModal",
2491
- "note": "inert focus-trap + .is-open toggling for a modal that is not a native <dialog>; needs an accessible name"
2705
+ "note": "inert focus-trap, focus-return, and Escape close signal for a consumer-owned .is-open modal; needs an accessible name"
2492
2706
  },
2493
2707
  {
2494
2708
  "name": "data-bronto-menu",
@@ -2515,6 +2729,13 @@
2515
2729
  "behavior": "initSources",
2516
2730
  "note": "scopes citation preview metadata and source-card focus/highlight behavior; the host still owns numbering, fetching, and trust decisions."
2517
2731
  },
2732
+ {
2733
+ "name": "data-bronto-splitter",
2734
+ "on": "a .ui-splitter host",
2735
+ "value": "optional 'vertical' | 'horizontal' (otherwise inferred from .ui-splitter--horizontal / aria-orientation)",
2736
+ "behavior": "initSplitter",
2737
+ "note": "keyboard + pointer ARIA window-splitter behavior; updates --splitter-pos and aria-valuenow, then emits bronto:splitter:resize. The host owns persistence and pane state."
2738
+ },
2518
2739
  {
2519
2740
  "name": "data-bronto-source-ref",
2520
2741
  "on": "a button/control that references a source card",
@@ -2728,6 +2949,11 @@
2728
2949
  "on": ".ui-error-summary",
2729
2950
  "require": "role=\"alert\" + tabindex=\"-1\" on the hand-authored summary so it is announced and focusable when validation fails",
2730
2951
  "helper": "initFormValidation wires this for the dynamic summary; a static summary needs it hand-set"
2952
+ },
2953
+ {
2954
+ "on": ".ui-splitter__handle",
2955
+ "require": "role=\"separator\" + tabindex=\"0\" + aria-controls=\"<first-pane-id>\" + an accessible name + aria-orientation + aria-valuemin/max/now. The aria-valuenow value mirrors --splitter-pos.",
2956
+ "helper": "initSplitter fills missing role/tabindex/orientation/value defaults and updates aria-valuenow; author the accessible name, aria-controls, and meaningful min/max."
2731
2957
  }
2732
2958
  ]
2733
2959
  }
@@ -330,6 +330,15 @@ export declare const cls: {
330
330
  readonly compare2up: 'ui-compare--2up';
331
331
  readonly compareCol: 'ui-compare__col';
332
332
  readonly compareHead: 'ui-compare__head';
333
+ readonly figure: 'ui-figure';
334
+ readonly figureCaption: 'ui-figure__caption';
335
+ readonly figureBody: 'ui-figure__body';
336
+ readonly figureBodyKeyRight: 'ui-figure__body--key-right';
337
+ readonly figureStage: 'ui-figure__stage';
338
+ readonly figureMedia: 'ui-figure__media';
339
+ readonly figureOverlay: 'ui-figure__overlay';
340
+ readonly figureKey: 'ui-figure__key';
341
+ readonly figureData: 'ui-figure__data';
333
342
  readonly legend: 'ui-legend';
334
343
  readonly legendVertical: 'ui-legend--vertical';
335
344
  readonly legendCompact: 'ui-legend--compact';
@@ -459,6 +468,19 @@ export declare const cls: {
459
468
  readonly srcReviewed: 'ui-src--reviewed';
460
469
  readonly srcStale: 'ui-src--stale';
461
470
  readonly srcConflict: 'ui-src--conflict';
471
+ readonly interval: 'ui-interval';
472
+ readonly intervalTrack: 'ui-interval__track';
473
+ readonly intervalRange: 'ui-interval__range';
474
+ readonly intervalPoint: 'ui-interval__point';
475
+ readonly intervalLabel: 'ui-interval__label';
476
+ readonly intervalBounds: 'ui-interval__bounds';
477
+ readonly clamp: 'ui-clamp';
478
+ readonly clampBody: 'ui-clamp__body';
479
+ readonly clampToggle: 'ui-clamp__toggle';
480
+ readonly clampControl: 'ui-clamp__control';
481
+ readonly clampMore: 'ui-clamp__more';
482
+ readonly clampLess: 'ui-clamp__less';
483
+ readonly highlights: 'ui-highlights';
462
484
  readonly diff: 'ui-diff';
463
485
  readonly diffSplit: 'ui-diff--split';
464
486
  readonly diffPane: 'ui-diff__pane';
@@ -524,6 +546,20 @@ export declare const cls: {
524
546
  readonly stateReviewed: 'ui-state--reviewed';
525
547
  readonly stateNeedsReview: 'ui-state--needs-review';
526
548
  readonly syncbar: 'ui-syncbar';
549
+ readonly job: 'ui-job';
550
+ readonly jobHead: 'ui-job__head';
551
+ readonly jobTitle: 'ui-job__title';
552
+ readonly jobMeta: 'ui-job__meta';
553
+ readonly jobBody: 'ui-job__body';
554
+ readonly jobProgress: 'ui-job__progress';
555
+ readonly jobBar: 'ui-job__bar';
556
+ readonly jobActions: 'ui-job__actions';
557
+ readonly jobCompact: 'ui-job--compact';
558
+ readonly jobQueued: 'ui-job--queued';
559
+ readonly jobRunning: 'ui-job--running';
560
+ readonly jobBlocked: 'ui-job--blocked';
561
+ readonly jobFailed: 'ui-job--failed';
562
+ readonly jobComplete: 'ui-job--complete';
527
563
  readonly generated: 'ui-generated';
528
564
  readonly generatedLabel: 'ui-generated__label';
529
565
  readonly originLabel: 'ui-origin-label';
@@ -544,6 +580,11 @@ export declare const cls: {
544
580
  readonly selectionbar: 'ui-selectionbar';
545
581
  readonly selectionbarCount: 'ui-selectionbar__count';
546
582
  readonly selectionbarActions: 'ui-selectionbar__actions';
583
+ readonly splitter: 'ui-splitter';
584
+ readonly splitterVertical: 'ui-splitter--vertical';
585
+ readonly splitterHorizontal: 'ui-splitter--horizontal';
586
+ readonly splitterPane: 'ui-splitter__pane';
587
+ readonly splitterHandle: 'ui-splitter__handle';
547
588
  readonly command: 'ui-command';
548
589
  readonly commandInput: 'ui-command__input';
549
590
  readonly commandList: 'ui-command__list';
@@ -699,7 +740,7 @@ export interface DotbarOpts {
699
740
  }
700
741
  export interface ModalOpts {
701
742
  drawer?: boolean;
702
- /** Controlled non-dialog usage — adds the is-open state (focus-trap is yours). */
743
+ /** Controlled non-dialog usage — adds only the is-open state; pair with initModal for focus management. */
703
744
  open?: boolean;
704
745
  }
705
746
  export interface TabOpts {
@@ -810,6 +851,12 @@ export interface StateOpts {
810
851
  /** Pulse the indicator for an in-progress state (saving / syncing / retrying). Reduced-motion-safe. */
811
852
  busy?: boolean;
812
853
  }
854
+ export type JobState = 'queued' | 'running' | 'blocked' | 'failed' | 'complete';
855
+ export interface JobOpts {
856
+ /** Persistent background-job state. Pair with written status text; tone is only a scanning aid. */
857
+ state?: JobState;
858
+ compact?: boolean;
859
+ }
813
860
  export interface OriginLabelOpts {
814
861
  /** Accent-tint the label for AI/model-generated origin (vs a neutral tag). */
815
862
  ai?: boolean;
@@ -892,6 +939,7 @@ export interface Ui {
892
939
  sparkBar(opts?: SparkBarOpts): string;
893
940
  bulletMeasure(opts?: BulletMeasureOpts): string;
894
941
  state(opts?: StateOpts): string;
942
+ job(opts?: JobOpts): string;
895
943
  originLabel(opts?: OriginLabelOpts): string;
896
944
  }
897
945
 
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