create-ailk 0.7.0 → 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 (169) hide show
  1. package/README.md +44 -10
  2. package/component-catalog.json +520 -5
  3. package/component-catalog.md +9 -6
  4. package/dist/cli.js +22 -24
  5. package/dist/lib/extract-module-bundle.js +5 -1
  6. package/dist/lib/module-license-gate.d.ts +79 -0
  7. package/dist/lib/module-license-gate.js +160 -12
  8. package/dist/lib/module-tier.d.ts +45 -16
  9. package/dist/lib/module-tier.js +76 -0
  10. package/dist/lib/pro-callout.js +10 -2
  11. package/dist/parse-args.d.ts +78 -10
  12. package/dist/parse-args.js +204 -14
  13. package/dist/programmatic.d.ts +39 -9
  14. package/dist/programmatic.js +163 -25
  15. package/dist/site-roster.js +11 -6
  16. package/dist/starter-grid.d.ts +216 -0
  17. package/dist/starter-grid.js +449 -0
  18. package/dist/surfaces.d.ts +4 -4
  19. package/dist/surfaces.js +102 -43
  20. package/dist/template-manifest.d.ts +36 -17
  21. package/dist/template-manifest.js +121 -367
  22. package/dist/template-names.d.ts +14 -12
  23. package/dist/template-names.js +13 -17
  24. package/package.json +3 -3
  25. package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -1
  26. package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
  27. package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
  28. package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
  29. package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
  30. package/site-templates/_base/content/en/GlossaryList/glossary.mdx +0 -1
  31. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +0 -1
  32. package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
  33. package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
  34. package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
  35. package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
  36. package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
  37. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +15 -0
  38. package/site-templates/_base/content/en/UseCase/persona-1.mdx +69 -0
  39. package/site-templates/_base/content/en/UseCase/persona-2.mdx +69 -0
  40. package/site-templates/_base/content/en/UseCase/persona-3.mdx +69 -0
  41. package/site-templates/designs/standard/DESIGN.md +5 -0
  42. package/site-templates/marketing-site/DESIGN.md +5 -0
  43. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +89 -25
  44. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +35 -14
  45. package/site-templates/marketing-site-free/DESIGN.md +5 -0
  46. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +95 -29
  47. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +74 -44
  48. package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
  49. package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
  50. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +17 -29
  51. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -1
  52. package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
  53. package/site-templates/saas-product/DESIGN.md +5 -0
  54. package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
  55. package/site-templates/{simple-service → shapes/local-business-service}/TEMPLATE-MANIFEST.json +96 -76
  56. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +302 -0
  57. package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
  58. package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
  59. package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
  60. package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  61. package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
  62. package/site-templates/{simple-service → shapes/local-business-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +7 -8
  63. package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
  64. package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
  65. package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
  66. package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
  67. package/site-templates/shapes/local-business-service/provenance.json +4 -0
  68. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +362 -0
  69. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +300 -0
  70. package/site-templates/shapes/organization-service/ailk-template.json +10 -0
  71. package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
  72. package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
  73. package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  74. package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
  75. package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  76. package/site-templates/shapes/organization-service/content/en/Service/first-engagement.mdx +38 -0
  77. package/site-templates/shapes/organization-service/content/en/Service/second-engagement.mdx +38 -0
  78. package/site-templates/shapes/organization-service/content/en/Service/third-engagement.mdx +38 -0
  79. package/site-templates/shapes/organization-service/content/en/ServicesList/services.mdx +72 -0
  80. package/site-templates/shapes/organization-service/provenance.json +4 -0
  81. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +369 -0
  82. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +299 -0
  83. package/site-templates/shapes/person-service/ailk-template.json +10 -0
  84. package/site-templates/shapes/person-service/content/_site.mdx +85 -0
  85. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
  86. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
  87. package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  88. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +169 -0
  89. package/site-templates/shapes/person-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  90. package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
  91. package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
  92. package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
  93. package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
  94. package/site-templates/shapes/person-service/provenance.json +4 -0
  95. package/templates/.claude/skills/README.md +3 -2
  96. package/templates/.claude/skills/add-page/references/page-types.md +4 -0
  97. package/templates/.claude/skills/setup-database/SKILL.md +156 -0
  98. package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
  99. package/templates/.claude/skills/setup-deploy/SKILL.md +64 -32
  100. package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +19 -28
  101. package/templates/.claude/skills/setup-deploy/references/runbook-template.md +58 -102
  102. package/templates/DESIGN.md +5 -0
  103. package/templates/README.md +46 -38
  104. package/templates/apps/api/CLAUDE.md +3 -2
  105. package/templates/apps/api/src/config/__tests__/index.test.ts +115 -14
  106. package/templates/apps/api/src/config/index.ts +35 -16
  107. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
  108. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
  109. package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
  110. package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
  111. package/templates/apps/api/src/openapi/spec.ts +63 -12
  112. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
  113. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
  114. package/templates/apps/api/src/routes/leads/index.ts +46 -1
  115. package/templates/apps/api/src/server.ts +7 -0
  116. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
  117. package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
  118. package/templates/apps/api/src/services/lead-routing.ts +140 -30
  119. package/templates/apps/api/src/services/leads-inbox.ts +48 -11
  120. package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
  121. package/templates/apps/mcp/src/tools/create_project.ts +21 -6
  122. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +14 -6
  123. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +10 -9
  124. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
  125. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
  126. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +227 -84
  127. package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
  128. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
  129. package/templates/apps/web/app/[locale]/contact/page.tsx +105 -15
  130. package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
  131. package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
  132. package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
  133. package/templates/apps/web/app/[locale]/layout.tsx +37 -5
  134. package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
  135. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
  136. package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
  137. package/templates/apps/web/app/[locale]/newsletter/page.tsx +106 -14
  138. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
  139. package/templates/apps/web/app/[locale]/portfolio/page.tsx +49 -0
  140. package/templates/apps/web/app/[locale]/use-cases/[slug]/page.tsx +18 -3
  141. package/templates/apps/web/lib/nav-config.ts +48 -36
  142. package/templates/apps/web/lib/site-identity.ts +14 -0
  143. package/templates/apps/web/messages/en.json +28 -2
  144. package/templates/content/_site.mdx +4 -2
  145. package/templates/content/en/BlogList/blog.mdx +37 -16
  146. package/templates/content/en/ContactPage/contact.mdx +14 -44
  147. package/templates/content/en/HomePage/home.mdx +8 -16
  148. package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
  149. package/templates/content/en/UseCasesList/use-cases.mdx +6 -6
  150. package/templates/database/CHANGELOG.md +7 -0
  151. package/templates/database/package.json +1 -1
  152. package/versions.json +33 -33
  153. package/site-templates/_base/content/en/UseCase/first-use-case.mdx +0 -23
  154. package/site-templates/_base/content/en/UseCase/second-use-case.mdx +0 -23
  155. package/site-templates/_base/content/en/UseCase/third-use-case.mdx +0 -23
  156. package/site-templates/simple-service/DESIGN.md +0 -162
  157. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -333
  158. package/site-templates/simple-service/ailk-template.json +0 -11
  159. package/site-templates/simple-service/content/en/BookCall/book-call.mdx +0 -53
  160. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -32
  161. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
  162. package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
  163. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
  164. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
  165. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
  166. package/site-templates/simple-service/provenance.json +0 -4
  167. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -211
  168. package/templates/apps/web/app/[locale]/contact/__tests__/ContactForm.test.tsx +0 -96
  169. package/templates/content/en/SoftwareProduct/product.mdx +0 -175
@@ -0,0 +1,169 @@
1
+ ---
2
+ type: "PortfolioList"
3
+ slug: "portfolio"
4
+ title: "{Before and after, compared} | {Company name}"
5
+ description: "{Every project shown as a comparison \u2014 what the client had, what they have now, and what changed in between.}"
6
+ sections:
7
+ [
8
+ {
9
+ "id": "cases-hero",
10
+ "type": "hero",
11
+ "data":
12
+ {
13
+ "variant": "default",
14
+ "size": "display",
15
+ "surface": "wash-secondary",
16
+ "gapBelow": "tight",
17
+ "eyebrow": "{Portfolio}",
18
+ "eyebrowTone": "brand",
19
+ "headline": "{The work, before and after.}",
20
+ "subheadline": "{Two or three sentences on why the comparison is the honest proof \u2014 what the before cost the client, what the after changed, and how a reader can check it.}",
21
+ "subtitleSize": "lead",
22
+ "ctaSize": "xl",
23
+ "primaryCta": { "label": "{Get started}", "href": "/pricing" },
24
+ "secondaryCta": { "label": "{Book a call}", "href": "/contact" },
25
+ },
26
+ },
27
+ {
28
+ "id": "cases-tiles",
29
+ "type": "items",
30
+ "data":
31
+ {
32
+ "variant": "tile",
33
+ "tileHover": "outline",
34
+ "columns": 2,
35
+ "surface": "none",
36
+ "items":
37
+ [
38
+ {
39
+ "title": "{Example one}: before and after",
40
+ "description": "{One sentence on what example one had, and what they have now}",
41
+ "rows":
42
+ [
43
+ {
44
+ "label": "THE CLIENT",
45
+ "body": "{Who they are and the market they sell into}",
46
+ },
47
+ {
48
+ "label": "WHAT CHANGED",
49
+ "body": "{The one thing the after does that the before could not}",
50
+ },
51
+ ],
52
+ "link":
53
+ {
54
+ "label": "See the comparison \u2192",
55
+ "href": "/portfolio/sample-one",
56
+ },
57
+ },
58
+ {
59
+ "title": "{Example two}: before and after",
60
+ "description": "{One sentence on what example two had, and what they have now}",
61
+ "rows":
62
+ [
63
+ {
64
+ "label": "THE CLIENT",
65
+ "body": "{Who they are and the market they sell into}",
66
+ },
67
+ {
68
+ "label": "WHAT CHANGED",
69
+ "body": "{The one thing the after does that the before could not}",
70
+ },
71
+ ],
72
+ "link":
73
+ {
74
+ "label": "See the comparison \u2192",
75
+ "href": "/portfolio/sample-two",
76
+ },
77
+ },
78
+ {
79
+ "title": "{Example three}: before and after",
80
+ "description": "{One sentence on what example three had, and what they have now}",
81
+ "rows":
82
+ [
83
+ {
84
+ "label": "THE CLIENT",
85
+ "body": "{Who they are and the market they sell into}",
86
+ },
87
+ {
88
+ "label": "WHAT CHANGED",
89
+ "body": "{The one thing the after does that the before could not}",
90
+ },
91
+ ],
92
+ "link":
93
+ {
94
+ "label": "See the comparison \u2192",
95
+ "href": "/portfolio/sample-three",
96
+ },
97
+ },
98
+ {
99
+ "title": "{Example four}: before and after",
100
+ "description": "{One sentence on what example four had, and what they have now}",
101
+ "rows":
102
+ [
103
+ {
104
+ "label": "THE CLIENT",
105
+ "body": "{Who they are and the market they sell into}",
106
+ },
107
+ {
108
+ "label": "WHAT CHANGED",
109
+ "body": "{The one thing the after does that the before could not}",
110
+ },
111
+ ],
112
+ "link":
113
+ {
114
+ "label": "See the comparison \u2192",
115
+ "href": "/portfolio/sample-four",
116
+ },
117
+ },
118
+ ],
119
+ },
120
+ },
121
+ {
122
+ "id": "cases-close",
123
+ "type": "cta",
124
+ "data":
125
+ {
126
+ "variant": "beam",
127
+ "headline": "{Is your site the before or the after?}",
128
+ "description": "{One line offering the reader the same comparison for their own site.}",
129
+ "primaryCta": { "label": "{Get started}", "href": "/pricing" },
130
+ "secondaryCta": { "label": "{Book a call}", "href": "/contact" },
131
+ "chips":
132
+ [
133
+ "{Proof you can check}",
134
+ "{Every project shown both ways}",
135
+ "{Re-checked every quarter}",
136
+ ],
137
+ },
138
+ },
139
+ {
140
+ "id": "cases-faq",
141
+ "type": "faq",
142
+ "data":
143
+ {
144
+ "headline": "Frequently Asked Questions",
145
+ "variant": "centered",
146
+ "presentation": "accordion",
147
+ "questionSize": "body-lg",
148
+ "initialOpen": "first",
149
+ "containerWidth": "default",
150
+ "surface": "gray-100",
151
+ "items":
152
+ [
153
+ {
154
+ "question": "{How do you pick which projects to show?}",
155
+ "answer": "{Two or three sentences.}",
156
+ },
157
+ {
158
+ "question": "{Are the before screenshots real?}",
159
+ "answer": "{Two or three sentences.}",
160
+ },
161
+ {
162
+ "question": "{Can I see the numbers behind a comparison?}",
163
+ "answer": "{Two or three sentences.}",
164
+ },
165
+ ],
166
+ },
167
+ },
168
+ ]
169
+ ---
@@ -54,6 +54,21 @@ sections:
54
54
  },
55
55
  ],
56
56
  },
57
+ {
58
+ "id": "cookie-settings",
59
+ "heading": "Cookie settings",
60
+ "blocks":
61
+ [
62
+ {
63
+ "kind": "paragraph",
64
+ "text": "Arriving at this section reopens the cookie banner, so a visitor can accept or reject again at any time. Their earlier choice stays in place until they pick again.",
65
+ },
66
+ {
67
+ "kind": "paragraph",
68
+ "text": "Replace this with what your site actually sets: which cookies, what each one is for, and what stops working if someone rejects them.",
69
+ },
70
+ ],
71
+ },
57
72
  {
58
73
  "id": "contact",
59
74
  "heading": "How to reach us",
@@ -0,0 +1,69 @@
1
+ ---
2
+ type: "UseCase"
3
+ slug: "persona-1"
4
+ title: "{Use case 1: the job this customer hires your product to do}"
5
+ description: "{Two sentences on who this customer is and the result they get}"
6
+ sections:
7
+ [
8
+ {
9
+ "id": "hero",
10
+ "type": "hero",
11
+ "data":
12
+ {
13
+ "eyebrow": "Use cases",
14
+ "headline": "{Use case 1: the job this customer hires your product to do}",
15
+ "subheadline": "{Two sentences on who this customer is and the result they get}",
16
+ "primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
17
+ "secondaryCta":
18
+ {
19
+ "label": "{Secondary CTA}",
20
+ "href": "/pricing",
21
+ "variant": "outline",
22
+ },
23
+ },
24
+ },
25
+ {
26
+ "id": "detail",
27
+ "type": "feature",
28
+ "data":
29
+ {
30
+ "headline": "{How this customer uses your product}",
31
+ "description": "{Two or three sentences on how it works and what changes for the reader}",
32
+ "features":
33
+ [
34
+ {
35
+ "title": "{First point}",
36
+ "description": "{One sentence that makes the point concrete}",
37
+ },
38
+ {
39
+ "title": "{Second point}",
40
+ "description": "{One sentence that makes the point concrete}",
41
+ },
42
+ {
43
+ "title": "{Third point}",
44
+ "description": "{One sentence that makes the point concrete}",
45
+ },
46
+ ],
47
+ },
48
+ },
49
+ {
50
+ "id": "cta",
51
+ "type": "cta",
52
+ "data":
53
+ {
54
+ "variant": "box",
55
+ "headline": "{Talk to us about your own use case}",
56
+ "description": "{One sentence on what happens when they get in touch}",
57
+ "primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
58
+ "secondaryCta":
59
+ {
60
+ "label": "{Secondary CTA}",
61
+ "href": "/pricing",
62
+ "variant": "outline",
63
+ },
64
+ },
65
+ },
66
+ ]
67
+ ---
68
+
69
+ {/* Rendered from frontmatter `sections[]`. Placeholder copy — replace every {brace} with your own words before you launch. */}
@@ -0,0 +1,69 @@
1
+ ---
2
+ type: "UseCase"
3
+ slug: "persona-2"
4
+ title: "{Use case 2: the job this customer hires your product to do}"
5
+ description: "{Two sentences on who this customer is and the result they get}"
6
+ sections:
7
+ [
8
+ {
9
+ "id": "hero",
10
+ "type": "hero",
11
+ "data":
12
+ {
13
+ "eyebrow": "Use cases",
14
+ "headline": "{Use case 2: the job this customer hires your product to do}",
15
+ "subheadline": "{Two sentences on who this customer is and the result they get}",
16
+ "primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
17
+ "secondaryCta":
18
+ {
19
+ "label": "{Secondary CTA}",
20
+ "href": "/pricing",
21
+ "variant": "outline",
22
+ },
23
+ },
24
+ },
25
+ {
26
+ "id": "detail",
27
+ "type": "feature",
28
+ "data":
29
+ {
30
+ "headline": "{How this customer uses your product}",
31
+ "description": "{Two or three sentences on how it works and what changes for the reader}",
32
+ "features":
33
+ [
34
+ {
35
+ "title": "{First point}",
36
+ "description": "{One sentence that makes the point concrete}",
37
+ },
38
+ {
39
+ "title": "{Second point}",
40
+ "description": "{One sentence that makes the point concrete}",
41
+ },
42
+ {
43
+ "title": "{Third point}",
44
+ "description": "{One sentence that makes the point concrete}",
45
+ },
46
+ ],
47
+ },
48
+ },
49
+ {
50
+ "id": "cta",
51
+ "type": "cta",
52
+ "data":
53
+ {
54
+ "variant": "box",
55
+ "headline": "{Talk to us about your own use case}",
56
+ "description": "{One sentence on what happens when they get in touch}",
57
+ "primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
58
+ "secondaryCta":
59
+ {
60
+ "label": "{Secondary CTA}",
61
+ "href": "/pricing",
62
+ "variant": "outline",
63
+ },
64
+ },
65
+ },
66
+ ]
67
+ ---
68
+
69
+ {/* Rendered from frontmatter `sections[]`. Placeholder copy — replace every {brace} with your own words before you launch. */}
@@ -0,0 +1,69 @@
1
+ ---
2
+ type: "UseCase"
3
+ slug: "persona-3"
4
+ title: "{Use case 3: the job this customer hires your product to do}"
5
+ description: "{Two sentences on who this customer is and the result they get}"
6
+ sections:
7
+ [
8
+ {
9
+ "id": "hero",
10
+ "type": "hero",
11
+ "data":
12
+ {
13
+ "eyebrow": "Use cases",
14
+ "headline": "{Use case 3: the job this customer hires your product to do}",
15
+ "subheadline": "{Two sentences on who this customer is and the result they get}",
16
+ "primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
17
+ "secondaryCta":
18
+ {
19
+ "label": "{Secondary CTA}",
20
+ "href": "/pricing",
21
+ "variant": "outline",
22
+ },
23
+ },
24
+ },
25
+ {
26
+ "id": "detail",
27
+ "type": "feature",
28
+ "data":
29
+ {
30
+ "headline": "{How this customer uses your product}",
31
+ "description": "{Two or three sentences on how it works and what changes for the reader}",
32
+ "features":
33
+ [
34
+ {
35
+ "title": "{First point}",
36
+ "description": "{One sentence that makes the point concrete}",
37
+ },
38
+ {
39
+ "title": "{Second point}",
40
+ "description": "{One sentence that makes the point concrete}",
41
+ },
42
+ {
43
+ "title": "{Third point}",
44
+ "description": "{One sentence that makes the point concrete}",
45
+ },
46
+ ],
47
+ },
48
+ },
49
+ {
50
+ "id": "cta",
51
+ "type": "cta",
52
+ "data":
53
+ {
54
+ "variant": "box",
55
+ "headline": "{Talk to us about your own use case}",
56
+ "description": "{One sentence on what happens when they get in touch}",
57
+ "primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
58
+ "secondaryCta":
59
+ {
60
+ "label": "{Secondary CTA}",
61
+ "href": "/pricing",
62
+ "variant": "outline",
63
+ },
64
+ },
65
+ },
66
+ ]
67
+ ---
68
+
69
+ {/* Rendered from frontmatter `sections[]`. Placeholder copy — replace every {brace} with your own words before you launch. */}
@@ -160,3 +160,8 @@ The foundation's pinned direction is the pacing of a classic wireframe marketing
160
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.
161
161
  - **Don't** replace a black rule with a shadow or a grey fill.
162
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.
@@ -160,3 +160,8 @@ The foundation's pinned direction is the pacing of a classic wireframe marketing
160
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.
161
161
  - **Don't** replace a black rule with a shadow or a grey fill.
162
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.
@@ -4,6 +4,7 @@
4
4
  "categories": [
5
5
  "accounting",
6
6
  "legal",
7
+ "consulting",
7
8
  "hvac",
8
9
  "roofing",
9
10
  "plumbing",
@@ -16,7 +17,7 @@
16
17
  ],
17
18
  "shape": "organization-product",
18
19
  "design": "standard",
19
- "generatedHash": "cdad46661249780a6423cfa3e259f579d919bfeee48b9138aed13812f7c685d6",
20
+ "generatedHash": "2fd8ca4f5860bc4ac7ccf086daa46c56d65a8d92e106e428ca838c435a335a76",
20
21
  "layout": {
21
22
  "nav": "full",
22
23
  "footer": "columns",
@@ -132,21 +133,41 @@
132
133
  ]
133
134
  },
134
135
  {
135
- "route": "/software",
136
- "kind": "route",
137
- "pageType": null,
138
- "schema": null,
136
+ "route": "/features",
137
+ "kind": "page",
138
+ "pageType": "FeaturesList",
139
+ "schema": "FeaturesList",
139
140
  "shell": "MarketingShell",
140
141
  "chrome": "on",
141
- "sections": []
142
+ "sections": [
143
+ {
144
+ "type": "hero",
145
+ "component": "Hero"
146
+ },
147
+ {
148
+ "type": "items",
149
+ "component": "Items",
150
+ "options": {
151
+ "columns": 3
152
+ }
153
+ },
154
+ {
155
+ "type": "cta",
156
+ "component": "CTA"
157
+ }
158
+ ]
142
159
  },
143
160
  {
144
- "route": "/software/[slug]",
161
+ "route": "/features/[slug]",
145
162
  "kind": "page",
146
- "contentDir": "content/en/SoftwareProduct",
147
- "seeds": ["content/en/SoftwareProduct/product.mdx"],
148
- "pageType": "SoftwareProduct",
149
- "schema": "SoftwareProduct",
163
+ "contentDir": "content/en/Feature",
164
+ "seeds": [
165
+ "content/en/Feature/feature-1.mdx",
166
+ "content/en/Feature/feature-2.mdx",
167
+ "content/en/Feature/feature-3.mdx"
168
+ ],
169
+ "pageType": "Feature",
170
+ "schema": "Feature",
150
171
  "shell": "MarketingShell",
151
172
  "chrome": "on",
152
173
  "sections": []
@@ -196,9 +217,9 @@
196
217
  "kind": "page",
197
218
  "contentDir": "content/en/UseCase",
198
219
  "seeds": [
199
- "content/en/UseCase/first-use-case.mdx",
200
- "content/en/UseCase/second-use-case.mdx",
201
- "content/en/UseCase/third-use-case.mdx"
220
+ "content/en/UseCase/persona-1.mdx",
221
+ "content/en/UseCase/persona-2.mdx",
222
+ "content/en/UseCase/persona-3.mdx"
202
223
  ],
203
224
  "pageType": "UseCase",
204
225
  "schema": "UseCase",
@@ -314,17 +335,6 @@
314
335
  {
315
336
  "type": "hero",
316
337
  "component": "Hero"
317
- },
318
- {
319
- "type": "logoCloud",
320
- "component": "LogoCloud",
321
- "options": {
322
- "layout": "inline"
323
- }
324
- },
325
- {
326
- "type": "testimonials",
327
- "component": "Testimonials"
328
338
  }
329
339
  ]
330
340
  },
@@ -512,6 +522,60 @@
512
522
  "chrome": "on",
513
523
  "sections": []
514
524
  },
525
+ {
526
+ "route": "/portfolio",
527
+ "kind": "page",
528
+ "pageType": "PortfolioList",
529
+ "schema": "PortfolioList",
530
+ "shell": "MarketingShell",
531
+ "chrome": "on",
532
+ "sections": [
533
+ {
534
+ "type": "hero",
535
+ "component": "Hero",
536
+ "options": {
537
+ "gapBelow": "tight",
538
+ "size": "display",
539
+ "surface": "wash-secondary"
540
+ }
541
+ },
542
+ {
543
+ "type": "items",
544
+ "component": "Items",
545
+ "options": {
546
+ "surface": "none",
547
+ "columns": 2
548
+ }
549
+ },
550
+ {
551
+ "type": "cta",
552
+ "component": "CTA"
553
+ },
554
+ {
555
+ "type": "faq",
556
+ "component": "FAQ",
557
+ "options": {
558
+ "surface": "gray-100"
559
+ }
560
+ }
561
+ ]
562
+ },
563
+ {
564
+ "route": "/portfolio/[slug]",
565
+ "kind": "page",
566
+ "contentDir": "content/en/PortfolioItem",
567
+ "seeds": [
568
+ "content/en/PortfolioItem/sample-four.mdx",
569
+ "content/en/PortfolioItem/sample-one.mdx",
570
+ "content/en/PortfolioItem/sample-three.mdx",
571
+ "content/en/PortfolioItem/sample-two.mdx"
572
+ ],
573
+ "pageType": "PortfolioItem",
574
+ "schema": "PortfolioItem",
575
+ "shell": "MarketingShell",
576
+ "chrome": "on",
577
+ "sections": []
578
+ },
515
579
  {
516
580
  "route": "/blog",
517
581
  "kind": "page",