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
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile a `DesignPackage` (design-package.ts) into the `theme:` block a
|
|
3
|
+
* site's `_site.mdx` carries (#6812 D4, spec docs/specs/6812-the-design-package-design-md-spec.md).
|
|
4
|
+
*
|
|
5
|
+
* `compileDesignTheme` is pure and idempotent: it reads `pkg` only, never
|
|
6
|
+
* mutates it, and has no I/O. The authored→runtime key map is the single
|
|
7
|
+
* exported table `DESIGN_COLOR_MAP` below — every lossy translation (a
|
|
8
|
+
* runtime slot the authored quartet has no direct source for) is named as a
|
|
9
|
+
* `fallback` + `lossy` case, and the cases with no row at all are named in
|
|
10
|
+
* `DESIGN_COMPILE_LOSSY`.
|
|
11
|
+
*
|
|
12
|
+
* This module imports nothing from `@working-theory/site-config` — the
|
|
13
|
+
* `theme:` block's shape is reproduced structurally here so `create-ailk`
|
|
14
|
+
* gains no runtime dependency (§ 1.5); the cross-package read that proves
|
|
15
|
+
* this compiles to what `SiteThemeSchema` accepts is test-only, by relative
|
|
16
|
+
* path, in `design-compile.test.ts`.
|
|
17
|
+
*/
|
|
18
|
+
import type { DesignPackage } from "./design-package.js";
|
|
19
|
+
/** The nine runtime colour slots this compile emits, per mode (D4). */
|
|
20
|
+
export type RuntimeColorSlot = "bg" | "bgMuted" | "surface" | "border" | "text" | "textMuted" | "primary" | "primaryFg" | "accent";
|
|
21
|
+
/** One mode's compiled palette — the shape `SiteThemeSchema`'s partial palette accepts. */
|
|
22
|
+
export type CompiledColorPalette = {
|
|
23
|
+
[K in RuntimeColorSlot]: string;
|
|
24
|
+
};
|
|
25
|
+
/** `compileDesignTheme`'s return shape — a `SiteThemeSchema`-valid `theme:` block. */
|
|
26
|
+
export interface CompiledDesignTheme {
|
|
27
|
+
corners?: "rounded" | "square";
|
|
28
|
+
eyebrowCase?: "upper" | "sentence";
|
|
29
|
+
placeholders?: "outline" | "fill";
|
|
30
|
+
checkmarks?: "circle" | "plain";
|
|
31
|
+
colors: {
|
|
32
|
+
light: CompiledColorPalette;
|
|
33
|
+
dark: CompiledColorPalette;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Every authored colour key the map may read from (design-package.ts D3). */
|
|
37
|
+
type DesignAuthoredColorKey = "bg" | "fg" | "surface" | "surface-secondary" | "border" | "text-muted" | "brand" | "fg-on-brand" | "accent" | "bg-dark" | "fg-dark" | "border-dark" | "brand-dark" | "surface-dark" | "surface-secondary-dark" | "text-muted-dark" | "fg-on-brand-dark" | "accent-dark";
|
|
38
|
+
/** The five named lossy cases with a row (D4) — an authored key absent falls back. */
|
|
39
|
+
export type DesignColorMapLossyCase = "L1" | "L2" | "L3" | "L4" | "L5";
|
|
40
|
+
export interface DesignColorMapRow {
|
|
41
|
+
readonly mode: "light" | "dark";
|
|
42
|
+
readonly runtime: RuntimeColorSlot;
|
|
43
|
+
readonly authored: DesignAuthoredColorKey;
|
|
44
|
+
readonly fallback?: DesignAuthoredColorKey;
|
|
45
|
+
readonly lossy?: DesignColorMapLossyCase;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The authored→runtime key map (D4) — 18 rows, one per emitted runtime slot
|
|
49
|
+
* per mode, in the overlay block's key order (bg bgMuted surface border text
|
|
50
|
+
* textMuted primary primaryFg accent). Light rows are 1:1; dark rows are
|
|
51
|
+
* direct for bg/border/text/primary and fall back for the other five
|
|
52
|
+
* (L1–L5), each named.
|
|
53
|
+
*/
|
|
54
|
+
export declare const DESIGN_COLOR_MAP: readonly DesignColorMapRow[];
|
|
55
|
+
/**
|
|
56
|
+
* The lossy cases with no row in `DESIGN_COLOR_MAP` (D4): a runtime slot
|
|
57
|
+
* never emitted (L6), an authored group carried but never compiled (L7),
|
|
58
|
+
* and an absent group omitted rather than defaulted (L8).
|
|
59
|
+
*/
|
|
60
|
+
export declare const DESIGN_COMPILE_LOSSY: {
|
|
61
|
+
readonly L6: "accentFg, destructive and destructiveFg have no authored source and are never emitted by this compile — the partial palette inherits the platform default.";
|
|
62
|
+
readonly L7: "typography, rounded and spacing are carried in the package and not compiled — SiteThemeSchema rejects fonts/radius/spacing by name.";
|
|
63
|
+
readonly L8: "an absent treatments key is omitted from the compiled theme block, not defaulted.";
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Translate a `DesignPackage` into the `theme:` block `SiteThemeSchema.parse`
|
|
67
|
+
* accepts (D4). Pure and idempotent — reads `pkg` only, mutates nothing, and
|
|
68
|
+
* performs no I/O.
|
|
69
|
+
*/
|
|
70
|
+
export declare function compileDesignTheme(pkg: DesignPackage): CompiledDesignTheme;
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The authored→runtime key map (D4) — 18 rows, one per emitted runtime slot
|
|
3
|
+
* per mode, in the overlay block's key order (bg bgMuted surface border text
|
|
4
|
+
* textMuted primary primaryFg accent). Light rows are 1:1; dark rows are
|
|
5
|
+
* direct for bg/border/text/primary and fall back for the other five
|
|
6
|
+
* (L1–L5), each named.
|
|
7
|
+
*/
|
|
8
|
+
export const DESIGN_COLOR_MAP = [
|
|
9
|
+
{ mode: "light", runtime: "bg", authored: "bg" },
|
|
10
|
+
{ mode: "light", runtime: "bgMuted", authored: "surface-secondary" },
|
|
11
|
+
{ mode: "light", runtime: "surface", authored: "surface" },
|
|
12
|
+
{ mode: "light", runtime: "border", authored: "border" },
|
|
13
|
+
{ mode: "light", runtime: "text", authored: "fg" },
|
|
14
|
+
{ mode: "light", runtime: "textMuted", authored: "text-muted" },
|
|
15
|
+
{ mode: "light", runtime: "primary", authored: "brand" },
|
|
16
|
+
{ mode: "light", runtime: "primaryFg", authored: "fg-on-brand" },
|
|
17
|
+
{ mode: "light", runtime: "accent", authored: "accent" },
|
|
18
|
+
{ mode: "dark", runtime: "bg", authored: "bg-dark" },
|
|
19
|
+
{
|
|
20
|
+
mode: "dark",
|
|
21
|
+
runtime: "bgMuted",
|
|
22
|
+
authored: "surface-secondary-dark",
|
|
23
|
+
fallback: "bg-dark",
|
|
24
|
+
lossy: "L1",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
mode: "dark",
|
|
28
|
+
runtime: "surface",
|
|
29
|
+
authored: "surface-dark",
|
|
30
|
+
fallback: "bg-dark",
|
|
31
|
+
lossy: "L2",
|
|
32
|
+
},
|
|
33
|
+
{ mode: "dark", runtime: "border", authored: "border-dark" },
|
|
34
|
+
{ mode: "dark", runtime: "text", authored: "fg-dark" },
|
|
35
|
+
{
|
|
36
|
+
mode: "dark",
|
|
37
|
+
runtime: "textMuted",
|
|
38
|
+
authored: "text-muted-dark",
|
|
39
|
+
fallback: "fg-dark",
|
|
40
|
+
lossy: "L3",
|
|
41
|
+
},
|
|
42
|
+
{ mode: "dark", runtime: "primary", authored: "brand-dark" },
|
|
43
|
+
{
|
|
44
|
+
mode: "dark",
|
|
45
|
+
runtime: "primaryFg",
|
|
46
|
+
authored: "fg-on-brand-dark",
|
|
47
|
+
fallback: "bg-dark",
|
|
48
|
+
lossy: "L4",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
mode: "dark",
|
|
52
|
+
runtime: "accent",
|
|
53
|
+
authored: "accent-dark",
|
|
54
|
+
fallback: "brand-dark",
|
|
55
|
+
lossy: "L5",
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
/**
|
|
59
|
+
* The lossy cases with no row in `DESIGN_COLOR_MAP` (D4): a runtime slot
|
|
60
|
+
* never emitted (L6), an authored group carried but never compiled (L7),
|
|
61
|
+
* and an absent group omitted rather than defaulted (L8).
|
|
62
|
+
*/
|
|
63
|
+
export const DESIGN_COMPILE_LOSSY = {
|
|
64
|
+
L6: "accentFg, destructive and destructiveFg have no authored source and are never emitted by this compile — the partial palette inherits the platform default.",
|
|
65
|
+
L7: "typography, rounded and spacing are carried in the package and not compiled — SiteThemeSchema rejects fonts/radius/spacing by name.",
|
|
66
|
+
L8: "an absent treatments key is omitted from the compiled theme block, not defaulted.",
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Translate a `DesignPackage` into the `theme:` block `SiteThemeSchema.parse`
|
|
70
|
+
* accepts (D4). Pure and idempotent — reads `pkg` only, mutates nothing, and
|
|
71
|
+
* performs no I/O.
|
|
72
|
+
*/
|
|
73
|
+
export function compileDesignTheme(pkg) {
|
|
74
|
+
const colors = pkg.colors;
|
|
75
|
+
const light = {};
|
|
76
|
+
const dark = {};
|
|
77
|
+
for (const row of DESIGN_COLOR_MAP) {
|
|
78
|
+
const target = row.mode === "light" ? light : dark;
|
|
79
|
+
const value = colors[row.authored] ?? (row.fallback !== undefined ? colors[row.fallback] : undefined);
|
|
80
|
+
if (value === undefined) {
|
|
81
|
+
// Every `authored`/`fallback` name in DESIGN_COLOR_MAP that can be
|
|
82
|
+
// reached with no fallback names one of the 13 REQUIRED colour keys
|
|
83
|
+
// (design-package.ts D3), so `readDesignPackage` guarantees this read
|
|
84
|
+
// never misses. A miss means that invariant broke — fail loudly rather
|
|
85
|
+
// than silently writing `undefined` into a `string` runtime slot.
|
|
86
|
+
throw new Error(`compileDesignTheme: no colour value for ${row.mode}.${row.runtime} (authored "${row.authored}"${row.fallback !== undefined ? `, fallback "${row.fallback}"` : ""})`);
|
|
87
|
+
}
|
|
88
|
+
target[row.runtime] = value;
|
|
89
|
+
}
|
|
90
|
+
const treatments = pkg.treatments ?? {};
|
|
91
|
+
return {
|
|
92
|
+
...(treatments.corners !== undefined && { corners: treatments.corners }),
|
|
93
|
+
...(treatments.eyebrowCase !== undefined && { eyebrowCase: treatments.eyebrowCase }),
|
|
94
|
+
...(treatments.placeholders !== undefined && { placeholders: treatments.placeholders }),
|
|
95
|
+
...(treatments.checkmarks !== undefined && { checkmarks: treatments.checkmarks }),
|
|
96
|
+
colors: { light, dark },
|
|
97
|
+
};
|
|
98
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { type ResolvedSiteChrome } from "./site-chrome.js";
|
|
2
|
+
/** The closed colour key set (D3) — 13 required, 5 optional dark fallbacks. */
|
|
3
|
+
export declare const DESIGN_COLOR_KEYS_REQUIRED: readonly ["bg", "fg", "surface", "surface-secondary", "border", "text-muted", "brand", "fg-on-brand", "accent", "bg-dark", "fg-dark", "border-dark", "brand-dark"];
|
|
4
|
+
export declare const DESIGN_COLOR_KEYS_OPTIONAL: readonly ["surface-dark", "surface-secondary-dark", "text-muted-dark", "fg-on-brand-dark", "accent-dark"];
|
|
5
|
+
type DesignColorKeyRequired = (typeof DESIGN_COLOR_KEYS_REQUIRED)[number];
|
|
6
|
+
type DesignColorKeyOptional = (typeof DESIGN_COLOR_KEYS_OPTIONAL)[number];
|
|
7
|
+
/** Duplicated from `SiteThemeSchema`'s colour regex (D3) — proven equal by test. */
|
|
8
|
+
export declare const DESIGN_COLOR_REGEX: RegExp;
|
|
9
|
+
export type DesignColors = {
|
|
10
|
+
[K in DesignColorKeyRequired]: string;
|
|
11
|
+
} & {
|
|
12
|
+
[K in DesignColorKeyOptional]?: string;
|
|
13
|
+
};
|
|
14
|
+
/** Typography role fields, D2's `⊆ {fontFamily, fontSize, fontWeight, lineHeight, letterSpacing}` (`fontSize` required). */
|
|
15
|
+
export interface DesignTypographyRole {
|
|
16
|
+
fontFamily?: string;
|
|
17
|
+
fontSize: string;
|
|
18
|
+
fontWeight?: number;
|
|
19
|
+
lineHeight?: number;
|
|
20
|
+
letterSpacing?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Role names are open (D2). */
|
|
23
|
+
export type DesignTypography = Record<string, DesignTypographyRole>;
|
|
24
|
+
/** Names open (D2). */
|
|
25
|
+
export type DesignRounded = Record<string, string>;
|
|
26
|
+
export type DesignSpacing = Record<string, string>;
|
|
27
|
+
/** Duplicated from `SiteThemeSchema`'s enums (D3) — proven equal by test. */
|
|
28
|
+
export declare const DESIGN_CORNERS_VALUES: readonly ["rounded", "square"];
|
|
29
|
+
export declare const DESIGN_EYEBROW_CASE_VALUES: readonly ["upper", "sentence"];
|
|
30
|
+
export declare const DESIGN_PLACEHOLDERS_VALUES: readonly ["outline", "fill"];
|
|
31
|
+
export declare const DESIGN_CHECKMARKS_VALUES: readonly ["circle", "plain"];
|
|
32
|
+
/** D2's optional `treatments` group — the four `SiteThemeSchema` shape settings. */
|
|
33
|
+
export interface DesignTreatments {
|
|
34
|
+
corners?: (typeof DESIGN_CORNERS_VALUES)[number];
|
|
35
|
+
eyebrowCase?: (typeof DESIGN_EYEBROW_CASE_VALUES)[number];
|
|
36
|
+
placeholders?: (typeof DESIGN_PLACEHOLDERS_VALUES)[number];
|
|
37
|
+
checkmarks?: (typeof DESIGN_CHECKMARKS_VALUES)[number];
|
|
38
|
+
}
|
|
39
|
+
/** D2's optional `sections` group — carried verbatim; look-field validation is #6803's. */
|
|
40
|
+
export type DesignSections = Record<string, Record<string, unknown>>;
|
|
41
|
+
/** The closed copy-density enum (spec 6892 D4). */
|
|
42
|
+
export declare const DESIGN_COPY_DENSITY_VALUES: readonly ["standard", "sparse"];
|
|
43
|
+
/**
|
|
44
|
+
* Spec 6892 D4's optional `copy` group — how many words a design's own pages
|
|
45
|
+
* carry. Read only by the fill-page/copywriting agents against the scaffold's
|
|
46
|
+
* installed `DESIGN.md`; no code branches on it.
|
|
47
|
+
*/
|
|
48
|
+
export interface DesignCopy {
|
|
49
|
+
density: (typeof DESIGN_COPY_DENSITY_VALUES)[number];
|
|
50
|
+
}
|
|
51
|
+
/** The typed package `readDesignPackage` returns (D2). */
|
|
52
|
+
export interface DesignPackage {
|
|
53
|
+
name: string;
|
|
54
|
+
description: string;
|
|
55
|
+
colors: DesignColors;
|
|
56
|
+
typography: DesignTypography;
|
|
57
|
+
rounded: DesignRounded;
|
|
58
|
+
spacing: DesignSpacing;
|
|
59
|
+
layout: ResolvedSiteChrome;
|
|
60
|
+
treatments?: DesignTreatments;
|
|
61
|
+
sections: DesignSections;
|
|
62
|
+
/** Absent in `DESIGN.md` resolves to `{ density: "standard" }` (D4). */
|
|
63
|
+
copy: DesignCopy;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Thrown by `readDesignPackage` on any malformed package (D2) — never thrown
|
|
67
|
+
* after a write; every refusal happens before any I/O beyond reading
|
|
68
|
+
* `DESIGN.md` itself.
|
|
69
|
+
*/
|
|
70
|
+
export declare class DesignPackageError extends Error {
|
|
71
|
+
readonly file: string;
|
|
72
|
+
readonly field: string;
|
|
73
|
+
constructor(file: string, field: string, reason: string);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read and validate `<dir>/DESIGN.md`'s frontmatter into a typed
|
|
77
|
+
* `DesignPackage` (D1/D2). Refuses — naming the file and the field — on any
|
|
78
|
+
* malformed package: a missing file, an unknown key, a wrong type, an
|
|
79
|
+
* unknown layout value. Nothing is written; this function has no side
|
|
80
|
+
* effects beyond the one read.
|
|
81
|
+
*/
|
|
82
|
+
export declare function readDesignPackage(dir: string): DesignPackage;
|
|
83
|
+
export {};
|