@aglyn/aglyn 1.0.0 → 1.2.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.
Files changed (38) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/compose-reusable-components.d.ts +22 -0
  3. package/src/lib/app-utils/compose-reusable-components.js +94 -32
  4. package/src/lib/app-utils/compose-reusable-components.js.map +1 -1
  5. package/src/lib/app-utils/contacts.d.ts +15 -1
  6. package/src/lib/app-utils/contacts.js +15 -1
  7. package/src/lib/app-utils/contacts.js.map +1 -1
  8. package/src/lib/app-utils/crm.d.ts +61 -19
  9. package/src/lib/app-utils/crm.js +47 -26
  10. package/src/lib/app-utils/crm.js.map +1 -1
  11. package/src/lib/app-utils/default-site.d.ts +10 -3
  12. package/src/lib/app-utils/default-site.js +82 -6
  13. package/src/lib/app-utils/default-site.js.map +1 -1
  14. package/src/lib/app-utils/docs-help-sections.generated.js +11 -1
  15. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
  16. package/src/lib/app-utils/docs-help.generated.d.ts +5 -5
  17. package/src/lib/app-utils/docs-help.generated.js +23 -0
  18. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  19. package/src/lib/app-utils/docs-index.generated.js +43 -15
  20. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  21. package/src/lib/app-utils/host-tokens.d.ts +7 -0
  22. package/src/lib/app-utils/host-tokens.js +27 -4
  23. package/src/lib/app-utils/host-tokens.js.map +1 -1
  24. package/src/lib/app-utils/node-definition-sanitizer.js +5 -1
  25. package/src/lib/app-utils/node-definition-sanitizer.js.map +1 -1
  26. package/src/lib/app-utils/server.d.ts +1 -0
  27. package/src/lib/app-utils/server.js +1 -0
  28. package/src/lib/app-utils/server.js.map +1 -1
  29. package/src/lib/app-utils/site-brand-files.d.ts +87 -0
  30. package/src/lib/app-utils/site-brand-files.js +157 -0
  31. package/src/lib/app-utils/site-brand-files.js.map +1 -0
  32. package/src/lib/app-utils/site-starter-nodes.js +1 -0
  33. package/src/lib/app-utils/site-starter-nodes.js.map +1 -1
  34. package/src/lib/app-utils/site-starter-pick.d.ts +2 -2
  35. package/src/lib/app-utils/site-starter-pick.js +2 -2
  36. package/src/lib/app-utils/site-starter-pick.js.map +1 -1
  37. package/src/lib/plugin-manager/feature-plugins.d.ts +36 -2
  38. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
@@ -103,9 +103,16 @@ export interface DefaultSiteLayout {
103
103
  * The header and footer a new site is born with (AGL-3497).
104
104
  *
105
105
  * The brand reads `{{host.businessName}}`, so it follows the site's name in
106
- * Setup rather than freezing the one it was created under. The header's
107
- * Contact button scrolls to the home page's contact section; on another page
108
- * it has nothing to scroll to and does nothing, which is the step's own rule.
106
+ * Setup rather than freezing the one it was created under, and the site's
107
+ * logo takes its place wherever it has one (AGL-4119): the logo carries
108
+ * `hideUnless` and the name `hideIf`, both bound to `{{host.logo}}`, and the
109
+ * published page drops the one the site does not use. The logo comes first
110
+ * in the toolbar so what is added after the brand link stays after both.
111
+ * The © line keeps the name either way.
112
+ *
113
+ * The header's Contact button scrolls to the home page's contact section; on
114
+ * another page it has nothing to scroll to and does nothing, which is the
115
+ * step's own rule.
109
116
  *
110
117
  * `homeScreenId` is the home page the brand and the footer's Home link point
111
118
  * at — a link by id, so it survives a slug change.
@@ -17,6 +17,7 @@
17
17
  import { nodeInteractionSelector } from "./node-interactions.js";
18
18
  import { SCREEN_ROOT_PATH } from "./screen-route.js";
19
19
  import { applyElementMotion } from "./element-motion.js";
20
+ import { SX_SCHEME_DARK_KEY } from "./scheme-sx.js";
20
21
  import { buildStarterNodes as buildNodes, starterSection as container, starterText as text, starterTextField as textField } from "./starter-template-nodes.js";
21
22
  /**
22
23
  * The website every new site is born with (AGL-3497).
@@ -635,18 +636,65 @@ const faq = (id, question, answer, defaultExpanded = false)=>({
635
636
  ]))
636
637
  };
637
638
  }
639
+ /** What decides whether a new site's header and footer show a logo or its name. */ const SITE_LOGO_TOKEN = '{{host.logo}}';
640
+ const SITE_NAME_TOKEN = '{{host.businessName}}';
641
+ /**
642
+ * A site's logo for the header or the footer (AGL-4119): one picture for each
643
+ * color scheme, named as the site, the height the band gives it and the width
644
+ * its shape takes. A wide wordmark stays one line, and past `maxWidth` it fits
645
+ * inside rather than being cropped.
646
+ *
647
+ * Two elements rather than one with two sources: `{{host.logoDark}}` is the
648
+ * site's logo when it has no dark one, so a visitor always sees exactly one.
649
+ */ const logoPictures = (idPrefix, height, maxWidth)=>{
650
+ const picture = (id, src, sx)=>({
651
+ id,
652
+ componentId: 'image',
653
+ props: {
654
+ src,
655
+ alt: SITE_NAME_TOKEN,
656
+ objectFit: 'contain',
657
+ width: 'auto',
658
+ height
659
+ },
660
+ sx: _extends({
661
+ maxWidth,
662
+ objectPosition: 'left center'
663
+ }, sx)
664
+ });
665
+ return [
666
+ picture(`${idPrefix}Light`, SITE_LOGO_TOKEN, {
667
+ [SX_SCHEME_DARK_KEY]: {
668
+ display: 'none'
669
+ }
670
+ }),
671
+ picture(`${idPrefix}Dark`, '{{host.logoDark}}', {
672
+ display: 'none',
673
+ [SX_SCHEME_DARK_KEY]: {
674
+ display: 'block'
675
+ }
676
+ })
677
+ ];
678
+ };
638
679
  /**
639
680
  * The header and footer a new site is born with (AGL-3497).
640
681
  *
641
682
  * The brand reads `{{host.businessName}}`, so it follows the site's name in
642
- * Setup rather than freezing the one it was created under. The header's
643
- * Contact button scrolls to the home page's contact section; on another page
644
- * it has nothing to scroll to and does nothing, which is the step's own rule.
683
+ * Setup rather than freezing the one it was created under, and the site's
684
+ * logo takes its place wherever it has one (AGL-4119): the logo carries
685
+ * `hideUnless` and the name `hideIf`, both bound to `{{host.logo}}`, and the
686
+ * published page drops the one the site does not use. The logo comes first
687
+ * in the toolbar so what is added after the brand link stays after both.
688
+ * The © line keeps the name either way.
689
+ *
690
+ * The header's Contact button scrolls to the home page's contact section; on
691
+ * another page it has nothing to scroll to and does nothing, which is the
692
+ * step's own rule.
645
693
  *
646
694
  * `homeScreenId` is the home page the brand and the footer's Home link point
647
695
  * at — a link by id, so it survives a slug change.
648
696
  */ export function buildDefaultSiteLayout(homeScreenId) {
649
- const brand = '{{host.businessName}}';
697
+ const brand = SITE_NAME_TOKEN;
650
698
  return {
651
699
  displayName: 'Site header and footer',
652
700
  description: 'The header and footer every page of this site shows.',
@@ -684,6 +732,24 @@ const faq = (id, question, answer, defaultExpanded = false)=>({
684
732
  columnGap: 2
685
733
  },
686
734
  children: [
735
+ {
736
+ id: 'dl_brandLogo',
737
+ componentId: 'muiLinkBox',
738
+ props: {
739
+ screenId: homeScreenId,
740
+ hideUnless: SITE_LOGO_TOKEN
741
+ },
742
+ sx: {
743
+ display: 'flex',
744
+ alignItems: 'center',
745
+ flexGrow: 1,
746
+ minWidth: 0
747
+ },
748
+ children: logoPictures('dl_brandLogo', '40px', {
749
+ xs: '100%',
750
+ sm: 280
751
+ })
752
+ },
687
753
  {
688
754
  id: 'dl_brand',
689
755
  componentId: 'muiScreenLink',
@@ -691,7 +757,8 @@ const faq = (id, question, answer, defaultExpanded = false)=>({
691
757
  children: brand,
692
758
  screenId: homeScreenId,
693
759
  renderAs: 'link',
694
- color: 'inherit'
760
+ color: 'inherit',
761
+ hideIf: SITE_LOGO_TOKEN
695
762
  },
696
763
  sx: {
697
764
  fontWeight: 800,
@@ -770,8 +837,17 @@ const faq = (id, question, answer, defaultExpanded = false)=>({
770
837
  spacing: 1.5
771
838
  },
772
839
  children: [
840
+ {
841
+ id: 'dl_footerLogo',
842
+ componentId: 'muiBox',
843
+ props: {
844
+ hideUnless: SITE_LOGO_TOKEN
845
+ },
846
+ children: logoPictures('dl_footerLogo', '48px', 280)
847
+ },
773
848
  text('dl_footerName', 'h6', brand, {
774
- component: 'p'
849
+ component: 'p',
850
+ hideIf: SITE_LOGO_TOKEN
775
851
  }),
776
852
  text('dl_footerAbout', 'body2', 'This footer is part of your site’s shared layout. Edit it ' + 'once under Layouts and it changes on every page.', {
777
853
  color: 'text.secondary'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/default-site.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { HostTheme } from '@aglyn/shared-data-types'\nimport type { NodeInteraction } from './node-interactions'\nimport { nodeInteractionSelector } from './node-interactions'\nimport { SCREEN_ROOT_PATH } from './screen-route'\nimport { applyElementMotion } from './element-motion'\nimport {\n buildStarterNodes as buildNodes,\n starterSection as container,\n starterText as text,\n starterTextField as textField,\n type StarterNodeSpec as NodeSpec,\n type StarterTemplateScreen,\n} from './starter-template-nodes'\n\n/**\n * The website every new site is born with (AGL-3497).\n *\n * It used to be one heading and \"our new website is on its way\" (AGL-3408):\n * a site that answered `/` instead of 404ing, and showed an owner nothing of\n * what the product does. Now a site starts as a real one — a shared header\n * and footer, a home page with the sections an ordinary business site has,\n * photos, a theme and its SEO — and each section says, to the owner, how to\n * make it theirs.\n *\n * It is published and open to search engines from the first request, as every\n * new site's home page has been since AGL-3408.\n *\n * The photos ship with the apps under `/_static/starter/` (see the CREDITS\n * file there). A published page's `img-src` admits only its own origin and\n * the media CDN, so a stock-photo URL would be blocked, and there is no\n * platform-wide media scope to hold them. Both the tenant and the console\n * serve the same files at the same path, so they draw on the live site and in\n * the Besigner alike.\n *\n * PERSISTED IDENTIFIERS: every node id below is stored on every new site.\n */\n\n/** Where the starter photos are served from, on every tenant and in the console. */\nexport const DEFAULT_SITE_IMAGE_BASE = '/_static/starter'\n\n/**\n * The starter photos, with the sizes the files actually are and the words\n * that describe what each one shows: wherever a starter photo is placed, its\n * alt text is its own, never words written for another picture (AGL-3831).\n */\nexport const DEFAULT_SITE_IMAGES = {\n hero: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/hero-team.jpg`,\n width: 1600,\n height: 1067,\n alt: 'A small team working together around a table in a bright office',\n },\n about: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/about-owner.jpg`,\n width: 1600,\n height: 900,\n alt: 'A smiling business owner standing behind the counter of her coffee shop',\n },\n desk: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/gallery-desk.jpg`,\n width: 1600,\n height: 1068,\n alt: 'A tidy desk with a laptop, a lamp and fresh flowers',\n },\n plants: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/gallery-plants.jpg`,\n width: 1200,\n height: 900,\n alt: 'Houseplants on a sunny windowsill',\n },\n craft: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/gallery-craft.jpg`,\n width: 1600,\n height: 1065,\n alt: 'Hands working on a craft project at a workbench',\n },\n} as const\n\n/** The node a call to action scrolls to, and the one the features link names. */\nexport const DEFAULT_HOME_CONTACT_SECTION_ID = 'dh_contactSection'\nexport const DEFAULT_HOME_FEATURES_SECTION_ID = 'dh_featuresSection'\n\n/** Room left above a scrolled-to section for the sticky header. */\nconst HEADER_OFFSET_PX = 72\n\n/**\n * Icon outlines, from Material Design Icons. Written in rather than looked up:\n * a published page reads an icon's stored path and never loads the catalog\n * (AGL-1212), and the catalog is the whole icon set.\n */\nconst ICONS = {\n 'pencil-outline':\n 'M14.06,9L15,9.94L5.92,19H5V18.08L14.06,9M17.66,3C17.41,3 17.15,3.1 16.96,3.29L15.13,5.12L18.88,8.87L20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18.17,3.09 17.92,3 17.66,3M14.06,6.19L3,17.25V21H6.75L17.81,9.94L14.06,6.19Z',\n 'palette-outline':\n 'M12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2C17.5,2 22,6 22,11A6,6 0 0,1 16,17H14.2C13.9,17 13.7,17.2 13.7,17.5C13.7,17.6 13.8,17.7 13.8,17.8C14.2,18.3 14.4,18.9 14.4,19.5C14.5,20.9 13.4,22 12,22M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C12.3,20 12.5,19.8 12.5,19.5C12.5,19.3 12.4,19.2 12.4,19.1C12,18.6 11.8,18.1 11.8,17.5C11.8,16.1 12.9,15 14.3,15H16A4,4 0 0,0 20,11C20,7.1 16.4,4 12,4M6.5,10C7.3,10 8,10.7 8,11.5C8,12.3 7.3,13 6.5,13C5.7,13 5,12.3 5,11.5C5,10.7 5.7,10 6.5,10M9.5,6C10.3,6 11,6.7 11,7.5C11,8.3 10.3,9 9.5,9C8.7,9 8,8.3 8,7.5C8,6.7 8.7,6 9.5,6M14.5,6C15.3,6 16,6.7 16,7.5C16,8.3 15.3,9 14.5,9C13.7,9 13,8.3 13,7.5C13,6.7 13.7,6 14.5,6M17.5,10C18.3,10 19,10.7 19,11.5C19,12.3 18.3,13 17.5,13C16.7,13 16,12.3 16,11.5C16,10.7 16.7,10 17.5,10Z',\n 'image-multiple-outline':\n 'M21,17H7V3H21M21,1H7A2,2 0 0,0 5,3V17A2,2 0 0,0 7,19H21A2,2 0 0,0 23,17V3A2,2 0 0,0 21,1M3,5H1V21A2,2 0 0,0 3,23H19V21H3M15.96,10.29L13.21,13.83L11.25,11.47L8.5,15H19.5L15.96,10.29Z',\n 'email-fast-outline':\n 'M22 5.5H9C7.9 5.5 7 6.4 7 7.5V16.5C7 17.61 7.9 18.5 9 18.5H22C23.11 18.5 24 17.61 24 16.5V7.5C24 6.4 23.11 5.5 22 5.5M22 16.5H9V9.17L15.5 12.5L22 9.17V16.5M15.5 10.81L9 7.5H22L15.5 10.81M5 16.5C5 16.67 5.03 16.83 5.05 17H1C.448 17 0 16.55 0 16S.448 15 1 15H5V16.5M3 7H5.05C5.03 7.17 5 7.33 5 7.5V9H3C2.45 9 2 8.55 2 8S2.45 7 3 7M1 12C1 11.45 1.45 11 2 11H5V13H2C1.45 13 1 12.55 1 12Z',\n magnify:\n 'M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z',\n 'page-layout-header-footer':\n 'M18 2H6C4.89 2 4 2.9 4 4V20C4 21.11 4.89 22 6 22H18C19.11 22 20 21.11 20 20V4C20 2.9 19.11 2 18 2M18 20H6V16H18V20M18 8H6V4H18V8Z',\n 'check-circle-outline':\n 'M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M12 20C7.59 20 4 16.41 4 12S7.59 4 12 4 20 7.59 20 12 16.41 20 12 20M16.59 7.58L10 14.17L7.41 11.59L6 13L10 17L18 9L16.59 7.58Z',\n 'format-quote-open': 'M10,7L8,11H11V17H5V11L7,7H10M18,7L16,11H19V17H13V11L15,7H18Z',\n} as const\n\ntype IconId = keyof typeof ICONS\n\nconst icon = (id: string, iconId: IconId, color = 'primary.main'): NodeSpec => ({\n id,\n componentId: 'icon',\n props: { iconId, iconPath: ICONS[iconId], size: 32 },\n sx: { color },\n})\n\n/** A click that brings a section of the page into view under the header. */\nconst scrollTo = (targetId: string, name: string): NodeInteraction[] => [\n {\n id: 'scroll-to-section',\n name: `Scroll to ${name}`,\n enabled: true,\n trigger: { event: 'elementClick', everyTime: true },\n steps: [\n {\n type: 'scrollTo',\n selector: nodeInteractionSelector(targetId),\n offsetPx: HEADER_OFFSET_PX,\n },\n ],\n },\n]\n\nconst button = (\n id: string,\n label: string,\n variant: 'contained' | 'outlined',\n target: { id: string; name: string },\n extra?: Record<string, unknown>,\n): NodeSpec => ({\n id,\n componentId: 'muiButton',\n props: { variant, size: 'large', children: label, ...extra },\n interactions: scrollTo(target.id, target.name),\n})\n\nconst CONTACT = { id: DEFAULT_HOME_CONTACT_SECTION_ID, name: 'the contact form' }\nconst FEATURES = { id: DEFAULT_HOME_FEATURES_SECTION_ID, name: 'what is included' }\n\n/**\n * One full-width band: a semantic `section` carrying the band's background,\n * around a Container at a stock width carrying its rhythm (AGL-1298).\n */\nconst band = (\n id: string,\n ariaLabel: string,\n width: 'md' | 'lg' | 'xl',\n children: NodeSpec[],\n sx?: Record<string, unknown>,\n): NodeSpec => ({\n id,\n componentId: 'section',\n props: { element: 'section', ariaLabel },\n ...(sx ? { sx } : {}),\n children: [container(`${id}Inner`, width, 10, children)],\n})\n\n/** A section's heading block: an overline, the heading and a lede. */\nconst heading = (\n prefix: string,\n overline: string,\n title: string,\n lede: string,\n align: 'center' | 'left' = 'center',\n): NodeSpec => ({\n id: `${prefix}Heading`,\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n sx: {\n alignItems: align === 'center' ? 'center' : 'flex-start',\n marginBottom: 6,\n ...(align === 'center' ? { marginLeft: 'auto', marginRight: 'auto', maxWidth: 'md' } : {}),\n },\n children: [\n text(`${prefix}Overline`, 'overline', overline, { align, color: 'primary' }),\n text(`${prefix}Title`, 'h2', title, { align }),\n text(`${prefix}Lede`, 'lede', lede, { align, color: 'text.secondary' }),\n ],\n})\n\nconst grid = (id: string, spacing: number, children: NodeSpec[], sx?: Record<string, unknown>): NodeSpec => ({\n id,\n componentId: 'muiGrid',\n props: { container: true, spacing },\n ...(sx ? { sx } : {}),\n children,\n})\n\n/**\n * A grid cell. `size` is the Grid element's STORED syntax — `'xs:12 md:6'`,\n * per-breakpoint column counts in one string — which its parser turns into\n * MUI's responsive object; an object here would be ignored.\n */\nconst cell = (id: string, size: string, children: NodeSpec[], sx?: Record<string, unknown>): NodeSpec => ({\n id,\n componentId: 'muiGrid',\n props: { size },\n ...(sx ? { sx } : {}),\n children,\n})\n\nconst photo = (\n id: string,\n image: { src: string; width: number; height: number; alt: string },\n height: string,\n loading: 'eager' | 'lazy' = 'lazy',\n): NodeSpec => ({\n id,\n componentId: 'image',\n props: {\n src: image.src,\n alt: image.alt,\n height,\n objectFit: 'cover',\n radius: 16,\n loading,\n intrinsicWidth: image.width,\n intrinsicHeight: image.height,\n },\n})\n\nconst featureCard = (id: string, iconId: IconId, title: string, body: string): NodeSpec =>\n cell(`${id}Cell`, 'xs:12 sm:6 md:4', [\n {\n id,\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { height: '100%', borderRadius: 3 },\n children: [\n {\n id: `${id}Content`,\n componentId: 'muiCardContent',\n sx: { paddingTop: 4, paddingRight: 4, paddingBottom: 4, paddingLeft: 4 },\n children: [\n {\n id: `${id}Stack`,\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n icon(`${id}Icon`, iconId),\n text(`${id}Title`, 'h5', title, { component: 'h3' }),\n text(`${id}Body`, 'body1', body, { color: 'text.secondary' }),\n ],\n },\n ],\n },\n ],\n },\n ])\n\nconst checkRow = (id: string, label: string): NodeSpec => ({\n id,\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 1.5 },\n sx: { alignItems: 'center' },\n children: [icon(`${id}Icon`, 'check-circle-outline', 'secondary.main'), text(`${id}Text`, 'body1', label)],\n})\n\nconst testimonial = (id: string, quote: string, name: string, detail: string): NodeSpec =>\n cell(`${id}Cell`, 'xs:12 md:4', [\n {\n id,\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { height: '100%', borderRadius: 3 },\n children: [\n {\n id: `${id}Content`,\n componentId: 'muiCardContent',\n sx: { paddingTop: 4, paddingRight: 4, paddingBottom: 4, paddingLeft: 4 },\n children: [\n {\n id: `${id}Stack`,\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n icon(`${id}Icon`, 'format-quote-open', 'secondary.main'),\n text(`${id}Quote`, 'body1', quote),\n {\n id: `${id}By`,\n componentId: 'muiStack',\n props: { spacing: 0 },\n children: [\n text(`${id}Name`, 'subtitle2', name),\n text(`${id}Detail`, 'body2', detail, { color: 'text.secondary' }),\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ])\n\nconst faq = (id: string, question: string, answer: string, defaultExpanded = false): NodeSpec => ({\n id,\n componentId: 'muiAccordion',\n props: { disableGutters: true, ...(defaultExpanded ? { defaultExpanded: true } : {}) },\n sx: { borderRadius: 2 },\n children: [\n {\n id: `${id}Q`,\n componentId: 'muiAccordionSummary',\n props: { children: question },\n sx: { fontWeight: 700, fontSize: '1rem', paddingTop: 1, paddingBottom: 1 },\n },\n {\n id: `${id}A`,\n componentId: 'muiAccordionDetails',\n children: [text(`${id}AText`, 'body1', answer, { color: 'text.secondary' })],\n },\n ],\n})\n\n/**\n * The contact form. `pluginId: 'forms'` because a node names the bundle that\n * REGISTERS its component, and that is what decides whether the form draws\n * with the page or arrives after hydration (see the forms plugin's\n * `form-survives-the-bundle-move.spec.tsx`).\n */\nconst contactForm = (): NodeSpec => ({\n id: 'dh_form',\n componentId: 'form',\n pluginId: 'forms',\n props: {\n formName: 'Contact',\n submitLabel: 'Send message',\n successMessage: 'Thanks — your message is on its way. We will be in touch soon.',\n },\n // Each field is MUI's separate form elements (Form Control › Form Label +\n // Input), so an owner styles the label and the box on their own. The field\n // ids are the ones the all-in-one Form Field had.\n children: [\n textField('dh_fName', { name: 'name', label: 'Name', required: true }),\n textField('dh_fEmail', { name: 'email', label: 'Email', type: 'email', required: true }),\n textField('dh_fMessage', { name: 'message', label: 'Message', multiline: true, required: true }),\n ],\n})\n\n/** What a search result and a shared link say about the home page. */\nexport function defaultHomeDescription(siteName: string): string {\n const name = siteName.trim() || 'our website'\n return `Welcome to ${name}. See what we do, browse our work and get in touch.`\n}\n\n/**\n * The home page every new site is born with (AGL-3497, after AGL-3408).\n *\n * Its `seo` is written onto the screen, and the site's header and footer come\n * from the layout `buildDefaultSiteLayout` makes, which the provisioning\n * write binds it to.\n *\n * The site's name is written in as text, not bound: a page has no token for\n * it, and the heading is the first thing an owner rewrites anyway.\n */\nexport function buildDefaultHomeScreen(siteName: string): StarterTemplateScreen {\n const name = siteName.trim() || 'Welcome'\n return {\n key: 'home',\n displayName: 'Home',\n slug: SCREEN_ROOT_PATH,\n seo: { title: name, description: defaultHomeDescription(siteName) },\n // Its sections move as an author would set them up (AGL-3838): the hero\n // climbs in on load, the rest slide in on scroll, the cards one by one.\n nodes: applyElementMotion(buildNodes([\n // ── Hero ────────────────────────────────────────────────────────────\n band(\n 'dh_heroSection',\n 'Introduction',\n 'xl',\n [\n grid('dh_heroGrid', 6, [\n cell('dh_heroTextCell', 'xs:12 md:6', [\n {\n id: 'dh_hero',\n componentId: 'muiStack',\n props: { spacing: 3 },\n children: [\n text('dh_heroOverline', 'overline', 'Welcome to your new website', { color: 'primary' }),\n text('dh_heroTitle', 'h1', name),\n text(\n 'dh_heroSub',\n 'lede',\n 'This page is ready to make your own. Every heading, photo, ' +\n 'button and color on it can be changed in the Besigner, and ' +\n 'nothing you change goes live until you press Publish.',\n { color: 'text.secondary' },\n ),\n {\n id: 'dh_heroActions',\n componentId: 'muiStack',\n props: { direction: 'row' },\n // `gap`, not `spacing`: Stack spacing is a margin on every\n // child after the first, so a button that wraps onto a\n // second line keeps a left margin it no longer needs.\n sx: { flexWrap: 'wrap', gap: 2 },\n children: [\n button('dh_heroCta', 'Get in touch', 'contained', CONTACT),\n button('dh_heroMore', 'See what’s included', 'outlined', FEATURES),\n ],\n },\n ],\n },\n ], { alignSelf: 'center' }),\n cell('dh_heroImageCell', 'xs:12 md:6', [\n photo(\n 'dh_heroImage',\n DEFAULT_SITE_IMAGES.hero,\n '420px',\n 'eager',\n ),\n ]),\n ]),\n ],\n { bgcolor: 'background.paper' },\n ),\n\n // ── Features ────────────────────────────────────────────────────────\n band(DEFAULT_HOME_FEATURES_SECTION_ID, 'What is included', 'xl', [\n heading(\n 'dh_features',\n 'What’s already here',\n 'Everything a real website needs, ready to edit',\n 'Each block on this page shows one thing you can do. Keep the ones ' +\n 'you need, delete the rest, and add more from the elements panel.',\n ),\n grid('dh_featuresGrid', 3, [\n featureCard(\n 'dh_f1',\n 'pencil-outline',\n 'Edit right on the page',\n 'Click any heading, paragraph or button in the Besigner and type. ' +\n 'Changes stay a draft until you press Publish.',\n ),\n featureCard(\n 'dh_f2',\n 'palette-outline',\n 'Your colors and fonts',\n 'The colors and typefaces here come from your site theme. Change ' +\n 'them once under Setup → Theme and every page follows.',\n ),\n featureCard(\n 'dh_f3',\n 'image-multiple-outline',\n 'Photos you choose',\n 'Upload your own pictures under Media, then pick one for any image ' +\n 'on the page — the photos here are placeholders.',\n ),\n featureCard(\n 'dh_f4',\n 'email-fast-outline',\n 'A contact form that works',\n 'The form at the bottom of this page is live. Every message is ' +\n 'saved under Forms, and you are notified when one arrives.',\n ),\n featureCard(\n 'dh_f5',\n 'magnify',\n 'Ready to be found',\n 'Set the title, description and image that search results and ' +\n 'shared links show under Setup → SEO.',\n ),\n featureCard(\n 'dh_f6',\n 'page-layout-header-footer',\n 'One header and footer',\n 'The header and footer are a shared layout. Edit them once under ' +\n 'Layouts and every page you add uses them.',\n ),\n ]),\n ]),\n\n // ── About ───────────────────────────────────────────────────────────\n band(\n 'dh_aboutSection',\n 'About us',\n 'xl',\n [\n grid('dh_aboutGrid', 6, [\n cell('dh_aboutImageCell', 'xs:12 md:6', [\n photo(\n 'dh_aboutImage',\n DEFAULT_SITE_IMAGES.about,\n '440px',\n ),\n ]),\n cell('dh_aboutTextCell', 'xs:12 md:6', [\n {\n id: 'dh_about',\n componentId: 'muiStack',\n props: { spacing: 2.5 },\n children: [\n text('dh_aboutOverline', 'overline', 'About us', { color: 'primary' }),\n text('dh_aboutTitle', 'h2', 'Tell visitors who you are'),\n text(\n 'dh_aboutBody',\n 'body1',\n 'People want to know who is behind a business before they get ' +\n 'in touch. Replace this with how you started, who you help ' +\n 'and what makes your work different.',\n { color: 'text.secondary' },\n ),\n text(\n 'dh_aboutBody2',\n 'body1',\n 'A few honest sentences and a real photo of you or your team ' +\n 'will do more than a long page.',\n { color: 'text.secondary' },\n ),\n {\n id: 'dh_aboutChecks',\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n checkRow('dh_aboutCheck1', 'Say what you do in one sentence'),\n checkRow('dh_aboutCheck2', 'Show the people behind the work'),\n checkRow('dh_aboutCheck3', 'Tell visitors what to do next'),\n ],\n },\n {\n id: 'dh_aboutActions',\n componentId: 'muiStack',\n props: { direction: 'row' },\n children: [button('dh_aboutCta', 'Contact us', 'outlined', CONTACT)],\n },\n ],\n },\n ], { alignSelf: 'center' }),\n ]),\n ],\n { bgcolor: 'background.paper' },\n ),\n\n // ── Gallery ─────────────────────────────────────────────────────────\n band('dh_gallerySection', 'Gallery', 'xl', [\n heading(\n 'dh_gallery',\n 'Gallery',\n 'Show your work',\n 'Three photos in a grid that reflows on a phone. Replace them with ' +\n 'your products, projects or space, or add more to the grid.',\n ),\n grid('dh_galleryGrid', 3, [\n cell('dh_g1Cell', 'xs:12 sm:4', [\n photo('dh_g1', DEFAULT_SITE_IMAGES.desk, '320px'),\n ]),\n cell('dh_g2Cell', 'xs:12 sm:4', [\n photo('dh_g2', DEFAULT_SITE_IMAGES.plants, '320px'),\n ]),\n cell('dh_g3Cell', 'xs:12 sm:4', [\n photo('dh_g3', DEFAULT_SITE_IMAGES.craft, '320px'),\n ]),\n ]),\n ]),\n\n // ── Testimonials ────────────────────────────────────────────────────\n band(\n 'dh_testimonialsSection',\n 'What people say',\n 'xl',\n [\n heading(\n 'dh_testimonials',\n 'Testimonials',\n 'What people say',\n 'A few words from real customers build trust faster than anything ' +\n 'you can say about yourself. Replace these with quotes of your own.',\n ),\n grid('dh_testimonialsGrid', 3, [\n testimonial(\n 'dh_t1',\n 'Put a short quote from a happy customer here: one or two ' +\n 'sentences about the result you got them.',\n 'Customer name',\n 'Their business',\n ),\n testimonial(\n 'dh_t2',\n 'Pick quotes that answer what a new visitor is unsure about, ' +\n 'like price, timing or quality.',\n 'Customer name',\n 'Their city',\n ),\n testimonial(\n 'dh_t3',\n 'Ask before you publish a quote, and use the person’s real name ' +\n 'and photo if they are happy for you to.',\n 'Customer name',\n 'Their role',\n ),\n ]),\n ],\n { bgcolor: 'background.paper' },\n ),\n\n // ── FAQ ─────────────────────────────────────────────────────────────\n band('dh_faqSection', 'Frequently asked questions', 'md', [\n heading(\n 'dh_faq',\n 'FAQ',\n 'Frequently asked questions',\n 'Answer the questions people ask you most. These answers are about ' +\n 'building this site, so replace them with your own.',\n ),\n {\n id: 'dh_faqList',\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n faq(\n 'dh_q1',\n 'How do I change what this page says?',\n 'Open this page in the Besigner. When you are signed in, the bar ' +\n 'across the top of your live site opens it in one click. Click ' +\n 'any text to edit it, then press Publish.',\n true,\n ),\n faq(\n 'dh_q2',\n 'How do I add another page?',\n 'Open Pages in your site’s menu and create one. It gets this ' +\n 'header and footer automatically, and you can link to it from ' +\n 'the header.',\n ),\n faq(\n 'dh_q3',\n 'Where do messages from the contact form go?',\n 'Every message sent through the form below is saved under Forms, ' +\n 'where you can read it and keep track of who you have answered.',\n ),\n faq(\n 'dh_q4',\n 'Can I use my own domain name?',\n 'Yes. Custom domains are included from the Starter plan. Connect ' +\n 'one from your site’s Admin page, under Custom Domain.',\n ),\n faq(\n 'dh_q5',\n 'Will search engines find my site?',\n 'Yes. This site is published and open to search engines from day ' +\n 'one. Fill in Setup → SEO so results show the title and ' +\n 'description you want.',\n ),\n ],\n },\n ]),\n\n // ── Call to action ──────────────────────────────────────────────────\n band(\n 'dh_ctaSection',\n 'Get started',\n 'md',\n [\n {\n id: 'dh_cta',\n componentId: 'muiStack',\n props: { spacing: 3 },\n sx: { alignItems: 'center' },\n children: [\n text('dh_ctaTitle', 'h2', 'Ready to make it yours?', { align: 'center' }),\n text(\n 'dh_ctaBody',\n 'lede',\n 'Change the words, swap the photos and pick your colors, then ' +\n 'share your link with the world.',\n { align: 'center' },\n ),\n {\n // A paper-colored button on the primary band: `inherit` would\n // take the band's text color as a grey fill, and `primary`\n // would vanish into the band it sits on.\n ...button('dh_ctaButton', 'Get in touch', 'contained', CONTACT),\n sx: {\n bgcolor: 'background.paper',\n color: 'text.primary',\n '&:hover': { bgcolor: 'background.default' },\n },\n },\n ],\n },\n ],\n { bgcolor: 'primary.main', color: 'primary.contrastText' },\n ),\n\n // ── Contact ─────────────────────────────────────────────────────────\n band(DEFAULT_HOME_CONTACT_SECTION_ID, 'Contact', 'md', [\n heading(\n 'dh_contact',\n 'Contact',\n 'Get in touch',\n 'Questions, quotes or bookings: send a message and we will reply as ' +\n 'soon as we can.',\n ),\n contactForm(),\n ]),\n ])),\n }\n}\n\n/** The shared header and footer every page of a new site renders inside. */\nexport interface DefaultSiteLayout {\n displayName: string\n description: string\n nodes: Record<string, any>\n}\n\n/**\n * The header and footer a new site is born with (AGL-3497).\n *\n * The brand reads `{{host.businessName}}`, so it follows the site's name in\n * Setup rather than freezing the one it was created under. The header's\n * Contact button scrolls to the home page's contact section; on another page\n * it has nothing to scroll to and does nothing, which is the step's own rule.\n *\n * `homeScreenId` is the home page the brand and the footer's Home link point\n * at — a link by id, so it survives a slug change.\n */\nexport function buildDefaultSiteLayout(homeScreenId: string): DefaultSiteLayout {\n const brand = '{{host.businessName}}'\n return {\n displayName: 'Site header and footer',\n description: 'The header and footer every page of this site shows.',\n nodes: buildNodes([\n {\n id: 'dl_header',\n componentId: 'muiAppBar',\n props: { position: 'sticky', color: 'inherit', component: 'header', ariaLabel: 'Site header' },\n sx: { bgcolor: 'background.paper', boxShadow: 'none', borderBottom: 1, borderColor: 'divider' },\n children: [\n {\n id: 'dl_headerInner',\n componentId: 'muiContainer',\n props: { maxWidth: 'xl' },\n children: [\n {\n id: 'dl_toolbar',\n componentId: 'muiToolbar',\n props: { disableGutters: true },\n sx: { columnGap: 2 },\n children: [\n {\n id: 'dl_brand',\n componentId: 'muiScreenLink',\n props: { children: brand, screenId: homeScreenId, renderAs: 'link', color: 'inherit' },\n sx: { fontWeight: 800, fontSize: '1.25rem', textDecoration: 'none', flexGrow: 1 },\n },\n {\n id: 'dl_search',\n componentId: 'searchBox',\n props: { placeholder: 'Search' },\n sx: { display: { xs: 'none', md: 'flex' }, width: 220 },\n },\n { id: 'dl_mode', componentId: 'themeModeSwitcher', props: { variant: 'icon' } },\n {\n id: 'dl_contact',\n componentId: 'muiButton',\n props: { variant: 'contained', children: 'Contact us' },\n sx: { whiteSpace: 'nowrap', flexShrink: 0 },\n interactions: scrollTo(CONTACT.id, CONTACT.name),\n },\n ],\n },\n ],\n },\n ],\n },\n { id: 'dl_slot', componentId: 'layoutSlot', props: { component: 'main' } },\n {\n id: 'dl_footer',\n componentId: 'section',\n props: { element: 'footer', ariaLabel: 'Site footer' },\n sx: { bgcolor: 'background.paper', borderTop: 1, borderColor: 'divider' },\n children: [\n container('dl_footerInner', 'xl', 8, [\n grid('dl_footerGrid', 4, [\n cell('dl_footerBrandCell', 'xs:12 md:6', [\n {\n id: 'dl_footerBrand',\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n text('dl_footerName', 'h6', brand, { component: 'p' }),\n text(\n 'dl_footerAbout',\n 'body2',\n 'This footer is part of your site’s shared layout. Edit it ' +\n 'once under Layouts and it changes on every page.',\n { color: 'text.secondary' },\n ),\n ],\n },\n ]),\n cell('dl_footerLinksCell', 'xs:6 md:3', [\n {\n id: 'dl_footerLinks',\n componentId: 'muiStack',\n props: { spacing: 1 },\n children: [\n text('dl_footerLinksTitle', 'subtitle2', 'Explore', { component: 'p' }),\n {\n id: 'dl_footerHome',\n componentId: 'muiScreenLink',\n props: { children: 'Home', screenId: homeScreenId, renderAs: 'link', color: 'inherit' },\n },\n {\n id: 'dl_footerSearch',\n componentId: 'muiScreenLink',\n props: { children: 'Search', href: '/search', renderAs: 'link', color: 'inherit' },\n },\n ],\n },\n ]),\n cell('dl_footerFollowCell', 'xs:6 md:3', [\n {\n id: 'dl_footerFollow',\n componentId: 'muiStack',\n props: { spacing: 1 },\n children: [\n text('dl_footerFollowTitle', 'subtitle2', 'Follow along', { component: 'p' }),\n text(\n 'dl_footerFollowBody',\n 'body2',\n 'Add your social profiles to the links element here and ' +\n 'their icons appear.',\n { color: 'text.secondary' },\n ),\n { id: 'dl_footerSocial', componentId: 'socialLinks', props: {} },\n ],\n },\n ]),\n ]),\n {\n ...text('dl_footerCopyright', 'caption', `© ${brand}. All rights reserved.`, {\n color: 'text.secondary',\n component: 'p',\n }),\n sx: { marginTop: 6, paddingTop: 3, borderTop: 1, borderColor: 'divider' },\n },\n ]),\n ],\n },\n ]),\n }\n}\n\n/**\n * The theme a new site starts with (AGL-3497): an indigo and teal palette on\n * a soft neutral ground, one Google family, rounder corners and buttons that\n * do not shout. Written as the site's own `theme`, so the theme library files\n * it as \"Site theme\" and keeps it when the owner switches to another.\n *\n * Dark is authored too, because a visitor's device decides which one they\n * see, and the header's switcher lets them choose.\n */\nexport const DEFAULT_SITE_THEME: HostTheme = {\n colorSchemes: {\n light: {\n primary: { main: '#4338ca', light: '#6366f1', dark: '#3730a3', contrastText: '#ffffff' },\n secondary: { main: '#0f766e', light: '#14b8a6', dark: '#115e59', contrastText: '#ffffff' },\n tertiary: { main: '#b45309', light: '#d97706', dark: '#92400e', contrastText: '#ffffff' },\n surface: { main: '#f1f5f9', contrastText: '#0f172a' },\n background: {\n default: '#f8fafc',\n paper: '#ffffff',\n },\n text: { primary: '#0f172a', secondary: '#475569', disabled: '#94a3b8' },\n tint: { primary: '#eef2ff', secondary: '#f0fdfa', tertiary: '#fffbeb' },\n divider: '#e2e8f0',\n },\n dark: {\n primary: { main: '#a5b4fc', light: '#c7d2fe', dark: '#818cf8', contrastText: '#1e1b4b' },\n secondary: { main: '#5eead4', light: '#99f6e4', dark: '#2dd4bf', contrastText: '#042f2e' },\n tertiary: { main: '#fcd34d', light: '#fde68a', dark: '#fbbf24', contrastText: '#451a03' },\n surface: { main: '#1e293b', contrastText: '#e2e8f0' },\n background: {\n default: '#0b1120',\n paper: '#111827',\n },\n text: { primary: '#e2e8f0', secondary: '#94a3b8', disabled: '#475569' },\n tint: { primary: '#1e1b4b', secondary: '#042f2e', tertiary: '#451a03' },\n divider: '#1e293b',\n },\n },\n fonts: [{ family: 'Plus Jakarta Sans', weights: [400, 500, 600, 700, 800], source: 'google' }],\n typography: {\n fontFamily: '\"Plus Jakarta Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif',\n variants: {\n h1: { fontSize: '3.25rem', fontWeight: 800, lineHeight: 1.1, letterSpacing: '-0.02em' },\n h2: { fontSize: '2.25rem', fontWeight: 800, lineHeight: 1.15, letterSpacing: '-0.015em' },\n h3: { fontSize: '1.75rem', fontWeight: 700, lineHeight: 1.2 },\n h4: { fontSize: '1.5rem', fontWeight: 700, lineHeight: 1.25 },\n h5: { fontSize: '1.25rem', fontWeight: 700, lineHeight: 1.3 },\n h6: { fontSize: '1.125rem', fontWeight: 700, lineHeight: 1.35 },\n lede: { fontSize: '1.1875rem', fontWeight: 400, lineHeight: 1.6 },\n overline: { fontSize: '0.8125rem', fontWeight: 700, letterSpacing: '0.12em' },\n button: { fontWeight: 700, textTransform: 'none' },\n },\n },\n shape: { borderRadius: 12 },\n}\n\n/** The site-wide SEO a new site starts with: its name, a description and a sharing image. */\nexport function defaultSiteSeo(siteName: string): Record<string, unknown> {\n return {\n title: siteName.trim() || 'Welcome',\n description: defaultHomeDescription(siteName),\n image: DEFAULT_SITE_IMAGES.hero.src,\n imageWidth: DEFAULT_SITE_IMAGES.hero.width,\n imageHeight: DEFAULT_SITE_IMAGES.hero.height,\n imageAlt: 'A small team working together around a table in a bright office',\n }\n}\n"],"names":["nodeInteractionSelector","SCREEN_ROOT_PATH","applyElementMotion","buildStarterNodes","buildNodes","starterSection","container","starterText","text","starterTextField","textField","DEFAULT_SITE_IMAGE_BASE","DEFAULT_SITE_IMAGES","hero","src","width","height","alt","about","desk","plants","craft","DEFAULT_HOME_CONTACT_SECTION_ID","DEFAULT_HOME_FEATURES_SECTION_ID","HEADER_OFFSET_PX","ICONS","magnify","icon","id","iconId","color","componentId","props","iconPath","size","sx","scrollTo","targetId","name","enabled","trigger","event","everyTime","steps","type","selector","offsetPx","button","label","variant","target","extra","children","interactions","CONTACT","FEATURES","band","ariaLabel","element","heading","prefix","overline","title","lede","align","spacing","alignItems","marginBottom","marginLeft","marginRight","maxWidth","grid","cell","photo","image","loading","objectFit","radius","intrinsicWidth","intrinsicHeight","featureCard","body","borderRadius","paddingTop","paddingRight","paddingBottom","paddingLeft","component","checkRow","direction","testimonial","quote","detail","faq","question","answer","defaultExpanded","disableGutters","fontWeight","fontSize","contactForm","pluginId","formName","submitLabel","successMessage","required","multiline","defaultHomeDescription","siteName","trim","buildDefaultHomeScreen","key","displayName","slug","seo","description","nodes","flexWrap","gap","alignSelf","bgcolor","buildDefaultSiteLayout","homeScreenId","brand","position","boxShadow","borderBottom","borderColor","columnGap","screenId","renderAs","textDecoration","flexGrow","placeholder","display","xs","md","whiteSpace","flexShrink","borderTop","href","marginTop","DEFAULT_SITE_THEME","colorSchemes","light","primary","main","dark","contrastText","secondary","tertiary","surface","background","default","paper","disabled","tint","divider","fonts","family","weights","source","typography","fontFamily","variants","h1","lineHeight","letterSpacing","h2","h3","h4","h5","h6","textTransform","shape","defaultSiteSeo","imageWidth","imageHeight","imageAlt"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC;AAGD,SAASA,uBAAuB,QAAQ,yBAAqB;AAC7D,SAASC,gBAAgB,QAAQ,oBAAgB;AACjD,SAASC,kBAAkB,QAAQ,sBAAkB;AACrD,SACEC,qBAAqBC,UAAU,EAC/BC,kBAAkBC,SAAS,EAC3BC,eAAeC,IAAI,EACnBC,oBAAoBC,SAAS,QAGxB,8BAA0B;AAEjC;;;;;;;;;;;;;;;;;;;;;CAqBC,GAED,kFAAkF,GAClF,OAAO,MAAMC,0BAA0B,mBAAkB;AAEzD;;;;CAIC,GACD,OAAO,MAAMC,sBAAsB;IACjCC,MAAM;QACJC,KAAK,GAAGH,wBAAwB,cAAc,CAAC;QAC/CI,OAAO;QACPC,QAAQ;QACRC,KAAK;IACP;IACAC,OAAO;QACLJ,KAAK,GAAGH,wBAAwB,gBAAgB,CAAC;QACjDI,OAAO;QACPC,QAAQ;QACRC,KAAK;IACP;IACAE,MAAM;QACJL,KAAK,GAAGH,wBAAwB,iBAAiB,CAAC;QAClDI,OAAO;QACPC,QAAQ;QACRC,KAAK;IACP;IACAG,QAAQ;QACNN,KAAK,GAAGH,wBAAwB,mBAAmB,CAAC;QACpDI,OAAO;QACPC,QAAQ;QACRC,KAAK;IACP;IACAI,OAAO;QACLP,KAAK,GAAGH,wBAAwB,kBAAkB,CAAC;QACnDI,OAAO;QACPC,QAAQ;QACRC,KAAK;IACP;AACF,EAAU;AAEV,+EAA+E,GAC/E,OAAO,MAAMK,kCAAkC,oBAAmB;AAClE,OAAO,MAAMC,mCAAmC,qBAAoB;AAEpE,iEAAiE,GACjE,MAAMC,mBAAmB;AAEzB;;;;CAIC,GACD,MAAMC,QAAQ;IACZ,kBACE;IACF,mBACE;IACF,0BACE;IACF,sBACE;IACFC,SACE;IACF,6BACE;IACF,wBACE;IACF,qBAAqB;AACvB;AAIA,MAAMC,OAAO,CAACC,IAAYC,QAAgBC,QAAQ,cAAc,GAAgB,CAAA;QAC9EF;QACAG,aAAa;QACbC,OAAO;YAAEH;YAAQI,UAAUR,KAAK,CAACI,OAAO;YAAEK,MAAM;QAAG;QACnDC,IAAI;YAAEL;QAAM;IACd,CAAA;AAEA,0EAA0E,GAC1E,MAAMM,WAAW,CAACC,UAAkBC,OAAoC;QACtE;YACEV,IAAI;YACJU,MAAM,CAAC,UAAU,EAAEA,MAAM;YACzBC,SAAS;YACTC,SAAS;gBAAEC,OAAO;gBAAgBC,WAAW;YAAK;YAClDC,OAAO;gBACL;oBACEC,MAAM;oBACNC,UAAU7C,wBAAwBqC;oBAClCS,UAAUtB;gBACZ;aACD;QACH;KACD;AAED,MAAMuB,SAAS,CACbnB,IACAoB,OACAC,SACAC,QACAC,QACc,CAAA;QACdvB;QACAG,aAAa;QACbC,OAAO;YAAEiB;YAASf,MAAM;YAASkB,UAAUJ;WAAUG;QACrDE,cAAcjB,SAASc,OAAOtB,EAAE,EAAEsB,OAAOZ,IAAI;IAC/C,CAAA;AAEA,MAAMgB,UAAU;IAAE1B,IAAIN;IAAiCgB,MAAM;AAAmB;AAChF,MAAMiB,WAAW;IAAE3B,IAAIL;IAAkCe,MAAM;AAAmB;AAElF;;;CAGC,GACD,MAAMkB,OAAO,CACX5B,IACA6B,WACA1C,OACAqC,UACAjB,KACc;QACdP;QACAG,aAAa;QACbC,OAAO;YAAE0B,SAAS;YAAWD;QAAU;OACnCtB,KAAK;QAAEA;IAAG,IAAI,CAAC;QACnBiB,UAAU;YAAC9C,UAAU,GAAGsB,GAAG,KAAK,CAAC,EAAEb,OAAO,IAAIqC;SAAU;;AAG1D,oEAAoE,GACpE,MAAMO,UAAU,CACdC,QACAC,UACAC,OACAC,MACAC,QAA2B,QAAQ,GACrB,CAAA;QACdpC,IAAI,GAAGgC,OAAO,OAAO,CAAC;QACtB7B,aAAa;QACbC,OAAO;YAAEiC,SAAS;QAAI;QACtB9B,IAAI;YACF+B,YAAYF,UAAU,WAAW,WAAW;YAC5CG,cAAc;WACVH,UAAU,WAAW;YAAEI,YAAY;YAAQC,aAAa;YAAQC,UAAU;QAAK,IAAI,CAAC;QAE1FlB,UAAU;YACR5C,KAAK,GAAGoD,OAAO,QAAQ,CAAC,EAAE,YAAYC,UAAU;gBAAEG;gBAAOlC,OAAO;YAAU;YAC1EtB,KAAK,GAAGoD,OAAO,KAAK,CAAC,EAAE,MAAME,OAAO;gBAAEE;YAAM;YAC5CxD,KAAK,GAAGoD,OAAO,IAAI,CAAC,EAAE,QAAQG,MAAM;gBAAEC;gBAAOlC,OAAO;YAAiB;SACtE;IACH,CAAA;AAEA,MAAMyC,OAAO,CAAC3C,IAAYqC,SAAiBb,UAAsBjB,KAA4C;QAC3GP;QACAG,aAAa;QACbC,OAAO;YAAE1B,WAAW;YAAM2D;QAAQ;OAC9B9B,KAAK;QAAEA;IAAG,IAAI,CAAC;QACnBiB;;AAGF;;;;CAIC,GACD,MAAMoB,OAAO,CAAC5C,IAAYM,MAAckB,UAAsBjB,KAA4C;QACxGP;QACAG,aAAa;QACbC,OAAO;YAAEE;QAAK;OACVC,KAAK;QAAEA;IAAG,IAAI,CAAC;QACnBiB;;AAGF,MAAMqB,QAAQ,CACZ7C,IACA8C,OACA1D,QACA2D,UAA4B,MAAM,GACpB,CAAA;QACd/C;QACAG,aAAa;QACbC,OAAO;YACLlB,KAAK4D,MAAM5D,GAAG;YACdG,KAAKyD,MAAMzD,GAAG;YACdD;YACA4D,WAAW;YACXC,QAAQ;YACRF;YACAG,gBAAgBJ,MAAM3D,KAAK;YAC3BgE,iBAAiBL,MAAM1D,MAAM;QAC/B;IACF,CAAA;AAEA,MAAMgE,cAAc,CAACpD,IAAYC,QAAgBiC,OAAemB,OAC9DT,KAAK,GAAG5C,GAAG,IAAI,CAAC,EAAE,mBAAmB;QACnC;YACEA;YACAG,aAAa;YACbC,OAAO;gBAAEiB,SAAS;YAAW;YAC7Bd,IAAI;gBAAEnB,QAAQ;gBAAQkE,cAAc;YAAE;YACtC9B,UAAU;gBACR;oBACExB,IAAI,GAAGA,GAAG,OAAO,CAAC;oBAClBG,aAAa;oBACbI,IAAI;wBAAEgD,YAAY;wBAAGC,cAAc;wBAAGC,eAAe;wBAAGC,aAAa;oBAAE;oBACvElC,UAAU;wBACR;4BACExB,IAAI,GAAGA,GAAG,KAAK,CAAC;4BAChBG,aAAa;4BACbC,OAAO;gCAAEiC,SAAS;4BAAI;4BACtBb,UAAU;gCACRzB,KAAK,GAAGC,GAAG,IAAI,CAAC,EAAEC;gCAClBrB,KAAK,GAAGoB,GAAG,KAAK,CAAC,EAAE,MAAMkC,OAAO;oCAAEyB,WAAW;gCAAK;gCAClD/E,KAAK,GAAGoB,GAAG,IAAI,CAAC,EAAE,SAASqD,MAAM;oCAAEnD,OAAO;gCAAiB;6BAC5D;wBACH;qBACD;gBACH;aACD;QACH;KACD;AAEH,MAAM0D,WAAW,CAAC5D,IAAYoB,QAA6B,CAAA;QACzDpB;QACAG,aAAa;QACbC,OAAO;YAAEyD,WAAW;YAAOxB,SAAS;QAAI;QACxC9B,IAAI;YAAE+B,YAAY;QAAS;QAC3Bd,UAAU;YAACzB,KAAK,GAAGC,GAAG,IAAI,CAAC,EAAE,wBAAwB;YAAmBpB,KAAK,GAAGoB,GAAG,IAAI,CAAC,EAAE,SAASoB;SAAO;IAC5G,CAAA;AAEA,MAAM0C,cAAc,CAAC9D,IAAY+D,OAAerD,MAAcsD,SAC5DpB,KAAK,GAAG5C,GAAG,IAAI,CAAC,EAAE,cAAc;QAC9B;YACEA;YACAG,aAAa;YACbC,OAAO;gBAAEiB,SAAS;YAAW;YAC7Bd,IAAI;gBAAEnB,QAAQ;gBAAQkE,cAAc;YAAE;YACtC9B,UAAU;gBACR;oBACExB,IAAI,GAAGA,GAAG,OAAO,CAAC;oBAClBG,aAAa;oBACbI,IAAI;wBAAEgD,YAAY;wBAAGC,cAAc;wBAAGC,eAAe;wBAAGC,aAAa;oBAAE;oBACvElC,UAAU;wBACR;4BACExB,IAAI,GAAGA,GAAG,KAAK,CAAC;4BAChBG,aAAa;4BACbC,OAAO;gCAAEiC,SAAS;4BAAE;4BACpBb,UAAU;gCACRzB,KAAK,GAAGC,GAAG,IAAI,CAAC,EAAE,qBAAqB;gCACvCpB,KAAK,GAAGoB,GAAG,KAAK,CAAC,EAAE,SAAS+D;gCAC5B;oCACE/D,IAAI,GAAGA,GAAG,EAAE,CAAC;oCACbG,aAAa;oCACbC,OAAO;wCAAEiC,SAAS;oCAAE;oCACpBb,UAAU;wCACR5C,KAAK,GAAGoB,GAAG,IAAI,CAAC,EAAE,aAAaU;wCAC/B9B,KAAK,GAAGoB,GAAG,MAAM,CAAC,EAAE,SAASgE,QAAQ;4CAAE9D,OAAO;wCAAiB;qCAChE;gCACH;6BACD;wBACH;qBACD;gBACH;aACD;QACH;KACD;AAEH,MAAM+D,MAAM,CAACjE,IAAYkE,UAAkBC,QAAgBC,kBAAkB,KAAK,GAAgB,CAAA;QAChGpE;QACAG,aAAa;QACbC,OAAO;YAAEiE,gBAAgB;WAAUD,kBAAkB;YAAEA,iBAAiB;QAAK,IAAI,CAAC;QAClF7D,IAAI;YAAE+C,cAAc;QAAE;QACtB9B,UAAU;YACR;gBACExB,IAAI,GAAGA,GAAG,CAAC,CAAC;gBACZG,aAAa;gBACbC,OAAO;oBAAEoB,UAAU0C;gBAAS;gBAC5B3D,IAAI;oBAAE+D,YAAY;oBAAKC,UAAU;oBAAQhB,YAAY;oBAAGE,eAAe;gBAAE;YAC3E;YACA;gBACEzD,IAAI,GAAGA,GAAG,CAAC,CAAC;gBACZG,aAAa;gBACbqB,UAAU;oBAAC5C,KAAK,GAAGoB,GAAG,KAAK,CAAC,EAAE,SAASmE,QAAQ;wBAAEjE,OAAO;oBAAiB;iBAAG;YAC9E;SACD;IACH,CAAA;AAEA;;;;;CAKC,GACD,MAAMsE,cAAc,IAAiB,CAAA;QACnCxE,IAAI;QACJG,aAAa;QACbsE,UAAU;QACVrE,OAAO;YACLsE,UAAU;YACVC,aAAa;YACbC,gBAAgB;QAClB;QACA,0EAA0E;QAC1E,2EAA2E;QAC3E,kDAAkD;QAClDpD,UAAU;YACR1C,UAAU,YAAY;gBAAE4B,MAAM;gBAAQU,OAAO;gBAAQyD,UAAU;YAAK;YACpE/F,UAAU,aAAa;gBAAE4B,MAAM;gBAASU,OAAO;gBAASJ,MAAM;gBAAS6D,UAAU;YAAK;YACtF/F,UAAU,eAAe;gBAAE4B,MAAM;gBAAWU,OAAO;gBAAW0D,WAAW;gBAAMD,UAAU;YAAK;SAC/F;IACH,CAAA;AAEA,oEAAoE,GACpE,OAAO,SAASE,uBAAuBC,QAAgB;IACrD,MAAMtE,OAAOsE,SAASC,IAAI,MAAM;IAChC,OAAO,CAAC,WAAW,EAAEvE,KAAK,mDAAmD,CAAC;AAChF;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASwE,uBAAuBF,QAAgB;IACrD,MAAMtE,OAAOsE,SAASC,IAAI,MAAM;IAChC,OAAO;QACLE,KAAK;QACLC,aAAa;QACbC,MAAMhH;QACNiH,KAAK;YAAEpD,OAAOxB;YAAM6E,aAAaR,uBAAuBC;QAAU;QAClE,wEAAwE;QACxE,wEAAwE;QACxEQ,OAAOlH,mBAAmBE,WAAW;YACnC,uEAAuE;YACvEoD,KACE,kBACA,gBACA,MACA;gBACEe,KAAK,eAAe,GAAG;oBACrBC,KAAK,mBAAmB,cAAc;wBACpC;4BACE5C,IAAI;4BACJG,aAAa;4BACbC,OAAO;gCAAEiC,SAAS;4BAAE;4BACpBb,UAAU;gCACR5C,KAAK,mBAAmB,YAAY,+BAA+B;oCAAEsB,OAAO;gCAAU;gCACtFtB,KAAK,gBAAgB,MAAM8B;gCAC3B9B,KACE,cACA,QACA,gEACE,gEACA,yDACF;oCAAEsB,OAAO;gCAAiB;gCAE5B;oCACEF,IAAI;oCACJG,aAAa;oCACbC,OAAO;wCAAEyD,WAAW;oCAAM;oCAC1B,2DAA2D;oCAC3D,uDAAuD;oCACvD,sDAAsD;oCACtDtD,IAAI;wCAAEkF,UAAU;wCAAQC,KAAK;oCAAE;oCAC/BlE,UAAU;wCACRL,OAAO,cAAc,gBAAgB,aAAaO;wCAClDP,OAAO,eAAe,uBAAuB,YAAYQ;qCAC1D;gCACH;6BACD;wBACH;qBACD,EAAE;wBAAEgE,WAAW;oBAAS;oBACzB/C,KAAK,oBAAoB,cAAc;wBACrCC,MACE,gBACA7D,oBAAoBC,IAAI,EACxB,SACA;qBAEH;iBACF;aACF,EACD;gBAAE2G,SAAS;YAAmB;YAGhC,uEAAuE;YACvEhE,KAAKjC,kCAAkC,oBAAoB,MAAM;gBAC/DoC,QACE,eACA,uBACA,kDACA,uEACE;gBAEJY,KAAK,mBAAmB,GAAG;oBACzBS,YACE,SACA,kBACA,0BACA,sEACE;oBAEJA,YACE,SACA,mBACA,yBACA,qEACE;oBAEJA,YACE,SACA,0BACA,qBACA,uEACE;oBAEJA,YACE,SACA,sBACA,6BACA,mEACE;oBAEJA,YACE,SACA,WACA,qBACA,kEACE;oBAEJA,YACE,SACA,6BACA,yBACA,qEACE;iBAEL;aACF;YAED,uEAAuE;YACvExB,KACE,mBACA,YACA,MACA;gBACEe,KAAK,gBAAgB,GAAG;oBACtBC,KAAK,qBAAqB,cAAc;wBACtCC,MACE,iBACA7D,oBAAoBM,KAAK,EACzB;qBAEH;oBACDsD,KAAK,oBAAoB,cAAc;wBACrC;4BACE5C,IAAI;4BACJG,aAAa;4BACbC,OAAO;gCAAEiC,SAAS;4BAAI;4BACtBb,UAAU;gCACR5C,KAAK,oBAAoB,YAAY,YAAY;oCAAEsB,OAAO;gCAAU;gCACpEtB,KAAK,iBAAiB,MAAM;gCAC5BA,KACE,gBACA,SACA,kEACE,+DACA,uCACF;oCAAEsB,OAAO;gCAAiB;gCAE5BtB,KACE,iBACA,SACA,iEACE,kCACF;oCAAEsB,OAAO;gCAAiB;gCAE5B;oCACEF,IAAI;oCACJG,aAAa;oCACbC,OAAO;wCAAEiC,SAAS;oCAAI;oCACtBb,UAAU;wCACRoC,SAAS,kBAAkB;wCAC3BA,SAAS,kBAAkB;wCAC3BA,SAAS,kBAAkB;qCAC5B;gCACH;gCACA;oCACE5D,IAAI;oCACJG,aAAa;oCACbC,OAAO;wCAAEyD,WAAW;oCAAM;oCAC1BrC,UAAU;wCAACL,OAAO,eAAe,cAAc,YAAYO;qCAAS;gCACtE;6BACD;wBACH;qBACD,EAAE;wBAAEiE,WAAW;oBAAS;iBAC1B;aACF,EACD;gBAAEC,SAAS;YAAmB;YAGhC,uEAAuE;YACvEhE,KAAK,qBAAqB,WAAW,MAAM;gBACzCG,QACE,cACA,WACA,kBACA,uEACE;gBAEJY,KAAK,kBAAkB,GAAG;oBACxBC,KAAK,aAAa,cAAc;wBAC9BC,MAAM,SAAS7D,oBAAoBO,IAAI,EAAE;qBAC1C;oBACDqD,KAAK,aAAa,cAAc;wBAC9BC,MAAM,SAAS7D,oBAAoBQ,MAAM,EAAE;qBAC5C;oBACDoD,KAAK,aAAa,cAAc;wBAC9BC,MAAM,SAAS7D,oBAAoBS,KAAK,EAAE;qBAC3C;iBACF;aACF;YAED,uEAAuE;YACvEmC,KACE,0BACA,mBACA,MACA;gBACEG,QACE,mBACA,gBACA,mBACA,sEACE;gBAEJY,KAAK,uBAAuB,GAAG;oBAC7BmB,YACE,SACA,8DACE,4CACF,iBACA;oBAEFA,YACE,SACA,iEACE,kCACF,iBACA;oBAEFA,YACE,SACA,oEACE,2CACF,iBACA;iBAEH;aACF,EACD;gBAAE8B,SAAS;YAAmB;YAGhC,uEAAuE;YACvEhE,KAAK,iBAAiB,8BAA8B,MAAM;gBACxDG,QACE,UACA,OACA,8BACA,uEACE;gBAEJ;oBACE/B,IAAI;oBACJG,aAAa;oBACbC,OAAO;wBAAEiC,SAAS;oBAAI;oBACtBb,UAAU;wBACRyC,IACE,SACA,wCACA,qEACE,mEACA,4CACF;wBAEFA,IACE,SACA,8BACA,iEACE,kEACA;wBAEJA,IACE,SACA,+CACA,qEACE;wBAEJA,IACE,SACA,iCACA,qEACE;wBAEJA,IACE,SACA,qCACA,qEACE,4DACA;qBAEL;gBACH;aACD;YAED,uEAAuE;YACvErC,KACE,iBACA,eACA,MACA;gBACE;oBACE5B,IAAI;oBACJG,aAAa;oBACbC,OAAO;wBAAEiC,SAAS;oBAAE;oBACpB9B,IAAI;wBAAE+B,YAAY;oBAAS;oBAC3Bd,UAAU;wBACR5C,KAAK,eAAe,MAAM,2BAA2B;4BAAEwD,OAAO;wBAAS;wBACvExD,KACE,cACA,QACA,kEACE,mCACF;4BAAEwD,OAAO;wBAAS;wBAEpB,aAIKjB,OAAO,gBAAgB,gBAAgB,aAAaO;4BACvDnB,IAAI;gCACFqF,SAAS;gCACT1F,OAAO;gCACP,WAAW;oCAAE0F,SAAS;gCAAqB;4BAC7C;;qBAEH;gBACH;aACD,EACD;gBAAEA,SAAS;gBAAgB1F,OAAO;YAAuB;YAG3D,uEAAuE;YACvE0B,KAAKlC,iCAAiC,WAAW,MAAM;gBACrDqC,QACE,cACA,WACA,gBACA,wEACE;gBAEJyC;aACD;SACF;IACH;AACF;AASA;;;;;;;;;;CAUC,GACD,OAAO,SAASqB,uBAAuBC,YAAoB;IACzD,MAAMC,QAAQ;IACd,OAAO;QACLX,aAAa;QACbG,aAAa;QACbC,OAAOhH,WAAW;YAChB;gBACEwB,IAAI;gBACJG,aAAa;gBACbC,OAAO;oBAAE4F,UAAU;oBAAU9F,OAAO;oBAAWyD,WAAW;oBAAU9B,WAAW;gBAAc;gBAC7FtB,IAAI;oBAAEqF,SAAS;oBAAoBK,WAAW;oBAAQC,cAAc;oBAAGC,aAAa;gBAAU;gBAC9F3E,UAAU;oBACR;wBACExB,IAAI;wBACJG,aAAa;wBACbC,OAAO;4BAAEsC,UAAU;wBAAK;wBACxBlB,UAAU;4BACR;gCACExB,IAAI;gCACJG,aAAa;gCACbC,OAAO;oCAAEiE,gBAAgB;gCAAK;gCAC9B9D,IAAI;oCAAE6F,WAAW;gCAAE;gCACnB5E,UAAU;oCACR;wCACExB,IAAI;wCACJG,aAAa;wCACbC,OAAO;4CAAEoB,UAAUuE;4CAAOM,UAAUP;4CAAcQ,UAAU;4CAAQpG,OAAO;wCAAU;wCACrFK,IAAI;4CAAE+D,YAAY;4CAAKC,UAAU;4CAAWgC,gBAAgB;4CAAQC,UAAU;wCAAE;oCAClF;oCACA;wCACExG,IAAI;wCACJG,aAAa;wCACbC,OAAO;4CAAEqG,aAAa;wCAAS;wCAC/BlG,IAAI;4CAAEmG,SAAS;gDAAEC,IAAI;gDAAQC,IAAI;4CAAO;4CAAGzH,OAAO;wCAAI;oCACxD;oCACA;wCAAEa,IAAI;wCAAWG,aAAa;wCAAqBC,OAAO;4CAAEiB,SAAS;wCAAO;oCAAE;oCAC9E;wCACErB,IAAI;wCACJG,aAAa;wCACbC,OAAO;4CAAEiB,SAAS;4CAAaG,UAAU;wCAAa;wCACtDjB,IAAI;4CAAEsG,YAAY;4CAAUC,YAAY;wCAAE;wCAC1CrF,cAAcjB,SAASkB,QAAQ1B,EAAE,EAAE0B,QAAQhB,IAAI;oCACjD;iCACD;4BACH;yBACD;oBACH;iBACD;YACH;YACA;gBAAEV,IAAI;gBAAWG,aAAa;gBAAcC,OAAO;oBAAEuD,WAAW;gBAAO;YAAE;YACzE;gBACE3D,IAAI;gBACJG,aAAa;gBACbC,OAAO;oBAAE0B,SAAS;oBAAUD,WAAW;gBAAc;gBACrDtB,IAAI;oBAAEqF,SAAS;oBAAoBmB,WAAW;oBAAGZ,aAAa;gBAAU;gBACxE3E,UAAU;oBACR9C,UAAU,kBAAkB,MAAM,GAAG;wBACnCiE,KAAK,iBAAiB,GAAG;4BACvBC,KAAK,sBAAsB,cAAc;gCACvC;oCACE5C,IAAI;oCACJG,aAAa;oCACbC,OAAO;wCAAEiC,SAAS;oCAAI;oCACtBb,UAAU;wCACR5C,KAAK,iBAAiB,MAAMmH,OAAO;4CAAEpC,WAAW;wCAAI;wCACpD/E,KACE,kBACA,SACA,+DACE,oDACF;4CAAEsB,OAAO;wCAAiB;qCAE7B;gCACH;6BACD;4BACD0C,KAAK,sBAAsB,aAAa;gCACtC;oCACE5C,IAAI;oCACJG,aAAa;oCACbC,OAAO;wCAAEiC,SAAS;oCAAE;oCACpBb,UAAU;wCACR5C,KAAK,uBAAuB,aAAa,WAAW;4CAAE+E,WAAW;wCAAI;wCACrE;4CACE3D,IAAI;4CACJG,aAAa;4CACbC,OAAO;gDAAEoB,UAAU;gDAAQ6E,UAAUP;gDAAcQ,UAAU;gDAAQpG,OAAO;4CAAU;wCACxF;wCACA;4CACEF,IAAI;4CACJG,aAAa;4CACbC,OAAO;gDAAEoB,UAAU;gDAAUwF,MAAM;gDAAWV,UAAU;gDAAQpG,OAAO;4CAAU;wCACnF;qCACD;gCACH;6BACD;4BACD0C,KAAK,uBAAuB,aAAa;gCACvC;oCACE5C,IAAI;oCACJG,aAAa;oCACbC,OAAO;wCAAEiC,SAAS;oCAAE;oCACpBb,UAAU;wCACR5C,KAAK,wBAAwB,aAAa,gBAAgB;4CAAE+E,WAAW;wCAAI;wCAC3E/E,KACE,uBACA,SACA,4DACE,uBACF;4CAAEsB,OAAO;wCAAiB;wCAE5B;4CAAEF,IAAI;4CAAmBG,aAAa;4CAAeC,OAAO,CAAC;wCAAE;qCAChE;gCACH;6BACD;yBACF;wBACD,aACKxB,KAAK,sBAAsB,WAAW,CAAC,EAAE,EAAEmH,MAAM,sBAAsB,CAAC,EAAE;4BAC3E7F,OAAO;4BACPyD,WAAW;wBACb;4BACApD,IAAI;gCAAE0G,WAAW;gCAAG1D,YAAY;gCAAGwD,WAAW;gCAAGZ,aAAa;4BAAU;;qBAE3E;iBACF;YACH;SACD;IACH;AACF;AAEA;;;;;;;;CAQC,GACD,OAAO,MAAMe,qBAAgC;IAC3CC,cAAc;QACZC,OAAO;YACLC,SAAS;gBAAEC,MAAM;gBAAWF,OAAO;gBAAWG,MAAM;gBAAWC,cAAc;YAAU;YACvFC,WAAW;gBAAEH,MAAM;gBAAWF,OAAO;gBAAWG,MAAM;gBAAWC,cAAc;YAAU;YACzFE,UAAU;gBAAEJ,MAAM;gBAAWF,OAAO;gBAAWG,MAAM;gBAAWC,cAAc;YAAU;YACxFG,SAAS;gBAAEL,MAAM;gBAAWE,cAAc;YAAU;YACpDI,YAAY;gBACVC,SAAS;gBACTC,OAAO;YACT;YACAlJ,MAAM;gBAAEyI,SAAS;gBAAWI,WAAW;gBAAWM,UAAU;YAAU;YACtEC,MAAM;gBAAEX,SAAS;gBAAWI,WAAW;gBAAWC,UAAU;YAAU;YACtEO,SAAS;QACX;QACAV,MAAM;YACJF,SAAS;gBAAEC,MAAM;gBAAWF,OAAO;gBAAWG,MAAM;gBAAWC,cAAc;YAAU;YACvFC,WAAW;gBAAEH,MAAM;gBAAWF,OAAO;gBAAWG,MAAM;gBAAWC,cAAc;YAAU;YACzFE,UAAU;gBAAEJ,MAAM;gBAAWF,OAAO;gBAAWG,MAAM;gBAAWC,cAAc;YAAU;YACxFG,SAAS;gBAAEL,MAAM;gBAAWE,cAAc;YAAU;YACpDI,YAAY;gBACVC,SAAS;gBACTC,OAAO;YACT;YACAlJ,MAAM;gBAAEyI,SAAS;gBAAWI,WAAW;gBAAWM,UAAU;YAAU;YACtEC,MAAM;gBAAEX,SAAS;gBAAWI,WAAW;gBAAWC,UAAU;YAAU;YACtEO,SAAS;QACX;IACF;IACAC,OAAO;QAAC;YAAEC,QAAQ;YAAqBC,SAAS;gBAAC;gBAAK;gBAAK;gBAAK;gBAAK;aAAI;YAAEC,QAAQ;QAAS;KAAE;IAC9FC,YAAY;QACVC,YAAY;QACZC,UAAU;YACRC,IAAI;gBAAElE,UAAU;gBAAWD,YAAY;gBAAKoE,YAAY;gBAAKC,eAAe;YAAU;YACtFC,IAAI;gBAAErE,UAAU;gBAAWD,YAAY;gBAAKoE,YAAY;gBAAMC,eAAe;YAAW;YACxFE,IAAI;gBAAEtE,UAAU;gBAAWD,YAAY;gBAAKoE,YAAY;YAAI;YAC5DI,IAAI;gBAAEvE,UAAU;gBAAUD,YAAY;gBAAKoE,YAAY;YAAK;YAC5DK,IAAI;gBAAExE,UAAU;gBAAWD,YAAY;gBAAKoE,YAAY;YAAI;YAC5DM,IAAI;gBAAEzE,UAAU;gBAAYD,YAAY;gBAAKoE,YAAY;YAAK;YAC9DvG,MAAM;gBAAEoC,UAAU;gBAAaD,YAAY;gBAAKoE,YAAY;YAAI;YAChEzG,UAAU;gBAAEsC,UAAU;gBAAaD,YAAY;gBAAKqE,eAAe;YAAS;YAC5ExH,QAAQ;gBAAEmD,YAAY;gBAAK2E,eAAe;YAAO;QACnD;IACF;IACAC,OAAO;QAAE5F,cAAc;IAAG;AAC5B,EAAC;AAED,2FAA2F,GAC3F,OAAO,SAAS6F,eAAenE,QAAgB;IAC7C,OAAO;QACL9C,OAAO8C,SAASC,IAAI,MAAM;QAC1BM,aAAaR,uBAAuBC;QACpClC,OAAO9D,oBAAoBC,IAAI,CAACC,GAAG;QACnCkK,YAAYpK,oBAAoBC,IAAI,CAACE,KAAK;QAC1CkK,aAAarK,oBAAoBC,IAAI,CAACG,MAAM;QAC5CkK,UAAU;IACZ;AACF"}
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/default-site.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { HostTheme } from '@aglyn/shared-data-types'\nimport type { NodeInteraction } from './node-interactions'\nimport { nodeInteractionSelector } from './node-interactions'\nimport { SCREEN_ROOT_PATH } from './screen-route'\nimport { applyElementMotion } from './element-motion'\nimport { SX_SCHEME_DARK_KEY } from './scheme-sx'\nimport {\n buildStarterNodes as buildNodes,\n starterSection as container,\n starterText as text,\n starterTextField as textField,\n type StarterNodeSpec as NodeSpec,\n type StarterTemplateScreen,\n} from './starter-template-nodes'\n\n/**\n * The website every new site is born with (AGL-3497).\n *\n * It used to be one heading and \"our new website is on its way\" (AGL-3408):\n * a site that answered `/` instead of 404ing, and showed an owner nothing of\n * what the product does. Now a site starts as a real one — a shared header\n * and footer, a home page with the sections an ordinary business site has,\n * photos, a theme and its SEO — and each section says, to the owner, how to\n * make it theirs.\n *\n * It is published and open to search engines from the first request, as every\n * new site's home page has been since AGL-3408.\n *\n * The photos ship with the apps under `/_static/starter/` (see the CREDITS\n * file there). A published page's `img-src` admits only its own origin and\n * the media CDN, so a stock-photo URL would be blocked, and there is no\n * platform-wide media scope to hold them. Both the tenant and the console\n * serve the same files at the same path, so they draw on the live site and in\n * the Besigner alike.\n *\n * PERSISTED IDENTIFIERS: every node id below is stored on every new site.\n */\n\n/** Where the starter photos are served from, on every tenant and in the console. */\nexport const DEFAULT_SITE_IMAGE_BASE = '/_static/starter'\n\n/**\n * The starter photos, with the sizes the files actually are and the words\n * that describe what each one shows: wherever a starter photo is placed, its\n * alt text is its own, never words written for another picture (AGL-3831).\n */\nexport const DEFAULT_SITE_IMAGES = {\n hero: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/hero-team.jpg`,\n width: 1600,\n height: 1067,\n alt: 'A small team working together around a table in a bright office',\n },\n about: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/about-owner.jpg`,\n width: 1600,\n height: 900,\n alt: 'A smiling business owner standing behind the counter of her coffee shop',\n },\n desk: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/gallery-desk.jpg`,\n width: 1600,\n height: 1068,\n alt: 'A tidy desk with a laptop, a lamp and fresh flowers',\n },\n plants: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/gallery-plants.jpg`,\n width: 1200,\n height: 900,\n alt: 'Houseplants on a sunny windowsill',\n },\n craft: {\n src: `${DEFAULT_SITE_IMAGE_BASE}/gallery-craft.jpg`,\n width: 1600,\n height: 1065,\n alt: 'Hands working on a craft project at a workbench',\n },\n} as const\n\n/** The node a call to action scrolls to, and the one the features link names. */\nexport const DEFAULT_HOME_CONTACT_SECTION_ID = 'dh_contactSection'\nexport const DEFAULT_HOME_FEATURES_SECTION_ID = 'dh_featuresSection'\n\n/** Room left above a scrolled-to section for the sticky header. */\nconst HEADER_OFFSET_PX = 72\n\n/**\n * Icon outlines, from Material Design Icons. Written in rather than looked up:\n * a published page reads an icon's stored path and never loads the catalog\n * (AGL-1212), and the catalog is the whole icon set.\n */\nconst ICONS = {\n 'pencil-outline':\n 'M14.06,9L15,9.94L5.92,19H5V18.08L14.06,9M17.66,3C17.41,3 17.15,3.1 16.96,3.29L15.13,5.12L18.88,8.87L20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18.17,3.09 17.92,3 17.66,3M14.06,6.19L3,17.25V21H6.75L17.81,9.94L14.06,6.19Z',\n 'palette-outline':\n 'M12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2C17.5,2 22,6 22,11A6,6 0 0,1 16,17H14.2C13.9,17 13.7,17.2 13.7,17.5C13.7,17.6 13.8,17.7 13.8,17.8C14.2,18.3 14.4,18.9 14.4,19.5C14.5,20.9 13.4,22 12,22M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C12.3,20 12.5,19.8 12.5,19.5C12.5,19.3 12.4,19.2 12.4,19.1C12,18.6 11.8,18.1 11.8,17.5C11.8,16.1 12.9,15 14.3,15H16A4,4 0 0,0 20,11C20,7.1 16.4,4 12,4M6.5,10C7.3,10 8,10.7 8,11.5C8,12.3 7.3,13 6.5,13C5.7,13 5,12.3 5,11.5C5,10.7 5.7,10 6.5,10M9.5,6C10.3,6 11,6.7 11,7.5C11,8.3 10.3,9 9.5,9C8.7,9 8,8.3 8,7.5C8,6.7 8.7,6 9.5,6M14.5,6C15.3,6 16,6.7 16,7.5C16,8.3 15.3,9 14.5,9C13.7,9 13,8.3 13,7.5C13,6.7 13.7,6 14.5,6M17.5,10C18.3,10 19,10.7 19,11.5C19,12.3 18.3,13 17.5,13C16.7,13 16,12.3 16,11.5C16,10.7 16.7,10 17.5,10Z',\n 'image-multiple-outline':\n 'M21,17H7V3H21M21,1H7A2,2 0 0,0 5,3V17A2,2 0 0,0 7,19H21A2,2 0 0,0 23,17V3A2,2 0 0,0 21,1M3,5H1V21A2,2 0 0,0 3,23H19V21H3M15.96,10.29L13.21,13.83L11.25,11.47L8.5,15H19.5L15.96,10.29Z',\n 'email-fast-outline':\n 'M22 5.5H9C7.9 5.5 7 6.4 7 7.5V16.5C7 17.61 7.9 18.5 9 18.5H22C23.11 18.5 24 17.61 24 16.5V7.5C24 6.4 23.11 5.5 22 5.5M22 16.5H9V9.17L15.5 12.5L22 9.17V16.5M15.5 10.81L9 7.5H22L15.5 10.81M5 16.5C5 16.67 5.03 16.83 5.05 17H1C.448 17 0 16.55 0 16S.448 15 1 15H5V16.5M3 7H5.05C5.03 7.17 5 7.33 5 7.5V9H3C2.45 9 2 8.55 2 8S2.45 7 3 7M1 12C1 11.45 1.45 11 2 11H5V13H2C1.45 13 1 12.55 1 12Z',\n magnify:\n 'M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z',\n 'page-layout-header-footer':\n 'M18 2H6C4.89 2 4 2.9 4 4V20C4 21.11 4.89 22 6 22H18C19.11 22 20 21.11 20 20V4C20 2.9 19.11 2 18 2M18 20H6V16H18V20M18 8H6V4H18V8Z',\n 'check-circle-outline':\n 'M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M12 20C7.59 20 4 16.41 4 12S7.59 4 12 4 20 7.59 20 12 16.41 20 12 20M16.59 7.58L10 14.17L7.41 11.59L6 13L10 17L18 9L16.59 7.58Z',\n 'format-quote-open': 'M10,7L8,11H11V17H5V11L7,7H10M18,7L16,11H19V17H13V11L15,7H18Z',\n} as const\n\ntype IconId = keyof typeof ICONS\n\nconst icon = (id: string, iconId: IconId, color = 'primary.main'): NodeSpec => ({\n id,\n componentId: 'icon',\n props: { iconId, iconPath: ICONS[iconId], size: 32 },\n sx: { color },\n})\n\n/** A click that brings a section of the page into view under the header. */\nconst scrollTo = (targetId: string, name: string): NodeInteraction[] => [\n {\n id: 'scroll-to-section',\n name: `Scroll to ${name}`,\n enabled: true,\n trigger: { event: 'elementClick', everyTime: true },\n steps: [\n {\n type: 'scrollTo',\n selector: nodeInteractionSelector(targetId),\n offsetPx: HEADER_OFFSET_PX,\n },\n ],\n },\n]\n\nconst button = (\n id: string,\n label: string,\n variant: 'contained' | 'outlined',\n target: { id: string; name: string },\n extra?: Record<string, unknown>,\n): NodeSpec => ({\n id,\n componentId: 'muiButton',\n props: { variant, size: 'large', children: label, ...extra },\n interactions: scrollTo(target.id, target.name),\n})\n\nconst CONTACT = { id: DEFAULT_HOME_CONTACT_SECTION_ID, name: 'the contact form' }\nconst FEATURES = { id: DEFAULT_HOME_FEATURES_SECTION_ID, name: 'what is included' }\n\n/**\n * One full-width band: a semantic `section` carrying the band's background,\n * around a Container at a stock width carrying its rhythm (AGL-1298).\n */\nconst band = (\n id: string,\n ariaLabel: string,\n width: 'md' | 'lg' | 'xl',\n children: NodeSpec[],\n sx?: Record<string, unknown>,\n): NodeSpec => ({\n id,\n componentId: 'section',\n props: { element: 'section', ariaLabel },\n ...(sx ? { sx } : {}),\n children: [container(`${id}Inner`, width, 10, children)],\n})\n\n/** A section's heading block: an overline, the heading and a lede. */\nconst heading = (\n prefix: string,\n overline: string,\n title: string,\n lede: string,\n align: 'center' | 'left' = 'center',\n): NodeSpec => ({\n id: `${prefix}Heading`,\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n sx: {\n alignItems: align === 'center' ? 'center' : 'flex-start',\n marginBottom: 6,\n ...(align === 'center' ? { marginLeft: 'auto', marginRight: 'auto', maxWidth: 'md' } : {}),\n },\n children: [\n text(`${prefix}Overline`, 'overline', overline, { align, color: 'primary' }),\n text(`${prefix}Title`, 'h2', title, { align }),\n text(`${prefix}Lede`, 'lede', lede, { align, color: 'text.secondary' }),\n ],\n})\n\nconst grid = (id: string, spacing: number, children: NodeSpec[], sx?: Record<string, unknown>): NodeSpec => ({\n id,\n componentId: 'muiGrid',\n props: { container: true, spacing },\n ...(sx ? { sx } : {}),\n children,\n})\n\n/**\n * A grid cell. `size` is the Grid element's STORED syntax — `'xs:12 md:6'`,\n * per-breakpoint column counts in one string — which its parser turns into\n * MUI's responsive object; an object here would be ignored.\n */\nconst cell = (id: string, size: string, children: NodeSpec[], sx?: Record<string, unknown>): NodeSpec => ({\n id,\n componentId: 'muiGrid',\n props: { size },\n ...(sx ? { sx } : {}),\n children,\n})\n\nconst photo = (\n id: string,\n image: { src: string; width: number; height: number; alt: string },\n height: string,\n loading: 'eager' | 'lazy' = 'lazy',\n): NodeSpec => ({\n id,\n componentId: 'image',\n props: {\n src: image.src,\n alt: image.alt,\n height,\n objectFit: 'cover',\n radius: 16,\n loading,\n intrinsicWidth: image.width,\n intrinsicHeight: image.height,\n },\n})\n\nconst featureCard = (id: string, iconId: IconId, title: string, body: string): NodeSpec =>\n cell(`${id}Cell`, 'xs:12 sm:6 md:4', [\n {\n id,\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { height: '100%', borderRadius: 3 },\n children: [\n {\n id: `${id}Content`,\n componentId: 'muiCardContent',\n sx: { paddingTop: 4, paddingRight: 4, paddingBottom: 4, paddingLeft: 4 },\n children: [\n {\n id: `${id}Stack`,\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n icon(`${id}Icon`, iconId),\n text(`${id}Title`, 'h5', title, { component: 'h3' }),\n text(`${id}Body`, 'body1', body, { color: 'text.secondary' }),\n ],\n },\n ],\n },\n ],\n },\n ])\n\nconst checkRow = (id: string, label: string): NodeSpec => ({\n id,\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 1.5 },\n sx: { alignItems: 'center' },\n children: [icon(`${id}Icon`, 'check-circle-outline', 'secondary.main'), text(`${id}Text`, 'body1', label)],\n})\n\nconst testimonial = (id: string, quote: string, name: string, detail: string): NodeSpec =>\n cell(`${id}Cell`, 'xs:12 md:4', [\n {\n id,\n componentId: 'muiCard',\n props: { variant: 'outlined' },\n sx: { height: '100%', borderRadius: 3 },\n children: [\n {\n id: `${id}Content`,\n componentId: 'muiCardContent',\n sx: { paddingTop: 4, paddingRight: 4, paddingBottom: 4, paddingLeft: 4 },\n children: [\n {\n id: `${id}Stack`,\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n icon(`${id}Icon`, 'format-quote-open', 'secondary.main'),\n text(`${id}Quote`, 'body1', quote),\n {\n id: `${id}By`,\n componentId: 'muiStack',\n props: { spacing: 0 },\n children: [\n text(`${id}Name`, 'subtitle2', name),\n text(`${id}Detail`, 'body2', detail, { color: 'text.secondary' }),\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ])\n\nconst faq = (id: string, question: string, answer: string, defaultExpanded = false): NodeSpec => ({\n id,\n componentId: 'muiAccordion',\n props: { disableGutters: true, ...(defaultExpanded ? { defaultExpanded: true } : {}) },\n sx: { borderRadius: 2 },\n children: [\n {\n id: `${id}Q`,\n componentId: 'muiAccordionSummary',\n props: { children: question },\n sx: { fontWeight: 700, fontSize: '1rem', paddingTop: 1, paddingBottom: 1 },\n },\n {\n id: `${id}A`,\n componentId: 'muiAccordionDetails',\n children: [text(`${id}AText`, 'body1', answer, { color: 'text.secondary' })],\n },\n ],\n})\n\n/**\n * The contact form. `pluginId: 'forms'` because a node names the bundle that\n * REGISTERS its component, and that is what decides whether the form draws\n * with the page or arrives after hydration (see the forms plugin's\n * `form-survives-the-bundle-move.spec.tsx`).\n */\nconst contactForm = (): NodeSpec => ({\n id: 'dh_form',\n componentId: 'form',\n pluginId: 'forms',\n props: {\n formName: 'Contact',\n submitLabel: 'Send message',\n successMessage: 'Thanks — your message is on its way. We will be in touch soon.',\n },\n // Each field is MUI's separate form elements (Form Control › Form Label +\n // Input), so an owner styles the label and the box on their own. The field\n // ids are the ones the all-in-one Form Field had.\n children: [\n textField('dh_fName', { name: 'name', label: 'Name', required: true }),\n textField('dh_fEmail', { name: 'email', label: 'Email', type: 'email', required: true }),\n textField('dh_fMessage', { name: 'message', label: 'Message', multiline: true, required: true }),\n ],\n})\n\n/** What a search result and a shared link say about the home page. */\nexport function defaultHomeDescription(siteName: string): string {\n const name = siteName.trim() || 'our website'\n return `Welcome to ${name}. See what we do, browse our work and get in touch.`\n}\n\n/**\n * The home page every new site is born with (AGL-3497, after AGL-3408).\n *\n * Its `seo` is written onto the screen, and the site's header and footer come\n * from the layout `buildDefaultSiteLayout` makes, which the provisioning\n * write binds it to.\n *\n * The site's name is written in as text, not bound: a page has no token for\n * it, and the heading is the first thing an owner rewrites anyway.\n */\nexport function buildDefaultHomeScreen(siteName: string): StarterTemplateScreen {\n const name = siteName.trim() || 'Welcome'\n return {\n key: 'home',\n displayName: 'Home',\n slug: SCREEN_ROOT_PATH,\n seo: { title: name, description: defaultHomeDescription(siteName) },\n // Its sections move as an author would set them up (AGL-3838): the hero\n // climbs in on load, the rest slide in on scroll, the cards one by one.\n nodes: applyElementMotion(buildNodes([\n // ── Hero ────────────────────────────────────────────────────────────\n band(\n 'dh_heroSection',\n 'Introduction',\n 'xl',\n [\n grid('dh_heroGrid', 6, [\n cell('dh_heroTextCell', 'xs:12 md:6', [\n {\n id: 'dh_hero',\n componentId: 'muiStack',\n props: { spacing: 3 },\n children: [\n text('dh_heroOverline', 'overline', 'Welcome to your new website', { color: 'primary' }),\n text('dh_heroTitle', 'h1', name),\n text(\n 'dh_heroSub',\n 'lede',\n 'This page is ready to make your own. Every heading, photo, ' +\n 'button and color on it can be changed in the Besigner, and ' +\n 'nothing you change goes live until you press Publish.',\n { color: 'text.secondary' },\n ),\n {\n id: 'dh_heroActions',\n componentId: 'muiStack',\n props: { direction: 'row' },\n // `gap`, not `spacing`: Stack spacing is a margin on every\n // child after the first, so a button that wraps onto a\n // second line keeps a left margin it no longer needs.\n sx: { flexWrap: 'wrap', gap: 2 },\n children: [\n button('dh_heroCta', 'Get in touch', 'contained', CONTACT),\n button('dh_heroMore', 'See what’s included', 'outlined', FEATURES),\n ],\n },\n ],\n },\n ], { alignSelf: 'center' }),\n cell('dh_heroImageCell', 'xs:12 md:6', [\n photo(\n 'dh_heroImage',\n DEFAULT_SITE_IMAGES.hero,\n '420px',\n 'eager',\n ),\n ]),\n ]),\n ],\n { bgcolor: 'background.paper' },\n ),\n\n // ── Features ────────────────────────────────────────────────────────\n band(DEFAULT_HOME_FEATURES_SECTION_ID, 'What is included', 'xl', [\n heading(\n 'dh_features',\n 'What’s already here',\n 'Everything a real website needs, ready to edit',\n 'Each block on this page shows one thing you can do. Keep the ones ' +\n 'you need, delete the rest, and add more from the elements panel.',\n ),\n grid('dh_featuresGrid', 3, [\n featureCard(\n 'dh_f1',\n 'pencil-outline',\n 'Edit right on the page',\n 'Click any heading, paragraph or button in the Besigner and type. ' +\n 'Changes stay a draft until you press Publish.',\n ),\n featureCard(\n 'dh_f2',\n 'palette-outline',\n 'Your colors and fonts',\n 'The colors and typefaces here come from your site theme. Change ' +\n 'them once under Setup → Theme and every page follows.',\n ),\n featureCard(\n 'dh_f3',\n 'image-multiple-outline',\n 'Photos you choose',\n 'Upload your own pictures under Media, then pick one for any image ' +\n 'on the page — the photos here are placeholders.',\n ),\n featureCard(\n 'dh_f4',\n 'email-fast-outline',\n 'A contact form that works',\n 'The form at the bottom of this page is live. Every message is ' +\n 'saved under Forms, and you are notified when one arrives.',\n ),\n featureCard(\n 'dh_f5',\n 'magnify',\n 'Ready to be found',\n 'Set the title, description and image that search results and ' +\n 'shared links show under Setup → SEO.',\n ),\n featureCard(\n 'dh_f6',\n 'page-layout-header-footer',\n 'One header and footer',\n 'The header and footer are a shared layout. Edit them once under ' +\n 'Layouts and every page you add uses them.',\n ),\n ]),\n ]),\n\n // ── About ───────────────────────────────────────────────────────────\n band(\n 'dh_aboutSection',\n 'About us',\n 'xl',\n [\n grid('dh_aboutGrid', 6, [\n cell('dh_aboutImageCell', 'xs:12 md:6', [\n photo(\n 'dh_aboutImage',\n DEFAULT_SITE_IMAGES.about,\n '440px',\n ),\n ]),\n cell('dh_aboutTextCell', 'xs:12 md:6', [\n {\n id: 'dh_about',\n componentId: 'muiStack',\n props: { spacing: 2.5 },\n children: [\n text('dh_aboutOverline', 'overline', 'About us', { color: 'primary' }),\n text('dh_aboutTitle', 'h2', 'Tell visitors who you are'),\n text(\n 'dh_aboutBody',\n 'body1',\n 'People want to know who is behind a business before they get ' +\n 'in touch. Replace this with how you started, who you help ' +\n 'and what makes your work different.',\n { color: 'text.secondary' },\n ),\n text(\n 'dh_aboutBody2',\n 'body1',\n 'A few honest sentences and a real photo of you or your team ' +\n 'will do more than a long page.',\n { color: 'text.secondary' },\n ),\n {\n id: 'dh_aboutChecks',\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n checkRow('dh_aboutCheck1', 'Say what you do in one sentence'),\n checkRow('dh_aboutCheck2', 'Show the people behind the work'),\n checkRow('dh_aboutCheck3', 'Tell visitors what to do next'),\n ],\n },\n {\n id: 'dh_aboutActions',\n componentId: 'muiStack',\n props: { direction: 'row' },\n children: [button('dh_aboutCta', 'Contact us', 'outlined', CONTACT)],\n },\n ],\n },\n ], { alignSelf: 'center' }),\n ]),\n ],\n { bgcolor: 'background.paper' },\n ),\n\n // ── Gallery ─────────────────────────────────────────────────────────\n band('dh_gallerySection', 'Gallery', 'xl', [\n heading(\n 'dh_gallery',\n 'Gallery',\n 'Show your work',\n 'Three photos in a grid that reflows on a phone. Replace them with ' +\n 'your products, projects or space, or add more to the grid.',\n ),\n grid('dh_galleryGrid', 3, [\n cell('dh_g1Cell', 'xs:12 sm:4', [\n photo('dh_g1', DEFAULT_SITE_IMAGES.desk, '320px'),\n ]),\n cell('dh_g2Cell', 'xs:12 sm:4', [\n photo('dh_g2', DEFAULT_SITE_IMAGES.plants, '320px'),\n ]),\n cell('dh_g3Cell', 'xs:12 sm:4', [\n photo('dh_g3', DEFAULT_SITE_IMAGES.craft, '320px'),\n ]),\n ]),\n ]),\n\n // ── Testimonials ────────────────────────────────────────────────────\n band(\n 'dh_testimonialsSection',\n 'What people say',\n 'xl',\n [\n heading(\n 'dh_testimonials',\n 'Testimonials',\n 'What people say',\n 'A few words from real customers build trust faster than anything ' +\n 'you can say about yourself. Replace these with quotes of your own.',\n ),\n grid('dh_testimonialsGrid', 3, [\n testimonial(\n 'dh_t1',\n 'Put a short quote from a happy customer here: one or two ' +\n 'sentences about the result you got them.',\n 'Customer name',\n 'Their business',\n ),\n testimonial(\n 'dh_t2',\n 'Pick quotes that answer what a new visitor is unsure about, ' +\n 'like price, timing or quality.',\n 'Customer name',\n 'Their city',\n ),\n testimonial(\n 'dh_t3',\n 'Ask before you publish a quote, and use the person’s real name ' +\n 'and photo if they are happy for you to.',\n 'Customer name',\n 'Their role',\n ),\n ]),\n ],\n { bgcolor: 'background.paper' },\n ),\n\n // ── FAQ ─────────────────────────────────────────────────────────────\n band('dh_faqSection', 'Frequently asked questions', 'md', [\n heading(\n 'dh_faq',\n 'FAQ',\n 'Frequently asked questions',\n 'Answer the questions people ask you most. These answers are about ' +\n 'building this site, so replace them with your own.',\n ),\n {\n id: 'dh_faqList',\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n faq(\n 'dh_q1',\n 'How do I change what this page says?',\n 'Open this page in the Besigner. When you are signed in, the bar ' +\n 'across the top of your live site opens it in one click. Click ' +\n 'any text to edit it, then press Publish.',\n true,\n ),\n faq(\n 'dh_q2',\n 'How do I add another page?',\n 'Open Pages in your site’s menu and create one. It gets this ' +\n 'header and footer automatically, and you can link to it from ' +\n 'the header.',\n ),\n faq(\n 'dh_q3',\n 'Where do messages from the contact form go?',\n 'Every message sent through the form below is saved under Forms, ' +\n 'where you can read it and keep track of who you have answered.',\n ),\n faq(\n 'dh_q4',\n 'Can I use my own domain name?',\n 'Yes. Custom domains are included from the Starter plan. Connect ' +\n 'one from your site’s Admin page, under Custom Domain.',\n ),\n faq(\n 'dh_q5',\n 'Will search engines find my site?',\n 'Yes. This site is published and open to search engines from day ' +\n 'one. Fill in Setup → SEO so results show the title and ' +\n 'description you want.',\n ),\n ],\n },\n ]),\n\n // ── Call to action ──────────────────────────────────────────────────\n band(\n 'dh_ctaSection',\n 'Get started',\n 'md',\n [\n {\n id: 'dh_cta',\n componentId: 'muiStack',\n props: { spacing: 3 },\n sx: { alignItems: 'center' },\n children: [\n text('dh_ctaTitle', 'h2', 'Ready to make it yours?', { align: 'center' }),\n text(\n 'dh_ctaBody',\n 'lede',\n 'Change the words, swap the photos and pick your colors, then ' +\n 'share your link with the world.',\n { align: 'center' },\n ),\n {\n // A paper-colored button on the primary band: `inherit` would\n // take the band's text color as a grey fill, and `primary`\n // would vanish into the band it sits on.\n ...button('dh_ctaButton', 'Get in touch', 'contained', CONTACT),\n sx: {\n bgcolor: 'background.paper',\n color: 'text.primary',\n '&:hover': { bgcolor: 'background.default' },\n },\n },\n ],\n },\n ],\n { bgcolor: 'primary.main', color: 'primary.contrastText' },\n ),\n\n // ── Contact ─────────────────────────────────────────────────────────\n band(DEFAULT_HOME_CONTACT_SECTION_ID, 'Contact', 'md', [\n heading(\n 'dh_contact',\n 'Contact',\n 'Get in touch',\n 'Questions, quotes or bookings: send a message and we will reply as ' +\n 'soon as we can.',\n ),\n contactForm(),\n ]),\n ])),\n }\n}\n\n/** The shared header and footer every page of a new site renders inside. */\nexport interface DefaultSiteLayout {\n displayName: string\n description: string\n nodes: Record<string, any>\n}\n\n/** What decides whether a new site's header and footer show a logo or its name. */\nconst SITE_LOGO_TOKEN = '{{host.logo}}'\nconst SITE_NAME_TOKEN = '{{host.businessName}}'\n\n/**\n * A site's logo for the header or the footer (AGL-4119): one picture for each\n * color scheme, named as the site, the height the band gives it and the width\n * its shape takes. A wide wordmark stays one line, and past `maxWidth` it fits\n * inside rather than being cropped.\n *\n * Two elements rather than one with two sources: `{{host.logoDark}}` is the\n * site's logo when it has no dark one, so a visitor always sees exactly one.\n */\nconst logoPictures = (idPrefix: string, height: string, maxWidth: unknown): NodeSpec[] => {\n const picture = (id: string, src: string, sx: Record<string, unknown>): NodeSpec => ({\n id,\n componentId: 'image',\n props: { src, alt: SITE_NAME_TOKEN, objectFit: 'contain', width: 'auto', height },\n sx: { maxWidth, objectPosition: 'left center', ...sx },\n })\n return [\n picture(`${idPrefix}Light`, SITE_LOGO_TOKEN, { [SX_SCHEME_DARK_KEY]: { display: 'none' } }),\n picture(`${idPrefix}Dark`, '{{host.logoDark}}', {\n display: 'none',\n [SX_SCHEME_DARK_KEY]: { display: 'block' },\n }),\n ]\n}\n\n/**\n * The header and footer a new site is born with (AGL-3497).\n *\n * The brand reads `{{host.businessName}}`, so it follows the site's name in\n * Setup rather than freezing the one it was created under, and the site's\n * logo takes its place wherever it has one (AGL-4119): the logo carries\n * `hideUnless` and the name `hideIf`, both bound to `{{host.logo}}`, and the\n * published page drops the one the site does not use. The logo comes first\n * in the toolbar so what is added after the brand link stays after both.\n * The © line keeps the name either way.\n *\n * The header's Contact button scrolls to the home page's contact section; on\n * another page it has nothing to scroll to and does nothing, which is the\n * step's own rule.\n *\n * `homeScreenId` is the home page the brand and the footer's Home link point\n * at — a link by id, so it survives a slug change.\n */\nexport function buildDefaultSiteLayout(homeScreenId: string): DefaultSiteLayout {\n const brand = SITE_NAME_TOKEN\n return {\n displayName: 'Site header and footer',\n description: 'The header and footer every page of this site shows.',\n nodes: buildNodes([\n {\n id: 'dl_header',\n componentId: 'muiAppBar',\n props: { position: 'sticky', color: 'inherit', component: 'header', ariaLabel: 'Site header' },\n sx: { bgcolor: 'background.paper', boxShadow: 'none', borderBottom: 1, borderColor: 'divider' },\n children: [\n {\n id: 'dl_headerInner',\n componentId: 'muiContainer',\n props: { maxWidth: 'xl' },\n children: [\n {\n id: 'dl_toolbar',\n componentId: 'muiToolbar',\n props: { disableGutters: true },\n sx: { columnGap: 2 },\n children: [\n {\n id: 'dl_brandLogo',\n componentId: 'muiLinkBox',\n props: { screenId: homeScreenId, hideUnless: SITE_LOGO_TOKEN },\n sx: { display: 'flex', alignItems: 'center', flexGrow: 1, minWidth: 0 },\n children: logoPictures('dl_brandLogo', '40px', { xs: '100%', sm: 280 }),\n },\n {\n id: 'dl_brand',\n componentId: 'muiScreenLink',\n props: {\n children: brand,\n screenId: homeScreenId,\n renderAs: 'link',\n color: 'inherit',\n hideIf: SITE_LOGO_TOKEN,\n },\n sx: { fontWeight: 800, fontSize: '1.25rem', textDecoration: 'none', flexGrow: 1 },\n },\n {\n id: 'dl_search',\n componentId: 'searchBox',\n props: { placeholder: 'Search' },\n sx: { display: { xs: 'none', md: 'flex' }, width: 220 },\n },\n { id: 'dl_mode', componentId: 'themeModeSwitcher', props: { variant: 'icon' } },\n {\n id: 'dl_contact',\n componentId: 'muiButton',\n props: { variant: 'contained', children: 'Contact us' },\n sx: { whiteSpace: 'nowrap', flexShrink: 0 },\n interactions: scrollTo(CONTACT.id, CONTACT.name),\n },\n ],\n },\n ],\n },\n ],\n },\n { id: 'dl_slot', componentId: 'layoutSlot', props: { component: 'main' } },\n {\n id: 'dl_footer',\n componentId: 'section',\n props: { element: 'footer', ariaLabel: 'Site footer' },\n sx: { bgcolor: 'background.paper', borderTop: 1, borderColor: 'divider' },\n children: [\n container('dl_footerInner', 'xl', 8, [\n grid('dl_footerGrid', 4, [\n cell('dl_footerBrandCell', 'xs:12 md:6', [\n {\n id: 'dl_footerBrand',\n componentId: 'muiStack',\n props: { spacing: 1.5 },\n children: [\n {\n id: 'dl_footerLogo',\n componentId: 'muiBox',\n props: { hideUnless: SITE_LOGO_TOKEN },\n children: logoPictures('dl_footerLogo', '48px', 280),\n },\n text('dl_footerName', 'h6', brand, { component: 'p', hideIf: SITE_LOGO_TOKEN }),\n text(\n 'dl_footerAbout',\n 'body2',\n 'This footer is part of your site’s shared layout. Edit it ' +\n 'once under Layouts and it changes on every page.',\n { color: 'text.secondary' },\n ),\n ],\n },\n ]),\n cell('dl_footerLinksCell', 'xs:6 md:3', [\n {\n id: 'dl_footerLinks',\n componentId: 'muiStack',\n props: { spacing: 1 },\n children: [\n text('dl_footerLinksTitle', 'subtitle2', 'Explore', { component: 'p' }),\n {\n id: 'dl_footerHome',\n componentId: 'muiScreenLink',\n props: { children: 'Home', screenId: homeScreenId, renderAs: 'link', color: 'inherit' },\n },\n {\n id: 'dl_footerSearch',\n componentId: 'muiScreenLink',\n props: { children: 'Search', href: '/search', renderAs: 'link', color: 'inherit' },\n },\n ],\n },\n ]),\n cell('dl_footerFollowCell', 'xs:6 md:3', [\n {\n id: 'dl_footerFollow',\n componentId: 'muiStack',\n props: { spacing: 1 },\n children: [\n text('dl_footerFollowTitle', 'subtitle2', 'Follow along', { component: 'p' }),\n text(\n 'dl_footerFollowBody',\n 'body2',\n 'Add your social profiles to the links element here and ' +\n 'their icons appear.',\n { color: 'text.secondary' },\n ),\n { id: 'dl_footerSocial', componentId: 'socialLinks', props: {} },\n ],\n },\n ]),\n ]),\n {\n ...text('dl_footerCopyright', 'caption', `© ${brand}. All rights reserved.`, {\n color: 'text.secondary',\n component: 'p',\n }),\n sx: { marginTop: 6, paddingTop: 3, borderTop: 1, borderColor: 'divider' },\n },\n ]),\n ],\n },\n ]),\n }\n}\n\n/**\n * The theme a new site starts with (AGL-3497): an indigo and teal palette on\n * a soft neutral ground, one Google family, rounder corners and buttons that\n * do not shout. Written as the site's own `theme`, so the theme library files\n * it as \"Site theme\" and keeps it when the owner switches to another.\n *\n * Dark is authored too, because a visitor's device decides which one they\n * see, and the header's switcher lets them choose.\n */\nexport const DEFAULT_SITE_THEME: HostTheme = {\n colorSchemes: {\n light: {\n primary: { main: '#4338ca', light: '#6366f1', dark: '#3730a3', contrastText: '#ffffff' },\n secondary: { main: '#0f766e', light: '#14b8a6', dark: '#115e59', contrastText: '#ffffff' },\n tertiary: { main: '#b45309', light: '#d97706', dark: '#92400e', contrastText: '#ffffff' },\n surface: { main: '#f1f5f9', contrastText: '#0f172a' },\n background: {\n default: '#f8fafc',\n paper: '#ffffff',\n },\n text: { primary: '#0f172a', secondary: '#475569', disabled: '#94a3b8' },\n tint: { primary: '#eef2ff', secondary: '#f0fdfa', tertiary: '#fffbeb' },\n divider: '#e2e8f0',\n },\n dark: {\n primary: { main: '#a5b4fc', light: '#c7d2fe', dark: '#818cf8', contrastText: '#1e1b4b' },\n secondary: { main: '#5eead4', light: '#99f6e4', dark: '#2dd4bf', contrastText: '#042f2e' },\n tertiary: { main: '#fcd34d', light: '#fde68a', dark: '#fbbf24', contrastText: '#451a03' },\n surface: { main: '#1e293b', contrastText: '#e2e8f0' },\n background: {\n default: '#0b1120',\n paper: '#111827',\n },\n text: { primary: '#e2e8f0', secondary: '#94a3b8', disabled: '#475569' },\n tint: { primary: '#1e1b4b', secondary: '#042f2e', tertiary: '#451a03' },\n divider: '#1e293b',\n },\n },\n fonts: [{ family: 'Plus Jakarta Sans', weights: [400, 500, 600, 700, 800], source: 'google' }],\n typography: {\n fontFamily: '\"Plus Jakarta Sans\", system-ui, -apple-system, \"Segoe UI\", sans-serif',\n variants: {\n h1: { fontSize: '3.25rem', fontWeight: 800, lineHeight: 1.1, letterSpacing: '-0.02em' },\n h2: { fontSize: '2.25rem', fontWeight: 800, lineHeight: 1.15, letterSpacing: '-0.015em' },\n h3: { fontSize: '1.75rem', fontWeight: 700, lineHeight: 1.2 },\n h4: { fontSize: '1.5rem', fontWeight: 700, lineHeight: 1.25 },\n h5: { fontSize: '1.25rem', fontWeight: 700, lineHeight: 1.3 },\n h6: { fontSize: '1.125rem', fontWeight: 700, lineHeight: 1.35 },\n lede: { fontSize: '1.1875rem', fontWeight: 400, lineHeight: 1.6 },\n overline: { fontSize: '0.8125rem', fontWeight: 700, letterSpacing: '0.12em' },\n button: { fontWeight: 700, textTransform: 'none' },\n },\n },\n shape: { borderRadius: 12 },\n}\n\n/** The site-wide SEO a new site starts with: its name, a description and a sharing image. */\nexport function defaultSiteSeo(siteName: string): Record<string, unknown> {\n return {\n title: siteName.trim() || 'Welcome',\n description: defaultHomeDescription(siteName),\n image: DEFAULT_SITE_IMAGES.hero.src,\n imageWidth: DEFAULT_SITE_IMAGES.hero.width,\n imageHeight: DEFAULT_SITE_IMAGES.hero.height,\n imageAlt: 'A small team working together around a table in a bright office',\n }\n}\n"],"names":["nodeInteractionSelector","SCREEN_ROOT_PATH","applyElementMotion","SX_SCHEME_DARK_KEY","buildStarterNodes","buildNodes","starterSection","container","starterText","text","starterTextField","textField","DEFAULT_SITE_IMAGE_BASE","DEFAULT_SITE_IMAGES","hero","src","width","height","alt","about","desk","plants","craft","DEFAULT_HOME_CONTACT_SECTION_ID","DEFAULT_HOME_FEATURES_SECTION_ID","HEADER_OFFSET_PX","ICONS","magnify","icon","id","iconId","color","componentId","props","iconPath","size","sx","scrollTo","targetId","name","enabled","trigger","event","everyTime","steps","type","selector","offsetPx","button","label","variant","target","extra","children","interactions","CONTACT","FEATURES","band","ariaLabel","element","heading","prefix","overline","title","lede","align","spacing","alignItems","marginBottom","marginLeft","marginRight","maxWidth","grid","cell","photo","image","loading","objectFit","radius","intrinsicWidth","intrinsicHeight","featureCard","body","borderRadius","paddingTop","paddingRight","paddingBottom","paddingLeft","component","checkRow","direction","testimonial","quote","detail","faq","question","answer","defaultExpanded","disableGutters","fontWeight","fontSize","contactForm","pluginId","formName","submitLabel","successMessage","required","multiline","defaultHomeDescription","siteName","trim","buildDefaultHomeScreen","key","displayName","slug","seo","description","nodes","flexWrap","gap","alignSelf","bgcolor","SITE_LOGO_TOKEN","SITE_NAME_TOKEN","logoPictures","idPrefix","picture","objectPosition","display","buildDefaultSiteLayout","homeScreenId","brand","position","boxShadow","borderBottom","borderColor","columnGap","screenId","hideUnless","flexGrow","minWidth","xs","sm","renderAs","hideIf","textDecoration","placeholder","md","whiteSpace","flexShrink","borderTop","href","marginTop","DEFAULT_SITE_THEME","colorSchemes","light","primary","main","dark","contrastText","secondary","tertiary","surface","background","default","paper","disabled","tint","divider","fonts","family","weights","source","typography","fontFamily","variants","h1","lineHeight","letterSpacing","h2","h3","h4","h5","h6","textTransform","shape","defaultSiteSeo","imageWidth","imageHeight","imageAlt"],"mappings":"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"}
@@ -234,7 +234,8 @@
234
234
  '#member-updates': 'The Member updates card, in the products hub\'s catalog, posts updates only your subscribers can see, and can email each one to them.'
235
235
  },
236
236
  companies: {
237
- '#a-companys-page': 'The page names the company in the heading and the trail, and holds its properties, its contacts, its deals, its open tasks and the activity logged against it.',
237
+ '#a-companys-page': 'The page names the company in the heading and the trail, and holds its properties, its contacts, its deals, its open tasks and the activity logged against it and rolled up from its people and its deals.',
238
+ '#contact-roles': 'The Contact roles card says who at the company plays which part, the way Salesforce\'s Account Contact Roles do.',
238
239
  '#contacts-at-a-company': 'The Contacts card lists the people linked to this company a page at a time, most recently updated first, with the total counted by the database in its footer; each row opens the person\'s page.',
239
240
  '#create-a-company': 'Choose New company above the list. A company needs a name; everything else is optional: Domain — the bare hostname (acme.com).',
240
241
  '#the-companies-list': 'The list shows every company your site may see, most recently changed first, with its domain, how many contacts are linked to it, its owner, when it was last changed and its next activity — when the earliest open…'
@@ -649,7 +650,16 @@
649
650
  '#platform-send-rate': 'At the top of the same page. Everything Aglyn sends leaves on one Resend key and the provider\'s rate limit is per account, so a throttle lands on every customer\'s password resets at the same time whatever domain each…',
650
651
  '#platform-settings': 'Staff → Platform settings holds the settings that describe the platform rather than one organization, each changed without a deploy and audited with the reason you give.',
651
652
  '#platform-suppressions': 'Also on the System emails page: every address that bounced permanently or reported spam on any send from any site.',
653
+ '#plugin-review-starter-checklist': 'Every checklist item is required before List in marketplace is available.',
654
+ '#plugin-review-starter-danger-zone': 'Take down takes the starter out of the marketplace and refuses every new site from it, while each site created from it keeps its own copy.',
655
+ '#plugin-review-starter-overview': 'The Overview card shows the starter\'s picture, description, category and style.',
656
+ '#plugin-review-starter-pages': 'The Pages card lists every page with its address, or Not published.',
657
+ '#plugin-review-starter-status': 'The Status card says where a starter stands, which version it is on, what it costs and who published it.',
658
+ '#plugin-review-starter-theme': 'The Theme card shows a built-in theme with its base theme, fonts and brand colors in light and in dark, or the site\'s own full theme.',
659
+ '#plugin-review-starter-verdict': 'List in marketplace lets anyone creating a site choose the starter, and tells its publisher.',
660
+ '#plugin-review-starter-versions': 'The Versions card lists each version with the day it was published and how many pages it has.',
652
661
  '#plugin-reviews': 'The marketplace review queue, plus a Listed plugins — realm trust table for granting or revoking realm trust per version.',
662
+ '#plugin-reviews-site-starters': 'A site starter is a whole site someone creates by picking it, so a starter a publisher submits waits here until it is listed.',
653
663
  '#record-a-dnc-request': 'Record a request is for an opt-out that arrived outside the product — by email to the privacy address, or spoken on a call.',
654
664
  '#sign-one-device-out': 'A Sign-in history card on the same detail page lists every device that has signed in to the account — browser and system, location, IP, first and last seen — and can end the sessions on one of them.',
655
665
  '#site-content': 'The Content card lists what the site is built from, one tab per kind: Pages, Email designs, Layouts, Components, Templates and Forms.',