@devslab/site-kit 0.5.1 → 0.6.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$2 = [
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$2 = [
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$2, 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$2, 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,13 +453,13 @@ 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
465
  "><div class=\"site-footer__inner\"><strong>",
@@ -509,7 +520,7 @@ function ThemeToggle(props) {
509
520
  }
510
521
  function SiteHeader(props) {
511
522
  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, {
523
+ 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
524
  "class": "site-menu-button",
514
525
  tone: "ghost",
515
526
  get ["aria-expanded"]() {
@@ -524,7 +535,7 @@ function SiteHeader(props) {
524
535
  get each() {
525
536
  return props.navigation;
526
537
  },
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))
538
+ 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
539
  })), ssrAttribute("data-open", escape(String(menuOpen()), true), false), escape(createComponent(LocaleMenu, mergeProps({
529
540
  get state() {
530
541
  return props.locale;
@@ -537,23 +548,24 @@ function SiteHeader(props) {
537
548
  } }))), escape(props.actions));
538
549
  }
539
550
  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, {
551
+ return ssr(_tmpl$3$2, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.messages.footerLabel, true), false), escape(props.brand.name), escape(createComponent(For, {
541
552
  get each() {
542
553
  return props.links;
543
554
  },
544
- children: (item) => ssr(_tmpl$2$1, ssrHydrationKey(), ssrAttribute("href", escape(item.href, true), false), escape(item.label))
555
+ children: (item) => ssr(_tmpl$2$2, ssrHydrationKey(), ssrAttribute("href", escape(item.href, true), false), escape(item.label))
545
556
  })), escape(props.copyright));
546
557
  }
547
558
  //#endregion
548
559
  //#region src/solid/layouts.tsx
549
- var _tmpl$$2 = [
560
+ var _tmpl$$3 = [
550
561
  "<div",
551
562
  " class=\"site-shell\"><!--$-->",
552
- "<!--/--><main id=\"main-content\" class=\"site-main\" tabindex=\"-1\">",
563
+ "<!--/--><main id=\"main-content\"",
564
+ " tabindex=\"-1\">",
553
565
  "</main><!--$-->",
554
566
  "<!--/--></div>"
555
567
  ];
556
- var _tmpl$2 = [
568
+ var _tmpl$2$1 = [
557
569
  "<article",
558
570
  " class=\"site-legal\"><header><h1>",
559
571
  "</h1><p><!--$-->",
@@ -562,7 +574,7 @@ var _tmpl$2 = [
562
574
  "</time></p></header><!--$-->",
563
575
  "<!--/--></article>"
564
576
  ];
565
- var _tmpl$3 = [
577
+ var _tmpl$3$1 = [
566
578
  "<section",
567
579
  " class=\"",
568
580
  "\"",
@@ -571,12 +583,12 @@ var _tmpl$3 = [
571
583
  "<!--/--><!--$-->",
572
584
  "<!--/--></section>"
573
585
  ];
574
- var _tmpl$4 = [
586
+ var _tmpl$4$1 = [
575
587
  "<div",
576
588
  ">",
577
589
  "</div>"
578
590
  ];
579
- var _tmpl$5 = [
591
+ var _tmpl$5$1 = [
580
592
  "<main",
581
593
  " class=\"site-main site-centered-layout\"><h1>",
582
594
  "</h1><p>",
@@ -585,7 +597,7 @@ var _tmpl$5 = [
585
597
  ">",
586
598
  "</a></main>"
587
599
  ];
588
- var _tmpl$6 = [
600
+ var _tmpl$6$1 = [
589
601
  "<main",
590
602
  " class=\"site-main site-centered-layout\"><h1>",
591
603
  "</h1><p>",
@@ -594,19 +606,20 @@ var _tmpl$6 = [
594
606
  "<!--/--><!--$-->",
595
607
  "<!--/--></main>"
596
608
  ];
597
- var _tmpl$7 = [
609
+ var _tmpl$7$1 = [
598
610
  "<code",
599
611
  ">",
600
612
  "</code>"
601
613
  ];
602
614
  function MarketingShell(props) {
603
- return ssr(_tmpl$$2, ssrHydrationKey(), escape(createComponent(SiteHeader, mergeProps(() => props.header))), escape(props.children), escape(createComponent(SiteFooter, mergeProps(() => props.footer))));
615
+ const mainClass = () => props.mainWidth === "bleed" ? "site-main site-main--bleed" : "site-main";
616
+ 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
617
  }
605
618
  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));
619
+ 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
620
  }
608
621
  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, {
622
+ 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
623
  get tone() {
611
624
  return props.action.tone ?? "secondary";
612
625
  },
@@ -619,10 +632,10 @@ function StatusBanner(props) {
619
632
  })));
620
633
  }
621
634
  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));
635
+ 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
636
  }
624
637
  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, {
638
+ 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
639
  tone: "primary",
627
640
  get onClick() {
628
641
  return props.onRetry;
@@ -634,7 +647,7 @@ function ErrorLayout(props) {
634
647
  }
635
648
  //#endregion
636
649
  //#region src/solid/request-access.tsx
637
- var _tmpl$$1 = [
650
+ var _tmpl$$2 = [
638
651
  "<form",
639
652
  " class=\"",
640
653
  "\"><!--$-->",
@@ -647,7 +660,7 @@ var _tmpl$$1 = [
647
660
  ];
648
661
  function RequestAccessForm(props) {
649
662
  const [state, setState] = createSignal("idle");
650
- return ssr(_tmpl$$1, ssrHydrationKey(), `site-request-form${props.class ? ` ${escape(props.class, true)}` : ""}`, escape(createComponent(Field, {
663
+ return ssr(_tmpl$$2, ssrHydrationKey(), `site-request-form${props.class ? ` ${escape(props.class, true)}` : ""}`, escape(createComponent(Field, {
651
664
  get label() {
652
665
  return props.messages.nameLabel;
653
666
  },
@@ -700,7 +713,7 @@ function RequestAccessForm(props) {
700
713
  }
701
714
  //#endregion
702
715
  //#region src/solid/oss-product-mark.tsx
703
- var _tmpl$ = [
716
+ var _tmpl$$1 = [
704
717
  "<img",
705
718
  " class=\"",
706
719
  "\"",
@@ -714,9 +727,129 @@ var MARK_SIZE = {
714
727
  function OssProductMark(props) {
715
728
  const size = () => props.size ?? "md";
716
729
  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));
730
+ 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));
731
+ }
732
+ //#endregion
733
+ //#region src/solid/sections.tsx
734
+ var _tmpl$ = [
735
+ "<section",
736
+ " class=\"site-section\"",
737
+ "><div class=\"site-section__shell\">",
738
+ "</div></section>"
739
+ ];
740
+ var _tmpl$2 = [
741
+ "<header",
742
+ " class=\"site-section__head\"><p class=\"site-section__index\" aria-hidden=\"true\">",
743
+ "</p><h2",
744
+ ">",
745
+ "</h2><!--$-->",
746
+ "<!--/--></header>"
747
+ ];
748
+ var _tmpl$3 = [
749
+ "<p",
750
+ " class=\"site-section__lede\">",
751
+ "</p>"
752
+ ];
753
+ var _tmpl$4 = [
754
+ "<section",
755
+ " class=\"site-hero\"",
756
+ "><div class=\"site-hero__shell\"><div class=\"site-hero__copy\"><!--$-->",
757
+ "<!--/--><h1",
758
+ ">",
759
+ "</h1><p class=\"site-hero__lede\">",
760
+ "</p><div class=\"site-hero__actions\">",
761
+ "</div></div><figure class=\"site-hero__aside\"",
762
+ ">",
763
+ "</figure></div></section>"
764
+ ];
765
+ var _tmpl$5 = [
766
+ "<p",
767
+ " class=\"site-hero__eyebrow\">",
768
+ "</p>"
769
+ ];
770
+ var _tmpl$6 = [
771
+ "<ol",
772
+ " class=\"site-steps\"",
773
+ ">",
774
+ "</ol>"
775
+ ];
776
+ var _tmpl$7 = [
777
+ "<li",
778
+ " class=\"site-steps__step\"><span class=\"site-steps__marker\" aria-hidden=\"true\">",
779
+ "</span><h3>",
780
+ "</h3><p>",
781
+ "</p></li>"
782
+ ];
783
+ var _tmpl$8 = [
784
+ "<ul",
785
+ " class=\"site-rows\"",
786
+ ">",
787
+ "</ul>"
788
+ ];
789
+ var _tmpl$9 = [
790
+ "<li",
791
+ " class=\"site-rows__row\"><div class=\"site-rows__title\"><h3>",
792
+ "</h3><!--$-->",
793
+ "<!--/--></div><p class=\"site-rows__body\">",
794
+ "</p></li>"
795
+ ];
796
+ var _tmpl$0 = [
797
+ "<span",
798
+ " class=\"dds-badge dds-badge--brand\">",
799
+ "</span>"
800
+ ];
801
+ var _tmpl$1 = [
802
+ "<div",
803
+ " class=\"site-pricing\"><div class=\"site-pricing__note\">",
804
+ "</div><div class=\"site-pricing__action\">",
805
+ "</div></div>"
806
+ ];
807
+ function SectionBlock(props) {
808
+ 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));
809
+ }
810
+ function SectionHead(props) {
811
+ return ssr(_tmpl$2, ssrHydrationKey(), escape(props.index), ssrAttribute("id", escape(props.titleId, true), false), escape(props.title), escape(createComponent(Show, {
812
+ get when() {
813
+ return props.lede;
814
+ },
815
+ children: (lede) => ssr(_tmpl$3, ssrHydrationKey(), escape(lede()))
816
+ })));
817
+ }
818
+ function HeroSplit(props) {
819
+ return ssr(_tmpl$4, ssrHydrationKey() + ssrAttribute("id", escape(props.id, true), false), ssrAttribute("aria-labelledby", escape(props.titleId, true), false), escape(createComponent(Show, {
820
+ get when() {
821
+ return props.eyebrow;
822
+ },
823
+ children: (eyebrow) => ssr(_tmpl$5, ssrHydrationKey(), escape(eyebrow()))
824
+ })), 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));
825
+ }
826
+ function StepFlow(props) {
827
+ return ssr(_tmpl$6, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.label, true), false), escape(createComponent(For, {
828
+ get each() {
829
+ return props.steps;
830
+ },
831
+ children: (step, index) => ssr(_tmpl$7, ssrHydrationKey(), escape(index()) + 1, escape(step.title), escape(step.body))
832
+ })));
833
+ }
834
+ /** Hairline rows — a card grid is the thing this primitive exists to replace. */
835
+ function FeatureRows(props) {
836
+ return ssr(_tmpl$8, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.label, true), false), escape(createComponent(For, {
837
+ get each() {
838
+ return props.rows;
839
+ },
840
+ children: (row) => ssr(_tmpl$9, ssrHydrationKey(), escape(row.title), escape(createComponent(Show, {
841
+ get when() {
842
+ return row.badge;
843
+ },
844
+ children: (badge) => ssr(_tmpl$0, ssrHydrationKey(), escape(badge()))
845
+ })), escape(row.body))
846
+ })));
847
+ }
848
+ /** One paragraph block, one action. No table, no tiers — a note, not a pricing page. */
849
+ function PricingNote(props) {
850
+ return ssr(_tmpl$1, ssrHydrationKey(), escape(props.children), escape(props.action));
718
851
  }
719
852
  //#endregion
720
- export { ErrorLayout, LegalLayout, LocaleMenu, MarketingShell, NotFoundLayout, OssProductMark, RequestAccessForm, SiteFooter, SiteHeader, StatusBanner, ThemeToggle };
853
+ export { ErrorLayout, FeatureRows, HeroSplit, LegalLayout, LocaleMenu, MarketingShell, NotFoundLayout, OssProductMark, PricingNote, RequestAccessForm, SectionBlock, SectionHead, SiteFooter, SiteHeader, StatusBanner, StepFlow, ThemeToggle };
721
854
 
722
855
  //# sourceMappingURL=solid.server.js.map