create-ailk 0.20.0 → 0.22.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 (222) hide show
  1. package/README.md +21 -1
  2. package/component-catalog.json +220 -8
  3. package/component-catalog.md +21 -9
  4. package/dist/add-module.js +9 -5
  5. package/dist/apply-design.d.ts +9 -0
  6. package/dist/apply-design.js +78 -31
  7. package/dist/derive-architecture.d.ts +8 -1
  8. package/dist/derive-architecture.js +38 -3
  9. package/dist/design-home.d.ts +54 -11
  10. package/dist/design-home.js +160 -22
  11. package/dist/design-package.js +7 -2
  12. package/dist/lib/design-checks.d.ts +6 -1
  13. package/dist/lib/design-checks.js +23 -2
  14. package/dist/lib/env-catalog.js +5 -1
  15. package/dist/module-architecture.js +4 -2
  16. package/dist/programmatic.js +63 -25
  17. package/dist/site-chrome.d.ts +8 -0
  18. package/dist/site-chrome.js +17 -1
  19. package/dist/site-roster.d.ts +4 -2
  20. package/dist/site-roster.js +7 -5
  21. package/dist/spoke-checkout.d.ts +39 -18
  22. package/dist/spoke-checkout.js +177 -236
  23. package/dist/starter-grid.js +16 -0
  24. package/dist/surfaces.js +30 -14
  25. package/dist/sync-routes.d.ts +28 -0
  26. package/dist/sync-routes.js +124 -1
  27. package/dist/template-record.d.ts +4 -3
  28. package/dist/template-record.js +6 -3
  29. package/dist/topology.js +25 -1
  30. package/dist/update.d.ts +6 -1
  31. package/dist/update.js +125 -18
  32. package/package.json +3 -3
  33. package/site-templates/_base/ailk-template.json +2 -2
  34. package/site-templates/_base/content/en/WorkingAgreementPage/working-agreement.mdx +78 -0
  35. package/site-templates/designs/minimalism/DESIGN.md +1 -1
  36. package/site-templates/designs/minimalism/contact/local-business-service.mdx +23 -0
  37. package/site-templates/designs/minimalism/contact/organization-product.mdx +23 -0
  38. package/site-templates/designs/minimalism/contact/organization-service.mdx +23 -0
  39. package/site-templates/designs/minimalism/contact/person-service.mdx +23 -0
  40. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +18 -1
  41. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +11 -0
  42. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +18 -1
  43. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +34 -23
  44. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +18 -1
  45. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +33 -23
  46. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +18 -1
  47. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +33 -23
  48. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +18 -1
  49. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +31 -21
  50. package/templates/README.md +26 -25
  51. package/templates/apps/api/CLAUDE.md +20 -7
  52. package/templates/apps/api/jest.config.cjs +1 -0
  53. package/templates/apps/api/src/lib/__tests__/consent-store.test.ts +19 -0
  54. package/templates/apps/api/src/lib/__tests__/flow-completion-store.test.ts +149 -0
  55. package/templates/apps/api/src/lib/consent-store.ts +28 -0
  56. package/templates/apps/api/src/lib/flow-completion-store.ts +136 -0
  57. package/templates/apps/api/src/lib/hub-sign-in-store.ts +38 -2
  58. package/templates/apps/api/src/lib/proposal-paid-store.ts +21 -4
  59. package/templates/apps/api/src/middleware/__tests__/auth.hub-session-path.test.ts +14 -3
  60. package/templates/apps/api/src/middleware/auth.ts +13 -6
  61. package/templates/apps/api/src/openapi/spec.ts +30 -3
  62. package/templates/apps/api/src/routes/auth/__tests__/hub-sign-in.test.ts +49 -0
  63. package/templates/apps/api/src/routes/auth/hub-sign-in.ts +41 -0
  64. package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +386 -0
  65. package/templates/apps/api/src/routes/consent/account.ts +266 -0
  66. package/templates/apps/api/src/routes/consent/index.ts +15 -7
  67. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +36 -0
  68. package/templates/apps/api/src/routes/content/get-page.ts +4 -0
  69. package/templates/apps/api/src/routes/leads/__tests__/magnet-completion.test.ts +515 -0
  70. package/templates/apps/api/src/routes/leads/index.ts +161 -7
  71. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +26 -0
  72. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-checkout-consent.test.ts +649 -0
  73. package/templates/apps/api/src/routes/webhooks/stripe.ts +154 -19
  74. package/templates/apps/api/src/server.ts +28 -0
  75. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +1038 -118
  76. package/templates/apps/api/src/services/__tests__/magnet-completion.test.ts +389 -0
  77. package/templates/apps/api/src/services/checkout-buyer.ts +100 -4
  78. package/templates/apps/api/src/services/consent.ts +95 -0
  79. package/templates/apps/api/src/services/lead-routing.ts +337 -8
  80. package/templates/apps/api/src/services/magnet-completion.ts +242 -0
  81. package/templates/apps/api/src/services/person.ts +40 -8
  82. package/templates/apps/api/src/services/plan-offerings.ts +59 -0
  83. package/templates/apps/api/src/services/project-listings.ts +6 -1
  84. package/templates/apps/api/src/services/public-site-resolver.ts +8 -1
  85. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +69 -61
  86. package/templates/apps/mcp/jest.config.cjs +1 -0
  87. package/templates/apps/web/.env.example +14 -0
  88. package/templates/apps/web/CLAUDE.md +139 -3
  89. package/templates/apps/web/__tests__/__mocks__/next-intl-server.ts +6 -2
  90. package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +5 -4
  91. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +5 -1
  92. package/templates/apps/web/app/[locale]/(auth)/forgot-password/page.tsx +2 -0
  93. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +3 -14
  94. package/templates/apps/web/app/[locale]/(auth)/reset-password/page.tsx +2 -0
  95. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +5 -1
  96. package/templates/apps/web/app/[locale]/(auth)/sign-in/__tests__/page.test.tsx +160 -8
  97. package/templates/apps/web/app/[locale]/(auth)/sign-in/__tests__/sign-in-card.test.tsx +12 -9
  98. package/templates/apps/web/app/[locale]/(auth)/sign-in/page.tsx +105 -2
  99. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +36 -3
  100. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-text.ts +47 -1
  101. package/templates/apps/web/app/[locale]/(auth)/sign-up/__tests__/sign-up-card.test.tsx +60 -22
  102. package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +16 -8
  103. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +85 -31
  104. package/templates/apps/web/app/[locale]/(auth)/use-auth-card-flow.ts +18 -4
  105. package/templates/apps/web/app/[locale]/(auth)/verify-email/page.tsx +3 -1
  106. package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +7 -4
  107. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/agreements-prompt.test.tsx +227 -207
  108. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/layout-sign-out.test.tsx +17 -1
  109. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/layout.test.tsx +143 -1
  110. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/new-menu.test.tsx +4 -0
  111. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +385 -89
  112. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/popups.test.tsx +5 -0
  113. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/privacy.test.tsx +44 -5
  114. package/templates/apps/web/app/[locale]/(authed)/account/account-frame.tsx +68 -34
  115. package/templates/apps/web/app/[locale]/(authed)/account/actions.ts +0 -8
  116. package/templates/apps/web/app/[locale]/(authed)/account/agreements-actions.ts +39 -151
  117. package/templates/apps/web/app/[locale]/(authed)/account/agreements-gate.ts +61 -0
  118. package/templates/apps/web/app/[locale]/(authed)/account/agreements-prompt.tsx +143 -140
  119. package/templates/apps/web/app/[locale]/(authed)/account/layout.tsx +40 -6
  120. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +68 -54
  121. package/templates/apps/web/app/[locale]/(authed)/account/privacy/page.tsx +5 -1
  122. package/templates/apps/web/app/[locale]/about/[slug]/page.tsx +46 -0
  123. package/templates/apps/web/app/[locale]/about/__tests__/about-routes.test.tsx +350 -0
  124. package/templates/apps/web/app/[locale]/about/page.tsx +83 -1
  125. package/templates/apps/web/app/[locale]/careers/[slug]/apply.actions.ts +293 -0
  126. package/templates/apps/web/app/[locale]/careers/[slug]/job-application-form.ts +115 -0
  127. package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +146 -1
  128. package/templates/apps/web/app/[locale]/careers/__tests__/apply.actions.test.ts +310 -0
  129. package/templates/apps/web/app/[locale]/careers/__tests__/job-application-form.test.ts +143 -0
  130. package/templates/apps/web/app/[locale]/careers/__tests__/job-apply-page.test.tsx +350 -0
  131. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +29 -3
  132. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +2 -2
  133. package/templates/apps/web/app/[locale]/checkout/__tests__/pages.test.tsx +139 -0
  134. package/templates/apps/web/app/[locale]/checkout/__tests__/thank-you-account.test.tsx +136 -0
  135. package/templates/apps/web/app/[locale]/checkout/thank-you/page.tsx +114 -0
  136. package/templates/apps/web/app/[locale]/checkout/unavailable/page.tsx +51 -0
  137. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +1 -1
  138. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +24 -1
  139. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +79 -4
  140. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-magnet.test.ts +138 -0
  141. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +17 -0
  142. package/templates/apps/web/app/[locale]/contact/__tests__/contact-magnet-page.test.tsx +386 -0
  143. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +504 -24
  144. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +12 -3
  145. package/templates/apps/web/app/[locale]/contact/contact-form-magnet.ts +77 -0
  146. package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +2 -0
  147. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +184 -41
  148. package/templates/apps/web/app/[locale]/contact/intake-script.ts +26 -0
  149. package/templates/apps/web/app/[locale]/contact/page.tsx +120 -16
  150. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +2 -2
  151. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +1 -1
  152. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +2 -2
  153. package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +106 -1
  154. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.invite.test.tsx +257 -0
  155. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/account-invite.actions.test.ts +69 -0
  156. package/templates/apps/web/app/[locale]/flows/[slug]/account-invite.actions.ts +35 -0
  157. package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +1 -1
  158. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
  159. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +2 -2
  160. package/templates/apps/web/app/[locale]/layout.tsx +23 -2
  161. package/templates/apps/web/app/[locale]/page.tsx +13 -1
  162. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +2 -2
  163. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +2 -2
  164. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +2 -2
  165. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +2 -2
  166. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
  167. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
  168. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +1 -1
  169. package/templates/apps/web/app/[locale]/thanks/[slug]/AccountInviteLink.tsx +89 -0
  170. package/templates/apps/web/app/[locale]/thanks/[slug]/__tests__/AccountInviteLink.test.tsx +104 -0
  171. package/templates/apps/web/app/[locale]/thanks/[slug]/__tests__/page.test.tsx +38 -0
  172. package/templates/apps/web/app/[locale]/thanks/[slug]/page.tsx +9 -0
  173. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
  174. package/templates/apps/web/app/[locale]/working-agreement/__tests__/page.test.tsx +63 -0
  175. package/templates/apps/web/app/[locale]/working-agreement/page.tsx +41 -0
  176. package/templates/apps/web/app/api/auth/hub/authorize/__tests__/route.test.ts +114 -0
  177. package/templates/apps/web/app/api/auth/hub/authorize/route.ts +20 -3
  178. package/templates/apps/web/app/api/checkout/[offering]/route.ts +48 -0
  179. package/templates/apps/web/app/api/checkout/__tests__/route.test.ts +120 -0
  180. package/templates/apps/web/app/api/checkout/__tests__/success-path.test.ts +86 -0
  181. package/templates/apps/web/app/api/hub-session/__tests__/routes.test.ts +44 -1
  182. package/templates/apps/web/app/api/hub-session/sign-in/route.ts +22 -3
  183. package/templates/apps/web/app/api/webhooks/stripe/__tests__/route.test.ts +92 -0
  184. package/templates/apps/web/app/api/webhooks/stripe/route.ts +31 -0
  185. package/templates/apps/web/auth.ts +28 -2
  186. package/templates/apps/web/jest.config.cjs +1 -0
  187. package/templates/apps/web/lib/__tests__/account-invite.test.ts +63 -0
  188. package/templates/apps/web/lib/__tests__/checkout.test.ts +243 -0
  189. package/templates/apps/web/lib/__tests__/consent-policies.test.ts +23 -0
  190. package/templates/apps/web/lib/__tests__/deck-page.test.ts +249 -0
  191. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +38 -19
  192. package/templates/apps/web/lib/account-invite.ts +37 -0
  193. package/templates/apps/web/lib/checkout-config.ts +27 -0
  194. package/templates/apps/web/lib/checkout.ts +93 -0
  195. package/templates/apps/web/lib/consent-policies.ts +22 -0
  196. package/templates/apps/web/lib/deck-page.ts +192 -0
  197. package/templates/apps/web/lib/hub-session/__tests__/sign-in-gate.test.tsx +111 -0
  198. package/templates/apps/web/lib/hub-session/sign-in-gate.tsx +88 -32
  199. package/templates/apps/web/lib/prisma-for-auth.ts +8 -0
  200. package/templates/apps/web/lib/sign-up-agreements.ts +447 -0
  201. package/templates/apps/web/lib/site-chrome.ts +2 -0
  202. package/templates/apps/web/lib/telemetry-scrub.ts +5 -1
  203. package/templates/apps/web/messages/en.json +40 -12
  204. package/templates/apps/web/package.json +1 -0
  205. package/templates/apps/web/src/lib/__tests__/lead-write.test.ts +187 -0
  206. package/templates/apps/web/src/lib/__tests__/rate-limit.test.ts +67 -0
  207. package/templates/apps/web/src/lib/lead-write.ts +90 -0
  208. package/templates/apps/web/src/lib/rate-limit.ts +79 -0
  209. package/templates/database/CHANGELOG.md +47 -0
  210. package/templates/database/__tests__/consent-source-checkout-migration.test.ts +79 -0
  211. package/templates/database/__tests__/flow-completion-migration.test.ts +115 -0
  212. package/templates/database/__tests__/flow-completion.db.test.ts +136 -0
  213. package/templates/database/__tests__/seed.test.ts +72 -2
  214. package/templates/database/inbox/schema.prisma +17 -2
  215. package/templates/database/jest.config.cjs +1 -0
  216. package/templates/database/migrations/20261018120000_flow_completion/migration.sql +52 -0
  217. package/templates/database/migrations/20261019120000_consent_source_checkout/migration.sql +27 -0
  218. package/templates/database/package.json +1 -1
  219. package/templates/database/seed.ts +60 -0
  220. package/templates/tools/jest/pin-timezone.cjs +34 -0
  221. package/versions.json +34 -34
  222. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up.actions.ts +0 -125
@@ -183,7 +183,7 @@ spacing:
183
183
 
184
184
  The minimalism design is the standard foundation — the same black-on-white wireframe, the same type and the same components — presented as a deck. The home page is a deck: each home section is one slide, snapping one slide per scroll, and the landing hero carries the brand, so the site reads like a presentation before it reads like a website; the rest of the site is quiet and document-like. Its character comes from structure, not a palette: it carries no theme of its own.
185
185
 
186
- The deck presents slide by slide (`layout.deckPresentation: true`). Each slide fits the screen, and a slide with more to say scrolls inside itself, with its down chevron held in view at its foot. The pinned mark takes the ground of the slide under it, so it shows its dark variant over a dark slide. Each slide has its own link, `#slide-<name>`, which the address bar follows as the reader moves without adding a history entry. Slides fade in as they arrive, unless the reader has asked for reduced motion. Every slide's header is centred, and feature cards stack in one column on phones.
186
+ The deck presents slide by slide (`layout.deckPresentation: true`). Each slide fits the screen, and a slide with more to say scrolls inside itself, with its down chevron after its last line. The pinned mark takes the ground of the slide under it, so it shows its dark variant over a dark slide. Each slide has its own link, `#slide-<name>`, which the address bar follows as the reader moves without adding a history entry. A site may choose bare links instead, `#<name>`, by setting `layout.deckAnchors: bare` (it applies only with `deckPresentation: true`; minimalism leaves it unset, so its links stay `#slide-<name>`): a slide keeps the `slide-` name only where its bare name would collide, with another slide, a JSON-LD `@id` fragment on the page or an element id on the page (the page renderer checks `main` and the ids it is given; the deck checks every bare name against the live page when it loads, and the closing slide is `contact` unless an element or a JSON-LD node already has that id, else `slide-contact`), so a link never lands on a different element than its slide. Slides fade in as they arrive, unless the reader has asked for reduced motion. Every slide's header is centred, and feature cards stack in one column on phones. From 1024px up the slides after the landing share three lines, so a reader moving from slide to slide sees nothing jump: a **label heading** (the heading of a logo wall, a list or the portraits, each set in the section-label role above, smaller than the statement size) hangs from the **top line**, `--spacing-deck-label-line` below the top of the slide (7rem); the slide's content centres on the **middle line**, midway between the label zone and the action zone, whatever its height; and a slide's **action** (a statement slide's button, the logo wall's and the portraits' action row, the closing slide's buttons) ends on the **button line**, `--spacing-deck-action-line` above the foot of the slide (7.5rem, plus the consent bar's height while it shows), which is the landing's own button line. The landing sets that line; the other slides read it. Below 1024px a slide is one stacked flow and the lines do not apply. The action is seated on the line while its slide's content fits the zone; a slide that outgrows the zone scrolls inside itself, and the action, which is part of the scrolled content, no longer sits on the line (keep a slide's content within the zone, or put the action in the content). A list taller than its slide's content zone (five display-size titles at 1440×727) scrolls inside the slide, and its down chevron comes after its last line.
187
187
 
188
188
  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.
189
189
 
@@ -0,0 +1,23 @@
1
+ ---
2
+ type: "ContactPage"
3
+ slug: "contact"
4
+ title: "Contact {{SITE_NAME}}"
5
+ # The minimalism design's Contact page for the local-business-service shape — one heading, one line and the contact form. The heading takes the site's name when the design is applied.
6
+ description: "Get in touch with {{SITE_NAME}}: a question, a partnership or just to say hello."
7
+ sections:
8
+ [
9
+ {
10
+ "id": "contact",
11
+ "type": "contact-form",
12
+ "data":
13
+ {
14
+ "variant": "column",
15
+ "headline": "Contact {{SITE_NAME}}",
16
+ "description": "Question, partnership, a podcast or just want to say hello? Tell us what's on your mind.",
17
+ "fields": [],
18
+ },
19
+ },
20
+ ]
21
+ ---
22
+
23
+ The minimalism design seeded this page. Its form is the site's Contact form, which the site owner edits in Admin.
@@ -0,0 +1,23 @@
1
+ ---
2
+ type: "ContactPage"
3
+ slug: "contact"
4
+ title: "Contact {{SITE_NAME}}"
5
+ # The minimalism design's Contact page for the organization-product shape — one heading, one line and the contact form. The heading takes the site's name when the design is applied.
6
+ description: "Get in touch with {{SITE_NAME}}: a question, a partnership or just to say hello."
7
+ sections:
8
+ [
9
+ {
10
+ "id": "contact",
11
+ "type": "contact-form",
12
+ "data":
13
+ {
14
+ "variant": "column",
15
+ "headline": "Contact {{SITE_NAME}}",
16
+ "description": "Question, partnership, a podcast or just want to say hello? Tell us what's on your mind.",
17
+ "fields": [],
18
+ },
19
+ },
20
+ ]
21
+ ---
22
+
23
+ The minimalism design seeded this page. Its form is the site's Contact form, which the site owner edits in Admin.
@@ -0,0 +1,23 @@
1
+ ---
2
+ type: "ContactPage"
3
+ slug: "contact"
4
+ title: "Contact {{SITE_NAME}}"
5
+ # The minimalism design's Contact page for the organization-service shape — one heading, one line and the contact form. The heading takes the site's name when the design is applied.
6
+ description: "Get in touch with {{SITE_NAME}}: a question, a partnership or just to say hello."
7
+ sections:
8
+ [
9
+ {
10
+ "id": "contact",
11
+ "type": "contact-form",
12
+ "data":
13
+ {
14
+ "variant": "column",
15
+ "headline": "Contact {{SITE_NAME}}",
16
+ "description": "Question, partnership, a podcast or just want to say hello? Tell us what's on your mind.",
17
+ "fields": [],
18
+ },
19
+ },
20
+ ]
21
+ ---
22
+
23
+ The minimalism design seeded this page. Its form is the site's Contact form, which the site owner edits in Admin.
@@ -0,0 +1,23 @@
1
+ ---
2
+ type: "ContactPage"
3
+ slug: "contact"
4
+ title: "Contact {{SITE_NAME}}"
5
+ # The minimalism design's Contact page for the person-service shape — one heading, one line and the contact form. The heading takes the site's name when the design is applied.
6
+ description: "Get in touch with {{SITE_NAME}}: a question, a partnership or just to say hello."
7
+ sections:
8
+ [
9
+ {
10
+ "id": "contact",
11
+ "type": "contact-form",
12
+ "data":
13
+ {
14
+ "variant": "column",
15
+ "headline": "Contact {{SITE_NAME}}",
16
+ "description": "Question, partnership, a podcast or just want to say hello? Tell me what's on your mind.",
17
+ "fields": [],
18
+ },
19
+ },
20
+ ]
21
+ ---
22
+
23
+ The minimalism design seeded this page. Its form is the site's Contact form, which the site owner edits in Admin.
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "shape": "organization-product",
19
19
  "design": "standard",
20
- "generatedHash": "971a929b8fe9feb35845c69fc7af93fb01ff9b1e408b8a6abedb5fd5ddbdf26f",
20
+ "generatedHash": "20f84bf7cdd2f51960084e6a91f2cbdc35d86fe87230619572124ca977609f5b",
21
21
  "layout": {
22
22
  "nav": "full",
23
23
  "footer": "columns",
@@ -437,6 +437,23 @@
437
437
  }
438
438
  ]
439
439
  },
440
+ {
441
+ "route": "/working-agreement",
442
+ "kind": "page",
443
+ "pageType": "WorkingAgreementPage",
444
+ "schema": "WorkingAgreementPage",
445
+ "shell": "MarketingShell",
446
+ "chrome": "on",
447
+ "sections": [
448
+ {
449
+ "type": "document-chassis",
450
+ "component": "DocumentChassis",
451
+ "options": {
452
+ "layout": "article"
453
+ }
454
+ }
455
+ ]
456
+ },
440
457
  {
441
458
  "route": "/purchase-policy",
442
459
  "kind": "page",
@@ -239,6 +239,16 @@ _Code route — no content, no sections._
239
239
 
240
240
  <!-- generated:end -->
241
241
 
242
+ `/working-agreement`:
243
+
244
+ <!-- generated:begin page=/working-agreement -->
245
+
246
+ | # | Section | Component | Copy (first line) |
247
+ | --- | ----------------------------------- | ----------------- | ----------------- |
248
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Working Agreement |
249
+
250
+ <!-- generated:end -->
251
+
242
252
  `/purchase-policy`:
243
253
 
244
254
  <!-- generated:begin page=/purchase-policy -->
@@ -511,6 +521,7 @@ marketing-site:
511
521
  - { route: "/sign-up", kind: route }
512
522
  - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
513
523
  - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
524
+ - { route: "/working-agreement", kind: page, content: ["content/en/WorkingAgreementPage/working-agreement.mdx"] }
514
525
  - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
515
526
  - { route: "/projects", kind: page, content: ["content/en/ProjectsList/projects.mdx"] }
516
527
  - { route: "/projects/[slug]", kind: page, contentDir: "content/en/Project" }
@@ -4,7 +4,7 @@
4
4
  "categories": ["accounting", "legal", "technology"],
5
5
  "shape": "organization-product",
6
6
  "design": "standard",
7
- "generatedHash": "518cd610a8b86cf4d520c8691a52dc5a0f53a07bf5b44a8515ef4fb1ec84aa92",
7
+ "generatedHash": "08391280820bcc6edd5c7062b75c2f33852b02c37ab518d1302bb7cb43c44714",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -427,6 +427,23 @@
427
427
  }
428
428
  ]
429
429
  },
430
+ {
431
+ "route": "/working-agreement",
432
+ "kind": "page",
433
+ "pageType": "WorkingAgreementPage",
434
+ "schema": "WorkingAgreementPage",
435
+ "shell": "MarketingShell",
436
+ "chrome": "on",
437
+ "sections": [
438
+ {
439
+ "type": "document-chassis",
440
+ "component": "DocumentChassis",
441
+ "options": {
442
+ "layout": "article"
443
+ }
444
+ }
445
+ ]
446
+ },
430
447
  {
431
448
  "route": "/purchase-policy",
432
449
  "kind": "page",
@@ -319,6 +319,16 @@ Reference: `screenshots/legal--privacy-policy.png`, `copy/legal--*.txt`. Content
319
319
 
320
320
  <!-- generated:end -->
321
321
 
322
+ `/working-agreement`:
323
+
324
+ <!-- generated:begin page=/working-agreement -->
325
+
326
+ | # | Section | Component | Copy (first line) |
327
+ | --- | ----------------------------------- | ----------------- | ----------------- |
328
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Working Agreement |
329
+
330
+ <!-- generated:end -->
331
+
322
332
  ### `/purchase-policy` — `PurchasePolicyPage` (product shape) · chrome on
323
333
 
324
334
  One document-chassis page with the shape's policy sections — returns, shipping and refunds (#6646). Its Returns section makes the JSON-LD a `MerchantReturnPolicy` at `#return-policy`.
@@ -421,29 +431,30 @@ marketing-site-free:
421
431
  shape: organization-product
422
432
  design: standard
423
433
  roster:
424
- - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
425
- - { route: "/features", kind: page, content: ["content/en/FeaturesList/features.mdx"] }
426
- - { route: "/features/[slug]", kind: page, contentDir: "content/en/Feature" }
427
- - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
428
- - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
429
- - { route: "/pricing", kind: page, content: ["content/en/Pricing/pricing.mdx"] }
430
- - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
431
- - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
432
- - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
433
- - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
434
- - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
435
- - { route: "/sign-in", kind: route }
436
- - { route: "/sign-up", kind: route }
437
- - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
438
- - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
439
- - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
440
- - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
441
- - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
442
- - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
443
- - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
444
- - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
445
- - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
446
- - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
434
+ - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
435
+ - { route: "/features", kind: page, content: ["content/en/FeaturesList/features.mdx"] }
436
+ - { route: "/features/[slug]", kind: page, contentDir: "content/en/Feature" }
437
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
438
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
439
+ - { route: "/pricing", kind: page, content: ["content/en/Pricing/pricing.mdx"] }
440
+ - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
441
+ - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
442
+ - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
443
+ - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
444
+ - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
445
+ - { route: "/sign-in", kind: route }
446
+ - { route: "/sign-up", kind: route }
447
+ - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
448
+ - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
449
+ - { route: "/working-agreement", kind: page, content: ["content/en/WorkingAgreementPage/working-agreement.mdx"] }
450
+ - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
451
+ - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
452
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
453
+ - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
454
+ - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
455
+ - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
456
+ - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
457
+ - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
447
458
  ```
448
459
 
449
460
  <!-- generated:end -->
@@ -11,7 +11,7 @@
11
11
  ],
12
12
  "shape": "local-business-service",
13
13
  "design": "standard",
14
- "generatedHash": "2884b9e5535e253b067f60bef990f66a97651c366f0484fa1699c0cd54cd4f75",
14
+ "generatedHash": "b8ee2da3100d51dd191ed148dc6c9884394585064da8a27605414ea38dbe3fb0",
15
15
  "layout": {
16
16
  "nav": "full",
17
17
  "footer": "columns",
@@ -338,6 +338,23 @@
338
338
  }
339
339
  ]
340
340
  },
341
+ {
342
+ "route": "/working-agreement",
343
+ "kind": "page",
344
+ "pageType": "WorkingAgreementPage",
345
+ "schema": "WorkingAgreementPage",
346
+ "shell": "MarketingShell",
347
+ "chrome": "on",
348
+ "sections": [
349
+ {
350
+ "type": "document-chassis",
351
+ "component": "DocumentChassis",
352
+ "options": {
353
+ "layout": "article"
354
+ }
355
+ }
356
+ ]
357
+ },
341
358
  {
342
359
  "route": "/blog",
343
360
  "kind": "page",
@@ -231,6 +231,14 @@ _Code route — no content, no sections._
231
231
 
232
232
  <!-- generated:end -->
233
233
 
234
+ <!-- generated:begin page=/working-agreement -->
235
+
236
+ | # | Section | Component | Copy (first line) |
237
+ | --- | ----------------------------------- | ----------------- | ----------------- |
238
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Working Agreement |
239
+
240
+ <!-- generated:end -->
241
+
234
242
  `/blog` (the Free teaser row, § 1.8 — served by the generic `[slug]` route over the always-copied overlay's `BlogList/blog.mdx`):
235
243
 
236
244
  <!-- generated:begin page=/blog -->
@@ -307,8 +315,9 @@ The standard page set for this shape (`derive-roster.py --shape local-business-s
307
315
  | `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
308
316
  | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
309
317
  | `LandingPage` | the Free `/meet` meeting-types hub is a LandingPage seed, the same generic `[slug]` route serves it through (#6897 D3); the four `/meet/[slug]` BookCall detail seeds ride the `BookCall` type already in the standard roster |
318
+ | `WorkingAgreementPage` | the Contact form's terms checkbox links `/working-agreement` beside `/terms` and `/privacy`, so every starter ships the page from `_base` (#8661 D10) |
310
319
 
311
- `|S − D| = 15` and `|R| = 20`.
320
+ `|S − D| = 15` and `|R| = 21`.
312
321
 
313
322
  `/sign-in` and `/sign-up` are also rostered (#6797) — code routes (`kind: route`) with no page type, so they sit outside this set equation: the locale layout's header links both, and the roster of record lists every page the scaffold serves.
314
323
 
@@ -325,28 +334,29 @@ local-business-service:
325
334
  shape: local-business-service
326
335
  design: standard
327
336
  roster:
328
- - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
329
- - { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
330
- - { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
331
- - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
332
- - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
333
- - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
334
- - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
335
- - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
336
- - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
337
- - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
338
- - { route: "/sign-in", kind: route }
339
- - { route: "/sign-up", kind: route }
340
- - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
341
- - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
342
- - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
343
- - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
344
- - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
345
- - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
346
- - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
347
- - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
348
- - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
349
- - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
337
+ - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
338
+ - { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
339
+ - { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
340
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
341
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
342
+ - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
343
+ - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
344
+ - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
345
+ - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
346
+ - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
347
+ - { route: "/sign-in", kind: route }
348
+ - { route: "/sign-up", kind: route }
349
+ - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
350
+ - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
351
+ - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
352
+ - { route: "/working-agreement", kind: page, content: ["content/en/WorkingAgreementPage/working-agreement.mdx"] }
353
+ - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
354
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
355
+ - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
356
+ - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
357
+ - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
358
+ - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
359
+ - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
350
360
  ```
351
361
 
352
362
  <!-- generated:end -->
@@ -4,7 +4,7 @@
4
4
  "categories": ["accounting", "legal", "real-estate"],
5
5
  "shape": "organization-service",
6
6
  "design": "standard",
7
- "generatedHash": "dc5f942d7fbe9eaeb85606cb73145354af9ca9e780b450824a00973771a41960",
7
+ "generatedHash": "a6330a3da9b734cd384ee07ecb35c2e171d26effe3286caae36bf3b13f8955e4",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -314,6 +314,23 @@
314
314
  }
315
315
  ]
316
316
  },
317
+ {
318
+ "route": "/working-agreement",
319
+ "kind": "page",
320
+ "pageType": "WorkingAgreementPage",
321
+ "schema": "WorkingAgreementPage",
322
+ "shell": "MarketingShell",
323
+ "chrome": "on",
324
+ "sections": [
325
+ {
326
+ "type": "document-chassis",
327
+ "component": "DocumentChassis",
328
+ "options": {
329
+ "layout": "article"
330
+ }
331
+ }
332
+ ]
333
+ },
317
334
  {
318
335
  "route": "/purchase-policy",
319
336
  "kind": "page",
@@ -220,6 +220,14 @@ _Code route — no content, no sections._
220
220
 
221
221
  <!-- generated:end -->
222
222
 
223
+ <!-- generated:begin page=/working-agreement -->
224
+
225
+ | # | Section | Component | Copy (first line) |
226
+ | --- | ----------------------------------- | ----------------- | ----------------- |
227
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Working Agreement |
228
+
229
+ <!-- generated:end -->
230
+
223
231
  `/purchase-policy` (this tree's own service-shape override — cancellation and refunds, D4):
224
232
 
225
233
  <!-- generated:begin page=/purchase-policy -->
@@ -305,8 +313,9 @@ The standard page set for this shape (`derive-roster.py --shape organization-ser
305
313
  | `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
306
314
  | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
307
315
  | `LandingPage` | the Free `/meet` meeting-types hub is a LandingPage seed, the same generic `[slug]` route serves it through (#6897 D3); the four `/meet/[slug]` BookCall detail seeds ride the `BookCall` type already in the standard roster |
316
+ | `WorkingAgreementPage` | the Contact form's terms checkbox links `/working-agreement` beside `/terms` and `/privacy`, so every starter ships the page from `_base` (#8661 D10) |
308
317
 
309
- `|S − D| = 15` and `|R| = 20`.
318
+ `|S − D| = 15` and `|R| = 21`.
310
319
 
311
320
  `/sign-in` and `/sign-up` are also rostered (#6797) — code routes (`kind: route`) with no page type, so they sit outside this set equation: the locale layout's header links both, and the roster of record lists every page the scaffold serves.
312
321
 
@@ -323,28 +332,29 @@ organization-service:
323
332
  shape: organization-service
324
333
  design: standard
325
334
  roster:
326
- - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
327
- - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
328
- - { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
329
- - { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
330
- - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
331
- - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
332
- - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
333
- - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
334
- - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
335
- - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
336
- - { route: "/sign-in", kind: route }
337
- - { route: "/sign-up", kind: route }
338
- - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
339
- - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
340
- - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
341
- - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
342
- - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
343
- - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
344
- - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
345
- - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
346
- - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
347
- - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
335
+ - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
336
+ - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
337
+ - { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
338
+ - { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
339
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
340
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
341
+ - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
342
+ - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
343
+ - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
344
+ - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
345
+ - { route: "/sign-in", kind: route }
346
+ - { route: "/sign-up", kind: route }
347
+ - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
348
+ - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
349
+ - { route: "/working-agreement", kind: page, content: ["content/en/WorkingAgreementPage/working-agreement.mdx"] }
350
+ - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
351
+ - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
352
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
353
+ - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
354
+ - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
355
+ - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
356
+ - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
357
+ - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
348
358
  ```
349
359
 
350
360
  <!-- generated:end -->
@@ -4,7 +4,7 @@
4
4
  "categories": ["consulting"],
5
5
  "shape": "person-service",
6
6
  "design": "standard",
7
- "generatedHash": "a763acef14c0c36649ad99dd4a4fea566ebdf64257bddb2f553ab8823349c309",
7
+ "generatedHash": "5017d55ac2de4c2cdb7a10fc2488c9ad675f30614f51a064b7e91ab983976e51",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -338,6 +338,23 @@
338
338
  }
339
339
  ]
340
340
  },
341
+ {
342
+ "route": "/working-agreement",
343
+ "kind": "page",
344
+ "pageType": "WorkingAgreementPage",
345
+ "schema": "WorkingAgreementPage",
346
+ "shell": "MarketingShell",
347
+ "chrome": "on",
348
+ "sections": [
349
+ {
350
+ "type": "document-chassis",
351
+ "component": "DocumentChassis",
352
+ "options": {
353
+ "layout": "article"
354
+ }
355
+ }
356
+ ]
357
+ },
341
358
  {
342
359
  "route": "/blog",
343
360
  "kind": "page",