@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.
Files changed (55) hide show
  1. package/CHANGELOG.md +1063 -0
  2. package/README.md +31 -14
  3. package/behaviors/index.d.ts +3 -1
  4. package/behaviors/index.js +179 -106
  5. package/classes/index.d.ts +41 -0
  6. package/classes/index.js +42 -0
  7. package/classes/vscode.css-custom-data.json +18 -22
  8. package/css/dataviz.css +96 -0
  9. package/css/disclosure.css +29 -0
  10. package/css/dots.css +32 -2
  11. package/css/feedback.css +53 -0
  12. package/css/motion.css +88 -0
  13. package/css/overlay.css +52 -1
  14. package/css/report.css +382 -0
  15. package/css/skins.css +54 -0
  16. package/css/tokens.css +56 -32
  17. package/dist/bronto.css +1 -1
  18. package/dist/css/dataviz.css +1 -0
  19. package/dist/css/disclosure.css +1 -1
  20. package/dist/css/dots.css +1 -1
  21. package/dist/css/feedback.css +1 -1
  22. package/dist/css/motion.css +1 -1
  23. package/dist/css/overlay.css +1 -1
  24. package/dist/css/report.css +1 -0
  25. package/dist/css/skins.css +1 -0
  26. package/dist/css/tokens.css +1 -1
  27. package/docs/adr/0001-color-system.md +271 -0
  28. package/docs/adr/0002-scope-and-2026-baseline.md +104 -0
  29. package/docs/adr/0003-theme-model.md +94 -0
  30. package/docs/contrast.md +170 -51
  31. package/docs/reference.md +118 -19
  32. package/docs/reporting.md +270 -0
  33. package/docs/stability.md +37 -0
  34. package/docs/theming.md +84 -7
  35. package/docs/usage.md +67 -8
  36. package/glyphs/glyphs.d.ts +14 -1
  37. package/glyphs/glyphs.js +143 -2
  38. package/llms.txt +101 -5
  39. package/package.json +79 -5
  40. package/qwik/index.d.ts +55 -0
  41. package/qwik/index.js +129 -0
  42. package/react/index.d.ts +57 -0
  43. package/react/index.js +84 -0
  44. package/solid/index.d.ts +57 -0
  45. package/solid/index.js +85 -0
  46. package/tokens/charts.d.ts +37 -0
  47. package/tokens/charts.js +96 -0
  48. package/tokens/charts.json +61 -0
  49. package/tokens/index.d.ts +3 -3
  50. package/tokens/index.js +16 -18
  51. package/tokens/index.json +32 -36
  52. package/tokens/resolved.json +39 -41
  53. package/tokens/skins.d.ts +27 -0
  54. package/tokens/skins.js +62 -0
  55. 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 the theme bg, so it
69
- re-brands and theme-adapts automatically; no per-theme duplication. */
70
- --accent-1: color-mix(in srgb, var(--accent) 8%, var(--bg));
71
- --accent-2: color-mix(in srgb, var(--accent) 16%, var(--bg));
72
- --accent-3: color-mix(in srgb, var(--accent) 32%, var(--bg));
73
- --accent-4: color-mix(in srgb, var(--accent) 60%, var(--bg));
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: #000000;
173
- --bg-elevated: #0a0a0a;
172
+ --bg: #121212;
173
+ --bg-elevated: #181818;
174
174
  --bg-accent: color-mix(in srgb, var(--accent) 8%, transparent);
175
- --panel: #0c0c0c;
176
- --panel-strong: #141414;
177
- --panel-soft: #1a1a1a;
178
- --line: #2a2a2a;
179
- --line-strong: #444444;
180
- --text: #f2f2f2;
181
- --text-soft: #c4c4c4;
182
- --text-dim: #858585;
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: #000000;
212
- --bg-elevated: #0a0a0a;
210
+ --bg: #121212;
211
+ --bg-elevated: #181818;
213
212
  --bg-accent: color-mix(in srgb, var(--accent) 8%, transparent);
214
- --panel: #0c0c0c;
215
- --panel-strong: #141414;
216
- --panel-soft: #1a1a1a;
217
- --line: #2a2a2a;
218
- --line-strong: #444444;
219
- --text: #f2f2f2;
220
- --text-soft: #c4c4c4;
221
- --text-dim: #858585;
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
+ }