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.
- package/README.md +44 -10
- package/component-catalog.json +520 -5
- package/component-catalog.md +9 -6
- package/dist/cli.js +22 -24
- package/dist/lib/extract-module-bundle.js +5 -1
- package/dist/lib/module-license-gate.d.ts +79 -0
- package/dist/lib/module-license-gate.js +160 -12
- package/dist/lib/module-tier.d.ts +45 -16
- package/dist/lib/module-tier.js +76 -0
- package/dist/lib/pro-callout.js +10 -2
- package/dist/parse-args.d.ts +78 -10
- package/dist/parse-args.js +204 -14
- package/dist/programmatic.d.ts +39 -9
- package/dist/programmatic.js +163 -25
- package/dist/site-roster.js +11 -6
- package/dist/starter-grid.d.ts +216 -0
- package/dist/starter-grid.js +449 -0
- package/dist/surfaces.d.ts +4 -4
- package/dist/surfaces.js +102 -43
- package/dist/template-manifest.d.ts +36 -17
- package/dist/template-manifest.js +121 -367
- package/dist/template-names.d.ts +14 -12
- package/dist/template-names.js +13 -17
- package/package.json +3 -3
- package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -1
- package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
- package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
- package/site-templates/_base/content/en/GlossaryList/glossary.mdx +0 -1
- package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +0 -1
- package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
- package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
- package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +15 -0
- package/site-templates/_base/content/en/UseCase/persona-1.mdx +69 -0
- package/site-templates/_base/content/en/UseCase/persona-2.mdx +69 -0
- package/site-templates/_base/content/en/UseCase/persona-3.mdx +69 -0
- package/site-templates/designs/standard/DESIGN.md +5 -0
- package/site-templates/marketing-site/DESIGN.md +5 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +89 -25
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +35 -14
- package/site-templates/marketing-site-free/DESIGN.md +5 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +95 -29
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +74 -44
- package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +17 -29
- package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -1
- package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
- package/site-templates/saas-product/DESIGN.md +5 -0
- package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
- package/site-templates/{simple-service → shapes/local-business-service}/TEMPLATE-MANIFEST.json +96 -76
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +302 -0
- package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
- package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
- package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
- package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/{simple-service → shapes/local-business-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +7 -8
- package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
- package/site-templates/shapes/local-business-service/provenance.json +4 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +362 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +300 -0
- package/site-templates/shapes/organization-service/ailk-template.json +10 -0
- package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
- package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/shapes/organization-service/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/ServicesList/services.mdx +72 -0
- package/site-templates/shapes/organization-service/provenance.json +4 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +369 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +299 -0
- package/site-templates/shapes/person-service/ailk-template.json +10 -0
- package/site-templates/shapes/person-service/content/_site.mdx +85 -0
- package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
- package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
- package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +169 -0
- package/site-templates/shapes/person-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
- package/site-templates/shapes/person-service/provenance.json +4 -0
- package/templates/.claude/skills/README.md +3 -2
- package/templates/.claude/skills/add-page/references/page-types.md +4 -0
- package/templates/.claude/skills/setup-database/SKILL.md +156 -0
- package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
- package/templates/.claude/skills/setup-deploy/SKILL.md +64 -32
- package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +19 -28
- package/templates/.claude/skills/setup-deploy/references/runbook-template.md +58 -102
- package/templates/DESIGN.md +5 -0
- package/templates/README.md +46 -38
- package/templates/apps/api/CLAUDE.md +3 -2
- package/templates/apps/api/src/config/__tests__/index.test.ts +115 -14
- package/templates/apps/api/src/config/index.ts +35 -16
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
- package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
- package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
- package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
- package/templates/apps/api/src/openapi/spec.ts +63 -12
- package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
- package/templates/apps/api/src/routes/leads/index.ts +46 -1
- package/templates/apps/api/src/server.ts +7 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
- package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
- package/templates/apps/api/src/services/lead-routing.ts +140 -30
- package/templates/apps/api/src/services/leads-inbox.ts +48 -11
- package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
- package/templates/apps/mcp/src/tools/create_project.ts +21 -6
- package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +14 -6
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +10 -9
- package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +227 -84
- package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
- package/templates/apps/web/app/[locale]/contact/page.tsx +105 -15
- package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
- package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
- package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
- package/templates/apps/web/app/[locale]/layout.tsx +37 -5
- package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
- package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
- package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +106 -14
- package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
- package/templates/apps/web/app/[locale]/portfolio/page.tsx +49 -0
- package/templates/apps/web/app/[locale]/use-cases/[slug]/page.tsx +18 -3
- package/templates/apps/web/lib/nav-config.ts +48 -36
- package/templates/apps/web/lib/site-identity.ts +14 -0
- package/templates/apps/web/messages/en.json +28 -2
- package/templates/content/_site.mdx +4 -2
- package/templates/content/en/BlogList/blog.mdx +37 -16
- package/templates/content/en/ContactPage/contact.mdx +14 -44
- package/templates/content/en/HomePage/home.mdx +8 -16
- package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
- package/templates/content/en/UseCasesList/use-cases.mdx +6 -6
- package/templates/database/CHANGELOG.md +7 -0
- package/templates/database/package.json +1 -1
- package/versions.json +33 -33
- package/site-templates/_base/content/en/UseCase/first-use-case.mdx +0 -23
- package/site-templates/_base/content/en/UseCase/second-use-case.mdx +0 -23
- package/site-templates/_base/content/en/UseCase/third-use-case.mdx +0 -23
- package/site-templates/simple-service/DESIGN.md +0 -162
- package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -333
- package/site-templates/simple-service/ailk-template.json +0 -11
- package/site-templates/simple-service/content/en/BookCall/book-call.mdx +0 -53
- package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -32
- package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
- package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
- package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
- package/site-templates/simple-service/provenance.json +0 -4
- package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -211
- package/templates/apps/web/app/[locale]/contact/__tests__/ContactForm.test.tsx +0 -96
- 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
|
|
20
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
|
package/component-catalog.json
CHANGED
|
@@ -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":
|
|
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":
|
|
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
|
},
|