create-ailk 0.8.0 → 0.10.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 +71 -3
- 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 +104 -5
- 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 +48 -32
- package/dist/lib/module-license-gate.js +117 -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 +67 -23
- 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 +216 -19
- 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 +16 -63
- package/dist/starter-grid.js +102 -84
- 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 +53 -28
- package/package.json +6 -3
- package/release-scope.json +25 -0
- 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/designs/minimalism/DESIGN.md +98 -6
- package/site-templates/designs/minimalism/sample/README.md +48 -0
- package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +1 -1
- 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/agents/web.md +10 -8
- package/templates/.claude/rules/architecture.md +17 -7
- package/templates/.claude/skills/README.md +3 -2
- package/templates/.claude/skills/add-auth/SKILL.md +142 -90
- package/templates/.claude/skills/add-auth/references/env-vars.md +32 -17
- package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +17 -8
- package/templates/.claude/skills/add-page/SKILL.md +241 -238
- package/templates/.claude/skills/add-page/references/page-types.md +94 -86
- 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 +51 -18
- package/templates/.claude/skills/check-site/references/common-errors.md +12 -9
- package/templates/.claude/skills/check-site/references/findings-glossary.md +4 -4
- package/templates/.claude/skills/check-site/references/severity-levels.md +3 -3
- 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/SKILL.md +75 -38
- 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/.env.example +23 -2
- 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 +4 -1
- package/templates/tools/check-claude-md.ts +128 -0
- package/versions.json +33 -33
- package/dist/modules/commerce/0.6.0.tar.gz +0 -0
- package/dist/modules/commerce/0.6.1.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.0.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
- package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
- package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.0.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
- package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.0.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.0.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
- package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
- package/dist/modules/workspace/0.6.0.tar.gz +0 -0
- package/dist/modules/workspace/0.6.1.tar.gz +0 -0
- 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.json +0 -506
- 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/.claude/skills/setup-deploy/references/env-vars-template.md +0 -175
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +0 -8
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +0 -12
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +0 -12
- 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/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,458 +0,0 @@
|
|
|
1
|
-
# Template manifest — `minimalism-site`
|
|
2
|
-
|
|
3
|
-
> The second Pro template (#5589) — a reports-first site whose home is a **nine-slide scroll-snap deck**, shaped after the reference captured in `docs/research/bondcap-capture/`. Structure and design are the reference; **the copy is not** — every line here is placeholder English of the same shape and length. Generated file: the regions between `<!-- generated:begin <id> -->` and `<!-- generated:end -->` are produced by `scripts/build-template-manifest.mjs --template minimalism-site` from the composed layer stack (this tree → its required modules → `_base` → the always-copied overlay), each roster row's MDX `sections[]`, and `component-catalog.json`. Everything outside the markers is written by hand.
|
|
4
|
-
|
|
5
|
-
| Field | Value |
|
|
6
|
-
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
7
|
-
| Template | `minimalism-site` |
|
|
8
|
-
| Level | Pro (derived from `requires` — `scheduling` and `signal-collectors` are paid; never declared) |
|
|
9
|
-
| `requires` | `[marketing, scheduling, signal-collectors]` — **no `docs-blog`**, which is what makes this a sibling of `marketing-site` rather than `marketing-site` plus a module (#5618 D2) |
|
|
10
|
-
| `extends` | `_base` — lineage only, never level |
|
|
11
|
-
| Delivery | licence-checked module bundle (#5441); never in the Free tarball |
|
|
12
|
-
| Sample content posture | every sample report, service and flow in the demo is **public** and **placeholder** |
|
|
13
|
-
| Reference | `docs/research/bondcap-capture/{home.behavior.md,home.snapshot.yml,repro/}` — panel shapes and the rescued section reproduction. No reference copy and no reference asset ships. |
|
|
14
|
-
|
|
15
|
-
## 1. Chrome
|
|
16
|
-
|
|
17
|
-
This template's chrome is the `minimalism` design's (#6638), not a `layout` block of its own; it was the first non-default chrome (#5612). The deck is the reason: a nine-panel scroll-snap home with a revealed brand mark has no room for a nav row, an announcement bar or a four-column footer.
|
|
18
|
-
|
|
19
|
-
| Piece | Value |
|
|
20
|
-
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
21
|
-
| Nav | `mark-only` — **no nav items render**. The revealed brand mark plus the right-hand controls are the only header chrome. Every page a reader reaches, they reach from a slide action or the footer bottom bar. |
|
|
22
|
-
| Footer | `centered` — the slide-9 bottom bar: Privacy · Terms · FAQ, the social row, the theme toggle and the locale switcher. |
|
|
23
|
-
| Announcement banner | off. The cookie-consent banner is unaffected — it is not an announcement. |
|
|
24
|
-
| Home | `deck` — the locale-root route mounts `MarketingShell` with `snap="mandatory"` + `deckHero` (#5612 D3 / #5426 D7). Every other route renders normally. |
|
|
25
|
-
|
|
26
|
-
### Layout knobs (#5612)
|
|
27
|
-
|
|
28
|
-
The `minimalism` design's knobs (#6638) — the template declares no `layout` block of its own; `design: minimalism` supplies these through `DESIGN_LAYOUTS`, resolved with `resolveSiteChrome(layout, design)`, defaults filled. Any shape that names this design gets the same chrome.
|
|
29
|
-
|
|
30
|
-
<!-- generated:begin layout -->
|
|
31
|
-
|
|
32
|
-
| Knob | Value |
|
|
33
|
-
| -------------------- | ----------- |
|
|
34
|
-
| `nav` | `mark-only` |
|
|
35
|
-
| `footer` | `centered` |
|
|
36
|
-
| `announcementBanner` | `false` |
|
|
37
|
-
| `home` | `deck` |
|
|
38
|
-
|
|
39
|
-
<!-- generated:end -->
|
|
40
|
-
|
|
41
|
-
### Theme (locked)
|
|
42
|
-
|
|
43
|
-
The template's `theme:` block as `_site.mdx` declares it — the shape knobs and the colour overlay. Generated, so a change to a locked template's look is a red `manifest:check`, not a silent drift (starter-template contract R3.5).
|
|
44
|
-
|
|
45
|
-
<!-- generated:begin theme -->
|
|
46
|
-
|
|
47
|
-
| Setting | Value |
|
|
48
|
-
| ------------------------ | ---------- |
|
|
49
|
-
| `corners` | `square` |
|
|
50
|
-
| `eyebrowCase` | `sentence` |
|
|
51
|
-
| `placeholders` | `fill` |
|
|
52
|
-
| `checkmarks` | `plain` |
|
|
53
|
-
| `colors.light.bg` | `#ffffff` |
|
|
54
|
-
| `colors.light.bgMuted` | `#ffffff` |
|
|
55
|
-
| `colors.light.surface` | `#ffffff` |
|
|
56
|
-
| `colors.light.border` | `#000000` |
|
|
57
|
-
| `colors.light.text` | `#000000` |
|
|
58
|
-
| `colors.light.textMuted` | `#333333` |
|
|
59
|
-
| `colors.light.primary` | `#000000` |
|
|
60
|
-
| `colors.light.primaryFg` | `#ffffff` |
|
|
61
|
-
| `colors.light.accent` | `#000000` |
|
|
62
|
-
| `colors.dark.bg` | `#000000` |
|
|
63
|
-
| `colors.dark.bgMuted` | `#000000` |
|
|
64
|
-
| `colors.dark.surface` | `#000000` |
|
|
65
|
-
| `colors.dark.border` | `#ffffff` |
|
|
66
|
-
| `colors.dark.text` | `#ffffff` |
|
|
67
|
-
| `colors.dark.textMuted` | `#cccccc` |
|
|
68
|
-
| `colors.dark.primary` | `#ffffff` |
|
|
69
|
-
| `colors.dark.primaryFg` | `#000000` |
|
|
70
|
-
| `colors.dark.accent` | `#ffffff` |
|
|
71
|
-
|
|
72
|
-
<!-- generated:end -->
|
|
73
|
-
|
|
74
|
-
## 2. The home deck — nine slides
|
|
75
|
-
|
|
76
|
-
`layout.home: "deck"` makes every direct section child of `home.mdx` one full-viewport snap target, in order. The mark is hidden on slide 1 (the deck-hero landing state) and revealed from slide 2 on.
|
|
77
|
-
|
|
78
|
-
| # | Slide | Section | Ground | Action |
|
|
79
|
-
| --- | ----------------- | -------------------------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------- |
|
|
80
|
-
| 1 | Landing | `hero` (`backdrop`) | gradient band + backdrop | `{Primary CTA} →` → `/reports`, centered; 44px scroll cue. _No mark — but see the Nav-wiring note below._ |
|
|
81
|
-
| 2 | Tagline | `content-block` (`align: center`, `fill: viewport`) | light | — (_the mark reveals here once #5697 lands_) |
|
|
82
|
-
| 3 | Our community | `logoCloud` (`actions`) | light | `Refer someone →` → `/referral`, bottom-centered at 44px |
|
|
83
|
-
| 4 | Reports headline | `content-block` (`align: center`, `fill: viewport`) | light | — |
|
|
84
|
-
| 5 | Special reports | `reports-list` (`list`, `tone: on-dark`) | dark (`gradient-dark`) | four dated titles → `/reports/<slug>` |
|
|
85
|
-
| 6 | Favorites | `reports-list` (`list`, `tone: on-dark`) | dark (`gradient-dark`) | year-only titles → `/reports/<slug>` |
|
|
86
|
-
| 7 | Services headline | `content-block` (`align: center`, `fill: viewport`) | light | `Hire me →` → `/meet` |
|
|
87
|
-
| 8 | Partners | `team` (`with-large-images`, `hoverReveal`, `phoneColumns: 2`) | light | `About us →` → `/about`, bottom-centered at 44px |
|
|
88
|
-
| 9 | Closing | `cta` (`minimal`) | light | `Contact me →` → `/contact`, centered |
|
|
89
|
-
|
|
90
|
-
### How the deck honours the site principle
|
|
91
|
-
|
|
92
|
-
Sam's site principle for this template — _every slide's action sits at the bottom, centered, at 44px or larger; grids are 2-up on a phone_ — is held by bounded section props, never by a `className` override or hand-rolled markup in a template (`.claude/rules/frontend.md` § Chrome Composes Blocks). #5691 landed the seven the deck was missing and this tree sets all seven; the composition of every slide is unchanged from the table above.
|
|
93
|
-
|
|
94
|
-
| Prop | Owner | Slides that set it | What it does here |
|
|
95
|
-
| ------------------------------------------- | ---------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
96
|
-
| `hero.backdrop` | `packages/ui/src/sections/Hero.tsx` | 1 | paints `assets/hero-backdrop.svg` (installed at `/hero-backdrop.svg`) full-bleed behind the copy. A distinct slot from `image`, which counts as a stacked reveal — so the 44px scroll cue survives it. |
|
|
97
|
-
| `content-block.align` | `.../ContentBlock.tsx` | 2, 4, 7 | centers the headline cluster, the body and the CTA row, through `SectionHeader`'s own `align` prop |
|
|
98
|
-
| `content-block.fill` | `.../ContentBlock.tsx` | 2, 4, 7 | the copy centers in the middle of the full-viewport snap panel instead of sitting at its top |
|
|
99
|
-
| `logoCloud.actions` | `.../LogoCloud.tsx` | 3 | one bottom-centered action at the 44px floor beneath the strip (the #5622 `stair-steps` footer placement) |
|
|
100
|
-
| `team.actions` | `.../Team.tsx` | 8 | the same row beneath the member wall |
|
|
101
|
-
| `'gradient-dark'` on `SectionSurfaceSchema` | `packages/validation/…/page-sections.ts` | 5, 6 | the dark ground `tone: "on-dark"` (#5562, shipped **for** this template) was always meant to sit on. `SectionFrameBand` has carried the band itself since 2026-08-29. |
|
|
102
|
-
| `CardGrid.phoneColumns` | `packages/ui/src/panels/CardGrid.tsx` | 8 | the six-tile wall is two-up at 390 rather than overflowing the snap panel one tile at a time |
|
|
103
|
-
|
|
104
|
-
Two notes on the last row. `CardGrid`'s 1-up-below-`md` ramp stays the system-wide default — the recorded #2803 fix, since an `sm` step made every phone 2-up-cramped — and `phoneColumns: 2` is the opt-in Sam disposed on 2026-09-16 for this deck and the client decks built from it; nothing else in the repo sets it. And slide 8 is the only deck slide that reaches `CardGrid` at all: slide 3's logo strip is a reflowing flex row with no column count, and `reports-list`'s `list` variant has no grid — so one knob on one slide satisfies the whole principle.
|
|
105
|
-
|
|
106
|
-
### The Nav wiring — #5697, and not this template's to fix
|
|
107
|
-
|
|
108
|
-
The deck's brand-mark story is the other half of `layout.home: "deck"`, and it is not wired. `apps/web/app/[locale]/layout.tsx` forwards `snap` and `deckHero` to `MarketingShell` but forwards neither `sticky` nor `deckMorph` to `Nav`, so today the lockup is pushed out of view by the first snap and the morph hooks the #5426 CSS keys off are never in the document. A template declares layout; it cannot forward a prop in an app's layout file. Filed as **#5697**, with both states photographed (`home-*` vs `home-wired-*` under `docs/design-evidence/5589/`).
|
|
109
|
-
|
|
110
|
-
One thing #5697 also settles: #5589's text says slide 1 shows "no visible logo", while what #5426 D4 ships is a cross-fade — wordmark on the landing slide, mark from slide 2 on. The mark's absence from slide 1 holds either way.
|
|
111
|
-
|
|
112
|
-
## 3. Pages
|
|
113
|
-
|
|
114
|
-
One `page=<route>` region per roster row, generated from the seed file the composed layer stack lands for that route.
|
|
115
|
-
|
|
116
|
-
`/`:
|
|
117
|
-
|
|
118
|
-
<!-- generated:begin page=/ -->
|
|
119
|
-
|
|
120
|
-
| # | Section | Component | Copy (first line) |
|
|
121
|
-
| --- | ------------------------------------------------------------------ | -------------- | ---------------------------------------------------------------------- |
|
|
122
|
-
| 1 | `hero` (centered · surface=gradient-brand · fill=viewport · 1 CTA) | `Hero` | Your Company |
|
|
123
|
-
| 2 | `content-block` (narrow · align=center · fill=viewport) | `ContentBlock` | A working partnership with the teams building {what your market needs… |
|
|
124
|
-
| 3 | `logoCloud` (layout=grid · logos ×3 · 1 CTA) | `LogoCloud` | Our community |
|
|
125
|
-
| 4 | `content-block` (narrow · align=center · fill=viewport) | `ContentBlock` | Research on {your field}, and on where the next decade of it is going |
|
|
126
|
-
| 5 | `reports-list` (list · surface=gradient-dark · tone=on-dark) | `ReportsList` | Special reports |
|
|
127
|
-
| 6 | `reports-list` (list · surface=gradient-dark · tone=on-dark) | `ReportsList` | Favorites |
|
|
128
|
-
| 7 | `content-block` (narrow · align=center · fill=viewport · 1 CTA) | `ContentBlock` | Trusted work for the people who carry {the outcome you deliver} |
|
|
129
|
-
| 8 | `team` (with-large-images · members ×6 · 1 CTA) | `Team` | Partners |
|
|
130
|
-
| 9 | `cta` (minimal · 1 CTA) | `CTA` | Your Company |
|
|
131
|
-
|
|
132
|
-
<!-- generated:end -->
|
|
133
|
-
|
|
134
|
-
`/reports`:
|
|
135
|
-
|
|
136
|
-
<!-- generated:begin page=/reports -->
|
|
137
|
-
|
|
138
|
-
| # | Section | Component | Copy (first line) |
|
|
139
|
-
| --- | ------------------------------------- | ------------- | ------------------------------------------- |
|
|
140
|
-
| 1 | `hero` (centered · eyebrow "Reports") | `Hero` | Research on {your field}, published in full |
|
|
141
|
-
| 2 | `reports-list` (cards) | `ReportsList` | |
|
|
142
|
-
| 3 | `cta` (minimal · 1 CTA) | `CTA` | Want the next one as it lands? |
|
|
143
|
-
|
|
144
|
-
<!-- generated:end -->
|
|
145
|
-
|
|
146
|
-
`/about`:
|
|
147
|
-
|
|
148
|
-
<!-- generated:begin page=/about -->
|
|
149
|
-
|
|
150
|
-
| # | Section | Component | Copy (first line) |
|
|
151
|
-
| --- | ------------------------------------------ | -------------- | ---------------------------------------------------------------------- |
|
|
152
|
-
| 1 | `content-block` (narrow · eyebrow "About") | `ContentBlock` | We work with a small number of {the people you serve}, for a long time |
|
|
153
|
-
| 2 | `team` (with-large-images · members ×6) | `Team` | Partners |
|
|
154
|
-
| 3 | `cta` (minimal · 2 CTAs) | `CTA` | Work with us |
|
|
155
|
-
|
|
156
|
-
<!-- generated:end -->
|
|
157
|
-
|
|
158
|
-
`/services`:
|
|
159
|
-
|
|
160
|
-
<!-- generated:begin page=/services -->
|
|
161
|
-
|
|
162
|
-
| # | Section | Component | Copy (first line) |
|
|
163
|
-
| --- | -------------------------------------- | --------- | --------------------------- |
|
|
164
|
-
| 1 | `hero` (centered · eyebrow "Services") | `Hero` | Three ways to work together |
|
|
165
|
-
| 2 | `items` (columns=3 · items ×3) | `Items` | Engagements |
|
|
166
|
-
| 3 | `cta` (minimal · 1 CTA) | `CTA` | Not sure which one? |
|
|
167
|
-
|
|
168
|
-
<!-- generated:end -->
|
|
169
|
-
|
|
170
|
-
`/services/[slug]`:
|
|
171
|
-
|
|
172
|
-
<!-- generated:begin page=/services/[slug] -->
|
|
173
|
-
|
|
174
|
-
_Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx`, `second-engagement.mdx`, `third-engagement.mdx`._
|
|
175
|
-
<!-- generated:end -->
|
|
176
|
-
|
|
177
|
-
`/contact`:
|
|
178
|
-
|
|
179
|
-
<!-- generated:begin page=/contact -->
|
|
180
|
-
|
|
181
|
-
| # | Section | Component | Copy (first line) |
|
|
182
|
-
| --- | ------------------------------------- | --------- | ----------------------------- |
|
|
183
|
-
| 1 | `hero` (centered · eyebrow "Contact") | `Hero` | Say what you are trying to do |
|
|
184
|
-
| 2 | `cta` (minimal · 1 CTA) | `CTA` | Would a call be faster? |
|
|
185
|
-
|
|
186
|
-
<!-- generated:end -->
|
|
187
|
-
|
|
188
|
-
`/referral`:
|
|
189
|
-
|
|
190
|
-
<!-- generated:begin page=/referral -->
|
|
191
|
-
|
|
192
|
-
| # | Section | Component | Copy (first line) |
|
|
193
|
-
| --- | -------------------------------------------------------------- | ------------ | ---------------------------------------- |
|
|
194
|
-
| 1 | `hero` (centered · eyebrow "Referrals" · checklist ×3 · 1 CTA) | `Hero` | Know someone who should be on this list? |
|
|
195
|
-
| 2 | `stair-steps` (tiles ×3) | `StairSteps` | Three steps, about a minute |
|
|
196
|
-
| 3 | `cta` (minimal · 1 CTA) | `CTA` | Make an introduction |
|
|
197
|
-
|
|
198
|
-
<!-- generated:end -->
|
|
199
|
-
|
|
200
|
-
`/faq`:
|
|
201
|
-
|
|
202
|
-
<!-- generated:begin page=/faq -->
|
|
203
|
-
|
|
204
|
-
| # | Section | Component | Copy (first line) |
|
|
205
|
-
| --- | ------------------------------------------------------------- | --------- | ---------------------- |
|
|
206
|
-
| 1 | `faq` (centered · items ×5 · supportLink · initialOpen first) | `FAQ` | Questions |
|
|
207
|
-
| 2 | `cta` (minimal · 1 CTA) | `CTA` | Still have a question? |
|
|
208
|
-
|
|
209
|
-
<!-- generated:end -->
|
|
210
|
-
|
|
211
|
-
`/glossary`, `/newsletter` (base-layer seeds every starter carries, #6658 D5):
|
|
212
|
-
|
|
213
|
-
<!-- generated:begin page=/glossary -->
|
|
214
|
-
|
|
215
|
-
| # | Section | Component | Copy (first line) |
|
|
216
|
-
| --- | ----------------------------------- | --------------- | -------------------------------------------- |
|
|
217
|
-
| 1 | `hero` (eyebrow "Glossary" · 1 CTA) | `Hero` | {Glossary: the terms your customers look up} |
|
|
218
|
-
| 2 | `glossary-index` (columns) | `GlossaryIndex` | {Terms, A to Z} |
|
|
219
|
-
|
|
220
|
-
<!-- generated:end -->
|
|
221
|
-
|
|
222
|
-
<!-- generated:begin page=/newsletter -->
|
|
223
|
-
|
|
224
|
-
| # | Section | Component | Copy (first line) |
|
|
225
|
-
| --- | ------------------------------------- | ------------ | ------------------------------------------------ |
|
|
226
|
-
| 1 | `hero` (eyebrow "Newsletter" · 1 CTA) | `Hero` | {Newsletter: what subscribers get and how often} |
|
|
227
|
-
| 2 | `newsletter` | `Newsletter` | Subscribe |
|
|
228
|
-
| 3 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
|
|
229
|
-
|
|
230
|
-
<!-- generated:end -->
|
|
231
|
-
|
|
232
|
-
`/book-a-call` (this template's own override of the base seed — the call to action opens the `/meet` booker the scheduling module supplies, not `/contact`):
|
|
233
|
-
|
|
234
|
-
<!-- generated:begin page=/book-a-call -->
|
|
235
|
-
|
|
236
|
-
| # | Section | Component | Copy (first line) |
|
|
237
|
-
| --- | -------------------------------------- | --------- | ------------------------------------------ |
|
|
238
|
-
| 1 | `hero` (eyebrow "Book a call" · 1 CTA) | `Hero` | {Book a call: what a visitor gets from it} |
|
|
239
|
-
| 2 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
|
|
240
|
-
|
|
241
|
-
<!-- generated:end -->
|
|
242
|
-
|
|
243
|
-
`/privacy`:
|
|
244
|
-
|
|
245
|
-
<!-- generated:begin page=/privacy -->
|
|
246
|
-
|
|
247
|
-
| # | Section | Component | Copy (first line) |
|
|
248
|
-
| --- | ----------------------------------- | ----------------- | ----------------- |
|
|
249
|
-
| 1 | `document-chassis` (layout=article) | `DocumentChassis` | Privacy Policy |
|
|
250
|
-
|
|
251
|
-
<!-- generated:end -->
|
|
252
|
-
|
|
253
|
-
`/terms`:
|
|
254
|
-
|
|
255
|
-
<!-- generated:begin page=/terms -->
|
|
256
|
-
|
|
257
|
-
| # | Section | Component | Copy (first line) |
|
|
258
|
-
| --- | ----------------------------------- | ----------------- | ----------------- |
|
|
259
|
-
| 1 | `document-chassis` (layout=article) | `DocumentChassis` | Terms of Service |
|
|
260
|
-
|
|
261
|
-
<!-- generated:end -->
|
|
262
|
-
|
|
263
|
-
`/purchase-policy`:
|
|
264
|
-
|
|
265
|
-
<!-- generated:begin page=/purchase-policy -->
|
|
266
|
-
|
|
267
|
-
| # | Section | Component | Copy (first line) |
|
|
268
|
-
| --- | ----------------------------------- | ----------------- | ----------------- |
|
|
269
|
-
| 1 | `document-chassis` (layout=article) | `DocumentChassis` | Purchase Policy |
|
|
270
|
-
|
|
271
|
-
<!-- generated:end -->
|
|
272
|
-
|
|
273
|
-
`/meet`:
|
|
274
|
-
|
|
275
|
-
<!-- generated:begin page=/meet -->
|
|
276
|
-
|
|
277
|
-
_Code route — no content, no sections._
|
|
278
|
-
<!-- generated:end -->
|
|
279
|
-
|
|
280
|
-
`/meet/[slug]`:
|
|
281
|
-
|
|
282
|
-
<!-- generated:begin page=/meet/[slug] -->
|
|
283
|
-
|
|
284
|
-
_Code route — no content, no sections._
|
|
285
|
-
<!-- generated:end -->
|
|
286
|
-
|
|
287
|
-
`/meet/confirmed`:
|
|
288
|
-
|
|
289
|
-
<!-- generated:begin page=/meet/confirmed -->
|
|
290
|
-
|
|
291
|
-
_Code route — no content, no sections._
|
|
292
|
-
<!-- generated:end -->
|
|
293
|
-
|
|
294
|
-
`/appointments`:
|
|
295
|
-
|
|
296
|
-
<!-- generated:begin page=/appointments -->
|
|
297
|
-
|
|
298
|
-
_Code route — no content, no sections._
|
|
299
|
-
<!-- generated:end -->
|
|
300
|
-
|
|
301
|
-
`/flows/[slug]`:
|
|
302
|
-
|
|
303
|
-
<!-- generated:begin page=/flows/[slug] -->
|
|
304
|
-
|
|
305
|
-
_Code route — no content, no sections._
|
|
306
|
-
<!-- generated:end -->
|
|
307
|
-
|
|
308
|
-
`/flows/[slug]/start`:
|
|
309
|
-
|
|
310
|
-
<!-- generated:begin page=/flows/[slug]/start -->
|
|
311
|
-
|
|
312
|
-
_Code route — no content, no sections._
|
|
313
|
-
<!-- generated:end -->
|
|
314
|
-
|
|
315
|
-
`/flows/[slug]/results/[payload]`:
|
|
316
|
-
|
|
317
|
-
<!-- generated:begin page=/flows/[slug]/results/[payload] -->
|
|
318
|
-
|
|
319
|
-
_Code route — no content, no sections._
|
|
320
|
-
<!-- generated:end -->
|
|
321
|
-
|
|
322
|
-
`/reports/[slug]`:
|
|
323
|
-
|
|
324
|
-
<!-- generated:begin page=/reports/[slug] -->
|
|
325
|
-
|
|
326
|
-
_Detail route over `content/en/ReportPage/` — 4 seed pages: `annual-letter-2024.mdx`, `field-notes-2023.mdx`, `platform-shift-2025.mdx`, `state-of-the-market-2026.mdx`._
|
|
327
|
-
<!-- generated:end -->
|
|
328
|
-
|
|
329
|
-
The signal-collectors bundle's sample pages — the project listing, two projects and three thank-you pages — are this template's own roster rows (#6646), so the roster lists every page the scaffold installs.
|
|
330
|
-
|
|
331
|
-
<!-- generated:begin page=/projects -->
|
|
332
|
-
|
|
333
|
-
| # | Section | Component | Copy (first line) |
|
|
334
|
-
| --- | ------------------------------ | --------- | -------------------------- |
|
|
335
|
-
| 1 | `hero` (centered) | `Hero` | Projects |
|
|
336
|
-
| 2 | `items` (columns=2 · items ×2) | `Items` | Selected engagements |
|
|
337
|
-
| 3 | `cta` (2 CTAs) | `CTA` | Have a project like these? |
|
|
338
|
-
|
|
339
|
-
<!-- generated:end -->
|
|
340
|
-
|
|
341
|
-
<!-- generated:begin page=/projects/[slug] -->
|
|
342
|
-
|
|
343
|
-
_Detail route over `content/en/Project/` — 2 seed pages: `fit-check-funnel.mdx`, `launch-site-in-fourteen-days.mdx`._
|
|
344
|
-
<!-- generated:end -->
|
|
345
|
-
|
|
346
|
-
<!-- generated:begin page=/thanks/[slug] -->
|
|
347
|
-
|
|
348
|
-
_Detail route over `content/en/ThankYouPage/` — 3 seed pages: `apply.mdx`, `contact.mdx`, `newsletter.mdx`._
|
|
349
|
-
<!-- generated:end -->
|
|
350
|
-
|
|
351
|
-
### 3a. Differences from the organization-service shape roster
|
|
352
|
-
|
|
353
|
-
This template is the `organization-service` shape (`shape: organization-service`) rendered in the `minimalism` design (`design: minimalism`). Since #6757 that shape carries its own standard roster (fifteen rows: `HomePage`, `AboutPage`, `ServicesList`, `Service`, `ContactPage`, `FAQPage`, `GlossaryList`, `NewsletterSignup`, `BookCall`, `PrivacyPage`, `TermsPage`, `PurchasePolicyPage`, `BlogList`, `PortfolioList`, `PortfolioItem`) — its own deviations from the raw `derive-roster.py` derivation are recorded in `site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md` § 3a, not repeated here. This template's differences are additions and drops from THAT roster only:
|
|
354
|
-
|
|
355
|
-
| Row dropped | Why |
|
|
356
|
-
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
357
|
-
| `PortfolioList` · `PortfolioItem` | the reports are the proof, not a portfolio (§ 2) |
|
|
358
|
-
| `BlogList` | the `/blog` teaser upsells Pro and Fumadocs; a Pro alias does not carry an upsell to its own level (`marketing-site` and `saas-product` already drop the same row, #6753 D4, for the same reason of degree) |
|
|
359
|
-
|
|
360
|
-
| Row added | Why |
|
|
361
|
-
| ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
362
|
-
| `/reports` | the site is reports-first: the deck's landing CTA and slides 5–6 lead here, and it indexes the `signal-collectors` reader at `/reports/<slug>` (§ 2) |
|
|
363
|
-
| `/referral` | the referral magnet — the pitch and what a referrer gets, opening the `referral` flow (§ 6); slide 3's action leads here. Both rows are `LandingPage` slugs, not new types |
|
|
364
|
-
| the three signal-collectors sample rows (`/projects`, `/projects/[slug]`, `/thanks/[slug]`) | the module's own sample content this template declares as its own rows (#6646) |
|
|
365
|
-
|
|
366
|
-
Every kept row of the shape roster (`HomePage`, `AboutPage`, `ServicesList`, `Service`, `ContactPage`, `FAQPage`, `GlossaryList`, `NewsletterSignup`, `BookCall`, `PrivacyPage`, `TermsPage`, `PurchasePolicyPage`) is unchanged: this template's own `/about`, `/contact` and `/book-a-call` seeds override the shared ones (its `/book-a-call` seed points at the `/meet` booker), and the rest ride the shared layers exactly as the shape roster declares them.
|
|
367
|
-
|
|
368
|
-
## 4. Roster, as the registry declares it
|
|
369
|
-
|
|
370
|
-
`minimalism-site` composes the `organization-service` shape roster plus the § 3a differences: the deck replaces the document-scroll home, and `/how-it-works`, the product page (`/software/product`), `/pricing` and `/sign-in` are not pages this site has. The roster is what the template IS, so an unrostered page has neither a route directory nor its seed: `scaffold()` installs a `_base` or overlay seed only for a row that names it (#6646), so `content/en/Pricing/pricing.mdx` does not land. The merged roster, as the registry composes it:
|
|
371
|
-
|
|
372
|
-
<!-- generated:begin roster -->
|
|
373
|
-
|
|
374
|
-
```
|
|
375
|
-
minimalism-site:
|
|
376
|
-
requires: [marketing, scheduling, signal-collectors]
|
|
377
|
-
categories: [real-estate, technology, legal]
|
|
378
|
-
shape: organization-service
|
|
379
|
-
design: minimalism
|
|
380
|
-
roster:
|
|
381
|
-
- { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
|
|
382
|
-
- { route: "/reports", kind: page, content: ["content/en/LandingPage/reports.mdx"] }
|
|
383
|
-
- { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
|
|
384
|
-
- { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
|
|
385
|
-
- { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
|
|
386
|
-
- { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
|
|
387
|
-
- { route: "/referral", kind: page, content: ["content/en/LandingPage/referral.mdx"] }
|
|
388
|
-
- { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
|
|
389
|
-
- { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
|
|
390
|
-
- { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
|
|
391
|
-
- { route: "/book-a-call", kind: page, content: ["content/en/BookCall/book-call.mdx"] }
|
|
392
|
-
- { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
|
|
393
|
-
- { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
|
|
394
|
-
- { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
|
|
395
|
-
- { route: "/projects", kind: page, content: ["content/en/ProjectsList/projects.mdx"] }
|
|
396
|
-
- { route: "/projects/[slug]", kind: page, contentDir: "content/en/Project" }
|
|
397
|
-
- { route: "/thanks/[slug]", kind: page, contentDir: "content/en/ThankYouPage" }
|
|
398
|
-
- { route: "/meet", kind: route }
|
|
399
|
-
- { route: "/meet/[slug]", kind: route }
|
|
400
|
-
- { route: "/meet/confirmed", kind: route }
|
|
401
|
-
- { route: "/appointments", kind: route }
|
|
402
|
-
- { route: "/flows/[slug]", kind: route }
|
|
403
|
-
- { route: "/flows/[slug]/start", kind: route }
|
|
404
|
-
- { route: "/flows/[slug]/results/[payload]", kind: route }
|
|
405
|
-
- { route: "/reports/[slug]", kind: page, contentDir: "content/en/ReportPage" }
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
<!-- generated:end -->
|
|
409
|
-
|
|
410
|
-
By source:
|
|
411
|
-
|
|
412
|
-
```
|
|
413
|
-
template: / · /reports · /about · /services · /services/<slug> · /contact
|
|
414
|
-
/referral · /faq · /privacy · /terms
|
|
415
|
-
scheduling: /meet · /meet/<slug> · /meet/confirmed
|
|
416
|
-
signal-collectors: /flows/<slug> · /flows/<slug>/start · /flows/<slug>/results/<payload>
|
|
417
|
-
/reports/<slug> (#5562)
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
`/reports` and `/referral` carry no `GATEABLE_SURFACES` entry and need none: both are single-segment `LandingPage` slugs served by the generic `[slug]` route (#5469 D2), the same mechanism Free's `/how-it-works` uses. The three module-less surfaces this roster enables are `privacy`, `services` and `terms`.
|
|
421
|
-
|
|
422
|
-
## 5. Renaming `/about`
|
|
423
|
-
|
|
424
|
-
Many sites want this page at `/partners`, `/team`, `/family` or `/company`. That is a ROUTE rename in the customer's scaffold, never a content move and never something the template does for them — `AboutPage` is a content type in the schema registry, not a URL.
|
|
425
|
-
|
|
426
|
-
1. Keep `content/en/AboutPage/`.
|
|
427
|
-
2. `git mv "apps/web/app/[locale]/about" "apps/web/app/[locale]/partners"`.
|
|
428
|
-
3. Update the one footer label that names it (`messages/<locale>.json`).
|
|
429
|
-
|
|
430
|
-
Once #5572's routes map ships in the scaffold this collapses to one row: the `/about` row's `route`, plus a `legacyRoutes` entry so the old path 301s. The `postInstall` message says the same thing to the buyer.
|
|
431
|
-
|
|
432
|
-
## 6. The referral request
|
|
433
|
-
|
|
434
|
-
`/referral` is the magnet — the pitch and what a referrer gets. Its bottom action opens the REQUEST, which is a `signal-collectors` flow: `flows/referral.flow.json` in this tree installs to `database/flows/referral.flow.json` and is served at `/flows/referral/start` (`InstrumentCapturePage`). One field step (name, email, who and why), then a `message` step that confirms inline.
|
|
435
|
-
|
|
436
|
-
The issue named the path `/referral/request`. That path has no `ROUTES` row and no route directory, so serving it would mean shipping a `page.tsx` into every scaffold for one template's page — which a template may never do. **The lead's `source` is `flow:referral`**, not the bare `referral`: `flow-engine.ts` composes it as `` `flow:${slug}` `` for every flow, and that is not a template-level knob. Recorded on #5589 for Sam; his call supersedes.
|
|
437
|
-
|
|
438
|
-
## 7. Component inventory
|
|
439
|
-
|
|
440
|
-
Every component the roster rows' seed content composes today (generated):
|
|
441
|
-
|
|
442
|
-
<!-- generated:begin inventory -->
|
|
443
|
-
|
|
444
|
-
| Tier | Used by this template |
|
|
445
|
-
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
446
|
-
| Shell | `MarketingShell` |
|
|
447
|
-
| Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
|
|
448
|
-
| Sections | `ContentBlock`, `CTA`, `DocumentChassis`, `FAQ`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `Newsletter`, `ReportsList`, `StairSteps`, `Team` |
|
|
449
|
-
|
|
450
|
-
<!-- generated:end -->
|
|
451
|
-
|
|
452
|
-
## 8. Known gaps this manifest depends on
|
|
453
|
-
|
|
454
|
-
| Gap | Issue |
|
|
455
|
-
| ------------------------------------------------------------------- | ---------- |
|
|
456
|
-
| The deck's Nav wiring (`sticky` + `deckMorph` under `home: "deck"`) | #5697 |
|
|
457
|
-
| `/about` rename as one routes-map row | #5572 |
|
|
458
|
-
| The Pro demo host `minimalism-site.ailaunchkit.ai` — provisioning | #5589 body |
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "minimalism-site",
|
|
3
|
-
"requires": ["marketing", "scheduling", "signal-collectors"],
|
|
4
|
-
"extends": "_base",
|
|
5
|
-
"$comment": "The second Pro template (#5589) — the reports-first, scroll-snap deck site. NOT marketing-site plus a module: requires omits docs-blog, so this template and marketing-site are siblings under _base (#5618 D2), never a lineage. Composed base → modules → template: /privacy and /terms arrive with the _base layer this extends (its unrostered /pricing seed does not install, #6646); /meet, /meet/<slug> and /meet/confirmed with the scheduling bundle; the /flows/* routes, the /reports/<slug> reader route and the sample report PDF at apps/web/public/reports/sample-report.pdf with the signal-collectors bundle; the Free contact/faq/about compositions with the overlay, which this template's own /about, /contact and /faq files then override; the overlay's other seeds (/use-cases, the /software/product page, the /blog teaser) are unrostered here and do not install (#6646). This tree holds ONLY its own compositions, its placeholder copy and its generated placeholder assets. layout (nav mark-only, footer centered, announcementBanner off, home deck) is the minimalism design's, supplied by DESIGN_LAYOUTS from the TEMPLATE_MANIFESTS entry's design field (#6638), not declared here — the code registry is authoritative for a template create-ailk ships, and a block here would be a second authority for one fact. installMap: bundle-relative source -> scaffold-relative destination; the stager reads only installMap/postInstall/patches. Unmapped content/en/** lands at the scaffold root's content/, exactly as marketing-site-free's does.",
|
|
6
|
-
"installMap": {
|
|
7
|
-
"provenance.json": ".ailk-template.json",
|
|
8
|
-
"TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json",
|
|
9
|
-
"assets/hero-backdrop.svg": "apps/web/public/hero-backdrop.svg",
|
|
10
|
-
"assets/wordmark-placeholder.svg": "apps/web/public/wordmark-placeholder.svg",
|
|
11
|
-
"assets/logo-placeholder-1.svg": "apps/web/public/logo-placeholder-1.svg",
|
|
12
|
-
"assets/logo-placeholder-2.svg": "apps/web/public/logo-placeholder-2.svg",
|
|
13
|
-
"assets/logo-placeholder-3.svg": "apps/web/public/logo-placeholder-3.svg",
|
|
14
|
-
"assets/avatar-placeholder-1.svg": "apps/web/public/avatar-placeholder-1.svg",
|
|
15
|
-
"assets/avatar-placeholder-2.svg": "apps/web/public/avatar-placeholder-2.svg",
|
|
16
|
-
"assets/avatar-placeholder-3.svg": "apps/web/public/avatar-placeholder-3.svg",
|
|
17
|
-
"assets/avatar-placeholder-4.svg": "apps/web/public/avatar-placeholder-4.svg",
|
|
18
|
-
"assets/avatar-placeholder-5.svg": "apps/web/public/avatar-placeholder-5.svg",
|
|
19
|
-
"assets/avatar-placeholder-6.svg": "apps/web/public/avatar-placeholder-6.svg",
|
|
20
|
-
"flows/referral.flow.json": "database/flows/referral.flow.json"
|
|
21
|
-
},
|
|
22
|
-
"postInstall": "Template minimalism-site installed. The home page is a NINE-SLIDE SCROLL-SNAP DECK (content/en/HomePage/home.mdx): one full-viewport panel per section, the brand mark hidden on slide 1 and revealed from slide 2 on, no nav items, and the footer bottom bar carrying Privacy, Terms, FAQ, the social row, the theme toggle and the locale switcher. Its module pages arrived with their bundles: the booker at /meet from scheduling, the report reader at /reports/<slug> and the flow routes from signal-collectors; /privacy, /terms, /glossary and /newsletter came with the base layer, and /book-a-call is this template's own override of the base seed, its call to action opening the /meet booker. This template adds the deck, /reports, /about, /services (+ three samples), /contact, /faq, /referral, four sample reports and the referral flow at /flows/referral/start. RENAMING /about: many sites want /partners, /team, /family or /company instead. That is a route rename in YOUR scaffold, never a content move - keep content/en/AboutPage/ (AboutPage is a schema type, not a URL), rename the route directory (git mv 'apps/web/app/[locale]/about' 'apps/web/app/[locale]/partners'), and update the one footer label that names it (messages/<locale>.json). Once the routes map ships in the scaffold it is one row: the /about row's route plus a legacyRoutes entry so the old path 301s. EVERY line of copy, all four sample reports, the three logo placeholders, the six portrait placeholders, the wordmark lockup on slide 1 and the hero backdrop are placeholders - replace them before you launch."
|
|
23
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
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
|
-
\*/}
|