@ponchia/ui 0.4.0 → 0.5.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.
Files changed (123) hide show
  1. package/CHANGELOG.md +352 -12
  2. package/MIGRATIONS.json +92 -0
  3. package/README.md +27 -17
  4. package/annotations/index.d.ts +280 -0
  5. package/annotations/index.js +522 -0
  6. package/behaviors/carousel.js +197 -0
  7. package/behaviors/combobox.js +195 -0
  8. package/behaviors/command.js +187 -0
  9. package/behaviors/connectors.js +96 -0
  10. package/behaviors/crosshair.js +58 -0
  11. package/behaviors/dialog.js +73 -0
  12. package/behaviors/disclosure.js +25 -0
  13. package/behaviors/dismissible.js +24 -0
  14. package/behaviors/forms.js +158 -0
  15. package/behaviors/glyph.js +109 -0
  16. package/behaviors/index.d.ts +82 -1
  17. package/behaviors/index.js +18 -1336
  18. package/behaviors/internal.js +50 -0
  19. package/behaviors/legend.js +46 -0
  20. package/behaviors/menu.js +46 -0
  21. package/behaviors/popover.js +108 -0
  22. package/behaviors/spotlight.js +53 -0
  23. package/behaviors/table.js +109 -0
  24. package/behaviors/tabs.js +103 -0
  25. package/behaviors/theme.js +82 -0
  26. package/behaviors/toast.js +152 -0
  27. package/classes/index.d.ts +318 -0
  28. package/classes/index.js +352 -0
  29. package/classes/vscode.css-custom-data.json +18 -14
  30. package/connectors/index.d.ts +71 -0
  31. package/connectors/index.js +179 -0
  32. package/css/analytical.css +21 -0
  33. package/css/annotations.css +292 -0
  34. package/css/command.css +97 -0
  35. package/css/connectors.css +93 -0
  36. package/css/crosshair.css +100 -0
  37. package/css/disclosure.css +29 -0
  38. package/css/dots.css +2 -0
  39. package/css/feedback.css +104 -0
  40. package/css/fonts.css +11 -7
  41. package/css/generated.css +117 -0
  42. package/css/legend.css +268 -0
  43. package/css/marks.css +144 -0
  44. package/css/motion.css +88 -0
  45. package/css/overlay.css +52 -1
  46. package/css/primitives.css +18 -0
  47. package/css/report.css +363 -0
  48. package/css/selection.css +46 -0
  49. package/css/sources.css +179 -0
  50. package/css/spotlight.css +104 -0
  51. package/css/state.css +121 -0
  52. package/css/tokens.css +78 -60
  53. package/css/workbench.css +83 -0
  54. package/dist/bronto.css +1 -1
  55. package/dist/css/analytical.css +1 -0
  56. package/dist/css/annotations.css +1 -0
  57. package/dist/css/command.css +1 -0
  58. package/dist/css/connectors.css +1 -0
  59. package/dist/css/crosshair.css +1 -0
  60. package/dist/css/disclosure.css +1 -1
  61. package/dist/css/dots.css +1 -1
  62. package/dist/css/feedback.css +1 -1
  63. package/dist/css/fonts.css +1 -1
  64. package/dist/css/generated.css +1 -0
  65. package/dist/css/legend.css +1 -0
  66. package/dist/css/marks.css +1 -0
  67. package/dist/css/motion.css +1 -1
  68. package/dist/css/overlay.css +1 -1
  69. package/dist/css/primitives.css +1 -1
  70. package/dist/css/report.css +1 -0
  71. package/dist/css/selection.css +1 -0
  72. package/dist/css/sources.css +1 -0
  73. package/dist/css/spotlight.css +1 -0
  74. package/dist/css/state.css +1 -0
  75. package/dist/css/tokens.css +1 -1
  76. package/dist/css/workbench.css +1 -0
  77. package/docs/adr/0001-color-system.md +26 -27
  78. package/docs/adr/0002-scope-and-2026-baseline.md +104 -0
  79. package/docs/adr/0003-theme-model.md +97 -0
  80. package/docs/annotations.md +345 -0
  81. package/docs/architecture.md +202 -0
  82. package/docs/command.md +95 -0
  83. package/docs/connectors.md +91 -0
  84. package/docs/contrast.md +42 -42
  85. package/docs/crosshair.md +63 -0
  86. package/docs/generated.md +91 -0
  87. package/docs/legends.md +168 -0
  88. package/docs/marks.md +86 -0
  89. package/docs/reference.md +418 -15
  90. package/docs/reporting.md +305 -0
  91. package/docs/selection.md +40 -0
  92. package/docs/sources.md +110 -0
  93. package/docs/spotlight.md +78 -0
  94. package/docs/stability.md +52 -0
  95. package/docs/state.md +85 -0
  96. package/docs/theming.md +18 -6
  97. package/docs/usage.md +43 -3
  98. package/docs/workbench.md +72 -0
  99. package/fonts/doto-400.woff2 +0 -0
  100. package/fonts/doto-500.woff2 +0 -0
  101. package/fonts/doto-600.woff2 +0 -0
  102. package/fonts/doto-700.woff2 +0 -0
  103. package/fonts/doto-800.woff2 +0 -0
  104. package/fonts/doto-900.woff2 +0 -0
  105. package/llms.txt +288 -8
  106. package/package.json +95 -5
  107. package/qwik/index.d.ts +60 -0
  108. package/qwik/index.js +149 -0
  109. package/react/index.d.ts +40 -14
  110. package/react/index.js +32 -5
  111. package/solid/index.d.ts +40 -14
  112. package/solid/index.js +31 -3
  113. package/tokens/index.d.ts +3 -3
  114. package/tokens/index.js +25 -19
  115. package/tokens/index.json +32 -28
  116. package/tokens/resolved.json +34 -32
  117. package/tokens/tokens.dtcg.json +22 -14
  118. package/fonts/doto-400.ttf +0 -0
  119. package/fonts/doto-500.ttf +0 -0
  120. package/fonts/doto-600.ttf +0 -0
  121. package/fonts/doto-700.ttf +0 -0
  122. package/fonts/doto-800.ttf +0 -0
  123. package/fonts/doto-900.ttf +0 -0
package/css/report.css ADDED
@@ -0,0 +1,363 @@
1
+ /* ==========================================================================
2
+ report — opt-in static/PDF-first report layer.
3
+
4
+ This leaf is deliberately not imported by core.css. It gives LLM-authored
5
+ and hand-authored reports a small document grammar without turning the
6
+ framework into a report renderer or chart engine.
7
+ ========================================================================== */
8
+
9
+ .ui-report {
10
+ --report-gap: var(--space-lg);
11
+ --report-measure: 74ch;
12
+ --report-page-margin: 18mm;
13
+
14
+ color: var(--text-soft);
15
+ display: grid;
16
+ gap: var(--report-gap);
17
+ inline-size: min(100%, var(--report-width, 72rem));
18
+ margin-inline: auto;
19
+ padding: var(--report-padding-block, var(--space-2xl)) var(--space-md);
20
+ }
21
+
22
+ .ui-report--compact {
23
+ --report-gap: var(--space-md);
24
+ --report-padding-block: var(--space-xl);
25
+ }
26
+
27
+ .ui-report--numbered {
28
+ counter-reset: report-section;
29
+ }
30
+
31
+ .ui-report__cover {
32
+ align-content: end;
33
+ border-block-end: 1px solid var(--line);
34
+ display: grid;
35
+ gap: var(--space-md);
36
+ min-block-size: min(62vh, 34rem);
37
+ padding-block-end: var(--space-xl);
38
+ }
39
+
40
+ .ui-report__cover--compact {
41
+ min-block-size: auto;
42
+ padding-block: var(--space-xl) var(--space-lg);
43
+ }
44
+
45
+ .ui-report__header {
46
+ align-items: end;
47
+ border-block-end: 1px solid var(--line);
48
+ display: flex;
49
+ flex-wrap: wrap;
50
+ gap: var(--space-md);
51
+ justify-content: space-between;
52
+ padding-block-end: var(--space-md);
53
+ }
54
+
55
+ .ui-report__title {
56
+ color: var(--text);
57
+ font-family: var(--display);
58
+ font-size: calc(var(--text-xl) * 1.35);
59
+ letter-spacing: 0;
60
+ line-height: 1.05;
61
+ margin: 0;
62
+ max-inline-size: var(--report-measure);
63
+ text-transform: uppercase;
64
+ text-wrap: balance;
65
+ }
66
+
67
+ .ui-report__subtitle {
68
+ color: var(--text-dim);
69
+ font-size: var(--text-lg);
70
+ line-height: 1.5;
71
+ margin: 0;
72
+ max-inline-size: var(--report-measure);
73
+ }
74
+
75
+ .ui-report__meta {
76
+ align-items: center;
77
+ color: var(--text-dim);
78
+ display: flex;
79
+ flex-wrap: wrap;
80
+ font-family: var(--mono);
81
+ font-size: var(--text-2xs);
82
+ gap: 0.55rem;
83
+ letter-spacing: 0;
84
+ list-style: none;
85
+ margin: 0;
86
+ padding: 0;
87
+ text-transform: uppercase;
88
+ }
89
+
90
+ .ui-report__meta > * {
91
+ align-items: center;
92
+ display: inline-flex;
93
+ gap: 0.55rem;
94
+ }
95
+
96
+ .ui-report__meta > :not(:last-child)::after {
97
+ background: var(--line-strong);
98
+ border-radius: 50%;
99
+ block-size: 0.22rem;
100
+ content: '';
101
+ inline-size: 0.22rem;
102
+ }
103
+
104
+ .ui-report__toc {
105
+ border: 1px solid var(--line);
106
+ border-radius: var(--radius-md);
107
+ display: grid;
108
+ gap: var(--space-xs);
109
+ padding: var(--space-md);
110
+ }
111
+
112
+ .ui-report__toc ol,
113
+ .ui-report__toc ul {
114
+ display: grid;
115
+ gap: 0.35rem;
116
+ margin: 0;
117
+ padding-inline-start: var(--space-md);
118
+ }
119
+
120
+ .ui-report__toc a {
121
+ color: var(--text);
122
+ text-decoration: underline;
123
+ text-decoration-color: color-mix(in srgb, var(--accent) 45%, transparent);
124
+ text-underline-offset: 0.2rem;
125
+ }
126
+
127
+ .ui-report__summary,
128
+ .ui-report__finding,
129
+ .ui-report__evidence {
130
+ background: var(--panel);
131
+ border: 1px solid var(--line);
132
+ border-radius: var(--radius-md);
133
+ display: grid;
134
+ gap: var(--space-sm);
135
+ padding: var(--space-md);
136
+ }
137
+
138
+ .ui-report__summary {
139
+ border-inline-start: 2px solid var(--accent);
140
+ }
141
+
142
+ .ui-report__finding {
143
+ border-inline-start: 2px solid var(--line-strong);
144
+ }
145
+
146
+ .ui-report__evidence {
147
+ background: var(--panel-soft);
148
+ }
149
+
150
+ .ui-report__evidence:has(> .ui-table-wrap:only-child) {
151
+ padding: 0;
152
+ }
153
+
154
+ .ui-report__evidence:has(> .ui-table-wrap:only-child) > .ui-table-wrap {
155
+ border: 0;
156
+ border-radius: var(--radius-md);
157
+ }
158
+
159
+ .ui-report__section {
160
+ display: grid;
161
+ gap: var(--space-md);
162
+ scroll-margin-block-start: 6rem;
163
+ }
164
+
165
+ .ui-report__section + .ui-report__section {
166
+ border-block-start: 1px solid var(--line);
167
+ padding-block-start: var(--space-xl);
168
+ }
169
+
170
+ .ui-report__section-head {
171
+ color: var(--text);
172
+ font-family: var(--display);
173
+ font-size: var(--text-xl);
174
+ letter-spacing: 0;
175
+ line-height: 1.1;
176
+ margin: 0;
177
+ text-transform: uppercase;
178
+ text-wrap: balance;
179
+ }
180
+
181
+ .ui-report--numbered .ui-report__section-head::before {
182
+ color: var(--accent-text);
183
+ content: counter(report-section, decimal-leading-zero) ' / ';
184
+ counter-increment: report-section;
185
+ }
186
+
187
+ .ui-report--numbered .ui-report__section--unnumbered > .ui-report__section-head::before {
188
+ content: none;
189
+ counter-increment: none;
190
+ }
191
+
192
+ .ui-report__figure {
193
+ display: grid;
194
+ gap: var(--space-sm);
195
+ margin: 0;
196
+ }
197
+
198
+ .ui-report__caption,
199
+ .ui-chart__caption {
200
+ color: var(--text-dim);
201
+ font-family: var(--mono);
202
+ font-size: var(--text-2xs);
203
+ letter-spacing: 0;
204
+ line-height: 1.5;
205
+ text-transform: uppercase;
206
+ }
207
+
208
+ .ui-report__sources,
209
+ .ui-report__appendix,
210
+ .ui-report__footnotes {
211
+ border-block-start: 1px solid var(--line);
212
+ color: var(--text-dim);
213
+ display: grid;
214
+ font-size: var(--text-sm);
215
+ gap: var(--space-sm);
216
+ padding-block-start: var(--space-md);
217
+ }
218
+
219
+ .ui-chart {
220
+ border: 1px solid var(--line);
221
+ border-radius: var(--radius-md);
222
+ display: grid;
223
+ gap: var(--space-sm);
224
+ padding: var(--space-md);
225
+ }
226
+
227
+ /* The chart's data key lives in the standalone, portable `.ui-legend`
228
+ (css/legend.css), not here — import it beside this kit when a chart needs
229
+ a legend. The chart owns only its plot + bars + fallback below. */
230
+ .ui-chart__plot {
231
+ display: grid;
232
+ gap: var(--space-xs);
233
+ }
234
+
235
+ .ui-chart__bar {
236
+ --chart-value: 0%;
237
+
238
+ display: grid;
239
+ gap: 0.35rem;
240
+ }
241
+
242
+ /* An author `display` outranks the UA `[hidden]` rule, so re-assert it: a host
243
+ toggling a series (e.g. from a `bronto:legend:toggle` event) expects
244
+ `bar.hidden = true` to actually hide the bar. */
245
+ .ui-chart__bar[hidden] {
246
+ display: none;
247
+ }
248
+
249
+ .ui-chart__label {
250
+ align-items: center;
251
+ color: var(--text-soft);
252
+ display: flex;
253
+ font-family: var(--mono);
254
+ font-size: var(--text-xs);
255
+ gap: var(--space-sm);
256
+ justify-content: space-between;
257
+ }
258
+
259
+ .ui-chart__track {
260
+ background: var(--panel-soft);
261
+ border: 1px solid var(--line);
262
+ block-size: 0.8rem;
263
+ min-inline-size: 0;
264
+ }
265
+
266
+ .ui-chart__fill {
267
+ background: var(--chart-color, var(--chart-1, var(--accent)));
268
+ background-image: var(--chart-pattern, var(--chart-pattern-1, none));
269
+ background-size: var(--chart-pattern-size, 8px);
270
+ block-size: 100%;
271
+ inline-size: clamp(0%, var(--chart-value), 100%);
272
+ }
273
+
274
+ .ui-chart__fallback {
275
+ margin-block-start: var(--space-sm);
276
+ }
277
+
278
+ .ui-print-only {
279
+ display: none !important;
280
+ }
281
+
282
+ .ui-print-exact {
283
+ -webkit-print-color-adjust: exact;
284
+ print-color-adjust: exact;
285
+ }
286
+
287
+ @media print {
288
+ /* Re-tokenises the base 18mm default (base.css) so report margins stay
289
+ themeable via --report-page-margin. */
290
+ @page {
291
+ margin: var(--report-page-margin);
292
+ }
293
+
294
+ .ui-report {
295
+ --report-padding-block: 0;
296
+
297
+ /* Force an ink-on-white document regardless of the on-screen theme: the
298
+ palette tokens are [data-theme]-scoped raw values, so `color-scheme`
299
+ alone can't flip them. Re-point the handful the report renders with to
300
+ neutral (achromatic) ink/paper values so a dark-theme report doesn't
301
+ print light-grey text on white. */
302
+ color-scheme: light;
303
+
304
+ --text: #111;
305
+ --text-soft: #2a2a2a;
306
+ --text-dim: #555;
307
+ --panel: #fff;
308
+ --panel-soft: #f7f7f7;
309
+ --line: #d9d9d9;
310
+ --line-strong: #b3b3b3;
311
+
312
+ inline-size: auto;
313
+ padding: 0;
314
+ }
315
+
316
+ /* Meaning-carrying chart fills must survive the print "economy" default
317
+ (which drops backgrounds) without relying on a `.ui-print-exact`
318
+ ancestor. The accent on `.ui-report__summary` is a border, so it already
319
+ prints. (Legend swatches print-protect themselves in css/legend.css.) */
320
+ .ui-chart__fill {
321
+ -webkit-print-color-adjust: exact;
322
+ print-color-adjust: exact;
323
+ }
324
+
325
+ .ui-report__cover {
326
+ min-block-size: auto;
327
+ }
328
+
329
+ .ui-report__cover,
330
+ .ui-report__header,
331
+ .ui-report__section,
332
+ .ui-report__summary,
333
+ .ui-report__finding,
334
+ .ui-report__evidence,
335
+ .ui-report__figure,
336
+ .ui-chart {
337
+ break-inside: avoid;
338
+ }
339
+
340
+ .ui-report__section-head {
341
+ break-after: avoid;
342
+ }
343
+
344
+ .ui-print-only {
345
+ display: var(--print-display, block) !important;
346
+ }
347
+
348
+ .ui-screen-only {
349
+ display: none !important;
350
+ }
351
+
352
+ .ui-break-before {
353
+ break-before: page;
354
+ }
355
+
356
+ .ui-break-after {
357
+ break-after: page;
358
+ }
359
+
360
+ .ui-keep {
361
+ break-inside: avoid;
362
+ }
363
+ }
@@ -0,0 +1,46 @@
1
+ /* ==========================================================================
2
+ selection — opt-in, cross-cutting selection-emphasis vocabulary.
3
+
4
+ The carve-out from "brush/lasso": Bronto does NOT do region selection or
5
+ hit-testing (that needs the host's scales/geometry). It ships only the
6
+ *states* an item can be in once the host has decided — reusable on a chart
7
+ mark, a table row, a list item, a map region. The host adds/removes these
8
+ classes from its own brush/filter logic. Not imported by core.css.
9
+
10
+ in the selection → .ui-sel--on · excluded → .ui-sel--off
11
+ would-be-selected (live brush) → .ui-sel--maybe
12
+ ========================================================================== */
13
+
14
+ .ui-sel {
15
+ transition:
16
+ opacity 0.12s ease,
17
+ outline-color 0.12s ease;
18
+ }
19
+
20
+ @media (prefers-reduced-motion: reduce) {
21
+ .ui-sel {
22
+ transition: none;
23
+ }
24
+ }
25
+
26
+ .ui-sel--on {
27
+ outline: 2px solid var(--accent);
28
+ outline-offset: 1px;
29
+ }
30
+
31
+ .ui-sel--off {
32
+ /* opacity survives forced-colors, so an excluded item stays dimmer than the
33
+ selected/candidate items (which carry a solid/dashed outline). */
34
+ opacity: 0.35;
35
+ }
36
+
37
+ .ui-sel--maybe {
38
+ outline: 1px dashed var(--accent);
39
+ outline-offset: 1px;
40
+ }
41
+
42
+ @media (forced-colors: active) {
43
+ .ui-sel--on {
44
+ outline-color: Highlight;
45
+ }
46
+ }
@@ -0,0 +1,179 @@
1
+ /* ==========================================================================
2
+ sources — opt-in source, citation & provenance grammar (the trust layer).
3
+
4
+ For generated reports, AI output, audits and docs that must answer "where
5
+ did this come from?". Bronto owns the visual grammar + the trust states; the
6
+ host owns fetching, citation numbering, and whether a source is trustworthy.
7
+ The state is carried by a rationed tone dot/border AND an author-written
8
+ label, so it never relies on colour alone (WCAG 1.4.1). Not imported by
9
+ core.css.
10
+
11
+ States (cross-cutting `.ui-src--*`, set the tone): verified · reviewed ·
12
+ generated · unverified · stale · conflict.
13
+ ========================================================================== */
14
+
15
+ /* One tone, shared by citation / source-card / provenance via `--src-tone`. */
16
+ .ui-citation,
17
+ .ui-source-card,
18
+ .ui-provenance {
19
+ --src-tone: var(--text-dim);
20
+ }
21
+
22
+ .ui-src--verified {
23
+ --src-tone: var(--success);
24
+ }
25
+
26
+ .ui-src--reviewed {
27
+ --src-tone: var(--accent);
28
+ }
29
+
30
+ .ui-src--generated {
31
+ --src-tone: var(--info);
32
+ }
33
+
34
+ .ui-src--unverified {
35
+ --src-tone: var(--text-dim);
36
+ }
37
+
38
+ .ui-src--stale {
39
+ --src-tone: var(--warning);
40
+ }
41
+
42
+ .ui-src--conflict {
43
+ --src-tone: var(--danger);
44
+ }
45
+
46
+ /* --- Inline citation — a reference marker on an <a> or <button>. --- */
47
+ .ui-citation {
48
+ color: var(--accent-text);
49
+ font-family: var(--mono);
50
+ font-size: 0.72em;
51
+ font-weight: 600;
52
+ text-decoration: none;
53
+ vertical-align: super;
54
+ }
55
+
56
+ .ui-citation:hover {
57
+ text-decoration: underline;
58
+ }
59
+
60
+ /* Named-source pill — full size, with a leading tone dot. */
61
+ .ui-citation--chip {
62
+ align-items: center;
63
+ background: var(--panel-soft);
64
+ border: 1px solid var(--line);
65
+ border-radius: var(--radius-pill);
66
+ color: var(--text-soft);
67
+ display: inline-flex;
68
+ font-size: var(--text-2xs);
69
+ gap: 0.35rem;
70
+ padding: 0.08rem 0.55rem;
71
+ vertical-align: baseline;
72
+ }
73
+
74
+ .ui-citation--chip::before {
75
+ background: var(--src-tone);
76
+ border-radius: 50%;
77
+ block-size: 0.45rem;
78
+ content: '';
79
+ inline-size: 0.45rem;
80
+ print-color-adjust: exact;
81
+ }
82
+
83
+ /* --- Source list — a references section. --- */
84
+ .ui-source-list {
85
+ display: grid;
86
+ gap: var(--space-sm);
87
+ list-style: none;
88
+ margin: 0;
89
+ padding: 0;
90
+ }
91
+
92
+ .ui-source-list__item {
93
+ margin: 0;
94
+ }
95
+
96
+ /* --- Source card — a single source preview. --- */
97
+ .ui-source-card {
98
+ background: var(--panel-soft);
99
+ border: 1px solid var(--line);
100
+ border-inline-start: 2px solid var(--src-tone);
101
+ border-radius: var(--radius-md);
102
+ display: grid;
103
+ gap: 0.3rem;
104
+ padding: 0.75rem 0.9rem;
105
+ print-color-adjust: exact;
106
+ }
107
+
108
+ .ui-source-card__title {
109
+ color: var(--text);
110
+ font-size: var(--text-sm);
111
+ font-weight: 600;
112
+ margin: 0;
113
+ }
114
+
115
+ .ui-source-card__origin {
116
+ color: var(--text-soft);
117
+ font-family: var(--mono);
118
+ font-size: var(--text-2xs);
119
+ letter-spacing: var(--tracking-wide);
120
+ }
121
+
122
+ .ui-source-card__time {
123
+ color: var(--text-dim);
124
+ font-family: var(--mono);
125
+ font-size: var(--text-2xs);
126
+ }
127
+
128
+ .ui-source-card__excerpt {
129
+ color: var(--text-soft);
130
+ margin: 0;
131
+ }
132
+
133
+ .ui-source-card__actions {
134
+ display: flex;
135
+ flex-wrap: wrap;
136
+ gap: 0.5rem;
137
+ margin-block-start: 0.2rem;
138
+ }
139
+
140
+ /* --- Provenance — compact metadata beside generated content. --- */
141
+ .ui-provenance {
142
+ align-items: center;
143
+ color: var(--text-dim);
144
+ display: inline-flex;
145
+ flex-wrap: wrap;
146
+ font-family: var(--mono);
147
+ font-size: var(--text-2xs);
148
+ gap: 0.3rem 0.75rem;
149
+ letter-spacing: var(--tracking-wide);
150
+ }
151
+
152
+ .ui-provenance__item {
153
+ align-items: center;
154
+ display: inline-flex;
155
+ gap: 0.35rem;
156
+ }
157
+
158
+ .ui-provenance__item::before {
159
+ background: var(--src-tone);
160
+ border-radius: 50%;
161
+ block-size: 0.45rem;
162
+ content: '';
163
+ inline-size: 0.45rem;
164
+ print-color-adjust: exact;
165
+ }
166
+
167
+ /* Forced colours: the tone dot/border collapses to a system colour, so the
168
+ author-written label is the surviving state channel (it already must be —
169
+ 1.4.1). Keep the marks visible as CanvasText rather than letting them vanish. */
170
+ @media (forced-colors: active) {
171
+ .ui-citation--chip::before,
172
+ .ui-provenance__item::before {
173
+ background: CanvasText;
174
+ }
175
+
176
+ .ui-source-card {
177
+ border-inline-start-color: CanvasText;
178
+ }
179
+ }
@@ -0,0 +1,104 @@
1
+ /* ==========================================================================
2
+ spotlight — opt-in guided-focus overlay (the visual language of a tour).
3
+
4
+ A dimming overlay with a cutout over a target element, an optional target
5
+ ring, and a callout note. Bronto owns the *look* and (via `initSpotlight`)
6
+ positions the cutout over a target; it is NOT a tour engine — step order,
7
+ advancing, and persistence are the host's. Not imported by core.css.
8
+
9
+ The cutout is a single box-shadow hole driven by JS-set custom properties
10
+ (`--spot-x/y/w/h`, viewport coordinates). The overlay is non-blocking
11
+ (`pointer-events: none`) — a visual highlight, not a modal trap.
12
+ ========================================================================== */
13
+
14
+ .ui-spotlight {
15
+ --spot-x: 50%;
16
+ --spot-y: 50%;
17
+ --spot-w: 0px;
18
+ --spot-h: 0px;
19
+ --spot-pad: 8px;
20
+ --spot-radius: var(--radius-md);
21
+ --spot-backdrop: color-mix(in srgb, #000 55%, transparent);
22
+
23
+ inset: 0;
24
+ pointer-events: none;
25
+ position: fixed;
26
+ z-index: var(--z-overlay, 1000);
27
+ }
28
+
29
+ .ui-spotlight__hole {
30
+ background: transparent;
31
+ block-size: calc(var(--spot-h) + var(--spot-pad) * 2);
32
+ border-radius: var(--spot-radius);
33
+ box-shadow: 0 0 0 100vmax var(--spot-backdrop);
34
+ inline-size: calc(var(--spot-w) + var(--spot-pad) * 2);
35
+ inset-block-start: 0;
36
+ inset-inline-start: 0;
37
+ position: absolute;
38
+ transform: translate(
39
+ calc(var(--spot-x) - var(--spot-pad)),
40
+ calc(var(--spot-y) - var(--spot-pad))
41
+ );
42
+ transition:
43
+ transform 0.2s ease,
44
+ inline-size 0.2s ease,
45
+ block-size 0.2s ease;
46
+ }
47
+
48
+ @media (prefers-reduced-motion: reduce) {
49
+ .ui-spotlight__hole {
50
+ transition: none;
51
+ }
52
+ }
53
+
54
+ .ui-spotlight--ring .ui-spotlight__hole {
55
+ outline: 2px solid var(--accent);
56
+ outline-offset: 0;
57
+ }
58
+
59
+ /* The callout. Place it near the target (the host positions it); it re-enables
60
+ pointer events so its controls work inside the non-interactive overlay. */
61
+ .ui-tour-note {
62
+ background: var(--panel);
63
+ border: 1px solid var(--line);
64
+ border-radius: var(--radius-md);
65
+ box-shadow: var(--shadow-raised);
66
+ color: var(--text);
67
+ display: grid;
68
+ gap: var(--space-sm);
69
+ max-inline-size: 22rem;
70
+ padding: var(--space-md);
71
+ pointer-events: auto;
72
+ }
73
+
74
+ .ui-tour-note__step {
75
+ color: var(--text-dim);
76
+ font-family: var(--mono);
77
+ font-size: var(--text-2xs);
78
+ letter-spacing: 0;
79
+ text-transform: uppercase;
80
+ }
81
+
82
+ .ui-tour-note__title {
83
+ color: var(--text);
84
+ font-size: var(--text-lg);
85
+ font-weight: 600;
86
+ margin: 0;
87
+ }
88
+
89
+ .ui-tour-note__body {
90
+ color: var(--text-soft);
91
+ margin: 0;
92
+ }
93
+
94
+ .ui-tour-note__actions {
95
+ display: flex;
96
+ gap: var(--space-sm);
97
+ justify-content: flex-end;
98
+ }
99
+
100
+ @media (forced-colors: active) {
101
+ .ui-spotlight__hole {
102
+ outline: 2px solid CanvasText;
103
+ }
104
+ }