create-ailk 0.8.0 → 0.9.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 +68 -0
- package/component-catalog.json +279 -45
- package/dist/add-module.d.ts +20 -0
- package/dist/add-module.js +43 -7
- package/dist/add-route.d.ts +56 -0
- package/dist/add-route.js +286 -0
- package/dist/apply-design-md.d.ts +7 -0
- package/dist/apply-design-md.js +50 -0
- package/dist/apply-design.d.ts +64 -0
- package/dist/apply-design.js +273 -0
- package/dist/claude-md.d.ts +111 -0
- package/dist/claude-md.js +334 -0
- package/dist/cli.js +92 -4
- package/dist/derive-architecture.js +41 -36
- package/dist/design-compile.d.ts +71 -0
- package/dist/design-compile.js +98 -0
- package/dist/design-package.d.ts +83 -0
- package/dist/design-package.js +468 -0
- package/dist/design-presets.d.ts +86 -0
- package/dist/design-presets.js +642 -0
- package/dist/design-scaffold.d.ts +76 -0
- package/dist/design-scaffold.js +220 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -1
- package/dist/legacy-nav-renderers.d.ts +45 -0
- package/dist/legacy-nav-renderers.js +545 -0
- package/dist/lib/auth-secret-file.d.ts +19 -0
- package/dist/lib/auth-secret-file.js +112 -0
- package/dist/lib/design-checks.d.ts +78 -0
- package/dist/lib/design-checks.js +174 -0
- package/dist/lib/license-key-files.d.ts +9 -0
- package/dist/lib/license-key-files.js +2 -2
- package/dist/lib/module-license-gate.d.ts +19 -9
- package/dist/lib/module-license-gate.js +19 -8
- package/dist/lib/render-verdict.d.ts +52 -0
- package/dist/lib/render-verdict.js +77 -0
- package/dist/lib/scaffold-render-sweep.d.ts +105 -0
- package/dist/lib/scaffold-render-sweep.js +236 -0
- package/dist/module-architecture.d.ts +19 -16
- package/dist/module-architecture.js +64 -21
- package/dist/parse-args.d.ts +12 -2
- package/dist/parse-args.js +74 -13
- package/dist/programmatic.d.ts +30 -6
- package/dist/programmatic.js +206 -17
- package/dist/site-chrome.d.ts +19 -9
- package/dist/site-chrome.js +23 -13
- package/dist/site-manifest.d.ts +25 -0
- package/dist/site-manifest.js +254 -0
- package/dist/site-roster.d.ts +41 -0
- package/dist/site-roster.js +141 -8
- package/dist/starter-grid.d.ts +32 -16
- package/dist/starter-grid.js +129 -33
- package/dist/surfaces.d.ts +41 -9
- package/dist/surfaces.js +200 -83
- package/dist/template-manifest.d.ts +30 -13
- package/dist/template-manifest.js +49 -24
- package/package.json +5 -4
- package/site-templates/_base/content/en/UseCase/persona-1.mdx +7 -6
- package/site-templates/_base/content/en/UseCase/persona-2.mdx +7 -6
- package/site-templates/_base/content/en/UseCase/persona-3.mdx +7 -6
- package/site-templates/{minimalism-site/TEMPLATE-MANIFEST.json → aliases/minimalism-site.TEMPLATE-MANIFEST.json} +72 -40
- package/site-templates/designs/minimalism/DESIGN.md +98 -6
- package/site-templates/designs/minimalism/sample/README.md +48 -0
- package/site-templates/designs/standard/DESIGN.md +98 -6
- package/site-templates/marketing-site/DESIGN.md +98 -6
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +60 -27
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +50 -30
- package/site-templates/marketing-site-free/DESIGN.md +98 -6
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +60 -24
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +44 -27
- package/site-templates/marketing-site-free/ailk-template.json +1 -1
- package/site-templates/saas-product/DESIGN.md +98 -6
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +74 -20
- package/site-templates/shapes/local-business-service/ailk-template.json +1 -1
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +74 -20
- package/site-templates/shapes/organization-service/ailk-template.json +1 -1
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +75 -21
- package/site-templates/shapes/person-service/ailk-template.json +1 -1
- package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +1 -1
- package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +2 -2
- package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +4 -2
- package/site-templates/shapes/person-service/content/en/ServicesList/services.mdx +1 -1
- package/templates/.claude/rules/architecture.md +7 -0
- package/templates/.claude/skills/README.md +3 -2
- package/templates/.claude/skills/add-auth/references/env-vars.md +22 -15
- package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +3 -2
- package/templates/.claude/skills/add-page/SKILL.md +241 -238
- package/templates/.claude/skills/add-page/references/page-types.md +85 -76
- package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
- package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
- package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
- package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
- package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
- package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
- package/templates/.claude/skills/check-site/SKILL.md +23 -0
- package/templates/.claude/skills/fill-page/SKILL.md +26 -7
- package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
- package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +28 -11
- package/templates/.claude/skills/update-page/SKILL.md +117 -0
- package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
- package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
- package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
- package/templates/.github/workflows/ci.yml +4 -0
- package/templates/.prettierignore +1 -0
- package/templates/CLAUDE.md +146 -103
- package/templates/DESIGN.md +98 -6
- package/templates/README.md +50 -38
- package/templates/apps/api/.env.example +2 -1
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
- package/templates/apps/api/src/__tests__/server.test.ts +116 -0
- package/templates/apps/api/src/lib/stripe.ts +9 -0
- package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
- package/templates/apps/api/src/middleware/auth.ts +54 -0
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
- package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
- package/templates/apps/api/src/server.ts +28 -0
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
- package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
- package/templates/apps/api/src/services/revalidation.ts +60 -15
- package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
- package/templates/apps/mcp/src/tools/purchase.ts +4 -2
- package/templates/apps/web/.env.example +13 -0
- package/templates/apps/web/CLAUDE.md +22 -28
- package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
- package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
- package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
- package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
- package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +4 -3
- package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
- package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/layout.tsx +35 -19
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/portfolio/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
- package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
- package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
- package/templates/apps/web/app/api/revalidate/route.ts +78 -36
- package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
- package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
- package/templates/apps/web/lib/locale-guard.ts +18 -0
- package/templates/apps/web/lib/meet-placeholder.ts +5 -0
- package/templates/apps/web/lib/nav-config.ts +14 -13
- package/templates/apps/web/lib/site-brand.tsx +13 -9
- package/templates/apps/web/lib/site-logo.tsx +36 -0
- package/templates/apps/web/lib/site-theme.ts +46 -26
- package/templates/apps/web/messages/en.json +23 -9
- package/templates/apps/web/middleware.ts +28 -4
- package/templates/content/en/BookCall/book-a-call.mdx +80 -0
- package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
- package/templates/content/en/BookCall/onsite-service.mdx +56 -0
- package/templates/content/en/BookCall/start-project.mdx +56 -0
- package/templates/content/en/ContactPage/contact.mdx +40 -1
- package/templates/content/en/HomePage/home.mdx +2 -6
- package/templates/content/en/LandingPage/meet.mdx +59 -0
- package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
- package/templates/database/CHANGELOG.md +7 -0
- package/templates/database/package.json +1 -1
- package/templates/package.json +2 -1
- package/templates/tools/check-claude-md.ts +128 -0
- package/versions.json +33 -33
- package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -52
- package/site-templates/minimalism-site/DESIGN.md +0 -162
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -458
- package/site-templates/minimalism-site/ailk-template.json +0 -23
- package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
- package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
- package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
- package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
- package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
- package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -123
- package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
- package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +0 -73
- package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
- package/site-templates/minimalism-site/provenance.json +0 -4
- package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
- package/templates/apps/web/app/[locale]/book-a-call/page.tsx +0 -50
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
- /package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "BookCall"
|
|
3
|
-
slug: "book-call"
|
|
4
|
-
title: "{Book a call: what a visitor gets from it}"
|
|
5
|
-
description: "{One sentence on who the call is for and what they leave with}"
|
|
6
|
-
schema:
|
|
7
|
-
mainEntity:
|
|
8
|
-
"@type": "Offer"
|
|
9
|
-
name: "{Your call name}"
|
|
10
|
-
price: 0
|
|
11
|
-
priceCurrency: "USD"
|
|
12
|
-
sections:
|
|
13
|
-
[
|
|
14
|
-
{
|
|
15
|
-
"id": "hero",
|
|
16
|
-
"type": "hero",
|
|
17
|
-
"data":
|
|
18
|
-
{
|
|
19
|
-
"eyebrow": "Book a call",
|
|
20
|
-
"headline": "{Book a call: what a visitor gets from it}",
|
|
21
|
-
"subheadline": "{One sentence on who the call is for and what they leave with}",
|
|
22
|
-
"primaryCta": { "label": "Book a time", "href": "/meet" },
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "what-happens-on-the-call",
|
|
27
|
-
"type": "items",
|
|
28
|
-
"data":
|
|
29
|
-
{
|
|
30
|
-
"headline": "What happens on the call?",
|
|
31
|
-
"columns": 3,
|
|
32
|
-
"items":
|
|
33
|
-
[
|
|
34
|
-
{
|
|
35
|
-
"title": "{The first thing you cover}",
|
|
36
|
-
"description": "{One or two sentences on what the visitor learns or decides here}",
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"title": "{The second thing you cover}",
|
|
40
|
-
"description": "{One or two sentences on what the visitor learns or decides here}",
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"title": "{The next step you agree}",
|
|
44
|
-
"description": "{One or two sentences on what happens after the call}",
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
]
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
{/* Rendered from frontmatter `sections[]` by the /book-a-call route. This template carries the scheduling module, so the call to action opens the /meet booker. It overrides the base layer's copy, which points at /contact. The `schema:` Offer is the page's JSON-LD main entity — a free call. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "ContactPage"
|
|
3
|
-
slug: "contact"
|
|
4
|
-
title: "Contact"
|
|
5
|
-
description: "One form, one field group, an inline confirmation. Placeholder copy — replace before you launch."
|
|
6
|
-
sections:
|
|
7
|
-
[
|
|
8
|
-
{
|
|
9
|
-
"id": "hero",
|
|
10
|
-
"type": "hero",
|
|
11
|
-
"data":
|
|
12
|
-
{
|
|
13
|
-
"variant": "centered",
|
|
14
|
-
"eyebrow": "Contact",
|
|
15
|
-
"headline": "Say what you are trying to do",
|
|
16
|
-
"subheadline": "{One line on what happens after you send this, and how long it takes.}",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
"id": "closing",
|
|
21
|
-
"type": "cta",
|
|
22
|
-
"data":
|
|
23
|
-
{
|
|
24
|
-
"variant": "minimal",
|
|
25
|
-
"headline": "Would a call be faster?",
|
|
26
|
-
"primaryCta": { "label": "Hire me →", "href": "/meet" },
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
]
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
{/_ The /contact route mounts the page's one contact surface — the guided
|
|
33
|
-
intake, with its fallback form — which posts to the site's own API
|
|
34
|
-
(`/v1/leads/submit`) and confirms inline. Placeholder copy. _/}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "FAQPage"
|
|
3
|
-
slug: "faq"
|
|
4
|
-
title: "FAQ"
|
|
5
|
-
description: "The questions people ask before they get in touch. Placeholder copy — replace every answer before you launch."
|
|
6
|
-
sections:
|
|
7
|
-
[
|
|
8
|
-
{
|
|
9
|
-
"id": "faq",
|
|
10
|
-
"type": "faq",
|
|
11
|
-
"data":
|
|
12
|
-
{
|
|
13
|
-
"headline": "Questions",
|
|
14
|
-
"variant": "centered",
|
|
15
|
-
"initialOpen": "first",
|
|
16
|
-
"items":
|
|
17
|
-
[
|
|
18
|
-
{
|
|
19
|
-
"question": "{What exactly do you do?}",
|
|
20
|
-
"answer": "{Answer in two or three sentences. Say the thing plainly; do not sell here.}",
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"question": "{Who is this for, and who is it not for?}",
|
|
24
|
-
"answer": "{Name both. A reader who rules themselves out here is a reader you did not waste an hour on.}",
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"question": "{How long does it take?}",
|
|
28
|
-
"answer": "{Give a real range and say what moves it.}",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"question": "{What does it cost?}",
|
|
32
|
-
"answer": "{Give the shape even if you cannot give the number — fixed fee, retainer, day rate — and what it excludes.}",
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"question": "{How do the reports work?}",
|
|
36
|
-
"answer": "{One or two sentences on cadence, who gets them and whether they are public.}",
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
"supportLink":
|
|
40
|
-
{ "label": "Still stuck? Get in touch", "href": "/contact" },
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"id": "closing",
|
|
45
|
-
"type": "cta",
|
|
46
|
-
"data":
|
|
47
|
-
{
|
|
48
|
-
"variant": "minimal",
|
|
49
|
-
"headline": "Still have a question?",
|
|
50
|
-
"primaryCta": { "label": "Contact me →", "href": "/contact" },
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
]
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
{/_ Linked from the footer bottom bar, not from a nav item — this template
|
|
57
|
-
renders no nav items (`layout.nav: "mark-only"`). Placeholder copy. _/}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "LandingPage"
|
|
3
|
-
slug: "referral"
|
|
4
|
-
title: "Refer someone"
|
|
5
|
-
description: "The referral magnet — what a referrer gets, and the one-step request that starts it. Placeholder copy; replace before you launch."
|
|
6
|
-
sections:
|
|
7
|
-
[
|
|
8
|
-
{
|
|
9
|
-
"id": "hero",
|
|
10
|
-
"type": "hero",
|
|
11
|
-
"data":
|
|
12
|
-
{
|
|
13
|
-
"variant": "centered",
|
|
14
|
-
"eyebrow": "Referrals",
|
|
15
|
-
"headline": "Know someone who should be on this list?",
|
|
16
|
-
"subheadline": "{One line on why an introduction is worth making — what the person you refer gets, and what you get.}",
|
|
17
|
-
"checklist":
|
|
18
|
-
[
|
|
19
|
-
"{What a good referral looks like}",
|
|
20
|
-
"{What happens after you send one}",
|
|
21
|
-
"{What you get when it lands}",
|
|
22
|
-
],
|
|
23
|
-
"primaryCta":
|
|
24
|
-
{ "label": "Refer someone →", "href": "/flows/referral/start" },
|
|
25
|
-
"ctaSize": "xl",
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"id": "how-it-works",
|
|
30
|
-
"type": "stair-steps",
|
|
31
|
-
"data":
|
|
32
|
-
{
|
|
33
|
-
"headline": "Three steps, about a minute",
|
|
34
|
-
"tiles":
|
|
35
|
-
[
|
|
36
|
-
{
|
|
37
|
-
"title": "Send the introduction",
|
|
38
|
-
"body": "{One line on what you tell us — a name, a way to reach them, one sentence of why.}",
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"title": "We reach out",
|
|
42
|
-
"body": "{One line on the timeline and the tone of the first message.}",
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"title": "You hear back either way",
|
|
46
|
-
"body": "{One line on what you are told, and when.}",
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"id": "request",
|
|
53
|
-
"type": "cta",
|
|
54
|
-
"data":
|
|
55
|
-
{
|
|
56
|
-
"variant": "minimal",
|
|
57
|
-
"headline": "Make an introduction",
|
|
58
|
-
"description": "{One line restating the ask. Keep it to a single sentence.}",
|
|
59
|
-
"primaryCta":
|
|
60
|
-
{ "label": "Refer someone →", "href": "/flows/referral/start" },
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
]
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
{/\*
|
|
67
|
-
The magnet's pitch. Its bottom action opens the referral REQUEST, which is a
|
|
68
|
-
`signal-collectors` flow at `/flows/referral/start` — `flows/referral.flow.json`
|
|
69
|
-
in this tree, installed to `database/flows/referral.flow.json`.
|
|
70
|
-
|
|
71
|
-
Why a flow and not a `/referral/request` route: the issue named that path, but
|
|
72
|
-
it has no `ROUTES` row and no route directory, so serving it would mean
|
|
73
|
-
shipping a `page.tsx` into every scaffold for one template's page — which a
|
|
74
|
-
template may never do (a template is data and content, never code). The flow
|
|
75
|
-
engine already serves exactly this shape at a route every signal-collectors
|
|
76
|
-
scaffold has. Recorded on #5589 and in the PR body; Sam's call supersedes.
|
|
77
|
-
\*/}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "LandingPage"
|
|
3
|
-
slug: "reports"
|
|
4
|
-
title: "Reports"
|
|
5
|
-
description: "Every report {your company} has published, newest first. Placeholder samples — replace before you launch."
|
|
6
|
-
sections:
|
|
7
|
-
[
|
|
8
|
-
{
|
|
9
|
-
"id": "hero",
|
|
10
|
-
"type": "hero",
|
|
11
|
-
"data":
|
|
12
|
-
{
|
|
13
|
-
"variant": "centered",
|
|
14
|
-
"eyebrow": "Reports",
|
|
15
|
-
"headline": "Research on {your field}, published in full",
|
|
16
|
-
"subheadline": "{One line on the cadence: how often a report lands and who it is written for.}",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
"id": "all-reports",
|
|
21
|
-
"type": "reports-list",
|
|
22
|
-
"data":
|
|
23
|
-
{
|
|
24
|
-
"variant": "cards",
|
|
25
|
-
"reports":
|
|
26
|
-
[
|
|
27
|
-
{
|
|
28
|
-
"slug": "state-of-the-market-2026",
|
|
29
|
-
"title": "State of {Your Market} 2026",
|
|
30
|
-
"date": "May 2026",
|
|
31
|
-
"description": "{One line on the question this report answers.}",
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"slug": "platform-shift-2025",
|
|
35
|
-
"title": "The {Platform Shift} Report",
|
|
36
|
-
"date": "March 2025",
|
|
37
|
-
"description": "{One line on the question this report answers.}",
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"slug": "annual-letter-2024",
|
|
41
|
-
"title": "Annual Letter",
|
|
42
|
-
"date": "December 2024",
|
|
43
|
-
"description": "{One line on the question this report answers.}",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"slug": "field-notes-2023",
|
|
47
|
-
"title": "Field Notes",
|
|
48
|
-
"date": "2023",
|
|
49
|
-
"description": "{One line on the question this report answers.}",
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"id": "closing",
|
|
56
|
-
"type": "cta",
|
|
57
|
-
"data":
|
|
58
|
-
{
|
|
59
|
-
"variant": "minimal",
|
|
60
|
-
"headline": "Want the next one as it lands?",
|
|
61
|
-
"primaryCta": { "label": "Contact me →", "href": "/contact" },
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
]
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
{/_
|
|
68
|
-
`/reports` is served by the generic `[slug]` route over
|
|
69
|
-
`content/<locale>/LandingPage/reports.mdx` (#5469 D2) — the same mechanism
|
|
70
|
-
Free's `/how-it-works` uses, and the reason this row needs no route directory
|
|
71
|
-
and no `GATEABLE_SURFACES` entry. Each card links to `/reports/<slug>`, the
|
|
72
|
-
signal-collectors module's chrome-off reader (#5562).
|
|
73
|
-
_/}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "PurchasePolicyPage"
|
|
3
|
-
slug: "purchase-policy"
|
|
4
|
-
title: "Purchase Policy"
|
|
5
|
-
description: "How cancellations, reschedules and refunds work for bookings made on this site. Placeholder policy — replace every section before you launch."
|
|
6
|
-
sections:
|
|
7
|
-
[
|
|
8
|
-
{
|
|
9
|
-
"id": "purchase-policy-document",
|
|
10
|
-
"type": "document-chassis",
|
|
11
|
-
"data":
|
|
12
|
-
{
|
|
13
|
-
"headline": "Purchase Policy",
|
|
14
|
-
"layout": "article",
|
|
15
|
-
"updated": "Last updated {Month Day, Year}",
|
|
16
|
-
"navGroupLabel": "Contents",
|
|
17
|
-
"sections":
|
|
18
|
-
[
|
|
19
|
-
{
|
|
20
|
-
"id": "cancellation",
|
|
21
|
-
"heading": "Cancellation",
|
|
22
|
-
"blocks":
|
|
23
|
-
[
|
|
24
|
-
{
|
|
25
|
-
"kind": "paragraph",
|
|
26
|
-
"text": "This page is starter content that shipped with your site. It is not a purchase policy, it makes no commitment on behalf of Your Company, and it is not legal advice. Replace every section with the policy you actually operate, and have someone qualified read it before you publish.",
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"kind": "paragraph",
|
|
30
|
-
"text": "This section explains how cancellations and reschedules work for bookings made on this site. The headings are the ones a customer and an agent both look for, so keep them and fill in your own terms.",
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
"subsections":
|
|
34
|
-
[
|
|
35
|
-
{
|
|
36
|
-
"id": "notice",
|
|
37
|
-
"heading": "How much notice is required",
|
|
38
|
-
"blocks":
|
|
39
|
-
[
|
|
40
|
-
{
|
|
41
|
-
"kind": "paragraph",
|
|
42
|
-
"text": "State the notice period in hours before the appointment, and say how it is measured. A customer reading at midnight should be able to work out, without arithmetic you have not shown them, whether they are still inside it.",
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"id": "how-to-cancel",
|
|
48
|
-
"heading": "How to cancel or reschedule",
|
|
49
|
-
"blocks":
|
|
50
|
-
[
|
|
51
|
-
{
|
|
52
|
-
"kind": "paragraph",
|
|
53
|
-
"text": "Give one route to cancel and one to reschedule, and say whether a reschedule inside the notice period counts as a cancellation. If a booking confirmation carries a self-service link, name it here.",
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"id": "fees",
|
|
59
|
-
"heading": "Late cancellations and no-shows",
|
|
60
|
-
"blocks":
|
|
61
|
-
[
|
|
62
|
-
{
|
|
63
|
-
"kind": "paragraph",
|
|
64
|
-
"text": "Say what a late cancellation costs and what a no-show costs, as a figure or a share of the booking, and when each is charged. If you hold a deposit, say what happens to it in each case.",
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
"id": "our-cancellations",
|
|
70
|
-
"heading": "If we cancel",
|
|
71
|
-
"blocks":
|
|
72
|
-
[
|
|
73
|
-
{
|
|
74
|
-
"kind": "paragraph",
|
|
75
|
-
"text": "Set out what a customer gets if you cancel or move an appointment — a full refund, a rebooking, or both — and how quickly you tell them. A policy that only binds one side reads as one.",
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
"id": "exceptions",
|
|
81
|
-
"heading": "Exceptions",
|
|
82
|
-
"blocks":
|
|
83
|
-
[
|
|
84
|
-
{
|
|
85
|
-
"kind": "paragraph",
|
|
86
|
-
"text": "Name the circumstances in which you waive a fee — illness, bereavement, severe weather — and say what you need from the customer to apply the waiver. Vague discretion is worse for you than a short written list.",
|
|
87
|
-
},
|
|
88
|
-
],
|
|
89
|
-
},
|
|
90
|
-
],
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"id": "refunds",
|
|
94
|
-
"heading": "Refunds",
|
|
95
|
-
"blocks":
|
|
96
|
-
[
|
|
97
|
-
{
|
|
98
|
-
"kind": "paragraph",
|
|
99
|
-
"text": "Say what a customer gets back after a cancellation — the booking price, the deposit, or both, and how long the refund takes to reach the payment method it came from. If you offer store credit or a rebooking instead, describe when each applies.",
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
"subsections":
|
|
103
|
-
[
|
|
104
|
-
{
|
|
105
|
-
"id": "questions",
|
|
106
|
-
"heading": "Questions about a refund",
|
|
107
|
-
"blocks":
|
|
108
|
-
[
|
|
109
|
-
{
|
|
110
|
-
"kind": "paragraph",
|
|
111
|
-
"text": "Point to the one place a customer should write, and say roughly how quickly you answer. A policy nobody can ask a question about is a policy that generates disputes.",
|
|
112
|
-
},
|
|
113
|
-
],
|
|
114
|
-
},
|
|
115
|
-
],
|
|
116
|
-
},
|
|
117
|
-
],
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
]
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
{/* Rendered from frontmatter `sections[]`; the MDX body is not read by the section-catalog renderer. Service shape (#6646): cancellation and refunds — this template's override of the `_base` product-shape seed. The JSON-LD — a WebPage, wrapping a MerchantReturnPolicy when a returns section is present — is emitted by `buildPurchasePolicyPage` (#6646), not hand-rolled here. */}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "ReportPage"
|
|
3
|
-
slug: "annual-letter-2024"
|
|
4
|
-
title: "Annual Letter"
|
|
5
|
-
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
-
schema:
|
|
7
|
-
datePublished: "2024-12-09"
|
|
8
|
-
author:
|
|
9
|
-
"@type": Organization
|
|
10
|
-
name: "Your Company"
|
|
11
|
-
sections:
|
|
12
|
-
[
|
|
13
|
-
{
|
|
14
|
-
"id": "header",
|
|
15
|
-
"type": "report-header",
|
|
16
|
-
"data":
|
|
17
|
-
{
|
|
18
|
-
"title": "Annual Letter",
|
|
19
|
-
"eyebrow": "December 2024",
|
|
20
|
-
"backHref": "/reports",
|
|
21
|
-
"backLabel": "All reports",
|
|
22
|
-
"tone": "on-dark",
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "document",
|
|
27
|
-
"type": "document-viewer",
|
|
28
|
-
"data":
|
|
29
|
-
{
|
|
30
|
-
"src": "/reports/sample-report.pdf",
|
|
31
|
-
"geometry": "16:9",
|
|
32
|
-
"pages": 8,
|
|
33
|
-
"downloadFilename": "annual-letter-2024.pdf",
|
|
34
|
-
"outline":
|
|
35
|
-
[
|
|
36
|
-
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
-
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
-
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
-
],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
]
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
{/_
|
|
46
|
-
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
-
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
-
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
-
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
-
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
-
a wrong number shows as a jump.
|
|
52
|
-
_/}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "ReportPage"
|
|
3
|
-
slug: "field-notes-2023"
|
|
4
|
-
title: "Field Notes"
|
|
5
|
-
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
-
schema:
|
|
7
|
-
datePublished: "2023-09-19"
|
|
8
|
-
author:
|
|
9
|
-
"@type": Organization
|
|
10
|
-
name: "Your Company"
|
|
11
|
-
sections:
|
|
12
|
-
[
|
|
13
|
-
{
|
|
14
|
-
"id": "header",
|
|
15
|
-
"type": "report-header",
|
|
16
|
-
"data":
|
|
17
|
-
{
|
|
18
|
-
"title": "Field Notes",
|
|
19
|
-
"eyebrow": "2023",
|
|
20
|
-
"backHref": "/reports",
|
|
21
|
-
"backLabel": "All reports",
|
|
22
|
-
"tone": "on-dark",
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "document",
|
|
27
|
-
"type": "document-viewer",
|
|
28
|
-
"data":
|
|
29
|
-
{
|
|
30
|
-
"src": "/reports/sample-report.pdf",
|
|
31
|
-
"geometry": "16:9",
|
|
32
|
-
"pages": 8,
|
|
33
|
-
"downloadFilename": "field-notes-2023.pdf",
|
|
34
|
-
"outline":
|
|
35
|
-
[
|
|
36
|
-
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
-
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
-
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
-
],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
]
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
{/_
|
|
46
|
-
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
-
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
-
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
-
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
-
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
-
a wrong number shows as a jump.
|
|
52
|
-
_/}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "ReportPage"
|
|
3
|
-
slug: "platform-shift-2025"
|
|
4
|
-
title: "The {Platform Shift} Report"
|
|
5
|
-
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
-
schema:
|
|
7
|
-
datePublished: "2025-03-11"
|
|
8
|
-
author:
|
|
9
|
-
"@type": Organization
|
|
10
|
-
name: "Your Company"
|
|
11
|
-
sections:
|
|
12
|
-
[
|
|
13
|
-
{
|
|
14
|
-
"id": "header",
|
|
15
|
-
"type": "report-header",
|
|
16
|
-
"data":
|
|
17
|
-
{
|
|
18
|
-
"title": "The {Platform Shift} Report",
|
|
19
|
-
"eyebrow": "March 2025",
|
|
20
|
-
"backHref": "/reports",
|
|
21
|
-
"backLabel": "All reports",
|
|
22
|
-
"tone": "on-dark",
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "document",
|
|
27
|
-
"type": "document-viewer",
|
|
28
|
-
"data":
|
|
29
|
-
{
|
|
30
|
-
"src": "/reports/sample-report.pdf",
|
|
31
|
-
"geometry": "16:9",
|
|
32
|
-
"pages": 8,
|
|
33
|
-
"downloadFilename": "platform-shift-2025.pdf",
|
|
34
|
-
"outline":
|
|
35
|
-
[
|
|
36
|
-
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
-
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
-
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
-
],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
]
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
{/_
|
|
46
|
-
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
-
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
-
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
-
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
-
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
-
a wrong number shows as a jump.
|
|
52
|
-
_/}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "ReportPage"
|
|
3
|
-
slug: "state-of-the-market-2026"
|
|
4
|
-
title: "State of {Your Market} 2026"
|
|
5
|
-
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
-
schema:
|
|
7
|
-
datePublished: "2026-05-14"
|
|
8
|
-
author:
|
|
9
|
-
"@type": Organization
|
|
10
|
-
name: "Your Company"
|
|
11
|
-
sections:
|
|
12
|
-
[
|
|
13
|
-
{
|
|
14
|
-
"id": "header",
|
|
15
|
-
"type": "report-header",
|
|
16
|
-
"data":
|
|
17
|
-
{
|
|
18
|
-
"title": "State of {Your Market} 2026",
|
|
19
|
-
"eyebrow": "May 2026",
|
|
20
|
-
"backHref": "/reports",
|
|
21
|
-
"backLabel": "All reports",
|
|
22
|
-
"tone": "on-dark",
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "document",
|
|
27
|
-
"type": "document-viewer",
|
|
28
|
-
"data":
|
|
29
|
-
{
|
|
30
|
-
"src": "/reports/sample-report.pdf",
|
|
31
|
-
"geometry": "16:9",
|
|
32
|
-
"pages": 8,
|
|
33
|
-
"downloadFilename": "state-of-the-market-2026.pdf",
|
|
34
|
-
"outline":
|
|
35
|
-
[
|
|
36
|
-
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
-
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
-
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
-
],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
]
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
{/_
|
|
46
|
-
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
-
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
-
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
-
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
-
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
-
a wrong number shows as a jump.
|
|
52
|
-
_/}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "Service"
|
|
3
|
-
slug: "first-engagement"
|
|
4
|
-
title: "{First engagement}"
|
|
5
|
-
description: "{One line on what this engagement is and who it suits. Replace before you launch.}"
|
|
6
|
-
schema:
|
|
7
|
-
serviceType: "{First engagement}"
|
|
8
|
-
provider:
|
|
9
|
-
"@type": Organization
|
|
10
|
-
name: "Your Company"
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# {First engagement}
|
|
14
|
-
|
|
15
|
-
{Open with the situation a reader is in when they come looking for this. Two or
|
|
16
|
-
three sentences, no more — the detail belongs under the headings below.}
|
|
17
|
-
|
|
18
|
-
## What it covers
|
|
19
|
-
|
|
20
|
-
- {The first thing you actually do}
|
|
21
|
-
- {The second thing you actually do}
|
|
22
|
-
- {The third thing you actually do}
|
|
23
|
-
|
|
24
|
-
## How it runs
|
|
25
|
-
|
|
26
|
-
{One paragraph on the shape of the engagement: how it starts, how long it runs,
|
|
27
|
-
who is involved on both sides, and what a week looks like.}
|
|
28
|
-
|
|
29
|
-
## What you end up with
|
|
30
|
-
|
|
31
|
-
{One paragraph on the deliverable. Be concrete — name the artefact, not the
|
|
32
|
-
feeling.}
|
|
33
|
-
|
|
34
|
-
## What it costs
|
|
35
|
-
|
|
36
|
-
{One line on the pricing shape — fixed fee, retainer, day rate — and what it
|
|
37
|
-
excludes. Replace with your real numbers, or delete this section and let the
|
|
38
|
-
call do it.}
|