create-ailk 0.4.0 → 0.5.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/component-catalog.json +11939 -0
- package/component-catalog.md +176 -64
- package/dist/cli.js +29 -1
- package/dist/derive-architecture.js +5 -2
- package/dist/lib/extract-module-bundle.d.ts +50 -2
- package/dist/lib/extract-module-bundle.js +223 -15
- package/dist/lib/fetch-guard.d.ts +28 -0
- package/dist/lib/fetch-guard.js +101 -0
- package/dist/lib/fetch-module.js +4 -0
- package/dist/lib/fetch-template.js +4 -0
- package/dist/module-architecture.d.ts +59 -8
- package/dist/module-architecture.js +334 -115
- package/dist/parse-args.js +6 -2
- package/dist/programmatic.d.ts +10 -0
- package/dist/programmatic.js +134 -19
- package/dist/site-chrome.d.ts +80 -0
- package/dist/site-chrome.js +135 -0
- package/dist/surfaces.d.ts +21 -6
- package/dist/surfaces.js +107 -32
- package/dist/template-manifest.d.ts +55 -3
- package/dist/template-manifest.js +181 -12
- package/dist/template-names.d.ts +1 -1
- package/dist/template-names.js +1 -0
- package/package.json +9 -2
- package/site-templates/_base/ailk-template.json +6 -0
- package/site-templates/_base/content/en/Pricing/pricing.mdx +169 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +331 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +393 -0
- package/site-templates/marketing-site/ailk-template.json +11 -0
- package/site-templates/marketing-site/content/en/blog/05-this-vc-morning-routine-will-make-you-super-annoying.mdx +36 -0
- package/site-templates/marketing-site/provenance.json +4 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +288 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +285 -0
- package/site-templates/marketing-site-free/ailk-template.json +2 -1
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +271 -0
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +324 -0
- package/site-templates/minimalism-site/ailk-template.json +21 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-1.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-2.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-3.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-4.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-5.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-6.svg +7 -0
- package/site-templates/minimalism-site/assets/hero-backdrop.svg +17 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-1.svg +6 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-2.svg +6 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-3.svg +6 -0
- package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +110 -0
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +68 -0
- package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +57 -0
- package/site-templates/minimalism-site/content/en/HomePage/home.mdx +214 -0
- package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +77 -0
- package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +73 -0
- package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +52 -0
- package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +73 -0
- package/site-templates/minimalism-site/flows/referral.flow.json +71 -0
- package/site-templates/minimalism-site/provenance.json +4 -0
- package/site-templates/saas-product/TEMPLATE-MANIFEST.md +61 -0
- package/site-templates/saas-product/ailk-template.json +16 -0
- package/site-templates/saas-product/provenance.json +10 -0
- package/templates/.claude/skills/README.md +16 -25
- package/templates/.env.example +32 -7
- package/templates/.github/workflows/ci.yml +48 -0
- package/templates/README.md +3 -1
- package/templates/apps/api/CLAUDE.md +4 -1
- package/templates/apps/api/eslint.config.mjs +69 -0
- package/templates/apps/api/package.json +6 -2
- package/templates/apps/api/src/__tests__/module-exclusion.test.ts +6 -2
- package/templates/apps/api/src/__tests__/review-surface-registration.test.ts +167 -0
- package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +8 -1
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +3 -0
- package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +339 -0
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +108 -0
- package/templates/apps/api/src/middleware/default-tenant.ts +136 -0
- package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +171 -0
- package/templates/apps/api/src/routes/leads/list.ts +104 -0
- package/templates/apps/api/src/server.ts +82 -6
- package/templates/apps/api/src/services/__tests__/lead-promotion.test.ts +408 -0
- package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +329 -0
- package/templates/apps/api/src/services/default-tenant.ts +261 -0
- package/templates/apps/api/src/services/lead-promotion.ts +161 -0
- package/templates/apps/api/src/services/leads-inbox.ts +263 -0
- package/templates/apps/api/src/services/owner-workspaces.ts +132 -0
- package/templates/apps/mcp/CLAUDE.md +1 -1
- package/templates/apps/mcp/__tests__/parity.test.ts +2 -2
- package/templates/apps/mcp/__tests__/tools/{scaffold.test.ts → create_project.test.ts} +23 -23
- package/templates/apps/mcp/eslint.config.mjs +69 -0
- package/templates/apps/mcp/package.json +6 -2
- package/templates/apps/mcp/src/server.ts +2 -2
- package/templates/apps/mcp/src/tools/{scaffold.ts → create_project.ts} +3 -3
- package/templates/apps/mcp/src/tools/index.ts +2 -2
- package/templates/apps/web/.env.example +3 -3
- package/templates/apps/web/CLAUDE.md +2 -0
- package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +4 -6
- package/templates/apps/web/app/[locale]/(authed)/layout.tsx +1 -1
- package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +181 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/components/LeadsTable.tsx +137 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +111 -0
- package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +1 -1
- package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +111 -0
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +65 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.permalink.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.test.tsx +6 -5
- package/templates/apps/web/app/[locale]/flows/[slug]/flow.actions.ts +1 -1
- package/templates/apps/web/app/[locale]/layout.tsx +214 -17
- package/templates/apps/web/components/google-analytics.tsx +18 -1
- package/templates/apps/web/eslint.config.mjs +69 -0
- package/templates/apps/web/jest.config.cjs +7 -15
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +32 -5
- package/templates/apps/web/lib/nav-config.ts +27 -7
- package/templates/apps/web/lib/server-api.ts +1 -1
- package/templates/apps/web/lib/site-chrome.ts +29 -0
- package/templates/apps/web/lib/telemetry-scrub.ts +46 -0
- package/templates/apps/web/messages/en.json +29 -2
- package/templates/apps/web/next.config.mjs +20 -0
- package/templates/apps/web/package.json +6 -2
- package/templates/apps/web/sentry.client.config.ts +131 -0
- package/templates/apps/web/sentry.edge.config.ts +72 -0
- package/templates/apps/web/sentry.server.config.ts +72 -0
- package/templates/apps/web/src/lib/routes.ts +13 -18
- package/templates/brand_assets/README.md +24 -0
- package/templates/content/en/AboutPage/about.mdx +160 -15
- package/templates/content/en/ContactPage/contact.mdx +90 -13
- package/templates/content/en/FAQPage/faq.mdx +62 -22
- package/templates/content/en/HomePage/home.mdx +244 -20
- package/templates/content/en/LandingPage/blog.mdx +83 -0
- package/templates/content/en/LandingPage/features.mdx +103 -0
- package/templates/content/en/LandingPage/how-it-works.mdx +143 -0
- package/templates/database/CHANGELOG.md +7 -0
- package/templates/database/__tests__/seed.test.ts +1 -1
- package/templates/database/eslint.config.mjs +69 -0
- package/templates/database/package.json +7 -3
- package/templates/database/seed.ts +1 -1
- package/templates/package.json +1 -14
- package/versions.json +52 -0
- package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +0 -103
- /package/site-templates/{marketing-site-free → _base}/content/en/PrivacyPage/privacy.mdx +0 -0
- /package/site-templates/{marketing-site-free → _base}/content/en/TermsPage/terms.mdx +0 -0
- /package/templates/apps/web/{src/components → components}/SiteNav.tsx +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" role="img" aria-label="Placeholder portrait">
|
|
2
|
+
<title>Placeholder portrait</title>
|
|
3
|
+
<desc>Neutral monochrome placeholder. Replace with a real photograph before you launch.</desc>
|
|
4
|
+
<rect width="400" height="400" fill="#ececef" />
|
|
5
|
+
<circle cx="200" cy="164" r="60" fill="#90909a" />
|
|
6
|
+
<path d="M 84 400 C 84 320, 84 250, 200 250 C 316 250, 316 320, 316 400 Z" fill="#90909a" />
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" role="img" aria-label="Placeholder portrait">
|
|
2
|
+
<title>Placeholder portrait</title>
|
|
3
|
+
<desc>Neutral monochrome placeholder. Replace with a real photograph before you launch.</desc>
|
|
4
|
+
<rect width="400" height="400" fill="#e8e8eb" />
|
|
5
|
+
<circle cx="200" cy="154" r="70" fill="#9696a0" />
|
|
6
|
+
<path d="M 60 400 C 60 320, 60 250, 200 250 C 340 250, 340 320, 340 400 Z" fill="#9696a0" />
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 900" width="1600" height="900" role="img" aria-label="Placeholder backdrop">
|
|
2
|
+
<title>Placeholder backdrop</title>
|
|
3
|
+
<desc>Neutral gradient placeholder. Replace with your own full-bleed photograph before you launch.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="backdrop" x1="0" y1="0" x2="0.35" y2="1">
|
|
6
|
+
<stop offset="0" stop-color="#f4f4f5" />
|
|
7
|
+
<stop offset="0.55" stop-color="#d9d9dd" />
|
|
8
|
+
<stop offset="1" stop-color="#b6b6bd" />
|
|
9
|
+
</linearGradient>
|
|
10
|
+
<radialGradient id="bloom" cx="0.5" cy="0.38" r="0.62">
|
|
11
|
+
<stop offset="0" stop-color="#ffffff" stop-opacity="0.75" />
|
|
12
|
+
<stop offset="1" stop-color="#ffffff" stop-opacity="0" />
|
|
13
|
+
</radialGradient>
|
|
14
|
+
</defs>
|
|
15
|
+
<rect width="1600" height="900" fill="url(#backdrop)" />
|
|
16
|
+
<rect width="1600" height="900" fill="url(#bloom)" />
|
|
17
|
+
</svg>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 40" width="160" height="40" role="img" aria-label="Placeholder logo">
|
|
2
|
+
<title>Placeholder logo</title>
|
|
3
|
+
<circle cx="20" cy="20" r="12" fill="none" stroke="#6b6b73" stroke-width="3" />
|
|
4
|
+
<rect x="42" y="14" width="96" height="5" rx="2.5" fill="#6b6b73" />
|
|
5
|
+
<rect x="42" y="24" width="62" height="5" rx="2.5" fill="#a3a3ab" />
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 40" width="160" height="40" role="img" aria-label="Placeholder logo">
|
|
2
|
+
<title>Placeholder logo</title>
|
|
3
|
+
<rect x="9" y="9" width="22" height="22" rx="4" fill="none" stroke="#6b6b73" stroke-width="3" />
|
|
4
|
+
<rect x="42" y="14" width="84" height="5" rx="2.5" fill="#6b6b73" />
|
|
5
|
+
<rect x="42" y="24" width="50" height="5" rx="2.5" fill="#a3a3ab" />
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 40" width="160" height="40" role="img" aria-label="Placeholder logo">
|
|
2
|
+
<title>Placeholder logo</title>
|
|
3
|
+
<path d="M20 7 L33 31 L7 31 Z" fill="none" stroke="#6b6b73" stroke-width="3" stroke-linejoin="round" />
|
|
4
|
+
<rect x="42" y="14" width="74" height="5" rx="2.5" fill="#6b6b73" />
|
|
5
|
+
<rect x="42" y="24" width="98" height="5" rx="2.5" fill="#a3a3ab" />
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "AboutPage"
|
|
3
|
+
slug: "about"
|
|
4
|
+
title: "About"
|
|
5
|
+
description: "The people behind {your company}. Placeholder copy and placeholder portraits — replace both before you launch."
|
|
6
|
+
sections:
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"id": "intro",
|
|
10
|
+
"type": "content-block",
|
|
11
|
+
"data":
|
|
12
|
+
{
|
|
13
|
+
"variant": "narrow",
|
|
14
|
+
"eyebrow": "About",
|
|
15
|
+
"headline": "We work with a small number of {the people you serve}, for a long time",
|
|
16
|
+
"body": "{Two or three sentences on how the practice started, what it does now, and what it refuses to do. Keep the paragraph short — this page is read standing up.}",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "partners",
|
|
21
|
+
"type": "team",
|
|
22
|
+
"data":
|
|
23
|
+
{
|
|
24
|
+
"headline": "Partners",
|
|
25
|
+
"variant": "with-large-images",
|
|
26
|
+
"hoverReveal": true,
|
|
27
|
+
"largePhotos": true,
|
|
28
|
+
"members":
|
|
29
|
+
[
|
|
30
|
+
{
|
|
31
|
+
"name": "{Name One}",
|
|
32
|
+
"role": "{Role}",
|
|
33
|
+
"bio": "{One line on what this person does here.}",
|
|
34
|
+
"avatar":
|
|
35
|
+
{ "src": "/avatar-placeholder-1.svg", "alt": "{Name One}" },
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "{Name Two}",
|
|
39
|
+
"role": "{Role}",
|
|
40
|
+
"bio": "{One line on what this person does here.}",
|
|
41
|
+
"avatar":
|
|
42
|
+
{ "src": "/avatar-placeholder-2.svg", "alt": "{Name Two}" },
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "{Name Three}",
|
|
46
|
+
"role": "{Role}",
|
|
47
|
+
"bio": "{One line on what this person does here.}",
|
|
48
|
+
"avatar":
|
|
49
|
+
{ "src": "/avatar-placeholder-3.svg", "alt": "{Name Three}" },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "{Name Four}",
|
|
53
|
+
"role": "{Role}",
|
|
54
|
+
"bio": "{One line on what this person does here.}",
|
|
55
|
+
"avatar":
|
|
56
|
+
{ "src": "/avatar-placeholder-4.svg", "alt": "{Name Four}" },
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "{Name Five}",
|
|
60
|
+
"role": "{Role}",
|
|
61
|
+
"bio": "{One line on what this person does here.}",
|
|
62
|
+
"avatar":
|
|
63
|
+
{ "src": "/avatar-placeholder-5.svg", "alt": "{Name Five}" },
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "{Name Six}",
|
|
67
|
+
"role": "{Role}",
|
|
68
|
+
"bio": "{One line on what this person does here.}",
|
|
69
|
+
"avatar":
|
|
70
|
+
{ "src": "/avatar-placeholder-6.svg", "alt": "{Name Six}" },
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "closing",
|
|
77
|
+
"type": "cta",
|
|
78
|
+
"data":
|
|
79
|
+
{
|
|
80
|
+
"variant": "minimal",
|
|
81
|
+
"headline": "Work with us",
|
|
82
|
+
"primaryCta": { "label": "Hire me →", "href": "/meet" },
|
|
83
|
+
"secondaryCta":
|
|
84
|
+
{
|
|
85
|
+
"label": "Contact me →",
|
|
86
|
+
"href": "/contact",
|
|
87
|
+
"variant": "outline",
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
]
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
{/\*
|
|
95
|
+
RENAMING THIS PAGE. A site whose partners page should read `/partners`,
|
|
96
|
+
`/team`, `/family` or `/company` renames it in two moves, both in the
|
|
97
|
+
scaffold, neither of them here:
|
|
98
|
+
|
|
99
|
+
1. `git mv content/en/AboutPage content/en/<NewType>` is NOT one of them —
|
|
100
|
+
`AboutPage` is a content TYPE in the schema registry, not a URL. Keep the
|
|
101
|
+
directory. Rename the ROUTE:
|
|
102
|
+
`git mv "apps/web/app/[locale]/about" "apps/web/app/[locale]/partners"`.
|
|
103
|
+
2. Point the renamed route at the same content and update the one nav/footer
|
|
104
|
+
label that names it (`apps/web/lib/nav-config.ts`, `messages/<locale>.json`).
|
|
105
|
+
|
|
106
|
+
Once #5572's routes map lands in the scaffold this collapses to ONE row —
|
|
107
|
+
the `/about` row's `route` (and its `legacyRoutes` entry, so the old path
|
|
108
|
+
301s). Documented, never implemented here: a template declares pages, it does
|
|
109
|
+
not move a customer's routes for them.
|
|
110
|
+
\*/}
|
|
@@ -0,0 +1,68 @@
|
|
|
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": "contact-form",
|
|
21
|
+
"type": "contact-form",
|
|
22
|
+
"data":
|
|
23
|
+
{
|
|
24
|
+
"variant": "card",
|
|
25
|
+
"source": "contact",
|
|
26
|
+
"fields":
|
|
27
|
+
[
|
|
28
|
+
{
|
|
29
|
+
"name": "name",
|
|
30
|
+
"label": "Name",
|
|
31
|
+
"type": "text",
|
|
32
|
+
"required": true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "email",
|
|
36
|
+
"label": "Email",
|
|
37
|
+
"type": "email",
|
|
38
|
+
"required": true,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "message",
|
|
42
|
+
"label": "What are you trying to do?",
|
|
43
|
+
"type": "textarea",
|
|
44
|
+
"required": true,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
"submitLabel": "Send →",
|
|
48
|
+
"consentText": "I accept the Terms",
|
|
49
|
+
"consentLink": { "label": "Terms", "href": "/terms" },
|
|
50
|
+
"successMessage": "Thank you — your message is in. You will hear back within {time amount}.",
|
|
51
|
+
"action": "/v1/leads/submit",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "closing",
|
|
56
|
+
"type": "cta",
|
|
57
|
+
"data":
|
|
58
|
+
{
|
|
59
|
+
"variant": "minimal",
|
|
60
|
+
"headline": "Would a call be faster?",
|
|
61
|
+
"primaryCta": { "label": "Hire me →", "href": "/meet" },
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
]
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
{/_ The form posts to the site's own API (`/v1/leads/submit`) and confirms
|
|
68
|
+
inline — no redirect, no thank-you page. Placeholder copy. _/}
|
|
@@ -0,0 +1,57 @@
|
|
|
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. _/}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "HomePage"
|
|
3
|
+
slug: "home"
|
|
4
|
+
title: "Your Company"
|
|
5
|
+
description: "Placeholder home for the minimalism-site template — a nine-slide scroll-snap deck. Replace every line before you launch."
|
|
6
|
+
sections:
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"id": "landing",
|
|
10
|
+
"type": "hero",
|
|
11
|
+
"data":
|
|
12
|
+
{
|
|
13
|
+
"variant": "centered",
|
|
14
|
+
"fill": "viewport",
|
|
15
|
+
"surface": "gradient-brand",
|
|
16
|
+
"headline": "Your Company",
|
|
17
|
+
"primaryCta": { "label": "{Primary CTA} →", "href": "/reports" },
|
|
18
|
+
"ctaSize": "xl",
|
|
19
|
+
"scrollCue": { "label": "Scroll" },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "tagline",
|
|
24
|
+
"type": "content-block",
|
|
25
|
+
"data":
|
|
26
|
+
{
|
|
27
|
+
"variant": "narrow",
|
|
28
|
+
"headline": "A working partnership with the teams building {what your market needs next}",
|
|
29
|
+
"body": "{One line on who you work with, and what they get from you that they cannot get elsewhere.}",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "community",
|
|
34
|
+
"type": "logoCloud",
|
|
35
|
+
"data":
|
|
36
|
+
{
|
|
37
|
+
"headline": "Our community",
|
|
38
|
+
"layout": "grid",
|
|
39
|
+
"treatment": "monochrome",
|
|
40
|
+
"logos":
|
|
41
|
+
[
|
|
42
|
+
{ "name": "{logo}", "src": "/logo-placeholder-1.svg" },
|
|
43
|
+
{ "name": "{logo}", "src": "/logo-placeholder-2.svg" },
|
|
44
|
+
{ "name": "{logo}", "src": "/logo-placeholder-3.svg" },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "reports-headline",
|
|
50
|
+
"type": "content-block",
|
|
51
|
+
"data":
|
|
52
|
+
{
|
|
53
|
+
"variant": "narrow",
|
|
54
|
+
"headline": "Research on {your field}, and on where the next decade of it is going",
|
|
55
|
+
"body": "{One line on what a reader walks away with. Keep it to a single sentence.}",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "special-reports",
|
|
60
|
+
"type": "reports-list",
|
|
61
|
+
"data":
|
|
62
|
+
{
|
|
63
|
+
"headline": "Special reports",
|
|
64
|
+
"variant": "list",
|
|
65
|
+
"tone": "on-light",
|
|
66
|
+
"reports":
|
|
67
|
+
[
|
|
68
|
+
{
|
|
69
|
+
"slug": "state-of-the-market-2026",
|
|
70
|
+
"title": "State of {Your Market} 2026",
|
|
71
|
+
"date": "May 2026",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"slug": "platform-shift-2025",
|
|
75
|
+
"title": "The {Platform Shift} Report",
|
|
76
|
+
"date": "March 2025",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"slug": "annual-letter-2024",
|
|
80
|
+
"title": "Annual Letter",
|
|
81
|
+
"date": "December 2024",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"slug": "field-notes-2023",
|
|
85
|
+
"title": "Field Notes",
|
|
86
|
+
"date": "2023",
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id": "favorites",
|
|
93
|
+
"type": "reports-list",
|
|
94
|
+
"data":
|
|
95
|
+
{
|
|
96
|
+
"headline": "Favorites",
|
|
97
|
+
"variant": "list",
|
|
98
|
+
"tone": "on-light",
|
|
99
|
+
"reports":
|
|
100
|
+
[
|
|
101
|
+
{ "slug": "state-of-the-market-2026", "title": "2026" },
|
|
102
|
+
{ "slug": "platform-shift-2025", "title": "2025" },
|
|
103
|
+
{ "slug": "annual-letter-2024", "title": "2024" },
|
|
104
|
+
{ "slug": "field-notes-2023", "title": "2023" },
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "services-headline",
|
|
110
|
+
"type": "content-block",
|
|
111
|
+
"data":
|
|
112
|
+
{
|
|
113
|
+
"variant": "narrow",
|
|
114
|
+
"headline": "Trusted work for the people who carry {the outcome you deliver}",
|
|
115
|
+
"body": "{One line on how an engagement starts and what the first month looks like.}",
|
|
116
|
+
"cta": { "label": "Hire me →", "href": "/meet" },
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "partners",
|
|
121
|
+
"type": "team",
|
|
122
|
+
"data":
|
|
123
|
+
{
|
|
124
|
+
"headline": "Partners",
|
|
125
|
+
"variant": "with-large-images",
|
|
126
|
+
"hoverReveal": true,
|
|
127
|
+
"largePhotos": true,
|
|
128
|
+
"members":
|
|
129
|
+
[
|
|
130
|
+
{
|
|
131
|
+
"name": "{Name One}",
|
|
132
|
+
"role": "{Role}",
|
|
133
|
+
"avatar":
|
|
134
|
+
{ "src": "/avatar-placeholder-1.svg", "alt": "{Name One}" },
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"name": "{Name Two}",
|
|
138
|
+
"role": "{Role}",
|
|
139
|
+
"avatar":
|
|
140
|
+
{ "src": "/avatar-placeholder-2.svg", "alt": "{Name Two}" },
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"name": "{Name Three}",
|
|
144
|
+
"role": "{Role}",
|
|
145
|
+
"avatar":
|
|
146
|
+
{ "src": "/avatar-placeholder-3.svg", "alt": "{Name Three}" },
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"name": "{Name Four}",
|
|
150
|
+
"role": "{Role}",
|
|
151
|
+
"avatar":
|
|
152
|
+
{ "src": "/avatar-placeholder-4.svg", "alt": "{Name Four}" },
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"name": "{Name Five}",
|
|
156
|
+
"role": "{Role}",
|
|
157
|
+
"avatar":
|
|
158
|
+
{ "src": "/avatar-placeholder-5.svg", "alt": "{Name Five}" },
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"name": "{Name Six}",
|
|
162
|
+
"role": "{Role}",
|
|
163
|
+
"avatar":
|
|
164
|
+
{ "src": "/avatar-placeholder-6.svg", "alt": "{Name Six}" },
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"id": "closing",
|
|
171
|
+
"type": "cta",
|
|
172
|
+
"data":
|
|
173
|
+
{
|
|
174
|
+
"variant": "minimal",
|
|
175
|
+
"headline": "Your Company",
|
|
176
|
+
"primaryCta": { "label": "Contact me →", "href": "/contact" },
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
]
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
{/\*
|
|
183
|
+
The nine-slide deck (#5589). `layout.home: "deck"` on this template's
|
|
184
|
+
registry entry is what makes the locale-root route mount MarketingShell with
|
|
185
|
+
`snap="mandatory"` + `deckHero` (#5612 D3 / #5426 D7): every direct section
|
|
186
|
+
child above becomes one full-viewport snap target, in order, and the brand
|
|
187
|
+
mark is hidden on slide 1 and revealed from slide 2 on. Nothing here declares
|
|
188
|
+
that — a template declares layout, never a route.
|
|
189
|
+
|
|
190
|
+
Every line of copy is a placeholder of the reference's shape and length, not
|
|
191
|
+
the reference's own words. Replace all of it before you launch — including
|
|
192
|
+
the four sample reports, the three logo placeholders and the six portrait
|
|
193
|
+
placeholders.
|
|
194
|
+
|
|
195
|
+
Three slides carry LESS than the template's design intends, because the
|
|
196
|
+
section prop each needs does not exist yet (#5691 — one bounded additive-props
|
|
197
|
+
batch, the #5622 shape). When those props land, this file gains the fields and
|
|
198
|
+
nothing is recomposed:
|
|
199
|
+
|
|
200
|
+
- slide 1 `landing` — wants a full-bleed backdrop IMAGE
|
|
201
|
+
(`assets/hero-backdrop.svg`, installed at `/hero-backdrop.svg`). Hero has
|
|
202
|
+
no backdrop slot, and its `image` slot counts as a stacked reveal, which
|
|
203
|
+
suppresses `scrollCue`. Ships on the `gradient-brand` band, which is a
|
|
204
|
+
full-bleed gradient and keeps the 44px cue.
|
|
205
|
+
- slide 3 `community` and slide 8 `partners` — want a bottom-centered
|
|
206
|
+
action ("Refer someone →" → /referral; → /about). `logoCloud` and `team`
|
|
207
|
+
carry no action field.
|
|
208
|
+
- slides 5 `special-reports` and 6 `favorites` — want the on-DARK ground the
|
|
209
|
+
reference alternates to. `reports-list` already has `tone: "on-dark"`
|
|
210
|
+
(#5562, shipped for this template), but `SectionSurfaceSchema` has no dark
|
|
211
|
+
value to put under it, so on-dark type would render on a light band. They
|
|
212
|
+
ship `on-light` until it does.
|
|
213
|
+
|
|
214
|
+
\*/}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
\*/}
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
_/}
|