@aglyn/aglyn 1.0.0-beta.258 → 1.0.0-beta.260

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.
@@ -20,10 +20,12 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
20
20
  // shows them to a model — and neither barrel works in both: the full
21
21
  // `@aglyn/aglyn` barrel breaks the RSC/server-route graph, while the server
22
22
  // entry drags `node:fs` into the client bundle. The starter kit imports only
23
- // the canvas constants, a leaf with no imports of their own; the compiled
23
+ // the canvas constants, a leaf with no imports of their own, and the
24
+ // entrance-motion pass, which adds only the animation vocabulary; the compiled
24
25
  // plugin starters are data behind a type-only import; and `screen-route`
25
26
  // imports only a TYPE from foundation — so all three are safe on either side.
26
27
  import { PLUGIN_STARTER_TEMPLATES } from "./plugin-starter-templates.generated.js";
28
+ import { applyElementMotion } from "./element-motion.js";
27
29
  import { normalizeScreenSlug } from "./screen-route.js";
28
30
  import { buildStarterNodes as buildNodes, starterHeroSection as heroSection, starterSection as section, starterText as text, starterTextField } from "./starter-template-nodes.js";
29
31
  export { buildStarterNodes, starterHeroSection, starterSection, starterText, starterTextField } from "./starter-template-nodes.js";
@@ -67,7 +69,11 @@ export { buildStarterNodes, starterHeroSection, starterSection, starterText, sta
67
69
  } : {}, screen.seo ? {
68
70
  seo: screen.seo
69
71
  } : {}, {
70
- nodes: screen.nodes,
72
+ // A starter's page moves the way the attributes panel would set it
73
+ // up (AGL-3838). Written here, as it is seeded, and not into the
74
+ // starter itself: the starters are also the page examples a model is
75
+ // shown, and those carry no motion — the AI's is decided in code.
76
+ nodes: applyElementMotion(screen.nodes),
71
77
  source: {
72
78
  type: 'starter',
73
79
  starterId: starter.id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/starter-templates.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 */\n\n// Leaf imports only, deliberately (AGL-687). This module is imported from\n// BOTH graphs — the console's client gallery renders virtual starters from\n// it, the console's seed route materializes them, and the AI plugin's server\n// shows them to a model — and neither barrel works in both: the full\n// `@aglyn/aglyn` barrel breaks the RSC/server-route graph, while the server\n// entry drags `node:fs` into the client bundle. The starter kit imports only\n// the canvas constants, a leaf with no imports of their own; the compiled\n// plugin starters are data behind a type-only import; and `screen-route`\n// imports only a TYPE from foundation — so all three are safe on either side.\nimport { PLUGIN_STARTER_TEMPLATES } from './plugin-starter-templates.generated'\nimport { normalizeScreenSlug } from './screen-route'\nimport {\n buildStarterNodes as buildNodes,\n starterHeroSection as heroSection,\n starterSection as section,\n starterText as text,\n starterTextField,\n type StarterNodeSpec as NodeSpec,\n type StarterTemplate,\n} from './starter-template-nodes'\n\nexport type {\n StarterNodeSpec,\n StarterSectionWidth,\n StarterTemplate,\n StarterTemplateScreen,\n} from './starter-template-nodes'\nexport {\n buildStarterNodes,\n starterHeroSection,\n starterSection,\n starterText,\n starterTextField,\n} from './starter-template-nodes'\n\n/**\n * First-party starter definitions (AGL-78/79), SEED INPUT (AGL-687).\n *\n * These used to be rendered straight into the gallery and instantiated from\n * code, which made a starter a second kind of template: no version history,\n * no placeholders, no editor, changeable only by shipping a release. Now\n * they are seeded into each host's own template library as ordinary\n * `hosts/{hostId}/templates` documents (see the console's\n * `utils/server/seed-starter-templates.ts` for why copy-on-use rather than a\n * global read-only collection), and nothing reads this file at render time.\n *\n * They are also the page examples the AI plugin's template generator shows a\n * model (AGL-2909), which is why they live in the core package rather than\n * beside the console gallery that renders them.\n *\n * Node ids stay template-local (unique within each screen's version doc);\n * `createPageFromTemplate` re-keys screen and version ids at instantiation.\n *\n * PERSISTED IDENTIFIERS: `StarterTemplate.id`, `StarterTemplateScreen.key`\n * and every node id below appear in stored documents (seeded template doc\n * ids are derived from the first two). They must never be renamed.\n */\nexport interface StarterTemplateDoc {\n id: string\n /** Which starter this page belongs to — lets one starter be selected. */\n starterId: string\n data: Record<string, unknown>\n}\n\n/**\n * Deterministic document id for a seeded starter screen (AGL-687).\n *\n * Derived from the starter id and the screen key — never randomly generated\n * — so re-running the seed addresses the same documents instead of stacking\n * duplicate copies of every starter on every run.\n */\nexport function starterTemplateDocId(\n starterId: string,\n screenKey: string,\n): string {\n return `starter-${starterId}-${screenKey}`\n}\n\n/**\n * Expands one starter into the template documents it seeds as.\n *\n * One page template per screen, matching what a marketplace install of a\n * multi-screen site template already produces (AGL-669) — the alternative,\n * a bespoke multi-page template shape, would be a third lifecycle on top of\n * the two this issue exists to merge. The bundle's name/description/order\n * ride `source` so the gallery can still present the starter as one card.\n */\nexport function buildStarterTemplateDocs(\n starter: StarterTemplate,\n): StarterTemplateDoc[] {\n return starter.screens.map((screen, index) => {\n // Normalized on the way into the document so the persisted address is in\n // the routing-map format the tenant matches against — in particular the\n // root, which the previous `screen.slug ? …` guard dropped entirely when\n // home was spelled `''` (AGL-1575). A slug that sanitizes away carries no\n // field, and the apply path derives one from the display name.\n const slug = normalizeScreenSlug(screen.slug)\n return {\n id: starterTemplateDocId(starter.id, screen.key),\n starterId: starter.id,\n data: {\n kind: 'page',\n displayName: screen.displayName,\n // Only the screen's own description, never the starter blurb: a\n // template's `description` is carried onto the page it creates, and a\n // screen description is the live site's meta-description fallback.\n // The bundle blurb lives on `source.starterDescription` instead.\n ...(screen.description ? { description: screen.description } : {}),\n category: starter.category,\n ...(slug ? { slug } : {}),\n ...(screen.seo ? { seo: screen.seo } : {}),\n nodes: screen.nodes,\n source: {\n type: 'starter',\n starterId: starter.id,\n starterName: starter.displayName,\n starterDescription: starter.description,\n starterOrder: index,\n },\n },\n }\n })\n}\n\n/** Every document a starter COULD materialize as, in bundle order. */\nexport function buildAllStarterTemplateDocs(): StarterTemplateDoc[] {\n return STARTER_TEMPLATES.flatMap(buildStarterTemplateDocs)\n}\n\nconst featureColumn = (id: string, title: string, body: string): NodeSpec => ({\n id,\n componentId: 'muiStack',\n props: { spacing: 1 },\n // `flex: 1` is a column's share of its row, not a width cap — it survives\n // the sweep deliberately. Only `maxWidth` in raw pixels was the violation.\n sx: {\n flex: 1,\n paddingTop: 2,\n paddingRight: 2,\n paddingBottom: 2,\n paddingLeft: 2,\n },\n children: [text(`${id}T`, 'h5', title), text(`${id}B`, 'body1', body)],\n})\n\nconst contactForm = (prefix: string): NodeSpec => ({\n id: `${prefix}form`,\n componentId: 'form',\n props: {\n formName: 'Contact',\n submitLabel: 'Send message',\n successMessage: 'Thanks — we will get back to you soon.',\n },\n children: [\n starterTextField(`${prefix}fName`, { name: 'name', label: 'Name', required: true }),\n starterTextField(`${prefix}fEmail`, {\n name: 'email',\n label: 'Email',\n type: 'email',\n required: true,\n }),\n starterTextField(`${prefix}fMessage`, {\n name: 'message',\n label: 'Message',\n multiline: true,\n required: true,\n }),\n ],\n})\n\n\n/**\n * The home page every new site is born with now lives with the rest of the\n * site it is born into — layout, theme and SEO — in `default-site.ts`\n * (AGL-3497). Re-exported so the name keeps its home here.\n */\nexport { buildDefaultHomeScreen } from './default-site'\n\n/** The platform's own starters, which name no plugin's elements. */\nconst PLATFORM_STARTER_TEMPLATES: StarterTemplate[] = [\n {\n id: 'landing',\n displayName: 'Landing Page',\n description:\n 'One-page launch site: hero, three selling points, and a contact form.',\n category: 'Marketing',\n screens: [\n {\n key: 'landing',\n displayName: 'Landing',\n slug: 'landing',\n seo: {\n title: 'Welcome',\n description: 'Everything you need to know, on one page.',\n },\n nodes: buildNodes([\n heroSection(\n 'l_',\n 'A headline that sells your idea',\n 'One clear sentence about the value you deliver.',\n ),\n section('l_featuresSection', 'xl', 6, [\n {\n id: 'l_features',\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 2 },\n children: [\n featureColumn(\n 'l_f1',\n 'Fast',\n 'Explain the first reason customers pick you.',\n ),\n featureColumn(\n 'l_f2',\n 'Simple',\n 'Explain the second reason customers pick you.',\n ),\n featureColumn(\n 'l_f3',\n 'Reliable',\n 'Explain the third reason customers pick you.',\n ),\n ],\n },\n ]),\n // Was `maxWidth: 560`. A band, not an inner measure: it sat at the\n // top level carrying the section's own gutters and rhythm, so the\n // pixel value was capping the BAND. MD is the stock width for a\n // narrow, form-led column.\n section('l_contactSection', 'md', 6, [\n {\n id: 'l_contact',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('l_contactTitle', 'h4', 'Get in touch'),\n contactForm('l_'),\n ],\n },\n ]),\n ]),\n },\n ],\n },\n {\n id: 'business',\n displayName: 'Business',\n description:\n 'Company site: home with services, an about page, and a contact page.',\n category: 'Business',\n screens: [\n {\n key: 'home',\n displayName: 'Business Home',\n slug: 'home',\n seo: { title: 'Home' },\n nodes: buildNodes([\n heroSection(\n 'b_',\n 'Your business, done right',\n 'Tell visitors what you do and who you do it for.',\n ),\n section('b_servicesSection', 'xl', 6, [\n {\n id: 'b_services',\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 2 },\n children: [\n featureColumn('b_s1', 'Service one', 'Describe this service.'),\n featureColumn('b_s2', 'Service two', 'Describe this service.'),\n featureColumn(\n 'b_s3',\n 'Service three',\n 'Describe this service.',\n ),\n ],\n },\n ]),\n ]),\n },\n {\n key: 'about-us',\n displayName: 'About Us',\n slug: 'about-us',\n seo: { title: 'About us' },\n nodes: buildNodes([\n // Was `maxWidth: 720` — the one unambiguous PROSE band in the set,\n // and the case the Prose Container preset exists for. MD (900px)\n // lands near the 65–75 characters a line that reads comfortably.\n section('a_wrapSection', 'md', 8, [\n {\n id: 'a_wrap',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('a_title', 'h3', 'About us'),\n text(\n 'a_body',\n 'body1',\n 'Share your story: how you started, what you believe, and ' +\n 'why customers trust you.',\n ),\n ],\n },\n ]),\n ]),\n },\n {\n key: 'contact-us',\n displayName: 'Contact Us',\n slug: 'contact-us',\n seo: { title: 'Contact' },\n nodes: buildNodes([\n // Was `maxWidth: 560`. Same reading as the landing page's contact\n // band: text plus a form column, so MD.\n section('c_wrapSection', 'md', 8, [\n {\n id: 'c_wrap',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('c_title', 'h3', 'Contact us'),\n text(\n 'c_body',\n 'body1',\n 'Questions or quotes — send a message and we reply within ' +\n 'one business day.',\n ),\n contactForm('c_'),\n ],\n },\n ]),\n ]),\n },\n ],\n },\n {\n id: 'portfolio',\n displayName: 'Portfolio',\n description: 'Personal portfolio: intro, work grid, and contact form.',\n category: 'Personal',\n screens: [\n {\n key: 'portfolio',\n displayName: 'Portfolio',\n slug: 'portfolio',\n seo: { title: 'Portfolio' },\n nodes: buildNodes([\n heroSection(\n 'p_',\n 'Hi, I make things',\n 'Designer / developer / photographer — introduce yourself here.',\n ),\n section('p_gridSection', 'xl', 6, [\n {\n id: 'p_grid',\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 2 },\n children: [\n {\n id: 'p_img1',\n componentId: 'image',\n // `height` is an image's own intrinsic sizing prop, not a\n // band cap — out of scope for the container standard.\n props: { alt: 'Project one', height: '220px' },\n },\n {\n id: 'p_img2',\n componentId: 'image',\n props: { alt: 'Project two', height: '220px' },\n },\n {\n id: 'p_img3',\n componentId: 'image',\n props: { alt: 'Project three', height: '220px' },\n },\n ],\n },\n ]),\n // Was `maxWidth: 560`, the third of the three contact bands.\n section('p_contactSection', 'md', 6, [\n {\n id: 'p_contact',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('p_contactTitle', 'h4', 'Work with me'),\n contactForm('p_'),\n ],\n },\n ]),\n ]),\n },\n ],\n },\n]\n\n/**\n * Every starter in this build, in gallery order: the platform's own, then\n * each plugin's in config order (AGL-3080). A plugin whose elements a starter\n * is built around — a storefront's product grid and cart — declares it under\n * `starterTemplates` in plugins.config.json, and the manifest generator\n * compiles what it returns, so the gallery, the seed route and a model\n * shown examples all read one list without loading any plugin.\n */\nexport const STARTER_TEMPLATES: StarterTemplate[] = [\n ...PLATFORM_STARTER_TEMPLATES,\n ...PLUGIN_STARTER_TEMPLATES,\n]\n"],"names":["PLUGIN_STARTER_TEMPLATES","normalizeScreenSlug","buildStarterNodes","buildNodes","starterHeroSection","heroSection","starterSection","section","starterText","text","starterTextField","starterTemplateDocId","starterId","screenKey","buildStarterTemplateDocs","starter","screens","map","screen","index","slug","id","key","data","kind","displayName","description","category","seo","nodes","source","type","starterName","starterDescription","starterOrder","buildAllStarterTemplateDocs","STARTER_TEMPLATES","flatMap","featureColumn","title","body","componentId","props","spacing","sx","flex","paddingTop","paddingRight","paddingBottom","paddingLeft","children","contactForm","prefix","formName","submitLabel","successMessage","name","label","required","multiline","buildDefaultHomeScreen","PLATFORM_STARTER_TEMPLATES","direction","alt","height"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/starter-templates.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 */\n\n// Leaf imports only, deliberately (AGL-687). This module is imported from\n// BOTH graphs — the console's client gallery renders virtual starters from\n// it, the console's seed route materializes them, and the AI plugin's server\n// shows them to a model — and neither barrel works in both: the full\n// `@aglyn/aglyn` barrel breaks the RSC/server-route graph, while the server\n// entry drags `node:fs` into the client bundle. The starter kit imports only\n// the canvas constants, a leaf with no imports of their own, and the\n// entrance-motion pass, which adds only the animation vocabulary; the compiled\n// plugin starters are data behind a type-only import; and `screen-route`\n// imports only a TYPE from foundation — so all three are safe on either side.\nimport { PLUGIN_STARTER_TEMPLATES } from './plugin-starter-templates.generated'\nimport { applyElementMotion } from './element-motion'\nimport { normalizeScreenSlug } from './screen-route'\nimport {\n buildStarterNodes as buildNodes,\n starterHeroSection as heroSection,\n starterSection as section,\n starterText as text,\n starterTextField,\n type StarterNodeSpec as NodeSpec,\n type StarterTemplate,\n} from './starter-template-nodes'\n\nexport type {\n StarterNodeSpec,\n StarterSectionWidth,\n StarterTemplate,\n StarterTemplateScreen,\n} from './starter-template-nodes'\nexport {\n buildStarterNodes,\n starterHeroSection,\n starterSection,\n starterText,\n starterTextField,\n} from './starter-template-nodes'\n\n/**\n * First-party starter definitions (AGL-78/79), SEED INPUT (AGL-687).\n *\n * These used to be rendered straight into the gallery and instantiated from\n * code, which made a starter a second kind of template: no version history,\n * no placeholders, no editor, changeable only by shipping a release. Now\n * they are seeded into each host's own template library as ordinary\n * `hosts/{hostId}/templates` documents (see the console's\n * `utils/server/seed-starter-templates.ts` for why copy-on-use rather than a\n * global read-only collection), and nothing reads this file at render time.\n *\n * They are also the page examples the AI plugin's template generator shows a\n * model (AGL-2909), which is why they live in the core package rather than\n * beside the console gallery that renders them.\n *\n * Node ids stay template-local (unique within each screen's version doc);\n * `createPageFromTemplate` re-keys screen and version ids at instantiation.\n *\n * PERSISTED IDENTIFIERS: `StarterTemplate.id`, `StarterTemplateScreen.key`\n * and every node id below appear in stored documents (seeded template doc\n * ids are derived from the first two). They must never be renamed.\n */\nexport interface StarterTemplateDoc {\n id: string\n /** Which starter this page belongs to — lets one starter be selected. */\n starterId: string\n data: Record<string, unknown>\n}\n\n/**\n * Deterministic document id for a seeded starter screen (AGL-687).\n *\n * Derived from the starter id and the screen key — never randomly generated\n * — so re-running the seed addresses the same documents instead of stacking\n * duplicate copies of every starter on every run.\n */\nexport function starterTemplateDocId(\n starterId: string,\n screenKey: string,\n): string {\n return `starter-${starterId}-${screenKey}`\n}\n\n/**\n * Expands one starter into the template documents it seeds as.\n *\n * One page template per screen, matching what a marketplace install of a\n * multi-screen site template already produces (AGL-669) — the alternative,\n * a bespoke multi-page template shape, would be a third lifecycle on top of\n * the two this issue exists to merge. The bundle's name/description/order\n * ride `source` so the gallery can still present the starter as one card.\n */\nexport function buildStarterTemplateDocs(\n starter: StarterTemplate,\n): StarterTemplateDoc[] {\n return starter.screens.map((screen, index) => {\n // Normalized on the way into the document so the persisted address is in\n // the routing-map format the tenant matches against — in particular the\n // root, which the previous `screen.slug ? …` guard dropped entirely when\n // home was spelled `''` (AGL-1575). A slug that sanitizes away carries no\n // field, and the apply path derives one from the display name.\n const slug = normalizeScreenSlug(screen.slug)\n return {\n id: starterTemplateDocId(starter.id, screen.key),\n starterId: starter.id,\n data: {\n kind: 'page',\n displayName: screen.displayName,\n // Only the screen's own description, never the starter blurb: a\n // template's `description` is carried onto the page it creates, and a\n // screen description is the live site's meta-description fallback.\n // The bundle blurb lives on `source.starterDescription` instead.\n ...(screen.description ? { description: screen.description } : {}),\n category: starter.category,\n ...(slug ? { slug } : {}),\n ...(screen.seo ? { seo: screen.seo } : {}),\n // A starter's page moves the way the attributes panel would set it\n // up (AGL-3838). Written here, as it is seeded, and not into the\n // starter itself: the starters are also the page examples a model is\n // shown, and those carry no motion — the AI's is decided in code.\n nodes: applyElementMotion(screen.nodes),\n source: {\n type: 'starter',\n starterId: starter.id,\n starterName: starter.displayName,\n starterDescription: starter.description,\n starterOrder: index,\n },\n },\n }\n })\n}\n\n/** Every document a starter COULD materialize as, in bundle order. */\nexport function buildAllStarterTemplateDocs(): StarterTemplateDoc[] {\n return STARTER_TEMPLATES.flatMap(buildStarterTemplateDocs)\n}\n\nconst featureColumn = (id: string, title: string, body: string): NodeSpec => ({\n id,\n componentId: 'muiStack',\n props: { spacing: 1 },\n // `flex: 1` is a column's share of its row, not a width cap — it survives\n // the sweep deliberately. Only `maxWidth` in raw pixels was the violation.\n sx: {\n flex: 1,\n paddingTop: 2,\n paddingRight: 2,\n paddingBottom: 2,\n paddingLeft: 2,\n },\n children: [text(`${id}T`, 'h5', title), text(`${id}B`, 'body1', body)],\n})\n\nconst contactForm = (prefix: string): NodeSpec => ({\n id: `${prefix}form`,\n componentId: 'form',\n props: {\n formName: 'Contact',\n submitLabel: 'Send message',\n successMessage: 'Thanks — we will get back to you soon.',\n },\n children: [\n starterTextField(`${prefix}fName`, { name: 'name', label: 'Name', required: true }),\n starterTextField(`${prefix}fEmail`, {\n name: 'email',\n label: 'Email',\n type: 'email',\n required: true,\n }),\n starterTextField(`${prefix}fMessage`, {\n name: 'message',\n label: 'Message',\n multiline: true,\n required: true,\n }),\n ],\n})\n\n\n/**\n * The home page every new site is born with now lives with the rest of the\n * site it is born into — layout, theme and SEO — in `default-site.ts`\n * (AGL-3497). Re-exported so the name keeps its home here.\n */\nexport { buildDefaultHomeScreen } from './default-site'\n\n/** The platform's own starters, which name no plugin's elements. */\nconst PLATFORM_STARTER_TEMPLATES: StarterTemplate[] = [\n {\n id: 'landing',\n displayName: 'Landing Page',\n description:\n 'One-page launch site: hero, three selling points, and a contact form.',\n category: 'Marketing',\n screens: [\n {\n key: 'landing',\n displayName: 'Landing',\n slug: 'landing',\n seo: {\n title: 'Welcome',\n description: 'Everything you need to know, on one page.',\n },\n nodes: buildNodes([\n heroSection(\n 'l_',\n 'A headline that sells your idea',\n 'One clear sentence about the value you deliver.',\n ),\n section('l_featuresSection', 'xl', 6, [\n {\n id: 'l_features',\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 2 },\n children: [\n featureColumn(\n 'l_f1',\n 'Fast',\n 'Explain the first reason customers pick you.',\n ),\n featureColumn(\n 'l_f2',\n 'Simple',\n 'Explain the second reason customers pick you.',\n ),\n featureColumn(\n 'l_f3',\n 'Reliable',\n 'Explain the third reason customers pick you.',\n ),\n ],\n },\n ]),\n // Was `maxWidth: 560`. A band, not an inner measure: it sat at the\n // top level carrying the section's own gutters and rhythm, so the\n // pixel value was capping the BAND. MD is the stock width for a\n // narrow, form-led column.\n section('l_contactSection', 'md', 6, [\n {\n id: 'l_contact',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('l_contactTitle', 'h4', 'Get in touch'),\n contactForm('l_'),\n ],\n },\n ]),\n ]),\n },\n ],\n },\n {\n id: 'business',\n displayName: 'Business',\n description:\n 'Company site: home with services, an about page, and a contact page.',\n category: 'Business',\n screens: [\n {\n key: 'home',\n displayName: 'Business Home',\n slug: 'home',\n seo: { title: 'Home' },\n nodes: buildNodes([\n heroSection(\n 'b_',\n 'Your business, done right',\n 'Tell visitors what you do and who you do it for.',\n ),\n section('b_servicesSection', 'xl', 6, [\n {\n id: 'b_services',\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 2 },\n children: [\n featureColumn('b_s1', 'Service one', 'Describe this service.'),\n featureColumn('b_s2', 'Service two', 'Describe this service.'),\n featureColumn(\n 'b_s3',\n 'Service three',\n 'Describe this service.',\n ),\n ],\n },\n ]),\n ]),\n },\n {\n key: 'about-us',\n displayName: 'About Us',\n slug: 'about-us',\n seo: { title: 'About us' },\n nodes: buildNodes([\n // Was `maxWidth: 720` — the one unambiguous PROSE band in the set,\n // and the case the Prose Container preset exists for. MD (900px)\n // lands near the 65–75 characters a line that reads comfortably.\n section('a_wrapSection', 'md', 8, [\n {\n id: 'a_wrap',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('a_title', 'h3', 'About us'),\n text(\n 'a_body',\n 'body1',\n 'Share your story: how you started, what you believe, and ' +\n 'why customers trust you.',\n ),\n ],\n },\n ]),\n ]),\n },\n {\n key: 'contact-us',\n displayName: 'Contact Us',\n slug: 'contact-us',\n seo: { title: 'Contact' },\n nodes: buildNodes([\n // Was `maxWidth: 560`. Same reading as the landing page's contact\n // band: text plus a form column, so MD.\n section('c_wrapSection', 'md', 8, [\n {\n id: 'c_wrap',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('c_title', 'h3', 'Contact us'),\n text(\n 'c_body',\n 'body1',\n 'Questions or quotes — send a message and we reply within ' +\n 'one business day.',\n ),\n contactForm('c_'),\n ],\n },\n ]),\n ]),\n },\n ],\n },\n {\n id: 'portfolio',\n displayName: 'Portfolio',\n description: 'Personal portfolio: intro, work grid, and contact form.',\n category: 'Personal',\n screens: [\n {\n key: 'portfolio',\n displayName: 'Portfolio',\n slug: 'portfolio',\n seo: { title: 'Portfolio' },\n nodes: buildNodes([\n heroSection(\n 'p_',\n 'Hi, I make things',\n 'Designer / developer / photographer — introduce yourself here.',\n ),\n section('p_gridSection', 'xl', 6, [\n {\n id: 'p_grid',\n componentId: 'muiStack',\n props: { direction: 'row', spacing: 2 },\n children: [\n {\n id: 'p_img1',\n componentId: 'image',\n // `height` is an image's own intrinsic sizing prop, not a\n // band cap — out of scope for the container standard.\n props: { alt: 'Project one', height: '220px' },\n },\n {\n id: 'p_img2',\n componentId: 'image',\n props: { alt: 'Project two', height: '220px' },\n },\n {\n id: 'p_img3',\n componentId: 'image',\n props: { alt: 'Project three', height: '220px' },\n },\n ],\n },\n ]),\n // Was `maxWidth: 560`, the third of the three contact bands.\n section('p_contactSection', 'md', 6, [\n {\n id: 'p_contact',\n componentId: 'muiStack',\n props: { spacing: 2 },\n children: [\n text('p_contactTitle', 'h4', 'Work with me'),\n contactForm('p_'),\n ],\n },\n ]),\n ]),\n },\n ],\n },\n]\n\n/**\n * Every starter in this build, in gallery order: the platform's own, then\n * each plugin's in config order (AGL-3080). A plugin whose elements a starter\n * is built around — a storefront's product grid and cart — declares it under\n * `starterTemplates` in plugins.config.json, and the manifest generator\n * compiles what it returns, so the gallery, the seed route and a model\n * shown examples all read one list without loading any plugin.\n */\nexport const STARTER_TEMPLATES: StarterTemplate[] = [\n ...PLATFORM_STARTER_TEMPLATES,\n ...PLUGIN_STARTER_TEMPLATES,\n]\n"],"names":["PLUGIN_STARTER_TEMPLATES","applyElementMotion","normalizeScreenSlug","buildStarterNodes","buildNodes","starterHeroSection","heroSection","starterSection","section","starterText","text","starterTextField","starterTemplateDocId","starterId","screenKey","buildStarterTemplateDocs","starter","screens","map","screen","index","slug","id","key","data","kind","displayName","description","category","seo","nodes","source","type","starterName","starterDescription","starterOrder","buildAllStarterTemplateDocs","STARTER_TEMPLATES","flatMap","featureColumn","title","body","componentId","props","spacing","sx","flex","paddingTop","paddingRight","paddingBottom","paddingLeft","children","contactForm","prefix","formName","submitLabel","successMessage","name","label","required","multiline","buildDefaultHomeScreen","PLATFORM_STARTER_TEMPLATES","direction","alt","height"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,qEAAqE;AACrE,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,+EAA+E;AAC/E,yEAAyE;AACzE,8EAA8E;AAC9E,SAASA,wBAAwB,QAAQ,0CAAsC;AAC/E,SAASC,kBAAkB,QAAQ,sBAAkB;AACrD,SAASC,mBAAmB,QAAQ,oBAAgB;AACpD,SACEC,qBAAqBC,UAAU,EAC/BC,sBAAsBC,WAAW,EACjCC,kBAAkBC,OAAO,EACzBC,eAAeC,IAAI,EACnBC,gBAAgB,QAGX,8BAA0B;AAQjC,SACER,iBAAiB,EACjBE,kBAAkB,EAClBE,cAAc,EACdE,WAAW,EACXE,gBAAgB,QACX,8BAA0B;AA+BjC;;;;;;CAMC,GACD,OAAO,SAASC,qBACdC,SAAiB,EACjBC,SAAiB;IAEjB,OAAO,CAAC,QAAQ,EAAED,UAAU,CAAC,EAAEC,WAAW;AAC5C;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASC,yBACdC,OAAwB;IAExB,OAAOA,QAAQC,OAAO,CAACC,GAAG,CAAC,CAACC,QAAQC;QAClC,yEAAyE;QACzE,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,+DAA+D;QAC/D,MAAMC,OAAOnB,oBAAoBiB,OAAOE,IAAI;QAC5C,OAAO;YACLC,IAAIV,qBAAqBI,QAAQM,EAAE,EAAEH,OAAOI,GAAG;YAC/CV,WAAWG,QAAQM,EAAE;YACrBE,MAAM;gBACJC,MAAM;gBACNC,aAAaP,OAAOO,WAAW;eAK3BP,OAAOQ,WAAW,GAAG;gBAAEA,aAAaR,OAAOQ,WAAW;YAAC,IAAI,CAAC;gBAChEC,UAAUZ,QAAQY,QAAQ;eACtBP,OAAO;gBAAEA;YAAK,IAAI,CAAC,GACnBF,OAAOU,GAAG,GAAG;gBAAEA,KAAKV,OAAOU,GAAG;YAAC,IAAI,CAAC;gBACxC,mEAAmE;gBACnE,iEAAiE;gBACjE,qEAAqE;gBACrE,kEAAkE;gBAClEC,OAAO7B,mBAAmBkB,OAAOW,KAAK;gBACtCC,QAAQ;oBACNC,MAAM;oBACNnB,WAAWG,QAAQM,EAAE;oBACrBW,aAAajB,QAAQU,WAAW;oBAChCQ,oBAAoBlB,QAAQW,WAAW;oBACvCQ,cAAcf;gBAChB;;QAEJ;IACF;AACF;AAEA,oEAAoE,GACpE,OAAO,SAASgB;IACd,OAAOC,kBAAkBC,OAAO,CAACvB;AACnC;AAEA,MAAMwB,gBAAgB,CAACjB,IAAYkB,OAAeC,OAA4B,CAAA;QAC5EnB;QACAoB,aAAa;QACbC,OAAO;YAAEC,SAAS;QAAE;QACpB,0EAA0E;QAC1E,2EAA2E;QAC3EC,IAAI;YACFC,MAAM;YACNC,YAAY;YACZC,cAAc;YACdC,eAAe;YACfC,aAAa;QACf;QACAC,UAAU;YAACzC,KAAK,GAAGY,GAAG,CAAC,CAAC,EAAE,MAAMkB;YAAQ9B,KAAK,GAAGY,GAAG,CAAC,CAAC,EAAE,SAASmB;SAAM;IACxE,CAAA;AAEA,MAAMW,cAAc,CAACC,SAA8B,CAAA;QACjD/B,IAAI,GAAG+B,OAAO,IAAI,CAAC;QACnBX,aAAa;QACbC,OAAO;YACLW,UAAU;YACVC,aAAa;YACbC,gBAAgB;QAClB;QACAL,UAAU;YACRxC,iBAAiB,GAAG0C,OAAO,KAAK,CAAC,EAAE;gBAAEI,MAAM;gBAAQC,OAAO;gBAAQC,UAAU;YAAK;YACjFhD,iBAAiB,GAAG0C,OAAO,MAAM,CAAC,EAAE;gBAClCI,MAAM;gBACNC,OAAO;gBACP1B,MAAM;gBACN2B,UAAU;YACZ;YACAhD,iBAAiB,GAAG0C,OAAO,QAAQ,CAAC,EAAE;gBACpCI,MAAM;gBACNC,OAAO;gBACPE,WAAW;gBACXD,UAAU;YACZ;SACD;IACH,CAAA;AAGA;;;;CAIC,GACD,SAASE,sBAAsB,QAAQ,oBAAgB;AAEvD,kEAAkE,GAClE,MAAMC,6BAAgD;IACpD;QACExC,IAAI;QACJI,aAAa;QACbC,aACE;QACFC,UAAU;QACVX,SAAS;YACP;gBACEM,KAAK;gBACLG,aAAa;gBACbL,MAAM;gBACNQ,KAAK;oBACHW,OAAO;oBACPb,aAAa;gBACf;gBACAG,OAAO1B,WAAW;oBAChBE,YACE,MACA,mCACA;oBAEFE,QAAQ,qBAAqB,MAAM,GAAG;wBACpC;4BACEc,IAAI;4BACJoB,aAAa;4BACbC,OAAO;gCAAEoB,WAAW;gCAAOnB,SAAS;4BAAE;4BACtCO,UAAU;gCACRZ,cACE,QACA,QACA;gCAEFA,cACE,QACA,UACA;gCAEFA,cACE,QACA,YACA;6BAEH;wBACH;qBACD;oBACD,mEAAmE;oBACnE,kEAAkE;oBAClE,gEAAgE;oBAChE,2BAA2B;oBAC3B/B,QAAQ,oBAAoB,MAAM,GAAG;wBACnC;4BACEc,IAAI;4BACJoB,aAAa;4BACbC,OAAO;gCAAEC,SAAS;4BAAE;4BACpBO,UAAU;gCACRzC,KAAK,kBAAkB,MAAM;gCAC7B0C,YAAY;6BACb;wBACH;qBACD;iBACF;YACH;SACD;IACH;IACA;QACE9B,IAAI;QACJI,aAAa;QACbC,aACE;QACFC,UAAU;QACVX,SAAS;YACP;gBACEM,KAAK;gBACLG,aAAa;gBACbL,MAAM;gBACNQ,KAAK;oBAAEW,OAAO;gBAAO;gBACrBV,OAAO1B,WAAW;oBAChBE,YACE,MACA,6BACA;oBAEFE,QAAQ,qBAAqB,MAAM,GAAG;wBACpC;4BACEc,IAAI;4BACJoB,aAAa;4BACbC,OAAO;gCAAEoB,WAAW;gCAAOnB,SAAS;4BAAE;4BACtCO,UAAU;gCACRZ,cAAc,QAAQ,eAAe;gCACrCA,cAAc,QAAQ,eAAe;gCACrCA,cACE,QACA,iBACA;6BAEH;wBACH;qBACD;iBACF;YACH;YACA;gBACEhB,KAAK;gBACLG,aAAa;gBACbL,MAAM;gBACNQ,KAAK;oBAAEW,OAAO;gBAAW;gBACzBV,OAAO1B,WAAW;oBAChB,mEAAmE;oBACnE,iEAAiE;oBACjE,iEAAiE;oBACjEI,QAAQ,iBAAiB,MAAM,GAAG;wBAChC;4BACEc,IAAI;4BACJoB,aAAa;4BACbC,OAAO;gCAAEC,SAAS;4BAAE;4BACpBO,UAAU;gCACRzC,KAAK,WAAW,MAAM;gCACtBA,KACE,UACA,SACA,8DACE;6BAEL;wBACH;qBACD;iBACF;YACH;YACA;gBACEa,KAAK;gBACLG,aAAa;gBACbL,MAAM;gBACNQ,KAAK;oBAAEW,OAAO;gBAAU;gBACxBV,OAAO1B,WAAW;oBAChB,kEAAkE;oBAClE,wCAAwC;oBACxCI,QAAQ,iBAAiB,MAAM,GAAG;wBAChC;4BACEc,IAAI;4BACJoB,aAAa;4BACbC,OAAO;gCAAEC,SAAS;4BAAE;4BACpBO,UAAU;gCACRzC,KAAK,WAAW,MAAM;gCACtBA,KACE,UACA,SACA,8DACE;gCAEJ0C,YAAY;6BACb;wBACH;qBACD;iBACF;YACH;SACD;IACH;IACA;QACE9B,IAAI;QACJI,aAAa;QACbC,aAAa;QACbC,UAAU;QACVX,SAAS;YACP;gBACEM,KAAK;gBACLG,aAAa;gBACbL,MAAM;gBACNQ,KAAK;oBAAEW,OAAO;gBAAY;gBAC1BV,OAAO1B,WAAW;oBAChBE,YACE,MACA,qBACA;oBAEFE,QAAQ,iBAAiB,MAAM,GAAG;wBAChC;4BACEc,IAAI;4BACJoB,aAAa;4BACbC,OAAO;gCAAEoB,WAAW;gCAAOnB,SAAS;4BAAE;4BACtCO,UAAU;gCACR;oCACE7B,IAAI;oCACJoB,aAAa;oCACb,0DAA0D;oCAC1D,sDAAsD;oCACtDC,OAAO;wCAAEqB,KAAK;wCAAeC,QAAQ;oCAAQ;gCAC/C;gCACA;oCACE3C,IAAI;oCACJoB,aAAa;oCACbC,OAAO;wCAAEqB,KAAK;wCAAeC,QAAQ;oCAAQ;gCAC/C;gCACA;oCACE3C,IAAI;oCACJoB,aAAa;oCACbC,OAAO;wCAAEqB,KAAK;wCAAiBC,QAAQ;oCAAQ;gCACjD;6BACD;wBACH;qBACD;oBACD,6DAA6D;oBAC7DzD,QAAQ,oBAAoB,MAAM,GAAG;wBACnC;4BACEc,IAAI;4BACJoB,aAAa;4BACbC,OAAO;gCAAEC,SAAS;4BAAE;4BACpBO,UAAU;gCACRzC,KAAK,kBAAkB,MAAM;gCAC7B0C,YAAY;6BACb;wBACH;qBACD;iBACF;YACH;SACD;IACH;CACD;AAED;;;;;;;CAOC,GACD,OAAO,MAAMf,oBAAuC;OAC/CyB;OACA9D;CACJ,CAAA"}