@mdxui/named 8.1.0 → 8.2.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/dist/styles.css CHANGED
@@ -141,49 +141,42 @@
141
141
  copy of named-agents app/globals.css :root (LIGHT / cream).
142
142
  ────────────────────────────────────────────────────────────────── */
143
143
  [data-dialect='named'] {
144
- /* ---- neo shared tokens, re-pointed to the cream baseline ----------- */
145
- /* surfaces */
146
- --background: oklch(0.945 0.01 95); /* baseline --color-surface */
147
- --foreground: oklch(0.18 0.008 80); /* baseline --color-fg */
148
- --card: oklch(0.975 0.005 95); /* baseline --color-surface-raised */
149
- --card-foreground: oklch(0.18 0.008 80);
150
- --popover: oklch(0.975 0.005 95);
151
- --popover-foreground: oklch(0.18 0.008 80);
152
- --muted: oklch(0.91 0.012 95); /* baseline --color-surface-sunken */
153
- --muted-foreground: oklch(0.46 0.012 80); /* baseline --color-fg-muted */
154
- /* primary CTA neutral ink gradient endpoints collapse to the dark end */
155
- --primary: oklch(0.06 0 0); /* baseline --color-btn-primary-to */
156
- --primary-foreground: oklch(0.995 0.005 80); /* --color-btn-primary-fg */
157
- --secondary: oklch(0.975 0.005 95);
158
- --secondary-foreground: oklch(0.18 0.008 80);
159
- --accent: oklch(0.81 0.11 45); /* baseline persimmon --color-accent */
160
- --accent-foreground: oklch(0.18 0.008 80);
161
- --border: oklch(0.18 0.008 80 / 0.1); /* baseline --color-border */
162
- --input: oklch(0.18 0.008 80 / 0.1);
163
- --ring: oklch(0.18 0.008 80 / 0.35); /* baseline --color-ring */
164
- --destructive: oklch(0.58 0.18 25);
165
- --destructive-foreground: oklch(0.995 0.005 80);
166
-
167
- /* ---- baseline semantic layer (verbatim from globals.css :root) ----- */
168
- --color-surface: oklch(0.945 0.01 95);
169
- --color-surface-raised: oklch(0.975 0.005 95);
170
- --color-surface-sunken: oklch(0.91 0.012 95);
171
-
172
- --color-fg: oklch(0.18 0.008 80);
173
- --color-fg-soft: oklch(0.32 0.01 80);
174
- --color-fg-muted: oklch(0.46 0.012 80);
175
-
176
- --color-border: oklch(0.18 0.008 80 / 0.1);
177
- --color-border-strong: oklch(0.18 0.008 80 / 0.25);
178
- --color-ring: oklch(0.18 0.008 80 / 0.35);
179
- --color-hover: oklch(0.18 0.008 80 / 0.06);
180
-
181
- --color-btn-primary-from: oklch(0.315 0.008 250);
182
- --color-btn-primary-to: oklch(0.06 0 0);
183
- --color-btn-primary-fg: oklch(0.995 0.005 80);
184
-
185
- --color-destructive: oklch(0.58 0.18 25);
186
- --color-destructive-fg: oklch(0.995 0.005 80);
144
+ /* ════ THEME DERIVATION ══════════════════════════════════════════════
145
+ The neo shared names (--background, --primary, …) are NOT re-declared
146
+ here anymore: they inherit from the host theme preset that <Site>
147
+ (DialectShell) sets on its wrapper, so swapping the preset repaints the
148
+ named subtree. The semantic layer below derives from them, with the
149
+ cream-baseline literals as var() fallbacks — a host that mounts the
150
+ named arc with no theme CSS at all still renders the baseline.
151
+
152
+ PAIR RULE: whenever a derivation adjusts one half of a contrast pair
153
+ (clamping a field, lifting type), the partner must be re-derived with
154
+ itnever keep the preset's pairing against an adjusted value. */
155
+
156
+ /* ---- baseline semantic layer, derived from the preset --------------- */
157
+ --color-surface: var(--background, oklch(0.945 0.01 95));
158
+ --color-surface-raised: var(--card, oklch(0.975 0.005 95));
159
+ --color-surface-sunken: var(--muted, oklch(0.91 0.012 95));
160
+
161
+ --color-fg: var(--foreground, oklch(0.18 0.008 80));
162
+ --color-fg-soft: color-mix(in oklab, var(--color-fg) 60%, var(--color-fg-muted));
163
+ --color-fg-muted: var(--muted-foreground, oklch(0.46 0.012 80));
164
+
165
+ /* hairlines: always ink-at-alpha so the rules read on any palette */
166
+ --color-border: color-mix(in oklab, var(--color-fg) 10%, transparent);
167
+ --color-border-strong: color-mix(in oklab, var(--color-fg) 25%, transparent);
168
+ --color-ring: color-mix(in oklab, var(--color-fg) 35%, transparent);
169
+ --color-hover: color-mix(in oklab, var(--color-fg) 6%, transparent);
170
+
171
+ /* primary CTA gradient: the preset primary, top endpoint lifted a step
172
+ (the baseline's graphite→ink read). Text keeps the preset's pairing —
173
+ the bottom endpoint IS the raw primary. */
174
+ --color-btn-primary-from: oklch(from var(--primary, oklch(0.06 0 0)) calc(l + 0.12) c h);
175
+ --color-btn-primary-to: var(--primary, oklch(0.06 0 0));
176
+ --color-btn-primary-fg: var(--primary-foreground, oklch(0.995 0.005 80));
177
+
178
+ --color-destructive: var(--destructive, oklch(0.58 0.18 25));
179
+ --color-destructive-fg: var(--destructive-foreground, oklch(0.995 0.005 80));
187
180
 
188
181
  /* ---- baseline hue library + persona accent (Priya = persimmon) ----- */
189
182
  --hue-teal-soft: oklch(0.95 0.04 210);
@@ -206,10 +199,34 @@
206
199
  --hue-purple-medium: oklch(0.86 0.045 314);
207
200
  --hue-purple-strong: oklch(0.63 0.065 314);
208
201
 
209
- --color-accent-soft: var(--hue-orange-soft);
210
- --color-accent: var(--hue-orange-medium);
211
- --color-accent-strong: var(--hue-orange-strong);
212
- --color-accent-fg: oklch(0.18 0.008 80);
202
+ /* Persona accent: derived from the preset primary in the baseline's
203
+ pastel register (soft chip → medium badge → strong mark). Unthemed
204
+ hosts fall back to the baseline persimmon. accent-fg pairs with
205
+ accent-strong (= the RAW primary — the Button `accent` variant is its
206
+ one consumer), so it rides the preset's own contrast partner. */
207
+ --color-accent-soft: color-mix(in oklab, var(--primary, var(--hue-orange-medium)) 18%, var(--color-surface));
208
+ --color-accent: color-mix(in oklab, var(--primary, var(--hue-orange-medium)) 45%, var(--color-surface));
209
+ --color-accent-strong: var(--primary, var(--hue-orange-strong));
210
+ --color-accent-fg: var(--primary-foreground, oklch(0.18 0.008 80));
211
+
212
+ /* Footer — the ink closing band (baseline bg-[#111011]): derived from the
213
+ theme's ink so the band follows the palette; the page surface is the
214
+ on-band type color (the theme's fg/bg pair guarantees contrast both
215
+ ways). The dark block re-derives the pair — the band stays a step
216
+ deeper than the walls instead of inverting (the bookend is ink in both
217
+ modes; that's the studio signature). */
218
+ --color-footer: color-mix(in oklab, var(--color-fg) 97%, var(--color-surface));
219
+ --color-footer-fg: var(--color-surface);
220
+
221
+ /* Code panels (the shared CodeWindow ground; studio + executive read
222
+ these, gallery has its vitrine) — derived from the theme's ink instead
223
+ of the old literal #0d1117 github-dark ground, which is a BLUE-hued
224
+ black (~hue 250) and read blue against the warm/themed surfaces in
225
+ both modes. Same model as the footer band: the theme's ink by day, a
226
+ step deeper than the walls after dark — the panel stays dark in both
227
+ modes (shiki's dark token palette needs the dark ground). */
228
+ --color-code: color-mix(in oklab, var(--color-fg) 96%, var(--color-surface));
229
+ --color-code-fg: var(--color-surface);
213
230
 
214
231
  /* ---- baseline radii (62d6f04) ------------------------------------- */
215
232
  --radius-section: 36px; /* large section containers */
@@ -297,48 +314,21 @@ html:has([data-dialect='named']) {
297
314
  ────────────────────────────────────────────────────────────────── */
298
315
  .dark [data-dialect='named'],
299
316
  [data-dialect='named'].dark {
300
- /* ---- neo shared tokens, re-pointed to the dark baseline ----------- */
301
- --background: oklch(0.155 0.005 60); /* baseline dark --color-surface */
302
- --foreground: oklch(0.94 0.008 80); /* baseline dark --color-fg */
303
- --card: oklch(0.23 0.008 60); /* baseline dark --color-surface-raised */
304
- --card-foreground: oklch(0.94 0.008 80);
305
- --popover: oklch(0.23 0.008 60);
306
- --popover-foreground: oklch(0.94 0.008 80);
307
- --muted: oklch(0.105 0.003 60); /* baseline dark --color-surface-sunken */
308
- --muted-foreground: oklch(0.7 0.012 80); /* baseline dark --color-fg-muted */
309
- /* primary CTA inverts to cream-on-dark (baseline dark --color-btn-primary-*) */
310
- --primary: oklch(0.87 0.01 80);
311
- --primary-foreground: oklch(0.18 0.005 60);
312
- --secondary: oklch(0.23 0.008 60);
313
- --secondary-foreground: oklch(0.94 0.008 80);
314
- --accent: oklch(0.335 0.09 45); /* dark persimmon --hue-orange-medium */
315
- --accent-foreground: oklch(0.18 0.008 80);
316
- --border: oklch(0.94 0.008 80 / 0.12);
317
- --input: oklch(0.94 0.008 80 / 0.12);
318
- --ring: oklch(0.94 0.008 80 / 0.4);
319
- --destructive: oklch(0.64 0.18 25);
320
- --destructive-foreground: oklch(0.18 0.005 60);
321
-
322
- /* ---- baseline semantic layer (verbatim from globals.css .dark) ----- */
323
- --color-surface: oklch(0.155 0.005 60);
324
- --color-surface-raised: oklch(0.23 0.008 60);
325
- --color-surface-sunken: oklch(0.105 0.003 60);
326
-
327
- --color-fg: oklch(0.94 0.008 80);
328
- --color-fg-soft: oklch(0.82 0.01 80);
329
- --color-fg-muted: oklch(0.7 0.012 80);
330
-
331
- --color-border: oklch(0.94 0.008 80 / 0.12);
332
- --color-border-strong: oklch(0.94 0.008 80 / 0.25);
333
- --color-ring: oklch(0.94 0.008 80 / 0.4);
334
- --color-hover: oklch(0.94 0.008 80 / 0.08);
335
-
336
- --color-btn-primary-from: oklch(0.945 0.008 80);
337
- --color-btn-primary-to: oklch(0.87 0.01 80);
338
- --color-btn-primary-fg: oklch(0.18 0.005 60);
339
-
340
- --color-destructive: oklch(0.64 0.18 25);
341
- --color-destructive-fg: oklch(0.18 0.005 60);
317
+ /* With the shared names inherited, the preset's own .dark values flow
318
+ through every derivation in the light block surfaces, ink, hairlines,
319
+ the CTA gradient, and the accent trio all flip for free. Only the hue
320
+ library below needs dark values (it stays template-owned literal). */
321
+
322
+ /* Footer: the ink band does NOT invert after dark — it re-derives a step
323
+ deeper than the walls (derived from the wall's own lightness; preset
324
+ --muted can sit ABOVE a dark background, so it can't anchor "deeper"). */
325
+ --color-footer: oklch(from var(--color-surface) calc(l * 0.72) c h);
326
+ --color-footer-fg: var(--color-fg);
327
+
328
+ /* Code panels after dark: a step deeper than the walls, type in the
329
+ room's ink (re-paired, same as the footer band). */
330
+ --color-code: oklch(from var(--color-surface) calc(l * 0.72) c h);
331
+ --color-code-fg: var(--color-fg);
342
332
 
343
333
  /* ---- hue library, dark values (hue angles preserved) --------------- */
344
334
  --hue-teal-soft: oklch(0.245 0.025 210);
@@ -362,28 +352,6 @@ html:has([data-dialect='named']) {
362
352
  --hue-purple-strong: oklch(0.73 0.125 314);
363
353
  }
364
354
 
365
- /* Dark variants for the scoped utilities that bake literal light-ink values
366
- (everything var()-driven above flips automatically). */
367
- .dark [data-dialect='named'] .text-foreground\/70,
368
- [data-dialect='named'].dark .text-foreground\/70 {
369
- color: oklch(0.94 0.008 80 / 0.7);
370
- }
371
- .dark [data-dialect='named'] .text-foreground\/60,
372
- [data-dialect='named'].dark .text-foreground\/60 {
373
- color: oklch(0.94 0.008 80 / 0.6);
374
- }
375
- .dark [data-dialect='named'] .bg-primary\/10,
376
- [data-dialect='named'].dark .bg-primary\/10 {
377
- background-color: oklch(0.87 0.01 80 / 0.1);
378
- }
379
- .dark [data-dialect='named'] .fill-muted-foreground\/20,
380
- [data-dialect='named'].dark .fill-muted-foreground\/20 {
381
- fill: oklch(0.7 0.012 80 / 0.2);
382
- }
383
- .dark [data-dialect='named'] .stroke-muted-foreground\/20,
384
- [data-dialect='named'].dark .stroke-muted-foreground\/20 {
385
- stroke: oklch(0.7 0.012 80 / 0.2);
386
- }
387
355
  /* Baseline `.dark .integration-square-shadow` (globals.css) */
388
356
  .dark [data-dialect='named'] .integration-square-shadow,
389
357
  [data-dialect='named'].dark .integration-square-shadow {
@@ -428,7 +396,7 @@ html:has([data-dialect='named']) {
428
396
  background-color: var(--color-btn-primary-to);
429
397
  }
430
398
  [data-dialect='named'] .bg-primary\/10 {
431
- background-color: oklch(0.06 0 0 / 0.1);
399
+ background-color: color-mix(in oklab, var(--color-btn-primary-to) 10%, transparent);
432
400
  }
433
401
 
434
402
  /* —— Text colors —————————————————————————————————————————————————— */
@@ -436,10 +404,10 @@ html:has([data-dialect='named']) {
436
404
  color: var(--color-fg);
437
405
  }
438
406
  [data-dialect='named'] .text-foreground\/70 {
439
- color: oklch(0.18 0.008 80 / 0.7);
407
+ color: color-mix(in oklab, var(--color-fg) 70%, transparent);
440
408
  }
441
409
  [data-dialect='named'] .text-foreground\/60 {
442
- color: oklch(0.18 0.008 80 / 0.6);
410
+ color: color-mix(in oklab, var(--color-fg) 60%, transparent);
443
411
  }
444
412
  [data-dialect='named'] .text-muted-foreground {
445
413
  color: var(--color-fg-muted);
@@ -461,10 +429,10 @@ html:has([data-dialect='named']) {
461
429
 
462
430
  /* —— Fills / strokes (svg accents that read muted-foreground) ———————— */
463
431
  [data-dialect='named'] .fill-muted-foreground\/20 {
464
- fill: oklch(0.46 0.012 80 / 0.2);
432
+ fill: color-mix(in oklab, var(--color-fg-muted) 20%, transparent);
465
433
  }
466
434
  [data-dialect='named'] .stroke-muted-foreground\/20 {
467
- stroke: oklch(0.46 0.012 80 / 0.2);
435
+ stroke: color-mix(in oklab, var(--color-fg-muted) 20%, transparent);
468
436
  }
469
437
 
470
438
  /* —— Custom utilities the baseline markup relies on ———————————————— */
@@ -617,62 +585,52 @@ html:has([data-dialect='named']) {
617
585
  }
618
586
 
619
587
  [data-dialect='named'][data-template='executive'] {
620
- /* ---- semantic layer — Ledger Paper ---------------------------------- */
621
- /* surfaces: cool paper (hue 250, whisper of chroma never #fff) */
622
- --color-surface: oklch(0.975 0.004 250);
623
- --color-surface-raised: oklch(0.99 0.003 250);
624
- --color-surface-sunken: oklch(0.952 0.005 250);
625
-
626
- /* ink: graphite, cool */
627
- --color-fg: oklch(0.21 0.012 255);
628
- --color-fg-soft: oklch(0.34 0.012 255);
629
- --color-fg-muted: oklch(0.47 0.012 255);
630
-
631
- /* hairline rules — the structural language */
632
- --color-border: oklch(0.21 0.012 255 / 0.16);
633
- --color-border-strong: oklch(0.21 0.012 255 / 0.45);
634
- --color-ring: oklch(0.21 0.012 255 / 0.4);
635
- --color-hover: oklch(0.21 0.012 255 / 0.04);
636
-
637
- /* the one accent: oxblood — in TWO roles. `field` paints large surfaces
638
- (the cover, the featured tier); `strong` is red TYPE and small marks
639
- (numerals, squares). In light they share one value; dark splits them —
640
- fields must stay deep (rich burgundy on ink), type must lift to stay
641
- legible. Lifting a large field is what reads muddy-salmon. */
642
- --color-accent-field: oklch(0.42 0.13 20);
643
- --color-accent-strong: oklch(0.42 0.13 20);
644
- --color-accent: oklch(0.49 0.12 20);
645
- --color-accent-soft: oklch(0.93 0.02 20);
646
- --color-accent-fg: oklch(0.985 0.004 250);
647
-
648
- /* primary button: solid oxblood (the studio gradient collapses flat) */
649
- --color-btn-primary-from: oklch(0.42 0.13 20);
650
- --color-btn-primary-to: oklch(0.42 0.13 20);
651
- --color-btn-primary-fg: oklch(0.985 0.004 250);
652
-
653
- --color-destructive: oklch(0.58 0.18 25);
654
- --color-destructive-fg: oklch(0.985 0.004 250);
655
-
656
- /* ---- neo shared names, re-pointed (keeps shared primitives correct) -- */
657
- --background: oklch(0.975 0.004 250);
658
- --foreground: oklch(0.21 0.012 255);
659
- --card: oklch(0.99 0.003 250);
660
- --card-foreground: oklch(0.21 0.012 255);
661
- --popover: oklch(0.99 0.003 250);
662
- --popover-foreground: oklch(0.21 0.012 255);
663
- --muted: oklch(0.952 0.005 250);
664
- --muted-foreground: oklch(0.47 0.012 255);
665
- --primary: oklch(0.42 0.13 20);
666
- --primary-foreground: oklch(0.985 0.004 250);
667
- --secondary: oklch(0.952 0.005 250);
668
- --secondary-foreground: oklch(0.21 0.012 255);
669
- --accent: oklch(0.49 0.12 20);
670
- --accent-foreground: oklch(0.985 0.004 250);
671
- --border: oklch(0.21 0.012 255 / 0.16);
672
- --input: oklch(0.21 0.012 255 / 0.16);
673
- --ring: oklch(0.21 0.012 255 / 0.4);
674
- --destructive: oklch(0.58 0.18 25);
675
- --destructive-foreground: oklch(0.985 0.004 250);
588
+ /* ════ THEME DERIVATION ══════════════════════════════════════════════
589
+ Like studio/gallery: the neo shared names inherit from the host preset
590
+ (<Site>'s wrapper — studio's block no longer re-points them), and the
591
+ executive semantic layer derives from them. The hairline language
592
+ survives as foreground-at-alpha mixes; the one-accent language maps
593
+ onto the preset's --primary/--primary-foreground contrast pair.
594
+ Geometry (2px corners, zero shadows) and the Anton masthead stay
595
+ template identity and do NOT follow the theme.
596
+
597
+ PAIR RULE: whenever a derivation adjusts one half of a contrast pair,
598
+ the partner is re-derived with it (see the dark block). */
599
+
600
+ /* ---- semantic layer derived from the preset ------------------------ */
601
+ /* surfaces (fallbacks: Ledger Paper, for hosts with no theme CSS) */
602
+ --color-surface: var(--background, oklch(0.975 0.004 250));
603
+ --color-surface-raised: var(--card, oklch(0.99 0.003 250));
604
+ --color-surface-sunken: var(--muted, oklch(0.952 0.005 250));
605
+
606
+ /* ink */
607
+ --color-fg: var(--foreground, oklch(0.21 0.012 255));
608
+ --color-fg-soft: color-mix(in oklab, var(--color-fg) 55%, var(--color-fg-muted));
609
+ --color-fg-muted: var(--muted-foreground, oklch(0.47 0.012 255));
610
+
611
+ /* hairline rules — the structural language: always ink-at-alpha, never the
612
+ preset's solid --border (a solid border kills the ledger hairline read) */
613
+ --color-border: color-mix(in oklab, var(--color-fg) 16%, transparent);
614
+ --color-border-strong: color-mix(in oklab, var(--color-fg) 45%, transparent);
615
+ --color-ring: color-mix(in oklab, var(--color-fg) 40%, transparent);
616
+ --color-hover: color-mix(in oklab, var(--color-fg) 4%, transparent);
617
+
618
+ /* the one accent — in TWO roles (`field` paints large surfaces, `strong`
619
+ is accent TYPE and small marks). Both map onto the preset's primary
620
+ pair (fallback: oxblood); the dark block splits them. */
621
+ --color-accent-field: var(--primary, oklch(0.42 0.13 20));
622
+ --color-accent-strong: var(--primary, oklch(0.42 0.13 20));
623
+ --color-accent: oklch(from var(--primary, oklch(0.49 0.12 20)) calc(l + 0.07) c h);
624
+ --color-accent-soft: color-mix(in oklab, var(--primary, oklch(0.42 0.13 20)) 12%, var(--color-surface));
625
+ --color-accent-fg: var(--primary-foreground, oklch(0.985 0.004 250));
626
+
627
+ /* primary button: solid accent (the studio gradient collapses flat) */
628
+ --color-btn-primary-from: var(--primary, oklch(0.42 0.13 20));
629
+ --color-btn-primary-to: var(--primary, oklch(0.42 0.13 20));
630
+ --color-btn-primary-fg: var(--primary-foreground, oklch(0.985 0.004 250));
631
+
632
+ --color-destructive: var(--destructive, oklch(0.58 0.18 25));
633
+ --color-destructive-fg: var(--destructive-foreground, oklch(0.985 0.004 250));
676
634
 
677
635
  /* ---- geometry: square document corners, flat surfaces ---------------- */
678
636
  /* 2px everywhere a radius utility appears (--radius anchors the host's
@@ -724,55 +682,26 @@ html:has([data-dialect='named']) {
724
682
  ────────────────────────────────────────────────────────────────── */
725
683
  .dark [data-dialect='named'][data-template='executive'],
726
684
  [data-dialect='named'][data-template='executive'].dark {
727
- /* ---- semantic layer ink paper ------------------------------------- */
728
- --color-surface: oklch(0.16 0.01 255);
729
- --color-surface-raised: oklch(0.205 0.012 255);
730
- --color-surface-sunken: oklch(0.125 0.008 255);
731
-
732
- --color-fg: oklch(0.945 0.005 250);
733
- --color-fg-soft: oklch(0.84 0.006 250);
734
- --color-fg-muted: oklch(0.67 0.008 250);
735
-
736
- --color-border: oklch(0.945 0.005 250 / 0.15);
737
- --color-border-strong: oklch(0.945 0.005 250 / 0.45);
738
- --color-ring: oklch(0.945 0.005 250 / 0.4);
739
- --color-hover: oklch(0.945 0.005 250 / 0.06);
740
-
741
- /* oxblood splits by role on ink: FIELDS stay deep (rich burgundy a
742
- lifted large field reads muddy salmon), TYPE lifts to stay legible. */
743
- --color-accent-field: oklch(0.37 0.115 20);
744
- --color-accent-strong: oklch(0.62 0.16 24);
745
- --color-accent: oklch(0.68 0.15 26);
746
- --color-accent-soft: oklch(0.28 0.06 20);
747
- --color-accent-fg: oklch(0.975 0.006 250);
748
-
749
- --color-btn-primary-from: oklch(0.55 0.15 22);
750
- --color-btn-primary-to: oklch(0.55 0.15 22);
751
- --color-btn-primary-fg: oklch(0.975 0.006 250);
752
-
753
- --color-destructive: oklch(0.62 0.18 25);
754
- --color-destructive-fg: oklch(0.16 0.01 255);
755
-
756
- /* ---- neo shared names, re-pointed ----------------------------------- */
757
- --background: oklch(0.16 0.01 255);
758
- --foreground: oklch(0.945 0.005 250);
759
- --card: oklch(0.205 0.012 255);
760
- --card-foreground: oklch(0.945 0.005 250);
761
- --popover: oklch(0.205 0.012 255);
762
- --popover-foreground: oklch(0.945 0.005 250);
763
- --muted: oklch(0.125 0.008 255);
764
- --muted-foreground: oklch(0.67 0.008 250);
765
- --primary: oklch(0.55 0.16 22);
766
- --primary-foreground: oklch(0.975 0.006 250);
767
- --secondary: oklch(0.205 0.012 255);
768
- --secondary-foreground: oklch(0.945 0.005 250);
769
- --accent: oklch(0.62 0.15 22);
770
- --accent-foreground: oklch(0.975 0.006 250);
771
- --border: oklch(0.945 0.005 250 / 0.15);
772
- --input: oklch(0.945 0.005 250 / 0.15);
773
- --ring: oklch(0.945 0.005 250 / 0.4);
774
- --destructive: oklch(0.62 0.18 25);
775
- --destructive-foreground: oklch(0.16 0.01 255);
685
+ /* SPIKE: with the shared names un-shadowed (base block `inherit`), the
686
+ host preset's own .dark values flow through the derivations above —
687
+ surfaces, ink, hairlines, and the contrast pairs all flip for free.
688
+ The only design-specific dark rule left is the accent ROLE SPLIT:
689
+ FIELDS stay deep (a lifted large field reads muddy), accent TYPE lifts
690
+ to stay legible on ink — derived from the preset primary via relative
691
+ color syntax instead of the old oxblood literals. */
692
+ --color-accent-field: oklch(from var(--primary, oklch(0.37 0.115 20)) min(l, 0.45) c h);
693
+ --color-accent-strong: oklch(from var(--primary, oklch(0.62 0.16 24)) max(l, 0.62) c h);
694
+ --color-accent: oklch(from var(--primary, oklch(0.68 0.15 26)) max(l, 0.68) calc(c * 1.05) h);
695
+ --color-accent-soft: color-mix(in oklab, var(--primary, oklch(0.37 0.115 20)) 22%, var(--color-surface));
696
+ /* Type/marks ON the clamped-deep fields can't keep the preset's
697
+ --primary-foreground pairing that pairs with the RAW primary, and a
698
+ light dark-mode primary (clay: 0.68 L) carries a near-BLACK foreground,
699
+ which lands black-on-deep once the field is clamped. The theme's dark
700
+ ink IS light, so the cover sets in the theme's own ink. */
701
+ --color-accent-fg: var(--color-fg);
702
+
703
+ --color-btn-primary-from: oklch(from var(--primary, oklch(0.55 0.15 22)) max(l, 0.55) c h);
704
+ --color-btn-primary-to: oklch(from var(--primary, oklch(0.55 0.15 22)) max(l, 0.55) c h);
776
705
  }
777
706
 
778
707
  /* Display headings: the shared h1/h2 rule supplies var(--font-display) →
@@ -860,74 +789,66 @@ html:has([data-dialect='named']) {
860
789
  }
861
790
 
862
791
  [data-dialect='named'][data-template='gallery'] {
863
- /* ---- semantic layer — the day gallery -------------------------------- */
864
- /* walls: bone plaster (warm hue, whisper of chroma — never #fff) */
865
- --color-surface: oklch(0.957 0.007 80);
866
- --color-surface-raised: oklch(0.978 0.005 82);
867
- --color-surface-sunken: oklch(0.928 0.009 78);
868
-
869
- /* ink: warm umber, never pure black */
870
- --color-fg: oklch(0.21 0.012 55);
871
- --color-fg-soft: oklch(0.34 0.012 55);
872
- --color-fg-muted: oklch(0.47 0.014 60);
873
-
874
- /* hairlines — frame edges and rule lines */
875
- --color-border: oklch(0.21 0.012 55 / 0.14);
876
- --color-border-strong: oklch(0.21 0.012 55 / 0.42);
877
- --color-ring: oklch(0.45 0.2 264 / 0.5);
878
- --color-hover: oklch(0.21 0.012 55 / 0.05);
879
-
880
- /* the one accent: electric ultramarine (Klein blue). `field` paints the
881
- large surfaces (the closing-room wall, the featured edition); `strong`
882
- is blue TYPE and small marks (catalogue numbers, diamonds). They share
883
- a value in daylight; after dark they split — fields stay deep and
884
- saturated, type lifts to stay legible on near-black. */
885
- --color-accent-field: oklch(0.45 0.28 264);
886
- --color-accent-strong: oklch(0.45 0.26 264);
887
- --color-accent: oklch(0.5 0.24 264);
888
- --color-accent-soft: oklch(0.93 0.035 264);
889
- --color-accent-fg: oklch(0.975 0.006 85);
890
-
891
- /* placards: physical bone cards same material in BOTH modes */
892
- --color-placard: oklch(0.982 0.005 85);
893
- --color-placard-fg: oklch(0.21 0.012 55);
894
- --color-placard-soft: oklch(0.36 0.012 55);
895
- --color-placard-muted: oklch(0.48 0.014 58);
896
- --color-placard-border: oklch(0.21 0.012 55 / 0.12);
897
-
898
- /* vitrines: dark velvet interiors display cases stay dark by day too */
899
- --color-vitrine: oklch(0.15 0.012 48);
900
- --color-vitrine-fg: oklch(0.92 0.008 80);
901
- --color-vitrine-border: oklch(0.21 0.012 55 / 0.35);
902
-
903
- /* primary action: solid ultramarine (the studio gradient collapses flat) */
904
- --color-btn-primary-from: oklch(0.45 0.28 264);
905
- --color-btn-primary-to: oklch(0.45 0.28 264);
906
- --color-btn-primary-fg: oklch(0.975 0.006 85);
907
-
908
- --color-destructive: oklch(0.55 0.19 28);
909
- --color-destructive-fg: oklch(0.975 0.006 85);
910
-
911
- /* ---- neo shared names, re-pointed (keeps shared primitives correct) -- */
912
- --background: oklch(0.957 0.007 80);
913
- --foreground: oklch(0.21 0.012 55);
914
- --card: oklch(0.978 0.005 82);
915
- --card-foreground: oklch(0.21 0.012 55);
916
- --popover: oklch(0.978 0.005 82);
917
- --popover-foreground: oklch(0.21 0.012 55);
918
- --muted: oklch(0.928 0.009 78);
919
- --muted-foreground: oklch(0.47 0.014 60);
920
- --primary: oklch(0.45 0.28 264);
921
- --primary-foreground: oklch(0.975 0.006 85);
922
- --secondary: oklch(0.928 0.009 78);
923
- --secondary-foreground: oklch(0.21 0.012 55);
924
- --accent: oklch(0.5 0.24 264);
925
- --accent-foreground: oklch(0.975 0.006 85);
926
- --border: oklch(0.21 0.012 55 / 0.14);
927
- --input: oklch(0.21 0.012 55 / 0.14);
928
- --ring: oklch(0.45 0.2 264 / 0.5);
929
- --destructive: oklch(0.55 0.19 28);
930
- --destructive-foreground: oklch(0.975 0.006 85);
792
+ /* ════ THEME DERIVATION ══════════════════════════════════════════════
793
+ Like studio/executive: the neo shared names inherit from the host
794
+ preset (<Site>'s wrapper); the gallery semantic layer derives from
795
+ them, with the day-gallery literals as unthemed fallbacks. The museum
796
+ STRUCTURE (placard system, vitrines, frames, museum light) is the
797
+ identity; the palette follows the theme.
798
+
799
+ PAIR RULE: whenever a derivation adjusts one half of a contrast pair,
800
+ the partner is re-derived with it (see the dark block). */
801
+
802
+ /* ---- semantic layer — derived from the preset ------------------------ */
803
+ /* walls */
804
+ --color-surface: var(--background, oklch(0.957 0.007 80));
805
+ --color-surface-raised: var(--card, oklch(0.978 0.005 82));
806
+ --color-surface-sunken: var(--muted, oklch(0.928 0.009 78));
807
+
808
+ /* ink */
809
+ --color-fg: var(--foreground, oklch(0.21 0.012 55));
810
+ --color-fg-soft: color-mix(in oklab, var(--color-fg) 60%, var(--color-fg-muted));
811
+ --color-fg-muted: var(--muted-foreground, oklch(0.47 0.014 60));
812
+
813
+ /* hairlines frame edges and rule lines: always ink-at-alpha */
814
+ --color-border: color-mix(in oklab, var(--color-fg) 14%, transparent);
815
+ --color-border-strong: color-mix(in oklab, var(--color-fg) 42%, transparent);
816
+ --color-ring: color-mix(in oklab, var(--primary, oklch(0.45 0.2 264)) 50%, transparent);
817
+ --color-hover: color-mix(in oklab, var(--color-fg) 5%, transparent);
818
+
819
+ /* the one accent: the preset primary in the Klein-blue roles. `field`
820
+ paints the large surfaces (the closing-room wall, the featured
821
+ edition); `strong` is accent TYPE and small marks (catalogue numbers,
822
+ diamonds). They share the raw primary in daylight — the preset's
823
+ --primary-foreground pairing holds; after dark they split (below). */
824
+ --color-accent-field: var(--primary, oklch(0.45 0.28 264));
825
+ --color-accent-strong: var(--primary, oklch(0.45 0.26 264));
826
+ --color-accent: oklch(from var(--primary, oklch(0.5 0.24 264)) calc(l + 0.05) calc(c * 0.9) h);
827
+ --color-accent-soft: color-mix(in oklab, var(--primary, oklch(0.45 0.28 264)) 10%, var(--color-surface));
828
+ --color-accent-fg: var(--primary-foreground, oklch(0.975 0.006 85));
829
+
830
+ /* placards: the preset's card material (the bone-card conceit yields to
831
+ the theme — a placard is the theme's card, hung in the gallery) */
832
+ --color-placard: var(--card, oklch(0.982 0.005 85));
833
+ --color-placard-fg: var(--card-foreground, oklch(0.21 0.012 55));
834
+ --color-placard-soft: color-mix(in oklab, var(--color-placard-fg) 80%, var(--color-placard));
835
+ --color-placard-muted: color-mix(in oklab, var(--color-placard-fg) 64%, var(--color-placard));
836
+ --color-placard-border: color-mix(in oklab, var(--color-placard-fg) 12%, transparent);
837
+
838
+ /* vitrines: dark velvet interiors — display cases stay dark by day, so
839
+ by day the velvet derives from the room's INK (pair: type in the
840
+ room's surface tone). The dark block re-derives both (see below). */
841
+ --color-vitrine: color-mix(in oklab, var(--color-fg) 92%, var(--color-surface));
842
+ --color-vitrine-fg: var(--color-surface);
843
+ --color-vitrine-border: color-mix(in oklab, var(--color-fg) 35%, transparent);
844
+
845
+ /* primary action: solid preset primary (the studio gradient collapses flat) */
846
+ --color-btn-primary-from: var(--primary, oklch(0.45 0.28 264));
847
+ --color-btn-primary-to: var(--primary, oklch(0.45 0.28 264));
848
+ --color-btn-primary-fg: var(--primary-foreground, oklch(0.975 0.006 85));
849
+
850
+ --color-destructive: var(--destructive, oklch(0.55 0.19 28));
851
+ --color-destructive-fg: var(--destructive-foreground, oklch(0.975 0.006 85));
931
852
 
932
853
  /* ---- geometry: crisp frames, gently eased placard corners ------------ */
933
854
  /* 4px base (--radius anchors the host's @theme-inline multipliers; see
@@ -1001,67 +922,32 @@ html:has([data-dialect='named']) {
1001
922
  ────────────────────────────────────────────────────────────────── */
1002
923
  .dark [data-dialect='named'][data-template='gallery'],
1003
924
  [data-dialect='named'][data-template='gallery'].dark {
1004
- /* ---- semantic layer after hours ------------------------------------ */
1005
- --color-surface: oklch(0.168 0.012 45);
1006
- --color-surface-raised: oklch(0.205 0.014 45);
1007
- --color-surface-sunken: oklch(0.13 0.01 45);
1008
-
1009
- --color-fg: oklch(0.93 0.01 80);
1010
- --color-fg-soft: oklch(0.82 0.01 80);
1011
- --color-fg-muted: oklch(0.66 0.012 75);
1012
-
1013
- --color-border: oklch(0.93 0.01 80 / 0.13);
1014
- --color-border-strong: oklch(0.93 0.01 80 / 0.4);
1015
- --color-ring: oklch(0.64 0.19 266 / 0.55);
1016
- --color-hover: oklch(0.93 0.01 80 / 0.06);
1017
-
1018
- /* ultramarine after dark: fields hold deep IKB, type lifts */
1019
- --color-accent-field: oklch(0.43 0.27 264);
1020
- --color-accent-strong: oklch(0.66 0.19 266);
1021
- --color-accent: oklch(0.58 0.22 265);
1022
- --color-accent-soft: oklch(0.26 0.08 264);
1023
- --color-accent-fg: oklch(0.965 0.008 85);
1024
-
1025
- /* the placard stays a bone card — now a lit object on the dark wall */
1026
- --color-placard: oklch(0.936 0.012 82);
1027
- --color-placard-fg: oklch(0.22 0.012 50);
1028
- --color-placard-soft: oklch(0.37 0.012 52);
1029
- --color-placard-muted: oklch(0.46 0.014 55);
1030
- --color-placard-border: oklch(0.22 0.012 50 / 0.14);
1031
-
1032
- /* vitrine: a step deeper than the walls */
1033
- --color-vitrine: oklch(0.115 0.01 45);
1034
- --color-vitrine-fg: oklch(0.92 0.008 80);
1035
- --color-vitrine-border: oklch(0.93 0.01 80 / 0.22);
1036
-
1037
- /* primary action: ultramarine lifted half a step for the dark room */
1038
- --color-btn-primary-from: oklch(0.48 0.26 264);
1039
- --color-btn-primary-to: oklch(0.48 0.26 264);
1040
- --color-btn-primary-fg: oklch(0.965 0.008 85);
1041
-
1042
- --color-destructive: oklch(0.62 0.18 28);
1043
- --color-destructive-fg: oklch(0.168 0.012 45);
1044
-
1045
- /* ---- neo shared names, re-pointed ----------------------------------- */
1046
- --background: oklch(0.168 0.012 45);
1047
- --foreground: oklch(0.93 0.01 80);
1048
- --card: oklch(0.205 0.014 45);
1049
- --card-foreground: oklch(0.93 0.01 80);
1050
- --popover: oklch(0.205 0.014 45);
1051
- --popover-foreground: oklch(0.93 0.01 80);
1052
- --muted: oklch(0.13 0.01 45);
1053
- --muted-foreground: oklch(0.66 0.012 75);
1054
- --primary: oklch(0.48 0.26 264);
1055
- --primary-foreground: oklch(0.965 0.008 85);
1056
- --secondary: oklch(0.205 0.014 45);
1057
- --secondary-foreground: oklch(0.93 0.01 80);
1058
- --accent: oklch(0.58 0.22 265);
1059
- --accent-foreground: oklch(0.965 0.008 85);
1060
- --border: oklch(0.93 0.01 80 / 0.13);
1061
- --input: oklch(0.93 0.01 80 / 0.13);
1062
- --ring: oklch(0.64 0.19 266 / 0.55);
1063
- --destructive: oklch(0.62 0.18 28);
1064
- --destructive-foreground: oklch(0.168 0.012 45);
925
+ /* With the shared names inherited, the preset's .dark values flow through
926
+ the light-block derivations — walls, ink, hairlines, placards (now the
927
+ theme's dark cards) all flip for free. What remains is design-specific:
928
+ the accent ROLE SPLIT (painted fields hold deep, type lifts — and the
929
+ on-field type re-pairs to the theme's dark ink, which is light), the
930
+ vitrine re-derived a step deeper than the walls, and the museum light. */
931
+
932
+ /* accent after dark: fields hold deep, type lifts */
933
+ --color-accent-field: oklch(from var(--primary, oklch(0.43 0.27 264)) min(l, 0.45) c h);
934
+ --color-accent-strong: oklch(from var(--primary, oklch(0.66 0.19 266)) max(l, 0.64) calc(c * 0.85) h);
935
+ --color-accent: oklch(from var(--primary, oklch(0.58 0.22 265)) max(l, 0.58) calc(c * 0.9) h);
936
+ --color-accent-soft: color-mix(in oklab, var(--primary, oklch(0.45 0.28 264)) 20%, var(--color-surface));
937
+ --color-accent-fg: var(--color-fg);
938
+ --color-ring: color-mix(in oklab, var(--color-accent-strong) 55%, transparent);
939
+
940
+ /* vitrine: a step deeper than the walls (re-paired to the dark room).
941
+ Derived from the wall's own lightness — preset --muted can sit ABOVE
942
+ the dark background (clay: 0.22 vs 0.15), which would read raised. */
943
+ --color-vitrine: oklch(from var(--background, oklch(0.168 0.012 45)) calc(l * 0.72) c h);
944
+ --color-vitrine-fg: var(--color-fg);
945
+ --color-vitrine-border: color-mix(in oklab, var(--color-fg) 22%, transparent);
946
+
947
+ /* primary action: lifted half a step for the dark room; the lift only
948
+ raises l, so the preset's --primary-foreground pairing still holds */
949
+ --color-btn-primary-from: oklch(from var(--primary, oklch(0.48 0.26 264)) max(l, 0.48) c h);
950
+ --color-btn-primary-to: oklch(from var(--primary, oklch(0.48 0.26 264)) max(l, 0.48) c h);
1065
951
 
1066
952
  /* shadows deepen after dark — spotlit objects throw real penumbrae */
1067
953
  --shadow-sm: 0 1px 3px oklch(0.08 0.008 45 / 0.3),