@aglyn/aglyn 1.0.0-beta.258 → 1.0.0-beta.259
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -11
- package/src/lib/app-utils/default-site.js +5 -2
- package/src/lib/app-utils/default-site.js.map +1 -1
- package/src/lib/app-utils/docs-index.generated.js +15 -1
- package/src/lib/app-utils/docs-index.generated.js.map +1 -1
- package/src/lib/app-utils/element-motion.d.ts +98 -0
- package/src/lib/app-utils/element-motion.js +341 -0
- package/src/lib/app-utils/element-motion.js.map +1 -0
- package/src/lib/app-utils/starter-templates.js +8 -2
- package/src/lib/app-utils/starter-templates.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aglyn/aglyn",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.259",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"homepage": "https://aglyn.com",
|
|
6
6
|
"repository": {
|
|
@@ -37,16 +37,16 @@
|
|
|
37
37
|
"./package.json": "./package.json"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@aglyn/shared-data-enums": "1.0.0-beta.
|
|
41
|
-
"@aglyn/shared-data-mdi": "1.0.0-beta.
|
|
42
|
-
"@aglyn/shared-data-types": "1.0.0-beta.
|
|
43
|
-
"@aglyn/shared-util-email": "1.0.0-beta.
|
|
44
|
-
"@aglyn/shared-util-first-touch": "1.0.0-beta.
|
|
45
|
-
"@aglyn/shared-util-http": "1.0.0-beta.
|
|
46
|
-
"@aglyn/shared-util-logger": "1.0.0-beta.
|
|
47
|
-
"@aglyn/shared-util-timestamp": "1.0.0-beta.
|
|
48
|
-
"@aglyn/shared-util-tools": "1.0.0-beta.
|
|
49
|
-
"@aglyn/shared-util-vendor": "1.0.0-beta.
|
|
40
|
+
"@aglyn/shared-data-enums": "1.0.0-beta.259",
|
|
41
|
+
"@aglyn/shared-data-mdi": "1.0.0-beta.259",
|
|
42
|
+
"@aglyn/shared-data-types": "1.0.0-beta.259",
|
|
43
|
+
"@aglyn/shared-util-email": "1.0.0-beta.259",
|
|
44
|
+
"@aglyn/shared-util-first-touch": "1.0.0-beta.259",
|
|
45
|
+
"@aglyn/shared-util-http": "1.0.0-beta.259",
|
|
46
|
+
"@aglyn/shared-util-logger": "1.0.0-beta.259",
|
|
47
|
+
"@aglyn/shared-util-timestamp": "1.0.0-beta.259",
|
|
48
|
+
"@aglyn/shared-util-tools": "1.0.0-beta.259",
|
|
49
|
+
"@aglyn/shared-util-vendor": "1.0.0-beta.259",
|
|
50
50
|
"@data-driven-forms/react-form-renderer": "^4.2.0",
|
|
51
51
|
"@msgpack/msgpack": "^3.1.3",
|
|
52
52
|
"@types/unist": "^3.0.3",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*/ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
17
17
|
import { nodeInteractionSelector } from "./node-interactions.js";
|
|
18
18
|
import { SCREEN_ROOT_PATH } from "./screen-route.js";
|
|
19
|
+
import { applyElementMotion } from "./element-motion.js";
|
|
19
20
|
import { buildStarterNodes as buildNodes, starterSection as container, starterText as text, starterTextField as textField } from "./starter-template-nodes.js";
|
|
20
21
|
/**
|
|
21
22
|
* The website every new site is born with (AGL-3497).
|
|
@@ -431,7 +432,9 @@ const faq = (id, question, answer, defaultExpanded = false)=>({
|
|
|
431
432
|
title: name,
|
|
432
433
|
description: defaultHomeDescription(siteName)
|
|
433
434
|
},
|
|
434
|
-
|
|
435
|
+
// Its sections move as an author would set them up (AGL-3838): the hero
|
|
436
|
+
// climbs in on load, the rest slide in on scroll, the cards one by one.
|
|
437
|
+
nodes: applyElementMotion(buildNodes([
|
|
435
438
|
// ── Hero ────────────────────────────────────────────────────────────
|
|
436
439
|
band('dh_heroSection', 'Introduction', 'xl', [
|
|
437
440
|
grid('dh_heroGrid', 6, [
|
|
@@ -629,7 +632,7 @@ const faq = (id, question, answer, defaultExpanded = false)=>({
|
|
|
629
632
|
heading('dh_contact', 'Contact', 'Get in touch', 'Questions, quotes or bookings: send a message and we will reply as ' + 'soon as we can.'),
|
|
630
633
|
contactForm()
|
|
631
634
|
])
|
|
632
|
-
])
|
|
635
|
+
]))
|
|
633
636
|
};
|
|
634
637
|
}
|
|
635
638
|
/**
|
|
@@ -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 {\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 nodes: 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","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":"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"}
|
|
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"}
|
|
@@ -1227,7 +1227,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
1227
1227
|
title: 'Looks and themes for AI sites',
|
|
1228
1228
|
heading: 'How the look is made',
|
|
1229
1229
|
anchor: '#how-the-look-is-made',
|
|
1230
|
-
text: 'The style sets the range the look is chosen within: which base themes suit it, the range of colors, how strong the palette is, the page backgrounds, the font pairings, how rounded the corners are, the style of the buttons, the size of the headings and how much space there is. The Designing your look step then picks one look from that range for your site:\n- Unique each time. Each job has its own variation, and a look that would repeat one of your workspace\'s other sites is drawn again.\n- Readable. The colors are checked for contrast, so text stays readable on its background. A palette that fails the check falls back to the starter colors.\n- Cheap. The look is one short step, a few credits of the start\'s total.'
|
|
1230
|
+
text: 'The style sets the range the look is chosen within: which base themes suit it, the range of colors, how strong the palette is, the page backgrounds, the font pairings, how rounded the corners are, the style of the buttons, the size of the headings and how much space there is. The Designing your look step then picks one look from that range for your site:\n- Unique each time. Each job has its own variation, and a look that would repeat one of your workspace\'s other sites is drawn again.\n- Readable. The colors are checked for contrast, so text stays readable on its background. A palette that fails the check falls back to the starter colors.\n- Moving. Every page gets animations that suit the style: calm styles fade in gently, bold ones arrive with more energy, and portfolios zoom their pictures in. Choosing them costs no credits.\n- Cheap. The look is one short step, a few credits of the start\'s total.'
|
|
1231
1231
|
},
|
|
1232
1232
|
{
|
|
1233
1233
|
path: '/ai/site-looks',
|
|
@@ -1488,6 +1488,20 @@ export const DOCS_SECTION_INDEX = [
|
|
|
1488
1488
|
anchor: '#add-an-animation',
|
|
1489
1489
|
text: '1. Select the element on the canvas.\n2. Open the Attributes tab in the right-hand panel.\n3. Scroll to Animation and pick a preset.\nThe rest of the animation fields appear once a preset is chosen.\nPresets\n| Preset | Entrance | On hover |\n| Fade in | Fades up from invisible | Dims slightly |\n| Slide up | Rises into place while fading in | Lifts |\n| Slide down | Drops into place while fading in | Sinks |\n| Slide left | Enters from the right | Nudges left |\n| Slide right | Enters from the left | Nudges right |\n| Zoom in | Grows from slightly small | Grows |\n| Zoom out | Shrinks from slightly large | Shrinks |\nPlays\n- On scroll into view (default) — the animation runs the first time the element reaches the viewport. This is the right choice for anything below the top of the page.\n- On page load — runs immediately. Best for a hero or a headline that is visible the moment the page opens.\n- On hover — the element eases to its emphasis state while the pointer is over it, and eases back when the pointer leaves.\nDuration and delay\nBoth are in milliseconds. Duration is how long the motion takes; 600 is a natural default and anything over 3000 is capped. Delay is how long to wait before starting.\nEasing\nEasing is the shape of the motion — whether it starts fast and settles, or moves at one steady speed. It changes how an animation feels far more than its duration does.\n| Easing | Feels like |\n| Smooth (default) | Starts quickly and settles gently. The safe choice. |\n| Steady | One constant speed from start to finish. Mechanical, good for subtle moves. |\n| Gentle start | Eases in slowly, then arrives quickly. |\n| Gentle end | Starts quickly, then slows into place. |\n| Gentle start and end | Slow at both ends, quickest in the middle. |\n| Settles into place | Travels a little past its '
|
|
1490
1490
|
},
|
|
1491
|
+
{
|
|
1492
|
+
path: '/building-sites/besigner/animations',
|
|
1493
|
+
title: 'Element animations',
|
|
1494
|
+
heading: 'Pages that already move',
|
|
1495
|
+
anchor: '#pages-that-already-move',
|
|
1496
|
+
text: 'Some pages start out with their animations set up for you:\n- A new site\'s home page, and the pages of a starter from the template gallery. A starter already in your template library keeps the pages it was added with.\n- Every page and template Aglyn AI builds, whether from Start your site with AI or from a request to Assist.\nOn these pages the first section\'s heading and main picture are there from the moment the page opens, so it never looks slow to load, while the lines and buttons around them arrive one after another. Every later section slides in as it scrolls into view, and a grid of cards, a list or a set of questions arrives one item at a time. Forms, the header and footer, and anything pinned to the screen stay still.\nA site Aglyn AI builds moves in a way that suits its style: a law firm or a clinic fades in gently, a gym or a design studio arrives with more energy, and a portfolio\'s pictures zoom in one after another. Two sites of the same style still move a little differently.\nNone of it is locked. Select any element and its Animation settings show exactly what was chosen, so you can change it, or pick None to turn it off. A setting you change is never put back.'
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
path: '/building-sites/besigner/animations',
|
|
1500
|
+
title: 'Element animations',
|
|
1501
|
+
heading: 'Ask Assist to change an animation',
|
|
1502
|
+
anchor: '#ask-assist',
|
|
1503
|
+
text: 'With a page open in the Besigner, select an element and ask Assist, for example make the cards zoom in one after another or stop the heading moving. Assist proposes the change using the same settings described above, and nothing changes until you press Apply.'
|
|
1504
|
+
},
|
|
1491
1505
|
{
|
|
1492
1506
|
path: '/building-sites/besigner/animations',
|
|
1493
1507
|
title: 'Element animations',
|