@devslab/site-kit 0.12.0 → 0.13.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, Show, createSignal, createUniqueId, onMount } from "solid-js";
2
+ import { For, Show, createMemo, 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([
@@ -420,6 +420,12 @@ function spriteMarkup(countries, bodies, uid) {
420
420
  * the bodies through loadFlagBodies, which the browser build emits as its
421
421
  * own chunk. Zero-sized rather than display:none so the referenced clip
422
422
  * paths and gradients still resolve.
423
+ *
424
+ * "No server HTML" is decided by looking at the element, not at whether
425
+ * hydration is running: a hydration that drifted upstream recreates this
426
+ * element from the template, empty, while the hydration context is still
427
+ * set. Trusting the context left the first consumer with a blank flag
428
+ * box; an empty sprite loads its bodies whatever the reason it is empty.
423
429
  */
424
430
  function FlagSprite(props) {
425
431
  const bodies = flagBodiesNow();
@@ -514,32 +520,59 @@ var _tmpl$3$2 = [
514
520
  "</ul></details></nav>"
515
521
  ];
516
522
  var _tmpl$4$2 = [
517
- "<footer",
518
- " class=\"site-footer\"",
519
- "><div class=\"site-footer__inner\"><!--$-->",
520
- "<!--/--><div class=\"site-footer__row\"><p class=\"site-footer__brand\"><!--$-->",
521
- "<!--/--><strong>",
522
- "</strong><!--$-->",
523
- "<!--/--></p><ul class=\"site-footer__links\"><!--$-->",
524
- "<!--/--><li>",
525
- "</li></ul></div></div></footer>"
523
+ "<p",
524
+ " class=\"site-footer__brand\"><!--$-->",
525
+ "<!--/--><!--$-->",
526
+ "<!--/--><!--$-->",
527
+ "<!--/--></p>"
528
+ ];
529
+ var _tmpl$5$2 = [
530
+ "<strong",
531
+ ">",
532
+ "</strong>"
526
533
  ];
527
- var _tmpl$5$2 = ["<span", " aria-hidden=\"true\">·</span>"];
528
- var _tmpl$6$2 = [
534
+ var _tmpl$6$2 = ["<span", " aria-hidden=\"true\">·</span>"];
535
+ var _tmpl$7$2 = [
529
536
  "<a",
530
537
  ">",
531
538
  "</a>"
532
539
  ];
533
- var _tmpl$7$2 = [
540
+ var _tmpl$8$1 = [
541
+ "<ul",
542
+ " class=\"site-footer__links\"><!--$-->",
543
+ "<!--/--><li>",
544
+ "</li></ul>"
545
+ ];
546
+ var _tmpl$9$1 = [
534
547
  "<bdi",
535
548
  ">",
536
549
  "</bdi>"
537
550
  ];
538
- var _tmpl$8$1 = [
551
+ var _tmpl$0$1 = [
539
552
  "<a",
540
553
  "><bdi>",
541
554
  "</bdi></a>"
542
555
  ];
556
+ var _tmpl$1$1 = [
557
+ "<footer",
558
+ " class=\"site-footer\"",
559
+ "><div class=\"site-footer__inner\"><!--$-->",
560
+ "<!--/--><div class=\"site-footer__row\"><!--$-->",
561
+ "<!--/--><!--$-->",
562
+ "<!--/--></div></div></footer>"
563
+ ];
564
+ var _tmpl$10 = [
565
+ "<div",
566
+ " class=\"site-footer__identity\"><!--$-->",
567
+ "<!--/--><div class=\"site-footer__details\">",
568
+ "</div></div>"
569
+ ];
570
+ var _tmpl$11 = [
571
+ "<nav",
572
+ " class=\"site-footer__nav\"",
573
+ ">",
574
+ "</nav>"
575
+ ];
543
576
  function ThemeToggle(props) {
544
577
  const order = [
545
578
  "system",
@@ -591,9 +624,12 @@ function ThemeToggle(props) {
591
624
  }
592
625
  });
593
626
  }
627
+ /** The emphasis class a `SiteLink` asks for, or none. */
628
+ var linkClass = (item) => item.emphasis ? "site-link--emphasis" : void 0;
594
629
  function SiteHeader(props) {
595
630
  const [menuOpen, setMenuOpen] = createSignal(false);
596
- 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, {
631
+ const brand = createMemo(() => props.brand);
632
+ return ssr(_tmpl$$4, ssrHydrationKey(), escape(props.messages.skipToContent), ssrAttribute("href", escape(brand().href, true), false) + ssrAttribute("aria-label", escape(brand().label, true), false), escape(brand().logo), escape(brand().name), escape(createComponent(Button, {
597
633
  "class": "site-menu-button",
598
634
  tone: "ghost",
599
635
  get ["aria-expanded"]() {
@@ -608,15 +644,20 @@ function SiteHeader(props) {
608
644
  get each() {
609
645
  return props.navigation;
610
646
  },
611
- 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))
612
- })), ssrAttribute("data-open", escape(String(menuOpen()), true), false), escape(createComponent(LocaleMenu, mergeProps({
613
- get state() {
647
+ children: (item) => ssr(_tmpl$2$2, ssrHydrationKey(), ssrAttribute("class", escape(linkClass(item), true), false) + 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))
648
+ })), ssrAttribute("data-open", escape(String(menuOpen()), true), false), escape(createComponent(Show, {
649
+ get when() {
614
650
  return props.locale;
615
651
  },
616
- get messages() {
617
- return props.messages;
618
- }
619
- }, () => props.localeVariant ? { variant: props.localeVariant } : {}, () => props.localeRegistry ? { registry: props.localeRegistry } : {}, () => props.onLocaleChange ? { onLocaleChange: props.onLocaleChange } : {}))), props.theme && escape(createComponent(ThemeToggle, mergeProps(() => props.theme, { get messages() {
652
+ children: (locale) => createComponent(LocaleMenu, mergeProps({
653
+ get state() {
654
+ return locale();
655
+ },
656
+ get messages() {
657
+ return props.messages;
658
+ }
659
+ }, () => props.localeVariant ? { variant: props.localeVariant } : {}, () => props.localeRegistry ? { registry: props.localeRegistry } : {}, () => props.onLocaleChange ? { onLocaleChange: props.onLocaleChange } : {}))
660
+ })), props.theme && escape(createComponent(ThemeToggle, mergeProps(() => props.theme, { get messages() {
620
661
  return props.messages;
621
662
  } }))), escape(props.actions));
622
663
  }
@@ -659,7 +700,34 @@ function FooterLocaleMenu(props) {
659
700
  */
660
701
  function SiteFooter(props) {
661
702
  const registry = () => props.localeRegistry ?? FAMILY_LOCALES;
662
- return ssr(_tmpl$4$2, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.messages.footerLabel, true), false), escape(createComponent(Show, {
703
+ const brand = createMemo(() => props.brand);
704
+ const details = createMemo(() => props.details);
705
+ const brandLine = () => ssr(_tmpl$4$2, ssrHydrationKey(), escape(brand().logo), escape(createComponent(Show, {
706
+ get when() {
707
+ return brand().name;
708
+ },
709
+ children: (name) => ssr(_tmpl$5$2, ssrHydrationKey(), escape(name()))
710
+ })), escape(createComponent(For, {
711
+ get each() {
712
+ return props.family ?? [];
713
+ },
714
+ children: (item) => [ssr(_tmpl$6$2, ssrHydrationKey()), ssr(_tmpl$7$2, ssrHydrationKey() + ssrAttribute("class", escape(linkClass(item), true), false) + ssrAttribute("href", escape(item.href, true), false), escape(item.label))]
715
+ })));
716
+ const linkList = () => ssr(_tmpl$8$1, ssrHydrationKey(), escape(createComponent(For, {
717
+ get each() {
718
+ return props.links;
719
+ },
720
+ children: (item) => ssr(_tmpl$2$2, ssrHydrationKey(), ssrAttribute("class", escape(linkClass(item), true), false) + ssrAttribute("href", escape(item.href, true), false), escape(item.label))
721
+ })), escape(createComponent(Show, {
722
+ get when() {
723
+ return props.copyrightHref;
724
+ },
725
+ get fallback() {
726
+ return ssr(_tmpl$9$1, ssrHydrationKey(), escape(props.copyright));
727
+ },
728
+ children: (href) => ssr(_tmpl$0$1, ssrHydrationKey() + ssrAttribute("href", escape(href(), true), false), escape(props.copyright))
729
+ })));
730
+ return ssr(_tmpl$1$1, ssrHydrationKey(), ssrAttribute("aria-label", escape(props.messages.footerLabel, true), false), escape(createComponent(Show, {
663
731
  get when() {
664
732
  return props.locale;
665
733
  },
@@ -677,24 +745,22 @@ function SiteFooter(props) {
677
745
  return props.onLocaleSelect;
678
746
  }
679
747
  })
680
- })), escape(props.brand.logo), escape(props.brand.name), escape(createComponent(For, {
681
- get each() {
682
- return props.family ?? [];
748
+ })), escape(createComponent(Show, {
749
+ get when() {
750
+ return details();
683
751
  },
684
- children: (item) => [ssr(_tmpl$5$2, ssrHydrationKey()), ssr(_tmpl$6$2, ssrHydrationKey() + ssrAttribute("href", escape(item.href, true), false), escape(item.label))]
685
- })), escape(createComponent(For, {
686
- get each() {
687
- return props.links;
752
+ get fallback() {
753
+ return brandLine();
688
754
  },
689
- children: (item) => ssr(_tmpl$2$2, ssrHydrationKey(), ssrAttribute("href", escape(item.href, true), false), escape(item.label))
755
+ children: (content) => ssr(_tmpl$10, ssrHydrationKey(), escape(brandLine()), escape(content()))
690
756
  })), escape(createComponent(Show, {
691
757
  get when() {
692
- return props.copyrightHref;
758
+ return props.linksLabel;
693
759
  },
694
760
  get fallback() {
695
- return ssr(_tmpl$7$2, ssrHydrationKey(), escape(props.copyright));
761
+ return linkList();
696
762
  },
697
- children: (href) => ssr(_tmpl$8$1, ssrHydrationKey() + ssrAttribute("href", escape(href(), true), false), escape(props.copyright))
763
+ children: (label) => ssr(_tmpl$11, ssrHydrationKey(), ssrAttribute("aria-label", escape(label(), true), false), escape(linkList()))
698
764
  })));
699
765
  }
700
766
  //#endregion
@@ -755,13 +821,16 @@ var _tmpl$7$1 = [
755
821
  ];
756
822
  function MarketingShell(props) {
757
823
  const mainClass = () => props.mainWidth === "bleed" ? "site-main site-main--bleed" : "site-main";
758
- 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))));
824
+ const header = createMemo(() => props.header);
825
+ const footer = createMemo(() => props.footer);
826
+ return ssr(_tmpl$$3, ssrHydrationKey(), escape(createComponent(SiteHeader, mergeProps(header))), ssrAttribute("class", escape(mainClass(), true), false), escape(props.children), escape(createComponent(SiteFooter, mergeProps(footer))));
759
827
  }
760
828
  function LegalLayout(props) {
761
829
  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));
762
830
  }
763
831
  function StatusBanner(props) {
764
- 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, {
832
+ const children = createMemo(() => props.children);
833
+ 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), children() && ssr(_tmpl$4$1, ssrHydrationKey(), escape(children())), props.action && escape(createComponent(Button, {
765
834
  get tone() {
766
835
  return props.action.tone ?? "secondary";
767
836
  },