@mdxui/named 7.0.0 → 8.1.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/components/index.d.ts +3 -1
- package/dist/components/index.js +240 -198
- package/dist/components/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +242 -345
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.js +2 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/shared/index.d.ts +46 -35
- package/dist/shared/index.js +99 -208
- package/dist/shared/index.js.map +1 -1
- package/dist/styles.css +809 -13
- package/dist/view/index.d.ts +12 -4
- package/dist/view/index.js +1528 -217
- package/dist/view/index.js.map +1 -1
- package/package.json +7 -6
package/dist/styles.css
CHANGED
|
@@ -53,11 +53,13 @@
|
|
|
53
53
|
*/
|
|
54
54
|
|
|
55
55
|
/* ──────────────────────────────────────────────────────────────────
|
|
56
|
-
FONTS — Halant (serif display) +
|
|
57
|
-
The baseline loads
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
FONTS — Halant (serif display) + Inter (body), self-contained.
|
|
57
|
+
The baseline loads both via next/font (app/layout.tsx: Halant for h1/h2
|
|
58
|
+
display, Inter for body — Hanken Grotesk / Instrument Sans are loaded there
|
|
59
|
+
too but referenced nowhere). The package can't rely on the host loading
|
|
60
|
+
either, so the envelope ships both via @font-face (Google Fonts woff2).
|
|
61
|
+
@font-face has no ordering constraint (unlike @import url()), so it is safe
|
|
62
|
+
to drop anywhere in the consumer's entry.
|
|
61
63
|
────────────────────────────────────────────────────────────────── */
|
|
62
64
|
@font-face {
|
|
63
65
|
font-family: 'Halant';
|
|
@@ -115,12 +117,15 @@
|
|
|
115
117
|
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
116
118
|
}
|
|
117
119
|
@font-face {
|
|
118
|
-
font-family: '
|
|
120
|
+
font-family: 'Inter';
|
|
119
121
|
font-style: normal;
|
|
120
|
-
font-weight:
|
|
122
|
+
font-weight: 100 900;
|
|
121
123
|
font-display: swap;
|
|
122
|
-
src: url('https://fonts.gstatic.com/s/
|
|
124
|
+
src: url('https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2')
|
|
123
125
|
format('woff2');
|
|
126
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
127
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
|
|
128
|
+
U+2212, U+2215, U+FEFF, U+FFFD;
|
|
124
129
|
}
|
|
125
130
|
|
|
126
131
|
/* ──────────────────────────────────────────────────────────────────
|
|
@@ -210,20 +215,182 @@
|
|
|
210
215
|
--radius-section: 36px; /* large section containers */
|
|
211
216
|
--radius-image: 64px; /* hero artwork mask */
|
|
212
217
|
|
|
213
|
-
/* ----
|
|
218
|
+
/* ---- radius scale — stock Tailwind v4 ------------------------------ */
|
|
219
|
+
/* The baseline runs Tailwind's default radius scale (rounded-3xl = 1.5rem
|
|
220
|
+
cards, rounded-xl chips, rounded-md input). Host theme layers remap
|
|
221
|
+
--radius-{sm..3xl} as multiples of the preset's --radius (e.g. clay's
|
|
222
|
+
0.75rem makes rounded-3xl render 36px instead of 24px), so pin the
|
|
223
|
+
defaults inside the scope. Hosts that remap via `@theme inline` bake
|
|
224
|
+
`calc(var(--radius) * N)` into the utilities — the multipliers anchor on
|
|
225
|
+
lg = --radius, so pinning --radius to stock lg (0.5rem) reproduces the
|
|
226
|
+
whole default scale; the explicit --radius-* pins cover hosts whose
|
|
227
|
+
utilities read the scale tokens directly. --radius-section/-image above
|
|
228
|
+
stay the baseline's own additions. */
|
|
229
|
+
--radius: 0.5rem;
|
|
230
|
+
--radius-xs: 0.125rem;
|
|
231
|
+
--radius-sm: 0.25rem;
|
|
232
|
+
--radius-md: 0.375rem;
|
|
233
|
+
--radius-lg: 0.5rem;
|
|
234
|
+
--radius-xl: 0.75rem;
|
|
235
|
+
--radius-2xl: 1rem;
|
|
236
|
+
--radius-3xl: 1.5rem;
|
|
237
|
+
--radius-4xl: 2rem;
|
|
238
|
+
|
|
239
|
+
/* ---- shadows — neutral black (Tailwind v4 defaults) ---------------- */
|
|
240
|
+
/* The baseline runs stock Tailwind shadows. Host theme presets re-point
|
|
241
|
+
the --shadow-* tokens (e.g. clay's warm oklch(0.35 0.08 40) tint +
|
|
242
|
+
different geometry), and Tailwind's shadow-{sm,md,lg} utilities read
|
|
243
|
+
them — so without this pin, button/card shadows inside the named scope
|
|
244
|
+
pick up the host's tint. */
|
|
245
|
+
--shadow-2xs: 0 1px rgb(0 0 0 / 0.05);
|
|
246
|
+
--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
247
|
+
--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
248
|
+
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
249
|
+
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
250
|
+
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
|
|
251
|
+
--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
|
|
252
|
+
|
|
253
|
+
/* ---- fonts — Halant display, Inter body ---------------------------- */
|
|
254
|
+
/* NOTE: do NOT write `--font-inter: var(--font-inter, …)` here — a custom
|
|
255
|
+
property referencing itself is a cycle, invalid at computed-value time,
|
|
256
|
+
and it voids every declaration that var()s it (the body font silently
|
|
257
|
+
fell back to the host font). Reference the host's token only at the
|
|
258
|
+
use site, with the packaged Inter as the var() fallback. */
|
|
214
259
|
--font-halant: 'Halant', ui-serif, Georgia, serif;
|
|
215
|
-
|
|
260
|
+
/* Template indirection: the shared h1/h2 + .font-halant rules read
|
|
261
|
+
--font-display, so other templates (executive) swap the display face by
|
|
262
|
+
re-pointing ONE token instead of fighting these rules' specificity. */
|
|
263
|
+
--font-display: var(--font-halant);
|
|
216
264
|
|
|
217
265
|
/* Paint the named surface cream + warm ink, independent of the host's
|
|
218
266
|
dark page, so the editorial sections read on cream. */
|
|
219
267
|
background: var(--color-surface);
|
|
220
268
|
color: var(--color-fg);
|
|
221
|
-
font-family:
|
|
269
|
+
font-family: var(--font-inter, 'Inter'), system-ui, -apple-system, sans-serif;
|
|
222
270
|
-webkit-font-smoothing: antialiased;
|
|
223
271
|
-moz-osx-font-smoothing: grayscale;
|
|
224
272
|
text-rendering: optimizeLegibility;
|
|
225
273
|
}
|
|
226
274
|
|
|
275
|
+
/* ──────────────────────────────────────────────────────────────────
|
|
276
|
+
ANCHOR-SCROLL POLISH (baseline globals.css): smooth scrolling for the
|
|
277
|
+
navbar's #features/#pricing/#faq jumps + clearance so the sticky nav
|
|
278
|
+
doesn't cover the section heading on arrival. `html` can't sit under the
|
|
279
|
+
dialect scope, so the smooth rule is gated with :has() — a no-op on
|
|
280
|
+
pages that don't render the named arc.
|
|
281
|
+
────────────────────────────────────────────────────────────────── */
|
|
282
|
+
html:has([data-dialect='named']) {
|
|
283
|
+
scroll-behavior: smooth;
|
|
284
|
+
}
|
|
285
|
+
[data-dialect='named'] section[id] {
|
|
286
|
+
scroll-margin-top: 80px;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/* ──────────────────────────────────────────────────────────────────
|
|
290
|
+
DARK MODE — the baseline's Anthropic-calm dark set (globals.css `.dark`,
|
|
291
|
+
verbatim): warm near-black surfaces, cream ink, the primary CTA gradient
|
|
292
|
+
inverted to cream-on-dark, hue library re-tuned with hue angles preserved.
|
|
293
|
+
Activated by the host's `.dark` class (DialectShell's <Site mode="dark">
|
|
294
|
+
sets it on an ancestor). The persona accent mapping (--color-accent-*)
|
|
295
|
+
cascades from the light block via var() — re-declaring the --hue-* values
|
|
296
|
+
here is enough, exactly like the baseline.
|
|
297
|
+
────────────────────────────────────────────────────────────────── */
|
|
298
|
+
.dark [data-dialect='named'],
|
|
299
|
+
[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);
|
|
342
|
+
|
|
343
|
+
/* ---- hue library, dark values (hue angles preserved) --------------- */
|
|
344
|
+
--hue-teal-soft: oklch(0.245 0.025 210);
|
|
345
|
+
--hue-teal-medium: oklch(0.33 0.06 210);
|
|
346
|
+
--hue-teal-strong: oklch(0.65 0.09 210);
|
|
347
|
+
|
|
348
|
+
--hue-orange-soft: oklch(0.245 0.04 48);
|
|
349
|
+
--hue-orange-medium: oklch(0.335 0.09 45);
|
|
350
|
+
--hue-orange-strong: oklch(0.72 0.15 50);
|
|
351
|
+
|
|
352
|
+
--hue-green-soft: oklch(0.245 0.035 134);
|
|
353
|
+
--hue-green-medium: oklch(0.33 0.075 134);
|
|
354
|
+
--hue-green-strong: oklch(0.73 0.14 134);
|
|
355
|
+
|
|
356
|
+
--hue-sky-blue-soft: oklch(0.245 0.035 235);
|
|
357
|
+
--hue-sky-blue-medium: oklch(0.33 0.075 235);
|
|
358
|
+
--hue-sky-blue-strong: oklch(0.73 0.14 235);
|
|
359
|
+
|
|
360
|
+
--hue-purple-soft: oklch(0.245 0.03 314);
|
|
361
|
+
--hue-purple-medium: oklch(0.33 0.07 314);
|
|
362
|
+
--hue-purple-strong: oklch(0.73 0.125 314);
|
|
363
|
+
}
|
|
364
|
+
|
|
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
|
+
/* Baseline `.dark .integration-square-shadow` (globals.css) */
|
|
388
|
+
.dark [data-dialect='named'] .integration-square-shadow,
|
|
389
|
+
[data-dialect='named'].dark .integration-square-shadow {
|
|
390
|
+
box-shadow: 0px 0px 0px 1px var(--color-border),
|
|
391
|
+
0px 1px 3px 0px rgba(0, 0, 0, 0.3);
|
|
392
|
+
}
|
|
393
|
+
|
|
227
394
|
/* ════════════════════════════════════════════════════════════════════
|
|
228
395
|
NEO UTILITIES — scoped class rules.
|
|
229
396
|
Every neo utility the named markup references, defined under the subtree so
|
|
@@ -231,9 +398,20 @@
|
|
|
231
398
|
the cream baseline values.
|
|
232
399
|
════════════════════════════════════════════════════════════════════ */
|
|
233
400
|
|
|
234
|
-
/* ——
|
|
401
|
+
/* —— Display face (baseline `font-halant`; reads the template-indirected
|
|
402
|
+
--font-display so non-studio templates can swap it) ——————————————— */
|
|
235
403
|
[data-dialect='named'] .font-halant {
|
|
236
|
-
font-family: var(--font-halant);
|
|
404
|
+
font-family: var(--font-display, var(--font-halant));
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* Baseline @layer base rule (globals.css): every section-level heading gets
|
|
408
|
+
the display treatment; h3 and below stay on the body sans. Scoped here
|
|
409
|
+
so components only specify size + variant, exactly like the baseline. */
|
|
410
|
+
[data-dialect='named'] h1,
|
|
411
|
+
[data-dialect='named'] h2 {
|
|
412
|
+
font-family: var(--font-display, var(--font-halant));
|
|
413
|
+
font-weight: 400;
|
|
414
|
+
line-height: 1.1;
|
|
237
415
|
}
|
|
238
416
|
|
|
239
417
|
/* —— Backgrounds —————————————————————————————————————————————————— */
|
|
@@ -290,6 +468,16 @@
|
|
|
290
468
|
}
|
|
291
469
|
|
|
292
470
|
/* —— Custom utilities the baseline markup relies on ———————————————— */
|
|
471
|
+
/* Primary CTA gradient (baseline @utility btn-gradient-dark) — the shared
|
|
472
|
+
Button's `default` variant. Token-driven so a persona re-pointing the
|
|
473
|
+
--color-btn-primary-* endpoints restyles every primary button at once. */
|
|
474
|
+
[data-dialect='named'] .btn-gradient-dark {
|
|
475
|
+
background: linear-gradient(
|
|
476
|
+
180deg,
|
|
477
|
+
var(--color-btn-primary-from) 0%,
|
|
478
|
+
var(--color-btn-primary-to) 100%
|
|
479
|
+
);
|
|
480
|
+
}
|
|
293
481
|
[data-dialect='named'] .card-shadow {
|
|
294
482
|
box-shadow: 0px 0.602px 0.602px -1.25px rgba(0, 0, 0, 0.36),
|
|
295
483
|
0px 2.289px 2.289px -2.5px rgba(0, 0, 0, 0.32),
|
|
@@ -317,3 +505,611 @@
|
|
|
317
505
|
transparent 83.55%
|
|
318
506
|
);
|
|
319
507
|
}
|
|
508
|
+
|
|
509
|
+
/* —— CodeWindow (shiki) ———————————————————————————————————————————— */
|
|
510
|
+
/* The template's panel owns the surface; shiki's theme background must not
|
|
511
|
+
fight it. Scoped under the dialect attr so it covers every template. */
|
|
512
|
+
[data-dialect='named'] .shiki {
|
|
513
|
+
background-color: transparent !important;
|
|
514
|
+
margin: 0;
|
|
515
|
+
font-size: inherit;
|
|
516
|
+
line-height: inherit;
|
|
517
|
+
white-space: pre;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/* —— Marquee animation (hero tool strip) ——————————————————————————— */
|
|
521
|
+
/* The baseline defines these as `--animate-marquee` + @keyframes inside its
|
|
522
|
+
Tailwind @theme block — host builds that don't replicate that theme key
|
|
523
|
+
never generate the `animate-marquee` utility, leaving the strip frozen.
|
|
524
|
+
Ship them here. Keyframe names are global, so they carry a `named-` prefix
|
|
525
|
+
to stay collision-free; the class rules are scoped like everything else.
|
|
526
|
+
The shared Marquee component sets `--duration`/`--gap` inline. */
|
|
527
|
+
@keyframes named-marquee {
|
|
528
|
+
from {
|
|
529
|
+
transform: translateX(0);
|
|
530
|
+
}
|
|
531
|
+
to {
|
|
532
|
+
transform: translateX(calc(-100% - var(--gap)));
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
@keyframes named-marquee-vertical {
|
|
536
|
+
from {
|
|
537
|
+
transform: translateY(0);
|
|
538
|
+
}
|
|
539
|
+
to {
|
|
540
|
+
transform: translateY(calc(-100% - var(--gap)));
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
[data-dialect='named'] .animate-marquee {
|
|
544
|
+
animation: named-marquee var(--duration, 40s) linear infinite;
|
|
545
|
+
}
|
|
546
|
+
[data-dialect='named'] .animate-marquee-vertical {
|
|
547
|
+
animation: named-marquee-vertical var(--duration, 40s) linear infinite;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* @mdxui/named — EXECUTIVE template envelope ("Ledger Paper")
|
|
553
|
+
* ============================================================================
|
|
554
|
+
*
|
|
555
|
+
* The professional register of the named dialect ("Your AI CFO"): cool paper
|
|
556
|
+
* white + graphite ink, hairline rules as the structural language (no cards,
|
|
557
|
+
* no shadows), 2px corners, tabular numerals on every figure, and a single
|
|
558
|
+
* oxblood accent reserved for the primary CTA and key figures (Restrained
|
|
559
|
+
* color strategy — the accent stays under 10% of the surface).
|
|
560
|
+
*
|
|
561
|
+
* Scene: a founder or COO at a laptop in daylight, skeptical, deciding
|
|
562
|
+
* whether to hand their books to an AI agent. Light theme; rigor over vibes.
|
|
563
|
+
* Deliberately NOT navy-and-gold and NOT terminal-dark — both are the
|
|
564
|
+
* category reflexes for "finance".
|
|
565
|
+
*
|
|
566
|
+
* SCOPING — this block rides ON TOP of the studio envelope. The view renders
|
|
567
|
+
* `data-dialect="named" data-template="executive"`, so studio's bare
|
|
568
|
+
* `[data-dialect='named']` token block still matches; this selector's higher
|
|
569
|
+
* specificity (two attributes) re-points every token the executive subtree
|
|
570
|
+
* reads. Studio's scoped utility rules (.bg-background etc.) are var-driven,
|
|
571
|
+
* so they resolve to executive values here too — but executive markup writes
|
|
572
|
+
* arbitrary-value classes (`bg-(--color-surface)`) and avoids studio's
|
|
573
|
+
* literal-value utilities. Concatenated AFTER studio in dist/styles.css, so
|
|
574
|
+
* on specificity ties (e.g. studio's `.dark` block) executive wins: the
|
|
575
|
+
* dark block below restyles the ledger for ink (oxblood lifted luminous).
|
|
576
|
+
*/
|
|
577
|
+
|
|
578
|
+
/* Masthead/display face — Anton (black condensed grotesque; the cover voice).
|
|
579
|
+
Source Serif 4 survives only as the italic standfirst counter-voice. Inter
|
|
580
|
+
body ships from the studio block of the same stylesheet. */
|
|
581
|
+
@font-face {
|
|
582
|
+
font-family: 'Anton';
|
|
583
|
+
font-style: normal;
|
|
584
|
+
font-weight: 400;
|
|
585
|
+
font-display: swap;
|
|
586
|
+
src: url('https://fonts.gstatic.com/s/anton/v27/1Ptgg87LROyAm3Kz-C8CSKlv.woff2')
|
|
587
|
+
format('woff2');
|
|
588
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
589
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
|
|
590
|
+
U+2212, U+2215, U+FEFF, U+FFFD;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/* Standfirst face — Source Serif 4 (variable weight, latin, + true italic). */
|
|
594
|
+
@font-face {
|
|
595
|
+
font-family: 'Source Serif 4';
|
|
596
|
+
font-style: normal;
|
|
597
|
+
font-weight: 200 900;
|
|
598
|
+
font-display: swap;
|
|
599
|
+
src: url('https://fonts.gstatic.com/s/sourceserif4/v14/vEFI2_tTDB4M7-auWDN0ahZJW1gb8te1Xb7G.woff2')
|
|
600
|
+
format('woff2');
|
|
601
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
602
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
|
|
603
|
+
U+2212, U+2215, U+FEFF, U+FFFD;
|
|
604
|
+
}
|
|
605
|
+
/* True italic — the hero standfirst is set in it; a synthesized slant on a
|
|
606
|
+
serif reads cheap, which defeats the standfirst's whole job. */
|
|
607
|
+
@font-face {
|
|
608
|
+
font-family: 'Source Serif 4';
|
|
609
|
+
font-style: italic;
|
|
610
|
+
font-weight: 200 900;
|
|
611
|
+
font-display: swap;
|
|
612
|
+
src: url('https://fonts.gstatic.com/s/sourceserif4/v14/vEFK2_tTDB4M7-auWDN0ahZJW1gewtW_WpzEpMs.woff2')
|
|
613
|
+
format('woff2');
|
|
614
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
615
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
|
|
616
|
+
U+2212, U+2215, U+FEFF, U+FFFD;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
[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);
|
|
676
|
+
|
|
677
|
+
/* ---- geometry: square document corners, flat surfaces ---------------- */
|
|
678
|
+
/* 2px everywhere a radius utility appears (--radius anchors the host's
|
|
679
|
+
@theme-inline multipliers; see the studio block for the mechanism). */
|
|
680
|
+
--radius: 0.125rem;
|
|
681
|
+
--radius-xs: 0.125rem;
|
|
682
|
+
--radius-sm: 0.125rem;
|
|
683
|
+
--radius-md: 0.125rem;
|
|
684
|
+
--radius-lg: 0.125rem;
|
|
685
|
+
--radius-xl: 0.25rem;
|
|
686
|
+
--radius-2xl: 0.25rem;
|
|
687
|
+
--radius-3xl: 0.25rem;
|
|
688
|
+
--radius-4xl: 0.25rem;
|
|
689
|
+
--radius-section: 0px;
|
|
690
|
+
--radius-image: 2px;
|
|
691
|
+
|
|
692
|
+
/* no elevation — hairlines do the separating */
|
|
693
|
+
--shadow-2xs: 0 0 #0000;
|
|
694
|
+
--shadow-xs: 0 0 #0000;
|
|
695
|
+
--shadow-sm: 0 0 #0000;
|
|
696
|
+
--shadow-md: 0 0 #0000;
|
|
697
|
+
--shadow-lg: 0 0 #0000;
|
|
698
|
+
--shadow-xl: 0 0 #0000;
|
|
699
|
+
--shadow-2xl: 0 0 #0000;
|
|
700
|
+
|
|
701
|
+
/* ---- type ------------------------------------------------------------ */
|
|
702
|
+
/* Display = Anton (masthead, headings, the giant numerals). The serif is
|
|
703
|
+
demoted to the standfirst counter-voice via .exec-serif. */
|
|
704
|
+
--font-display: 'Anton', 'Arial Narrow', sans-serif;
|
|
705
|
+
--font-serif-exec: 'Source Serif 4', ui-serif, Georgia, serif;
|
|
706
|
+
|
|
707
|
+
background: var(--color-surface);
|
|
708
|
+
color: var(--color-fg);
|
|
709
|
+
font-family: var(--font-inter, 'Inter'), system-ui, -apple-system, sans-serif;
|
|
710
|
+
-webkit-font-smoothing: antialiased;
|
|
711
|
+
-moz-osx-font-smoothing: grayscale;
|
|
712
|
+
text-rendering: optimizeLegibility;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/* ──────────────────────────────────────────────────────────────────
|
|
716
|
+
DARK MODE — the ledger after hours: deep cool ink surfaces, paper type,
|
|
717
|
+
and the oxblood LIFTED to a luminous brick (the light-mode 0.42 L red
|
|
718
|
+
would die on ink). Everything var-driven inverts automatically — notably
|
|
719
|
+
the closing CTA band (bg --color-fg / text --color-surface) flips from
|
|
720
|
+
ink-band-on-paper to paper-band-on-ink: the bookend follows the theme.
|
|
721
|
+
Activated by the host's `.dark` class (DialectShell's <Site mode="dark">).
|
|
722
|
+
Higher specificity (3 selectors) than both the executive light block and
|
|
723
|
+
studio's dark block.
|
|
724
|
+
────────────────────────────────────────────────────────────────── */
|
|
725
|
+
.dark [data-dialect='named'][data-template='executive'],
|
|
726
|
+
[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);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/* Display headings: the shared h1/h2 rule supplies var(--font-display) →
|
|
779
|
+
Anton here. Anton is a single-cut black condensed grotesque: uppercase,
|
|
780
|
+
near-solid leading, a touch of positive tracking so large settings don't
|
|
781
|
+
weld together. */
|
|
782
|
+
[data-dialect='named'][data-template='executive'] h1,
|
|
783
|
+
[data-dialect='named'][data-template='executive'] h2 {
|
|
784
|
+
font-weight: 400;
|
|
785
|
+
text-transform: uppercase;
|
|
786
|
+
letter-spacing: 0.01em;
|
|
787
|
+
line-height: 0.92;
|
|
788
|
+
font-variant-numeric: lining-nums;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
/* The standfirst counter-voice (true italic ships above). */
|
|
792
|
+
[data-dialect='named'][data-template='executive'] .exec-serif {
|
|
793
|
+
font-family: var(--font-serif-exec);
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
/* Figures (prices, indices) read as ledger entries everywhere. */
|
|
797
|
+
[data-dialect='named'][data-template='executive'] .exec-figure {
|
|
798
|
+
font-variant-numeric: tabular-nums lining-nums;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
/* The ledger closing signature: a double rule (totals row). */
|
|
802
|
+
[data-dialect='named'][data-template='executive'] .exec-double-rule {
|
|
803
|
+
border-top: 2px solid var(--color-border-strong);
|
|
804
|
+
position: relative;
|
|
805
|
+
}
|
|
806
|
+
[data-dialect='named'][data-template='executive'] .exec-double-rule::after {
|
|
807
|
+
content: '';
|
|
808
|
+
position: absolute;
|
|
809
|
+
top: 3px;
|
|
810
|
+
left: 0;
|
|
811
|
+
right: 0;
|
|
812
|
+
border-top: 1px solid var(--color-border);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/**
|
|
816
|
+
* @mdxui/named — GALLERY template envelope ("The Evening Gallery")
|
|
817
|
+
* ============================================================================
|
|
818
|
+
*
|
|
819
|
+
* The museum register of the named dialect: the page is an exhibition
|
|
820
|
+
* catalogue for a singular talent. Scene: an evening visitor moving alone
|
|
821
|
+
* through a dim gallery — warm near-black walls, each capability hung as a
|
|
822
|
+
* spot-lit work with its bone placard beside it, one Klein-blue wall at the
|
|
823
|
+
* end of the walk.
|
|
824
|
+
*
|
|
825
|
+
* LIGHT MODE IS THE DAY GALLERY, not an inversion: bone plaster walls under
|
|
826
|
+
* even daylight, the SAME placard system (placards are physical bone cards —
|
|
827
|
+
* they keep their material in both modes), the vitrines keep their dark
|
|
828
|
+
* velvet interiors, and the ultramarine holds. Dark mode dims the walls to
|
|
829
|
+
* warm near-black; the placards and vitrines read as lit objects by contrast
|
|
830
|
+
* alone.
|
|
831
|
+
*
|
|
832
|
+
* Color strategy: RESTRAINED — vast warm-neutral emptiness; one saturated
|
|
833
|
+
* accent (electric ultramarine, the International-Klein-Blue register of
|
|
834
|
+
* gallery walls) held under ~10% of the surface: catalogue numbers, the
|
|
835
|
+
* primary action, and the single painted wall of the closing room.
|
|
836
|
+
* Deliberately NOT gold/amber, NOT neon, NOT terminal-dark.
|
|
837
|
+
*
|
|
838
|
+
* SCOPING — rides on top of the studio envelope exactly like executive: the
|
|
839
|
+
* view renders `data-dialect="named" data-template="gallery"`, so studio's
|
|
840
|
+
* bare `[data-dialect='named']` block still matches and this two-attribute
|
|
841
|
+
* selector re-points every token the gallery subtree reads. The dark block
|
|
842
|
+
* below (3 selectors) outranks both this block and studio's `.dark` block.
|
|
843
|
+
*/
|
|
844
|
+
|
|
845
|
+
/* Display face — Bricolage Grotesque (variable 200–800, optical sizes 12–96):
|
|
846
|
+
a grotesque with flare cuts and real presence at exhibition-title sizes,
|
|
847
|
+
nothing like Halant's serif or Anton's condensed shout. Inter body ships
|
|
848
|
+
from the studio block of the same stylesheet. */
|
|
849
|
+
@font-face {
|
|
850
|
+
font-family: 'Bricolage Grotesque';
|
|
851
|
+
font-style: normal;
|
|
852
|
+
font-weight: 200 800;
|
|
853
|
+
font-stretch: 100%;
|
|
854
|
+
font-display: swap;
|
|
855
|
+
src: url('https://fonts.gstatic.com/s/bricolagegrotesque/v9/3y9K6as8bTXq_nANBjzKo3IeZx8z6up5BeSl9D4dj_x9PpZBMlGIInHWVyNJ.woff2')
|
|
856
|
+
format('woff2');
|
|
857
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
|
|
858
|
+
U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
|
|
859
|
+
U+2212, U+2215, U+FEFF, U+FFFD;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
[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);
|
|
931
|
+
|
|
932
|
+
/* ---- geometry: crisp frames, gently eased placard corners ------------ */
|
|
933
|
+
/* 4px base (--radius anchors the host's @theme-inline multipliers; see
|
|
934
|
+
the studio block for the mechanism). Frames and vitrines are sharp by
|
|
935
|
+
component class; placards take the soft 4px of a die-cut card. */
|
|
936
|
+
--radius: 0.25rem;
|
|
937
|
+
--radius-xs: 0.125rem;
|
|
938
|
+
--radius-sm: 0.1875rem;
|
|
939
|
+
--radius-md: 0.25rem;
|
|
940
|
+
--radius-lg: 0.25rem;
|
|
941
|
+
--radius-xl: 0.375rem;
|
|
942
|
+
--radius-2xl: 0.5rem;
|
|
943
|
+
--radius-3xl: 0.5rem;
|
|
944
|
+
--radius-4xl: 0.5rem;
|
|
945
|
+
--radius-section: 0px;
|
|
946
|
+
--radius-image: 4px;
|
|
947
|
+
|
|
948
|
+
/* ---- elevation: museum light --------------------------------------- */
|
|
949
|
+
/* Placards and vitrines cast soft warm shadows (objects under daylight);
|
|
950
|
+
warm-black tint so the shadow belongs to the room, not to a screen. */
|
|
951
|
+
--shadow-2xs: 0 1px 1px oklch(0.15 0.012 48 / 0.05);
|
|
952
|
+
--shadow-xs: 0 1px 2px oklch(0.15 0.012 48 / 0.06);
|
|
953
|
+
--shadow-sm: 0 1px 3px oklch(0.15 0.012 48 / 0.08),
|
|
954
|
+
0 1px 2px -1px oklch(0.15 0.012 48 / 0.08);
|
|
955
|
+
--shadow-md: 0 6px 16px -6px oklch(0.15 0.012 48 / 0.14),
|
|
956
|
+
0 2px 4px -2px oklch(0.15 0.012 48 / 0.08);
|
|
957
|
+
--shadow-lg: 0 18px 40px -16px oklch(0.15 0.012 48 / 0.2),
|
|
958
|
+
0 4px 10px -6px oklch(0.15 0.012 48 / 0.1);
|
|
959
|
+
--shadow-xl: 0 28px 56px -20px oklch(0.15 0.012 48 / 0.26);
|
|
960
|
+
--shadow-2xl: 0 36px 72px -24px oklch(0.15 0.012 48 / 0.32);
|
|
961
|
+
|
|
962
|
+
/* ---- type ------------------------------------------------------------ */
|
|
963
|
+
/* Display = Bricolage Grotesque (exhibition titles, catalogue numbers,
|
|
964
|
+
prices). Body stays on the inherited Inter. */
|
|
965
|
+
--font-display: 'Bricolage Grotesque', 'Avenir Next', system-ui, sans-serif;
|
|
966
|
+
|
|
967
|
+
background: var(--color-surface);
|
|
968
|
+
color: var(--color-fg);
|
|
969
|
+
font-family: var(--font-inter, 'Inter'), system-ui, -apple-system, sans-serif;
|
|
970
|
+
-webkit-font-smoothing: antialiased;
|
|
971
|
+
-moz-osx-font-smoothing: grayscale;
|
|
972
|
+
text-rendering: optimizeLegibility;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/* The hero's light wash — dark mode only, FULL WIDTH of the hero (inset 0,
|
|
976
|
+
never a negative-offset box): one warm pool falling from the top of the
|
|
977
|
+
wall, fading out before the ticker rule. */
|
|
978
|
+
[data-dialect='named'][data-template='gallery'] .gal-wash {
|
|
979
|
+
position: relative;
|
|
980
|
+
}
|
|
981
|
+
.dark [data-dialect='named'][data-template='gallery'] .gal-wash::before,
|
|
982
|
+
[data-dialect='named'][data-template='gallery'].dark .gal-wash::before {
|
|
983
|
+
content: '';
|
|
984
|
+
position: absolute;
|
|
985
|
+
inset: 0;
|
|
986
|
+
pointer-events: none;
|
|
987
|
+
background: radial-gradient(
|
|
988
|
+
120% 100% at 50% 0%,
|
|
989
|
+
oklch(0.93 0.01 80 / 0.08),
|
|
990
|
+
transparent 58%
|
|
991
|
+
);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
/* ──────────────────────────────────────────────────────────────────
|
|
995
|
+
DARK MODE — the evening gallery, the design's namesake. Warm near-black
|
|
996
|
+
walls (NOT cool terminal black), bone type. The placard keeps its
|
|
997
|
+
bone card material — a lit object on a dark wall — and the vitrine keeps
|
|
998
|
+
its velvet interior, now a step deeper than the room. Ultramarine splits
|
|
999
|
+
by role: painted fields stay deep IKB, type lifts to read on the dark.
|
|
1000
|
+
Activated by the host's `.dark` class (DialectShell's <Site mode="dark">).
|
|
1001
|
+
────────────────────────────────────────────────────────────────── */
|
|
1002
|
+
.dark [data-dialect='named'][data-template='gallery'],
|
|
1003
|
+
[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);
|
|
1065
|
+
|
|
1066
|
+
/* shadows deepen after dark — spotlit objects throw real penumbrae */
|
|
1067
|
+
--shadow-sm: 0 1px 3px oklch(0.08 0.008 45 / 0.3),
|
|
1068
|
+
0 1px 2px -1px oklch(0.08 0.008 45 / 0.3);
|
|
1069
|
+
--shadow-md: 0 8px 20px -8px oklch(0.08 0.008 45 / 0.5),
|
|
1070
|
+
0 2px 6px -2px oklch(0.08 0.008 45 / 0.35);
|
|
1071
|
+
--shadow-lg: 0 22px 48px -18px oklch(0.08 0.008 45 / 0.6),
|
|
1072
|
+
0 6px 14px -8px oklch(0.08 0.008 45 / 0.4);
|
|
1073
|
+
--shadow-xl: 0 32px 64px -22px oklch(0.08 0.008 45 / 0.65);
|
|
1074
|
+
--shadow-2xl: 0 40px 80px -26px oklch(0.08 0.008 45 / 0.7);
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
/* Display headings: the shared h1/h2 rule supplies var(--font-display) →
|
|
1078
|
+
Bricolage Grotesque here. Exhibition titles set tight and confident —
|
|
1079
|
+
medium weight (the variable cut around 560 has the flare without the
|
|
1080
|
+
shout), near-solid leading, a breath of negative tracking. Title case,
|
|
1081
|
+
never uppercase — placards do the small-caps work. */
|
|
1082
|
+
[data-dialect='named'][data-template='gallery'] h1,
|
|
1083
|
+
[data-dialect='named'][data-template='gallery'] h2 {
|
|
1084
|
+
font-weight: 560;
|
|
1085
|
+
letter-spacing: -0.02em;
|
|
1086
|
+
line-height: 0.98;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
/* The display voice, on demand (prices, the wordmark, catalogue numbers). */
|
|
1090
|
+
[data-dialect='named'][data-template='gallery'] .gal-display {
|
|
1091
|
+
font-family: var(--font-display);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
/* Museum placard label — small-caps register built from uppercase + wide
|
|
1095
|
+
tracking (Inter carries no true smcp; synthesis reads cheap). */
|
|
1096
|
+
[data-dialect='named'][data-template='gallery'] .gal-label {
|
|
1097
|
+
font-size: 0.6875rem;
|
|
1098
|
+
font-weight: 500;
|
|
1099
|
+
letter-spacing: 0.18em;
|
|
1100
|
+
text-transform: uppercase;
|
|
1101
|
+
line-height: 1.5;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
/* Catalogue number — "No. 3" in the display face, lining figures. */
|
|
1105
|
+
[data-dialect='named'][data-template='gallery'] .gal-no {
|
|
1106
|
+
font-family: var(--font-display);
|
|
1107
|
+
font-weight: 500;
|
|
1108
|
+
letter-spacing: 0.02em;
|
|
1109
|
+
font-variant-numeric: lining-nums tabular-nums;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
/* The spotlight pool — the dark gallery's lighting model. By day the room
|
|
1113
|
+
is evenly lit, so the class renders nothing; after dark a soft bone wash
|
|
1114
|
+
falls from above each work. A lighting effect on the wall, not a panel
|
|
1115
|
+
treatment (no blur, no glass). */
|