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
package/README.md CHANGED
@@ -7,7 +7,7 @@ canonical install path per [ADR 0007](../../docs/adr/0007-install-path-canonical
7
7
  ## Usage
8
8
 
9
9
  ```bash
10
- pnpm create ailk@latest my-site
10
+ pnpm create ailk@latest my-site --shape organization-product
11
11
  cd my-site
12
12
  pnpm install
13
13
  pnpm dev
@@ -16,17 +16,46 @@ pnpm dev
16
16
  Compose the site from modules with `--modules`. The recognized vocabulary is
17
17
  `RECOGNIZED_MODULES` in `src/parse-args.ts` — `marketing`, `docs-blog`,
18
18
  `multi-tenant`, `workspace`, `scheduling`, `signal-collectors`, `commerce` —
19
- and the default when the flag is absent is `marketing` (`DEFAULT_MODULES`, same
20
- file):
19
+ and `--modules` TRIMS or ADDS relative to the level your licence key unlocks
20
+ (#6759), never replaces it: with no key the level is Free (`marketing`
21
+ alone); a Pro key switches on `docs-blog`, `scheduling` and
22
+ `signal-collectors` too; Pro Plus adds `multi-tenant`. Naming modules here
23
+ keeps exactly those, trimming the level's default; naming only `commerce`
24
+ (a per-site add-on) or `workspace` (included at Pro, opt-in) adds it on top
25
+ of the level's default without trimming. The level is always DERIVED from
26
+ what the module registry answers for your key — never read from a flag, a
27
+ manifest or a key claim (`src/lib/module-tier.ts` `LEVEL_MODULES`,
28
+ `src/lib/module-license-gate.ts` `deriveLevel`):
21
29
 
22
30
  ```bash
23
- pnpm create ailk@latest my-site --modules marketing,docs-blog
31
+ pnpm create ailk@latest my-site --shape organization-product --modules marketing,docs-blog
24
32
  ```
25
33
 
26
34
  Every recognized module except `marketing` is a paid module, delivered under a
27
35
  license key rather than shipped inside this package — see
28
36
  [Paid modules require `AILK_LICENSE_KEY`](#paid-modules-require-ailk_license_key).
29
37
 
38
+ ### Shape, level and design
39
+
40
+ Every scaffold also picks a shape and, optionally, a design. `--shape`'s
41
+ vocabulary is `RECOGNIZED_SHAPES` in `src/parse-args.ts` — `organization-product`,
42
+ `organization-service`, `local-business-service`, `person-service` (the README
43
+ already lists `RECOGNIZED_MODULES` the same way); `local-business-product` is
44
+ refused as not available yet. A terminal run with no `--shape` asks; a
45
+ non-interactive one stops. The level comes only from your license key: no key
46
+ is Free, and a key switches on its level's modules (`LEVEL_MODULES`) —
47
+ `--modules` trims or adds relative to that set, as above. A keyed example:
48
+
49
+ ```bash
50
+ pnpm create ailk@latest my-site --shape organization-service --license <key>
51
+ ```
52
+
53
+ `--design minimalism` picks the other look and needs a Pro or Pro Plus key;
54
+ `standard` (the default) needs none. `--template <alias>` scaffolds one of the
55
+ four named aliases (`marketing-site-free`, `marketing-site`, `saas-product`,
56
+ `minimalism-site`) — each fixes a shape, a design and its own module list — and
57
+ cannot be combined with `--shape` or `--design`.
58
+
30
59
  ### Add a purchased module to an existing site
31
60
 
32
61
  A site scaffolded without a paid module (a Free site whose owner then buys
@@ -183,16 +212,21 @@ a refused run leaves no partial scaffold behind.
183
212
 
184
213
  ```bash
185
214
  # free-only — no key read, no network call
186
- pnpm create ailk@latest my-site --modules marketing
215
+ pnpm create ailk@latest my-site --shape organization-product --modules marketing
187
216
 
188
217
  # paid — the key is read from the environment
189
- AILK_LICENSE_KEY=... pnpm create ailk@latest my-site --modules marketing,docs-blog
218
+ AILK_LICENSE_KEY=... pnpm create ailk@latest my-site --shape organization-product --modules marketing,docs-blog
190
219
  ```
191
220
 
192
- A request that names no paid module never reaches the key check at all:
193
- `resolvePaidModules` returns an empty map on its first branch, before touching
194
- `process.env` or the network, so a free-only `--modules` request reads no env
195
- var and makes no network call (`src/lib/module-license-gate.ts`).
221
+ The network invariant (#6759 D6), in full:
222
+
223
+ - **No key** → no request at all. A request that names no paid module never
224
+ reaches the key check either: `resolvePaidModules` returns an empty map on
225
+ its first branch, before touching `process.env` or the network.
226
+ - **A key with no `--modules`** → the level probe (`deriveLevel`): 3-4
227
+ requests, to find out what the key unlocks.
228
+ - **An explicit `--modules` list** → requests only for the paid modules it
229
+ names, exactly as before this level mechanism existed.
196
230
 
197
231
  ## What it does
198
232
 
@@ -9,7 +9,7 @@
9
9
  "importPath": "@working-theory/ui/sections",
10
10
  "rootBarrel": "@working-theory/ui",
11
11
  "sourceRoot": "packages/ui/src/sections",
12
- "count": 54
12
+ "count": 55
13
13
  },
14
14
  {
15
15
  "name": "blocks",
@@ -17,7 +17,7 @@
17
17
  "importPath": "@working-theory/ui/blocks",
18
18
  "rootBarrel": "@working-theory/ui",
19
19
  "sourceRoot": "packages/ui/src/blocks",
20
- "count": 97
20
+ "count": 99
21
21
  },
22
22
  {
23
23
  "name": "chrome",
@@ -188,6 +188,17 @@
188
188
  "descriptionGrade": "strong",
189
189
  "sectionType": "awards"
190
190
  },
191
+ {
192
+ "name": "BeforeAfter",
193
+ "tier": "sections",
194
+ "sourcePath": "packages/ui/src/sections/BeforeAfter.tsx",
195
+ "importPath": "@working-theory/ui/sections",
196
+ "exported": true,
197
+ "description": "A before/after comparison — use on a case-study or portfolio page to show what a client had and what they have now: two labeled panels behind a Side-by-side / Before / After selector, each body an image or rows of content, with an optional catalyst column between them and a key-takeaway box below.",
198
+ "descriptionSource": "registry",
199
+ "descriptionGrade": "strong",
200
+ "sectionType": "before-after"
201
+ },
191
202
  {
192
203
  "name": "BentoGrid",
193
204
  "tier": "sections",
@@ -991,6 +1002,17 @@
991
1002
  "descriptionGrade": "strong",
992
1003
  "sectionType": null
993
1004
  },
1005
+ {
1006
+ "name": "ContactFallback",
1007
+ "tier": "blocks",
1008
+ "sourcePath": "packages/ui/src/blocks/ContactFallback.tsx",
1009
+ "importPath": "@working-theory/ui/blocks",
1010
+ "exported": true,
1011
+ "description": "The contact email in place of a contact form. Shown when a site cannot take messages through its form: in production with neither a database nor an email key, the page renders this instead, and `LeadCaptureForm`'s `unavailable` state renders this same markup when a submit is refused — so the two fallbacks are one component.",
1012
+ "descriptionSource": "doc-comment",
1013
+ "descriptionGrade": "strong",
1014
+ "sectionType": null
1015
+ },
994
1016
  {
995
1017
  "name": "ContactFormFields",
996
1018
  "tier": "blocks",
@@ -1167,6 +1189,17 @@
1167
1189
  "descriptionGrade": "strong",
1168
1190
  "sectionType": null
1169
1191
  },
1192
+ {
1193
+ "name": "LeadCaptureForm",
1194
+ "tier": "blocks",
1195
+ "sourcePath": "packages/ui/src/blocks/LeadCaptureForm.tsx",
1196
+ "importPath": "@working-theory/ui/blocks",
1197
+ "exported": true,
1198
+ "description": "The one contact form every template renders. Submits ONLY through the `action` prop — a Server Action the page binds — so there is no fetch, no URL and no browser-side JSON here.",
1199
+ "descriptionSource": "doc-comment",
1200
+ "descriptionGrade": "strong",
1201
+ "sectionType": null
1202
+ },
1170
1203
  {
1171
1204
  "name": "LinkCard",
1172
1205
  "tier": "blocks",
@@ -4912,6 +4945,13 @@
4912
4945
  "tile"
4913
4946
  ]
4914
4947
  },
4948
+ "tileHover": {
4949
+ "type": "string",
4950
+ "enum": [
4951
+ "lift",
4952
+ "outline"
4953
+ ]
4954
+ },
4915
4955
  "eyebrow": {
4916
4956
  "type": "string"
4917
4957
  },
@@ -6218,7 +6258,15 @@
6218
6258
  "type": "string",
6219
6259
  "enum": [
6220
6260
  "soft",
6221
- "solid"
6261
+ "solid",
6262
+ "switch"
6263
+ ]
6264
+ },
6265
+ "gapAbove": {
6266
+ "type": "string",
6267
+ "enum": [
6268
+ "default",
6269
+ "tight"
6222
6270
  ]
6223
6271
  },
6224
6272
  "addonLayout": {
@@ -7556,6 +7604,468 @@
7556
7604
  },
7557
7605
  "schemaError": null
7558
7606
  },
7607
+ {
7608
+ "type": "before-after",
7609
+ "component": "BeforeAfter",
7610
+ "whenToUse": "A before/after comparison — use on a case-study or portfolio page to show what a client had and what they have now: two labeled panels behind a Side-by-side / Before / After selector, each body an image or rows of content, with an optional catalyst column between them and a key-takeaway box below.",
7611
+ "schema": {
7612
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
7613
+ "type": "object",
7614
+ "properties": {
7615
+ "header": {
7616
+ "type": "object",
7617
+ "properties": {
7618
+ "headline": {
7619
+ "type": "string"
7620
+ },
7621
+ "tagline": {
7622
+ "type": "string"
7623
+ },
7624
+ "tags": {
7625
+ "maxItems": 6,
7626
+ "type": "array",
7627
+ "items": {
7628
+ "type": "string"
7629
+ }
7630
+ },
7631
+ "logo": {
7632
+ "type": "object",
7633
+ "properties": {
7634
+ "src": {
7635
+ "type": "string"
7636
+ },
7637
+ "alt": {
7638
+ "type": "string"
7639
+ },
7640
+ "width": {
7641
+ "type": "number"
7642
+ },
7643
+ "height": {
7644
+ "type": "number"
7645
+ },
7646
+ "blurDataURL": {
7647
+ "type": "string"
7648
+ }
7649
+ },
7650
+ "required": [
7651
+ "src",
7652
+ "alt"
7653
+ ]
7654
+ }
7655
+ },
7656
+ "required": [
7657
+ "headline"
7658
+ ]
7659
+ },
7660
+ "pager": {
7661
+ "type": "object",
7662
+ "properties": {
7663
+ "prev": {
7664
+ "type": "object",
7665
+ "properties": {
7666
+ "label": {
7667
+ "type": "string"
7668
+ },
7669
+ "href": {
7670
+ "type": "string"
7671
+ },
7672
+ "variant": {
7673
+ "type": "string",
7674
+ "enum": [
7675
+ "default",
7676
+ "outline",
7677
+ "secondary",
7678
+ "ghost",
7679
+ "link",
7680
+ "gradient"
7681
+ ]
7682
+ },
7683
+ "external": {
7684
+ "type": "boolean"
7685
+ }
7686
+ },
7687
+ "required": [
7688
+ "label",
7689
+ "href"
7690
+ ]
7691
+ },
7692
+ "next": {
7693
+ "type": "object",
7694
+ "properties": {
7695
+ "label": {
7696
+ "type": "string"
7697
+ },
7698
+ "href": {
7699
+ "type": "string"
7700
+ },
7701
+ "variant": {
7702
+ "type": "string",
7703
+ "enum": [
7704
+ "default",
7705
+ "outline",
7706
+ "secondary",
7707
+ "ghost",
7708
+ "link",
7709
+ "gradient"
7710
+ ]
7711
+ },
7712
+ "external": {
7713
+ "type": "boolean"
7714
+ }
7715
+ },
7716
+ "required": [
7717
+ "label",
7718
+ "href"
7719
+ ]
7720
+ },
7721
+ "backTo": {
7722
+ "type": "object",
7723
+ "properties": {
7724
+ "label": {
7725
+ "type": "string"
7726
+ },
7727
+ "href": {
7728
+ "type": "string"
7729
+ },
7730
+ "variant": {
7731
+ "type": "string",
7732
+ "enum": [
7733
+ "default",
7734
+ "outline",
7735
+ "secondary",
7736
+ "ghost",
7737
+ "link",
7738
+ "gradient"
7739
+ ]
7740
+ },
7741
+ "external": {
7742
+ "type": "boolean"
7743
+ }
7744
+ },
7745
+ "required": [
7746
+ "label",
7747
+ "href"
7748
+ ]
7749
+ }
7750
+ }
7751
+ },
7752
+ "before": {
7753
+ "type": "object",
7754
+ "properties": {
7755
+ "label": {
7756
+ "type": "string"
7757
+ },
7758
+ "tone": {
7759
+ "type": "string",
7760
+ "enum": [
7761
+ "brand",
7762
+ "accent",
7763
+ "neutral",
7764
+ "success",
7765
+ "error",
7766
+ "warning",
7767
+ "info"
7768
+ ]
7769
+ },
7770
+ "icon": {
7771
+ "type": "string"
7772
+ },
7773
+ "align": {
7774
+ "type": "string",
7775
+ "enum": [
7776
+ "start",
7777
+ "center",
7778
+ "end"
7779
+ ]
7780
+ },
7781
+ "image": {
7782
+ "type": "object",
7783
+ "properties": {
7784
+ "src": {
7785
+ "type": "string"
7786
+ },
7787
+ "alt": {
7788
+ "type": "string"
7789
+ },
7790
+ "width": {
7791
+ "type": "number"
7792
+ },
7793
+ "height": {
7794
+ "type": "number"
7795
+ },
7796
+ "blurDataURL": {
7797
+ "type": "string"
7798
+ }
7799
+ },
7800
+ "required": [
7801
+ "src",
7802
+ "alt"
7803
+ ]
7804
+ },
7805
+ "rows": {
7806
+ "maxItems": 8,
7807
+ "type": "array",
7808
+ "items": {
7809
+ "type": "object",
7810
+ "properties": {
7811
+ "title": {
7812
+ "type": "string"
7813
+ },
7814
+ "body": {
7815
+ "type": "string"
7816
+ },
7817
+ "icon": {
7818
+ "type": "string"
7819
+ }
7820
+ },
7821
+ "required": [
7822
+ "title",
7823
+ "body"
7824
+ ]
7825
+ }
7826
+ },
7827
+ "verdict": {
7828
+ "type": "string"
7829
+ },
7830
+ "notes": {
7831
+ "type": "array",
7832
+ "items": {
7833
+ "type": "string"
7834
+ }
7835
+ }
7836
+ },
7837
+ "required": [
7838
+ "label"
7839
+ ]
7840
+ },
7841
+ "after": {
7842
+ "type": "object",
7843
+ "properties": {
7844
+ "label": {
7845
+ "type": "string"
7846
+ },
7847
+ "tone": {
7848
+ "type": "string",
7849
+ "enum": [
7850
+ "brand",
7851
+ "accent",
7852
+ "neutral",
7853
+ "success",
7854
+ "error",
7855
+ "warning",
7856
+ "info"
7857
+ ]
7858
+ },
7859
+ "icon": {
7860
+ "type": "string"
7861
+ },
7862
+ "align": {
7863
+ "type": "string",
7864
+ "enum": [
7865
+ "start",
7866
+ "center",
7867
+ "end"
7868
+ ]
7869
+ },
7870
+ "image": {
7871
+ "type": "object",
7872
+ "properties": {
7873
+ "src": {
7874
+ "type": "string"
7875
+ },
7876
+ "alt": {
7877
+ "type": "string"
7878
+ },
7879
+ "width": {
7880
+ "type": "number"
7881
+ },
7882
+ "height": {
7883
+ "type": "number"
7884
+ },
7885
+ "blurDataURL": {
7886
+ "type": "string"
7887
+ }
7888
+ },
7889
+ "required": [
7890
+ "src",
7891
+ "alt"
7892
+ ]
7893
+ },
7894
+ "rows": {
7895
+ "maxItems": 8,
7896
+ "type": "array",
7897
+ "items": {
7898
+ "type": "object",
7899
+ "properties": {
7900
+ "title": {
7901
+ "type": "string"
7902
+ },
7903
+ "body": {
7904
+ "type": "string"
7905
+ },
7906
+ "icon": {
7907
+ "type": "string"
7908
+ }
7909
+ },
7910
+ "required": [
7911
+ "title",
7912
+ "body"
7913
+ ]
7914
+ }
7915
+ },
7916
+ "verdict": {
7917
+ "type": "string"
7918
+ },
7919
+ "notes": {
7920
+ "type": "array",
7921
+ "items": {
7922
+ "type": "string"
7923
+ }
7924
+ }
7925
+ },
7926
+ "required": [
7927
+ "label"
7928
+ ]
7929
+ },
7930
+ "catalyst": {
7931
+ "type": "object",
7932
+ "properties": {
7933
+ "image": {
7934
+ "type": "object",
7935
+ "properties": {
7936
+ "src": {
7937
+ "type": "string"
7938
+ },
7939
+ "alt": {
7940
+ "type": "string"
7941
+ },
7942
+ "width": {
7943
+ "type": "number"
7944
+ },
7945
+ "height": {
7946
+ "type": "number"
7947
+ },
7948
+ "blurDataURL": {
7949
+ "type": "string"
7950
+ }
7951
+ },
7952
+ "required": [
7953
+ "src",
7954
+ "alt"
7955
+ ]
7956
+ },
7957
+ "title": {
7958
+ "type": "string"
7959
+ },
7960
+ "subtitle": {
7961
+ "type": "string"
7962
+ },
7963
+ "tone": {
7964
+ "type": "string",
7965
+ "enum": [
7966
+ "brand",
7967
+ "accent",
7968
+ "neutral",
7969
+ "success",
7970
+ "error",
7971
+ "warning",
7972
+ "info"
7973
+ ]
7974
+ },
7975
+ "arrow": {
7976
+ "type": "boolean"
7977
+ },
7978
+ "steps": {
7979
+ "maxItems": 8,
7980
+ "type": "array",
7981
+ "items": {
7982
+ "type": "object",
7983
+ "properties": {
7984
+ "label": {
7985
+ "type": "string"
7986
+ },
7987
+ "marker": {
7988
+ "type": "string",
7989
+ "maxLength": 2
7990
+ }
7991
+ },
7992
+ "required": [
7993
+ "label"
7994
+ ]
7995
+ }
7996
+ }
7997
+ },
7998
+ "required": [
7999
+ "title"
8000
+ ]
8001
+ },
8002
+ "takeaway": {
8003
+ "type": "object",
8004
+ "properties": {
8005
+ "label": {
8006
+ "type": "string"
8007
+ },
8008
+ "body": {
8009
+ "type": "string"
8010
+ },
8011
+ "icon": {
8012
+ "type": "string"
8013
+ },
8014
+ "tone": {
8015
+ "type": "string",
8016
+ "enum": [
8017
+ "brand",
8018
+ "accent",
8019
+ "neutral",
8020
+ "success",
8021
+ "error",
8022
+ "warning",
8023
+ "info"
8024
+ ]
8025
+ }
8026
+ },
8027
+ "required": [
8028
+ "body"
8029
+ ]
8030
+ },
8031
+ "defaultView": {
8032
+ "type": "string",
8033
+ "enum": [
8034
+ "side-by-side",
8035
+ "before",
8036
+ "after"
8037
+ ]
8038
+ },
8039
+ "viewLabels": {
8040
+ "type": "object",
8041
+ "properties": {
8042
+ "sideBySide": {
8043
+ "type": "string"
8044
+ },
8045
+ "before": {
8046
+ "type": "string"
8047
+ },
8048
+ "after": {
8049
+ "type": "string"
8050
+ }
8051
+ },
8052
+ "required": [
8053
+ "sideBySide",
8054
+ "before",
8055
+ "after"
8056
+ ]
8057
+ },
8058
+ "lightbox": {
8059
+ "type": "boolean"
8060
+ }
8061
+ },
8062
+ "required": [
8063
+ "before",
8064
+ "after"
8065
+ ]
8066
+ },
8067
+ "schemaError": null
8068
+ },
7559
8069
  {
7560
8070
  "type": "bento-grid",
7561
8071
  "component": "BentoGrid",
@@ -8229,8 +8739,7 @@
8229
8739
  }
8230
8740
  },
8231
8741
  "required": [
8232
- "fields",
8233
- "action"
8742
+ "fields"
8234
8743
  ]
8235
8744
  },
8236
8745
  "schemaError": null
@@ -8693,6 +9202,9 @@
8693
9202
  "slug": {
8694
9203
  "type": "string"
8695
9204
  },
9205
+ "href": {
9206
+ "type": "string"
9207
+ },
8696
9208
  "excerpt": {
8697
9209
  "type": "string"
8698
9210
  },
@@ -8914,6 +9426,9 @@
8914
9426
  "slug": {
8915
9427
  "type": "string"
8916
9428
  },
9429
+ "href": {
9430
+ "type": "string"
9431
+ },
8917
9432
  "excerpt": {
8918
9433
  "type": "string"
8919
9434
  },