@fest-lib/veela 0.1.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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +533 -0
  3. package/dist/veela.js +878 -0
  4. package/package.json +83 -0
  5. package/src/scss/_layers.scss +16 -0
  6. package/src/scss/advanced/_index.scss +0 -0
  7. package/src/scss/advanced/animation/_motion.scss +317 -0
  8. package/src/scss/advanced/color/_color.scss +328 -0
  9. package/src/scss/advanced/color/_colorize.scss +325 -0
  10. package/src/scss/advanced/design/_design-tokens.scss +118 -0
  11. package/src/scss/advanced/design/_effects.scss +275 -0
  12. package/src/scss/advanced/design/_shadow.scss +359 -0
  13. package/src/scss/advanced/design/_surfaces.scss +76 -0
  14. package/src/scss/advanced/effects/_animations.scss +124 -0
  15. package/src/scss/advanced/effects/_shadows.scss +50 -0
  16. package/src/scss/advanced/font/_typography.scss +600 -0
  17. package/src/scss/advanced/index.scss +11 -0
  18. package/src/scss/advanced/index.ts +35 -0
  19. package/src/scss/advanced/layout/_content.scss +170 -0
  20. package/src/scss/advanced/layout/_index.scss +5 -0
  21. package/src/scss/advanced/layout/_normalize.scss +541 -0
  22. package/src/scss/advanced/layout/_shared-overlays.scss +162 -0
  23. package/src/scss/advanced/md3/_md3.scss +596 -0
  24. package/src/scss/advanced/md3/_utils.scss +114 -0
  25. package/src/scss/advanced/misc/_config.scss +119 -0
  26. package/src/scss/advanced/misc/_initials.scss +298 -0
  27. package/src/scss/advanced/misc/_mixins.scss +179 -0
  28. package/src/scss/advanced/misc/_queries.scss +34 -0
  29. package/src/scss/advanced/misc/_rendering.scss +82 -0
  30. package/src/scss/advanced/misc/_tokens.scss +74 -0
  31. package/src/scss/advanced/theme/_shared.scss +232 -0
  32. package/src/scss/advanced/theme/_states.scss +332 -0
  33. package/src/scss/advanced/theme/_variants.scss +354 -0
  34. package/src/scss/advanced/tokens/_material-color.scss +120 -0
  35. package/src/scss/advanced/tokens/_variables.scss +171 -0
  36. package/src/scss/basic/_layers.scss +0 -0
  37. package/src/scss/basic/design/_index.scss +3 -0
  38. package/src/scss/basic/design/_keyframes.scss +163 -0
  39. package/src/scss/basic/design/_shapes.scss +266 -0
  40. package/src/scss/basic/design/_wavy-runtime.scss +50 -0
  41. package/src/scss/basic/index.scss +19 -0
  42. package/src/scss/basic/index.ts +29 -0
  43. package/src/scss/basic/misc/_core-layout.scss +272 -0
  44. package/src/scss/basic/misc/_index.scss +18 -0
  45. package/src/scss/basic/misc/_layout.scss +1040 -0
  46. package/src/scss/basic/misc/_mixins.scss +179 -0
  47. package/src/scss/basic/misc/_motion.scss +28 -0
  48. package/src/scss/basic/misc/_normalize.scss +765 -0
  49. package/src/scss/basic/misc/_queries.scss +34 -0
  50. package/src/scss/basic/misc/_shared.scss +232 -0
  51. package/src/scss/basic/misc/_states.scss +135 -0
  52. package/src/scss/basic/misc/_tokens.scss +78 -0
  53. package/src/scss/basic/misc/_veela.scss +12 -0
  54. package/src/scss/core/index.scss +1 -0
  55. package/src/scss/core/interact/_draggable.scss +32 -0
  56. package/src/scss/core/interact/_position.scss +45 -0
  57. package/src/scss/core/interact/_ps-anchor.scss +28 -0
  58. package/src/scss/core/interact/_ps-centered.scss +28 -0
  59. package/src/scss/core/interact/_ps-cursor.scss +18 -0
  60. package/src/scss/core/interact/_ps-draggable.scss +25 -0
  61. package/src/scss/core/interact/_ps-mechanic.scss +0 -0
  62. package/src/scss/core/interact/_ps-properties.scss +54 -0
  63. package/src/scss/core/interact/_ps-resizable.scss +61 -0
  64. package/src/scss/core/interact/_resizable.scss +69 -0
  65. package/src/scss/core/interact/_viewport.scss +469 -0
  66. package/src/scss/core/misc/_color-properties.scss +64 -0
  67. package/src/scss/core/misc/_config.scss +110 -0
  68. package/src/scss/core/misc/_functions.scss +530 -0
  69. package/src/scss/core/misc/_icons.scss +109 -0
  70. package/src/scss/core/misc/_index.scss +6 -0
  71. package/src/scss/core/misc/_layout.scss +49 -0
  72. package/src/scss/core/misc/_mixins.scss +744 -0
  73. package/src/scss/core/misc/_properties.scss +245 -0
  74. package/src/scss/core/misc/_tokens.scss +947 -0
  75. package/src/scss/core/misc/_utilities.scss +941 -0
  76. package/src/scss/core/misc/_utils.scss +17 -0
  77. package/src/scss/index.scss +18 -0
  78. package/src/scss/index.ts +105 -0
@@ -0,0 +1,947 @@
1
+ /*
2
+ * Filename: _tokens.scss
3
+ * FullPath: modules/projects/veela.css/src/scss/core/misc/_tokens.scss
4
+ * Change date and time: 12.30.00_06.08.2026
5
+ * Reason for changes: Unify all color tokens — this file is the SINGLE SOURCE OF TRUTH for color token defaults across veela, fl.ui, and app shells/views.
6
+ */
7
+
8
+ /*
9
+ * INVARIANT: This is the canonical color-token registry for the full veela bundle.
10
+ * All color token DEFAULTS live here on `:root, :host, :scope`.
11
+ * - `misc/_tokens.scss` is a symlink of this file.
12
+ * - `basic/misc/_tokens.scss` and `advanced/misc/_tokens.scss` are intentional
13
+ * per-bundle SCSS alias shims (no CSS output) for the lightweight vl-basic / advanced
14
+ * bundles; they MUST NOT `@forward` this file (would pull the full `@layer tokens`
15
+ * CSS into those bundles and break their size semantics).
16
+ * - `basic/misc/_normalize.scss` carries a documented vl-basic fallback palette for
17
+ * standalone vl-basic loading (no advanced MD3 tokens bundled).
18
+ * - The advanced MD3/C2 system (`advanced/tokens/_variables.scss`, `_color.scss`,
19
+ * `_shadow.scss`) keeps its mixin/function definitions in place (depends on
20
+ * `veela-lib`); color-token EMISSION for that system is invoked from here where
21
+ * safe, otherwise remains in its layer with a pointer comment.
22
+ * - Component/shell/view files keep only context overrides and shadow-DOM
23
+ * `var(--token, light-dark(...))` fallbacks; they never redefine a canonical default.
24
+ */
25
+
26
+ @use "./config" as config;
27
+ @use "./color-properties";
28
+
29
+ // Design tokens: SCSS aliases for CSS custom properties
30
+ // Keep aliases small and meaningful to encourage reuse
31
+
32
+ $space-2xs: var(--space-2xs);
33
+ $space-xs: var(--space-xs);
34
+ $space-sm: var(--space-sm);
35
+ $space-md: var(--space-md);
36
+ $space-lg: var(--space-lg);
37
+ $space-xl: var(--space-xl);
38
+ $space-2xl: var(--space-2xl);
39
+
40
+ $radius-xs: var(--radius-xs);
41
+ $radius-sm: var(--radius-sm);
42
+ $radius-md: var(--radius-md);
43
+ $radius-lg: var(--radius-lg);
44
+ $radius-xl: var(--radius-xl);
45
+ $radius-full: var(--radius-full);
46
+
47
+ $font-xs: var(--font-xs);
48
+ $font-sm: var(--font-sm);
49
+ $font-base: var(--font-base);
50
+ $font-md: var(--font-md);
51
+ $font-lg: var(--font-lg);
52
+ $font-xl: var(--font-xl);
53
+ $font-2xl: var(--font-2xl);
54
+
55
+ $font-weight-normal: var(--font-weight-normal);
56
+ $font-weight-medium: var(--font-weight-medium);
57
+ $font-weight-semibold: var(--font-weight-semibold);
58
+ $font-weight-bold: var(--font-weight-bold);
59
+ $font-weight-extrabold: var(--font-weight-extrabold);
60
+
61
+ $font-family-base: var(--font-family-base);
62
+ $font-family-mono: var(--font-family-mono);
63
+
64
+ $color-primary: var(--md3-primary);
65
+ $color-primary-container: var(--md3-primary-container);
66
+ $color-secondary: var(--md3-secondary);
67
+ $color-tertiary: var(--md3-tertiary);
68
+ $color-surface: var(--md3-surface);
69
+ $color-surface-variant: var(--md3-surface-variant);
70
+ $color-surface-container: var(--md3-surface-container);
71
+ $color-outline: var(--md3-outline);
72
+ $color-outline-variant: var(--md3-outline-variant);
73
+ $color-error: var(--md3-error);
74
+ $color-inverse-surface: var(--md3-inverse-surface);
75
+ $color-inverse-on-surface: var(--md3-inverse-on-surface);
76
+ $color-scrim: var(--md3-scrim);
77
+
78
+ // Common color variables (compat layer for reducing --c2-* usage)
79
+ $on-surface: var(--on-surface, currentColor);
80
+ $text-secondary: var(--text-secondary, color-mix(in oklch, var(--on-surface, currentColor) 74%, transparent));
81
+ $border-color: var(--border-color, color-mix(in oklch, var(--on-surface, currentColor) 18%, transparent));
82
+ $backdrop: var(--backdrop, oklch(from black l c h / 0.22));
83
+
84
+ // Scrollbar
85
+ $scrollbar-opacity: var(--scrollbar-opacity, 0.56);
86
+ $scrollbar-tint: var(--scrollbar-tint, 86%);
87
+
88
+ // Stacking (use with lib/basic/_position.scss — overlays, modals)
89
+ $z-modal-backdrop: var(--z-modal-backdrop);
90
+ $z-modal: var(--z-modal);
91
+
92
+ // use native custom CSS function syntax
93
+ @#{"function --u2-color-mod(--base-color <color>, --index <number> : 550) returns <color>"} {
94
+ /* Ограничиваем индекс */
95
+ --i: clamp(0, var(--index), 1000);
96
+
97
+ /* Переданный цвет считается оттенком 550 */
98
+ --pivot: 550;
99
+
100
+ /* Расстояние от базового цвета к белой и чёрной границам */
101
+ --white-distance:
102
+ clamp(
103
+ 0,
104
+ calc((var(--pivot) - var(--i)) / var(--pivot)),
105
+ 1
106
+ );
107
+
108
+ --black-distance:
109
+ clamp(
110
+ 0,
111
+ calc(
112
+ (var(--i) - var(--pivot)) /
113
+ (1000 - var(--pivot))
114
+ ),
115
+ 1
116
+ );
117
+
118
+ /*
119
+ * Нелинейное изменение светлоты:
120
+ * близкие к 550 оттенки меньше отличаются от базового.
121
+ */
122
+ --to-white: pow(var(--white-distance), 1.15);
123
+ --to-black: pow(var(--black-distance), 1.08);
124
+
125
+ /*
126
+ * Цветность максимальна около 550
127
+ * и плавно снижается к обоим краям.
128
+ */
129
+ --center-left:
130
+ clamp(0, calc(var(--i) / var(--pivot)), 1);
131
+
132
+ --center-right:
133
+ clamp(
134
+ 0,
135
+ calc(
136
+ (1000 - var(--i)) /
137
+ (1000 - var(--pivot))
138
+ ),
139
+ 1
140
+ );
141
+
142
+ --chroma-shape:
143
+ sqrt(min(var(--center-left), var(--center-right)));
144
+
145
+ /*
146
+ * На краях остаётся 8% исходной цветности:
147
+ * получается почти белый/чёрный, но с оттенком base-color.
148
+ */
149
+ --chroma-scale:
150
+ calc(0.08 + 0.92 * var(--chroma-shape));
151
+
152
+ result:
153
+ oklch(
154
+ from var(--base-color)
155
+
156
+ /* 98.5% около белого, 16% около чёрного */
157
+ calc(
158
+ l
159
+ + (0.985 - l) * var(--to-white)
160
+ + (0.16 - l) * var(--to-black)
161
+ )
162
+
163
+ calc(c * var(--chroma-scale))
164
+
165
+ h
166
+ );
167
+ }
168
+
169
+
170
+
171
+ /* ==========================================================================
172
+ Meta / Declarations
173
+ ========================================================================== */
174
+ $line-height-base: config.md-config("layout", "line-height");
175
+ $heading-padding-inline: config.md-config("heading", "padding");
176
+ $heading-padding-inline-small: config.md-config("heading", "padding-small");
177
+ $blockquote-margin-inline: config.md-config("blockquote", "margin-inline");
178
+ $blockquote-padding-inline: config.md-config("blockquote", "padding-inline");
179
+ $table-padding: config.md-config("table", "cell-padding");
180
+ $img-max-width: config.md-config("media", "img-max-width");
181
+ $md-roots: ":host, .markdown-body, #markdown, md-view, #raw-md, .markdown-viewer, .print-view, .markdown-viewer-container .viewer-content .markdown-viewer-content, .cw-view-viewer__prose, :host, .markdown-body, #markdown, md-view, #raw-md, .markdown-viewer, .print-view, .markdown-viewer-container .viewer-content .markdown-viewer-content, .cw-view-viewer__prose";
182
+ $selectors: $md-roots;
183
+
184
+
185
+ /* ==========================================================================
186
+ Tokens / Mixins (global, not layered)
187
+ ========================================================================== */
188
+
189
+ @mixin markdown-root-props(
190
+ $selector: ":where(#{$selectors}):not([hidden])"
191
+ ) {
192
+ #{$selector} {
193
+ /* Base sizes */
194
+ --base-size-4: 0.25em;
195
+ --base-size-8: 0.5em;
196
+ --base-size-16: 1em;
197
+ --base-size-24: 1.5em;
198
+ --base-size-40: 2.5em;
199
+
200
+ /* Typography */
201
+ --base-text-weight-normal: 400;
202
+ --base-text-weight-medium: 500;
203
+ --base-text-weight-semibold: 600;
204
+ --fontStack-monospace: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;
205
+
206
+ /*
207
+ * Color system — seeds + --u2-color-mod (pivot 550).
208
+ * Neutrals from --base-color ← --color-primary; semantics keep own seeds.
209
+ */
210
+ --color-primary: light-dark(#2e3a64, #91b6e3);
211
+ --base-color: var(--color-primary);
212
+ --base-color-neutralized: color-mix(in oklab, var(--base-color) 60%, gray);
213
+ --color-secondary: light-dark(
214
+ --u2-color-mod(var(--base-color), 420),
215
+ --u2-color-mod(var(--base-color), 680)
216
+ );
217
+ --color-accent: light-dark(
218
+ --u2-color-mod(var(--base-color), 400),
219
+ --u2-color-mod(var(--base-color), 700)
220
+ );
221
+ --color-success: light-dark(#10b981, --u2-color-mod(#10b981, 480));
222
+ --color-warning: light-dark(#f59e0b, --u2-color-mod(#f59e0b, 480));
223
+ --color-error: light-dark(#ef4444, --u2-color-mod(#ef4444, 480));
224
+ --color-info: light-dark(#60a5fa, --u2-color-mod(#60a5fa, 480));
225
+
226
+ /* Surface colors */
227
+ --color-surface: light-dark(
228
+ --u2-color-mod(var(--base-color-neutralized), 10),
229
+ --u2-color-mod(var(--base-color-neutralized), 980)
230
+ );
231
+
232
+ --color-surface-container-lowest: light-dark(
233
+ --u2-color-mod(var(--base-color-neutralized), 30),
234
+ --u2-color-mod(var(--base-color-neutralized), 980)
235
+ );
236
+ --color-surface-container-low: light-dark(
237
+ --u2-color-mod(var(--base-color-neutralized), 20),
238
+ --u2-color-mod(var(--base-color-neutralized), 970)
239
+ );
240
+ --color-surface-container: light-dark(
241
+ --u2-color-mod(var(--base-color-neutralized), 10),
242
+ --u2-color-mod(var(--base-color-neutralized), 960)
243
+ );
244
+ --color-surface-container-high: light-dark(
245
+ --u2-color-mod(var(--base-color-neutralized), 5),
246
+ --u2-color-mod(var(--base-color-neutralized), 950)
247
+ );
248
+ --color-surface-container-highest: light-dark(
249
+ --u2-color-mod(var(--base-color-neutralized), 2),
250
+ --u2-color-mod(var(--base-color-neutralized), 940)
251
+ );
252
+
253
+ /* Text colors */
254
+ --color-on-surface: light-dark(
255
+ --u2-color-mod(var(--base-color-neutralized), 900),
256
+ --u2-color-mod(var(--base-color-neutralized), 100)
257
+ );
258
+ --color-on-surface-variant: light-dark(
259
+ --u2-color-mod(var(--base-color-neutralized), 700),
260
+ --u2-color-mod(var(--base-color-neutralized), 280)
261
+ );
262
+ --color-on-primary: light-dark(
263
+ --u2-color-mod(var(--base-color-neutralized), 40),
264
+ --u2-color-mod(var(--base-color-neutralized), 40)
265
+ );
266
+ --color-on-secondary: light-dark(
267
+ --u2-color-mod(var(--base-color-neutralized), 40),
268
+ --u2-color-mod(var(--base-color-neutralized), 920)
269
+ );
270
+
271
+ /* Border and outline */
272
+ --color-outline: light-dark(
273
+ --u2-color-mod(var(--base-color-neutralized), 100),
274
+ --u2-color-mod(var(--base-color-neutralized), 900)
275
+ );
276
+ --color-outline-variant: light-dark(
277
+ --u2-color-mod(var(--base-color-neutralized), 100),
278
+ --u2-color-mod(var(--base-color-neutralized), 900)
279
+ );
280
+
281
+ /* Interactive states */
282
+ --hover: light-dark(
283
+ --u2-color-mod(var(--base-color-neutralized), 160),
284
+ --u2-color-mod(var(--base-color-neutralized), 780)
285
+ );
286
+ --active: light-dark(
287
+ --u2-color-mod(var(--base-color-neutralized), 220),
288
+ --u2-color-mod(var(--base-color-neutralized), 840)
289
+ );
290
+ --focus: light-dark(
291
+ --u2-color-mod(var(--base-color-neutralized), 200),
292
+ --u2-color-mod(var(--base-color-neutralized), 620)
293
+ );
294
+
295
+ /* Elevation */
296
+ --elev-0: 0 0 0 0 rgba(0, 0, 0, 0%);
297
+ --elev-1: 0 1px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12);
298
+ --elev-2: 0 2px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 6px 0 rgba(0, 0, 0, 0.11);
299
+ --elev-3: 0 4px 6px 0 rgba(0, 0, 0, 0.14), 0 6px 12px 0 rgba(0, 0, 0, 0.11);
300
+ --elev-4: 0 6px 8px 0 rgba(0, 0, 0, 0.14), 0 9px 18px 0 rgba(0, 0, 0, 0.11);
301
+
302
+ /* Motion and transitions */
303
+ --motion-fast: 140ms ease;
304
+ --motion-normal: 200ms ease;
305
+ --motion-slow: 300ms ease;
306
+
307
+ /* Spacing */
308
+ --space-xs: 0.25rem;
309
+ --space-sm: 0.5rem;
310
+ --space-md: 0.75rem;
311
+ --space-lg: 1rem;
312
+ --space-xl: 1.5rem;
313
+ --space-2xl: 2rem;
314
+
315
+ /* Radius */
316
+ --radius-xs: 0.25rem;
317
+ --radius-sm: 0.375rem;
318
+ --radius-md: 0.5rem;
319
+ --radius-lg: 0.75rem;
320
+ --radius-xl: 1rem;
321
+ --radius-full: 9999px;
322
+
323
+ /* Legacy color mappings for markdown compatibility */
324
+ --focus-outlineColor: var(--color-primary);
325
+ --fgColor-default: var(--color-on-surface);
326
+ --fgColor-muted: var(--color-on-surface-variant);
327
+ --fgColor-accent: var(--color-accent);
328
+ --fgColor-success: var(--color-success);
329
+ --fgColor-attention: var(--color-warning);
330
+ --fgColor-danger: var(--color-error);
331
+ --fgColor-done: var(--color-info);
332
+ --bgColor-default: var(--color-surface);
333
+ --bgColor-muted: var(--color-surface-container);
334
+ --bgColor-neutral-muted: var(--color-surface-container-high);
335
+ --bgColor-attention-muted: var(--color-warning);
336
+ --borderColor-default: var(--color-outline);
337
+ --borderColor-muted: var(--color-outline-variant);
338
+ --borderColor-neutral-muted: var(--color-outline);
339
+ --borderColor-accent-emphasis: var(--color-primary);
340
+ --borderColor-success-emphasis: var(--color-success);
341
+ --borderColor-attention-emphasis: var(--color-warning);
342
+ --borderColor-danger-emphasis: var(--color-error);
343
+ --borderColor-done-emphasis: var(--color-info);
344
+
345
+ /* Markdown tokens (overrides) */
346
+ --active-brightness: #{config("effects", "active-brightness")};
347
+ --border-radius: #{config("shape", "border-radius")};
348
+ --box-shadow: #{config("shape", "box-shadow")};
349
+ --color-accent: #{light-dark("accent")};
350
+ --color-bg: #{light-dark("bg")};
351
+ --color-bg-secondary: #{light-dark("bg-secondary")};
352
+ --color-link: #{light-dark("link")};
353
+ --color-secondary: #{light-dark("secondary")};
354
+ --color-secondary-accent: #{light-dark("secondary-accent")};
355
+ --color-shadow: #{light-dark("shadow")};
356
+ --color-table: #{light-dark("table")};
357
+ --color-text: #{light-dark("text")};
358
+ --color-text-secondary: #{light-dark("text-secondary")};
359
+ --color-scrollbar: #{light-dark("scrollbar")};
360
+ --font-family-emoji-flag-capable: #{config("typography", "font-family", "emoji")};
361
+ --font-family: #{config("typography", "font-family", "sans")};
362
+ --hover-brightness: #{config("effects", "hover-brightness")};
363
+ --justify-important: #{config("layout", "justify-important")};
364
+ --justify-normal: #{config("layout", "justify-normal")};
365
+ --line-height: #{config("layout", "line-height")};
366
+ --width-card: #{config("layout", "widths", "card")};
367
+ --width-card-medium: #{config("layout", "widths", "card-medium")};
368
+ --width-card-wide: #{config("layout", "widths", "card-wide")};
369
+ --width-content: #{config("layout", "widths", "content")};
370
+ --md-scrollbar-size: #{config("scrollbar", "size")};
371
+ }
372
+ }
373
+
374
+ @mixin markdown-root-props-md(
375
+ $selector: ":where(#{$selectors}):not([hidden])"
376
+ ) {
377
+ #{$selector} {
378
+ /* Base sizes */
379
+ --base-size-4: 0.25em;
380
+ --base-size-8: 0.5em;
381
+ --base-size-16: 1em;
382
+ --base-size-24: 1.5em;
383
+ --base-size-40: 2.5em;
384
+
385
+ /* Typography */
386
+ --base-text-weight-normal: 400;
387
+ --base-text-weight-medium: 500;
388
+ --base-text-weight-semibold: 600;
389
+ --fontStack-monospace: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;
390
+
391
+ /* Legacy GitHub-like colors */
392
+ --focus-outlineColor: light-dark(#0969da, #1f6feb);
393
+ --fgColor-default: light-dark(#1f2328, #f0f6fc);
394
+ --fgColor-muted: light-dark(#59636e, #9198a1);
395
+ --fgColor-accent: light-dark(#0969da, #4493f8);
396
+ --fgColor-success: light-dark(#1a7f37, #3fb950);
397
+ --fgColor-attention: light-dark(#9a6700, #d29922);
398
+ --fgColor-danger: light-dark(#d1242f, #f85149);
399
+ --fgColor-done: light-dark(#8250df, #ab7df8);
400
+ --bgColor-default: light-dark(#ffffff, #0d1117);
401
+ --bgColor-muted: light-dark(#f6f8fa, #151b23);
402
+ --bgColor-neutral-muted: light-dark(#818b981f, #656c7633);
403
+ --bgColor-attention-muted: light-dark(#fff8c5, #bb800926);
404
+ --borderColor-default: light-dark(#d1d9e0, #3d444d);
405
+ --borderColor-muted: light-dark(#d1d9e0b3, #3d444db3);
406
+ --borderColor-neutral-muted: light-dark(#d1d9e0b3, #3d444db3);
407
+ --borderColor-accent-emphasis: light-dark(#0969da, #1f6feb);
408
+ --borderColor-success-emphasis: light-dark(#1a7f37, #238636);
409
+ --borderColor-attention-emphasis: light-dark(#9a6700, #9e6a03);
410
+ --borderColor-danger-emphasis: light-dark(#cf222e, #da3633);
411
+ --borderColor-done-emphasis: light-dark(#8250df, #8957e5);
412
+
413
+ /* Prettylights */
414
+ --color-prettylights-syntax-comment: light-dark(#59636e, #9198a1);
415
+ --color-prettylights-syntax-constant: light-dark(#0550ae, #79c0ff);
416
+ --color-prettylights-syntax-constant-other-reference-link: light-dark(#0a3069, #a5d6ff);
417
+ --color-prettylights-syntax-entity: light-dark(#6639ba, #d2a8ff);
418
+ --color-prettylights-syntax-storage-modifier-import: light-dark(#1f2328, #f0f6fc);
419
+ --color-prettylights-syntax-entity-tag: light-dark(#0550ae, #7ee787);
420
+ --color-prettylights-syntax-keyword: light-dark(#cf222e, #ff7b72);
421
+ --color-prettylights-syntax-string: light-dark(#0a3069, #a5d6ff);
422
+ --color-prettylights-syntax-variable: light-dark(#953800, #ffa657);
423
+ --color-prettylights-syntax-brackethighlighter-unmatched: light-dark(#82071e, #f85149);
424
+ --color-prettylights-syntax-brackethighlighter-angle: light-dark(#59636e, #9198a1);
425
+ --color-prettylights-syntax-invalid-illegal-text: light-dark(#f6f8fa, #f0f6fc);
426
+ --color-prettylights-syntax-invalid-illegal-bg: light-dark(#82071e, #8e1519);
427
+ --color-prettylights-syntax-carriage-return-text: light-dark(#f6f8fa, #f0f6fc);
428
+ --color-prettylights-syntax-carriage-return-bg: light-dark(#cf222e, #b62324);
429
+ --color-prettylights-syntax-string-regexp: light-dark(#116329, #7ee787);
430
+ --color-prettylights-syntax-markup-list: light-dark(#3b2300, #f2cc60);
431
+ --color-prettylights-syntax-markup-heading: light-dark(#0550ae, #1f6feb);
432
+ --color-prettylights-syntax-markup-italic: light-dark(#1f2328, #f0f6fc);
433
+ --color-prettylights-syntax-markup-bold: light-dark(#1f2328, #f0f6fc);
434
+ --color-prettylights-syntax-markup-deleted-text: light-dark(#82071e, #ffdcd7);
435
+ --color-prettylights-syntax-markup-deleted-bg: light-dark(#ffebe9, #67060c);
436
+ --color-prettylights-syntax-markup-inserted-text: light-dark(#116329, #aff5b4);
437
+ --color-prettylights-syntax-markup-inserted-bg: light-dark(#dafbe1, #033a16);
438
+ --color-prettylights-syntax-markup-changed-text: light-dark(#953800, #ffdfb6);
439
+ --color-prettylights-syntax-markup-changed-bg: light-dark(#ffd8b5, #5a1e02);
440
+ --color-prettylights-syntax-markup-ignored-text: light-dark(#d1d9e0, #f0f6fc);
441
+ --color-prettylights-syntax-markup-ignored-bg: light-dark(#0550ae, #1158c7);
442
+ --color-prettylights-syntax-meta-diff-range: light-dark(#8250df, #d2a8ff);
443
+ --color-prettylights-syntax-sublimelinter-gutter-mark: light-dark(#818b98, #3d444d);
444
+
445
+ /* Markdown tokens */
446
+ --active-brightness: #{config.md-config("effects", "active-brightness")};
447
+ --border-radius: #{config.md-config("shape", "border-radius")};
448
+ --box-shadow: #{config.md-config("shape", "box-shadow")};
449
+ --color-accent: #{config.md-light-dark("accent")};
450
+ --color-bg: #{config.md-light-dark("bg")};
451
+ --color-bg-secondary: #{config.md-light-dark("bg-secondary")};
452
+ --color-link: #{config.md-light-dark("link")};
453
+ --color-secondary: #{config.md-light-dark("secondary")};
454
+ --color-secondary-accent: #{config.md-light-dark("secondary-accent")};
455
+ --color-shadow: #{config.md-light-dark("shadow")};
456
+ --color-table: #{config.md-light-dark("table")};
457
+ --color-text: #{config.md-light-dark("text")};
458
+ --color-text-secondary: #{config.md-light-dark("text-secondary")};
459
+ --color-scrollbar: #{config.md-light-dark("scrollbar")};
460
+ --font-family-emoji-flag-capable: #{config.md-config("font", "emoji")};
461
+ --font-family: #{config.md-config("font", "body")};
462
+ --hover-brightness: #{config.md-config("effects", "hover-brightness")};
463
+ --justify-important: #{config.md-config("layout", "justify-important")};
464
+ --justify-normal: #{config.md-config("layout", "justify-normal")};
465
+ --line-height: #{config.md-config("layout", "line-height")};
466
+ --width-card: #{config.md-config("layout", "widths", "card")};
467
+ --width-card-medium: #{config.md-config("layout", "widths", "card-medium")};
468
+ --width-card-wide: #{config.md-config("layout", "widths", "card-wide")};
469
+ --width-content: #{config.md-config("layout", "widths", "content")};
470
+ --md-scrollbar-size: #{config.md-config("scrollbar", "size")};
471
+ }
472
+ }
473
+
474
+ /*
475
+ * WHY: Pinned themes use *concrete* mod indices — not `light-dark()`.
476
+ * `light-dark()` + mixed color-scheme (OS vs app, shadow hosts, typed @property) caused
477
+ * Light QS tile with dark surfaces / cream panels with light-on-light labels.
478
+ * Index scale: 0 white ← 550 seed → 1000 black. Seeds stay writable by WallpaperTheme.
479
+ */
480
+ @mixin -theme-seed-bridge {
481
+ --base-color: var(--color-primary);
482
+ --base-color-neutralized: color-mix(in oklab, var(--base-color) 60%, gray);
483
+ --wf-md-primary: var(--color-primary);
484
+ --wf-md-seed: var(--base-color);
485
+ }
486
+
487
+ @mixin -theme-aliases {
488
+ --color-bg: var(--color-background);
489
+ --color-text: var(--color-on-background);
490
+ --color-fg: var(--color-on-surface);
491
+ --on-surface-color: var(--color-on-surface);
492
+ --on-surface-variant: var(--color-on-surface-variant);
493
+ --wf-md-surface: var(--color-surface);
494
+ --wf-md-on-surface: var(--color-on-surface);
495
+ --wf-md-on-surface-variant: var(--color-on-surface-variant);
496
+ --wf-md-surf-container: var(--color-surface-container);
497
+ --wf-md-surf-container-low: var(--color-surface-container-low);
498
+ --wf-md-surf-container-high: var(--color-surface-container-high);
499
+ --wf-md-outline-variant: var(--color-outline-variant);
500
+ }
501
+
502
+ /** Light surfaces — always light chrome; hue from --base-color / wallpaper. */
503
+ @mixin -theme-light {
504
+ @include -theme-seed-bridge;
505
+ --color-on-primary: --u2-color-mod(var(--base-color), 40);
506
+ --color-secondary: --u2-color-mod(var(--base-color), 420);
507
+ --color-on-secondary: --u2-color-mod(var(--base-color), 40);
508
+ --color-tertiary: --u2-color-mod(var(--base-color), 400);
509
+ --color-on-tertiary: --u2-color-mod(var(--base-color), 40);
510
+ --color-error: #ef4444;
511
+ --color-on-error: --u2-color-mod(var(--color-error), 40);
512
+ --color-success: #4caf50;
513
+ --color-warning: #ff9800;
514
+ --color-info: #2196f3;
515
+ --color-background: --u2-color-mod(var(--base-color), 60);
516
+ --color-on-background: --u2-color-mod(var(--base-color), 900);
517
+ --color-surface: --u2-color-mod(var(--base-color), 60);
518
+ --color-on-surface: --u2-color-mod(var(--base-color), 900);
519
+ --color-surface-variant: --u2-color-mod(var(--base-color), 160);
520
+ --color-on-surface-variant: --u2-color-mod(var(--base-color), 700);
521
+ --color-outline: --u2-color-mod(var(--base-color), 300);
522
+ --color-outline-variant: --u2-color-mod(var(--base-color), 400);
523
+ --color-surface-container-lowest: --u2-color-mod(var(--base-color), 2);
524
+ --color-surface-container-low: --u2-color-mod(var(--base-color), 10);
525
+ --color-surface-container: --u2-color-mod(var(--base-color), 20);
526
+ --color-surface-container-high: --u2-color-mod(var(--base-color), 30);
527
+ --color-surface-container-highest: --u2-color-mod(var(--base-color), 40);
528
+ --color-border: color-mix(in oklab, var(--color-outline-variant) 75%, transparent);
529
+ @include -theme-aliases;
530
+ }
531
+
532
+ /** Dark surfaces — always dark chrome; hue from --base-color / wallpaper. */
533
+ @mixin -theme-dark {
534
+ @include -theme-seed-bridge;
535
+ --color-on-primary: --u2-color-mod(var(--base-color), 920);
536
+ --color-secondary: --u2-color-mod(var(--base-color), 680);
537
+ --color-on-secondary: --u2-color-mod(var(--base-color), 920);
538
+ --color-tertiary: --u2-color-mod(var(--base-color), 700);
539
+ --color-on-tertiary: --u2-color-mod(var(--base-color), 920);
540
+ --color-error: #f87171;
541
+ --color-on-error: --u2-color-mod(var(--color-error), 920);
542
+ --color-success: #66bb6a;
543
+ --color-warning: #ffa726;
544
+ --color-info: #42a5f5;
545
+ --color-background: --u2-color-mod(var(--base-color), 940);
546
+ --color-on-background: --u2-color-mod(var(--base-color), 100);
547
+ --color-surface: --u2-color-mod(var(--base-color), 940);
548
+ --color-on-surface: --u2-color-mod(var(--base-color), 100);
549
+ --color-surface-variant: --u2-color-mod(var(--base-color), 840);
550
+ --color-on-surface-variant: --u2-color-mod(var(--base-color), 280);
551
+ --color-outline: --u2-color-mod(var(--base-color), 720);
552
+ --color-outline-variant: --u2-color-mod(var(--base-color), 640);
553
+ --color-surface-container-lowest: --u2-color-mod(var(--base-color), 920);
554
+ --color-surface-container-low: --u2-color-mod(var(--base-color), 940);
555
+ --color-surface-container: --u2-color-mod(var(--base-color), 960);
556
+ --color-surface-container-high: --u2-color-mod(var(--base-color), 980);
557
+ --color-surface-container-highest: --u2-color-mod(var(--base-color), 1000);
558
+ --color-border: color-mix(in oklab, var(--color-outline-variant) 70%, transparent);
559
+ @include -theme-aliases;
560
+ }
561
+
562
+ @layer tokens, base, layout, utilities, shells, shell, views, view, viewer, components, ux-layer, markdown, essentials, print, print-breaks, overrides;
563
+
564
+ @layer tokens {
565
+ :root,
566
+ :host,
567
+ :scope {
568
+ /* Box seed; WallpaperTheme may override --color-primary on :root. */
569
+ --color-primary: #5a7fff;
570
+ color-scheme: light dark;
571
+ /* Default = light concrete; OS-dark media + data-theme pins override below. */
572
+ @include -theme-light;
573
+
574
+ --space-xs: 0.25rem;
575
+ --space-sm: 0.5rem;
576
+ --space-md: 0.75rem;
577
+ --space-lg: 1rem;
578
+ --space-xl: 1.25rem;
579
+ --space-2xl: 1.5rem;
580
+
581
+ --padding-xs: var(--space-xs);
582
+ --padding-sm: var(--space-sm);
583
+ --padding-md: var(--space-md);
584
+ --padding-lg: var(--space-lg);
585
+ --padding-xl: var(--space-xl);
586
+ --padding-2xl: var(--space-2xl);
587
+ --padding-3xl: 2rem;
588
+ --padding-4xl: 2.5rem;
589
+ --padding-5xl: 3rem;
590
+ --padding-6xl: 4rem;
591
+ --padding-7xl: 5rem;
592
+ --padding-8xl: 6rem;
593
+ --padding-9xl: 8rem;
594
+
595
+ --gap-xs: var(--space-xs);
596
+ --gap-sm: var(--space-sm);
597
+ --gap-md: var(--space-md);
598
+ --gap-lg: var(--space-lg);
599
+ --gap-xl: var(--space-xl);
600
+ --gap-2xl: var(--space-2xl);
601
+
602
+ --radius-none: 0;
603
+ --radius-sm: 0.25rem;
604
+ --radius-default: 0.25rem;
605
+ --radius-md: 0.375rem;
606
+ --radius-lg: 0.5rem;
607
+ --radius-xl: 0.75rem;
608
+ --radius-2xl: 1rem;
609
+ --radius-3xl: 1.5rem;
610
+ --radius-full: 9999px;
611
+
612
+ --elev-0: none;
613
+ --elev-1: 0 1px 1px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.1);
614
+ --elev-2: 0 2px 6px rgba(0, 0, 0, 0.12), 0 8px 24px rgba(0, 0, 0, 0.08);
615
+ --elev-3: 0 6px 16px rgba(0, 0, 0, 0.14), 0 18px 48px rgba(0, 0, 0, 0.1);
616
+
617
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);
618
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
619
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
620
+ --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
621
+ --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1);
622
+ --shadow-2xl: 0 25px 50px rgba(0, 0, 0, 0.1);
623
+ --shadow-inset: inset 0 2px 4px rgba(0, 0, 0, 0.06);
624
+ --shadow-inset-strong: inset 0 4px 8px rgba(0, 0, 0, 0.12);
625
+ --shadow-none: 0 0 #0000;
626
+
627
+ --text-xs: 0.8rem;
628
+ --text-sm: 0.9rem;
629
+ --text-base: 1rem;
630
+ --text-lg: 1.1rem;
631
+ --text-xl: 1.25rem;
632
+ --text-2xl: 1.6rem;
633
+ --text-3xl: 2rem;
634
+
635
+ --font-size-xs: 0.75rem;
636
+ --font-size-sm: 0.875rem;
637
+ --font-size-base: 1rem;
638
+ --font-size-lg: 1.125rem;
639
+ --font-size-xl: 1.25rem;
640
+
641
+ --font-weight-normal: 400;
642
+ --font-weight-medium: 500;
643
+ --font-weight-semibold: 600;
644
+ --font-weight-bold: 700;
645
+
646
+ --font-family: "Roboto", ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif;
647
+ --font-family-mono: "Roboto Mono", "SF Mono", Monaco, Inconsolata, "Fira Code", monospace;
648
+ --font-sans: var(--font-family);
649
+ --font-mono: var(--font-family-mono);
650
+
651
+ --leading-tight: 1.2;
652
+ --leading-normal: 1.5;
653
+ --leading-relaxed: 1.8;
654
+
655
+ --transition-fast: 120ms cubic-bezier(0.2, 0, 0, 1);
656
+ --transition-normal: 160ms cubic-bezier(0.2, 0, 0, 1);
657
+ --transition-slow: 200ms cubic-bezier(0.2, 0, 0, 1);
658
+
659
+ --motion-fast: var(--transition-fast);
660
+ --motion-normal: var(--transition-normal);
661
+ --motion-slow: var(--transition-slow);
662
+
663
+ --focus-ring: 0 0 0 3px color-mix(in oklab, var(--color-primary) 35%, transparent);
664
+
665
+ --z-base: 0;
666
+ --z-dropdown: 100;
667
+ --z-sticky: 200;
668
+ --z-fixed: 300;
669
+ --z-modal-backdrop: 400;
670
+ --z-modal: 500;
671
+ --z-popover: 600;
672
+ --z-tooltip: 700;
673
+ --z-toast: 800;
674
+ --z-max: 9999;
675
+
676
+ --view-bg: var(--color-surface);
677
+ --view-fg: var(--color-on-surface);
678
+ --view-border: var(--color-outline-variant);
679
+ --view-input-bg: light-dark(
680
+ --u2-color-mod(var(--base-color, var(--color-primary)), 40),
681
+ var(--color-surface-container-high)
682
+ );
683
+ --view-files-bg: var(--color-surface-container-low);
684
+ --view-file-bg: var(--color-surface-container-lowest, var(--color-surface-container-low));
685
+ --view-results-bg: var(--color-surface-container-low);
686
+ --view-result-bg: var(--color-surface-container-lowest, var(--color-surface-container-low));
687
+
688
+ --color-surface-elevated: var(--color-surface-container);
689
+ --color-surface-hover: var(--color-surface-container-low);
690
+ --color-surface-active: var(--color-surface-container-high);
691
+ --color-on-surface-muted: var(--color-on-surface-variant);
692
+
693
+ --color-background-alt: var(--color-surface-variant);
694
+
695
+ --color-primary-hover: light-dark(
696
+ --u2-color-mod(var(--base-color, var(--color-primary)), 620),
697
+ --u2-color-mod(var(--base-color, var(--color-primary)), 480)
698
+ );
699
+ --color-primary-active: light-dark(
700
+ --u2-color-mod(var(--base-color, var(--color-primary)), 700),
701
+ --u2-color-mod(var(--base-color, var(--color-primary)), 400)
702
+ );
703
+ --color-accent: var(--color-secondary);
704
+ --color-accent-hover: light-dark(
705
+ --u2-color-mod(var(--base-color, var(--color-primary)), 500),
706
+ --u2-color-mod(var(--base-color, var(--color-primary)), 600)
707
+ );
708
+ --color-on-accent: var(--color-on-secondary);
709
+
710
+ --color-border-hover: var(--color-outline-variant);
711
+ --color-border-strong: var(--color-outline);
712
+ --color-border-focus: var(--color-primary);
713
+
714
+ --color-text: var(--color-on-surface);
715
+ --color-text-secondary: var(--color-on-surface-variant);
716
+ --color-text-muted: color-mix(in oklab, var(--color-on-surface) 50%, var(--color-surface));
717
+ --color-text-disabled: color-mix(in oklab, var(--color-on-surface) 38%, var(--color-surface));
718
+ --color-text-inverse: var(--color-on-primary);
719
+
720
+ --color-link: var(--color-primary);
721
+ --color-link-hover: var(--color-primary-hover);
722
+
723
+ --color-success-light: --u2-color-mod(var(--color-success), 280);
724
+ --color-success-dark: --u2-color-mod(var(--color-success), 720);
725
+ --color-warning-light: --u2-color-mod(var(--color-warning), 280);
726
+ --color-warning-dark: --u2-color-mod(var(--color-warning), 720);
727
+ --color-error-light: --u2-color-mod(var(--color-error), 280);
728
+ --color-error-dark: --u2-color-mod(var(--color-error), 720);
729
+ --color-info-light: --u2-color-mod(var(--color-info), 280);
730
+ --color-info-dark: --u2-color-mod(var(--color-info), 720);
731
+
732
+ --color-bg: var(--color-surface, var(--color-surface));
733
+ --color-bg-alt: var(--color-surface-variant, var(--color-surface-variant));
734
+ --color-fg: var(--color-on-surface, var(--color-on-surface));
735
+ --color-fg-muted: var(--color-on-surface-variant, var(--color-on-surface-variant));
736
+
737
+ --btn-height-sm: 2rem;
738
+ --btn-height-md: 2.5rem;
739
+ --btn-height-lg: 3rem;
740
+ --btn-padding-x-sm: var(--space-md);
741
+ --btn-padding-x-md: var(--space-lg);
742
+ --btn-padding-x-lg: 1.5rem;
743
+ --btn-radius: var(--radius-md);
744
+ --btn-font-weight: var(--font-weight-medium);
745
+
746
+ --input-height-sm: 2rem;
747
+ --input-height-md: 2.5rem;
748
+ --input-height-lg: 3rem;
749
+ --input-padding-x: var(--space-md);
750
+ --input-radius: var(--radius-md);
751
+ --input-border-color: var(--color-border, var(--color-border));
752
+ --input-focus-ring-color: var(--color-primary);
753
+ --input-focus-ring-width: 2px;
754
+
755
+ --card-padding: var(--space-lg);
756
+ --card-radius: var(--radius-lg);
757
+ --card-shadow: var(--shadow-sm);
758
+ --card-border-color: var(--color-border, var(--color-border));
759
+
760
+ --modal-backdrop-bg: light-dark(rgb(0 0 0 / 0.5), rgb(0 0 0 / 0.7));
761
+ --modal-bg: var(--color-surface, var(--color-surface));
762
+ --modal-radius: var(--radius-xl);
763
+ --modal-shadow: var(--shadow-xl);
764
+ --modal-padding: 1.5rem;
765
+
766
+ --toast-font-family: var(--font-family, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);
767
+ --toast-font-size: var(--font-size-base, 1rem);
768
+ --toast-font-weight: var(--font-weight-medium, 500);
769
+ --toast-letter-spacing: 0.01em;
770
+ --toast-line-height: 1.4;
771
+ --toast-white-space: nowrap;
772
+ --toast-pointer-events: auto;
773
+ --toast-user-select: none;
774
+ --toast-cursor: default;
775
+ --toast-opacity: 0;
776
+ --toast-transform: translateY(100%) scale(0.9);
777
+ --toast-transition: opacity 160ms ease-out, transform 160ms cubic-bezier(0.16, 1, 0.3, 1), background-color 100ms ease;
778
+ --toast-text: var(--color-on-surface, var(--color-on-surface, light-dark(#ffffff, #000000)));
779
+ --toast-bg: color-mix(in oklab, var(--color-surface-elevated, var(--color-surface-container-high, var(--color-surface, light-dark(#fafbfc, #1e293b)))) 90%, var(--color-on-surface, var(--color-on-surface, light-dark(#000000, #ffffff))));
780
+ --toast-radius: var(--radius-lg);
781
+ --toast-shadow: var(--shadow-lg);
782
+ --toast-padding: var(--space-lg);
783
+
784
+ --sidebar-width: 280px;
785
+ --sidebar-collapsed-width: 64px;
786
+ --nav-height: 56px;
787
+ --nav-height-compact: 48px;
788
+
789
+ --status-height: 24px;
790
+ --status-bg: var(--color-surface-elevated, var(--color-surface-container-high));
791
+ --status-font-size: var(--text-xs);
792
+
793
+ /* ── Shell chrome tokens (cross-shell registry) ─────────────────────────
794
+ * WHY: previously scattered across minimal/immersive/faint shells with
795
+ * duplicated `light-dark(var(--color-*), var(--color-*))` and offline hex
796
+ * fallbacks. Defined once here in terms of canonical `--color-*` so canonical
797
+ * is the single value source. Shells keep only theme/state overrides and
798
+ * documented offline/SSR hex fallbacks for when veela is not loaded.
799
+ */
800
+ --shell-bg: var(--color-surface);
801
+ --shell-fg: var(--color-on-surface);
802
+ --shell-nav-bg: var(--color-surface-container-high);
803
+ --shell-nav-fg: var(--color-on-surface);
804
+ --shell-nav-border: var(--color-outline-variant);
805
+ --shell-btn-hover: var(--color-surface-container);
806
+ --shell-btn-active-bg: color-mix(in oklab, var(--color-primary) 18%, var(--color-surface));
807
+ --shell-btn-active-fg: var(--color-on-surface);
808
+ --shell-status-bg: var(--color-surface-container-low);
809
+ --shell-status-fg: var(--color-on-surface);
810
+
811
+ /* ── Faint shell tokens (subsystem boot shells) ───────────────────────
812
+ * Derived from canonical `--color-*`; previously duplicated as
813
+ * `light-dark(var(--color-*), var(--color-*))` in `subsystem/boot/shells.scss`.
814
+ */
815
+ --faint-nav-bg: var(--color-surface-container-high);
816
+ --faint-nav-border: var(--color-outline-variant);
817
+ --faint-sidebar-bg: var(--color-surface-container-high);
818
+
819
+ /* ── Environment-shell tokens (color subset) ──────────────────────────
820
+ * `--env-status-fg` / `--env-launcher-fg*` are concrete defaults: the
821
+ * overlay status/launcher sit on wallpaper, so they carry their own
822
+ * luminance values (wallpaper probe may override on `:root`).
823
+ * Non-color `--env-*` (z-index, safe-area, insets) stay in environment-shell.
824
+ */
825
+ --env-status-fg: light-dark(#1c1c1e, #f5f5f7);
826
+ --env-status-fg-muted: color-mix(in oklab, var(--env-status-fg) 78%, transparent);
827
+ --env-launcher-fg: #f7f7f8;
828
+ --env-launcher-fg-shadow: rgb(0 0 0 / 0.88);
829
+ --env-launcher-fg-glow: rgb(0 0 0 / 0.45);
830
+
831
+ /* ── fl.ui `--error-color` alias ────────────────────────────────────
832
+ * Canonical alias so fl.ui/components can consume `var(--error-color)`
833
+ * without a standalone fallback definition.
834
+ */
835
+ --error-color: var(--color-error, #f87171);
836
+
837
+ /* ── Settings-view semantic tokens (`--sv-*`) ──────────────────────
838
+ * View-specific semantic layer DERIVED from canonical `--color-*` / `--base-color`.
839
+ * Source of truth for the default relationships lives here; settings-view keeps
840
+ * only theme-pinned overrides (`html[data-theme]`) and shadow-DOM self-sufficiency
841
+ * fallbacks at use sites (`var(--sv-*, light-dark(...))`).
842
+ */
843
+ --sv-bg: var(--color-surface-container-low, light-dark(#eef1f6, #0f1318));
844
+ --sv-fg: var(--color-on-surface, light-dark(#12151a, #e8edf2));
845
+ --sv-muted: var(--color-on-surface-variant, light-dark(#5c6570, #a8b0bc));
846
+ --sv-outline: var(--color-outline-variant, light-dark(#c5cdd8, #3d4755));
847
+ --sv-surface-1: var(--color-surface-container-low, light-dark(#ffffff, #171c24));
848
+ --sv-surface-2: var(--color-surface-container, light-dark(#f4f6fa, #1c232d));
849
+ --sv-primary: var(--base-color, var(--color-primary, #5a7fff));
850
+ --sv-danger: var(--color-error, #d32f2f);
851
+
852
+ /* ── History-view semantic tokens (`--vh-*`) ──────────────────────
853
+ * View-specific semantic layer DERIVED from canonical `--color-*`.
854
+ * Source of truth for the default relationships lives here; history-view keeps
855
+ * only the complex derived tokens (`--vh-item-border/preview-bg/elev`) and
856
+ * shadow-DOM self-sufficiency fallbacks at use sites.
857
+ */
858
+ --vh-bg: var(--color-surface, light-dark(#eef1f6, #0f1318));
859
+ --vh-fg: var(--color-on-surface, light-dark(#12151a, #e8edf2));
860
+ --vh-muted: var(--color-on-surface-variant, light-dark(#5c6570, #a8b0bc));
861
+ --vh-primary: var(--color-primary, #007acc);
862
+ --vh-danger: var(--color-error, #d32f2f);
863
+ --vh-on-primary: var(--color-on-primary, #ffffff);
864
+ --vh-item-bg: var(--color-surface-container-low, light-dark(#e0e5ee, #0a0d12));
865
+
866
+ /* ── Explorer / shared view color tokens (`--view-*`) ────────────
867
+ * View-specific semantic layer DERIVED from canonical `--color-*`.
868
+ * Source of truth for the default relationships lives here; explorer-view keeps
869
+ * only `--explorer-*` non-color (radius/pad/font) and shadow-DOM self-sufficiency
870
+ * fallbacks at use sites. Shared `--view-*` namespace also consumed by markdown-view.
871
+ */
872
+ --view-border: color-mix(in oklab, var(--color-outline-variant, #888) 45%, transparent);
873
+ --view-fg-muted: color-mix(in oklab, var(--color-on-surface, #ccc) 72%, transparent);
874
+ --view-hover-bg: color-mix(in oklab, var(--color-primary, #3794ff) 12%, transparent);
875
+ --view-selected-bg: color-mix(in oklab, var(--color-primary, #3794ff) 18%, transparent);
876
+ --view-selected-border: var(--color-primary, #3794ff);
877
+ }
878
+
879
+ /* Auto (no pin): follow OS preference with concrete tokens — not light-dark(). */
880
+ @media (prefers-color-scheme: dark) {
881
+ :root:not([data-theme="light"]):not([data-theme="dark"]),
882
+ :host:not([data-theme="light"]):not([data-theme="dark"]) {
883
+ color-scheme: dark;
884
+ @include -theme-dark;
885
+ }
886
+ }
887
+
888
+ /*
889
+ * Pinned app theme — highest authority. Concrete surfaces so shadow/UI never mix
890
+ * OS color-scheme with app light (Settings cream + white labels).
891
+ */
892
+ :root[data-theme="light"],
893
+ :host[data-theme="light"],
894
+ [data-theme="light"] {
895
+ color-scheme: light only;
896
+ @include -theme-light;
897
+ }
898
+
899
+ :root[data-theme="dark"],
900
+ :host[data-theme="dark"],
901
+ [data-theme="dark"] {
902
+ color-scheme: dark only;
903
+ @include -theme-dark;
904
+ }
905
+
906
+ :root[data-scheme="auto"]:not([data-theme="light"]):not([data-theme="dark"]),
907
+ :root[data-scheme="system"]:not([data-theme="light"]):not([data-theme="dark"]) {
908
+ color-scheme: light dark;
909
+ }
910
+
911
+ @media (prefers-reduced-motion: reduce) {
912
+ :root {
913
+ --transition-fast: 0ms;
914
+ --transition-normal: 0ms;
915
+ --transition-slow: 0ms;
916
+ --motion-fast: 0ms;
917
+ --motion-normal: 0ms;
918
+ --motion-slow: 0ms;
919
+ }
920
+ }
921
+
922
+ @media (prefers-contrast: high) {
923
+ :root {
924
+ --color-border: var(--color-border, var(--color-outline));
925
+ --color-border-hover: color-mix(in oklab, var(--color-border, var(--color-outline)) 80%, var(--color-on-surface, var(--color-on-surface)));
926
+ --color-text-secondary: var(--color-on-surface, var(--color-on-surface));
927
+ --color-text-muted: var(--color-on-surface-variant, var(--color-on-surface-variant));
928
+ }
929
+ }
930
+
931
+ @media print {
932
+ :root {
933
+ --view-padding: 0;
934
+ --view-content-max-width: 100%;
935
+ --view-bg: white;
936
+ --view-fg: black;
937
+ --view-heading-color: black;
938
+ --view-link-color: black;
939
+ }
940
+
941
+ :root:has([data-view="viewer"]) {
942
+ --view-code-bg: #f5f5f5;
943
+ --view-code-fg: black;
944
+ --view-blockquote-bg: #f5f5f5;
945
+ }
946
+ }
947
+ }