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.
Files changed (310) hide show
  1. package/README.md +112 -10
  2. package/component-catalog.json +798 -49
  3. package/component-catalog.md +9 -6
  4. package/dist/add-module.d.ts +20 -0
  5. package/dist/add-module.js +43 -7
  6. package/dist/add-route.d.ts +56 -0
  7. package/dist/add-route.js +286 -0
  8. package/dist/apply-design-md.d.ts +7 -0
  9. package/dist/apply-design-md.js +50 -0
  10. package/dist/apply-design.d.ts +64 -0
  11. package/dist/apply-design.js +273 -0
  12. package/dist/claude-md.d.ts +111 -0
  13. package/dist/claude-md.js +334 -0
  14. package/dist/cli.js +114 -28
  15. package/dist/derive-architecture.js +41 -36
  16. package/dist/design-compile.d.ts +71 -0
  17. package/dist/design-compile.js +98 -0
  18. package/dist/design-package.d.ts +83 -0
  19. package/dist/design-package.js +468 -0
  20. package/dist/design-presets.d.ts +86 -0
  21. package/dist/design-presets.js +642 -0
  22. package/dist/design-scaffold.d.ts +76 -0
  23. package/dist/design-scaffold.js +220 -0
  24. package/dist/index.d.ts +2 -1
  25. package/dist/index.js +4 -1
  26. package/dist/legacy-nav-renderers.d.ts +45 -0
  27. package/dist/legacy-nav-renderers.js +545 -0
  28. package/dist/lib/auth-secret-file.d.ts +19 -0
  29. package/dist/lib/auth-secret-file.js +112 -0
  30. package/dist/lib/design-checks.d.ts +78 -0
  31. package/dist/lib/design-checks.js +174 -0
  32. package/dist/lib/extract-module-bundle.js +5 -1
  33. package/dist/lib/license-key-files.d.ts +9 -0
  34. package/dist/lib/license-key-files.js +2 -2
  35. package/dist/lib/module-license-gate.d.ts +89 -0
  36. package/dist/lib/module-license-gate.js +171 -12
  37. package/dist/lib/module-tier.d.ts +45 -16
  38. package/dist/lib/module-tier.js +76 -0
  39. package/dist/lib/pro-callout.js +10 -2
  40. package/dist/lib/render-verdict.d.ts +52 -0
  41. package/dist/lib/render-verdict.js +77 -0
  42. package/dist/lib/scaffold-render-sweep.d.ts +105 -0
  43. package/dist/lib/scaffold-render-sweep.js +236 -0
  44. package/dist/module-architecture.d.ts +19 -16
  45. package/dist/module-architecture.js +64 -21
  46. package/dist/parse-args.d.ts +88 -10
  47. package/dist/parse-args.js +272 -21
  48. package/dist/programmatic.d.ts +66 -12
  49. package/dist/programmatic.js +361 -34
  50. package/dist/site-chrome.d.ts +19 -9
  51. package/dist/site-chrome.js +23 -13
  52. package/dist/site-manifest.d.ts +25 -0
  53. package/dist/site-manifest.js +254 -0
  54. package/dist/site-roster.d.ts +41 -0
  55. package/dist/site-roster.js +149 -11
  56. package/dist/starter-grid.d.ts +232 -0
  57. package/dist/starter-grid.js +545 -0
  58. package/dist/surfaces.d.ts +41 -9
  59. package/dist/surfaces.js +268 -92
  60. package/dist/template-manifest.d.ts +65 -29
  61. package/dist/template-manifest.js +161 -382
  62. package/dist/template-names.d.ts +14 -12
  63. package/dist/template-names.js +13 -17
  64. package/package.json +5 -4
  65. package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
  66. package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
  67. package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
  68. package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
  69. package/site-templates/_base/content/en/GlossaryList/glossary.mdx +0 -1
  70. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +0 -1
  71. package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
  72. package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
  73. package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
  74. package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
  75. package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
  76. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +15 -0
  77. package/site-templates/_base/content/en/UseCase/persona-1.mdx +70 -0
  78. package/site-templates/_base/content/en/UseCase/persona-2.mdx +70 -0
  79. package/site-templates/_base/content/en/UseCase/persona-3.mdx +70 -0
  80. package/site-templates/{minimalism-site/TEMPLATE-MANIFEST.json → aliases/minimalism-site.TEMPLATE-MANIFEST.json} +72 -40
  81. package/site-templates/designs/minimalism/DESIGN.md +98 -6
  82. package/site-templates/designs/minimalism/sample/README.md +48 -0
  83. package/site-templates/designs/standard/DESIGN.md +103 -6
  84. package/site-templates/marketing-site/DESIGN.md +103 -6
  85. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +144 -47
  86. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +82 -41
  87. package/site-templates/marketing-site-free/DESIGN.md +103 -6
  88. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +150 -48
  89. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +114 -67
  90. package/site-templates/marketing-site-free/ailk-template.json +1 -1
  91. package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
  92. package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
  93. package/site-templates/saas-product/DESIGN.md +103 -6
  94. package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
  95. package/site-templates/{simple-service → shapes/local-business-service}/TEMPLATE-MANIFEST.json +210 -81
  96. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +356 -0
  97. package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
  98. package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
  99. package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
  100. package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  101. package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
  102. package/site-templates/{minimalism-site → shapes/local-business-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +7 -8
  103. package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
  104. package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
  105. package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
  106. package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
  107. package/site-templates/shapes/local-business-service/provenance.json +4 -0
  108. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +471 -0
  109. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +354 -0
  110. package/site-templates/shapes/organization-service/ailk-template.json +10 -0
  111. package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
  112. package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
  113. package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  114. package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
  115. package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  116. package/site-templates/{minimalism-site → shapes/organization-service}/content/en/ServicesList/services.mdx +3 -4
  117. package/site-templates/shapes/organization-service/provenance.json +4 -0
  118. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +478 -0
  119. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +353 -0
  120. package/site-templates/shapes/person-service/ailk-template.json +10 -0
  121. package/site-templates/shapes/person-service/content/_site.mdx +85 -0
  122. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
  123. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
  124. package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  125. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +171 -0
  126. package/site-templates/{simple-service → shapes/person-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +10 -11
  127. package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
  128. package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
  129. package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
  130. package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
  131. package/site-templates/shapes/person-service/provenance.json +4 -0
  132. package/templates/.claude/rules/architecture.md +7 -0
  133. package/templates/.claude/skills/README.md +5 -3
  134. package/templates/.claude/skills/add-auth/references/env-vars.md +22 -15
  135. package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +3 -2
  136. package/templates/.claude/skills/add-page/SKILL.md +241 -238
  137. package/templates/.claude/skills/add-page/references/page-types.md +85 -72
  138. package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
  139. package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
  140. package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
  141. package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
  142. package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
  143. package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
  144. package/templates/.claude/skills/check-site/SKILL.md +23 -0
  145. package/templates/.claude/skills/fill-page/SKILL.md +26 -7
  146. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
  147. package/templates/.claude/skills/setup-database/SKILL.md +156 -0
  148. package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
  149. package/templates/.claude/skills/setup-deploy/SKILL.md +64 -32
  150. package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +44 -36
  151. package/templates/.claude/skills/setup-deploy/references/runbook-template.md +58 -102
  152. package/templates/.claude/skills/update-page/SKILL.md +117 -0
  153. package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
  154. package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
  155. package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
  156. package/templates/.github/workflows/ci.yml +4 -0
  157. package/templates/.prettierignore +1 -0
  158. package/templates/CLAUDE.md +146 -103
  159. package/templates/DESIGN.md +103 -6
  160. package/templates/README.md +63 -43
  161. package/templates/apps/api/.env.example +2 -1
  162. package/templates/apps/api/CLAUDE.md +3 -2
  163. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
  164. package/templates/apps/api/src/__tests__/server.test.ts +116 -0
  165. package/templates/apps/api/src/config/__tests__/index.test.ts +115 -14
  166. package/templates/apps/api/src/config/index.ts +35 -16
  167. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
  168. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
  169. package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
  170. package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
  171. package/templates/apps/api/src/lib/stripe.ts +9 -0
  172. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
  173. package/templates/apps/api/src/middleware/auth.ts +54 -0
  174. package/templates/apps/api/src/openapi/spec.ts +63 -12
  175. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
  176. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
  177. package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
  178. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
  179. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
  180. package/templates/apps/api/src/routes/leads/index.ts +46 -1
  181. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
  182. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
  183. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
  184. package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
  185. package/templates/apps/api/src/server.ts +35 -0
  186. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
  187. package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
  188. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
  189. package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
  190. package/templates/apps/api/src/services/lead-routing.ts +140 -30
  191. package/templates/apps/api/src/services/leads-inbox.ts +48 -11
  192. package/templates/apps/api/src/services/revalidation.ts +60 -15
  193. package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
  194. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
  195. package/templates/apps/mcp/src/tools/create_project.ts +21 -6
  196. package/templates/apps/mcp/src/tools/purchase.ts +4 -2
  197. package/templates/apps/web/.env.example +13 -0
  198. package/templates/apps/web/CLAUDE.md +22 -28
  199. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
  200. package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
  201. package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
  202. package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
  203. package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
  204. package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
  205. package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
  206. package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
  207. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +14 -6
  208. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +10 -9
  209. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
  210. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
  211. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +227 -84
  212. package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
  213. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
  214. package/templates/apps/web/app/[locale]/contact/page.tsx +105 -15
  215. package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
  216. package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
  217. package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
  218. package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +21 -5
  219. package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
  220. package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
  221. package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
  222. package/templates/apps/web/app/[locale]/layout.tsx +65 -17
  223. package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
  224. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
  225. package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
  226. package/templates/apps/web/app/[locale]/newsletter/page.tsx +106 -14
  227. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
  228. package/templates/apps/web/app/[locale]/{book-a-call → portfolio}/page.tsx +12 -13
  229. package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
  230. package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
  231. package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
  232. package/templates/apps/web/app/api/revalidate/route.ts +78 -36
  233. package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
  234. package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
  235. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
  236. package/templates/apps/web/lib/locale-guard.ts +18 -0
  237. package/templates/apps/web/lib/meet-placeholder.ts +5 -0
  238. package/templates/apps/web/lib/nav-config.ts +50 -37
  239. package/templates/apps/web/lib/site-brand.tsx +13 -9
  240. package/templates/apps/web/lib/site-identity.ts +14 -0
  241. package/templates/apps/web/lib/site-logo.tsx +36 -0
  242. package/templates/apps/web/lib/site-theme.ts +46 -26
  243. package/templates/apps/web/messages/en.json +45 -5
  244. package/templates/apps/web/middleware.ts +28 -4
  245. package/templates/content/_site.mdx +4 -2
  246. package/templates/content/en/BlogList/blog.mdx +37 -16
  247. package/templates/content/en/BookCall/book-a-call.mdx +80 -0
  248. package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
  249. package/templates/content/en/BookCall/onsite-service.mdx +56 -0
  250. package/templates/content/en/BookCall/start-project.mdx +56 -0
  251. package/templates/content/en/ContactPage/contact.mdx +43 -34
  252. package/templates/content/en/HomePage/home.mdx +10 -22
  253. package/templates/content/en/LandingPage/meet.mdx +59 -0
  254. package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
  255. package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
  256. package/templates/database/CHANGELOG.md +14 -0
  257. package/templates/database/package.json +1 -1
  258. package/templates/package.json +2 -1
  259. package/templates/tools/check-claude-md.ts +128 -0
  260. package/versions.json +33 -33
  261. package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -53
  262. package/site-templates/_base/content/en/UseCase/first-use-case.mdx +0 -23
  263. package/site-templates/_base/content/en/UseCase/second-use-case.mdx +0 -23
  264. package/site-templates/_base/content/en/UseCase/third-use-case.mdx +0 -23
  265. package/site-templates/minimalism-site/DESIGN.md +0 -162
  266. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -470
  267. package/site-templates/minimalism-site/ailk-template.json +0 -23
  268. package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
  269. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -53
  270. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
  271. package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
  272. package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
  273. package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
  274. package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
  275. package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
  276. package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
  277. package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
  278. package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
  279. package/site-templates/minimalism-site/provenance.json +0 -4
  280. package/site-templates/simple-service/DESIGN.md +0 -162
  281. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -333
  282. package/site-templates/simple-service/ailk-template.json +0 -11
  283. package/site-templates/simple-service/content/en/BookCall/book-call.mdx +0 -53
  284. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -32
  285. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
  286. package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
  287. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
  288. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
  289. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
  290. package/site-templates/simple-service/provenance.json +0 -4
  291. package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
  292. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -211
  293. package/templates/apps/web/app/[locale]/contact/__tests__/ContactForm.test.tsx +0 -96
  294. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
  295. package/templates/content/en/SoftwareProduct/product.mdx +0 -175
  296. /package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +0 -0
  297. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
  298. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
  299. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
  300. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
  301. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
  302. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
  303. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
  304. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
  305. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
  306. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
  307. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
  308. /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/first-engagement.mdx +0 -0
  309. /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/second-engagement.mdx +0 -0
  310. /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 settings"
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
- "use-cases": {
314
- "heading": "Use Cases",
315
- "emptyState": "Use cases listing coming soon."
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, type NextResponse } from "next/server";
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
- process.env.NEXT_PUBLIC_ENABLED_LOCALES ?? "en"
35
- ).split(",");
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
- product page (`content/en/SoftwareProduct/product.mdx`, served at
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: "{Resources for customer profile}"
5
- description: "{One sentence that says what this page covers}"
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": "{Resources for customer profile}",
17
- "subheadline": "{One sentence on what readers will learn here}",
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": "{Post 1 title: the reader's problem, the promise of the post}",
37
+ "title": "Free Fumadocs Blog: publish your blog and docs with Fumadocs",
30
38
  "slug": "post-1",
31
- "excerpt": "{Two sentences on what this post covers and what the reader takes away}",
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": "{Post 2 title: the reader's problem, the promise of the post}",
45
+ "title": "Upgrade to Pro: Fumadocs with our easy-to-use editor",
37
46
  "slug": "post-2",
38
- "excerpt": "{Two sentences on what this post covers and what the reader takes away}",
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": "{Post 3 title: the reader's problem, the promise of the post}",
53
+ "title": "Free Fumadocs Blog: publish your blog and docs with Fumadocs",
44
54
  "slug": "post-3",
45
- "excerpt": "{Two sentences on what this post covers and what the reader takes away}",
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": "10 min",
58
+ "readingTime": "5 min",
48
59
  },
49
60
  {
50
- "title": "{Post 4 title: the reader's problem, the promise of the post}",
61
+ "title": "Upgrade to Pro: Fumadocs with our easy-to-use editor",
51
62
  "slug": "post-4",
52
- "excerpt": "{Two sentences on what this post covers and what the reader takes away}",
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": "3 min",
66
+ "readingTime": "5 min",
55
67
  },
56
68
  {
57
- "title": "{Post 5 title: the reader's problem, the promise of the post}",
69
+ "title": "Free Fumadocs Blog: publish your blog and docs with Fumadocs",
58
70
  "slug": "post-5",
59
- "excerpt": "{Two sentences on what this post covers and what the reader takes away}",
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: "{Find out if your product is a good fit for you in just time amount.}"
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": "Book a Demo",
15
- "headline": "{Ready to achieve a valuable outcome?}",
16
- "subheadline": "{Find out if your product is a good fit for you in just time amount.}",
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
- "{What to expect on the call}",
20
- "{A fear or hesitation this call removes}",
21
- "{What the visitor gets out of the call}",
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": "logo-cloud",
27
- "type": "logoCloud",
32
+ "id": "meeting-types",
33
+ "type": "items",
28
34
  "data":
29
35
  {
30
- "headline": "Don’t just take our word for it",
31
- "headlineStyle": "label",
32
- "logos":
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
- "quote": "{A customer quote, in their own words, about the result they got}",
55
- "author": "{Customer name}",
56
- "role": "{Their title, their company}",
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 guided intake, with its fallback form — is mounted by the /contact route itself and posts to the site's own API (`/v1/leads/submit`). Placeholder copy — replace before you launch. */}
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. */}