create-ailk 0.7.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 +112 -10
- package/component-catalog.json +798 -49
- package/component-catalog.md +9 -6
- 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 +114 -28
- 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/extract-module-bundle.js +5 -1
- 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 +89 -0
- package/dist/lib/module-license-gate.js +171 -12
- package/dist/lib/module-tier.d.ts +45 -16
- package/dist/lib/module-tier.js +76 -0
- package/dist/lib/pro-callout.js +10 -2
- package/dist/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 +88 -10
- package/dist/parse-args.js +272 -21
- package/dist/programmatic.d.ts +66 -12
- package/dist/programmatic.js +361 -34
- 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 +149 -11
- package/dist/starter-grid.d.ts +232 -0
- package/dist/starter-grid.js +545 -0
- package/dist/surfaces.d.ts +41 -9
- package/dist/surfaces.js +268 -92
- package/dist/template-manifest.d.ts +65 -29
- package/dist/template-manifest.js +161 -382
- package/dist/template-names.d.ts +14 -12
- package/dist/template-names.js +13 -17
- package/package.json +5 -4
- package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
- package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
- package/site-templates/_base/content/en/GlossaryList/glossary.mdx +0 -1
- package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +0 -1
- package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
- package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
- package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +15 -0
- package/site-templates/_base/content/en/UseCase/persona-1.mdx +70 -0
- package/site-templates/_base/content/en/UseCase/persona-2.mdx +70 -0
- package/site-templates/_base/content/en/UseCase/persona-3.mdx +70 -0
- 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 +103 -6
- package/site-templates/marketing-site/DESIGN.md +103 -6
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +144 -47
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +82 -41
- package/site-templates/marketing-site-free/DESIGN.md +103 -6
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +150 -48
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +114 -67
- package/site-templates/marketing-site-free/ailk-template.json +1 -1
- package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
- package/site-templates/saas-product/DESIGN.md +103 -6
- package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
- package/site-templates/{simple-service → shapes/local-business-service}/TEMPLATE-MANIFEST.json +210 -81
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +356 -0
- package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
- package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
- package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
- package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/{minimalism-site → shapes/local-business-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +7 -8
- package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
- package/site-templates/shapes/local-business-service/provenance.json +4 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +471 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +354 -0
- package/site-templates/shapes/organization-service/ailk-template.json +10 -0
- package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
- package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/{minimalism-site → shapes/organization-service}/content/en/ServicesList/services.mdx +3 -4
- package/site-templates/shapes/organization-service/provenance.json +4 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +478 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +353 -0
- package/site-templates/shapes/person-service/ailk-template.json +10 -0
- package/site-templates/shapes/person-service/content/_site.mdx +85 -0
- package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
- package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
- package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/{simple-service → shapes/person-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +10 -11
- package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
- package/site-templates/shapes/person-service/provenance.json +4 -0
- package/templates/.claude/rules/architecture.md +7 -0
- package/templates/.claude/skills/README.md +5 -3
- 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 -72
- 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-database/SKILL.md +156 -0
- package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
- package/templates/.claude/skills/setup-deploy/SKILL.md +64 -32
- package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +44 -36
- package/templates/.claude/skills/setup-deploy/references/runbook-template.md +58 -102
- 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 +103 -6
- package/templates/README.md +63 -43
- package/templates/apps/api/.env.example +2 -1
- package/templates/apps/api/CLAUDE.md +3 -2
- 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/config/__tests__/index.test.ts +115 -14
- package/templates/apps/api/src/config/index.ts +35 -16
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
- package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
- package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
- package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
- package/templates/apps/api/src/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/openapi/spec.ts +63 -12
- 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/leads/__tests__/capture.test.ts +88 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
- package/templates/apps/api/src/routes/leads/index.ts +46 -1
- package/templates/apps/api/src/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 +35 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
- package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
- package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
- package/templates/apps/api/src/services/lead-routing.ts +140 -30
- package/templates/apps/api/src/services/leads-inbox.ts +48 -11
- package/templates/apps/api/src/services/revalidation.ts +60 -15
- package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
- package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
- package/templates/apps/mcp/src/tools/create_project.ts +21 -6
- 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]/contact/ConversationalIntakeWrapper.tsx +14 -6
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +10 -9
- package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +227 -84
- package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
- package/templates/apps/web/app/[locale]/contact/page.tsx +105 -15
- package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
- package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
- package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +21 -5
- 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 +65 -17
- package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
- package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
- package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +106 -14
- package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
- package/templates/apps/web/app/[locale]/{book-a-call → portfolio}/page.tsx +12 -13
- 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 +50 -37
- package/templates/apps/web/lib/site-brand.tsx +13 -9
- package/templates/apps/web/lib/site-identity.ts +14 -0
- 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 +45 -5
- package/templates/apps/web/middleware.ts +28 -4
- package/templates/content/_site.mdx +4 -2
- package/templates/content/en/BlogList/blog.mdx +37 -16
- 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 +43 -34
- package/templates/content/en/HomePage/home.mdx +10 -22
- package/templates/content/en/LandingPage/meet.mdx +59 -0
- package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
- package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
- package/templates/database/CHANGELOG.md +14 -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 -53
- package/site-templates/_base/content/en/UseCase/first-use-case.mdx +0 -23
- package/site-templates/_base/content/en/UseCase/second-use-case.mdx +0 -23
- package/site-templates/_base/content/en/UseCase/third-use-case.mdx +0 -23
- package/site-templates/minimalism-site/DESIGN.md +0 -162
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -470
- 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 -53
- 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/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/flows/referral.flow.json +0 -71
- package/site-templates/minimalism-site/provenance.json +0 -4
- package/site-templates/simple-service/DESIGN.md +0 -162
- package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -333
- package/site-templates/simple-service/ailk-template.json +0 -11
- package/site-templates/simple-service/content/en/BookCall/book-call.mdx +0 -53
- package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -32
- package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
- package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
- package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
- package/site-templates/simple-service/provenance.json +0 -4
- package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
- package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -211
- package/templates/apps/web/app/[locale]/contact/__tests__/ContactForm.test.tsx +0 -96
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
- package/templates/content/en/SoftwareProduct/product.mdx +0 -175
- /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
- /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/first-engagement.mdx +0 -0
- /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/second-engagement.mdx +0 -0
- /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/third-engagement.mdx +0 -0
package/dist/template-names.js
CHANGED
|
@@ -20,27 +20,23 @@
|
|
|
20
20
|
* ("Deliberately imports nothing from `parse-args.ts`: that module imports
|
|
21
21
|
* THIS one … so a back-import would close a cycle"), and `surfaces.ts` is the
|
|
22
22
|
* precedent this file follows: the flag's vocabulary lives in a module the
|
|
23
|
-
* parser can import because it
|
|
23
|
+
* parser can import because it reaches nothing that imports the parser.
|
|
24
24
|
*
|
|
25
|
-
* THE
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* `
|
|
31
|
-
*
|
|
32
|
-
*
|
|
25
|
+
* THE NAMES ARE DERIVED, NOT TYPED (#6753 D1). They are the key set of
|
|
26
|
+
* `ALIASES` in `starter-grid.ts` — the alias table `template-manifest.ts`
|
|
27
|
+
* composes every manifest from — so the flag's vocabulary and the registry
|
|
28
|
+
* cannot drift. `starter-grid.ts` is the one file this module imports, and it
|
|
29
|
+
* imports nothing at runtime (every import there is `import type`), so
|
|
30
|
+
* `parse-args.ts` → here → `starter-grid.ts` still reaches no module that
|
|
31
|
+
* imports `parse-args.ts` back. `ALIASES` does not live in
|
|
32
|
+
* `template-manifest.ts` for exactly that reason: importing it from there
|
|
33
|
+
* would re-open the cycle above.
|
|
33
34
|
*
|
|
34
35
|
* Rejected: lazifying `module-tier.ts`'s `PAID_MODULES` to break the cycle at
|
|
35
36
|
* its source. It is the correct structural fix and it is not this unit's to
|
|
36
37
|
* make — `module-tier.ts` is a READ row in spec 5481 § 4, and `PAID_MODULES`
|
|
37
38
|
* is consumed as a plain array across the package.
|
|
38
39
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"marketing-site",
|
|
43
|
-
"saas-product",
|
|
44
|
-
"minimalism-site",
|
|
45
|
-
"simple-service",
|
|
46
|
-
];
|
|
40
|
+
import { ALIASES } from "./starter-grid.js";
|
|
41
|
+
/** The declared site templates, in `ALIASES` (and so `TEMPLATE_MANIFESTS`) declaration order. */
|
|
42
|
+
export const RECOGNIZED_TEMPLATES = Object.keys(ALIASES);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-ailk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Scaffolder for AI Launch Kit — `pnpm create ailk@latest <dir>` produces a starter repo consuming @working-theory/* from npm (per ADR 0007).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"tar": "^7.5.21"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@working-theory/schema": "0.
|
|
29
|
-
"@working-theory/templates": "0.
|
|
28
|
+
"@working-theory/schema": "0.29.0",
|
|
29
|
+
"@working-theory/templates": "0.29.0"
|
|
30
30
|
},
|
|
31
31
|
"repository": {
|
|
32
32
|
"type": "git",
|
|
@@ -58,7 +58,8 @@
|
|
|
58
58
|
"build-catalog": "node scripts/build-component-catalog.mjs",
|
|
59
59
|
"check-catalog": "node scripts/build-component-catalog.mjs --check",
|
|
60
60
|
"manifest:build": "node scripts/build-template-manifest.mjs --template marketing-site-free",
|
|
61
|
-
"manifest:check": "node scripts/build-template-manifest.mjs --template marketing-site-free --check && node scripts/build-template-manifest.mjs --template marketing-site --check",
|
|
61
|
+
"manifest:check": "node scripts/build-template-manifest.mjs --template marketing-site-free --check && node scripts/build-template-manifest.mjs --template marketing-site --check && node scripts/build-template-manifest.mjs --template minimalism-site --check",
|
|
62
|
+
"design:gen": "tsc -b && node scripts/build-design-md.mjs",
|
|
62
63
|
"page-types:build": "tsx scripts/generate-page-types-reference.ts",
|
|
63
64
|
"page-types:check": "tsx scripts/generate-page-types-reference.ts --check"
|
|
64
65
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Feature"
|
|
3
|
+
slug: "feature-1"
|
|
4
|
+
title: "{Feature 1: what it lets the customer do}"
|
|
5
|
+
description: "{One sentence on the result this feature gives and who needs it}"
|
|
6
|
+
sections:
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"id": "hero",
|
|
10
|
+
"type": "hero",
|
|
11
|
+
"data":
|
|
12
|
+
{
|
|
13
|
+
"eyebrow": "Features",
|
|
14
|
+
"headline": "{Feature 1: what it lets the customer do}",
|
|
15
|
+
"subheadline": "{One sentence on the result this feature gives and who needs it}",
|
|
16
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
17
|
+
"secondaryCta":
|
|
18
|
+
{
|
|
19
|
+
"label": "{Secondary CTA}",
|
|
20
|
+
"href": "/pricing",
|
|
21
|
+
"variant": "outline",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "detail",
|
|
27
|
+
"type": "feature",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"headline": "{How feature 1 works}",
|
|
31
|
+
"description": "{Two or three sentences on how it works and what changes for the reader}",
|
|
32
|
+
"features":
|
|
33
|
+
[
|
|
34
|
+
{
|
|
35
|
+
"title": "{First point}",
|
|
36
|
+
"description": "{One sentence that makes the point concrete}",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"title": "{Second point}",
|
|
40
|
+
"description": "{One sentence that makes the point concrete}",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"title": "{Third point}",
|
|
44
|
+
"description": "{One sentence that makes the point concrete}",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "cta",
|
|
51
|
+
"type": "cta",
|
|
52
|
+
"data":
|
|
53
|
+
{
|
|
54
|
+
"variant": "box",
|
|
55
|
+
"headline": "{See feature 1 on your own data}",
|
|
56
|
+
"description": "{One sentence on what happens when they get in touch}",
|
|
57
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
58
|
+
"secondaryCta":
|
|
59
|
+
{
|
|
60
|
+
"label": "{Secondary CTA}",
|
|
61
|
+
"href": "/pricing",
|
|
62
|
+
"variant": "outline",
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
]
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
{/* Rendered from frontmatter `sections[]`. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Feature"
|
|
3
|
+
slug: "feature-2"
|
|
4
|
+
title: "{Feature 2: what it lets the customer do}"
|
|
5
|
+
description: "{One sentence on the result this feature gives and who needs it}"
|
|
6
|
+
sections:
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"id": "hero",
|
|
10
|
+
"type": "hero",
|
|
11
|
+
"data":
|
|
12
|
+
{
|
|
13
|
+
"eyebrow": "Features",
|
|
14
|
+
"headline": "{Feature 2: what it lets the customer do}",
|
|
15
|
+
"subheadline": "{One sentence on the result this feature gives and who needs it}",
|
|
16
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
17
|
+
"secondaryCta":
|
|
18
|
+
{
|
|
19
|
+
"label": "{Secondary CTA}",
|
|
20
|
+
"href": "/pricing",
|
|
21
|
+
"variant": "outline",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "detail",
|
|
27
|
+
"type": "feature",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"headline": "{How feature 2 works}",
|
|
31
|
+
"description": "{Two or three sentences on how it works and what changes for the reader}",
|
|
32
|
+
"features":
|
|
33
|
+
[
|
|
34
|
+
{
|
|
35
|
+
"title": "{First point}",
|
|
36
|
+
"description": "{One sentence that makes the point concrete}",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"title": "{Second point}",
|
|
40
|
+
"description": "{One sentence that makes the point concrete}",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"title": "{Third point}",
|
|
44
|
+
"description": "{One sentence that makes the point concrete}",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "cta",
|
|
51
|
+
"type": "cta",
|
|
52
|
+
"data":
|
|
53
|
+
{
|
|
54
|
+
"variant": "box",
|
|
55
|
+
"headline": "{See feature 2 on your own data}",
|
|
56
|
+
"description": "{One sentence on what happens when they get in touch}",
|
|
57
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
58
|
+
"secondaryCta":
|
|
59
|
+
{
|
|
60
|
+
"label": "{Secondary CTA}",
|
|
61
|
+
"href": "/pricing",
|
|
62
|
+
"variant": "outline",
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
]
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
{/* Rendered from frontmatter `sections[]`. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Feature"
|
|
3
|
+
slug: "feature-3"
|
|
4
|
+
title: "{Feature 3: what it lets the customer do}"
|
|
5
|
+
description: "{One sentence on the result this feature gives and who needs it}"
|
|
6
|
+
sections:
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"id": "hero",
|
|
10
|
+
"type": "hero",
|
|
11
|
+
"data":
|
|
12
|
+
{
|
|
13
|
+
"eyebrow": "Features",
|
|
14
|
+
"headline": "{Feature 3: what it lets the customer do}",
|
|
15
|
+
"subheadline": "{One sentence on the result this feature gives and who needs it}",
|
|
16
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
17
|
+
"secondaryCta":
|
|
18
|
+
{
|
|
19
|
+
"label": "{Secondary CTA}",
|
|
20
|
+
"href": "/pricing",
|
|
21
|
+
"variant": "outline",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "detail",
|
|
27
|
+
"type": "feature",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"headline": "{How feature 3 works}",
|
|
31
|
+
"description": "{Two or three sentences on how it works and what changes for the reader}",
|
|
32
|
+
"features":
|
|
33
|
+
[
|
|
34
|
+
{
|
|
35
|
+
"title": "{First point}",
|
|
36
|
+
"description": "{One sentence that makes the point concrete}",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"title": "{Second point}",
|
|
40
|
+
"description": "{One sentence that makes the point concrete}",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"title": "{Third point}",
|
|
44
|
+
"description": "{One sentence that makes the point concrete}",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "cta",
|
|
51
|
+
"type": "cta",
|
|
52
|
+
"data":
|
|
53
|
+
{
|
|
54
|
+
"variant": "box",
|
|
55
|
+
"headline": "{See feature 3 on your own data}",
|
|
56
|
+
"description": "{One sentence on what happens when they get in touch}",
|
|
57
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
58
|
+
"secondaryCta":
|
|
59
|
+
{
|
|
60
|
+
"label": "{Secondary CTA}",
|
|
61
|
+
"href": "/pricing",
|
|
62
|
+
"variant": "outline",
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
]
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
{/* Rendered from frontmatter `sections[]`. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "FeaturesList"
|
|
3
|
+
slug: "features"
|
|
4
|
+
title: "{Features: what your product does}"
|
|
5
|
+
description: "{One sentence on the capabilities your product gives customers}"
|
|
6
|
+
sections:
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"id": "hero",
|
|
10
|
+
"type": "hero",
|
|
11
|
+
"data":
|
|
12
|
+
{
|
|
13
|
+
"eyebrow": "Features",
|
|
14
|
+
"headline": "{Features: what your product does}",
|
|
15
|
+
"subheadline": "{One sentence on the capabilities your product gives customers}",
|
|
16
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
17
|
+
"secondaryCta":
|
|
18
|
+
{
|
|
19
|
+
"label": "{Secondary CTA}",
|
|
20
|
+
"href": "/pricing",
|
|
21
|
+
"variant": "outline",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "list",
|
|
27
|
+
"type": "items",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"headline": "{Everything your product does for the customer}",
|
|
31
|
+
"description": "{One sentence that helps a visitor find the feature they came for}",
|
|
32
|
+
"columns": 3,
|
|
33
|
+
"items":
|
|
34
|
+
[
|
|
35
|
+
{
|
|
36
|
+
"title": "{Feature 1: what it lets the customer do}",
|
|
37
|
+
"description": "{One sentence on the result this feature gives and who needs it}",
|
|
38
|
+
"link":
|
|
39
|
+
{
|
|
40
|
+
"label": "Read about the feature",
|
|
41
|
+
"href": "/features/feature-1",
|
|
42
|
+
"variant": "link",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"title": "{Feature 2: what it lets the customer do}",
|
|
47
|
+
"description": "{One sentence on the result this feature gives and who needs it}",
|
|
48
|
+
"link":
|
|
49
|
+
{
|
|
50
|
+
"label": "Read about the feature",
|
|
51
|
+
"href": "/features/feature-2",
|
|
52
|
+
"variant": "link",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"title": "{Feature 3: what it lets the customer do}",
|
|
57
|
+
"description": "{One sentence on the result this feature gives and who needs it}",
|
|
58
|
+
"link":
|
|
59
|
+
{
|
|
60
|
+
"label": "Read about the feature",
|
|
61
|
+
"href": "/features/feature-3",
|
|
62
|
+
"variant": "link",
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "cta",
|
|
70
|
+
"type": "cta",
|
|
71
|
+
"data":
|
|
72
|
+
{
|
|
73
|
+
"variant": "box",
|
|
74
|
+
"headline": "{Switch to your product in time amount or less}",
|
|
75
|
+
"description": "{You shouldn't have to experience a painful problem. With your product, you can finally achieve a value outcome or get a big improvement.}",
|
|
76
|
+
"checklist":
|
|
77
|
+
["No credit card required", "Cancel any time", "Live chat support"],
|
|
78
|
+
"primaryCta": { "label": "{Primary CTA}", "href": "/contact" },
|
|
79
|
+
"secondaryCta":
|
|
80
|
+
{
|
|
81
|
+
"label": "{Secondary CTA}",
|
|
82
|
+
"href": "/pricing",
|
|
83
|
+
"variant": "outline",
|
|
84
|
+
},
|
|
85
|
+
"closingLine": "{Social Proof goes here}",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
]
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
{/* Rendered from frontmatter `sections[]`. The three cards link the detail pages, and their titles become the page's JSON-LD ItemList, so keep each card's title equal to its page's title. Placeholder copy — replace every {brace} with your own words before you launch. */}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "PortfolioItem"
|
|
3
|
+
slug: "sample-four"
|
|
4
|
+
title: "{Example four}: before and after"
|
|
5
|
+
description: "{One line on what changed and why it mattered}"
|
|
6
|
+
publishedAt: "2026-01-01"
|
|
7
|
+
sections:
|
|
8
|
+
[
|
|
9
|
+
{
|
|
10
|
+
"id": "compare",
|
|
11
|
+
"type": "before-after",
|
|
12
|
+
"data":
|
|
13
|
+
{
|
|
14
|
+
"header":
|
|
15
|
+
{
|
|
16
|
+
"headline": "{Example four}: before and after",
|
|
17
|
+
"tagline": "{One line on what changed and why it mattered}",
|
|
18
|
+
},
|
|
19
|
+
"pager":
|
|
20
|
+
{
|
|
21
|
+
"prev":
|
|
22
|
+
{
|
|
23
|
+
"label": "{Example three}",
|
|
24
|
+
"href": "/portfolio/sample-three",
|
|
25
|
+
},
|
|
26
|
+
"next":
|
|
27
|
+
{ "label": "{Example one}", "href": "/portfolio/sample-one" },
|
|
28
|
+
},
|
|
29
|
+
"before":
|
|
30
|
+
{
|
|
31
|
+
"label": "Before",
|
|
32
|
+
"icon": "x-circle",
|
|
33
|
+
"rows":
|
|
34
|
+
[
|
|
35
|
+
{
|
|
36
|
+
"title": "{Content}",
|
|
37
|
+
"body": "{One or two sentences on the before content \u2014 what it says and how it reads}",
|
|
38
|
+
"icon": "file-text",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"title": "{Structure}",
|
|
42
|
+
"body": "{One or two sentences on how the before is organized}",
|
|
43
|
+
"icon": "list",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"title": "{Examples}",
|
|
47
|
+
"body": "{One or two sentences on the proof the before offers}",
|
|
48
|
+
"icon": "link",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"title": "{Conclusion}",
|
|
52
|
+
"body": "{One or two sentences on where the before leaves the reader}",
|
|
53
|
+
"icon": "more-horizontal",
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
"verdict": "{One sentence: why the before fell short}",
|
|
57
|
+
},
|
|
58
|
+
"after":
|
|
59
|
+
{
|
|
60
|
+
"label": "After",
|
|
61
|
+
"icon": "check-circle",
|
|
62
|
+
"rows":
|
|
63
|
+
[
|
|
64
|
+
{
|
|
65
|
+
"title": "{Content}",
|
|
66
|
+
"body": "{One or two sentences on the after content \u2014 what it says and how it reads \u2014 with the **strongest phrase in bold**}",
|
|
67
|
+
"icon": "target",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"title": "{Structure}",
|
|
71
|
+
"body": "{One or two sentences on how the after is organized \u2014 with the **strongest phrase in bold**}",
|
|
72
|
+
"icon": "list",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"title": "{Examples}",
|
|
76
|
+
"body": "{One or two sentences on the proof the after offers \u2014 with the **strongest phrase in bold**}",
|
|
77
|
+
"icon": "star",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"title": "{Conclusion}",
|
|
81
|
+
"body": "{One or two sentences on where the after leaves the reader \u2014 with the **strongest phrase in bold**}",
|
|
82
|
+
"icon": "user",
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
"verdict": "{One sentence: what the after achieves}",
|
|
86
|
+
},
|
|
87
|
+
"catalyst":
|
|
88
|
+
{
|
|
89
|
+
"title": "{What changed it}",
|
|
90
|
+
"subtitle": "{The method, in a few words}",
|
|
91
|
+
"steps":
|
|
92
|
+
[
|
|
93
|
+
{ "label": "{Step one}", "marker": "1" },
|
|
94
|
+
{ "label": "{Step two}", "marker": "2" },
|
|
95
|
+
{ "label": "{Step three}", "marker": "3" },
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
"takeaway":
|
|
99
|
+
{
|
|
100
|
+
"body": "{The one thing a reader should remember \u2014 with the **part that matters most in bold**.}",
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
]
|
|
105
|
+
---
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "PortfolioItem"
|
|
3
|
+
slug: "sample-one"
|
|
4
|
+
title: "{Example one}: before and after"
|
|
5
|
+
description: "{One line on what changed and why it mattered}"
|
|
6
|
+
publishedAt: "2026-01-01"
|
|
7
|
+
sections:
|
|
8
|
+
[
|
|
9
|
+
{
|
|
10
|
+
"id": "compare",
|
|
11
|
+
"type": "before-after",
|
|
12
|
+
"data":
|
|
13
|
+
{
|
|
14
|
+
"header":
|
|
15
|
+
{
|
|
16
|
+
"headline": "{Example one}: before and after",
|
|
17
|
+
"tagline": "{One line on what changed and why it mattered}",
|
|
18
|
+
},
|
|
19
|
+
"pager":
|
|
20
|
+
{
|
|
21
|
+
"prev":
|
|
22
|
+
{
|
|
23
|
+
"label": "{Example four}",
|
|
24
|
+
"href": "/portfolio/sample-four",
|
|
25
|
+
},
|
|
26
|
+
"next":
|
|
27
|
+
{ "label": "{Example two}", "href": "/portfolio/sample-two" },
|
|
28
|
+
},
|
|
29
|
+
"before": { "label": "Before", "icon": "x-circle" },
|
|
30
|
+
"after": { "label": "After", "icon": "check-circle" },
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
]
|
|
34
|
+
---
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "PortfolioItem"
|
|
3
|
+
slug: "sample-three"
|
|
4
|
+
title: "{Example three}: before and after"
|
|
5
|
+
description: "{One line on what changed and why it mattered}"
|
|
6
|
+
publishedAt: "2026-01-01"
|
|
7
|
+
sections:
|
|
8
|
+
[
|
|
9
|
+
{
|
|
10
|
+
"id": "compare",
|
|
11
|
+
"type": "before-after",
|
|
12
|
+
"data":
|
|
13
|
+
{
|
|
14
|
+
"header":
|
|
15
|
+
{
|
|
16
|
+
"headline": "{Example three}: before and after",
|
|
17
|
+
"tagline": "{One line on what changed and why it mattered}",
|
|
18
|
+
},
|
|
19
|
+
"pager":
|
|
20
|
+
{
|
|
21
|
+
"prev":
|
|
22
|
+
{ "label": "{Example two}", "href": "/portfolio/sample-two" },
|
|
23
|
+
"next":
|
|
24
|
+
{
|
|
25
|
+
"label": "{Example four}",
|
|
26
|
+
"href": "/portfolio/sample-four",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
"before":
|
|
30
|
+
{
|
|
31
|
+
"label": "Before",
|
|
32
|
+
"icon": "x-circle",
|
|
33
|
+
"rows":
|
|
34
|
+
[
|
|
35
|
+
{
|
|
36
|
+
"title": "{Content}",
|
|
37
|
+
"body": "{One or two sentences on the before content \u2014 what it says and how it reads}",
|
|
38
|
+
"icon": "file-text",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"title": "{Structure}",
|
|
42
|
+
"body": "{One or two sentences on how the before is organized}",
|
|
43
|
+
"icon": "list",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"title": "{Examples}",
|
|
47
|
+
"body": "{One or two sentences on the proof the before offers}",
|
|
48
|
+
"icon": "link",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"title": "{Conclusion}",
|
|
52
|
+
"body": "{One or two sentences on where the before leaves the reader}",
|
|
53
|
+
"icon": "more-horizontal",
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
"verdict": "{One sentence: why the before fell short}",
|
|
57
|
+
},
|
|
58
|
+
"after":
|
|
59
|
+
{
|
|
60
|
+
"label": "After",
|
|
61
|
+
"icon": "check-circle",
|
|
62
|
+
"rows":
|
|
63
|
+
[
|
|
64
|
+
{
|
|
65
|
+
"title": "{Content}",
|
|
66
|
+
"body": "{One or two sentences on the after content \u2014 what it says and how it reads \u2014 with the **strongest phrase in bold**}",
|
|
67
|
+
"icon": "target",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"title": "{Structure}",
|
|
71
|
+
"body": "{One or two sentences on how the after is organized \u2014 with the **strongest phrase in bold**}",
|
|
72
|
+
"icon": "list",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"title": "{Examples}",
|
|
76
|
+
"body": "{One or two sentences on the proof the after offers \u2014 with the **strongest phrase in bold**}",
|
|
77
|
+
"icon": "star",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"title": "{Conclusion}",
|
|
81
|
+
"body": "{One or two sentences on where the after leaves the reader \u2014 with the **strongest phrase in bold**}",
|
|
82
|
+
"icon": "user",
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
"verdict": "{One sentence: what the after achieves}",
|
|
86
|
+
},
|
|
87
|
+
"takeaway":
|
|
88
|
+
{
|
|
89
|
+
"body": "{The one thing a reader should remember \u2014 with the **part that matters most in bold**.}",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
]
|
|
94
|
+
---
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "PortfolioItem"
|
|
3
|
+
slug: "sample-two"
|
|
4
|
+
title: "{Example two}: before and after"
|
|
5
|
+
description: "{One line on what changed and why it mattered}"
|
|
6
|
+
publishedAt: "2026-01-01"
|
|
7
|
+
sections:
|
|
8
|
+
[
|
|
9
|
+
{
|
|
10
|
+
"id": "compare",
|
|
11
|
+
"type": "before-after",
|
|
12
|
+
"data":
|
|
13
|
+
{
|
|
14
|
+
"header":
|
|
15
|
+
{
|
|
16
|
+
"headline": "{Example two}: before and after",
|
|
17
|
+
"tagline": "{One line on what changed and why it mattered}",
|
|
18
|
+
},
|
|
19
|
+
"pager":
|
|
20
|
+
{
|
|
21
|
+
"prev":
|
|
22
|
+
{ "label": "{Example one}", "href": "/portfolio/sample-one" },
|
|
23
|
+
"next":
|
|
24
|
+
{
|
|
25
|
+
"label": "{Example three}",
|
|
26
|
+
"href": "/portfolio/sample-three",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
"before": { "label": "Before", "icon": "x-circle" },
|
|
30
|
+
"after": { "label": "After", "icon": "check-circle" },
|
|
31
|
+
"catalyst":
|
|
32
|
+
{
|
|
33
|
+
"title": "{What changed it}",
|
|
34
|
+
"subtitle": "{The method, in a few words}",
|
|
35
|
+
"steps":
|
|
36
|
+
[
|
|
37
|
+
{ "label": "{Step one}", "marker": "1" },
|
|
38
|
+
{ "label": "{Step two}", "marker": "2" },
|
|
39
|
+
{ "label": "{Step three}", "marker": "3" },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
]
|
|
45
|
+
---
|