@mdxui/named 8.0.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) →
@@ -810,4 +739,263 @@ html:has([data-dialect='named']) {
810
739
  left: 0;
811
740
  right: 0;
812
741
  border-top: 1px solid var(--color-border);
813
- }
742
+ }
743
+
744
+ /**
745
+ * @mdxui/named — GALLERY template envelope ("The Evening Gallery")
746
+ * ============================================================================
747
+ *
748
+ * The museum register of the named dialect: the page is an exhibition
749
+ * catalogue for a singular talent. Scene: an evening visitor moving alone
750
+ * through a dim gallery — warm near-black walls, each capability hung as a
751
+ * spot-lit work with its bone placard beside it, one Klein-blue wall at the
752
+ * end of the walk.
753
+ *
754
+ * LIGHT MODE IS THE DAY GALLERY, not an inversion: bone plaster walls under
755
+ * even daylight, the SAME placard system (placards are physical bone cards —
756
+ * they keep their material in both modes), the vitrines keep their dark
757
+ * velvet interiors, and the ultramarine holds. Dark mode dims the walls to
758
+ * warm near-black; the placards and vitrines read as lit objects by contrast
759
+ * alone.
760
+ *
761
+ * Color strategy: RESTRAINED — vast warm-neutral emptiness; one saturated
762
+ * accent (electric ultramarine, the International-Klein-Blue register of
763
+ * gallery walls) held under ~10% of the surface: catalogue numbers, the
764
+ * primary action, and the single painted wall of the closing room.
765
+ * Deliberately NOT gold/amber, NOT neon, NOT terminal-dark.
766
+ *
767
+ * SCOPING — rides on top of the studio envelope exactly like executive: the
768
+ * view renders `data-dialect="named" data-template="gallery"`, so studio's
769
+ * bare `[data-dialect='named']` block still matches and this two-attribute
770
+ * selector re-points every token the gallery subtree reads. The dark block
771
+ * below (3 selectors) outranks both this block and studio's `.dark` block.
772
+ */
773
+
774
+ /* Display face — Bricolage Grotesque (variable 200–800, optical sizes 12–96):
775
+ a grotesque with flare cuts and real presence at exhibition-title sizes,
776
+ nothing like Halant's serif or Anton's condensed shout. Inter body ships
777
+ from the studio block of the same stylesheet. */
778
+ @font-face {
779
+ font-family: 'Bricolage Grotesque';
780
+ font-style: normal;
781
+ font-weight: 200 800;
782
+ font-stretch: 100%;
783
+ font-display: swap;
784
+ src: url('https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9K6as8bTXq_nANBjzKo3IeZx8z6up5BeSl9D4dj_x9PpZBMlGIInHWVyNJ.woff2')
785
+ format('woff2');
786
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
787
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
788
+ U+2212, U+2215, U+FEFF, U+FFFD;
789
+ }
790
+
791
+ [data-dialect='named'][data-template='gallery'] {
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));
852
+
853
+ /* ---- geometry: crisp frames, gently eased placard corners ------------ */
854
+ /* 4px base (--radius anchors the host's @theme-inline multipliers; see
855
+ the studio block for the mechanism). Frames and vitrines are sharp by
856
+ component class; placards take the soft 4px of a die-cut card. */
857
+ --radius: 0.25rem;
858
+ --radius-xs: 0.125rem;
859
+ --radius-sm: 0.1875rem;
860
+ --radius-md: 0.25rem;
861
+ --radius-lg: 0.25rem;
862
+ --radius-xl: 0.375rem;
863
+ --radius-2xl: 0.5rem;
864
+ --radius-3xl: 0.5rem;
865
+ --radius-4xl: 0.5rem;
866
+ --radius-section: 0px;
867
+ --radius-image: 4px;
868
+
869
+ /* ---- elevation: museum light --------------------------------------- */
870
+ /* Placards and vitrines cast soft warm shadows (objects under daylight);
871
+ warm-black tint so the shadow belongs to the room, not to a screen. */
872
+ --shadow-2xs: 0 1px 1px oklch(0.15 0.012 48 / 0.05);
873
+ --shadow-xs: 0 1px 2px oklch(0.15 0.012 48 / 0.06);
874
+ --shadow-sm: 0 1px 3px oklch(0.15 0.012 48 / 0.08),
875
+ 0 1px 2px -1px oklch(0.15 0.012 48 / 0.08);
876
+ --shadow-md: 0 6px 16px -6px oklch(0.15 0.012 48 / 0.14),
877
+ 0 2px 4px -2px oklch(0.15 0.012 48 / 0.08);
878
+ --shadow-lg: 0 18px 40px -16px oklch(0.15 0.012 48 / 0.2),
879
+ 0 4px 10px -6px oklch(0.15 0.012 48 / 0.1);
880
+ --shadow-xl: 0 28px 56px -20px oklch(0.15 0.012 48 / 0.26);
881
+ --shadow-2xl: 0 36px 72px -24px oklch(0.15 0.012 48 / 0.32);
882
+
883
+ /* ---- type ------------------------------------------------------------ */
884
+ /* Display = Bricolage Grotesque (exhibition titles, catalogue numbers,
885
+ prices). Body stays on the inherited Inter. */
886
+ --font-display: 'Bricolage Grotesque', 'Avenir Next', system-ui, sans-serif;
887
+
888
+ background: var(--color-surface);
889
+ color: var(--color-fg);
890
+ font-family: var(--font-inter, 'Inter'), system-ui, -apple-system, sans-serif;
891
+ -webkit-font-smoothing: antialiased;
892
+ -moz-osx-font-smoothing: grayscale;
893
+ text-rendering: optimizeLegibility;
894
+ }
895
+
896
+ /* The hero's light wash — dark mode only, FULL WIDTH of the hero (inset 0,
897
+ never a negative-offset box): one warm pool falling from the top of the
898
+ wall, fading out before the ticker rule. */
899
+ [data-dialect='named'][data-template='gallery'] .gal-wash {
900
+ position: relative;
901
+ }
902
+ .dark [data-dialect='named'][data-template='gallery'] .gal-wash::before,
903
+ [data-dialect='named'][data-template='gallery'].dark .gal-wash::before {
904
+ content: '';
905
+ position: absolute;
906
+ inset: 0;
907
+ pointer-events: none;
908
+ background: radial-gradient(
909
+ 120% 100% at 50% 0%,
910
+ oklch(0.93 0.01 80 / 0.08),
911
+ transparent 58%
912
+ );
913
+ }
914
+
915
+ /* ──────────────────────────────────────────────────────────────────
916
+ DARK MODE — the evening gallery, the design's namesake. Warm near-black
917
+ walls (NOT cool terminal black), bone type. The placard keeps its
918
+ bone card material — a lit object on a dark wall — and the vitrine keeps
919
+ its velvet interior, now a step deeper than the room. Ultramarine splits
920
+ by role: painted fields stay deep IKB, type lifts to read on the dark.
921
+ Activated by the host's `.dark` class (DialectShell's <Site mode="dark">).
922
+ ────────────────────────────────────────────────────────────────── */
923
+ .dark [data-dialect='named'][data-template='gallery'],
924
+ [data-dialect='named'][data-template='gallery'].dark {
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);
951
+
952
+ /* shadows deepen after dark — spotlit objects throw real penumbrae */
953
+ --shadow-sm: 0 1px 3px oklch(0.08 0.008 45 / 0.3),
954
+ 0 1px 2px -1px oklch(0.08 0.008 45 / 0.3);
955
+ --shadow-md: 0 8px 20px -8px oklch(0.08 0.008 45 / 0.5),
956
+ 0 2px 6px -2px oklch(0.08 0.008 45 / 0.35);
957
+ --shadow-lg: 0 22px 48px -18px oklch(0.08 0.008 45 / 0.6),
958
+ 0 6px 14px -8px oklch(0.08 0.008 45 / 0.4);
959
+ --shadow-xl: 0 32px 64px -22px oklch(0.08 0.008 45 / 0.65);
960
+ --shadow-2xl: 0 40px 80px -26px oklch(0.08 0.008 45 / 0.7);
961
+ }
962
+
963
+ /* Display headings: the shared h1/h2 rule supplies var(--font-display) →
964
+ Bricolage Grotesque here. Exhibition titles set tight and confident —
965
+ medium weight (the variable cut around 560 has the flare without the
966
+ shout), near-solid leading, a breath of negative tracking. Title case,
967
+ never uppercase — placards do the small-caps work. */
968
+ [data-dialect='named'][data-template='gallery'] h1,
969
+ [data-dialect='named'][data-template='gallery'] h2 {
970
+ font-weight: 560;
971
+ letter-spacing: -0.02em;
972
+ line-height: 0.98;
973
+ }
974
+
975
+ /* The display voice, on demand (prices, the wordmark, catalogue numbers). */
976
+ [data-dialect='named'][data-template='gallery'] .gal-display {
977
+ font-family: var(--font-display);
978
+ }
979
+
980
+ /* Museum placard label — small-caps register built from uppercase + wide
981
+ tracking (Inter carries no true smcp; synthesis reads cheap). */
982
+ [data-dialect='named'][data-template='gallery'] .gal-label {
983
+ font-size: 0.6875rem;
984
+ font-weight: 500;
985
+ letter-spacing: 0.18em;
986
+ text-transform: uppercase;
987
+ line-height: 1.5;
988
+ }
989
+
990
+ /* Catalogue number — "No. 3" in the display face, lining figures. */
991
+ [data-dialect='named'][data-template='gallery'] .gal-no {
992
+ font-family: var(--font-display);
993
+ font-weight: 500;
994
+ letter-spacing: 0.02em;
995
+ font-variant-numeric: lining-nums tabular-nums;
996
+ }
997
+
998
+ /* The spotlight pool — the dark gallery's lighting model. By day the room
999
+ is evenly lit, so the class renders nothing; after dark a soft bone wash
1000
+ falls from above each work. A lighting effect on the wall, not a panel
1001
+ treatment (no blur, no glass). */