create-ailk 0.5.0 → 0.6.1

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 (329) hide show
  1. package/README.md +55 -8
  2. package/component-catalog.json +336 -27
  3. package/component-catalog.md +25 -12
  4. package/dist/cli.js +54 -5
  5. package/dist/copy.d.ts +14 -0
  6. package/dist/copy.js +38 -1
  7. package/dist/lib/api-boot-assertion.d.ts +46 -0
  8. package/dist/lib/api-boot-assertion.js +70 -0
  9. package/dist/lib/extract-module-bundle.d.ts +20 -1
  10. package/dist/lib/extract-module-bundle.js +64 -5
  11. package/dist/lib/import-graph.d.ts +29 -0
  12. package/dist/lib/import-graph.js +140 -0
  13. package/dist/lib/module-license-gate.d.ts +6 -1
  14. package/dist/lib/module-license-gate.js +6 -1
  15. package/dist/lib/pro-callout.js +1 -1
  16. package/dist/module-architecture.d.ts +1 -0
  17. package/dist/module-architecture.js +253 -127
  18. package/dist/modules/commerce/0.6.0.tar.gz +0 -0
  19. package/dist/modules/docs-blog/0.6.0.tar.gz +0 -0
  20. package/dist/modules/multi-tenant/0.6.0.tar.gz +0 -0
  21. package/dist/modules/scheduling/0.6.0.tar.gz +0 -0
  22. package/dist/modules/signal-collectors/0.6.0.tar.gz +0 -0
  23. package/dist/modules/workspace/0.6.0.tar.gz +0 -0
  24. package/dist/programmatic.js +14 -10
  25. package/dist/surfaces.js +105 -7
  26. package/dist/template-manifest.d.ts +33 -0
  27. package/dist/template-manifest.js +99 -16
  28. package/dist/template-names.d.ts +1 -1
  29. package/dist/template-names.js +1 -0
  30. package/package.json +3 -2
  31. package/site-templates/marketing-site/DESIGN.md +148 -0
  32. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +22 -2
  33. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +9 -2
  34. package/site-templates/marketing-site/ailk-template.json +1 -1
  35. package/site-templates/marketing-site-free/DESIGN.md +148 -0
  36. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +2 -2
  37. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +1 -0
  38. package/site-templates/minimalism-site/DESIGN.md +148 -0
  39. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +10 -2
  40. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +47 -35
  41. package/site-templates/minimalism-site/ailk-template.json +2 -1
  42. package/site-templates/minimalism-site/assets/wordmark-placeholder.svg +28 -0
  43. package/site-templates/minimalism-site/content/en/HomePage/home.mdx +49 -19
  44. package/site-templates/saas-product/DESIGN.md +148 -0
  45. package/site-templates/simple-service/DESIGN.md +148 -0
  46. package/site-templates/simple-service/TEMPLATE-MANIFEST.json +240 -0
  47. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +278 -0
  48. package/site-templates/simple-service/ailk-template.json +10 -0
  49. package/site-templates/simple-service/content/en/AboutPage/about.mdx +38 -0
  50. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +67 -0
  51. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +56 -0
  52. package/site-templates/simple-service/content/en/HomePage/home.mdx +85 -0
  53. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +40 -0
  54. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +40 -0
  55. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +40 -0
  56. package/site-templates/simple-service/content/en/ServicesList/services.mdx +72 -0
  57. package/site-templates/simple-service/provenance.json +4 -0
  58. package/templates/.env.example +72 -7
  59. package/templates/CLAUDE.md +2 -3
  60. package/templates/DESIGN.md +155 -0
  61. package/templates/README.md +42 -8
  62. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +8 -0
  63. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +12 -0
  64. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +12 -0
  65. package/templates/apps/api/.env.example +13 -0
  66. package/templates/apps/api/CLAUDE.md +26 -2
  67. package/templates/apps/api/jest.config.cjs +3 -0
  68. package/templates/apps/api/package.json +1 -0
  69. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +407 -0
  70. package/templates/apps/api/src/__tests__/module-exclusion.test.ts +83 -7
  71. package/templates/apps/api/src/__tests__/server.test.ts +471 -0
  72. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +45 -0
  73. package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +2 -0
  74. package/templates/apps/api/src/config/index.ts +62 -0
  75. package/templates/apps/api/src/config/modules.ts +7 -3
  76. package/templates/apps/api/src/lib/__mocks__/prisma.ts +238 -2
  77. package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +143 -0
  78. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +23 -0
  79. package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +125 -0
  80. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +20 -0
  81. package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +317 -0
  82. package/templates/apps/api/src/lib/__tests__/site.test.ts +238 -0
  83. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +75 -0
  84. package/templates/apps/api/src/lib/auth-email-budget.ts +160 -0
  85. package/templates/apps/api/src/lib/content-adapter.ts +57 -31
  86. package/templates/apps/api/src/lib/deliverable-asset-store.ts +76 -0
  87. package/templates/apps/api/src/lib/error-serializer.ts +23 -3
  88. package/templates/apps/api/src/lib/outbound-http.ts +7 -2
  89. package/templates/apps/api/src/lib/require-commerce-claim.ts +250 -0
  90. package/templates/apps/api/src/lib/site.ts +208 -9
  91. package/templates/apps/api/src/lib/stripe.ts +66 -0
  92. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +182 -0
  93. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +42 -0
  94. package/templates/apps/api/src/middleware/rate-limit.ts +7 -1
  95. package/templates/apps/api/src/openapi/spec.ts +543 -2
  96. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +48 -0
  97. package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +309 -0
  98. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +123 -0
  99. package/templates/apps/api/src/routes/auth/transactional-email.ts +273 -0
  100. package/templates/apps/api/src/routes/auth/user.ts +61 -0
  101. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +434 -0
  102. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +888 -0
  103. package/templates/apps/api/src/routes/checkout/index.ts +34 -0
  104. package/templates/apps/api/src/routes/checkout/session.ts +139 -0
  105. package/templates/apps/api/src/routes/checkout/sessions.ts +197 -0
  106. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +554 -0
  107. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +108 -0
  108. package/templates/apps/api/src/routes/content/__tests__/search.test.ts +450 -0
  109. package/templates/apps/api/src/routes/content/get-page.ts +94 -12
  110. package/templates/apps/api/src/routes/content/index.ts +13 -73
  111. package/templates/apps/api/src/routes/content/list-pages.ts +15 -3
  112. package/templates/apps/api/src/routes/content/rate-limit.ts +15 -6
  113. package/templates/apps/api/src/routes/content/search.ts +129 -0
  114. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +447 -31
  115. package/templates/apps/api/src/routes/leads/index.ts +100 -13
  116. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +51 -0
  117. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +351 -0
  118. package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +51 -0
  119. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +5 -2
  120. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +4 -1
  121. package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +58 -0
  122. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +107 -6
  123. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +87 -2
  124. package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +51 -0
  125. package/templates/apps/api/src/routes/project-listings/start.ts +5 -1
  126. package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +686 -0
  127. package/templates/apps/api/src/routes/requests/confirm.ts +601 -0
  128. package/templates/apps/api/src/routes/requests/index.ts +54 -0
  129. package/templates/apps/api/src/routes/webhooks/README.md +265 -0
  130. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +749 -0
  131. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +330 -0
  132. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +262 -0
  133. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +285 -0
  134. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +213 -0
  135. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +301 -0
  136. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +648 -0
  137. package/templates/apps/api/src/routes/webhooks/index.ts +89 -0
  138. package/templates/apps/api/src/routes/webhooks/stripe.ts +1399 -0
  139. package/templates/apps/api/src/server.ts +439 -49
  140. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +39 -0
  141. package/templates/apps/api/src/services/__tests__/aeo-score.test.ts +217 -40
  142. package/templates/apps/api/src/services/__tests__/audit-log.test.ts +620 -0
  143. package/templates/apps/api/src/services/__tests__/consent.test.ts +2 -0
  144. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +300 -5
  145. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +20 -0
  146. package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +368 -0
  147. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +160 -0
  148. package/templates/apps/api/src/services/__tests__/listing-config.test.ts +166 -0
  149. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +154 -0
  150. package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +137 -0
  151. package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +444 -0
  152. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +238 -0
  153. package/templates/apps/api/src/services/__tests__/verified-email.test.ts +78 -0
  154. package/templates/apps/api/src/services/abandon-email.ts +8 -2
  155. package/templates/apps/api/src/services/aeo-score.ts +49 -12
  156. package/templates/apps/api/src/services/audit-log.ts +668 -0
  157. package/templates/apps/api/src/services/consent.ts +18 -0
  158. package/templates/apps/api/src/services/default-tenant.ts +70 -31
  159. package/templates/apps/api/src/services/deliverable-fulfillment.ts +141 -13
  160. package/templates/apps/api/src/services/dunning-policy.ts +294 -0
  161. package/templates/apps/api/src/services/entitlements.ts +80 -0
  162. package/templates/apps/api/src/services/lead-promotion.ts +13 -14
  163. package/templates/apps/api/src/services/lead-routing.ts +161 -2
  164. package/templates/apps/api/src/services/leads-inbox.ts +23 -2
  165. package/templates/apps/api/src/services/listing-config.ts +27 -9
  166. package/templates/apps/api/src/services/project-listings.ts +201 -6
  167. package/templates/apps/api/src/services/public-site-resolver.ts +106 -0
  168. package/templates/apps/api/src/services/request-confirm.ts +646 -0
  169. package/templates/apps/api/src/services/revalidation.ts +173 -0
  170. package/templates/apps/api/src/services/verified-email.ts +71 -0
  171. package/templates/apps/api/src/vercel-handler.ts +75 -35
  172. package/templates/apps/mcp/.env.example +17 -0
  173. package/templates/apps/mcp/CLAUDE.md +57 -24
  174. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +6 -0
  175. package/templates/apps/mcp/__tests__/audit.test.ts +137 -8
  176. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +79 -36
  177. package/templates/apps/mcp/__tests__/get_offerings.test.ts +111 -2
  178. package/templates/apps/mcp/__tests__/get_pricing.test.ts +82 -2
  179. package/templates/apps/mcp/__tests__/http-transport.test.ts +541 -2
  180. package/templates/apps/mcp/__tests__/index.test.ts +39 -0
  181. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +143 -0
  182. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +111 -0
  183. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +65 -0
  184. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +188 -0
  185. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +165 -0
  186. package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +124 -0
  187. package/templates/apps/mcp/__tests__/list_pages.test.ts +116 -0
  188. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +7 -1
  189. package/templates/apps/mcp/__tests__/parity.test.ts +10 -7
  190. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +89 -22
  191. package/templates/apps/mcp/__tests__/read_content.test.ts +322 -1
  192. package/templates/apps/mcp/__tests__/search_content.test.ts +105 -2
  193. package/templates/apps/mcp/__tests__/server.test.ts +67 -14
  194. package/templates/apps/mcp/__tests__/start_purchase.test.ts +252 -0
  195. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +300 -123
  196. package/templates/apps/mcp/jest.config.cjs +13 -0
  197. package/templates/apps/mcp/package.json +2 -0
  198. package/templates/apps/mcp/src/abuse/index.ts +159 -24
  199. package/templates/apps/mcp/src/config/modules.ts +10 -5
  200. package/templates/apps/mcp/src/http-transport.ts +102 -29
  201. package/templates/apps/mcp/src/index.ts +73 -11
  202. package/templates/apps/mcp/src/lib/audit-single-page.ts +90 -3
  203. package/templates/apps/mcp/src/lib/commerce-claim.ts +94 -0
  204. package/templates/apps/mcp/src/lib/content-adapter.ts +113 -0
  205. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +139 -0
  206. package/templates/apps/mcp/src/lib/prisma.ts +39 -0
  207. package/templates/apps/mcp/src/lib/public-workspace.ts +133 -0
  208. package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +59 -0
  209. package/templates/apps/mcp/src/server.ts +59 -35
  210. package/templates/apps/mcp/src/tools/audit.ts +26 -2
  211. package/templates/apps/mcp/src/tools/get_business_hours.ts +4 -3
  212. package/templates/apps/mcp/src/tools/get_faq.ts +4 -3
  213. package/templates/apps/mcp/src/tools/get_locations.ts +5 -3
  214. package/templates/apps/mcp/src/tools/get_offerings.ts +16 -4
  215. package/templates/apps/mcp/src/tools/get_pricing.ts +25 -6
  216. package/templates/apps/mcp/src/tools/get_site_info.ts +4 -3
  217. package/templates/apps/mcp/src/tools/index.ts +6 -4
  218. package/templates/apps/mcp/src/tools/list_pages.ts +4 -3
  219. package/templates/apps/mcp/src/tools/purchase.ts +128 -45
  220. package/templates/apps/mcp/src/tools/read_content.ts +20 -6
  221. package/templates/apps/mcp/src/tools/search_content.ts +11 -4
  222. package/templates/apps/web/.env.example +71 -5
  223. package/templates/apps/web/CLAUDE.md +44 -0
  224. package/templates/apps/web/PRODUCT.md +86 -0
  225. package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +18 -2
  226. package/templates/apps/web/app/.well-known/mcp.json/route.ts +11 -3
  227. package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +282 -0
  228. package/templates/apps/web/app/[locale]/(auth)/__tests__/password-reset.test.tsx +515 -0
  229. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +89 -0
  230. package/templates/apps/web/app/[locale]/(auth)/forgot-password/page.tsx +109 -0
  231. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +92 -0
  232. package/templates/apps/web/app/[locale]/(auth)/reset-password/page.tsx +135 -0
  233. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +109 -0
  234. package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/page.test.tsx +48 -2
  235. package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/page.tsx +20 -6
  236. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +125 -0
  237. package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +96 -0
  238. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +101 -0
  239. package/templates/apps/web/app/[locale]/(auth)/use-auth-card-flow.ts +102 -0
  240. package/templates/apps/web/app/[locale]/(auth)/verify-email/page.tsx +87 -0
  241. package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +20 -10
  242. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +84 -0
  243. package/templates/apps/web/app/[locale]/(authed)/account/actions.ts +58 -0
  244. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +63 -8
  245. package/templates/apps/web/app/[locale]/(authed)/layout.tsx +18 -1
  246. package/templates/apps/web/app/[locale]/cancellation/page.tsx +44 -0
  247. package/templates/apps/web/app/[locale]/layout.tsx +133 -87
  248. package/templates/apps/web/app/[locale]/purchase/__tests__/cancel.test.tsx +162 -0
  249. package/templates/apps/web/app/[locale]/purchase/__tests__/module-scope.test.ts +68 -0
  250. package/templates/apps/web/app/[locale]/purchase/__tests__/success.test.tsx +361 -0
  251. package/templates/apps/web/app/[locale]/purchase/cancel/page.tsx +115 -0
  252. package/templates/apps/web/app/[locale]/purchase/success/page.tsx +307 -0
  253. package/templates/apps/web/app/[locale]/returns/page.tsx +44 -0
  254. package/templates/apps/web/app/[locale]/shipping/page.tsx +44 -0
  255. package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +670 -0
  256. package/templates/apps/web/app/api/revalidate/route.ts +194 -0
  257. package/templates/apps/web/auth.ts +407 -8
  258. package/templates/apps/web/jest.config.cjs +8 -4
  259. package/templates/apps/web/lib/__tests__/auth-email.test.ts +214 -0
  260. package/templates/apps/web/lib/__tests__/auth-routes.test.ts +74 -0
  261. package/templates/apps/web/lib/__tests__/meeting-slugs.test.ts +72 -0
  262. package/templates/apps/web/lib/__tests__/site-theme.test.ts +135 -20
  263. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +18 -1
  264. package/templates/apps/web/lib/auth-email.ts +318 -0
  265. package/templates/apps/web/lib/auth-env.ts +85 -0
  266. package/templates/apps/web/lib/auth-routes.ts +55 -0
  267. package/templates/apps/web/lib/meeting-slugs.ts +53 -0
  268. package/templates/apps/web/lib/site-brand.tsx +4 -8
  269. package/templates/apps/web/lib/telemetry-scrub.ts +5 -1
  270. package/templates/apps/web/messages/en.json +187 -0
  271. package/templates/apps/web/middleware.ts +1 -1
  272. package/templates/apps/web/package.json +2 -1
  273. package/templates/apps/web/src/lib/commerce-claim.ts +33 -0
  274. package/templates/apps/web/src/lib/commerce-sections.ts +93 -0
  275. package/templates/content/_site.mdx +18 -3
  276. package/templates/content/en/CancellationPolicyPage/cancellation.mdx +108 -0
  277. package/templates/content/en/ReturnsPolicyPage/returns.mdx +108 -0
  278. package/templates/content/en/ShippingPolicyPage/shipping.mdx +108 -0
  279. package/templates/database/CHANGELOG.md +149 -0
  280. package/templates/database/README.md +10 -3
  281. package/templates/database/__tests__/appointment.db.test.ts +106 -0
  282. package/templates/database/__tests__/artifact-content-store.db.test.ts +316 -0
  283. package/templates/database/__tests__/composite-fence.db.test.ts +206 -0
  284. package/templates/database/__tests__/fence-fan-out.db.test.ts +711 -0
  285. package/templates/database/__tests__/fixtures/appointment-create-probe.ts +79 -0
  286. package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +100 -0
  287. package/templates/database/__tests__/flow-workspace-key.db.test.ts +263 -0
  288. package/templates/database/__tests__/prefixed-ids.db.test.ts +85 -9
  289. package/templates/database/__tests__/project-listing-consent-at.db.test.ts +111 -0
  290. package/templates/database/__tests__/tenancy.test.ts +141 -0
  291. package/templates/database/config/schema.prisma +79 -2
  292. package/templates/database/content/schema.prisma +87 -11
  293. package/templates/database/inbox/schema.prisma +452 -9
  294. package/templates/database/jest.config.cjs +5 -3
  295. package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +15 -0
  296. package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +158 -0
  297. package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +40 -0
  298. package/templates/database/migrations/20260918120000_add_appointment/migration.sql +67 -0
  299. package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +70 -0
  300. package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +181 -0
  301. package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +172 -0
  302. package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +41 -0
  303. package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +185 -0
  304. package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +70 -0
  305. package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +57 -0
  306. package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +68 -0
  307. package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +1067 -0
  308. package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +210 -0
  309. package/templates/database/package.json +3 -2
  310. package/templates/database/tenancy.ts +86 -1
  311. package/templates/database/tsconfig.json +1 -0
  312. package/versions.json +34 -34
  313. package/templates/apps/api/src/routes/content/__tests__/create.test.ts +0 -253
  314. package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +0 -215
  315. package/templates/apps/api/src/routes/content/__tests__/update.test.ts +0 -266
  316. package/templates/apps/api/src/routes/content/create.ts +0 -115
  317. package/templates/apps/api/src/routes/content/delete.ts +0 -82
  318. package/templates/apps/api/src/routes/content/update.ts +0 -112
  319. package/templates/apps/mcp/__tests__/create_page.test.ts +0 -202
  320. package/templates/apps/mcp/__tests__/delete_page.test.ts +0 -177
  321. package/templates/apps/mcp/__tests__/update_page.test.ts +0 -196
  322. package/templates/apps/mcp/src/tools/create_page.ts +0 -96
  323. package/templates/apps/mcp/src/tools/delete_page.ts +0 -74
  324. package/templates/apps/mcp/src/tools/update_page.ts +0 -92
  325. package/templates/apps/web/app/[locale]/sign-in/sign-in-card.tsx +0 -123
  326. package/templates/apps/web/public/logo-dark.svg +0 -21
  327. package/templates/apps/web/public/logo-light.svg +0 -21
  328. /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/next-path.test.ts +0 -0
  329. /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/next-path.ts +0 -0
@@ -13,7 +13,15 @@ sections:
13
13
  "variant": "centered",
14
14
  "fill": "viewport",
15
15
  "surface": "gradient-brand",
16
+ "backdrop": { "src": "/hero-backdrop.svg", "alt": "" },
16
17
  "headline": "Your Company",
18
+ "lockup":
19
+ {
20
+ "src": "/wordmark-placeholder.svg",
21
+ "alt": "",
22
+ "width": 1043,
23
+ "height": 128,
24
+ },
17
25
  "primaryCta": { "label": "{Primary CTA} →", "href": "/reports" },
18
26
  "ctaSize": "xl",
19
27
  "scrollCue": { "label": "Scroll" },
@@ -25,6 +33,8 @@ sections:
25
33
  "data":
26
34
  {
27
35
  "variant": "narrow",
36
+ "align": "center",
37
+ "fill": "viewport",
28
38
  "headline": "A working partnership with the teams building {what your market needs next}",
29
39
  "body": "{One line on who you work with, and what they get from you that they cannot get elsewhere.}",
30
40
  },
@@ -43,6 +53,14 @@ sections:
43
53
  { "name": "{logo}", "src": "/logo-placeholder-2.svg" },
44
54
  { "name": "{logo}", "src": "/logo-placeholder-3.svg" },
45
55
  ],
56
+ "actions":
57
+ [
58
+ {
59
+ "kind": "button",
60
+ "label": "Refer someone →",
61
+ "href": "/referral",
62
+ },
63
+ ],
46
64
  },
47
65
  },
48
66
  {
@@ -51,6 +69,8 @@ sections:
51
69
  "data":
52
70
  {
53
71
  "variant": "narrow",
72
+ "align": "center",
73
+ "fill": "viewport",
54
74
  "headline": "Research on {your field}, and on where the next decade of it is going",
55
75
  "body": "{One line on what a reader walks away with. Keep it to a single sentence.}",
56
76
  },
@@ -62,7 +82,8 @@ sections:
62
82
  {
63
83
  "headline": "Special reports",
64
84
  "variant": "list",
65
- "tone": "on-light",
85
+ "tone": "on-dark",
86
+ "surface": "gradient-dark",
66
87
  "reports":
67
88
  [
68
89
  {
@@ -95,7 +116,8 @@ sections:
95
116
  {
96
117
  "headline": "Favorites",
97
118
  "variant": "list",
98
- "tone": "on-light",
119
+ "tone": "on-dark",
120
+ "surface": "gradient-dark",
99
121
  "reports":
100
122
  [
101
123
  { "slug": "state-of-the-market-2026", "title": "2026" },
@@ -111,6 +133,8 @@ sections:
111
133
  "data":
112
134
  {
113
135
  "variant": "narrow",
136
+ "align": "center",
137
+ "fill": "viewport",
114
138
  "headline": "Trusted work for the people who carry {the outcome you deliver}",
115
139
  "body": "{One line on how an engagement starts and what the first month looks like.}",
116
140
  "cta": { "label": "Hire me →", "href": "/meet" },
@@ -125,6 +149,9 @@ sections:
125
149
  "variant": "with-large-images",
126
150
  "hoverReveal": true,
127
151
  "largePhotos": true,
152
+ "phoneColumns": 2,
153
+ "actions":
154
+ [{ "kind": "button", "label": "About us →", "href": "/about" }],
128
155
  "members":
129
156
  [
130
157
  {
@@ -192,23 +219,26 @@ the reference's own words. Replace all of it before you launch — including
192
219
  the four sample reports, the three logo placeholders and the six portrait
193
220
  placeholders.
194
221
 
195
- Three slides carry LESS than the template's design intends, because the
196
- section prop each needs does not exist yet (#5691 — one bounded additive-props
197
- batch, the #5622 shape). When those props land, this file gains the fields and
198
- nothing is recomposed:
222
+ Every slide now carries the full composition the template intends — #5691
223
+ landed the seven bounded section props the deck was waiting on, and this file
224
+ sets all seven without recomposing a single slide:
199
225
 
200
- - slide 1 `landing` — wants a full-bleed backdrop IMAGE
201
- (`assets/hero-backdrop.svg`, installed at `/hero-backdrop.svg`). Hero has
202
- no backdrop slot, and its `image` slot counts as a stacked reveal, which
203
- suppresses `scrollCue`. Ships on the `gradient-brand` band, which is a
204
- full-bleed gradient and keeps the 44px cue.
205
- - slide 3 `community` and slide 8 `partners` — want a bottom-centered
206
- action ("Refer someone →" → /referral; → /about). `logoCloud` and `team`
207
- carry no action field.
208
- - slides 5 `special-reports` and 6 `favorites` — want the on-DARK ground the
209
- reference alternates to. `reports-list` already has `tone: "on-dark"`
210
- (#5562, shipped for this template), but `SectionSurfaceSchema` has no dark
211
- value to put under it, so on-dark type would render on a light band. They
212
- ship `on-light` until it does.
226
+ - slide 1 `landing` — `backdrop` paints `assets/hero-backdrop.svg`
227
+ (installed at `/hero-backdrop.svg`) full-bleed behind the copy. It is a
228
+ distinct slot from the hero's `image`, which counts as a stacked reveal,
229
+ so the 44px `scrollCue` survives it.
230
+ - slide 3 `community` and slide 8 `partners` — `actions` puts one
231
+ bottom-centered action at the 44px floor on each ("Refer someone →" →
232
+ /referral; "About us →" → /about).
233
+ - slides 2 `tagline`, 4 `reports-headline` and 7 `services-headline` —
234
+ `align: "center"` + `fill: "viewport"` centre the copy in the middle of
235
+ the snap panel instead of pinning it to the top.
236
+ - slides 5 `special-reports` and 6 `favorites` — `surface:
237
+ "gradient-dark"` is the dark ground `tone: "on-dark"` (#5562, shipped
238
+ for this template) was always meant to sit on.
239
+ - slide 8 `partners` — `phoneColumns: 2` puts the six-tile wall two-up at
240
+ 390 instead of overflowing the snap panel one tile at a time. Slide 8 is
241
+ the only slide that renders through `CardGrid`: slide 3's logo strip is
242
+ a reflowing flex row, and `reports-list`'s `list` variant has no grid.
213
243
 
214
244
  \*/}
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: SaaS product (Pro) — saas-product
3
+ description: The multi-tenant SaaS template — registered and installable, its visual design still to come.
4
+ colors:
5
+ bg: "#ffffff"
6
+ fg: "#000000"
7
+ surface: "#ffffff"
8
+ surface-secondary: "#ffffff"
9
+ border: "#000000"
10
+ text-muted: "#333333"
11
+ brand: "#000000"
12
+ fg-on-brand: "#ffffff"
13
+ accent: "#000000"
14
+ bg-dark: "#000000"
15
+ fg-dark: "#ffffff"
16
+ border-dark: "#ffffff"
17
+ brand-dark: "#ffffff"
18
+ typography:
19
+ display:
20
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
21
+ fontSize: "6rem"
22
+ fontWeight: 400
23
+ lineHeight: 1
24
+ letterSpacing: "-0.05em"
25
+ heading-section:
26
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
27
+ fontSize: "2.25rem"
28
+ fontWeight: 400
29
+ lineHeight: 1.25
30
+ letterSpacing: "-0.05em"
31
+ heading-item:
32
+ fontSize: "1.25rem"
33
+ fontWeight: 600
34
+ lineHeight: 1.375
35
+ body:
36
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
37
+ fontSize: "1.125rem"
38
+ fontWeight: 400
39
+ lineHeight: 1.5
40
+ eyebrow:
41
+ fontSize: "0.875rem"
42
+ fontWeight: 600
43
+ lineHeight: 1.4
44
+ letterSpacing: "0.05em"
45
+ rounded:
46
+ button: "0.25rem"
47
+ card: "0.75rem"
48
+ spacing:
49
+ section: "4rem"
50
+ card: "1.5rem"
51
+ grid: "1.5rem"
52
+ container: "1280px"
53
+ ---
54
+
55
+ <!--
56
+ Source template: saas-product
57
+ Version: create-ailk {{CREATE_AILK_VERSION}}
58
+ Extends: _base — installing this template replaces the base scaffold's
59
+ DESIGN.md with this file. Its tokens are the base foundation's, unchanged:
60
+ this template carries no theme of its own.
61
+
62
+ The tokens above describe what the site RENDERS today. Colours come from
63
+ content/_site.mdx (`theme.colors`); type, radius and spacing are platform
64
+ defaults a site cannot override yet — see "Where this is heading" below.
65
+ -->
66
+
67
+ # SaaS product (Pro)
68
+
69
+ ## Overview
70
+
71
+ The multi-tenant SaaS template. It is registered and installs cleanly, but its page compositions and visual design have not been authored yet (tracked in ai-launch-kit-internal#5470). Until they are, it renders on the base foundation unchanged, and this file is its placeholder: replace it when the template's design lands.
72
+
73
+ ## Colors
74
+
75
+ ### Primary
76
+
77
+ **Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
78
+
79
+ ### Neutral
80
+
81
+ Pure white ground (`bg` `#ffffff`), pure black ink for headings (`fg` `#000000`), and near-black `#333333` for body copy — well above AA on white. **Borders are black** (`#000000`): card outlines, the rule under the navigation, the rules between sections and the rule above the footer are all 1px black lines. Cards are white, not tinted (`surface-secondary` is white too). There is no accent colour — `accent` is black.
82
+
83
+ Dark mode inverts: black ground, white ink, white rules, white primary button with black label.
84
+
85
+ ### Named Rules
86
+
87
+ - **Rules, not fills.** A container is drawn with a black hairline on the white ground. Grey fills are reserved for image placeholders.
88
+
89
+ ## Typography
90
+
91
+ System sans throughout; no web font.
92
+
93
+ ### Hierarchy
94
+
95
+ | Role | Size | Weight | Notes |
96
+ | --------------- | -------- | ------ | --------------------------------------------------------------------------- |
97
+ | Hero headline | 6rem | 400 | Tracking -0.05em, line-height 1 |
98
+ | Section heading | 2.25rem | 400 | Tracking -0.05em — light and tight, not bold |
99
+ | Item heading | 1.25rem | 600 | Card, feature and step titles |
100
+ | Body | 1.125rem | 400 | `#333333`, line-height 1.5 |
101
+ | Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
102
+
103
+ Measured from the rendered scaffold (1440px wide), not transcribed from tokens.
104
+
105
+ The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
106
+
107
+ ## Layout
108
+
109
+ Not designed yet — its pages come from its modules' defaults on the base layout. See `TEMPLATE-MANIFEST.md` in this directory for the roster. Shared foundation: a 1280px container, sections at 4rem, card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
110
+
111
+ ## Shapes
112
+
113
+ Two radii today: buttons at 0.25rem, cards and outlined boxes at 0.75rem. Headed toward square corners — see below.
114
+
115
+ ## Components
116
+
117
+ ### Buttons
118
+
119
+ Primary: black fill, white label, 0.25rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
120
+
121
+ ### Cards / Containers
122
+
123
+ White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding. The one exception today: the "how it works" steps render as dark filled cards (see below).
124
+
125
+ ### Navigation
126
+
127
+ Base navigation, unchanged.
128
+
129
+ ## Where this is heading
130
+
131
+ The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. Six parts of that direction cannot be expressed through a site's theme today, so they wait on a platform change rather than being hand-coded. Until they land, this file describes the rendered site above, not these targets.
132
+
133
+ | Target | Reference value | Blocked by |
134
+ | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
135
+ | Square corners on buttons, cards and inputs | radius 0 | A site's `theme:` block accepts colours only — no radius |
136
+ | Bold, tighter headings | hero ~3.6rem and section headings ~2.9rem, both at weight 700 with tracking about -0.02em (today 6rem and 2.25rem at weight 400) | No per-site type-role override |
137
+ | Generous section pacing | about 10rem between sections, not 4rem | No per-site section-spacing override; `spacious` (6rem) is not author-selectable |
138
+ | Section label in sentence case, bold, no tracking | "Core Features", not "CORE FEATURES" | The eyebrow role bakes in uppercase and tracking |
139
+ | Whitespace between sections, not rules | no rule between bands | Section dividers share the one `border` colour with card outlines, so black outlines make black dividers |
140
+ | Outlined steps in "how it works" | three plain outlined columns | The steps section renders dark filled cards; no outlined variant |
141
+
142
+ ## Do's and Don'ts
143
+
144
+ - **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
145
+ - **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
146
+ - **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
147
+ - **Don't** replace a black rule with a shadow or a grey fill.
148
+ - **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: Simple service (Pro) — simple-service
3
+ description: A local-service site: three priced services, online booking, checkout, and the policy pages a paying customer expects.
4
+ colors:
5
+ bg: "#ffffff"
6
+ fg: "#000000"
7
+ surface: "#ffffff"
8
+ surface-secondary: "#ffffff"
9
+ border: "#000000"
10
+ text-muted: "#333333"
11
+ brand: "#000000"
12
+ fg-on-brand: "#ffffff"
13
+ accent: "#000000"
14
+ bg-dark: "#000000"
15
+ fg-dark: "#ffffff"
16
+ border-dark: "#ffffff"
17
+ brand-dark: "#ffffff"
18
+ typography:
19
+ display:
20
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
21
+ fontSize: "6rem"
22
+ fontWeight: 400
23
+ lineHeight: 1
24
+ letterSpacing: "-0.05em"
25
+ heading-section:
26
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
27
+ fontSize: "2.25rem"
28
+ fontWeight: 400
29
+ lineHeight: 1.25
30
+ letterSpacing: "-0.05em"
31
+ heading-item:
32
+ fontSize: "1.25rem"
33
+ fontWeight: 600
34
+ lineHeight: 1.375
35
+ body:
36
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
37
+ fontSize: "1.125rem"
38
+ fontWeight: 400
39
+ lineHeight: 1.5
40
+ eyebrow:
41
+ fontSize: "0.875rem"
42
+ fontWeight: 600
43
+ lineHeight: 1.4
44
+ letterSpacing: "0.05em"
45
+ rounded:
46
+ button: "0.25rem"
47
+ card: "0.75rem"
48
+ spacing:
49
+ section: "4rem"
50
+ card: "1.5rem"
51
+ grid: "1.5rem"
52
+ container: "1280px"
53
+ ---
54
+
55
+ <!--
56
+ Source template: simple-service
57
+ Version: create-ailk {{CREATE_AILK_VERSION}}
58
+ Extends: _base — installing this template replaces the base scaffold's
59
+ DESIGN.md with this file. Its tokens are the base foundation's, unchanged:
60
+ this template carries no theme of its own.
61
+
62
+ The tokens above describe what the site RENDERS today. Colours come from
63
+ content/_site.mdx (`theme.colors`); type, radius and spacing are platform
64
+ defaults a site cannot override yet — see "Where this is heading" below.
65
+ -->
66
+
67
+ # Simple service (Pro)
68
+
69
+ ## Overview
70
+
71
+ A template for a local service business — the reference shape is a lawn-care company. Three priced services, a booking page, a checkout return pair, a customer account, and the returns, cancellation and shipping policies. It runs on the base foundation; the design job is trust and clarity, so nothing competes with the price and the book button.
72
+
73
+ ## Colors
74
+
75
+ ### Primary
76
+
77
+ **Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
78
+
79
+ ### Neutral
80
+
81
+ Pure white ground (`bg` `#ffffff`), pure black ink for headings (`fg` `#000000`), and near-black `#333333` for body copy — well above AA on white. **Borders are black** (`#000000`): card outlines, the rule under the navigation, the rules between sections and the rule above the footer are all 1px black lines. Cards are white, not tinted (`surface-secondary` is white too). There is no accent colour — `accent` is black.
82
+
83
+ Dark mode inverts: black ground, white ink, white rules, white primary button with black label.
84
+
85
+ ### Named Rules
86
+
87
+ - **Rules, not fills.** A container is drawn with a black hairline on the white ground. Grey fills are reserved for image placeholders.
88
+
89
+ ## Typography
90
+
91
+ System sans throughout; no web font.
92
+
93
+ ### Hierarchy
94
+
95
+ | Role | Size | Weight | Notes |
96
+ | --------------- | -------- | ------ | --------------------------------------------------------------------------- |
97
+ | Hero headline | 6rem | 400 | Tracking -0.05em, line-height 1 |
98
+ | Section heading | 2.25rem | 400 | Tracking -0.05em — light and tight, not bold |
99
+ | Item heading | 1.25rem | 600 | Card, feature and step titles |
100
+ | Body | 1.125rem | 400 | `#333333`, line-height 1.5 |
101
+ | Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
102
+
103
+ Measured from the rendered scaffold (1440px wide), not transcribed from tokens.
104
+
105
+ The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
106
+
107
+ ## Layout
108
+
109
+ Full navigation with the announcement banner; a multi-column footer; the default home. Every page and its sections are listed in `TEMPLATE-MANIFEST.md` in this directory. Shared foundation: a 1280px container, sections at 4rem, card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
110
+
111
+ ## Shapes
112
+
113
+ Two radii today: buttons at 0.25rem, cards and outlined boxes at 0.75rem. Headed toward square corners — see below.
114
+
115
+ ## Components
116
+
117
+ ### Buttons
118
+
119
+ Primary: black fill, white label, 0.25rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
120
+
121
+ ### Cards / Containers
122
+
123
+ White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding. The one exception today: the "how it works" steps render as dark filled cards (see below).
124
+
125
+ ### Navigation
126
+
127
+ Full navigation: wordmark left, page links, an outlined and a filled button at the far right, the announcement banner above. A black hairline separates it from the page.
128
+
129
+ ## Where this is heading
130
+
131
+ The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. Six parts of that direction cannot be expressed through a site's theme today, so they wait on a platform change rather than being hand-coded. Until they land, this file describes the rendered site above, not these targets.
132
+
133
+ | Target | Reference value | Blocked by |
134
+ | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
135
+ | Square corners on buttons, cards and inputs | radius 0 | A site's `theme:` block accepts colours only — no radius |
136
+ | Bold, tighter headings | hero ~3.6rem and section headings ~2.9rem, both at weight 700 with tracking about -0.02em (today 6rem and 2.25rem at weight 400) | No per-site type-role override |
137
+ | Generous section pacing | about 10rem between sections, not 4rem | No per-site section-spacing override; `spacious` (6rem) is not author-selectable |
138
+ | Section label in sentence case, bold, no tracking | "Core Features", not "CORE FEATURES" | The eyebrow role bakes in uppercase and tracking |
139
+ | Whitespace between sections, not rules | no rule between bands | Section dividers share the one `border` colour with card outlines, so black outlines make black dividers |
140
+ | Outlined steps in "how it works" | three plain outlined columns | The steps section renders dark filled cards; no outlined variant |
141
+
142
+ ## Do's and Don'ts
143
+
144
+ - **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
145
+ - **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
146
+ - **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
147
+ - **Don't** replace a black rule with a shadow or a grey fill.
148
+ - **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
@@ -0,0 +1,240 @@
1
+ {
2
+ "template": "simple-service",
3
+ "requires": ["marketing", "scheduling", "commerce"],
4
+ "categories": ["landscaping"],
5
+ "generatedHash": "f0dce515363186cee7ec9d1b1fd91d0ca11e039db31e843d1235d451dd49e736",
6
+ "layout": {
7
+ "nav": "full",
8
+ "footer": "columns",
9
+ "announcementBanner": true,
10
+ "home": "default"
11
+ },
12
+ "rows": [
13
+ {
14
+ "route": "/",
15
+ "pageType": "HomePage",
16
+ "schema": "HomePage",
17
+ "shell": "MarketingShell",
18
+ "chrome": "on",
19
+ "sections": [
20
+ {
21
+ "type": "hero",
22
+ "component": "Hero"
23
+ },
24
+ {
25
+ "type": "items",
26
+ "component": "Items"
27
+ },
28
+ {
29
+ "type": "cta",
30
+ "component": "CTA"
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "route": "/services",
36
+ "pageType": "ServicesList",
37
+ "schema": "ServicesList",
38
+ "shell": "MarketingShell",
39
+ "chrome": "on",
40
+ "sections": [
41
+ {
42
+ "type": "hero",
43
+ "component": "Hero"
44
+ },
45
+ {
46
+ "type": "items",
47
+ "component": "Items"
48
+ },
49
+ {
50
+ "type": "cta",
51
+ "component": "CTA"
52
+ }
53
+ ]
54
+ },
55
+ {
56
+ "route": "/services/[slug]",
57
+ "pageType": null,
58
+ "schema": null,
59
+ "shell": "MarketingShell",
60
+ "chrome": "on",
61
+ "sections": []
62
+ },
63
+ {
64
+ "route": "/about",
65
+ "pageType": "AboutPage",
66
+ "schema": "AboutPage",
67
+ "shell": "MarketingShell",
68
+ "chrome": "on",
69
+ "sections": [
70
+ {
71
+ "type": "content-block",
72
+ "component": "ContentBlock"
73
+ },
74
+ {
75
+ "type": "cta",
76
+ "component": "CTA"
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ "route": "/contact",
82
+ "pageType": "ContactPage",
83
+ "schema": "ContactPage",
84
+ "shell": "MarketingShell",
85
+ "chrome": "on",
86
+ "sections": [
87
+ {
88
+ "type": "hero",
89
+ "component": "Hero"
90
+ },
91
+ {
92
+ "type": "contact-form",
93
+ "component": "ContactForm"
94
+ },
95
+ {
96
+ "type": "cta",
97
+ "component": "CTA"
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "route": "/faq",
103
+ "pageType": "FAQPage",
104
+ "schema": "FAQPage",
105
+ "shell": "MarketingShell",
106
+ "chrome": "on",
107
+ "sections": [
108
+ {
109
+ "type": "faq",
110
+ "component": "FAQ"
111
+ },
112
+ {
113
+ "type": "cta",
114
+ "component": "CTA"
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "route": "/returns",
120
+ "pageType": "ReturnsPolicyPage",
121
+ "schema": "ReturnsPolicyPage",
122
+ "shell": "MarketingShell",
123
+ "chrome": "on",
124
+ "sections": [
125
+ {
126
+ "type": "document-chassis",
127
+ "component": "DocumentChassis"
128
+ }
129
+ ]
130
+ },
131
+ {
132
+ "route": "/cancellation",
133
+ "pageType": "CancellationPolicyPage",
134
+ "schema": "CancellationPolicyPage",
135
+ "shell": "MarketingShell",
136
+ "chrome": "on",
137
+ "sections": [
138
+ {
139
+ "type": "document-chassis",
140
+ "component": "DocumentChassis"
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "route": "/shipping",
146
+ "pageType": "ShippingPolicyPage",
147
+ "schema": "ShippingPolicyPage",
148
+ "shell": "MarketingShell",
149
+ "chrome": "on",
150
+ "sections": [
151
+ {
152
+ "type": "document-chassis",
153
+ "component": "DocumentChassis"
154
+ }
155
+ ]
156
+ },
157
+ {
158
+ "route": "/privacy",
159
+ "pageType": "PrivacyPage",
160
+ "schema": "PrivacyPage",
161
+ "shell": "MarketingShell",
162
+ "chrome": "on",
163
+ "sections": [
164
+ {
165
+ "type": "document-chassis",
166
+ "component": "DocumentChassis"
167
+ }
168
+ ]
169
+ },
170
+ {
171
+ "route": "/terms",
172
+ "pageType": "TermsPage",
173
+ "schema": "TermsPage",
174
+ "shell": "MarketingShell",
175
+ "chrome": "on",
176
+ "sections": [
177
+ {
178
+ "type": "document-chassis",
179
+ "component": "DocumentChassis"
180
+ }
181
+ ]
182
+ },
183
+ {
184
+ "route": "/account",
185
+ "pageType": null,
186
+ "schema": null,
187
+ "shell": "MarketingShell",
188
+ "chrome": "on",
189
+ "sections": []
190
+ },
191
+ {
192
+ "route": "/purchase/success",
193
+ "pageType": null,
194
+ "schema": null,
195
+ "shell": "MarketingShell",
196
+ "chrome": "on",
197
+ "sections": []
198
+ },
199
+ {
200
+ "route": "/purchase/cancel",
201
+ "pageType": null,
202
+ "schema": null,
203
+ "shell": "MarketingShell",
204
+ "chrome": "on",
205
+ "sections": []
206
+ },
207
+ {
208
+ "route": "/meet",
209
+ "pageType": null,
210
+ "schema": null,
211
+ "shell": "MarketingShell",
212
+ "chrome": "on",
213
+ "sections": []
214
+ },
215
+ {
216
+ "route": "/meet/[slug]",
217
+ "pageType": null,
218
+ "schema": null,
219
+ "shell": "MarketingShell",
220
+ "chrome": "on",
221
+ "sections": []
222
+ },
223
+ {
224
+ "route": "/meet/confirmed",
225
+ "pageType": null,
226
+ "schema": null,
227
+ "shell": "MarketingShell",
228
+ "chrome": "on",
229
+ "sections": []
230
+ },
231
+ {
232
+ "route": "/appointments",
233
+ "pageType": null,
234
+ "schema": null,
235
+ "shell": "MarketingShell",
236
+ "chrome": "on",
237
+ "sections": []
238
+ }
239
+ ]
240
+ }