create-ailk 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -10
- package/component-catalog.json +798 -49
- package/component-catalog.md +9 -6
- package/dist/add-module.d.ts +20 -0
- package/dist/add-module.js +43 -7
- package/dist/add-route.d.ts +56 -0
- package/dist/add-route.js +286 -0
- package/dist/apply-design-md.d.ts +7 -0
- package/dist/apply-design-md.js +50 -0
- package/dist/apply-design.d.ts +64 -0
- package/dist/apply-design.js +273 -0
- package/dist/claude-md.d.ts +111 -0
- package/dist/claude-md.js +334 -0
- package/dist/cli.js +114 -28
- package/dist/derive-architecture.js +41 -36
- package/dist/design-compile.d.ts +71 -0
- package/dist/design-compile.js +98 -0
- package/dist/design-package.d.ts +83 -0
- package/dist/design-package.js +468 -0
- package/dist/design-presets.d.ts +86 -0
- package/dist/design-presets.js +642 -0
- package/dist/design-scaffold.d.ts +76 -0
- package/dist/design-scaffold.js +220 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -1
- package/dist/legacy-nav-renderers.d.ts +45 -0
- package/dist/legacy-nav-renderers.js +545 -0
- package/dist/lib/auth-secret-file.d.ts +19 -0
- package/dist/lib/auth-secret-file.js +112 -0
- package/dist/lib/design-checks.d.ts +78 -0
- package/dist/lib/design-checks.js +174 -0
- package/dist/lib/extract-module-bundle.js +5 -1
- package/dist/lib/license-key-files.d.ts +9 -0
- package/dist/lib/license-key-files.js +2 -2
- package/dist/lib/module-license-gate.d.ts +89 -0
- package/dist/lib/module-license-gate.js +171 -12
- package/dist/lib/module-tier.d.ts +45 -16
- package/dist/lib/module-tier.js +76 -0
- package/dist/lib/pro-callout.js +10 -2
- package/dist/lib/render-verdict.d.ts +52 -0
- package/dist/lib/render-verdict.js +77 -0
- package/dist/lib/scaffold-render-sweep.d.ts +105 -0
- package/dist/lib/scaffold-render-sweep.js +236 -0
- package/dist/module-architecture.d.ts +19 -16
- package/dist/module-architecture.js +64 -21
- package/dist/parse-args.d.ts +88 -10
- package/dist/parse-args.js +272 -21
- package/dist/programmatic.d.ts +66 -12
- package/dist/programmatic.js +361 -34
- package/dist/site-chrome.d.ts +19 -9
- package/dist/site-chrome.js +23 -13
- package/dist/site-manifest.d.ts +25 -0
- package/dist/site-manifest.js +254 -0
- package/dist/site-roster.d.ts +41 -0
- package/dist/site-roster.js +149 -11
- package/dist/starter-grid.d.ts +232 -0
- package/dist/starter-grid.js +545 -0
- package/dist/surfaces.d.ts +41 -9
- package/dist/surfaces.js +268 -92
- package/dist/template-manifest.d.ts +65 -29
- package/dist/template-manifest.js +161 -382
- package/dist/template-names.d.ts +14 -12
- package/dist/template-names.js +13 -17
- package/package.json +5 -4
- package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
- package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
- package/site-templates/_base/content/en/GlossaryList/glossary.mdx +0 -1
- package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +0 -1
- package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
- package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
- package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +15 -0
- package/site-templates/_base/content/en/UseCase/persona-1.mdx +70 -0
- package/site-templates/_base/content/en/UseCase/persona-2.mdx +70 -0
- package/site-templates/_base/content/en/UseCase/persona-3.mdx +70 -0
- package/site-templates/{minimalism-site/TEMPLATE-MANIFEST.json → aliases/minimalism-site.TEMPLATE-MANIFEST.json} +72 -40
- package/site-templates/designs/minimalism/DESIGN.md +98 -6
- package/site-templates/designs/minimalism/sample/README.md +48 -0
- package/site-templates/designs/standard/DESIGN.md +103 -6
- package/site-templates/marketing-site/DESIGN.md +103 -6
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +144 -47
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +82 -41
- package/site-templates/marketing-site-free/DESIGN.md +103 -6
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +150 -48
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +114 -67
- package/site-templates/marketing-site-free/ailk-template.json +1 -1
- package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
- package/site-templates/saas-product/DESIGN.md +103 -6
- package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
- package/site-templates/{simple-service → shapes/local-business-service}/TEMPLATE-MANIFEST.json +210 -81
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +356 -0
- package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
- package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
- package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
- package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/{minimalism-site → shapes/local-business-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +7 -8
- package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
- package/site-templates/shapes/local-business-service/provenance.json +4 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +471 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +354 -0
- package/site-templates/shapes/organization-service/ailk-template.json +10 -0
- package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
- package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/{minimalism-site → shapes/organization-service}/content/en/ServicesList/services.mdx +3 -4
- package/site-templates/shapes/organization-service/provenance.json +4 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +478 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +353 -0
- package/site-templates/shapes/person-service/ailk-template.json +10 -0
- package/site-templates/shapes/person-service/content/_site.mdx +85 -0
- package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
- package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
- package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/{simple-service → shapes/person-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +10 -11
- package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
- package/site-templates/shapes/person-service/provenance.json +4 -0
- package/templates/.claude/rules/architecture.md +7 -0
- package/templates/.claude/skills/README.md +5 -3
- package/templates/.claude/skills/add-auth/references/env-vars.md +22 -15
- package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +3 -2
- package/templates/.claude/skills/add-page/SKILL.md +241 -238
- package/templates/.claude/skills/add-page/references/page-types.md +85 -72
- package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
- package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
- package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
- package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
- package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
- package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
- package/templates/.claude/skills/check-site/SKILL.md +23 -0
- package/templates/.claude/skills/fill-page/SKILL.md +26 -7
- package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
- package/templates/.claude/skills/setup-database/SKILL.md +156 -0
- package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
- package/templates/.claude/skills/setup-deploy/SKILL.md +64 -32
- package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +44 -36
- package/templates/.claude/skills/setup-deploy/references/runbook-template.md +58 -102
- package/templates/.claude/skills/update-page/SKILL.md +117 -0
- package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
- package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
- package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
- package/templates/.github/workflows/ci.yml +4 -0
- package/templates/.prettierignore +1 -0
- package/templates/CLAUDE.md +146 -103
- package/templates/DESIGN.md +103 -6
- package/templates/README.md +63 -43
- package/templates/apps/api/.env.example +2 -1
- package/templates/apps/api/CLAUDE.md +3 -2
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
- package/templates/apps/api/src/__tests__/server.test.ts +116 -0
- package/templates/apps/api/src/config/__tests__/index.test.ts +115 -14
- package/templates/apps/api/src/config/index.ts +35 -16
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
- package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
- package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
- package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
- package/templates/apps/api/src/lib/stripe.ts +9 -0
- package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
- package/templates/apps/api/src/middleware/auth.ts +54 -0
- package/templates/apps/api/src/openapi/spec.ts +63 -12
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
- package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
- package/templates/apps/api/src/routes/leads/index.ts +46 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
- package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
- package/templates/apps/api/src/server.ts +35 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
- package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
- package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
- package/templates/apps/api/src/services/lead-routing.ts +140 -30
- package/templates/apps/api/src/services/leads-inbox.ts +48 -11
- package/templates/apps/api/src/services/revalidation.ts +60 -15
- package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
- package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
- package/templates/apps/mcp/src/tools/create_project.ts +21 -6
- package/templates/apps/mcp/src/tools/purchase.ts +4 -2
- package/templates/apps/web/.env.example +13 -0
- package/templates/apps/web/CLAUDE.md +22 -28
- package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
- package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
- package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
- package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
- package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
- package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +14 -6
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +10 -9
- package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +227 -84
- package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
- package/templates/apps/web/app/[locale]/contact/page.tsx +105 -15
- package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
- package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
- package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +21 -5
- package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
- package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/layout.tsx +65 -17
- package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
- package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
- package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +106 -14
- package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
- package/templates/apps/web/app/[locale]/{book-a-call → portfolio}/page.tsx +12 -13
- package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
- package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
- package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
- package/templates/apps/web/app/api/revalidate/route.ts +78 -36
- package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
- package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
- package/templates/apps/web/lib/locale-guard.ts +18 -0
- package/templates/apps/web/lib/meet-placeholder.ts +5 -0
- package/templates/apps/web/lib/nav-config.ts +50 -37
- package/templates/apps/web/lib/site-brand.tsx +13 -9
- package/templates/apps/web/lib/site-identity.ts +14 -0
- package/templates/apps/web/lib/site-logo.tsx +36 -0
- package/templates/apps/web/lib/site-theme.ts +46 -26
- package/templates/apps/web/messages/en.json +45 -5
- package/templates/apps/web/middleware.ts +28 -4
- package/templates/content/_site.mdx +4 -2
- package/templates/content/en/BlogList/blog.mdx +37 -16
- package/templates/content/en/BookCall/book-a-call.mdx +80 -0
- package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
- package/templates/content/en/BookCall/onsite-service.mdx +56 -0
- package/templates/content/en/BookCall/start-project.mdx +56 -0
- package/templates/content/en/ContactPage/contact.mdx +43 -34
- package/templates/content/en/HomePage/home.mdx +10 -22
- package/templates/content/en/LandingPage/meet.mdx +59 -0
- package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
- package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
- package/templates/database/CHANGELOG.md +14 -0
- package/templates/database/package.json +1 -1
- package/templates/package.json +2 -1
- package/templates/tools/check-claude-md.ts +128 -0
- package/versions.json +33 -33
- package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -53
- package/site-templates/_base/content/en/UseCase/first-use-case.mdx +0 -23
- package/site-templates/_base/content/en/UseCase/second-use-case.mdx +0 -23
- package/site-templates/_base/content/en/UseCase/third-use-case.mdx +0 -23
- package/site-templates/minimalism-site/DESIGN.md +0 -162
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -470
- package/site-templates/minimalism-site/ailk-template.json +0 -23
- package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
- package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -53
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
- package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
- package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
- package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
- package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
- package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
- package/site-templates/minimalism-site/provenance.json +0 -4
- package/site-templates/simple-service/DESIGN.md +0 -162
- package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -333
- package/site-templates/simple-service/ailk-template.json +0 -11
- package/site-templates/simple-service/content/en/BookCall/book-call.mdx +0 -53
- package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -32
- package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
- package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
- package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
- package/site-templates/simple-service/provenance.json +0 -4
- package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
- package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -211
- package/templates/apps/web/app/[locale]/contact/__tests__/ContactForm.test.tsx +0 -96
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
- package/templates/content/en/SoftwareProduct/product.mdx +0 -175
- /package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
- /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/first-engagement.mdx +0 -0
- /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/second-engagement.mdx +0 -0
- /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/third-engagement.mdx +0 -0
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"slug": "referral",
|
|
3
|
-
"defaultLocale": "en",
|
|
4
|
-
"steps": [
|
|
5
|
-
{
|
|
6
|
-
"key": "introduction",
|
|
7
|
-
"type": "field",
|
|
8
|
-
"copy": {
|
|
9
|
-
"title": {
|
|
10
|
-
"en": "Who should we meet?"
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
"fields": [
|
|
14
|
-
{
|
|
15
|
-
"name": "referrer_name",
|
|
16
|
-
"inputType": "text",
|
|
17
|
-
"required": true,
|
|
18
|
-
"mapsTo": "name",
|
|
19
|
-
"copy": {
|
|
20
|
-
"label": {
|
|
21
|
-
"en": "Your name"
|
|
22
|
-
},
|
|
23
|
-
"help": {
|
|
24
|
-
"en": "So we can tell them who sent us."
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"name": "referrer_email",
|
|
30
|
-
"inputType": "email",
|
|
31
|
-
"required": true,
|
|
32
|
-
"mapsTo": "email",
|
|
33
|
-
"copy": {
|
|
34
|
-
"label": {
|
|
35
|
-
"en": "Your email"
|
|
36
|
-
},
|
|
37
|
-
"help": {
|
|
38
|
-
"en": "Where we tell you how it went."
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"name": "referral_details",
|
|
44
|
-
"inputType": "textarea",
|
|
45
|
-
"required": true,
|
|
46
|
-
"minLength": 20,
|
|
47
|
-
"copy": {
|
|
48
|
-
"label": {
|
|
49
|
-
"en": "Who are they, and why them?"
|
|
50
|
-
},
|
|
51
|
-
"placeholder": {
|
|
52
|
-
"en": "Their name, a way to reach them, and one line on why you thought of them."
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
]
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"key": "sent",
|
|
60
|
-
"type": "message",
|
|
61
|
-
"copy": {
|
|
62
|
-
"title": {
|
|
63
|
-
"en": "Thank you — the introduction is in"
|
|
64
|
-
},
|
|
65
|
-
"body": {
|
|
66
|
-
"en": "We will reach out within a few days and let you know either way. Placeholder copy: replace it with what you actually do."
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
]
|
|
71
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Standard
|
|
3
|
-
description: The standard design — the black-on-white foundation any shape wears by default: full navigation, a multi-column footer, the document-scroll home.
|
|
4
|
-
colors:
|
|
5
|
-
bg: "#ffffff"
|
|
6
|
-
fg: "#000000"
|
|
7
|
-
surface: "#ffffff"
|
|
8
|
-
surface-secondary: "#ffffff"
|
|
9
|
-
border: "#000000"
|
|
10
|
-
text-muted: "#333333"
|
|
11
|
-
brand: "#000000"
|
|
12
|
-
fg-on-brand: "#ffffff"
|
|
13
|
-
accent: "#000000"
|
|
14
|
-
bg-dark: "#000000"
|
|
15
|
-
fg-dark: "#ffffff"
|
|
16
|
-
border-dark: "#ffffff"
|
|
17
|
-
brand-dark: "#ffffff"
|
|
18
|
-
typography:
|
|
19
|
-
display:
|
|
20
|
-
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
21
|
-
fontSize: "3.5rem"
|
|
22
|
-
fontWeight: 700
|
|
23
|
-
lineHeight: 1.1
|
|
24
|
-
letterSpacing: "normal"
|
|
25
|
-
heading-section:
|
|
26
|
-
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
27
|
-
fontSize: "3rem"
|
|
28
|
-
fontWeight: 700
|
|
29
|
-
lineHeight: 1.1
|
|
30
|
-
letterSpacing: "normal"
|
|
31
|
-
heading-item:
|
|
32
|
-
fontSize: "2rem"
|
|
33
|
-
fontWeight: 700
|
|
34
|
-
lineHeight: 1.375
|
|
35
|
-
letterSpacing: "normal"
|
|
36
|
-
body:
|
|
37
|
-
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
38
|
-
fontSize: "1.125rem"
|
|
39
|
-
fontWeight: 400
|
|
40
|
-
lineHeight: 1.5
|
|
41
|
-
eyebrow:
|
|
42
|
-
fontSize: "0.875rem"
|
|
43
|
-
fontWeight: 600
|
|
44
|
-
lineHeight: 1.4
|
|
45
|
-
letterSpacing: "0.05em"
|
|
46
|
-
rounded:
|
|
47
|
-
button: "0.5rem"
|
|
48
|
-
card: "0.75rem"
|
|
49
|
-
spacing:
|
|
50
|
-
section: "7rem"
|
|
51
|
-
section-mobile: "4rem"
|
|
52
|
-
card: "1.5rem"
|
|
53
|
-
grid: "1.5rem"
|
|
54
|
-
container: "1280px"
|
|
55
|
-
measure: "36rem"
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
<!--
|
|
59
|
-
Source template: simple-service
|
|
60
|
-
Design: standard
|
|
61
|
-
Version: create-ailk {{CREATE_AILK_VERSION}}
|
|
62
|
-
|
|
63
|
-
This is the `standard` design's DESIGN.md. Its one authored source is
|
|
64
|
-
create-ailk's site-templates/designs/standard/DESIGN.md; every template on
|
|
65
|
-
this design ships a copy of it that differs only in the "Source template"
|
|
66
|
-
line above, and a template installed with `--template <name>` replaces the
|
|
67
|
-
base scaffold's DESIGN.md with its own. The impeccable design skill reads
|
|
68
|
-
it at the start of every design session, so an agent building a new page
|
|
69
|
-
stays on-system.
|
|
70
|
-
Edit the canonical file, never a copy — a test holds every copy to it.
|
|
71
|
-
|
|
72
|
-
The tokens above describe what the site RENDERS today. Colours come from
|
|
73
|
-
content/_site.mdx (`theme.colors`); type, radius and spacing are platform
|
|
74
|
-
defaults a site cannot override yet — see "Where this is heading" below.
|
|
75
|
-
-->
|
|
76
|
-
|
|
77
|
-
# Standard
|
|
78
|
-
|
|
79
|
-
## Overview
|
|
80
|
-
|
|
81
|
-
The foundation reads like a well-made wireframe: nothing on the page but the words, black on white, with rules where other sites use shadows and colour. It is the look of a site whose owner has not chosen a brand yet and does not pretend otherwise — every placeholder reads as a placeholder, and the structure of the argument is what the visitor sees. A brand is applied on top of it; it is not one.
|
|
82
|
-
|
|
83
|
-
Every page is composed from the AI Launch Kit component library (`@working-theory/ui`). Nothing is hand-built: a page is a list of registered sections, each with a bounded set of variants. Each section is one full-width band with a lot of air around it.
|
|
84
|
-
|
|
85
|
-
## Colors
|
|
86
|
-
|
|
87
|
-
### Primary
|
|
88
|
-
|
|
89
|
-
**Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
|
|
90
|
-
|
|
91
|
-
### Neutral
|
|
92
|
-
|
|
93
|
-
Pure white ground (`bg` `#ffffff`), pure black ink for headings (`fg` `#000000`), and near-black `#333333` for body copy — well above AA on white. **Borders are black** (`#000000`): card outlines, the rule under the navigation, the rules between sections and the rule above the footer are all 1px black lines. Cards are white, not tinted (`surface-secondary` is white too). There is no accent colour — `accent` is black.
|
|
94
|
-
|
|
95
|
-
Dark mode inverts: black ground, white ink, white rules, white primary button with black label.
|
|
96
|
-
|
|
97
|
-
### Named Rules
|
|
98
|
-
|
|
99
|
-
- **Rules, not fills.** A container is drawn with a black hairline on the white ground. Grey fills are reserved for image placeholders.
|
|
100
|
-
|
|
101
|
-
## Typography
|
|
102
|
-
|
|
103
|
-
System sans throughout; no web font.
|
|
104
|
-
|
|
105
|
-
### Hierarchy
|
|
106
|
-
|
|
107
|
-
| Role | Size | Weight | Notes |
|
|
108
|
-
| --------------- | -------- | ------ | ------------------------------------------------------------------------------------- |
|
|
109
|
-
| Hero headline | 3.5rem | 700 | Normal tracking, line-height 1.1; 2.5rem below 1024px |
|
|
110
|
-
| Section heading | 3rem | 700 | Normal tracking, line-height 1.1; 2.25rem below 1024px, always under the hero |
|
|
111
|
-
| Item heading | 2rem | 700 | Card, feature and step titles; 1.5rem below 1024px |
|
|
112
|
-
| Body | 1.125rem | 400 | `#333333`, line-height 1.5; section copy capped at 36rem (about 70 characters a line) |
|
|
113
|
-
| Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
|
|
114
|
-
|
|
115
|
-
Measured from the rendered scaffold (1440px and 390px wide), not transcribed from tokens. Bold headings at normal tracking follow the foundation's pinned direction (#6493).
|
|
116
|
-
|
|
117
|
-
The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
|
|
118
|
-
|
|
119
|
-
## Layout
|
|
120
|
-
|
|
121
|
-
Full navigation; a multi-column footer; the default home. The home-only announcement banner is off by default (`layout.announcementBanner`). Every page this site carries is listed in its roster of record, `.ailk-site-manifest.json` at the site root. Shared foundation: a 1280px container, sections at 7rem (4rem below 1024px), card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
|
|
122
|
-
|
|
123
|
-
## Shapes
|
|
124
|
-
|
|
125
|
-
Square corners everywhere (`theme.corners: square`) — buttons, cards, the auth card, image placeholders; the tokens above are the base foundation's defaults a site overrides.
|
|
126
|
-
|
|
127
|
-
## Components
|
|
128
|
-
|
|
129
|
-
### Buttons
|
|
130
|
-
|
|
131
|
-
Primary: black fill, white label, 0.5rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
|
|
132
|
-
|
|
133
|
-
### Cards / Containers
|
|
134
|
-
|
|
135
|
-
White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding. The one exception today: the "how it works" steps render as dark filled cards (see below).
|
|
136
|
-
|
|
137
|
-
### Navigation
|
|
138
|
-
|
|
139
|
-
Full navigation: wordmark left, page links, an outlined and a filled button at the far right. A black hairline separates it from the page. Page links are 16px at weight 400. The two buttons are 42px tall on a 44px touch target and keep the 0.5rem button radius; square corners arrive with the platform radius change below, not in the nav alone (#6508). The Product link opens, on hover or keyboard, a 640px two-column panel whose items each show an icon, a title and a one-line description.
|
|
140
|
-
|
|
141
|
-
## Where this is heading
|
|
142
|
-
|
|
143
|
-
The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. The four traits this section used to list as blocked now ship as settings, so the rendered site matches the reference:
|
|
144
|
-
|
|
145
|
-
| Trait | How it is set |
|
|
146
|
-
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
|
|
147
|
-
| Square corners on buttons, cards and inputs | `theme.corners: square` in `_site.mdx` |
|
|
148
|
-
| Section label in sentence case, bold, no tracking | `theme.eyebrowCase: sentence` |
|
|
149
|
-
| Solid grey image placeholders, no outline | `theme.placeholders: fill` |
|
|
150
|
-
| Bare check and cross marks, no circle badge | `theme.checkmarks: plain` |
|
|
151
|
-
| Plain, uncarded feature and step items | per section: `itemStyle: plain`, and `variant: steps` for an image beside a numbered list |
|
|
152
|
-
| A left hero whose headline wraps at half the container | `measure: narrow` on the hero (pricing); `gapBelow: tight` where a list follows the hero directly |
|
|
153
|
-
| A three-up post grid on the blog index | `blog-list` `variant: grid` (cover · date · read time · title · excerpt · Read more) |
|
|
154
|
-
| A plans section that leads its page | drop the hero; the pricing section owns the `<h1>` (`ownsPageTitle`) |
|
|
155
|
-
|
|
156
|
-
## Do's and Don'ts
|
|
157
|
-
|
|
158
|
-
- **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
|
|
159
|
-
- **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
|
|
160
|
-
- **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
|
|
161
|
-
- **Don't** replace a black rule with a shadow or a grey fill.
|
|
162
|
-
- **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
|
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
# Template manifest — `simple-service`
|
|
2
|
-
|
|
3
|
-
> The T1 lawn-care template (#6087, Epic #5778) — the first site shape that composes `scheduling` and `commerce`: three priced services, a booker, a checkout return pair and a purchase policy (cancellation and refunds, #6646). Generated file: the regions between `<!-- generated:begin <id> -->` and `<!-- generated:end -->` are produced by `scripts/build-template-manifest.mjs --template simple-service` from the composed layer stack (this tree → its required modules → `_base` → the always-copied overlay), each roster row's MDX `sections[]`, and `component-catalog.json`. Everything outside the markers is written by hand.
|
|
4
|
-
|
|
5
|
-
| Field | Value |
|
|
6
|
-
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
7
|
-
| Template | `simple-service` |
|
|
8
|
-
| Level | Pro (derived from `requires` — `scheduling` and `commerce` are paid; never declared) |
|
|
9
|
-
| `requires` | `[marketing, scheduling, commerce]` — the first template to take `commerce` |
|
|
10
|
-
| `extends` | `_base` — lineage only, never level |
|
|
11
|
-
| Delivery | licence-checked module bundle (#5441); never in the Free tarball |
|
|
12
|
-
| Sample content posture | every line of copy, and all three service prices, are **placeholders** — and the prices are PUBLISHED as JSON-LD `Offer`s |
|
|
13
|
-
|
|
14
|
-
## 1. Chrome
|
|
15
|
-
|
|
16
|
-
This template declares **no `layout` block**. The default marketing-site chrome is what a lawn-care site wants — a nav row a reader can reach `/services` from, the four-column footer, and the document-scroll home — and the issue's STOP boundary excludes layout knobs the spec does not name.
|
|
17
|
-
|
|
18
|
-
### Layout knobs (#5612)
|
|
19
|
-
|
|
20
|
-
The template's `layout` block — resolved with `resolveSiteChrome`, defaults filled.
|
|
21
|
-
|
|
22
|
-
<!-- generated:begin layout -->
|
|
23
|
-
|
|
24
|
-
| Knob | Value |
|
|
25
|
-
| -------------------- | --------- |
|
|
26
|
-
| `nav` | `full` |
|
|
27
|
-
| `footer` | `columns` |
|
|
28
|
-
| `announcementBanner` | `false` |
|
|
29
|
-
| `home` | `default` |
|
|
30
|
-
|
|
31
|
-
<!-- generated:end -->
|
|
32
|
-
|
|
33
|
-
### Theme (locked)
|
|
34
|
-
|
|
35
|
-
The template's `theme:` block as `_site.mdx` declares it — the shape knobs and the colour overlay. Generated, so a change to a locked template's look is a red `manifest:check`, not a silent drift (starter-template contract R3.5).
|
|
36
|
-
|
|
37
|
-
<!-- generated:begin theme -->
|
|
38
|
-
|
|
39
|
-
| Setting | Value |
|
|
40
|
-
| ------------------------ | ---------- |
|
|
41
|
-
| `corners` | `square` |
|
|
42
|
-
| `eyebrowCase` | `sentence` |
|
|
43
|
-
| `placeholders` | `fill` |
|
|
44
|
-
| `checkmarks` | `plain` |
|
|
45
|
-
| `colors.light.bg` | `#ffffff` |
|
|
46
|
-
| `colors.light.bgMuted` | `#ffffff` |
|
|
47
|
-
| `colors.light.surface` | `#ffffff` |
|
|
48
|
-
| `colors.light.border` | `#000000` |
|
|
49
|
-
| `colors.light.text` | `#000000` |
|
|
50
|
-
| `colors.light.textMuted` | `#333333` |
|
|
51
|
-
| `colors.light.primary` | `#000000` |
|
|
52
|
-
| `colors.light.primaryFg` | `#ffffff` |
|
|
53
|
-
| `colors.light.accent` | `#000000` |
|
|
54
|
-
| `colors.dark.bg` | `#000000` |
|
|
55
|
-
| `colors.dark.bgMuted` | `#000000` |
|
|
56
|
-
| `colors.dark.surface` | `#000000` |
|
|
57
|
-
| `colors.dark.border` | `#ffffff` |
|
|
58
|
-
| `colors.dark.text` | `#ffffff` |
|
|
59
|
-
| `colors.dark.textMuted` | `#cccccc` |
|
|
60
|
-
| `colors.dark.primary` | `#ffffff` |
|
|
61
|
-
| `colors.dark.primaryFg` | `#000000` |
|
|
62
|
-
| `colors.dark.accent` | `#ffffff` |
|
|
63
|
-
|
|
64
|
-
<!-- generated:end -->
|
|
65
|
-
|
|
66
|
-
## 2. The money path
|
|
67
|
-
|
|
68
|
-
The whole point of this template is the first roster that takes a booking **and** the payment for it:
|
|
69
|
-
|
|
70
|
-
| Step | Where it lives |
|
|
71
|
-
| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
72
|
-
| Discovery | `/services` and the three `/services/<slug>` pages. Each detail page's top-level `price` + `priceCurrency` + `provider` become one schema.org `Offer` in its JSON-LD (#5838) — the free discovery floor. |
|
|
73
|
-
| Booking | `/meet`, `/meet/<slug>`, `/meet/confirmed` — the `scheduling` module's own contributed rows; `/appointments` is the site owner's own list (#6086). |
|
|
74
|
-
| Payment | a provider-hosted page on the seller's own Stripe account. Nothing on this site renders a card form. |
|
|
75
|
-
| Return | `/purchase/success` and `/purchase/cancel` — base tree under #6084 D12's shape-2 disposition, gated at request time on the `commerce` licence claim. |
|
|
76
|
-
| Policies | `/purchase-policy` (#6646) — cancellation and refunds sections, this template's service-shape override of the overlay's product-shape seed. |
|
|
77
|
-
|
|
78
|
-
## 3. Pages
|
|
79
|
-
|
|
80
|
-
One `page=<route>` region per roster row, generated from the seed file the composed layer stack lands for that route.
|
|
81
|
-
|
|
82
|
-
`/`:
|
|
83
|
-
|
|
84
|
-
<!-- generated:begin page=/ -->
|
|
85
|
-
|
|
86
|
-
| # | Section | Component | Copy (first line) |
|
|
87
|
-
| --- | ---------------------------------------------------------- | --------- | ---------------------------------------------- |
|
|
88
|
-
| 1 | `hero` (centered · eyebrow "{Your service area}" · 2 CTAs) | `Hero` | {Lawn care that turns up when it says it will} |
|
|
89
|
-
| 2 | `items` (columns=3 · items ×3) | `Items` | What we do |
|
|
90
|
-
| 3 | `cta` (minimal · 2 CTAs) | `CTA` | Ready for a tidier yard? |
|
|
91
|
-
|
|
92
|
-
<!-- generated:end -->
|
|
93
|
-
|
|
94
|
-
`/services`:
|
|
95
|
-
|
|
96
|
-
<!-- generated:begin page=/services -->
|
|
97
|
-
|
|
98
|
-
| # | Section | Component | Copy (first line) |
|
|
99
|
-
| --- | -------------------------------------- | --------- | ------------------------ |
|
|
100
|
-
| 1 | `hero` (centered · eyebrow "Services") | `Hero` | Three jobs, three prices |
|
|
101
|
-
| 2 | `items` (columns=3 · items ×3) | `Items` | What we do |
|
|
102
|
-
| 3 | `cta` (minimal · 1 CTA) | `CTA` | Not sure which one? |
|
|
103
|
-
|
|
104
|
-
<!-- generated:end -->
|
|
105
|
-
|
|
106
|
-
`/services/[slug]`:
|
|
107
|
-
|
|
108
|
-
<!-- generated:begin page=/services/[slug] -->
|
|
109
|
-
|
|
110
|
-
_Detail route over `content/en/Service/` — 3 seed pages: `landscape-design.mdx`, `lawn-maintenance.mdx`, `seasonal-cleanup.mdx`._
|
|
111
|
-
<!-- generated:end -->
|
|
112
|
-
|
|
113
|
-
`/about`:
|
|
114
|
-
|
|
115
|
-
<!-- generated:begin page=/about -->
|
|
116
|
-
|
|
117
|
-
| # | Section | Component | Copy (first line) |
|
|
118
|
-
| --- | ------------------------------------------ | -------------- | ------------------------------------------ |
|
|
119
|
-
| 1 | `content-block` (narrow · eyebrow "About") | `ContentBlock` | {A small crew, the same yards, every week} |
|
|
120
|
-
| 2 | `cta` (minimal · 2 CTAs) | `CTA` | Want us to take a look? |
|
|
121
|
-
|
|
122
|
-
<!-- generated:end -->
|
|
123
|
-
|
|
124
|
-
`/contact`:
|
|
125
|
-
|
|
126
|
-
<!-- generated:begin page=/contact -->
|
|
127
|
-
|
|
128
|
-
| # | Section | Component | Copy (first line) |
|
|
129
|
-
| --- | ------------------------------------- | --------- | ------------------------ |
|
|
130
|
-
| 1 | `hero` (centered · eyebrow "Contact") | `Hero` | Tell us about the yard |
|
|
131
|
-
| 2 | `cta` (minimal · 1 CTA) | `CTA` | Would a visit be faster? |
|
|
132
|
-
|
|
133
|
-
<!-- generated:end -->
|
|
134
|
-
|
|
135
|
-
`/faq`:
|
|
136
|
-
|
|
137
|
-
<!-- generated:begin page=/faq -->
|
|
138
|
-
|
|
139
|
-
| # | Section | Component | Copy (first line) |
|
|
140
|
-
| --- | ------------------------------------------------------------- | --------- | ---------------------- |
|
|
141
|
-
| 1 | `faq` (centered · items ×5 · supportLink · initialOpen first) | `FAQ` | Questions |
|
|
142
|
-
| 2 | `cta` (minimal · 1 CTA) | `CTA` | Still have a question? |
|
|
143
|
-
|
|
144
|
-
<!-- generated:end -->
|
|
145
|
-
|
|
146
|
-
`/glossary`, `/newsletter` (base-layer seeds every starter carries, #6658 D5):
|
|
147
|
-
|
|
148
|
-
<!-- generated:begin page=/glossary -->
|
|
149
|
-
|
|
150
|
-
| # | Section | Component | Copy (first line) |
|
|
151
|
-
| --- | ----------------------------------- | --------------- | -------------------------------------------- |
|
|
152
|
-
| 1 | `hero` (eyebrow "Glossary" · 1 CTA) | `Hero` | {Glossary: the terms your customers look up} |
|
|
153
|
-
| 2 | `glossary-index` (columns) | `GlossaryIndex` | {Terms, A to Z} |
|
|
154
|
-
|
|
155
|
-
<!-- generated:end -->
|
|
156
|
-
|
|
157
|
-
<!-- generated:begin page=/newsletter -->
|
|
158
|
-
|
|
159
|
-
| # | Section | Component | Copy (first line) |
|
|
160
|
-
| --- | ------------------------------------- | ------------ | ------------------------------------------------ |
|
|
161
|
-
| 1 | `hero` (eyebrow "Newsletter" · 1 CTA) | `Hero` | {Newsletter: what subscribers get and how often} |
|
|
162
|
-
| 2 | `newsletter` | `Newsletter` | Subscribe |
|
|
163
|
-
| 3 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
|
|
164
|
-
|
|
165
|
-
<!-- generated:end -->
|
|
166
|
-
|
|
167
|
-
`/book-a-call` (this template's own override of the base seed — the call to action opens the `/meet` booker the scheduling module supplies, not `/contact`):
|
|
168
|
-
|
|
169
|
-
<!-- generated:begin page=/book-a-call -->
|
|
170
|
-
|
|
171
|
-
| # | Section | Component | Copy (first line) |
|
|
172
|
-
| --- | -------------------------------------- | --------- | ------------------------------------------ |
|
|
173
|
-
| 1 | `hero` (eyebrow "Book a call" · 1 CTA) | `Hero` | {Book a call: what a visitor gets from it} |
|
|
174
|
-
| 2 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
|
|
175
|
-
|
|
176
|
-
<!-- generated:end -->
|
|
177
|
-
|
|
178
|
-
`/purchase-policy`:
|
|
179
|
-
|
|
180
|
-
<!-- generated:begin page=/purchase-policy -->
|
|
181
|
-
|
|
182
|
-
| # | Section | Component | Copy (first line) |
|
|
183
|
-
| --- | ----------------------------------- | ----------------- | ----------------- |
|
|
184
|
-
| 1 | `document-chassis` (layout=article) | `DocumentChassis` | Purchase Policy |
|
|
185
|
-
|
|
186
|
-
<!-- generated:end -->
|
|
187
|
-
|
|
188
|
-
`/privacy`:
|
|
189
|
-
|
|
190
|
-
<!-- generated:begin page=/privacy -->
|
|
191
|
-
|
|
192
|
-
| # | Section | Component | Copy (first line) |
|
|
193
|
-
| --- | ----------------------------------- | ----------------- | ----------------- |
|
|
194
|
-
| 1 | `document-chassis` (layout=article) | `DocumentChassis` | Privacy Policy |
|
|
195
|
-
|
|
196
|
-
<!-- generated:end -->
|
|
197
|
-
|
|
198
|
-
`/terms`:
|
|
199
|
-
|
|
200
|
-
<!-- generated:begin page=/terms -->
|
|
201
|
-
|
|
202
|
-
| # | Section | Component | Copy (first line) |
|
|
203
|
-
| --- | ----------------------------------- | ----------------- | ----------------- |
|
|
204
|
-
| 1 | `document-chassis` (layout=article) | `DocumentChassis` | Terms of Service |
|
|
205
|
-
|
|
206
|
-
<!-- generated:end -->
|
|
207
|
-
|
|
208
|
-
`/account`:
|
|
209
|
-
|
|
210
|
-
<!-- generated:begin page=/account -->
|
|
211
|
-
|
|
212
|
-
_Code route — no content, no sections._
|
|
213
|
-
<!-- generated:end -->
|
|
214
|
-
|
|
215
|
-
`/purchase/success`:
|
|
216
|
-
|
|
217
|
-
<!-- generated:begin page=/purchase/success -->
|
|
218
|
-
|
|
219
|
-
_Code route — no content, no sections._
|
|
220
|
-
<!-- generated:end -->
|
|
221
|
-
|
|
222
|
-
`/purchase/cancel`:
|
|
223
|
-
|
|
224
|
-
<!-- generated:begin page=/purchase/cancel -->
|
|
225
|
-
|
|
226
|
-
_Code route — no content, no sections._
|
|
227
|
-
<!-- generated:end -->
|
|
228
|
-
|
|
229
|
-
`/thanks/[slug]`:
|
|
230
|
-
|
|
231
|
-
<!-- generated:begin page=/thanks/[slug] -->
|
|
232
|
-
|
|
233
|
-
_Code route — no content, no sections._
|
|
234
|
-
<!-- generated:end -->
|
|
235
|
-
|
|
236
|
-
`/meet`:
|
|
237
|
-
|
|
238
|
-
<!-- generated:begin page=/meet -->
|
|
239
|
-
|
|
240
|
-
_Code route — no content, no sections._
|
|
241
|
-
<!-- generated:end -->
|
|
242
|
-
|
|
243
|
-
`/meet/[slug]`:
|
|
244
|
-
|
|
245
|
-
<!-- generated:begin page=/meet/[slug] -->
|
|
246
|
-
|
|
247
|
-
_Code route — no content, no sections._
|
|
248
|
-
<!-- generated:end -->
|
|
249
|
-
|
|
250
|
-
`/meet/confirmed`:
|
|
251
|
-
|
|
252
|
-
<!-- generated:begin page=/meet/confirmed -->
|
|
253
|
-
|
|
254
|
-
_Code route — no content, no sections._
|
|
255
|
-
<!-- generated:end -->
|
|
256
|
-
|
|
257
|
-
`/appointments`:
|
|
258
|
-
|
|
259
|
-
<!-- generated:begin page=/appointments -->
|
|
260
|
-
|
|
261
|
-
_Code route — no content, no sections._
|
|
262
|
-
<!-- generated:end -->
|
|
263
|
-
|
|
264
|
-
## 4. Roster, as the registry declares it
|
|
265
|
-
|
|
266
|
-
`simple-service` is the second declared template that does not reuse `TEMPLATE_BASE_ROSTER`: a lawn-care site sells three named services from `/services`, not from a pricing table, so `/how-it-works`, the product page (`/software/product`) and `/pricing` are not pages this site has. The roster is what the template IS, so an unrostered page has neither a route directory nor its seed: `scaffold()` installs a `_base` or overlay seed only for a row that names it (#6646), so `content/en/Pricing/pricing.mdx` does not land. The merged roster, as the registry composes it:
|
|
267
|
-
|
|
268
|
-
<!-- generated:begin roster -->
|
|
269
|
-
|
|
270
|
-
```
|
|
271
|
-
simple-service:
|
|
272
|
-
requires: [marketing, scheduling, commerce]
|
|
273
|
-
categories: [landscaping]
|
|
274
|
-
shape: local-business-service
|
|
275
|
-
design: standard
|
|
276
|
-
roster:
|
|
277
|
-
- { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
|
|
278
|
-
- { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
|
|
279
|
-
- { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
|
|
280
|
-
- { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
|
|
281
|
-
- { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
|
|
282
|
-
- { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
|
|
283
|
-
- { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
|
|
284
|
-
- { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
|
|
285
|
-
- { route: "/book-a-call", kind: page, content: ["content/en/BookCall/book-call.mdx"] }
|
|
286
|
-
- { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
|
|
287
|
-
- { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
|
|
288
|
-
- { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
|
|
289
|
-
- { route: "/account", kind: route }
|
|
290
|
-
- { route: "/purchase/success", kind: route }
|
|
291
|
-
- { route: "/purchase/cancel", kind: route }
|
|
292
|
-
- { route: "/thanks/[slug]", kind: route }
|
|
293
|
-
- { route: "/meet", kind: route }
|
|
294
|
-
- { route: "/meet/[slug]", kind: route }
|
|
295
|
-
- { route: "/meet/confirmed", kind: route }
|
|
296
|
-
- { route: "/appointments", kind: route }
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
<!-- generated:end -->
|
|
300
|
-
|
|
301
|
-
By source:
|
|
302
|
-
|
|
303
|
-
```
|
|
304
|
-
template: / · /services · /services/<slug> · /about · /contact · /faq
|
|
305
|
-
/purchase-policy · /privacy · /terms · /account
|
|
306
|
-
/purchase/success · /purchase/cancel · /thanks/<slug>
|
|
307
|
-
scheduling: /meet · /meet/<slug> · /meet/confirmed · /appointments
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
**Why the two `/purchase/*` rows are the TEMPLATE's and not the `commerce` module's.** #6084 landed the checkout return pair under the operator's shape-2 disposition (#6084 D12): `CORE_ROUTE_DIRS` carries `[locale]/purchase`, and neither `GATEABLE_SURFACES` nor `MODULE_SURFACES.commerce` gained an entry, so `MODULE_SLICES.commerce` contributes **no** `pageContributions` at all. Nothing else claims the two routes, so declaring them here trips no both-claimants refusal — and the issue's AC-1 requires the merged roster to carry them. The four scheduling rows, by contrast, **are** the module's, and declaring one here would make `mergeRoster` refuse this template outright.
|
|
311
|
-
|
|
312
|
-
`/account` and `/purchase-policy` carry no `GATEABLE_SURFACES` entry and need none: `(authed)` ships unconditionally, and `/purchase-policy` has no gateable surface at all, so it is always copied. The six module-less surfaces this roster enables are `book-a-call`, `glossary`, `newsletter`, `privacy`, `services` and `terms`.
|
|
313
|
-
|
|
314
|
-
## 5. Component inventory
|
|
315
|
-
|
|
316
|
-
Every component the roster rows' seed content composes today (generated):
|
|
317
|
-
|
|
318
|
-
<!-- generated:begin inventory -->
|
|
319
|
-
|
|
320
|
-
| Tier | Used by this template |
|
|
321
|
-
| -------- | ----------------------------------------------------------------------------------------------- |
|
|
322
|
-
| Shell | `MarketingShell` |
|
|
323
|
-
| Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
|
|
324
|
-
| Sections | `ContentBlock`, `CTA`, `DocumentChassis`, `FAQ`, `GlossaryIndex`, `Hero`, `Items`, `Newsletter` |
|
|
325
|
-
|
|
326
|
-
<!-- generated:end -->
|
|
327
|
-
|
|
328
|
-
## 6. Known gaps this manifest depends on
|
|
329
|
-
|
|
330
|
-
| Gap | Issue |
|
|
331
|
-
| -------------------------------------------------------------------------------------------- | ----- |
|
|
332
|
-
| No routes-map row for `/account`, `/appointments` or `/purchase/*`, so those rows show blank | #5572 |
|
|
333
|
-
| The Pro demo host `simple-service.ailaunchkit.ai` — provisioning is the runbook's act | #5778 |
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "simple-service",
|
|
3
|
-
"requires": ["marketing", "scheduling", "commerce"],
|
|
4
|
-
"extends": "_base",
|
|
5
|
-
"$comment": "The T1 lawn-care template (#6087, Epic #5778) — the first site shape that composes scheduling and commerce. Composed base -> modules -> template: /privacy and /terms arrive with the _base layer this extends (its unrostered /pricing seed does not install, #6646), and /purchase-policy is this tree's own service-shape override of the overlay's product-shape seed (#6646 — cancellation and refunds sections); /meet, /meet/<slug>, /meet/confirmed and /appointments with the scheduling bundle; /purchase/success and /purchase/cancel are BASE TREE (#6084 D12 shape 2 — CORE_ROUTE_DIRS carries [locale]/purchase and the commerce licence claim, not the scaffold, decides whether they serve); the Free about/contact/faq compositions with the overlay, which this template's own /about, /contact and /faq files then override; the overlay's other seeds (/use-cases, the /software/product page, the /blog teaser) are unrostered here and do not install (#6646). This tree holds ONLY its own compositions and its placeholder copy. It declares no layout block — the default marketing-site chrome is what this template renders with, and the code registry (TEMPLATE_MANIFESTS) is authoritative for a template create-ailk ships, so a duplicate block here would be a second authority for one fact. installMap: bundle-relative source -> scaffold-relative destination; the stager reads only installMap/postInstall/patches. Unmapped content/en/** lands at the scaffold root's content/, exactly as marketing-site-free's does.",
|
|
6
|
-
"installMap": {
|
|
7
|
-
"provenance.json": ".ailk-template.json",
|
|
8
|
-
"TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
|
|
9
|
-
},
|
|
10
|
-
"postInstall": "Template simple-service installed. This is the lawn-care shape: three priced services at /services (content/en/Service/), a booker at /meet from the scheduling module, the site owner's own list at /appointments, and the checkout return pair at /purchase/success and /purchase/cancel. /privacy, /terms, /glossary and /newsletter came with the base layer, and /book-a-call is this template's own override of the base seed, its call to action opening the /meet booker. This template adds the home page, /services and its three detail pages, /about, /contact, /faq and /purchase-policy (cancellation and refunds). THE THREE PRICES ARE PLACEHOLDERS AND THEY ARE PUBLISHED: each service page's top-level price and priceCurrency become a schema.org Offer in that page's JSON-LD, which is what an agent reading your site quotes back to a buyer — replace all three, and the provider name with them, before you launch. Taking money needs the commerce licence claim and your own Stripe account: without the claim the return pages 404 by design. EVERY line of copy on this site is a placeholder too — replace it before you launch."
|
|
11
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "BookCall"
|
|
3
|
-
slug: "book-call"
|
|
4
|
-
title: "{Book a call: what a visitor gets from it}"
|
|
5
|
-
description: "{One sentence on who the call is for and what they leave with}"
|
|
6
|
-
placeholder: true
|
|
7
|
-
schema:
|
|
8
|
-
mainEntity:
|
|
9
|
-
"@type": "Offer"
|
|
10
|
-
name: "{Your call name}"
|
|
11
|
-
price: 0
|
|
12
|
-
priceCurrency: "USD"
|
|
13
|
-
sections:
|
|
14
|
-
[
|
|
15
|
-
{
|
|
16
|
-
"id": "hero",
|
|
17
|
-
"type": "hero",
|
|
18
|
-
"data":
|
|
19
|
-
{
|
|
20
|
-
"eyebrow": "Book a call",
|
|
21
|
-
"headline": "{Book a call: what a visitor gets from it}",
|
|
22
|
-
"subheadline": "{One sentence on who the call is for and what they leave with}",
|
|
23
|
-
"primaryCta": { "label": "Book a time", "href": "/meet" },
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "what-happens-on-the-call",
|
|
28
|
-
"type": "items",
|
|
29
|
-
"data":
|
|
30
|
-
{
|
|
31
|
-
"headline": "What happens on the call?",
|
|
32
|
-
"columns": 3,
|
|
33
|
-
"items":
|
|
34
|
-
[
|
|
35
|
-
{
|
|
36
|
-
"title": "{The first thing you cover}",
|
|
37
|
-
"description": "{One or two sentences on what the visitor learns or decides here}",
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"title": "{The second thing you cover}",
|
|
41
|
-
"description": "{One or two sentences on what the visitor learns or decides here}",
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"title": "{The next step you agree}",
|
|
45
|
-
"description": "{One or two sentences on what happens after the call}",
|
|
46
|
-
},
|
|
47
|
-
],
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
]
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
{/* Rendered from frontmatter `sections[]` by the /book-a-call route. This template carries the scheduling module, so the call to action opens the /meet booker. It overrides the base layer's copy, which points at /contact. The `schema:` Offer is the page's JSON-LD main entity — a free call. Placeholder copy — replace every {brace} with your own words before you launch. */}
|