@devslab/site-kit 0.5.2 → 0.7.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.
@@ -1,5 +1,5 @@
1
1
  import { createComponent, escape, mergeProps, ssr, ssrAttribute, ssrElement, ssrHydrationKey } from "solid-js/web";
2
- import { For, createSignal, createUniqueId, onMount } from "solid-js";
2
+ import { For, Show, createSignal, createUniqueId, onMount } from "solid-js";
3
3
  import { Button, Field, Icon, IconButton } from "@devslab/dds-solid";
4
4
  //#region src/core/locales.mjs
5
5
  var LOCALES = Object.freeze([
@@ -113,19 +113,27 @@ var FAMILY_ALIASES = Object.freeze([["zh", "zh-TW"], ["pt", "pt-BR"]]);
113
113
  * and security-scanned here, and seven Indian languages share one flag
114
114
  * anyway.
115
115
  *
116
- * @param {{ extra?: ReadonlyArray<object>, aliases?: ReadonlyArray<[string, string]> }} [options]
116
+ * @param {{ only?: ReadonlyArray<string>, extra?: ReadonlyArray<object>, aliases?: ReadonlyArray<[string, string]> }} [options]
117
117
  */
118
118
  function defineLocaleRegistry(options = {}) {
119
119
  const extra = options.extra ?? [];
120
- const seen = new Set(LOCALES.map(({ code }) => code));
120
+ let family = LOCALES;
121
+ if (options.only !== void 0) {
122
+ if (options.only.length === 0) throw new RangeError("`only` needs at least one locale — a registry with none is a bug, not a choice");
123
+ const wanted = new Set(options.only);
124
+ for (const code of wanted) if (!LOCALES.some((locale) => locale.code === code)) throw new RangeError(`${code} is not a family locale — \`only\` selects from the family list; use \`extra\` for a product's own`);
125
+ family = Object.freeze(LOCALES.filter((locale) => wanted.has(locale.code)));
126
+ }
127
+ const seen = new Set(family.map(({ code }) => code));
121
128
  for (const locale of extra) {
122
129
  if (!locale?.code) throw new TypeError("every extra locale needs a code");
123
- if (seen.has(locale.code)) throw new RangeError(`${locale.code} is already a family locale — remove it from \`extra\``);
130
+ if (LOCALES.some((known) => known.code === locale.code)) throw new RangeError(`${locale.code} is already a family locale — remove it from \`extra\``);
131
+ if (seen.has(locale.code)) throw new RangeError(`${locale.code} appears twice in \`extra\``);
124
132
  if (!locale.nativeName) throw new TypeError(`${locale.code} needs a nativeName — it is what the picker shows`);
125
133
  if (locale.dir !== "ltr" && locale.dir !== "rtl") throw new RangeError(`${locale.code} needs dir "ltr" or "rtl"`);
126
134
  seen.add(locale.code);
127
135
  }
128
- const locales = Object.freeze([...LOCALES, ...extra.map((locale) => Object.freeze({ ...locale }))]);
136
+ const locales = Object.freeze([...family, ...extra.map((locale) => Object.freeze({ ...locale }))]);
129
137
  const byLower = new Map(locales.map((locale) => [locale.code.toLowerCase(), locale]));
130
138
  const aliases = new Map([...FAMILY_ALIASES, ...options.aliases ?? []]);
131
139
  function canonicalLocale(candidate) {
@@ -133,7 +141,10 @@ function defineLocaleRegistry(options = {}) {
133
141
  const exact = byLower.get(String(candidate).trim().toLowerCase());
134
142
  if (exact) return exact.code;
135
143
  const base = String(candidate).trim().toLowerCase().split("-")[0];
136
- if (aliases.has(base)) return aliases.get(base);
144
+ if (aliases.has(base)) {
145
+ const target = aliases.get(base);
146
+ return byLower.has(target.toLowerCase()) ? target : void 0;
147
+ }
137
148
  return byLower.get(base)?.code;
138
149
  }
139
150
  function definitionFor(locale) {
@@ -335,32 +346,32 @@ function flagFor(locale, registry) {
335
346
  }
336
347
  //#endregion
337
348
  //#region src/solid/locale-menu.tsx
338
- var _tmpl$$4 = [
349
+ var _tmpl$$5 = [
339
350
  "<svg",
340
351
  " aria-hidden=\"true\">",
341
352
  "</svg>"
342
353
  ];
343
- var _tmpl$2$2 = [
354
+ var _tmpl$2$3 = [
344
355
  "<label",
345
356
  "><span class=\"dds-sr-only\">",
346
357
  "</span><span class=\"dds-select site-locale\"><select class=\"dds-select__input\"",
347
358
  ">",
348
359
  "</select></span></label>"
349
360
  ];
350
- var _tmpl$3$2 = [
361
+ var _tmpl$3$3 = [
351
362
  "<option",
352
363
  "",
353
364
  ">",
354
365
  "</option>"
355
366
  ];
356
- var _tmpl$4$1 = [
367
+ var _tmpl$4$3 = [
357
368
  "<details",
358
369
  " class=\"site-locale-flag\"><summary class=\"site-locale-flag__trigger\"",
359
370
  ">",
360
371
  "</summary><ul class=\"site-locale-flag__list\" role=\"list\">",
361
372
  "</ul></details>"
362
373
  ];
363
- var _tmpl$5$1 = [
374
+ var _tmpl$5$3 = [
364
375
  "<li",
365
376
  "><a class=\"site-locale-flag__option\"",
366
377
  "><!--$-->",
@@ -381,15 +392,15 @@ var registryOf = (props) => props.registry ?? FAMILY_LOCALES;
381
392
  function Flag(props) {
382
393
  const uid = createUniqueId();
383
394
  const flag = () => flagFor(props.locale, props.registry);
384
- return ssr(_tmpl$$4, ssrHydrationKey() + ssrAttribute("class", escape(props.class, true), false) + ssrAttribute("viewBox", escape(flag().viewBox, true), false), scopeFlagIds(flag().body, uid));
395
+ return ssr(_tmpl$$5, ssrHydrationKey() + ssrAttribute("class", escape(props.class, true), false) + ssrAttribute("viewBox", escape(flag().viewBox, true), false), scopeFlagIds(flag().body, uid));
385
396
  }
386
397
  function SelectLocaleMenu(props) {
387
398
  const registry = () => registryOf(props);
388
- return ssr(_tmpl$2$2, ssrHydrationKey(), escape(props.messages.localeLabel), ssrAttribute("aria-label", escape(props.messages.localeLabel, true), false), escape(createComponent(For, {
399
+ return ssr(_tmpl$2$3, ssrHydrationKey(), escape(props.messages.localeLabel), ssrAttribute("aria-label", escape(props.messages.localeLabel, true), false), escape(createComponent(For, {
389
400
  get each() {
390
401
  return registry().LOCALES;
391
402
  },
392
- children: (locale) => ssr(_tmpl$3$2, ssrHydrationKey() + ssrAttribute("value", escape(locale.code, true), false) + ssrAttribute("lang", escape(locale.code, true), false) + ssrAttribute("dir", escape(locale.dir, true), false), ssrAttribute("selected", locale.code === props.state.locale, true), escape(locale.nativeName))
403
+ children: (locale) => ssr(_tmpl$3$3, ssrHydrationKey() + ssrAttribute("value", escape(locale.code, true), false) + ssrAttribute("lang", escape(locale.code, true), false) + ssrAttribute("dir", escape(locale.dir, true), false), ssrAttribute("selected", locale.code === props.state.locale, true), escape(locale.nativeName))
393
404
  })));
394
405
  }
395
406
  function FlagLocaleMenu(props) {
@@ -399,7 +410,7 @@ function FlagLocaleMenu(props) {
399
410
  const name = current()?.nativeName;
400
411
  return name ? `${props.messages.localeLabel}: ${name}` : props.messages.localeLabel;
401
412
  };
402
- return ssr(_tmpl$4$1, ssrHydrationKey(), ssrAttribute("aria-label", escape(triggerLabel(), true), false) + ssrAttribute("title", escape(props.messages.localeLabel, true), false), escape(createComponent(Flag, {
413
+ return ssr(_tmpl$4$3, ssrHydrationKey(), ssrAttribute("aria-label", escape(triggerLabel(), true), false) + ssrAttribute("title", escape(props.messages.localeLabel, true), false), escape(createComponent(Flag, {
403
414
  get locale() {
404
415
  return props.state.locale;
405
416
  },
@@ -411,7 +422,7 @@ function FlagLocaleMenu(props) {
411
422
  get each() {
412
423
  return registry().LOCALES;
413
424
  },
414
- children: (entry) => ssr(_tmpl$5$1, ssrHydrationKey(), ssrAttribute("href", escape(props.state.hrefForLocale(entry.code), true), false) + ssrAttribute("lang", escape(entry.code, true), false) + ssrAttribute("hreflang", escape(entry.code, true), false) + ssrAttribute("dir", escape(entry.dir, true), false) + ssrAttribute("aria-current", entry.code === props.state.locale ? "true" : escape(void 0, true), false), escape(createComponent(Flag, {
425
+ children: (entry) => ssr(_tmpl$5$3, ssrHydrationKey(), ssrAttribute("href", escape(props.state.hrefForLocale(entry.code), true), false) + ssrAttribute("lang", escape(entry.code, true), false) + ssrAttribute("hreflang", escape(entry.code, true), false) + ssrAttribute("dir", escape(entry.dir, true), false) + ssrAttribute("aria-current", entry.code === props.state.locale ? "true" : escape(void 0, true), false), escape(createComponent(Flag, {
415
426
  get locale() {
416
427
  return entry.code;
417
428
  },
@@ -427,7 +438,7 @@ function LocaleMenu(props) {
427
438
  }
428
439
  //#endregion
429
440
  //#region src/solid/chrome.tsx
430
- var _tmpl$$3 = [
441
+ var _tmpl$$4 = [
431
442
  "<header",
432
443
  " class=\"site-header\"><a class=\"dds-sr-only\" href=\"#main-content\">",
433
444
  "</a><div class=\"site-header__inner\"><a class=\"site-brand\"",
@@ -442,19 +453,44 @@ var _tmpl$$3 = [
442
453
  "<!--/--><!--$-->",
443
454
  "<!--/--></div></div></header>"
444
455
  ];
445
- var _tmpl$2$1 = [
456
+ var _tmpl$2$2 = [
446
457
  "<li",
447
458
  "><a",
448
459
  ">",
449
460
  "</a></li>"
450
461
  ];
451
- var _tmpl$3$1 = [
462
+ var _tmpl$3$2 = [
452
463
  "<footer",
453
464
  " class=\"site-footer\"",
454
- "><div class=\"site-footer__inner\"><strong>",
455
- "</strong><ul class=\"site-footer__links\">",
456
- "</ul><small>",
457
- "</small></div></footer>"
465
+ "><div class=\"site-footer__inner\"><!--$-->",
466
+ "<!--/--><div class=\"site-footer__row\"><p class=\"site-footer__brand\"><!--$-->",
467
+ "<!--/--><strong>",
468
+ "</strong><!--$-->",
469
+ "<!--/--></p><ul class=\"site-footer__links\"><!--$-->",
470
+ "<!--/--><li>",
471
+ "</li></ul></div></div></footer>"
472
+ ];
473
+ var _tmpl$4$2 = [
474
+ "<nav",
475
+ " class=\"site-footer__langs\"",
476
+ ">",
477
+ "</nav>"
478
+ ];
479
+ var _tmpl$5$2 = [
480
+ "<a",
481
+ ">",
482
+ "</a>"
483
+ ];
484
+ var _tmpl$6$2 = ["<span", " aria-hidden=\"true\">·</span>"];
485
+ var _tmpl$7$2 = [
486
+ "<bdi",
487
+ ">",
488
+ "</bdi>"
489
+ ];
490
+ var _tmpl$8$1 = [
491
+ "<a",
492
+ "><bdi>",
493
+ "</bdi></a>"
458
494
  ];
459
495
  function ThemeToggle(props) {
460
496
  const order = [
@@ -509,7 +545,7 @@ function ThemeToggle(props) {
509
545
  }
510
546
  function SiteHeader(props) {
511
547
  const [menuOpen, setMenuOpen] = createSignal(false);
512
- return ssr(_tmpl$$3, ssrHydrationKey(), escape(props.messages.skipToContent), ssrAttribute("href", escape(props.brand.href, true), false), escape(props.brand.logo), escape(props.brand.name), escape(createComponent(Button, {
548
+ return ssr(_tmpl$$4, ssrHydrationKey(), escape(props.messages.skipToContent), ssrAttribute("href", escape(props.brand.href, true), false), escape(props.brand.logo), escape(props.brand.name), escape(createComponent(Button, {
513
549
  "class": "site-menu-button",
514
550
  tone: "ghost",
515
551
  get ["aria-expanded"]() {
@@ -524,7 +560,7 @@ function SiteHeader(props) {
524
560
  get each() {
525
561
  return props.navigation;
526
562
  },
527
- children: (item) => ssr(_tmpl$2$1, ssrHydrationKey(), ssrAttribute("href", escape(item.href, true), false) + ssrAttribute("target", item.external ? "_blank" : escape(void 0, true), false) + ssrAttribute("rel", item.external ? "noreferrer" : escape(void 0, true), false), escape(item.label))
563
+ children: (item) => ssr(_tmpl$2$2, ssrHydrationKey(), ssrAttribute("href", escape(item.href, true), false) + ssrAttribute("target", item.external ? "_blank" : escape(void 0, true), false) + ssrAttribute("rel", item.external ? "noreferrer" : escape(void 0, true), false), escape(item.label))
528
564
  })), ssrAttribute("data-open", escape(String(menuOpen()), true), false), escape(createComponent(LocaleMenu, mergeProps({
529
565
  get state() {
530
566
  return props.locale;
@@ -536,24 +572,62 @@ function SiteHeader(props) {
536
572
  return props.messages;
537
573
  } }))), escape(props.actions));
538
574
  }
575
+ /**
576
+ * The family footer: a language row, then the brand beside its family links,
577
+ * then the page's links and the copyright.
578
+ *
579
+ * Every product wrote this by hand. VisionLinq, BookLinq and TraceLinq each
580
+ * carried their own copy with a comment saying the kit's footer "takes only a
581
+ * flat link list; extending it is a dds release this page would then wait on" —
582
+ * three copies and three notes naming the same missing release. Their CSS had
583
+ * already converged byte-for-byte. This is that release.
584
+ *
585
+ * Additive: a caller that passes only brand/links/copyright/messages gets the
586
+ * same single row it got before, plus its brand mark if it set one.
587
+ */
539
588
  function SiteFooter(props) {
540
- return ssr(_tmpl$3$1, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.messages.footerLabel, true), false), escape(props.brand.name), escape(createComponent(For, {
589
+ const registry = () => props.localeRegistry ?? FAMILY_LOCALES;
590
+ return ssr(_tmpl$3$2, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.messages.footerLabel, true), false), escape(createComponent(Show, {
591
+ get when() {
592
+ return props.locale;
593
+ },
594
+ children: (locale) => ssr(_tmpl$4$2, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.messages.localeLabel, true), false), escape(createComponent(For, {
595
+ get each() {
596
+ return registry().LOCALES;
597
+ },
598
+ children: (entry) => ssr(_tmpl$5$2, ssrHydrationKey() + ssrAttribute("href", escape(locale().hrefForLocale(entry.code), true), false) + ssrAttribute("hreflang", escape(entry.code, true), false) + ssrAttribute("lang", escape(entry.code, true), false) + ssrAttribute("dir", escape(entry.dir, true), false) + ssrAttribute("aria-current", entry.code === locale().locale ? "page" : escape(void 0, true), false), escape(entry.nativeName))
599
+ })))
600
+ })), escape(props.brand.logo), escape(props.brand.name), escape(createComponent(For, {
601
+ get each() {
602
+ return props.family ?? [];
603
+ },
604
+ children: (item) => [ssr(_tmpl$6$2, ssrHydrationKey()), ssr(_tmpl$5$2, ssrHydrationKey() + ssrAttribute("href", escape(item.href, true), false), escape(item.label))]
605
+ })), escape(createComponent(For, {
541
606
  get each() {
542
607
  return props.links;
543
608
  },
544
- children: (item) => ssr(_tmpl$2$1, ssrHydrationKey(), ssrAttribute("href", escape(item.href, true), false), escape(item.label))
545
- })), escape(props.copyright));
609
+ children: (item) => ssr(_tmpl$2$2, ssrHydrationKey(), ssrAttribute("href", escape(item.href, true), false), escape(item.label))
610
+ })), escape(createComponent(Show, {
611
+ get when() {
612
+ return props.copyrightHref;
613
+ },
614
+ get fallback() {
615
+ return ssr(_tmpl$7$2, ssrHydrationKey(), escape(props.copyright));
616
+ },
617
+ children: (href) => ssr(_tmpl$8$1, ssrHydrationKey() + ssrAttribute("href", escape(href(), true), false), escape(props.copyright))
618
+ })));
546
619
  }
547
620
  //#endregion
548
621
  //#region src/solid/layouts.tsx
549
- var _tmpl$$2 = [
622
+ var _tmpl$$3 = [
550
623
  "<div",
551
624
  " class=\"site-shell\"><!--$-->",
552
- "<!--/--><main id=\"main-content\" class=\"site-main\" tabindex=\"-1\">",
625
+ "<!--/--><main id=\"main-content\"",
626
+ " tabindex=\"-1\">",
553
627
  "</main><!--$-->",
554
628
  "<!--/--></div>"
555
629
  ];
556
- var _tmpl$2 = [
630
+ var _tmpl$2$1 = [
557
631
  "<article",
558
632
  " class=\"site-legal\"><header><h1>",
559
633
  "</h1><p><!--$-->",
@@ -562,7 +636,7 @@ var _tmpl$2 = [
562
636
  "</time></p></header><!--$-->",
563
637
  "<!--/--></article>"
564
638
  ];
565
- var _tmpl$3 = [
639
+ var _tmpl$3$1 = [
566
640
  "<section",
567
641
  " class=\"",
568
642
  "\"",
@@ -571,12 +645,12 @@ var _tmpl$3 = [
571
645
  "<!--/--><!--$-->",
572
646
  "<!--/--></section>"
573
647
  ];
574
- var _tmpl$4 = [
648
+ var _tmpl$4$1 = [
575
649
  "<div",
576
650
  ">",
577
651
  "</div>"
578
652
  ];
579
- var _tmpl$5 = [
653
+ var _tmpl$5$1 = [
580
654
  "<main",
581
655
  " class=\"site-main site-centered-layout\"><h1>",
582
656
  "</h1><p>",
@@ -585,7 +659,7 @@ var _tmpl$5 = [
585
659
  ">",
586
660
  "</a></main>"
587
661
  ];
588
- var _tmpl$6 = [
662
+ var _tmpl$6$1 = [
589
663
  "<main",
590
664
  " class=\"site-main site-centered-layout\"><h1>",
591
665
  "</h1><p>",
@@ -594,19 +668,20 @@ var _tmpl$6 = [
594
668
  "<!--/--><!--$-->",
595
669
  "<!--/--></main>"
596
670
  ];
597
- var _tmpl$7 = [
671
+ var _tmpl$7$1 = [
598
672
  "<code",
599
673
  ">",
600
674
  "</code>"
601
675
  ];
602
676
  function MarketingShell(props) {
603
- return ssr(_tmpl$$2, ssrHydrationKey(), escape(createComponent(SiteHeader, mergeProps(() => props.header))), escape(props.children), escape(createComponent(SiteFooter, mergeProps(() => props.footer))));
677
+ const mainClass = () => props.mainWidth === "bleed" ? "site-main site-main--bleed" : "site-main";
678
+ return ssr(_tmpl$$3, ssrHydrationKey(), escape(createComponent(SiteHeader, mergeProps(() => props.header))), ssrAttribute("class", escape(mainClass(), true), false), escape(props.children), escape(createComponent(SiteFooter, mergeProps(() => props.footer))));
604
679
  }
605
680
  function LegalLayout(props) {
606
- return ssr(_tmpl$2, ssrHydrationKey(), escape(props.title), escape(props.messages.updatedLabel), ssrAttribute("datetime", escape(props.updatedAt, true), false), escape(props.updatedAt), escape(props.children));
681
+ return ssr(_tmpl$2$1, ssrHydrationKey(), escape(props.title), escape(props.messages.updatedLabel), ssrAttribute("datetime", escape(props.updatedAt, true), false), escape(props.updatedAt), escape(props.children));
607
682
  }
608
683
  function StatusBanner(props) {
609
- return ssr(_tmpl$3, ssrHydrationKey(), `site-status site-status--${escape(props.tone, true)}`, ssrAttribute("role", props.tone === "danger" ? "alert" : "status", false) + ssrAttribute("aria-live", props.tone === "danger" ? "assertive" : "polite", false), escape(props.title), props.children && ssr(_tmpl$4, ssrHydrationKey(), escape(props.children)), props.action && escape(createComponent(Button, {
684
+ return ssr(_tmpl$3$1, ssrHydrationKey(), `site-status site-status--${escape(props.tone, true)}`, ssrAttribute("role", props.tone === "danger" ? "alert" : "status", false) + ssrAttribute("aria-live", props.tone === "danger" ? "assertive" : "polite", false), escape(props.title), props.children && ssr(_tmpl$4$1, ssrHydrationKey(), escape(props.children)), props.action && escape(createComponent(Button, {
610
685
  get tone() {
611
686
  return props.action.tone ?? "secondary";
612
687
  },
@@ -619,10 +694,10 @@ function StatusBanner(props) {
619
694
  })));
620
695
  }
621
696
  function NotFoundLayout(props) {
622
- return ssr(_tmpl$5, ssrHydrationKey(), escape(props.messages.notFoundTitle), escape(props.messages.notFoundDescription), escape(props.children), ssrAttribute("href", escape(props.homeHref, true), false), escape(props.messages.backHome));
697
+ return ssr(_tmpl$5$1, ssrHydrationKey(), escape(props.messages.notFoundTitle), escape(props.messages.notFoundDescription), escape(props.children), ssrAttribute("href", escape(props.homeHref, true), false), escape(props.messages.backHome));
623
698
  }
624
699
  function ErrorLayout(props) {
625
- return ssr(_tmpl$6, ssrHydrationKey(), escape(props.messages.errorTitle), escape(props.messages.errorDescription), props.errorId && ssr(_tmpl$7, ssrHydrationKey(), escape(props.errorId)), escape(props.children), escape(createComponent(Button, {
700
+ return ssr(_tmpl$6$1, ssrHydrationKey(), escape(props.messages.errorTitle), escape(props.messages.errorDescription), props.errorId && ssr(_tmpl$7$1, ssrHydrationKey(), escape(props.errorId)), escape(props.children), escape(createComponent(Button, {
626
701
  tone: "primary",
627
702
  get onClick() {
628
703
  return props.onRetry;
@@ -634,7 +709,7 @@ function ErrorLayout(props) {
634
709
  }
635
710
  //#endregion
636
711
  //#region src/solid/request-access.tsx
637
- var _tmpl$$1 = [
712
+ var _tmpl$$2 = [
638
713
  "<form",
639
714
  " class=\"",
640
715
  "\"><!--$-->",
@@ -647,7 +722,7 @@ var _tmpl$$1 = [
647
722
  ];
648
723
  function RequestAccessForm(props) {
649
724
  const [state, setState] = createSignal("idle");
650
- return ssr(_tmpl$$1, ssrHydrationKey(), `site-request-form${props.class ? ` ${escape(props.class, true)}` : ""}`, escape(createComponent(Field, {
725
+ return ssr(_tmpl$$2, ssrHydrationKey(), `site-request-form${props.class ? ` ${escape(props.class, true)}` : ""}`, escape(createComponent(Field, {
651
726
  get label() {
652
727
  return props.messages.nameLabel;
653
728
  },
@@ -700,7 +775,7 @@ function RequestAccessForm(props) {
700
775
  }
701
776
  //#endregion
702
777
  //#region src/solid/oss-product-mark.tsx
703
- var _tmpl$ = [
778
+ var _tmpl$$1 = [
704
779
  "<img",
705
780
  " class=\"",
706
781
  "\"",
@@ -714,9 +789,129 @@ var MARK_SIZE = {
714
789
  function OssProductMark(props) {
715
790
  const size = () => props.size ?? "md";
716
791
  const pixels = () => MARK_SIZE[size()];
717
- return ssr(_tmpl$, ssrHydrationKey(), `oss-product-mark oss-product-mark--${escape(size(), true)}${props.class ? ` ${escape(props.class, true)}` : ""}`, ssrAttribute("src", escape(props.src, true), false) + ssrAttribute("alt", props.decorative ? "" : escape(props.name, true), false) + ssrAttribute("aria-hidden", props.decorative ? "true" : escape(void 0, true), false) + ssrAttribute("width", escape(pixels(), true), false) + ssrAttribute("height", escape(pixels(), true), false));
792
+ return ssr(_tmpl$$1, ssrHydrationKey(), `oss-product-mark oss-product-mark--${escape(size(), true)}${props.class ? ` ${escape(props.class, true)}` : ""}`, ssrAttribute("src", escape(props.src, true), false) + ssrAttribute("alt", props.decorative ? "" : escape(props.name, true), false) + ssrAttribute("aria-hidden", props.decorative ? "true" : escape(void 0, true), false) + ssrAttribute("width", escape(pixels(), true), false) + ssrAttribute("height", escape(pixels(), true), false));
793
+ }
794
+ //#endregion
795
+ //#region src/solid/sections.tsx
796
+ var _tmpl$ = [
797
+ "<section",
798
+ " class=\"site-section\"",
799
+ "><div class=\"site-section__shell\">",
800
+ "</div></section>"
801
+ ];
802
+ var _tmpl$2 = [
803
+ "<header",
804
+ " class=\"site-section__head\"><p class=\"site-section__index\" aria-hidden=\"true\">",
805
+ "</p><h2",
806
+ ">",
807
+ "</h2><!--$-->",
808
+ "<!--/--></header>"
809
+ ];
810
+ var _tmpl$3 = [
811
+ "<p",
812
+ " class=\"site-section__lede\">",
813
+ "</p>"
814
+ ];
815
+ var _tmpl$4 = [
816
+ "<section",
817
+ " class=\"site-hero\"",
818
+ "><div class=\"site-hero__shell\"><div class=\"site-hero__copy\"><!--$-->",
819
+ "<!--/--><h1",
820
+ ">",
821
+ "</h1><p class=\"site-hero__lede\">",
822
+ "</p><div class=\"site-hero__actions\">",
823
+ "</div></div><figure class=\"site-hero__aside\"",
824
+ ">",
825
+ "</figure></div></section>"
826
+ ];
827
+ var _tmpl$5 = [
828
+ "<p",
829
+ " class=\"site-hero__eyebrow\">",
830
+ "</p>"
831
+ ];
832
+ var _tmpl$6 = [
833
+ "<ol",
834
+ " class=\"site-steps\"",
835
+ ">",
836
+ "</ol>"
837
+ ];
838
+ var _tmpl$7 = [
839
+ "<li",
840
+ " class=\"site-steps__step\"><span class=\"site-steps__marker\" aria-hidden=\"true\">",
841
+ "</span><h3>",
842
+ "</h3><p>",
843
+ "</p></li>"
844
+ ];
845
+ var _tmpl$8 = [
846
+ "<ul",
847
+ " class=\"site-rows\"",
848
+ ">",
849
+ "</ul>"
850
+ ];
851
+ var _tmpl$9 = [
852
+ "<li",
853
+ " class=\"site-rows__row\"><div class=\"site-rows__title\"><h3>",
854
+ "</h3><!--$-->",
855
+ "<!--/--></div><p class=\"site-rows__body\">",
856
+ "</p></li>"
857
+ ];
858
+ var _tmpl$0 = [
859
+ "<span",
860
+ " class=\"dds-badge dds-badge--brand\">",
861
+ "</span>"
862
+ ];
863
+ var _tmpl$1 = [
864
+ "<div",
865
+ " class=\"site-pricing\"><div class=\"site-pricing__note\">",
866
+ "</div><div class=\"site-pricing__action\">",
867
+ "</div></div>"
868
+ ];
869
+ function SectionBlock(props) {
870
+ return ssr(_tmpl$, ssrHydrationKey(), ssrAttribute("id", escape(props.id, true), false) + ssrAttribute("data-tone", escape(props.tone ?? "default", true), false) + ssrAttribute("aria-labelledby", escape(props.labelledBy, true), false), escape(props.children));
871
+ }
872
+ function SectionHead(props) {
873
+ return ssr(_tmpl$2, ssrHydrationKey(), escape(props.index), ssrAttribute("id", escape(props.titleId, true), false), escape(props.title), escape(createComponent(Show, {
874
+ get when() {
875
+ return props.lede;
876
+ },
877
+ children: (lede) => ssr(_tmpl$3, ssrHydrationKey(), escape(lede()))
878
+ })));
879
+ }
880
+ function HeroSplit(props) {
881
+ return ssr(_tmpl$4, ssrHydrationKey() + ssrAttribute("id", escape(props.id, true), false), ssrAttribute("aria-labelledby", escape(props.titleId, true), false), escape(createComponent(Show, {
882
+ get when() {
883
+ return props.eyebrow;
884
+ },
885
+ children: (eyebrow) => ssr(_tmpl$5, ssrHydrationKey(), escape(eyebrow()))
886
+ })), ssrAttribute("id", escape(props.titleId, true), false), escape(props.title), escape(props.lede), escape(props.actions), ssrAttribute("aria-label", escape(props.asideLabel, true), false), escape(props.aside));
887
+ }
888
+ function StepFlow(props) {
889
+ return ssr(_tmpl$6, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.label, true), false), escape(createComponent(For, {
890
+ get each() {
891
+ return props.steps;
892
+ },
893
+ children: (step, index) => ssr(_tmpl$7, ssrHydrationKey(), escape(index()) + 1, escape(step.title), escape(step.body))
894
+ })));
895
+ }
896
+ /** Hairline rows — a card grid is the thing this primitive exists to replace. */
897
+ function FeatureRows(props) {
898
+ return ssr(_tmpl$8, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.label, true), false), escape(createComponent(For, {
899
+ get each() {
900
+ return props.rows;
901
+ },
902
+ children: (row) => ssr(_tmpl$9, ssrHydrationKey(), escape(row.title), escape(createComponent(Show, {
903
+ get when() {
904
+ return row.badge;
905
+ },
906
+ children: (badge) => ssr(_tmpl$0, ssrHydrationKey(), escape(badge()))
907
+ })), escape(row.body))
908
+ })));
909
+ }
910
+ /** One paragraph block, one action. No table, no tiers — a note, not a pricing page. */
911
+ function PricingNote(props) {
912
+ return ssr(_tmpl$1, ssrHydrationKey(), escape(props.children), escape(props.action));
718
913
  }
719
914
  //#endregion
720
- export { ErrorLayout, LegalLayout, LocaleMenu, MarketingShell, NotFoundLayout, OssProductMark, RequestAccessForm, SiteFooter, SiteHeader, StatusBanner, ThemeToggle };
915
+ export { ErrorLayout, FeatureRows, HeroSplit, LegalLayout, LocaleMenu, MarketingShell, NotFoundLayout, OssProductMark, PricingNote, RequestAccessForm, SectionBlock, SectionHead, SiteFooter, SiteHeader, StatusBanner, StepFlow, ThemeToggle };
721
916
 
722
917
  //# sourceMappingURL=solid.server.js.map