@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.
- package/CHANGELOG.md +352 -12
- package/MIGRATIONS.json +92 -0
- package/README.md +27 -17
- package/annotations/index.d.ts +280 -0
- package/annotations/index.js +522 -0
- package/behaviors/carousel.js +197 -0
- package/behaviors/combobox.js +195 -0
- package/behaviors/command.js +187 -0
- package/behaviors/connectors.js +96 -0
- package/behaviors/crosshair.js +58 -0
- package/behaviors/dialog.js +73 -0
- package/behaviors/disclosure.js +25 -0
- package/behaviors/dismissible.js +24 -0
- package/behaviors/forms.js +158 -0
- package/behaviors/glyph.js +109 -0
- package/behaviors/index.d.ts +82 -1
- package/behaviors/index.js +18 -1336
- package/behaviors/internal.js +50 -0
- package/behaviors/legend.js +46 -0
- package/behaviors/menu.js +46 -0
- package/behaviors/popover.js +108 -0
- package/behaviors/spotlight.js +53 -0
- package/behaviors/table.js +109 -0
- package/behaviors/tabs.js +103 -0
- package/behaviors/theme.js +82 -0
- package/behaviors/toast.js +152 -0
- package/classes/index.d.ts +318 -0
- package/classes/index.js +352 -0
- package/classes/vscode.css-custom-data.json +18 -14
- package/connectors/index.d.ts +71 -0
- package/connectors/index.js +179 -0
- package/css/analytical.css +21 -0
- package/css/annotations.css +292 -0
- package/css/command.css +97 -0
- package/css/connectors.css +93 -0
- package/css/crosshair.css +100 -0
- package/css/disclosure.css +29 -0
- package/css/dots.css +2 -0
- package/css/feedback.css +104 -0
- package/css/fonts.css +11 -7
- package/css/generated.css +117 -0
- package/css/legend.css +268 -0
- package/css/marks.css +144 -0
- package/css/motion.css +88 -0
- package/css/overlay.css +52 -1
- package/css/primitives.css +18 -0
- package/css/report.css +363 -0
- package/css/selection.css +46 -0
- package/css/sources.css +179 -0
- package/css/spotlight.css +104 -0
- package/css/state.css +121 -0
- package/css/tokens.css +78 -60
- package/css/workbench.css +83 -0
- package/dist/bronto.css +1 -1
- package/dist/css/analytical.css +1 -0
- package/dist/css/annotations.css +1 -0
- package/dist/css/command.css +1 -0
- package/dist/css/connectors.css +1 -0
- package/dist/css/crosshair.css +1 -0
- package/dist/css/disclosure.css +1 -1
- package/dist/css/dots.css +1 -1
- package/dist/css/feedback.css +1 -1
- package/dist/css/fonts.css +1 -1
- package/dist/css/generated.css +1 -0
- package/dist/css/legend.css +1 -0
- package/dist/css/marks.css +1 -0
- package/dist/css/motion.css +1 -1
- package/dist/css/overlay.css +1 -1
- package/dist/css/primitives.css +1 -1
- package/dist/css/report.css +1 -0
- package/dist/css/selection.css +1 -0
- package/dist/css/sources.css +1 -0
- package/dist/css/spotlight.css +1 -0
- package/dist/css/state.css +1 -0
- package/dist/css/tokens.css +1 -1
- package/dist/css/workbench.css +1 -0
- package/docs/adr/0001-color-system.md +26 -27
- package/docs/adr/0002-scope-and-2026-baseline.md +104 -0
- package/docs/adr/0003-theme-model.md +97 -0
- package/docs/annotations.md +345 -0
- package/docs/architecture.md +202 -0
- package/docs/command.md +95 -0
- package/docs/connectors.md +91 -0
- package/docs/contrast.md +42 -42
- package/docs/crosshair.md +63 -0
- package/docs/generated.md +91 -0
- package/docs/legends.md +168 -0
- package/docs/marks.md +86 -0
- package/docs/reference.md +418 -15
- package/docs/reporting.md +305 -0
- package/docs/selection.md +40 -0
- package/docs/sources.md +110 -0
- package/docs/spotlight.md +78 -0
- package/docs/stability.md +52 -0
- package/docs/state.md +85 -0
- package/docs/theming.md +18 -6
- package/docs/usage.md +43 -3
- package/docs/workbench.md +72 -0
- package/fonts/doto-400.woff2 +0 -0
- package/fonts/doto-500.woff2 +0 -0
- package/fonts/doto-600.woff2 +0 -0
- package/fonts/doto-700.woff2 +0 -0
- package/fonts/doto-800.woff2 +0 -0
- package/fonts/doto-900.woff2 +0 -0
- package/llms.txt +288 -8
- package/package.json +95 -5
- package/qwik/index.d.ts +60 -0
- package/qwik/index.js +149 -0
- package/react/index.d.ts +40 -14
- package/react/index.js +32 -5
- package/solid/index.d.ts +40 -14
- package/solid/index.js +31 -3
- package/tokens/index.d.ts +3 -3
- package/tokens/index.js +25 -19
- package/tokens/index.json +32 -28
- package/tokens/resolved.json +34 -32
- package/tokens/tokens.dtcg.json +22 -14
- package/fonts/doto-400.ttf +0 -0
- package/fonts/doto-500.ttf +0 -0
- package/fonts/doto-600.ttf +0 -0
- package/fonts/doto-700.ttf +0 -0
- package/fonts/doto-800.ttf +0 -0
- 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
|
+
}
|
package/css/sources.css
ADDED
|
@@ -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
|
+
}
|