@mdxui/named 7.0.0 → 8.0.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
@@ -53,11 +53,13 @@
53
53
  */
54
54
 
55
55
  /* ──────────────────────────────────────────────────────────────────
56
- FONTS — Halant (serif display) + Atkinson Hyperlegible, self-contained.
57
- The baseline loads Halant via next/font and Atkinson via @font-face. The
58
- package can't rely on the host loading either, so the envelope ships both via
59
- @font-face (Google Fonts woff2). @font-face has no ordering constraint
60
- (unlike @import url()), so it is safe to drop anywhere in the consumer's entry.
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: 'Atkinson Hyperlegible';
120
+ font-family: 'Inter';
119
121
  font-style: normal;
120
- font-weight: 400 700;
122
+ font-weight: 100 900;
121
123
  font-display: swap;
122
- src: url('https://fonts.gstatic.com/s/atkinsonhyperlegiblenext/v7/NaPNcYPdHfdVxJw0IfIP0lvYFqijb-UxCtm5_wdGseiJn3o.woff2')
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
- /* ---- fontsHalant display, Atkinson/Inter body ------------------ */
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
- --font-inter: var(--font-inter, 'Atkinson Hyperlegible', system-ui, sans-serif);
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: 'Atkinson Hyperlegible', var(--font-inter), system-ui, sans-serif;
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
- /* —— Serif display face (baseline `font-halant`) ——————————————————— */
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,309 @@
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
+ }
@@ -33,6 +33,10 @@ type NamedAgentFeature = {
33
33
  text: string;
34
34
  }[];
35
35
  code: string;
36
+ /** Shiki language id for the code window. Optional — the persona DSL is
37
+ * valid TypeScript, which is the default; the cascade may emit any
38
+ * language per agent (python, sql, yaml, …). */
39
+ language?: string;
36
40
  badge: string;
37
41
  };
38
42
  type NamedAgentFeatures = {
@@ -40,7 +44,7 @@ type NamedAgentFeatures = {
40
44
  description: string;
41
45
  features: NamedAgentFeature[];
42
46
  };
43
- /** Pricing — Pricing1 (single tier) vs Pricing2 (multi-tier) fork, discriminated
47
+ /** Pricing — single-tier vs multi-tier fork, discriminated
44
48
  * on `variant` so both are expressible on one wire field. */
45
49
  type NamedAgentPricingFeature = {
46
50
  text: string;
@@ -102,7 +106,11 @@ type NamedAgentLandingContent = {
102
106
  cta: NamedAgentCta;
103
107
  };
104
108
 
105
- type NamedAgentViewProps = DialectViewProps<NamedAgentLandingContent>;
106
- declare function NamedAgentView({ content, theme, mode, brandName, hostname }: NamedAgentViewProps): react_jsx_runtime.JSX.Element;
109
+ type NamedAgentTemplate = 'studio' | 'executive';
110
+ type NamedAgentViewProps = DialectViewProps<NamedAgentLandingContent> & {
111
+ /** Design language for the page. Defaults to the named-agents baseline. */
112
+ template?: NamedAgentTemplate;
113
+ };
114
+ declare function NamedAgentView({ content, theme, mode, brandName, hostname, template }: NamedAgentViewProps): react_jsx_runtime.JSX.Element;
107
115
 
108
- export { type NamedAgentCta, type NamedAgentCtaButton, type NamedAgentFaq, type NamedAgentFaqItem, type NamedAgentFeature, type NamedAgentFeatures, type NamedAgentHero, type NamedAgentLandingContent, type NamedAgentPricing, type NamedAgentPricingFeature, type NamedAgentPricingTier, NamedAgentView, type NamedAgentViewProps, NamedAgentView as default };
116
+ export { type NamedAgentCta, type NamedAgentCtaButton, type NamedAgentFaq, type NamedAgentFaqItem, type NamedAgentFeature, type NamedAgentFeatures, type NamedAgentHero, type NamedAgentLandingContent, type NamedAgentPricing, type NamedAgentPricingFeature, type NamedAgentPricingTier, type NamedAgentTemplate, NamedAgentView, type NamedAgentViewProps, NamedAgentView as default };