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
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"signOut": "Sign out",
|
|
12
12
|
"account": "Account",
|
|
13
13
|
"product": "Product",
|
|
14
|
+
"services": "Services",
|
|
14
15
|
"howItWorks": "How it works",
|
|
15
16
|
"howItWorksDesc": "'{One line on how your product works}'",
|
|
16
17
|
"features": "Features",
|
|
@@ -18,6 +19,7 @@
|
|
|
18
19
|
"faq": "FAQ",
|
|
19
20
|
"faqDesc": "'{One line on the questions you answer}'",
|
|
20
21
|
"pricing": "Pricing",
|
|
22
|
+
"portfolio": "Portfolio",
|
|
21
23
|
"about": "About",
|
|
22
24
|
"contact": "Contact",
|
|
23
25
|
"bookACall": "Book a call",
|
|
@@ -38,7 +40,18 @@
|
|
|
38
40
|
"useCases": "Use cases",
|
|
39
41
|
"signUp": "Sign up",
|
|
40
42
|
"skipToContent": "Skip to content",
|
|
41
|
-
"useCasesDesc": "'{One line on how your product works}'"
|
|
43
|
+
"useCasesDesc": "'{One line on how your product works}'",
|
|
44
|
+
"flyoutFeaturesHeading": "Features",
|
|
45
|
+
"flyoutServicesHeading": "Services",
|
|
46
|
+
"flyoutCustomersHeading": "Customers",
|
|
47
|
+
"footerCustomersHeading": "Customers",
|
|
48
|
+
"allCustomers": "All customers",
|
|
49
|
+
"customer1": "'{Customer 1}'",
|
|
50
|
+
"customer2": "'{Customer 2}'",
|
|
51
|
+
"customer3": "'{Customer 3}'",
|
|
52
|
+
"service1": "'{Service 1}'",
|
|
53
|
+
"service2": "'{Service 2}'",
|
|
54
|
+
"service3": "'{Service 3}'"
|
|
42
55
|
},
|
|
43
56
|
"consent": {
|
|
44
57
|
"title": "Cookie Preferences",
|
|
@@ -47,7 +60,7 @@
|
|
|
47
60
|
"rejectLabel": "Reject",
|
|
48
61
|
"policyLinkLabel": "Privacy policy",
|
|
49
62
|
"dismissLabel": "Close",
|
|
50
|
-
"settingsLabel": "Cookie
|
|
63
|
+
"settingsLabel": "Cookie Settings"
|
|
51
64
|
},
|
|
52
65
|
"common": {
|
|
53
66
|
"siteTitle": "My Site",
|
|
@@ -79,6 +92,10 @@
|
|
|
79
92
|
"heading": "Case Studies",
|
|
80
93
|
"emptyState": "Case studies listing coming soon."
|
|
81
94
|
},
|
|
95
|
+
"portfolio": {
|
|
96
|
+
"heading": "Portfolio",
|
|
97
|
+
"emptyState": "Portfolio coming soon."
|
|
98
|
+
},
|
|
82
99
|
"courses": {
|
|
83
100
|
"heading": "Courses",
|
|
84
101
|
"emptyState": "Courses listing coming soon."
|
|
@@ -97,6 +114,10 @@
|
|
|
97
114
|
"sendMessage": "Send message",
|
|
98
115
|
"successMessage": "Thank you for reaching out! We will be in touch shortly.",
|
|
99
116
|
"consentStatement": "I accept the [Terms](terms).",
|
|
117
|
+
"genericError": "Something went wrong, please try again.",
|
|
118
|
+
"unavailableHeading": "Get in touch",
|
|
119
|
+
"unavailableBody": "Email us at {email} and we'll reply.",
|
|
120
|
+
"unavailableNoEmail": "Contact details for this site haven't been published yet.",
|
|
100
121
|
"intake": {
|
|
101
122
|
"guidedBadge": "Guided",
|
|
102
123
|
"skip": "Skip",
|
|
@@ -310,9 +331,17 @@
|
|
|
310
331
|
"heading": "Testimonials",
|
|
311
332
|
"emptyState": "Testimonials coming soon."
|
|
312
333
|
},
|
|
313
|
-
"
|
|
314
|
-
"heading": "
|
|
315
|
-
"emptyState": "
|
|
334
|
+
"for": {
|
|
335
|
+
"heading": "Customers",
|
|
336
|
+
"emptyState": "Customer pages coming soon."
|
|
337
|
+
},
|
|
338
|
+
"alternatives": {
|
|
339
|
+
"heading": "Alternatives",
|
|
340
|
+
"emptyState": "Comparisons coming soon."
|
|
341
|
+
},
|
|
342
|
+
"reports": {
|
|
343
|
+
"heading": "Reports",
|
|
344
|
+
"emptyState": "Reports coming soon."
|
|
316
345
|
},
|
|
317
346
|
"waitlistDashboard": {
|
|
318
347
|
"gate": {
|
|
@@ -682,5 +711,16 @@
|
|
|
682
711
|
"emptyHeadline": "No upcoming bookings",
|
|
683
712
|
"emptyDescription": "When someone books a time with you, the appointment appears here automatically."
|
|
684
713
|
}
|
|
714
|
+
},
|
|
715
|
+
"features": {
|
|
716
|
+
"heading": "Features",
|
|
717
|
+
"emptyState": "Features coming soon."
|
|
718
|
+
},
|
|
719
|
+
"newsletter": {
|
|
720
|
+
"emailLabel": "Email",
|
|
721
|
+
"submit": "Subscribe",
|
|
722
|
+
"sending": "Subscribing…",
|
|
723
|
+
"success": "You're subscribed. Thanks for signing up!",
|
|
724
|
+
"consentStatement": "I accept the [Terms](terms)."
|
|
685
725
|
}
|
|
686
726
|
}
|
|
@@ -12,11 +12,17 @@
|
|
|
12
12
|
// Locale list: read once at module load from project.yaml via readLocales() (S1).
|
|
13
13
|
// Static assets and internal Next.js paths are excluded via the matcher below.
|
|
14
14
|
//
|
|
15
|
+
// /api/* and /og are route handlers outside app/[locale] (#6864). They skip
|
|
16
|
+
// next-intl — whose as-needed rewrite would send them to /en/api/… and /en/og,
|
|
17
|
+
// which do not exist — but still get the security headers. They are exempted
|
|
18
|
+
// here rather than in the matcher, because this middleware is the only place
|
|
19
|
+
// the security headers are stamped.
|
|
20
|
+
//
|
|
15
21
|
// S16 spec: docs/internal/specs/ailk-pre-oss-security-phase-3-s16-security-headers-spec.md
|
|
16
22
|
// S2 spec: docs/internal/specs/i18n-phase1-s2-next-intl-foundation-spec.md
|
|
17
23
|
// P2 S1 spec: docs/internal/specs/i18n-phase2-s1-hreflang-metadata-spec.md §3
|
|
18
24
|
|
|
19
|
-
import { NextRequest,
|
|
25
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
20
26
|
import createMiddleware from "next-intl/middleware";
|
|
21
27
|
|
|
22
28
|
import {
|
|
@@ -30,9 +36,9 @@ import {
|
|
|
30
36
|
// importing lib/locales — which uses node:fs and process.cwd() — into the
|
|
31
37
|
// Edge runtime that runs middleware.
|
|
32
38
|
// Falls back to ["en"] in test environments where the env var is unset.
|
|
33
|
-
const enabledLocales = (
|
|
34
|
-
|
|
35
|
-
)
|
|
39
|
+
const enabledLocales = (process.env.NEXT_PUBLIC_ENABLED_LOCALES ?? "en").split(
|
|
40
|
+
",",
|
|
41
|
+
);
|
|
36
42
|
const DEFAULT_LOCALE = "en";
|
|
37
43
|
|
|
38
44
|
// next-intl middleware instance — locale detection priority chain:
|
|
@@ -49,6 +55,17 @@ const intlMiddleware = createMiddleware({
|
|
|
49
55
|
localePrefix: "as-needed",
|
|
50
56
|
});
|
|
51
57
|
|
|
58
|
+
// Top-level app/ route directories that live outside [locale]. Kept in step
|
|
59
|
+
// with app/ by the drift test in __tests__/i18n/middleware.test.ts.
|
|
60
|
+
export const NON_LOCALE_ROUTE_PREFIXES = ["/api", "/og"] as const;
|
|
61
|
+
|
|
62
|
+
// Segment-bound: /og and /og/x are exempt; /ogden and /og-image are not.
|
|
63
|
+
export function isNonLocaleRoute(pathname: string): boolean {
|
|
64
|
+
return NON_LOCALE_ROUTE_PREFIXES.some(
|
|
65
|
+
(prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`),
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
52
69
|
export function middleware(request: NextRequest): NextResponse {
|
|
53
70
|
// Step 1: Forward x-pathname to server components so generateMetadata can
|
|
54
71
|
// build path-aware hreflang alternates (P2 S1). Clone the request headers
|
|
@@ -57,6 +74,13 @@ export function middleware(request: NextRequest): NextResponse {
|
|
|
57
74
|
const requestHeaders = new Headers(request.headers);
|
|
58
75
|
requestHeaders.set("x-pathname", request.nextUrl.pathname);
|
|
59
76
|
|
|
77
|
+
// Non-locale routes are served as requested — no rewrite, no redirect.
|
|
78
|
+
if (isNonLocaleRoute(request.nextUrl.pathname)) {
|
|
79
|
+
const res = NextResponse.next({ request: { headers: requestHeaders } });
|
|
80
|
+
applyHeaders(res.headers, DEFAULT_SECURITY_HEADERS);
|
|
81
|
+
return res;
|
|
82
|
+
}
|
|
83
|
+
|
|
60
84
|
const requestWithPathname = new NextRequest(request.url, {
|
|
61
85
|
headers: requestHeaders,
|
|
62
86
|
method: request.method,
|
|
@@ -3,6 +3,9 @@ version: "1"
|
|
|
3
3
|
siteName: "{{COMPANY_NAME}}"
|
|
4
4
|
baseUrl: https://{{COMPANY_DOMAIN}}
|
|
5
5
|
defaultLocale: en
|
|
6
|
+
# /contact shows this address instead of the form when the site cannot take
|
|
7
|
+
# messages (no database and no email key in production).
|
|
8
|
+
contactEmail: "hello@{{COMPANY_DOMAIN}}"
|
|
6
9
|
siteIdentity:
|
|
7
10
|
kind: Organization
|
|
8
11
|
name: "{{COMPANY_NAME}}"
|
|
@@ -59,8 +62,7 @@ every page's structured data carries it:
|
|
|
59
62
|
`name` and `url` (optional `description`, `applicationCategory`,
|
|
60
63
|
`operatingSystem`). The home page's main entity becomes the product,
|
|
61
64
|
published by your organization, and its feature list is read from your
|
|
62
|
-
|
|
63
|
-
`/software/product`).
|
|
65
|
+
feature pages (`content/en/Feature/*.mdx`, served at `/features/<slug>`).
|
|
64
66
|
- under a Person — the company you run: `kind: Organization` with a `name`
|
|
65
67
|
and `url` (optional `logo`, `description`, `sameAs`).
|
|
66
68
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: "BlogList"
|
|
3
3
|
slug: "blog"
|
|
4
|
-
title: "
|
|
5
|
-
description: "
|
|
4
|
+
title: "Get free blog/docs from Fumadocs"
|
|
5
|
+
description: "Or upgrade to Pro and get Fumadocs with our easy-to-use editor."
|
|
6
6
|
sections:
|
|
7
7
|
[
|
|
8
8
|
{
|
|
@@ -13,8 +13,16 @@ sections:
|
|
|
13
13
|
"variant": "centered",
|
|
14
14
|
"gapBelow": "tight",
|
|
15
15
|
"eyebrow": "Blog",
|
|
16
|
-
"headline": "
|
|
17
|
-
"subheadline": "
|
|
16
|
+
"headline": "Get free blog/docs from Fumadocs",
|
|
17
|
+
"subheadline": "Or upgrade to Pro and get Fumadocs with our easy-to-use editor.",
|
|
18
|
+
"primaryCta":
|
|
19
|
+
{ "label": "Get Fumadocs", "href": "https://www.fumadocs.dev" },
|
|
20
|
+
"secondaryCta":
|
|
21
|
+
{
|
|
22
|
+
"label": "Upgrade to Pro",
|
|
23
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
24
|
+
"variant": "outline",
|
|
25
|
+
},
|
|
18
26
|
},
|
|
19
27
|
},
|
|
20
28
|
{
|
|
@@ -26,40 +34,53 @@ sections:
|
|
|
26
34
|
"posts":
|
|
27
35
|
[
|
|
28
36
|
{
|
|
29
|
-
"title": "
|
|
37
|
+
"title": "Free Fumadocs Blog: publish your blog and docs with Fumadocs",
|
|
30
38
|
"slug": "post-1",
|
|
31
|
-
"
|
|
39
|
+
"href": "https://www.fumadocs.dev",
|
|
40
|
+
"excerpt": "The Free template ships with Fumadocs, the open-source docs and blog engine. Write in Markdown, keep this design system, and publish from your repo.",
|
|
32
41
|
"publishedAt": "2026-01-01",
|
|
33
42
|
"readingTime": "5 min",
|
|
34
43
|
},
|
|
35
44
|
{
|
|
36
|
-
"title": "
|
|
45
|
+
"title": "Upgrade to Pro: Fumadocs with our easy-to-use editor",
|
|
37
46
|
"slug": "post-2",
|
|
38
|
-
"
|
|
47
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
48
|
+
"excerpt": "Upgrade to Pro and write your posts and docs in a visual editor — no Markdown, no repo, the same Fumadocs pages. See what Pro includes.",
|
|
39
49
|
"publishedAt": "2026-01-02",
|
|
40
50
|
"readingTime": "5 min",
|
|
41
51
|
},
|
|
42
52
|
{
|
|
43
|
-
"title": "
|
|
53
|
+
"title": "Free Fumadocs Blog: publish your blog and docs with Fumadocs",
|
|
44
54
|
"slug": "post-3",
|
|
45
|
-
"
|
|
55
|
+
"href": "https://www.fumadocs.dev",
|
|
56
|
+
"excerpt": "The Free template ships with Fumadocs, the open-source docs and blog engine. Write in Markdown, keep this design system, and publish from your repo.",
|
|
46
57
|
"publishedAt": "2026-01-03",
|
|
47
|
-
"readingTime": "
|
|
58
|
+
"readingTime": "5 min",
|
|
48
59
|
},
|
|
49
60
|
{
|
|
50
|
-
"title": "
|
|
61
|
+
"title": "Upgrade to Pro: Fumadocs with our easy-to-use editor",
|
|
51
62
|
"slug": "post-4",
|
|
52
|
-
"
|
|
63
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
64
|
+
"excerpt": "Upgrade to Pro and write your posts and docs in a visual editor — no Markdown, no repo, the same Fumadocs pages. See what Pro includes.",
|
|
53
65
|
"publishedAt": "2026-01-04",
|
|
54
|
-
"readingTime": "
|
|
66
|
+
"readingTime": "5 min",
|
|
55
67
|
},
|
|
56
68
|
{
|
|
57
|
-
"title": "
|
|
69
|
+
"title": "Free Fumadocs Blog: publish your blog and docs with Fumadocs",
|
|
58
70
|
"slug": "post-5",
|
|
59
|
-
"
|
|
71
|
+
"href": "https://www.fumadocs.dev",
|
|
72
|
+
"excerpt": "The Free template ships with Fumadocs, the open-source docs and blog engine. Write in Markdown, keep this design system, and publish from your repo.",
|
|
60
73
|
"publishedAt": "2026-01-05",
|
|
61
74
|
"readingTime": "5 min",
|
|
62
75
|
},
|
|
76
|
+
{
|
|
77
|
+
"title": "Upgrade to Pro: Fumadocs with our easy-to-use editor",
|
|
78
|
+
"slug": "post-6",
|
|
79
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
80
|
+
"excerpt": "Upgrade to Pro and write your posts and docs in a visual editor — no Markdown, no repo, the same Fumadocs pages. See what Pro includes.",
|
|
81
|
+
"publishedAt": "2026-01-06",
|
|
82
|
+
"readingTime": "5 min",
|
|
83
|
+
},
|
|
63
84
|
],
|
|
64
85
|
},
|
|
65
86
|
},
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "BookCall"
|
|
3
|
+
slug: "book-a-call"
|
|
4
|
+
title: "Book a Call"
|
|
5
|
+
description: "{One sentence on who this call is for and what they leave with}"
|
|
6
|
+
schema:
|
|
7
|
+
mainEntity:
|
|
8
|
+
"@type": "Offer"
|
|
9
|
+
name: "Book a Call"
|
|
10
|
+
sections:
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "hero",
|
|
14
|
+
"type": "hero",
|
|
15
|
+
"data":
|
|
16
|
+
{
|
|
17
|
+
"eyebrow": "Book a Call",
|
|
18
|
+
"headline": "Book a Call",
|
|
19
|
+
"subheadline": "{One sentence on who this call is for and what they leave with}",
|
|
20
|
+
"primaryCta": { "label": "{Get in touch}", "href": "/contact" },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "add-scheduling",
|
|
25
|
+
"type": "cta",
|
|
26
|
+
"data":
|
|
27
|
+
{
|
|
28
|
+
"variant": "box",
|
|
29
|
+
"headline": "{What booking a call would do for your visitors}",
|
|
30
|
+
"description": "{One or two sentences on what live scheduling adds once it's on}",
|
|
31
|
+
"primaryCta":
|
|
32
|
+
{
|
|
33
|
+
"label": "Add scheduling with Pro",
|
|
34
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
35
|
+
"external": true,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "what-happens-on-the-call",
|
|
41
|
+
"type": "items",
|
|
42
|
+
"data":
|
|
43
|
+
{
|
|
44
|
+
"headline": "What happens on the call?",
|
|
45
|
+
"columns": 3,
|
|
46
|
+
"items":
|
|
47
|
+
[
|
|
48
|
+
{
|
|
49
|
+
"title": "{The first thing you cover}",
|
|
50
|
+
"description": "{One or two sentences on what the visitor learns or decides here}",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"title": "{The second thing you cover}",
|
|
54
|
+
"description": "{One or two sentences on what the visitor learns or decides here}",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"title": "{The next step you agree}",
|
|
58
|
+
"description": "{One or two sentences on what happens after the call}",
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "back-to-meet",
|
|
65
|
+
"type": "content-block",
|
|
66
|
+
"data":
|
|
67
|
+
{
|
|
68
|
+
"body": "{Looking for a different kind of meeting?}",
|
|
69
|
+
"cta":
|
|
70
|
+
{
|
|
71
|
+
"label": "← All meeting types",
|
|
72
|
+
"href": "/meet",
|
|
73
|
+
"variant": "link",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
]
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
{/* Rendered from frontmatter `sections[]` by the /meet/[slug] placeholder route. A template that carries the scheduling module overrides this file with the live booker. The "What happens on the call?" section moved here verbatim from the retired /book-a-call page (#6897 D10). Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "BookCall"
|
|
3
|
+
slug: "onsite-estimate"
|
|
4
|
+
title: "Onsite Estimate"
|
|
5
|
+
description: "{One sentence on who this visit is for and what they leave with}"
|
|
6
|
+
schema:
|
|
7
|
+
mainEntity:
|
|
8
|
+
"@type": "Offer"
|
|
9
|
+
name: "Onsite Estimate"
|
|
10
|
+
sections:
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "hero",
|
|
14
|
+
"type": "hero",
|
|
15
|
+
"data":
|
|
16
|
+
{
|
|
17
|
+
"eyebrow": "Onsite Estimate",
|
|
18
|
+
"headline": "Onsite Estimate",
|
|
19
|
+
"subheadline": "{One sentence on who this visit is for and what they leave with}",
|
|
20
|
+
"primaryCta": { "label": "{Get in touch}", "href": "/contact" },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "add-scheduling",
|
|
25
|
+
"type": "cta",
|
|
26
|
+
"data":
|
|
27
|
+
{
|
|
28
|
+
"variant": "box",
|
|
29
|
+
"headline": "{What booking an onsite estimate would do for your visitors}",
|
|
30
|
+
"description": "{One or two sentences on what live scheduling adds once it's on}",
|
|
31
|
+
"primaryCta":
|
|
32
|
+
{
|
|
33
|
+
"label": "Add scheduling with Pro",
|
|
34
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
35
|
+
"external": true,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "back-to-meet",
|
|
41
|
+
"type": "content-block",
|
|
42
|
+
"data":
|
|
43
|
+
{
|
|
44
|
+
"body": "{Looking for a different kind of meeting?}",
|
|
45
|
+
"cta":
|
|
46
|
+
{
|
|
47
|
+
"label": "← All meeting types",
|
|
48
|
+
"href": "/meet",
|
|
49
|
+
"variant": "link",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
]
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
{/* Rendered from frontmatter `sections[]` by the /meet/[slug] placeholder route. A template that carries the scheduling module overrides this file with the live booker. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "BookCall"
|
|
3
|
+
slug: "onsite-service"
|
|
4
|
+
title: "Onsite Service"
|
|
5
|
+
description: "{One sentence on who this visit is for and what they leave with}"
|
|
6
|
+
schema:
|
|
7
|
+
mainEntity:
|
|
8
|
+
"@type": "Offer"
|
|
9
|
+
name: "Onsite Service"
|
|
10
|
+
sections:
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "hero",
|
|
14
|
+
"type": "hero",
|
|
15
|
+
"data":
|
|
16
|
+
{
|
|
17
|
+
"eyebrow": "Onsite Service",
|
|
18
|
+
"headline": "Onsite Service",
|
|
19
|
+
"subheadline": "{One sentence on who this visit is for and what they leave with}",
|
|
20
|
+
"primaryCta": { "label": "{Get in touch}", "href": "/contact" },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "add-scheduling",
|
|
25
|
+
"type": "cta",
|
|
26
|
+
"data":
|
|
27
|
+
{
|
|
28
|
+
"variant": "box",
|
|
29
|
+
"headline": "{What booking an onsite service call would do for your visitors}",
|
|
30
|
+
"description": "{One or two sentences on what live scheduling adds once it's on}",
|
|
31
|
+
"primaryCta":
|
|
32
|
+
{
|
|
33
|
+
"label": "Add scheduling with Pro",
|
|
34
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
35
|
+
"external": true,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "back-to-meet",
|
|
41
|
+
"type": "content-block",
|
|
42
|
+
"data":
|
|
43
|
+
{
|
|
44
|
+
"body": "{Looking for a different kind of meeting?}",
|
|
45
|
+
"cta":
|
|
46
|
+
{
|
|
47
|
+
"label": "← All meeting types",
|
|
48
|
+
"href": "/meet",
|
|
49
|
+
"variant": "link",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
]
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
{/* Rendered from frontmatter `sections[]` by the /meet/[slug] placeholder route. A template that carries the scheduling module overrides this file with the live booker. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "BookCall"
|
|
3
|
+
slug: "start-project"
|
|
4
|
+
title: "Start Project"
|
|
5
|
+
description: "{One sentence on who this kickoff is for and what they leave with}"
|
|
6
|
+
schema:
|
|
7
|
+
mainEntity:
|
|
8
|
+
"@type": "Offer"
|
|
9
|
+
name: "Start Project"
|
|
10
|
+
sections:
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "hero",
|
|
14
|
+
"type": "hero",
|
|
15
|
+
"data":
|
|
16
|
+
{
|
|
17
|
+
"eyebrow": "Start Project",
|
|
18
|
+
"headline": "Start Project",
|
|
19
|
+
"subheadline": "{One sentence on who this kickoff is for and what they leave with}",
|
|
20
|
+
"primaryCta": { "label": "{Get in touch}", "href": "/contact" },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "add-scheduling",
|
|
25
|
+
"type": "cta",
|
|
26
|
+
"data":
|
|
27
|
+
{
|
|
28
|
+
"variant": "box",
|
|
29
|
+
"headline": "{What booking a project kickoff would do for your visitors}",
|
|
30
|
+
"description": "{One or two sentences on what live scheduling adds once it's on}",
|
|
31
|
+
"primaryCta":
|
|
32
|
+
{
|
|
33
|
+
"label": "Add scheduling with Pro",
|
|
34
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
35
|
+
"external": true,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "back-to-meet",
|
|
41
|
+
"type": "content-block",
|
|
42
|
+
"data":
|
|
43
|
+
{
|
|
44
|
+
"body": "{Looking for a different kind of meeting?}",
|
|
45
|
+
"cta":
|
|
46
|
+
{
|
|
47
|
+
"label": "← All meeting types",
|
|
48
|
+
"href": "/meet",
|
|
49
|
+
"variant": "link",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
]
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
{/* Rendered from frontmatter `sections[]` by the /meet/[slug] placeholder route. A template that carries the scheduling module overrides this file with the live booker. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
type: "ContactPage"
|
|
3
3
|
slug: "contact"
|
|
4
4
|
title: "Contact {{COMPANY_NAME}}"
|
|
5
|
-
description: "
|
|
5
|
+
description: "Or upgrade to Pro to save every message as a lead in your own marketing database."
|
|
6
6
|
sections:
|
|
7
7
|
[
|
|
8
8
|
{
|
|
@@ -11,49 +11,58 @@ sections:
|
|
|
11
11
|
"data":
|
|
12
12
|
{
|
|
13
13
|
"variant": "split",
|
|
14
|
-
"eyebrow": "
|
|
15
|
-
"headline": "
|
|
16
|
-
"subheadline": "
|
|
14
|
+
"eyebrow": "Contact",
|
|
15
|
+
"headline": "Get every message in your email, free",
|
|
16
|
+
"subheadline": "Or upgrade to Pro to save every message as a lead in your own marketing database.",
|
|
17
17
|
"checklist":
|
|
18
18
|
[
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
19
|
+
"Every message arrives in your email",
|
|
20
|
+
"No database or setup to start",
|
|
21
|
+
"Upgrade any time to keep a lead inbox",
|
|
22
22
|
],
|
|
23
|
+
"secondaryCta":
|
|
24
|
+
{
|
|
25
|
+
"label": "Save my leads",
|
|
26
|
+
"href": "https://ailaunchkit.ai/pricing",
|
|
27
|
+
"variant": "outline",
|
|
28
|
+
},
|
|
23
29
|
},
|
|
24
30
|
},
|
|
25
31
|
{
|
|
26
|
-
"id": "
|
|
27
|
-
"type": "
|
|
32
|
+
"id": "meeting-types",
|
|
33
|
+
"type": "items",
|
|
28
34
|
"data":
|
|
29
35
|
{
|
|
30
|
-
"headline": "
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
[
|
|
34
|
-
{ "name": "Placeholder logo", "src": "/logomark.svg" },
|
|
35
|
-
{ "name": "Placeholder logo", "src": "/logomark.svg" },
|
|
36
|
-
{ "name": "Placeholder logo", "src": "/logomark.svg" },
|
|
37
|
-
{ "name": "Placeholder logo", "src": "/logomark.svg" },
|
|
38
|
-
{ "name": "Placeholder logo", "src": "/logomark.svg" },
|
|
39
|
-
{ "name": "Placeholder logo", "src": "/logomark.svg" },
|
|
40
|
-
],
|
|
41
|
-
"layout": "inline",
|
|
42
|
-
"treatment": "monochrome",
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"id": "testimonial",
|
|
47
|
-
"type": "testimonials",
|
|
48
|
-
"data":
|
|
49
|
-
{
|
|
50
|
-
"variant": "quote",
|
|
36
|
+
"headline": "{Add appointment scheduling to your site}",
|
|
37
|
+
"variant": "tiles",
|
|
38
|
+
"columns": 2,
|
|
51
39
|
"items":
|
|
52
40
|
[
|
|
53
41
|
{
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
42
|
+
"title": "Book a Call",
|
|
43
|
+
"description": "{A quick intro call.}",
|
|
44
|
+
"link": { "label": "Book a Call", "href": "/meet/book-a-call" },
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"title": "Onsite Estimate",
|
|
48
|
+
"description": "{We come to you and quote the work.}",
|
|
49
|
+
"link":
|
|
50
|
+
{
|
|
51
|
+
"label": "Onsite Estimate",
|
|
52
|
+
"href": "/meet/onsite-estimate",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"title": "Start Project",
|
|
57
|
+
"description": "{Kick off a project you're ready to start.}",
|
|
58
|
+
"link":
|
|
59
|
+
{ "label": "Start Project", "href": "/meet/start-project" },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"title": "Onsite Service",
|
|
63
|
+
"description": "{Book a service visit at your location.}",
|
|
64
|
+
"link":
|
|
65
|
+
{ "label": "Onsite Service", "href": "/meet/onsite-service" },
|
|
57
66
|
},
|
|
58
67
|
],
|
|
59
68
|
},
|
|
@@ -61,4 +70,4 @@ sections:
|
|
|
61
70
|
]
|
|
62
71
|
---
|
|
63
72
|
|
|
64
|
-
{/* Rendered from frontmatter `sections[]`. The page's one contact surface — the
|
|
73
|
+
{/* Rendered from frontmatter `sections[]`. The page's one contact surface — the plain contact form — is mounted by the /contact route itself, in the split hero's right column, and posts to the site's own API (`/v1/leads/submit`). Placeholder copy — replace before you launch. */}
|