create-ailk 0.6.1 → 0.8.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 (324) hide show
  1. package/README.md +87 -14
  2. package/component-catalog.json +735 -95
  3. package/component-catalog.md +13 -7
  4. package/dist/add-module-core.d.ts +22 -0
  5. package/dist/add-module-core.js +50 -0
  6. package/dist/add-module.d.ts +89 -0
  7. package/dist/add-module.js +334 -0
  8. package/dist/category-profile.d.ts +126 -0
  9. package/dist/category-profile.js +262 -0
  10. package/dist/cli.js +89 -29
  11. package/dist/index.d.ts +4 -2
  12. package/dist/index.js +6 -1
  13. package/dist/lib/extract-module-bundle.d.ts +56 -1
  14. package/dist/lib/extract-module-bundle.js +170 -14
  15. package/dist/lib/license-key-files.d.ts +15 -0
  16. package/dist/lib/license-key-files.js +102 -0
  17. package/dist/lib/module-license-gate.d.ts +79 -0
  18. package/dist/lib/module-license-gate.js +160 -12
  19. package/dist/lib/module-tier.d.ts +45 -16
  20. package/dist/lib/module-tier.js +76 -0
  21. package/dist/lib/pro-callout.d.ts +16 -10
  22. package/dist/lib/pro-callout.js +34 -3
  23. package/dist/license-set.d.ts +34 -0
  24. package/dist/license-set.js +194 -0
  25. package/dist/module-architecture.d.ts +20 -0
  26. package/dist/module-architecture.js +77 -19
  27. package/dist/modules/commerce/0.6.1.tar.gz +0 -0
  28. package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
  29. package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
  30. package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
  31. package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
  32. package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
  33. package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
  34. package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
  35. package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
  36. package/dist/modules/workspace/0.6.1.tar.gz +0 -0
  37. package/dist/parse-args.d.ts +85 -10
  38. package/dist/parse-args.js +227 -15
  39. package/dist/programmatic.d.ts +81 -5
  40. package/dist/programmatic.js +291 -32
  41. package/dist/site-chrome.d.ts +18 -7
  42. package/dist/site-chrome.js +32 -14
  43. package/dist/site-roster.d.ts +127 -0
  44. package/dist/site-roster.js +499 -0
  45. package/dist/starter-grid.d.ts +216 -0
  46. package/dist/starter-grid.js +449 -0
  47. package/dist/surfaces.d.ts +20 -7
  48. package/dist/surfaces.js +204 -24
  49. package/dist/sync-routes.d.ts +9 -0
  50. package/dist/sync-routes.js +2 -2
  51. package/dist/template-manifest.d.ts +94 -19
  52. package/dist/template-manifest.js +170 -289
  53. package/dist/template-names.d.ts +14 -12
  54. package/dist/template-names.js +13 -17
  55. package/package.json +6 -4
  56. package/site-templates/_base/content/en/BookCall/book-call.mdx +52 -0
  57. package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
  58. package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
  59. package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
  60. package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
  61. package/site-templates/_base/content/en/GlossaryList/glossary.mdx +65 -0
  62. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +67 -0
  63. package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
  64. package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
  65. package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
  66. package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
  67. package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
  68. package/site-templates/_base/content/en/Pricing/pricing.mdx +71 -62
  69. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +17 -3
  70. package/site-templates/_base/content/en/TermsPage/terms.mdx +2 -3
  71. package/site-templates/_base/content/en/UseCase/persona-1.mdx +69 -0
  72. package/site-templates/_base/content/en/UseCase/persona-2.mdx +69 -0
  73. package/site-templates/_base/content/en/UseCase/persona-3.mdx +69 -0
  74. package/site-templates/designs/minimalism/DESIGN.md +162 -0
  75. package/site-templates/designs/standard/DESIGN.md +167 -0
  76. package/site-templates/marketing-site/DESIGN.md +59 -40
  77. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +376 -57
  78. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +230 -90
  79. package/site-templates/marketing-site/ailk-template.json +1 -0
  80. package/site-templates/marketing-site-free/DESIGN.md +59 -40
  81. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +323 -63
  82. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +323 -113
  83. package/site-templates/marketing-site-free/ailk-template.json +3 -2
  84. package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
  85. package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
  86. package/site-templates/minimalism-site/DESIGN.md +54 -40
  87. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +246 -19
  88. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +173 -51
  89. package/site-templates/minimalism-site/ailk-template.json +3 -2
  90. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +52 -0
  91. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +3 -37
  92. package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  93. package/site-templates/saas-product/DESIGN.md +59 -40
  94. package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
  95. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +369 -0
  96. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +302 -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/shapes/local-business-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  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 +362 -0
  109. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +300 -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/shapes/organization-service/content/en/Service/first-engagement.mdx +38 -0
  117. package/site-templates/shapes/organization-service/content/en/Service/second-engagement.mdx +38 -0
  118. package/site-templates/shapes/organization-service/content/en/Service/third-engagement.mdx +38 -0
  119. package/site-templates/shapes/organization-service/content/en/ServicesList/services.mdx +72 -0
  120. package/site-templates/shapes/organization-service/provenance.json +4 -0
  121. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +369 -0
  122. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +299 -0
  123. package/site-templates/shapes/person-service/ailk-template.json +10 -0
  124. package/site-templates/shapes/person-service/content/_site.mdx +85 -0
  125. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
  126. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
  127. package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  128. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +169 -0
  129. package/site-templates/shapes/person-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  130. package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
  131. package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
  132. package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
  133. package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
  134. package/site-templates/shapes/person-service/provenance.json +4 -0
  135. package/templates/.claude/settings.json +15 -0
  136. package/templates/.claude/skills/README.md +10 -9
  137. package/templates/.claude/skills/{scaffold-auth → add-auth}/SKILL.md +7 -7
  138. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/env-vars.md +2 -2
  139. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/oauth-app-setup.md +3 -3
  140. package/templates/.claude/skills/{scaffold-page → add-page}/SKILL.md +76 -62
  141. package/templates/.claude/skills/add-page/references/page-types.md +115 -0
  142. package/templates/.claude/skills/{scaffold-page → add-page}/templates/content.mdx.tmpl +4 -4
  143. package/templates/.claude/skills/{scaffold-page → add-page}/templates/route.tsx.tmpl +1 -1
  144. package/templates/.claude/skills/{audit-site → check-site}/SKILL.md +16 -17
  145. package/templates/.claude/skills/{audit-site → check-site}/references/common-errors.md +3 -3
  146. package/templates/.claude/skills/{audit-site → check-site}/references/findings-glossary.md +16 -14
  147. package/templates/.claude/skills/{audit-site → check-site}/references/severity-levels.md +1 -1
  148. package/templates/.claude/skills/fill-page/SKILL.md +180 -0
  149. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +80 -0
  150. package/templates/.claude/skills/fill-page/references/section-sources.md +41 -0
  151. package/templates/.claude/skills/setup-database/SKILL.md +156 -0
  152. package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
  153. package/templates/.claude/skills/{provision-config → setup-deploy}/SKILL.md +73 -41
  154. package/templates/.claude/skills/{provision-config → setup-deploy}/references/env-vars-template.md +21 -30
  155. package/templates/.claude/skills/setup-deploy/references/runbook-template.md +204 -0
  156. package/templates/.claude/skills/{provision-config → setup-deploy}/references/vercel-json-template.md +1 -1
  157. package/templates/.claude/skills/upgrade-plan/SKILL.md +117 -0
  158. package/templates/.claude/skills/upgrade-plan/references/options.md +24 -0
  159. package/templates/.claude/skills/upgrade-plan/scripts/upgrade-plan.ts +527 -0
  160. package/templates/.github/workflows/ci.yml +5 -0
  161. package/templates/CLAUDE.md +8 -2
  162. package/templates/DESIGN.md +56 -44
  163. package/templates/README.md +116 -46
  164. package/templates/apps/api/.env.example +2 -1
  165. package/templates/apps/api/CLAUDE.md +3 -2
  166. package/templates/apps/api/package.json +1 -1
  167. package/templates/apps/api/src/config/__tests__/index.test.ts +146 -10
  168. package/templates/apps/api/src/config/index.ts +46 -14
  169. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
  170. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
  171. package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
  172. package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
  173. package/templates/apps/api/src/lib/license-key-store.ts +45 -0
  174. package/templates/apps/api/src/lib/site.ts +5 -3
  175. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +97 -0
  176. package/templates/apps/api/src/middleware/auth.ts +9 -0
  177. package/templates/apps/api/src/openapi/spec.ts +63 -12
  178. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +127 -5
  179. package/templates/apps/api/src/routes/content/get-page.ts +86 -2
  180. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
  181. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
  182. package/templates/apps/api/src/routes/leads/index.ts +46 -1
  183. package/templates/apps/api/src/server.ts +13 -0
  184. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
  185. package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
  186. package/templates/apps/api/src/services/lead-routing.ts +140 -30
  187. package/templates/apps/api/src/services/leads-inbox.ts +48 -11
  188. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +75 -1
  189. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +57 -9
  190. package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
  191. package/templates/apps/mcp/package.json +2 -1
  192. package/templates/apps/mcp/src/index.ts +7 -0
  193. package/templates/apps/mcp/src/lib/audit-single-page.ts +36 -10
  194. package/templates/apps/mcp/src/lib/license-key-store.ts +45 -0
  195. package/templates/apps/mcp/src/tools/create_project.ts +21 -6
  196. package/templates/apps/web/__tests__/setup.ts +18 -0
  197. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +10 -2
  198. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +2 -2
  199. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +10 -4
  200. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +22 -14
  201. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +26 -18
  202. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +12 -4
  203. package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +35 -4
  204. package/templates/apps/web/app/[locale]/[slug]/page.tsx +49 -9
  205. package/templates/apps/web/app/[locale]/book-a-call/page.tsx +50 -0
  206. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +3 -3
  207. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +3 -3
  208. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +3 -4
  209. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +67 -29
  210. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +94 -11
  211. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
  212. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
  213. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +228 -86
  214. package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
  215. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
  216. package/templates/apps/web/app/[locale]/contact/page.tsx +115 -7
  217. package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
  218. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +3 -3
  219. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +3 -4
  220. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +4 -5
  221. package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
  222. package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
  223. package/templates/apps/web/app/[locale]/glossary/page.tsx +50 -0
  224. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
  225. package/templates/apps/web/app/[locale]/how-to/page.tsx +25 -15
  226. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +3 -3
  227. package/templates/apps/web/app/[locale]/layout.tsx +146 -52
  228. package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
  229. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
  230. package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
  231. package/templates/apps/web/app/[locale]/newsletter/page.tsx +142 -0
  232. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +3 -3
  233. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
  234. package/templates/apps/web/app/[locale]/portfolio/page.tsx +49 -0
  235. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +3 -3
  236. package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +4 -5
  237. package/templates/apps/web/app/[locale]/{cancellation → purchase-policy}/page.tsx +15 -10
  238. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +4 -5
  239. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +3 -3
  240. package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +14 -1
  241. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
  242. package/templates/apps/web/app/[locale]/software/page.tsx +25 -15
  243. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
  244. package/templates/apps/web/app/[locale]/tech-articles/page.tsx +25 -15
  245. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +3 -4
  246. package/templates/apps/web/app/[locale]/use-cases/[slug]/page.tsx +63 -0
  247. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +3 -4
  248. package/templates/apps/web/app/[locale]/use-cases/page.tsx +15 -2
  249. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
  250. package/templates/apps/web/app/[locale]/whitepapers/page.tsx +25 -15
  251. package/templates/apps/web/app/error-fallback.tsx +17 -45
  252. package/templates/apps/web/app/not-found.tsx +14 -38
  253. package/templates/apps/web/app/og/route.tsx +6 -0
  254. package/templates/apps/web/eslint.config.mjs +3 -0
  255. package/templates/apps/web/instrumentation.ts +14 -0
  256. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +38 -0
  257. package/templates/apps/web/lib/license-key-store.ts +52 -0
  258. package/templates/apps/web/lib/nav-config.ts +82 -18
  259. package/templates/apps/web/lib/prisma-for-auth.ts +9 -6
  260. package/templates/apps/web/lib/site-brand.tsx +1 -1
  261. package/templates/apps/web/lib/site-chrome.ts +3 -3
  262. package/templates/apps/web/lib/site-identity.ts +148 -0
  263. package/templates/apps/web/lib/site-theme.ts +11 -0
  264. package/templates/apps/web/messages/en.json +78 -37
  265. package/templates/apps/web/public/android-chrome-192x192.png +0 -0
  266. package/templates/apps/web/public/android-chrome-512x512.png +0 -0
  267. package/templates/apps/web/public/apple-touch-icon.png +0 -0
  268. package/templates/apps/web/public/favicon-16x16.png +0 -0
  269. package/templates/apps/web/public/favicon-32x32.png +0 -0
  270. package/templates/apps/web/public/favicon.ico +0 -0
  271. package/templates/apps/web/public/favicon.svg +3 -3
  272. package/templates/apps/web/public/logomark.svg +6 -3
  273. package/templates/apps/web/public/logos/ai-launch-kit-light.svg +4 -0
  274. package/templates/apps/web/public/logos/ai-launch-kit.svg +4 -0
  275. package/templates/apps/web/public/logos/atomic-agent-light.svg +4 -0
  276. package/templates/apps/web/public/logos/atomic-agent.svg +4 -0
  277. package/templates/apps/web/public/logos/salessmyth-light.svg +4 -0
  278. package/templates/apps/web/public/logos/salessmyth.svg +4 -0
  279. package/templates/apps/web/public/site.webmanifest +4 -4
  280. package/templates/apps/web/public/wordmark-light.svg +4 -0
  281. package/templates/apps/web/public/wordmark.svg +3 -3
  282. package/templates/apps/web/security-headers.config.ts +5 -1
  283. package/templates/content/_site.mdx +25 -0
  284. package/templates/content/en/AboutPage/about.mdx +150 -144
  285. package/templates/content/en/BlogList/blog.mdx +126 -0
  286. package/templates/content/en/ContactPage/contact.mdx +21 -92
  287. package/templates/content/en/FAQPage/faq.mdx +86 -57
  288. package/templates/content/en/HomePage/home.mdx +268 -217
  289. package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +181 -0
  290. package/templates/content/en/UseCasesList/use-cases.mdx +170 -0
  291. package/templates/database/CHANGELOG.md +14 -0
  292. package/templates/database/package.json +1 -1
  293. package/templates/package.json +3 -1
  294. package/templates/tools/lint-architecture.ts +315 -0
  295. package/templates/tools/tsconfig.json +14 -0
  296. package/versions.json +33 -33
  297. package/site-templates/simple-service/DESIGN.md +0 -148
  298. package/site-templates/simple-service/TEMPLATE-MANIFEST.json +0 -240
  299. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -278
  300. package/site-templates/simple-service/ailk-template.json +0 -10
  301. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -67
  302. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
  303. package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
  304. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
  305. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
  306. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
  307. package/site-templates/simple-service/provenance.json +0 -4
  308. package/templates/.claude/skills/add-schema/SKILL.md +0 -277
  309. package/templates/.claude/skills/add-schema/references/conflict-handling.md +0 -200
  310. package/templates/.claude/skills/add-schema/references/file-finding.md +0 -123
  311. package/templates/.claude/skills/add-schema/references/schema-types.md +0 -234
  312. package/templates/.claude/skills/provision-config/references/runbook-template.md +0 -248
  313. package/templates/.claude/skills/scaffold-page/references/page-types.md +0 -169
  314. package/templates/.claude/skills/suggest-site-pages/SKILL.md +0 -242
  315. package/templates/.claude/skills/suggest-site-pages/references/categories.md +0 -287
  316. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -150
  317. package/templates/apps/web/app/[locale]/returns/page.tsx +0 -44
  318. package/templates/apps/web/app/[locale]/shipping/page.tsx +0 -44
  319. package/templates/content/en/CancellationPolicyPage/cancellation.mdx +0 -108
  320. package/templates/content/en/LandingPage/blog.mdx +0 -83
  321. package/templates/content/en/LandingPage/features.mdx +0 -103
  322. package/templates/content/en/LandingPage/how-it-works.mdx +0 -143
  323. package/templates/content/en/ReturnsPolicyPage/returns.mdx +0 -108
  324. package/templates/content/en/ShippingPolicyPage/shipping.mdx +0 -108
@@ -1,6 +1,6 @@
1
1
  ---
2
- name: SaaS product (Pro) — saas-product
3
- description: The multi-tenant SaaS template — registered and installable, its visual design still to come.
2
+ name: Standard
3
+ description: The standard design — the black-on-white foundation any shape wears by default: full navigation, a multi-column footer, the document-scroll home.
4
4
  colors:
5
5
  bg: "#ffffff"
6
6
  fg: "#000000"
@@ -18,20 +18,21 @@ colors:
18
18
  typography:
19
19
  display:
20
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"
21
+ fontSize: "3.5rem"
22
+ fontWeight: 700
23
+ lineHeight: 1.1
24
+ letterSpacing: "normal"
25
25
  heading-section:
26
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"
27
+ fontSize: "3rem"
28
+ fontWeight: 700
29
+ lineHeight: 1.1
30
+ letterSpacing: "normal"
31
31
  heading-item:
32
- fontSize: "1.25rem"
33
- fontWeight: 600
32
+ fontSize: "2rem"
33
+ fontWeight: 700
34
34
  lineHeight: 1.375
35
+ letterSpacing: "normal"
35
36
  body:
36
37
  fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
37
38
  fontSize: "1.125rem"
@@ -43,32 +44,43 @@ typography:
43
44
  lineHeight: 1.4
44
45
  letterSpacing: "0.05em"
45
46
  rounded:
46
- button: "0.25rem"
47
+ button: "0.5rem"
47
48
  card: "0.75rem"
48
49
  spacing:
49
- section: "4rem"
50
+ section: "7rem"
51
+ section-mobile: "4rem"
50
52
  card: "1.5rem"
51
53
  grid: "1.5rem"
52
54
  container: "1280px"
55
+ measure: "36rem"
53
56
  ---
54
57
 
55
58
  <!--
56
59
  Source template: saas-product
60
+ Design: standard
57
61
  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.
62
+
63
+ This is the `standard` design's DESIGN.md. Its one authored source is
64
+ create-ailk's site-templates/designs/standard/DESIGN.md; every template on
65
+ this design ships a copy of it that differs only in the "Source template"
66
+ line above, and a template installed with `--template <name>` replaces the
67
+ base scaffold's DESIGN.md with its own. The impeccable design skill reads
68
+ it at the start of every design session, so an agent building a new page
69
+ stays on-system.
70
+ Edit the canonical file, never a copy — a test holds every copy to it.
61
71
 
62
72
  The tokens above describe what the site RENDERS today. Colours come from
63
73
  content/_site.mdx (`theme.colors`); type, radius and spacing are platform
64
74
  defaults a site cannot override yet — see "Where this is heading" below.
65
75
  -->
66
76
 
67
- # SaaS product (Pro)
77
+ # Standard
68
78
 
69
79
  ## Overview
70
80
 
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.
81
+ The foundation reads like a well-made wireframe: nothing on the page but the words, black on white, with rules where other sites use shadows and colour. It is the look of a site whose owner has not chosen a brand yet and does not pretend otherwise — every placeholder reads as a placeholder, and the structure of the argument is what the visitor sees. A brand is applied on top of it; it is not one.
82
+
83
+ Every page is composed from the AI Launch Kit component library (`@working-theory/ui`). Nothing is hand-built: a page is a list of registered sections, each with a bounded set of variants. Each section is one full-width band with a lot of air around it.
72
84
 
73
85
  ## Colors
74
86
 
@@ -92,31 +104,31 @@ System sans throughout; no web font.
92
104
 
93
105
  ### Hierarchy
94
106
 
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 |
107
+ | Role | Size | Weight | Notes |
108
+ | --------------- | -------- | ------ | ------------------------------------------------------------------------------------- |
109
+ | Hero headline | 3.5rem | 700 | Normal tracking, line-height 1.1; 2.5rem below 1024px |
110
+ | Section heading | 3rem | 700 | Normal tracking, line-height 1.1; 2.25rem below 1024px, always under the hero |
111
+ | Item heading | 2rem | 700 | Card, feature and step titles; 1.5rem below 1024px |
112
+ | Body | 1.125rem | 400 | `#333333`, line-height 1.5; section copy capped at 36rem (about 70 characters a line) |
113
+ | Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
102
114
 
103
- Measured from the rendered scaffold (1440px wide), not transcribed from tokens.
115
+ Measured from the rendered scaffold (1440px and 390px wide), not transcribed from tokens. Bold headings at normal tracking follow the foundation's pinned direction (#6493).
104
116
 
105
117
  The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
106
118
 
107
119
  ## Layout
108
120
 
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.
121
+ Full navigation; a multi-column footer; the default home. The home-only announcement banner is off by default (`layout.announcementBanner`). Every page this site carries is listed in its roster of record, `.ailk-site-manifest.json` at the site root. Shared foundation: a 1280px container, sections at 7rem (4rem below 1024px), card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
110
122
 
111
123
  ## Shapes
112
124
 
113
- Two radii today: buttons at 0.25rem, cards and outlined boxes at 0.75rem. Headed toward square corners — see below.
125
+ Square corners everywhere (`theme.corners: square`) — buttons, cards, the auth card, image placeholders; the tokens above are the base foundation's defaults a site overrides.
114
126
 
115
127
  ## Components
116
128
 
117
129
  ### Buttons
118
130
 
119
- Primary: black fill, white label, 0.25rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
131
+ Primary: black fill, white label, 0.5rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
120
132
 
121
133
  ### Cards / Containers
122
134
 
@@ -124,20 +136,22 @@ White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding.
124
136
 
125
137
  ### Navigation
126
138
 
127
- Base navigation, unchanged.
139
+ Full navigation: wordmark left, page links, an outlined and a filled button at the far right. A black hairline separates it from the page. Page links are 16px at weight 400. The two buttons are 42px tall on a 44px touch target and keep the 0.5rem button radius; square corners arrive with the platform radius change below, not in the nav alone (#6508). The Product link opens, on hover or keyboard, a 640px two-column panel whose items each show an icon, a title and a one-line description.
128
140
 
129
141
  ## Where this is heading
130
142
 
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.
143
+ The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. The four traits this section used to list as blocked now ship as settings, so the rendered site matches the reference:
132
144
 
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 |
145
+ | Trait | How it is set |
146
+ | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
147
+ | Square corners on buttons, cards and inputs | `theme.corners: square` in `_site.mdx` |
148
+ | Section label in sentence case, bold, no tracking | `theme.eyebrowCase: sentence` |
149
+ | Solid grey image placeholders, no outline | `theme.placeholders: fill` |
150
+ | Bare check and cross marks, no circle badge | `theme.checkmarks: plain` |
151
+ | Plain, uncarded feature and step items | per section: `itemStyle: plain`, and `variant: steps` for an image beside a numbered list |
152
+ | A left hero whose headline wraps at half the container | `measure: narrow` on the hero (pricing); `gapBelow: tight` where a list follows the hero directly |
153
+ | A three-up post grid on the blog index | `blog-list` `variant: grid` (cover · date · read time · title · excerpt · Read more) |
154
+ | A plans section that leads its page | drop the hero; the pricing section owns the `<h1>` (`ownsPageTitle`) |
141
155
 
142
156
  ## Do's and Don'ts
143
157
 
@@ -146,3 +160,8 @@ The foundation's pinned direction is the pacing of a classic wireframe marketing
146
160
  - **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
147
161
  - **Don't** replace a black rule with a shadow or a grey fill.
148
162
  - **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
163
+
164
+ ## Revisions
165
+
166
+ - **2026-09-24 — tile hover is outline-only (operator ruling, /build-starter live pass, #6687).** A comparison tile (`items` in `variant: tile`) hovers by shifting its border to the accent only — no lift, no glow — matching the Positionary `/alternatives` ruling of 2026-08-29. Expressed as the bounded `tileHover: "outline"` option (Card `wash-outline`); the library default `lift` is unchanged for every other site.
167
+ - **2026-09-25 — the before-after section's rulings (operator, /build-starter live pass, #6687).** One layout, not two variants: a panel body is an image or rows of content under the same label bar. The label bar is the tone's fill (brand → black bar, white text) at the heading-4 role; a `neutral` panel keeps a white bar. The view selector is underline tabs with the underline under the current tab only (no full-width baseline), active black, inactive muted, black on hover. The pager is a ghost "‹ Previous" at the left edge and "Next ›" at the right edge. The catalyst column carries no icon tile — it starts at the arrow, or at an image when one is set. No back-to-all link and no tag chips on the seed pages.
@@ -22,13 +22,21 @@
22
22
 
23
23
  ## 2. Roster — the base rows, as the registry declares them
24
24
 
25
- `saas-product` reuses `TEMPLATE_BASE_ROSTER` (`template-manifest.ts`) and declares no rows of its own. The ten base routes:
25
+ `saas-product` reuses `TEMPLATE_BASE_ROSTER` (`template-manifest.ts`) plus the two portfolio rows every paid roster appends (`PORTFOLIO_ROWS`, #6687 — operator disposition 2026-09-24, Pro and up). The ten base routes:
26
26
 
27
27
  ```
28
28
  / · /how-it-works · /features · /pricing · /about
29
29
  /faq · /contact · /sign-in · /privacy · /terms
30
30
  ```
31
31
 
32
+ The portfolio rows — before/after project comparisons; the detail row's `contentDir` installs the seeds (#6646 D1):
33
+
34
+ ```
35
+ /portfolio PortfolioList · schema CollectionPage — the hub on the /alternatives stack
36
+ /portfolio/<slug> PortfolioItem · schema WebPage + CreativeWork — one `before-after` section per comparison
37
+ (seed pages sample-one · sample-two · sample-three · sample-four, `_base` layer)
38
+ ```
39
+
32
40
  Module-contributed rows arrive from `MODULE_SLICES[*].pageContributions` and are listed here so the page set reads as one:
33
41
 
34
42
  ```
@@ -0,0 +1,369 @@
1
+ {
2
+ "template": "local-business-service",
3
+ "requires": ["marketing"],
4
+ "categories": [
5
+ "hvac",
6
+ "roofing",
7
+ "plumbing",
8
+ "electrical",
9
+ "landscaping",
10
+ "auto-repair"
11
+ ],
12
+ "shape": "local-business-service",
13
+ "design": "standard",
14
+ "generatedHash": "5a75067bc0b4f11911289cef648460e7fdb302b746900f7e1d37e004d0bd1188",
15
+ "layout": {
16
+ "nav": "full",
17
+ "footer": "columns",
18
+ "announcementBanner": false,
19
+ "home": "default"
20
+ },
21
+ "theme": {
22
+ "corners": "square",
23
+ "eyebrowCase": "sentence",
24
+ "placeholders": "fill",
25
+ "checkmarks": "plain",
26
+ "colors": {
27
+ "light": {
28
+ "bg": "#ffffff",
29
+ "bgMuted": "#ffffff",
30
+ "surface": "#ffffff",
31
+ "border": "#000000",
32
+ "text": "#000000",
33
+ "textMuted": "#333333",
34
+ "primary": "#000000",
35
+ "primaryFg": "#ffffff",
36
+ "accent": "#000000"
37
+ },
38
+ "dark": {
39
+ "bg": "#000000",
40
+ "bgMuted": "#000000",
41
+ "surface": "#000000",
42
+ "border": "#ffffff",
43
+ "text": "#ffffff",
44
+ "textMuted": "#cccccc",
45
+ "primary": "#ffffff",
46
+ "primaryFg": "#000000",
47
+ "accent": "#ffffff"
48
+ }
49
+ }
50
+ },
51
+ "rows": [
52
+ {
53
+ "route": "/",
54
+ "kind": "page",
55
+ "pageType": "HomePage",
56
+ "schema": "HomePage",
57
+ "shell": "MarketingShell",
58
+ "chrome": "on",
59
+ "sections": [
60
+ {
61
+ "type": "hero",
62
+ "component": "Hero"
63
+ },
64
+ {
65
+ "type": "items",
66
+ "component": "Items",
67
+ "options": {
68
+ "columns": 3
69
+ }
70
+ },
71
+ {
72
+ "type": "cta",
73
+ "component": "CTA"
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ "route": "/services",
79
+ "kind": "page",
80
+ "pageType": "ServicesList",
81
+ "schema": "ServicesList",
82
+ "shell": "MarketingShell",
83
+ "chrome": "on",
84
+ "sections": [
85
+ {
86
+ "type": "hero",
87
+ "component": "Hero"
88
+ },
89
+ {
90
+ "type": "items",
91
+ "component": "Items",
92
+ "options": {
93
+ "columns": 3
94
+ }
95
+ },
96
+ {
97
+ "type": "cta",
98
+ "component": "CTA"
99
+ }
100
+ ]
101
+ },
102
+ {
103
+ "route": "/services/[slug]",
104
+ "kind": "page",
105
+ "contentDir": "content/en/Service",
106
+ "seeds": [
107
+ "content/en/Service/first-job.mdx",
108
+ "content/en/Service/second-job.mdx",
109
+ "content/en/Service/third-job.mdx"
110
+ ],
111
+ "pageType": "Service",
112
+ "schema": "Service",
113
+ "shell": "MarketingShell",
114
+ "chrome": "on",
115
+ "sections": []
116
+ },
117
+ {
118
+ "route": "/about",
119
+ "kind": "page",
120
+ "pageType": "AboutPage",
121
+ "schema": "AboutPage",
122
+ "shell": "MarketingShell",
123
+ "chrome": "on",
124
+ "sections": [
125
+ {
126
+ "type": "content-block",
127
+ "component": "ContentBlock"
128
+ },
129
+ {
130
+ "type": "cta",
131
+ "component": "CTA"
132
+ }
133
+ ]
134
+ },
135
+ {
136
+ "route": "/contact",
137
+ "kind": "page",
138
+ "pageType": "ContactPage",
139
+ "schema": "ContactPage",
140
+ "shell": "MarketingShell",
141
+ "chrome": "on",
142
+ "sections": [
143
+ {
144
+ "type": "hero",
145
+ "component": "Hero"
146
+ }
147
+ ]
148
+ },
149
+ {
150
+ "route": "/faq",
151
+ "kind": "page",
152
+ "pageType": "FAQPage",
153
+ "schema": "FAQPage",
154
+ "shell": "MarketingShell",
155
+ "chrome": "on",
156
+ "sections": [
157
+ {
158
+ "type": "hero",
159
+ "component": "Hero",
160
+ "options": {
161
+ "gapBelow": "tight"
162
+ }
163
+ },
164
+ {
165
+ "type": "faq",
166
+ "component": "FAQ"
167
+ },
168
+ {
169
+ "type": "faq",
170
+ "component": "FAQ"
171
+ }
172
+ ]
173
+ },
174
+ {
175
+ "route": "/glossary",
176
+ "kind": "page",
177
+ "pageType": "GlossaryList",
178
+ "schema": "GlossaryList",
179
+ "shell": "MarketingShell",
180
+ "chrome": "on",
181
+ "sections": [
182
+ {
183
+ "type": "hero",
184
+ "component": "Hero"
185
+ },
186
+ {
187
+ "type": "glossary-index",
188
+ "component": "GlossaryIndex"
189
+ }
190
+ ]
191
+ },
192
+ {
193
+ "route": "/newsletter",
194
+ "kind": "page",
195
+ "pageType": "NewsletterSignup",
196
+ "schema": "NewsletterSignup",
197
+ "shell": "MarketingShell",
198
+ "chrome": "on",
199
+ "sections": [
200
+ {
201
+ "type": "hero",
202
+ "component": "Hero"
203
+ },
204
+ {
205
+ "type": "faq",
206
+ "component": "FAQ"
207
+ }
208
+ ]
209
+ },
210
+ {
211
+ "route": "/book-a-call",
212
+ "kind": "page",
213
+ "pageType": "BookCall",
214
+ "schema": "BookCall",
215
+ "shell": "MarketingShell",
216
+ "chrome": "on",
217
+ "sections": [
218
+ {
219
+ "type": "hero",
220
+ "component": "Hero"
221
+ },
222
+ {
223
+ "type": "items",
224
+ "component": "Items",
225
+ "options": {
226
+ "columns": 3
227
+ }
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "route": "/purchase-policy",
233
+ "kind": "page",
234
+ "pageType": "PurchasePolicyPage",
235
+ "schema": "PurchasePolicyPage",
236
+ "shell": "MarketingShell",
237
+ "chrome": "on",
238
+ "sections": [
239
+ {
240
+ "type": "document-chassis",
241
+ "component": "DocumentChassis",
242
+ "options": {
243
+ "layout": "article"
244
+ }
245
+ }
246
+ ]
247
+ },
248
+ {
249
+ "route": "/privacy",
250
+ "kind": "page",
251
+ "pageType": "PrivacyPage",
252
+ "schema": "PrivacyPage",
253
+ "shell": "MarketingShell",
254
+ "chrome": "on",
255
+ "sections": [
256
+ {
257
+ "type": "document-chassis",
258
+ "component": "DocumentChassis",
259
+ "options": {
260
+ "layout": "article"
261
+ }
262
+ }
263
+ ]
264
+ },
265
+ {
266
+ "route": "/terms",
267
+ "kind": "page",
268
+ "pageType": "TermsPage",
269
+ "schema": "TermsPage",
270
+ "shell": "MarketingShell",
271
+ "chrome": "on",
272
+ "sections": [
273
+ {
274
+ "type": "document-chassis",
275
+ "component": "DocumentChassis",
276
+ "options": {
277
+ "layout": "article"
278
+ }
279
+ }
280
+ ]
281
+ },
282
+ {
283
+ "route": "/blog",
284
+ "kind": "page",
285
+ "pageType": "BlogList",
286
+ "schema": "BlogList",
287
+ "shell": "MarketingShell",
288
+ "chrome": "on",
289
+ "sections": [
290
+ {
291
+ "type": "hero",
292
+ "component": "Hero",
293
+ "options": {
294
+ "gapBelow": "tight"
295
+ }
296
+ },
297
+ {
298
+ "type": "blog-list",
299
+ "component": "BlogList"
300
+ },
301
+ {
302
+ "type": "logoCloud",
303
+ "component": "LogoCloud",
304
+ "options": {
305
+ "layout": "inline"
306
+ }
307
+ },
308
+ {
309
+ "type": "testimonials",
310
+ "component": "Testimonials"
311
+ }
312
+ ]
313
+ },
314
+ {
315
+ "route": "/portfolio",
316
+ "kind": "page",
317
+ "pageType": "PortfolioList",
318
+ "schema": "PortfolioList",
319
+ "shell": "MarketingShell",
320
+ "chrome": "on",
321
+ "sections": [
322
+ {
323
+ "type": "hero",
324
+ "component": "Hero",
325
+ "options": {
326
+ "gapBelow": "tight",
327
+ "size": "display",
328
+ "surface": "wash-secondary"
329
+ }
330
+ },
331
+ {
332
+ "type": "items",
333
+ "component": "Items",
334
+ "options": {
335
+ "surface": "none",
336
+ "columns": 2
337
+ }
338
+ },
339
+ {
340
+ "type": "cta",
341
+ "component": "CTA"
342
+ },
343
+ {
344
+ "type": "faq",
345
+ "component": "FAQ",
346
+ "options": {
347
+ "surface": "gray-100"
348
+ }
349
+ }
350
+ ]
351
+ },
352
+ {
353
+ "route": "/portfolio/[slug]",
354
+ "kind": "page",
355
+ "contentDir": "content/en/PortfolioItem",
356
+ "seeds": [
357
+ "content/en/PortfolioItem/sample-four.mdx",
358
+ "content/en/PortfolioItem/sample-one.mdx",
359
+ "content/en/PortfolioItem/sample-three.mdx",
360
+ "content/en/PortfolioItem/sample-two.mdx"
361
+ ],
362
+ "pageType": "PortfolioItem",
363
+ "schema": "PortfolioItem",
364
+ "shell": "MarketingShell",
365
+ "chrome": "on",
366
+ "sections": []
367
+ }
368
+ ]
369
+ }