@ponchia/ui 0.3.6 → 0.4.1
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 +1063 -0
- package/README.md +31 -14
- package/behaviors/index.d.ts +3 -1
- package/behaviors/index.js +179 -106
- package/classes/index.d.ts +41 -0
- package/classes/index.js +42 -0
- package/classes/vscode.css-custom-data.json +18 -22
- package/css/dataviz.css +96 -0
- package/css/disclosure.css +29 -0
- package/css/dots.css +32 -2
- package/css/feedback.css +53 -0
- package/css/motion.css +88 -0
- package/css/overlay.css +52 -1
- package/css/report.css +382 -0
- package/css/skins.css +54 -0
- package/css/tokens.css +56 -32
- package/dist/bronto.css +1 -1
- package/dist/css/dataviz.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/motion.css +1 -1
- package/dist/css/overlay.css +1 -1
- package/dist/css/report.css +1 -0
- package/dist/css/skins.css +1 -0
- package/dist/css/tokens.css +1 -1
- package/docs/adr/0001-color-system.md +271 -0
- package/docs/adr/0002-scope-and-2026-baseline.md +104 -0
- package/docs/adr/0003-theme-model.md +94 -0
- package/docs/contrast.md +170 -51
- package/docs/reference.md +118 -19
- package/docs/reporting.md +270 -0
- package/docs/stability.md +37 -0
- package/docs/theming.md +84 -7
- package/docs/usage.md +67 -8
- package/glyphs/glyphs.d.ts +14 -1
- package/glyphs/glyphs.js +143 -2
- package/llms.txt +101 -5
- package/package.json +79 -5
- package/qwik/index.d.ts +55 -0
- package/qwik/index.js +129 -0
- package/react/index.d.ts +57 -0
- package/react/index.js +84 -0
- package/solid/index.d.ts +57 -0
- package/solid/index.js +85 -0
- package/tokens/charts.d.ts +37 -0
- package/tokens/charts.js +96 -0
- package/tokens/charts.json +61 -0
- package/tokens/index.d.ts +3 -3
- package/tokens/index.js +16 -18
- package/tokens/index.json +32 -36
- package/tokens/resolved.json +39 -41
- package/tokens/skins.d.ts +27 -0
- package/tokens/skins.js +62 -0
- package/tokens/tokens.dtcg.json +22 -34
package/css/report.css
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
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
|
+
.ui-chart__legend {
|
|
228
|
+
display: flex;
|
|
229
|
+
flex-wrap: wrap;
|
|
230
|
+
gap: var(--space-xs);
|
|
231
|
+
list-style: none;
|
|
232
|
+
margin: 0;
|
|
233
|
+
padding: 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.ui-chart__legend > * {
|
|
237
|
+
align-items: center;
|
|
238
|
+
color: var(--text-soft);
|
|
239
|
+
display: inline-flex;
|
|
240
|
+
font-family: var(--mono);
|
|
241
|
+
font-size: var(--text-xs);
|
|
242
|
+
gap: 0.45rem;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.ui-chart__swatch {
|
|
246
|
+
background: var(--chart-color, var(--chart-1, var(--accent)));
|
|
247
|
+
background-image: var(--chart-pattern, var(--chart-pattern-1, none));
|
|
248
|
+
background-size: var(--chart-pattern-size, 8px);
|
|
249
|
+
border: 1px solid var(--line-strong);
|
|
250
|
+
block-size: 0.8rem;
|
|
251
|
+
flex: 0 0 auto;
|
|
252
|
+
inline-size: 0.8rem;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.ui-chart__plot {
|
|
256
|
+
display: grid;
|
|
257
|
+
gap: var(--space-xs);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.ui-chart__bar {
|
|
261
|
+
--chart-value: 0%;
|
|
262
|
+
|
|
263
|
+
display: grid;
|
|
264
|
+
gap: 0.35rem;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.ui-chart__label {
|
|
268
|
+
align-items: center;
|
|
269
|
+
color: var(--text-soft);
|
|
270
|
+
display: flex;
|
|
271
|
+
font-family: var(--mono);
|
|
272
|
+
font-size: var(--text-xs);
|
|
273
|
+
gap: var(--space-sm);
|
|
274
|
+
justify-content: space-between;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
.ui-chart__track {
|
|
278
|
+
background: var(--panel-soft);
|
|
279
|
+
border: 1px solid var(--line);
|
|
280
|
+
block-size: 0.8rem;
|
|
281
|
+
min-inline-size: 0;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.ui-chart__fill {
|
|
285
|
+
background: var(--chart-color, var(--chart-1, var(--accent)));
|
|
286
|
+
background-image: var(--chart-pattern, var(--chart-pattern-1, none));
|
|
287
|
+
background-size: var(--chart-pattern-size, 8px);
|
|
288
|
+
block-size: 100%;
|
|
289
|
+
inline-size: clamp(0%, var(--chart-value), 100%);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.ui-chart__fallback {
|
|
293
|
+
margin-block-start: var(--space-sm);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.ui-print-only {
|
|
297
|
+
display: none !important;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.ui-print-exact {
|
|
301
|
+
-webkit-print-color-adjust: exact;
|
|
302
|
+
print-color-adjust: exact;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
@media print {
|
|
306
|
+
/* Re-tokenises the base 18mm default (base.css) so report margins stay
|
|
307
|
+
themeable via --report-page-margin. */
|
|
308
|
+
@page {
|
|
309
|
+
margin: var(--report-page-margin);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.ui-report {
|
|
313
|
+
--report-padding-block: 0;
|
|
314
|
+
|
|
315
|
+
/* Force an ink-on-white document regardless of the on-screen theme: the
|
|
316
|
+
palette tokens are [data-theme]-scoped raw values, so `color-scheme`
|
|
317
|
+
alone can't flip them. Re-point the handful the report renders with to
|
|
318
|
+
neutral (achromatic) ink/paper values so a dark-theme report doesn't
|
|
319
|
+
print light-grey text on white. */
|
|
320
|
+
color-scheme: light;
|
|
321
|
+
|
|
322
|
+
--text: #111;
|
|
323
|
+
--text-soft: #2a2a2a;
|
|
324
|
+
--text-dim: #555;
|
|
325
|
+
--panel: #fff;
|
|
326
|
+
--panel-soft: #f7f7f7;
|
|
327
|
+
--line: #d9d9d9;
|
|
328
|
+
--line-strong: #b3b3b3;
|
|
329
|
+
|
|
330
|
+
inline-size: auto;
|
|
331
|
+
padding: 0;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/* Meaning-carrying chart fills must survive the print "economy" default
|
|
335
|
+
(which drops backgrounds) without relying on a `.ui-print-exact`
|
|
336
|
+
ancestor. The accent on `.ui-report__summary` is a border, so it already
|
|
337
|
+
prints. */
|
|
338
|
+
.ui-chart__fill,
|
|
339
|
+
.ui-chart__swatch {
|
|
340
|
+
-webkit-print-color-adjust: exact;
|
|
341
|
+
print-color-adjust: exact;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.ui-report__cover {
|
|
345
|
+
min-block-size: auto;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.ui-report__cover,
|
|
349
|
+
.ui-report__header,
|
|
350
|
+
.ui-report__section,
|
|
351
|
+
.ui-report__summary,
|
|
352
|
+
.ui-report__finding,
|
|
353
|
+
.ui-report__evidence,
|
|
354
|
+
.ui-report__figure,
|
|
355
|
+
.ui-chart {
|
|
356
|
+
break-inside: avoid;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.ui-report__section-head {
|
|
360
|
+
break-after: avoid;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.ui-print-only {
|
|
364
|
+
display: var(--print-display, block) !important;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.ui-screen-only {
|
|
368
|
+
display: none !important;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.ui-break-before {
|
|
372
|
+
break-before: page;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.ui-break-after {
|
|
376
|
+
break-after: page;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.ui-keep {
|
|
380
|
+
break-inside: avoid;
|
|
381
|
+
}
|
|
382
|
+
}
|
package/css/skins.css
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* @ponchia/ui — GENERATED from tokens/skins.js by scripts/gen-skins.mjs.
|
|
2
|
+
* Do not edit by hand; run `npm run skins:build`. Drift-checked in CI.
|
|
3
|
+
*
|
|
4
|
+
* Optional display colorways (ADR-0001). OPT-IN: imported on demand via
|
|
5
|
+
* `@ponchia/ui/css/skins.css`, never part of the default bundle. Apply with
|
|
6
|
+
* `data-bronto-skin="amber-crt | e-ink | phosphor-green"` on :root / <html> (a
|
|
7
|
+
* root-level choice like data-theme), re-pointing the one accent. The accent's
|
|
8
|
+
* derived family recomputes from the live var(--accent); status colours + the
|
|
9
|
+
* neutral canvas are untouched. Every accent below is gated by check-contrast.mjs. */
|
|
10
|
+
|
|
11
|
+
/* Amber CRT */
|
|
12
|
+
:root[data-bronto-skin='amber-crt'] {
|
|
13
|
+
--accent: oklch(52% 0.11 67deg);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:root[data-theme='dark'][data-bronto-skin='amber-crt'] {
|
|
17
|
+
--accent: oklch(82% 0.15 82deg);
|
|
18
|
+
--dotmatrix-glow: 0.4em;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* E-ink */
|
|
22
|
+
:root[data-bronto-skin='e-ink'] {
|
|
23
|
+
--accent: oklch(34% 0.012 250deg);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:root[data-theme='dark'][data-bronto-skin='e-ink'] {
|
|
27
|
+
--accent: oklch(84% 0.008 250deg);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Phosphor Green */
|
|
31
|
+
:root[data-bronto-skin='phosphor-green'] {
|
|
32
|
+
--accent: oklch(52% 0.13 150deg);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:root[data-theme='dark'][data-bronto-skin='phosphor-green'] {
|
|
36
|
+
--accent: oklch(84% 0.19 150deg);
|
|
37
|
+
--dotmatrix-glow: 0.4em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@media (prefers-color-scheme: dark) {
|
|
41
|
+
:root:not([data-theme='light'])[data-bronto-skin='amber-crt'] {
|
|
42
|
+
--accent: oklch(82% 0.15 82deg);
|
|
43
|
+
--dotmatrix-glow: 0.4em;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:root:not([data-theme='light'])[data-bronto-skin='e-ink'] {
|
|
47
|
+
--accent: oklch(84% 0.008 250deg);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
:root:not([data-theme='light'])[data-bronto-skin='phosphor-green'] {
|
|
51
|
+
--accent: oklch(84% 0.19 150deg);
|
|
52
|
+
--dotmatrix-glow: 0.4em;
|
|
53
|
+
}
|
|
54
|
+
}
|
package/css/tokens.css
CHANGED
|
@@ -65,12 +65,13 @@
|
|
|
65
65
|
|
|
66
66
|
/* Accent ramp — a stepped family for charts / data-viz / multi-state
|
|
67
67
|
surfaces (the use case tokens/index.js advertises). Derived from the
|
|
68
|
-
single --accent knob via color-mix against
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
--accent-
|
|
72
|
-
--accent-
|
|
73
|
-
--accent-
|
|
68
|
+
single --accent knob via OKLCH color-mix against a per-theme white/black
|
|
69
|
+
endpoint. Using an explicit neutral endpoint avoids low-chroma background
|
|
70
|
+
hue differences between browser engines. */
|
|
71
|
+
--accent-1: color-mix(in oklch, var(--accent) 8%, var(--accent-ramp-end));
|
|
72
|
+
--accent-2: color-mix(in oklch, var(--accent) 16%, var(--accent-ramp-end));
|
|
73
|
+
--accent-3: color-mix(in oklch, var(--accent) 32%, var(--accent-ramp-end));
|
|
74
|
+
--accent-4: color-mix(in oklch, var(--accent) 60%, var(--accent-ramp-end));
|
|
74
75
|
--accent-5: var(--accent);
|
|
75
76
|
--accent-6: var(--accent-strong);
|
|
76
77
|
|
|
@@ -128,6 +129,7 @@
|
|
|
128
129
|
--text-soft: #353533;
|
|
129
130
|
--text-dim: #686863;
|
|
130
131
|
--accent: #d71921;
|
|
132
|
+
--accent-ramp-end: #ffffff;
|
|
131
133
|
--accent-strong: color-mix(in srgb, var(--accent) 83%, #000);
|
|
132
134
|
--accent-text: var(--accent-strong);
|
|
133
135
|
--accent-soft: color-mix(in srgb, var(--accent) 10%, transparent);
|
|
@@ -135,8 +137,6 @@
|
|
|
135
137
|
--success-soft: rgb(47, 125, 79, 0.12);
|
|
136
138
|
--warning: #806414;
|
|
137
139
|
--warning-soft: rgb(128, 100, 20, 0.13);
|
|
138
|
-
--orange: #a85f32;
|
|
139
|
-
--orange-soft: rgb(168, 95, 50, 0.13);
|
|
140
140
|
--danger: #c01622;
|
|
141
141
|
--danger-soft: rgb(192, 22, 34, 0.1);
|
|
142
142
|
--info: #1f63c4;
|
|
@@ -169,18 +169,19 @@
|
|
|
169
169
|
:root:not([data-theme='light']) {
|
|
170
170
|
color-scheme: dark;
|
|
171
171
|
|
|
172
|
-
--bg: #
|
|
173
|
-
--bg-elevated: #
|
|
172
|
+
--bg: #121212;
|
|
173
|
+
--bg-elevated: #181818;
|
|
174
174
|
--bg-accent: color-mix(in srgb, var(--accent) 8%, transparent);
|
|
175
|
-
--panel: #
|
|
176
|
-
--panel-strong: #
|
|
177
|
-
--panel-soft: #
|
|
178
|
-
--line: #
|
|
179
|
-
--line-strong: #
|
|
180
|
-
--text: #
|
|
181
|
-
--text-soft: #
|
|
182
|
-
--text-dim: #
|
|
175
|
+
--panel: #1c1c1c;
|
|
176
|
+
--panel-strong: #222222;
|
|
177
|
+
--panel-soft: #242424;
|
|
178
|
+
--line: #383838;
|
|
179
|
+
--line-strong: #555555;
|
|
180
|
+
--text: #e6e6e6;
|
|
181
|
+
--text-soft: #c8c8c8;
|
|
182
|
+
--text-dim: #a0a0a0;
|
|
183
183
|
--accent: #ff3b41;
|
|
184
|
+
--accent-ramp-end: #000000;
|
|
184
185
|
--accent-strong: color-mix(in srgb, var(--accent) 84%, #fff);
|
|
185
186
|
--accent-text: var(--accent-strong);
|
|
186
187
|
--accent-soft: color-mix(in srgb, var(--accent) 14%, transparent);
|
|
@@ -188,8 +189,6 @@
|
|
|
188
189
|
--success-soft: rgb(78, 194, 126, 0.14);
|
|
189
190
|
--warning: #d8bd72;
|
|
190
191
|
--warning-soft: rgb(216, 189, 114, 0.14);
|
|
191
|
-
--orange: #d08c5b;
|
|
192
|
-
--orange-soft: rgb(208, 140, 91, 0.15);
|
|
193
192
|
--danger: #ff4d54;
|
|
194
193
|
--danger-soft: rgb(255, 77, 84, 0.15);
|
|
195
194
|
--info: #6fb0e6;
|
|
@@ -208,18 +207,19 @@
|
|
|
208
207
|
:root[data-theme='dark'] {
|
|
209
208
|
color-scheme: dark;
|
|
210
209
|
|
|
211
|
-
--bg: #
|
|
212
|
-
--bg-elevated: #
|
|
210
|
+
--bg: #121212;
|
|
211
|
+
--bg-elevated: #181818;
|
|
213
212
|
--bg-accent: color-mix(in srgb, var(--accent) 8%, transparent);
|
|
214
|
-
--panel: #
|
|
215
|
-
--panel-strong: #
|
|
216
|
-
--panel-soft: #
|
|
217
|
-
--line: #
|
|
218
|
-
--line-strong: #
|
|
219
|
-
--text: #
|
|
220
|
-
--text-soft: #
|
|
221
|
-
--text-dim: #
|
|
213
|
+
--panel: #1c1c1c;
|
|
214
|
+
--panel-strong: #222222;
|
|
215
|
+
--panel-soft: #242424;
|
|
216
|
+
--line: #383838;
|
|
217
|
+
--line-strong: #555555;
|
|
218
|
+
--text: #e6e6e6;
|
|
219
|
+
--text-soft: #c8c8c8;
|
|
220
|
+
--text-dim: #a0a0a0;
|
|
222
221
|
--accent: #ff3b41;
|
|
222
|
+
--accent-ramp-end: #000000;
|
|
223
223
|
--accent-strong: color-mix(in srgb, var(--accent) 84%, #fff);
|
|
224
224
|
--accent-text: var(--accent-strong);
|
|
225
225
|
--accent-soft: color-mix(in srgb, var(--accent) 14%, transparent);
|
|
@@ -227,8 +227,6 @@
|
|
|
227
227
|
--success-soft: rgb(78, 194, 126, 0.14);
|
|
228
228
|
--warning: #d8bd72;
|
|
229
229
|
--warning-soft: rgb(216, 189, 114, 0.14);
|
|
230
|
-
--orange: #d08c5b;
|
|
231
|
-
--orange-soft: rgb(208, 140, 91, 0.15);
|
|
232
230
|
--danger: #ff4d54;
|
|
233
231
|
--danger-soft: rgb(255, 77, 84, 0.15);
|
|
234
232
|
--info: #6fb0e6;
|
|
@@ -299,3 +297,29 @@
|
|
|
299
297
|
--shadow-raised: 0 0 0 1px var(--text);
|
|
300
298
|
}
|
|
301
299
|
}
|
|
300
|
+
|
|
301
|
+
/* OLED / true-black surface — opt-in brand variant for the dark theme.
|
|
302
|
+
The default dark base is a deliberately elevated near-black (#121212) for
|
|
303
|
+
readability: pure black + bright text causes halation, and #000→#0c0c0c
|
|
304
|
+
surface steps are imperceptible (so cards melt into the page). This preset
|
|
305
|
+
restores pure black for OLED power-saving and the original "Nothing" look.
|
|
306
|
+
CSS-only (not in the JS token model, like [data-density] / [data-contrast]),
|
|
307
|
+
and scoped to the dark theme so it never blacks out the light theme. Text
|
|
308
|
+
stays the re-tuned --text, which clears WCAG AA on #000 too. */
|
|
309
|
+
:root[data-theme='dark'][data-surface='oled'] {
|
|
310
|
+
--bg: #000000;
|
|
311
|
+
--bg-elevated: #0a0a0a;
|
|
312
|
+
--panel: #101010;
|
|
313
|
+
--panel-strong: #161616;
|
|
314
|
+
--panel-soft: #1a1a1a;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
@media (prefers-color-scheme: dark) {
|
|
318
|
+
:root:not([data-theme='light'])[data-surface='oled'] {
|
|
319
|
+
--bg: #000000;
|
|
320
|
+
--bg-elevated: #0a0a0a;
|
|
321
|
+
--panel: #101010;
|
|
322
|
+
--panel-strong: #161616;
|
|
323
|
+
--panel-soft: #1a1a1a;
|
|
324
|
+
}
|
|
325
|
+
}
|