create-ailk 0.5.0 → 0.6.1
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 +55 -8
- package/component-catalog.json +336 -27
- package/component-catalog.md +25 -12
- package/dist/cli.js +54 -5
- package/dist/copy.d.ts +14 -0
- package/dist/copy.js +38 -1
- package/dist/lib/api-boot-assertion.d.ts +46 -0
- package/dist/lib/api-boot-assertion.js +70 -0
- package/dist/lib/extract-module-bundle.d.ts +20 -1
- package/dist/lib/extract-module-bundle.js +64 -5
- package/dist/lib/import-graph.d.ts +29 -0
- package/dist/lib/import-graph.js +140 -0
- package/dist/lib/module-license-gate.d.ts +6 -1
- package/dist/lib/module-license-gate.js +6 -1
- package/dist/lib/pro-callout.js +1 -1
- package/dist/module-architecture.d.ts +1 -0
- package/dist/module-architecture.js +253 -127
- package/dist/modules/commerce/0.6.0.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.0.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.0.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.0.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.0.tar.gz +0 -0
- package/dist/modules/workspace/0.6.0.tar.gz +0 -0
- package/dist/programmatic.js +14 -10
- package/dist/surfaces.js +105 -7
- package/dist/template-manifest.d.ts +33 -0
- package/dist/template-manifest.js +99 -16
- package/dist/template-names.d.ts +1 -1
- package/dist/template-names.js +1 -0
- package/package.json +3 -2
- package/site-templates/marketing-site/DESIGN.md +148 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +22 -2
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +9 -2
- package/site-templates/marketing-site/ailk-template.json +1 -1
- package/site-templates/marketing-site-free/DESIGN.md +148 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +2 -2
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +1 -0
- package/site-templates/minimalism-site/DESIGN.md +148 -0
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +10 -2
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +47 -35
- package/site-templates/minimalism-site/ailk-template.json +2 -1
- package/site-templates/minimalism-site/assets/wordmark-placeholder.svg +28 -0
- package/site-templates/minimalism-site/content/en/HomePage/home.mdx +49 -19
- package/site-templates/saas-product/DESIGN.md +148 -0
- package/site-templates/simple-service/DESIGN.md +148 -0
- package/site-templates/simple-service/TEMPLATE-MANIFEST.json +240 -0
- package/site-templates/simple-service/TEMPLATE-MANIFEST.md +278 -0
- package/site-templates/simple-service/ailk-template.json +10 -0
- package/site-templates/simple-service/content/en/AboutPage/about.mdx +38 -0
- package/site-templates/simple-service/content/en/ContactPage/contact.mdx +67 -0
- package/site-templates/simple-service/content/en/FAQPage/faq.mdx +56 -0
- package/site-templates/simple-service/content/en/HomePage/home.mdx +85 -0
- package/site-templates/simple-service/content/en/Service/landscape-design.mdx +40 -0
- package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +40 -0
- package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +40 -0
- package/site-templates/simple-service/content/en/ServicesList/services.mdx +72 -0
- package/site-templates/simple-service/provenance.json +4 -0
- package/templates/.env.example +72 -7
- package/templates/CLAUDE.md +2 -3
- package/templates/DESIGN.md +155 -0
- package/templates/README.md +42 -8
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +8 -0
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +12 -0
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +12 -0
- package/templates/apps/api/.env.example +13 -0
- package/templates/apps/api/CLAUDE.md +26 -2
- package/templates/apps/api/jest.config.cjs +3 -0
- package/templates/apps/api/package.json +1 -0
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +407 -0
- package/templates/apps/api/src/__tests__/module-exclusion.test.ts +83 -7
- package/templates/apps/api/src/__tests__/server.test.ts +471 -0
- package/templates/apps/api/src/__tests__/vercel-handler.test.ts +45 -0
- package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +2 -0
- package/templates/apps/api/src/config/index.ts +62 -0
- package/templates/apps/api/src/config/modules.ts +7 -3
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +238 -2
- package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +143 -0
- package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +23 -0
- package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +125 -0
- package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +20 -0
- package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +317 -0
- package/templates/apps/api/src/lib/__tests__/site.test.ts +238 -0
- package/templates/apps/api/src/lib/__tests__/stripe.test.ts +75 -0
- package/templates/apps/api/src/lib/auth-email-budget.ts +160 -0
- package/templates/apps/api/src/lib/content-adapter.ts +57 -31
- package/templates/apps/api/src/lib/deliverable-asset-store.ts +76 -0
- package/templates/apps/api/src/lib/error-serializer.ts +23 -3
- package/templates/apps/api/src/lib/outbound-http.ts +7 -2
- package/templates/apps/api/src/lib/require-commerce-claim.ts +250 -0
- package/templates/apps/api/src/lib/site.ts +208 -9
- package/templates/apps/api/src/lib/stripe.ts +66 -0
- package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +182 -0
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +42 -0
- package/templates/apps/api/src/middleware/rate-limit.ts +7 -1
- package/templates/apps/api/src/openapi/spec.ts +543 -2
- package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +48 -0
- package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +309 -0
- package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +123 -0
- package/templates/apps/api/src/routes/auth/transactional-email.ts +273 -0
- package/templates/apps/api/src/routes/auth/user.ts +61 -0
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +434 -0
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +888 -0
- package/templates/apps/api/src/routes/checkout/index.ts +34 -0
- package/templates/apps/api/src/routes/checkout/session.ts +139 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +197 -0
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +554 -0
- package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +108 -0
- package/templates/apps/api/src/routes/content/__tests__/search.test.ts +450 -0
- package/templates/apps/api/src/routes/content/get-page.ts +94 -12
- package/templates/apps/api/src/routes/content/index.ts +13 -73
- package/templates/apps/api/src/routes/content/list-pages.ts +15 -3
- package/templates/apps/api/src/routes/content/rate-limit.ts +15 -6
- package/templates/apps/api/src/routes/content/search.ts +129 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +447 -31
- package/templates/apps/api/src/routes/leads/index.ts +100 -13
- package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +51 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +351 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +51 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +5 -2
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +4 -1
- package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +58 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +107 -6
- package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +87 -2
- package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +51 -0
- package/templates/apps/api/src/routes/project-listings/start.ts +5 -1
- package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +686 -0
- package/templates/apps/api/src/routes/requests/confirm.ts +601 -0
- package/templates/apps/api/src/routes/requests/index.ts +54 -0
- package/templates/apps/api/src/routes/webhooks/README.md +265 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +749 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +330 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +262 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +285 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +213 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +301 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +648 -0
- package/templates/apps/api/src/routes/webhooks/index.ts +89 -0
- package/templates/apps/api/src/routes/webhooks/stripe.ts +1399 -0
- package/templates/apps/api/src/server.ts +439 -49
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +39 -0
- package/templates/apps/api/src/services/__tests__/aeo-score.test.ts +217 -40
- package/templates/apps/api/src/services/__tests__/audit-log.test.ts +620 -0
- package/templates/apps/api/src/services/__tests__/consent.test.ts +2 -0
- package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +300 -5
- package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +20 -0
- package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +368 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +160 -0
- package/templates/apps/api/src/services/__tests__/listing-config.test.ts +166 -0
- package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +154 -0
- package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +137 -0
- package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +444 -0
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +238 -0
- package/templates/apps/api/src/services/__tests__/verified-email.test.ts +78 -0
- package/templates/apps/api/src/services/abandon-email.ts +8 -2
- package/templates/apps/api/src/services/aeo-score.ts +49 -12
- package/templates/apps/api/src/services/audit-log.ts +668 -0
- package/templates/apps/api/src/services/consent.ts +18 -0
- package/templates/apps/api/src/services/default-tenant.ts +70 -31
- package/templates/apps/api/src/services/deliverable-fulfillment.ts +141 -13
- package/templates/apps/api/src/services/dunning-policy.ts +294 -0
- package/templates/apps/api/src/services/entitlements.ts +80 -0
- package/templates/apps/api/src/services/lead-promotion.ts +13 -14
- package/templates/apps/api/src/services/lead-routing.ts +161 -2
- package/templates/apps/api/src/services/leads-inbox.ts +23 -2
- package/templates/apps/api/src/services/listing-config.ts +27 -9
- package/templates/apps/api/src/services/project-listings.ts +201 -6
- package/templates/apps/api/src/services/public-site-resolver.ts +106 -0
- package/templates/apps/api/src/services/request-confirm.ts +646 -0
- package/templates/apps/api/src/services/revalidation.ts +173 -0
- package/templates/apps/api/src/services/verified-email.ts +71 -0
- package/templates/apps/api/src/vercel-handler.ts +75 -35
- package/templates/apps/mcp/.env.example +17 -0
- package/templates/apps/mcp/CLAUDE.md +57 -24
- package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +6 -0
- package/templates/apps/mcp/__tests__/audit.test.ts +137 -8
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +79 -36
- package/templates/apps/mcp/__tests__/get_offerings.test.ts +111 -2
- package/templates/apps/mcp/__tests__/get_pricing.test.ts +82 -2
- package/templates/apps/mcp/__tests__/http-transport.test.ts +541 -2
- package/templates/apps/mcp/__tests__/index.test.ts +39 -0
- package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +143 -0
- package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +111 -0
- package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +65 -0
- package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +188 -0
- package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +165 -0
- package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +124 -0
- package/templates/apps/mcp/__tests__/list_pages.test.ts +116 -0
- package/templates/apps/mcp/__tests__/module-exclusion.test.ts +7 -1
- package/templates/apps/mcp/__tests__/parity.test.ts +10 -7
- package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +89 -22
- package/templates/apps/mcp/__tests__/read_content.test.ts +322 -1
- package/templates/apps/mcp/__tests__/search_content.test.ts +105 -2
- package/templates/apps/mcp/__tests__/server.test.ts +67 -14
- package/templates/apps/mcp/__tests__/start_purchase.test.ts +252 -0
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +300 -123
- package/templates/apps/mcp/jest.config.cjs +13 -0
- package/templates/apps/mcp/package.json +2 -0
- package/templates/apps/mcp/src/abuse/index.ts +159 -24
- package/templates/apps/mcp/src/config/modules.ts +10 -5
- package/templates/apps/mcp/src/http-transport.ts +102 -29
- package/templates/apps/mcp/src/index.ts +73 -11
- package/templates/apps/mcp/src/lib/audit-single-page.ts +90 -3
- package/templates/apps/mcp/src/lib/commerce-claim.ts +94 -0
- package/templates/apps/mcp/src/lib/content-adapter.ts +113 -0
- package/templates/apps/mcp/src/lib/empty-content-adapter.ts +139 -0
- package/templates/apps/mcp/src/lib/prisma.ts +39 -0
- package/templates/apps/mcp/src/lib/public-workspace.ts +133 -0
- package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +59 -0
- package/templates/apps/mcp/src/server.ts +59 -35
- package/templates/apps/mcp/src/tools/audit.ts +26 -2
- package/templates/apps/mcp/src/tools/get_business_hours.ts +4 -3
- package/templates/apps/mcp/src/tools/get_faq.ts +4 -3
- package/templates/apps/mcp/src/tools/get_locations.ts +5 -3
- package/templates/apps/mcp/src/tools/get_offerings.ts +16 -4
- package/templates/apps/mcp/src/tools/get_pricing.ts +25 -6
- package/templates/apps/mcp/src/tools/get_site_info.ts +4 -3
- package/templates/apps/mcp/src/tools/index.ts +6 -4
- package/templates/apps/mcp/src/tools/list_pages.ts +4 -3
- package/templates/apps/mcp/src/tools/purchase.ts +128 -45
- package/templates/apps/mcp/src/tools/read_content.ts +20 -6
- package/templates/apps/mcp/src/tools/search_content.ts +11 -4
- package/templates/apps/web/.env.example +71 -5
- package/templates/apps/web/CLAUDE.md +44 -0
- package/templates/apps/web/PRODUCT.md +86 -0
- package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +18 -2
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +11 -3
- package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +282 -0
- package/templates/apps/web/app/[locale]/(auth)/__tests__/password-reset.test.tsx +515 -0
- package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +89 -0
- package/templates/apps/web/app/[locale]/(auth)/forgot-password/page.tsx +109 -0
- package/templates/apps/web/app/[locale]/(auth)/layout.tsx +92 -0
- package/templates/apps/web/app/[locale]/(auth)/reset-password/page.tsx +135 -0
- package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +109 -0
- package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/page.test.tsx +48 -2
- package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/page.tsx +20 -6
- package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +125 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +96 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +101 -0
- package/templates/apps/web/app/[locale]/(auth)/use-auth-card-flow.ts +102 -0
- package/templates/apps/web/app/[locale]/(auth)/verify-email/page.tsx +87 -0
- package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +20 -10
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +84 -0
- package/templates/apps/web/app/[locale]/(authed)/account/actions.ts +58 -0
- package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +63 -8
- package/templates/apps/web/app/[locale]/(authed)/layout.tsx +18 -1
- package/templates/apps/web/app/[locale]/cancellation/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/layout.tsx +133 -87
- package/templates/apps/web/app/[locale]/purchase/__tests__/cancel.test.tsx +162 -0
- package/templates/apps/web/app/[locale]/purchase/__tests__/module-scope.test.ts +68 -0
- package/templates/apps/web/app/[locale]/purchase/__tests__/success.test.tsx +361 -0
- package/templates/apps/web/app/[locale]/purchase/cancel/page.tsx +115 -0
- package/templates/apps/web/app/[locale]/purchase/success/page.tsx +307 -0
- package/templates/apps/web/app/[locale]/returns/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/shipping/page.tsx +44 -0
- package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +670 -0
- package/templates/apps/web/app/api/revalidate/route.ts +194 -0
- package/templates/apps/web/auth.ts +407 -8
- package/templates/apps/web/jest.config.cjs +8 -4
- package/templates/apps/web/lib/__tests__/auth-email.test.ts +214 -0
- package/templates/apps/web/lib/__tests__/auth-routes.test.ts +74 -0
- package/templates/apps/web/lib/__tests__/meeting-slugs.test.ts +72 -0
- package/templates/apps/web/lib/__tests__/site-theme.test.ts +135 -20
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +18 -1
- package/templates/apps/web/lib/auth-email.ts +318 -0
- package/templates/apps/web/lib/auth-env.ts +85 -0
- package/templates/apps/web/lib/auth-routes.ts +55 -0
- package/templates/apps/web/lib/meeting-slugs.ts +53 -0
- package/templates/apps/web/lib/site-brand.tsx +4 -8
- package/templates/apps/web/lib/telemetry-scrub.ts +5 -1
- package/templates/apps/web/messages/en.json +187 -0
- package/templates/apps/web/middleware.ts +1 -1
- package/templates/apps/web/package.json +2 -1
- package/templates/apps/web/src/lib/commerce-claim.ts +33 -0
- package/templates/apps/web/src/lib/commerce-sections.ts +93 -0
- package/templates/content/_site.mdx +18 -3
- package/templates/content/en/CancellationPolicyPage/cancellation.mdx +108 -0
- package/templates/content/en/ReturnsPolicyPage/returns.mdx +108 -0
- package/templates/content/en/ShippingPolicyPage/shipping.mdx +108 -0
- package/templates/database/CHANGELOG.md +149 -0
- package/templates/database/README.md +10 -3
- package/templates/database/__tests__/appointment.db.test.ts +106 -0
- package/templates/database/__tests__/artifact-content-store.db.test.ts +316 -0
- package/templates/database/__tests__/composite-fence.db.test.ts +206 -0
- package/templates/database/__tests__/fence-fan-out.db.test.ts +711 -0
- package/templates/database/__tests__/fixtures/appointment-create-probe.ts +79 -0
- package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +100 -0
- package/templates/database/__tests__/flow-workspace-key.db.test.ts +263 -0
- package/templates/database/__tests__/prefixed-ids.db.test.ts +85 -9
- package/templates/database/__tests__/project-listing-consent-at.db.test.ts +111 -0
- package/templates/database/__tests__/tenancy.test.ts +141 -0
- package/templates/database/config/schema.prisma +79 -2
- package/templates/database/content/schema.prisma +87 -11
- package/templates/database/inbox/schema.prisma +452 -9
- package/templates/database/jest.config.cjs +5 -3
- package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +15 -0
- package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +158 -0
- package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +40 -0
- package/templates/database/migrations/20260918120000_add_appointment/migration.sql +67 -0
- package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +70 -0
- package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +181 -0
- package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +172 -0
- package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +41 -0
- package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +185 -0
- package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +70 -0
- package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +57 -0
- package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +68 -0
- package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +1067 -0
- package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +210 -0
- package/templates/database/package.json +3 -2
- package/templates/database/tenancy.ts +86 -1
- package/templates/database/tsconfig.json +1 -0
- package/versions.json +34 -34
- package/templates/apps/api/src/routes/content/__tests__/create.test.ts +0 -253
- package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +0 -215
- package/templates/apps/api/src/routes/content/__tests__/update.test.ts +0 -266
- package/templates/apps/api/src/routes/content/create.ts +0 -115
- package/templates/apps/api/src/routes/content/delete.ts +0 -82
- package/templates/apps/api/src/routes/content/update.ts +0 -112
- package/templates/apps/mcp/__tests__/create_page.test.ts +0 -202
- package/templates/apps/mcp/__tests__/delete_page.test.ts +0 -177
- package/templates/apps/mcp/__tests__/update_page.test.ts +0 -196
- package/templates/apps/mcp/src/tools/create_page.ts +0 -96
- package/templates/apps/mcp/src/tools/delete_page.ts +0 -74
- package/templates/apps/mcp/src/tools/update_page.ts +0 -92
- package/templates/apps/web/app/[locale]/sign-in/sign-in-card.tsx +0 -123
- package/templates/apps/web/public/logo-dark.svg +0 -21
- package/templates/apps/web/public/logo-light.svg +0 -21
- /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/next-path.test.ts +0 -0
- /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/next-path.ts +0 -0
|
@@ -13,7 +13,15 @@ sections:
|
|
|
13
13
|
"variant": "centered",
|
|
14
14
|
"fill": "viewport",
|
|
15
15
|
"surface": "gradient-brand",
|
|
16
|
+
"backdrop": { "src": "/hero-backdrop.svg", "alt": "" },
|
|
16
17
|
"headline": "Your Company",
|
|
18
|
+
"lockup":
|
|
19
|
+
{
|
|
20
|
+
"src": "/wordmark-placeholder.svg",
|
|
21
|
+
"alt": "",
|
|
22
|
+
"width": 1043,
|
|
23
|
+
"height": 128,
|
|
24
|
+
},
|
|
17
25
|
"primaryCta": { "label": "{Primary CTA} →", "href": "/reports" },
|
|
18
26
|
"ctaSize": "xl",
|
|
19
27
|
"scrollCue": { "label": "Scroll" },
|
|
@@ -25,6 +33,8 @@ sections:
|
|
|
25
33
|
"data":
|
|
26
34
|
{
|
|
27
35
|
"variant": "narrow",
|
|
36
|
+
"align": "center",
|
|
37
|
+
"fill": "viewport",
|
|
28
38
|
"headline": "A working partnership with the teams building {what your market needs next}",
|
|
29
39
|
"body": "{One line on who you work with, and what they get from you that they cannot get elsewhere.}",
|
|
30
40
|
},
|
|
@@ -43,6 +53,14 @@ sections:
|
|
|
43
53
|
{ "name": "{logo}", "src": "/logo-placeholder-2.svg" },
|
|
44
54
|
{ "name": "{logo}", "src": "/logo-placeholder-3.svg" },
|
|
45
55
|
],
|
|
56
|
+
"actions":
|
|
57
|
+
[
|
|
58
|
+
{
|
|
59
|
+
"kind": "button",
|
|
60
|
+
"label": "Refer someone →",
|
|
61
|
+
"href": "/referral",
|
|
62
|
+
},
|
|
63
|
+
],
|
|
46
64
|
},
|
|
47
65
|
},
|
|
48
66
|
{
|
|
@@ -51,6 +69,8 @@ sections:
|
|
|
51
69
|
"data":
|
|
52
70
|
{
|
|
53
71
|
"variant": "narrow",
|
|
72
|
+
"align": "center",
|
|
73
|
+
"fill": "viewport",
|
|
54
74
|
"headline": "Research on {your field}, and on where the next decade of it is going",
|
|
55
75
|
"body": "{One line on what a reader walks away with. Keep it to a single sentence.}",
|
|
56
76
|
},
|
|
@@ -62,7 +82,8 @@ sections:
|
|
|
62
82
|
{
|
|
63
83
|
"headline": "Special reports",
|
|
64
84
|
"variant": "list",
|
|
65
|
-
"tone": "on-
|
|
85
|
+
"tone": "on-dark",
|
|
86
|
+
"surface": "gradient-dark",
|
|
66
87
|
"reports":
|
|
67
88
|
[
|
|
68
89
|
{
|
|
@@ -95,7 +116,8 @@ sections:
|
|
|
95
116
|
{
|
|
96
117
|
"headline": "Favorites",
|
|
97
118
|
"variant": "list",
|
|
98
|
-
"tone": "on-
|
|
119
|
+
"tone": "on-dark",
|
|
120
|
+
"surface": "gradient-dark",
|
|
99
121
|
"reports":
|
|
100
122
|
[
|
|
101
123
|
{ "slug": "state-of-the-market-2026", "title": "2026" },
|
|
@@ -111,6 +133,8 @@ sections:
|
|
|
111
133
|
"data":
|
|
112
134
|
{
|
|
113
135
|
"variant": "narrow",
|
|
136
|
+
"align": "center",
|
|
137
|
+
"fill": "viewport",
|
|
114
138
|
"headline": "Trusted work for the people who carry {the outcome you deliver}",
|
|
115
139
|
"body": "{One line on how an engagement starts and what the first month looks like.}",
|
|
116
140
|
"cta": { "label": "Hire me →", "href": "/meet" },
|
|
@@ -125,6 +149,9 @@ sections:
|
|
|
125
149
|
"variant": "with-large-images",
|
|
126
150
|
"hoverReveal": true,
|
|
127
151
|
"largePhotos": true,
|
|
152
|
+
"phoneColumns": 2,
|
|
153
|
+
"actions":
|
|
154
|
+
[{ "kind": "button", "label": "About us →", "href": "/about" }],
|
|
128
155
|
"members":
|
|
129
156
|
[
|
|
130
157
|
{
|
|
@@ -192,23 +219,26 @@ the reference's own words. Replace all of it before you launch — including
|
|
|
192
219
|
the four sample reports, the three logo placeholders and the six portrait
|
|
193
220
|
placeholders.
|
|
194
221
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
nothing is recomposed:
|
|
222
|
+
Every slide now carries the full composition the template intends — #5691
|
|
223
|
+
landed the seven bounded section props the deck was waiting on, and this file
|
|
224
|
+
sets all seven without recomposing a single slide:
|
|
199
225
|
|
|
200
|
-
- slide 1 `landing` —
|
|
201
|
-
(
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
226
|
+
- slide 1 `landing` — `backdrop` paints `assets/hero-backdrop.svg`
|
|
227
|
+
(installed at `/hero-backdrop.svg`) full-bleed behind the copy. It is a
|
|
228
|
+
distinct slot from the hero's `image`, which counts as a stacked reveal,
|
|
229
|
+
so the 44px `scrollCue` survives it.
|
|
230
|
+
- slide 3 `community` and slide 8 `partners` — `actions` puts one
|
|
231
|
+
bottom-centered action at the 44px floor on each ("Refer someone →" →
|
|
232
|
+
/referral; "About us →" → /about).
|
|
233
|
+
- slides 2 `tagline`, 4 `reports-headline` and 7 `services-headline` —
|
|
234
|
+
`align: "center"` + `fill: "viewport"` centre the copy in the middle of
|
|
235
|
+
the snap panel instead of pinning it to the top.
|
|
236
|
+
- slides 5 `special-reports` and 6 `favorites` — `surface:
|
|
237
|
+
"gradient-dark"` is the dark ground `tone: "on-dark"` (#5562, shipped
|
|
238
|
+
for this template) was always meant to sit on.
|
|
239
|
+
- slide 8 `partners` — `phoneColumns: 2` puts the six-tile wall two-up at
|
|
240
|
+
390 instead of overflowing the snap panel one tile at a time. Slide 8 is
|
|
241
|
+
the only slide that renders through `CardGrid`: slide 3's logo strip is
|
|
242
|
+
a reflowing flex row, and `reports-list`'s `list` variant has no grid.
|
|
213
243
|
|
|
214
244
|
\*/}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: SaaS product (Pro) — saas-product
|
|
3
|
+
description: The multi-tenant SaaS template — registered and installable, its visual design still to come.
|
|
4
|
+
colors:
|
|
5
|
+
bg: "#ffffff"
|
|
6
|
+
fg: "#000000"
|
|
7
|
+
surface: "#ffffff"
|
|
8
|
+
surface-secondary: "#ffffff"
|
|
9
|
+
border: "#000000"
|
|
10
|
+
text-muted: "#333333"
|
|
11
|
+
brand: "#000000"
|
|
12
|
+
fg-on-brand: "#ffffff"
|
|
13
|
+
accent: "#000000"
|
|
14
|
+
bg-dark: "#000000"
|
|
15
|
+
fg-dark: "#ffffff"
|
|
16
|
+
border-dark: "#ffffff"
|
|
17
|
+
brand-dark: "#ffffff"
|
|
18
|
+
typography:
|
|
19
|
+
display:
|
|
20
|
+
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
21
|
+
fontSize: "6rem"
|
|
22
|
+
fontWeight: 400
|
|
23
|
+
lineHeight: 1
|
|
24
|
+
letterSpacing: "-0.05em"
|
|
25
|
+
heading-section:
|
|
26
|
+
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
27
|
+
fontSize: "2.25rem"
|
|
28
|
+
fontWeight: 400
|
|
29
|
+
lineHeight: 1.25
|
|
30
|
+
letterSpacing: "-0.05em"
|
|
31
|
+
heading-item:
|
|
32
|
+
fontSize: "1.25rem"
|
|
33
|
+
fontWeight: 600
|
|
34
|
+
lineHeight: 1.375
|
|
35
|
+
body:
|
|
36
|
+
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
37
|
+
fontSize: "1.125rem"
|
|
38
|
+
fontWeight: 400
|
|
39
|
+
lineHeight: 1.5
|
|
40
|
+
eyebrow:
|
|
41
|
+
fontSize: "0.875rem"
|
|
42
|
+
fontWeight: 600
|
|
43
|
+
lineHeight: 1.4
|
|
44
|
+
letterSpacing: "0.05em"
|
|
45
|
+
rounded:
|
|
46
|
+
button: "0.25rem"
|
|
47
|
+
card: "0.75rem"
|
|
48
|
+
spacing:
|
|
49
|
+
section: "4rem"
|
|
50
|
+
card: "1.5rem"
|
|
51
|
+
grid: "1.5rem"
|
|
52
|
+
container: "1280px"
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
<!--
|
|
56
|
+
Source template: saas-product
|
|
57
|
+
Version: create-ailk {{CREATE_AILK_VERSION}}
|
|
58
|
+
Extends: _base — installing this template replaces the base scaffold's
|
|
59
|
+
DESIGN.md with this file. Its tokens are the base foundation's, unchanged:
|
|
60
|
+
this template carries no theme of its own.
|
|
61
|
+
|
|
62
|
+
The tokens above describe what the site RENDERS today. Colours come from
|
|
63
|
+
content/_site.mdx (`theme.colors`); type, radius and spacing are platform
|
|
64
|
+
defaults a site cannot override yet — see "Where this is heading" below.
|
|
65
|
+
-->
|
|
66
|
+
|
|
67
|
+
# SaaS product (Pro)
|
|
68
|
+
|
|
69
|
+
## Overview
|
|
70
|
+
|
|
71
|
+
The multi-tenant SaaS template. It is registered and installs cleanly, but its page compositions and visual design have not been authored yet (tracked in ai-launch-kit-internal#5470). Until they are, it renders on the base foundation unchanged, and this file is its placeholder: replace it when the template's design lands.
|
|
72
|
+
|
|
73
|
+
## Colors
|
|
74
|
+
|
|
75
|
+
### Primary
|
|
76
|
+
|
|
77
|
+
**Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
|
|
78
|
+
|
|
79
|
+
### Neutral
|
|
80
|
+
|
|
81
|
+
Pure white ground (`bg` `#ffffff`), pure black ink for headings (`fg` `#000000`), and near-black `#333333` for body copy — well above AA on white. **Borders are black** (`#000000`): card outlines, the rule under the navigation, the rules between sections and the rule above the footer are all 1px black lines. Cards are white, not tinted (`surface-secondary` is white too). There is no accent colour — `accent` is black.
|
|
82
|
+
|
|
83
|
+
Dark mode inverts: black ground, white ink, white rules, white primary button with black label.
|
|
84
|
+
|
|
85
|
+
### Named Rules
|
|
86
|
+
|
|
87
|
+
- **Rules, not fills.** A container is drawn with a black hairline on the white ground. Grey fills are reserved for image placeholders.
|
|
88
|
+
|
|
89
|
+
## Typography
|
|
90
|
+
|
|
91
|
+
System sans throughout; no web font.
|
|
92
|
+
|
|
93
|
+
### Hierarchy
|
|
94
|
+
|
|
95
|
+
| Role | Size | Weight | Notes |
|
|
96
|
+
| --------------- | -------- | ------ | --------------------------------------------------------------------------- |
|
|
97
|
+
| Hero headline | 6rem | 400 | Tracking -0.05em, line-height 1 |
|
|
98
|
+
| Section heading | 2.25rem | 400 | Tracking -0.05em — light and tight, not bold |
|
|
99
|
+
| Item heading | 1.25rem | 600 | Card, feature and step titles |
|
|
100
|
+
| Body | 1.125rem | 400 | `#333333`, line-height 1.5 |
|
|
101
|
+
| Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
|
|
102
|
+
|
|
103
|
+
Measured from the rendered scaffold (1440px wide), not transcribed from tokens.
|
|
104
|
+
|
|
105
|
+
The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
|
|
106
|
+
|
|
107
|
+
## Layout
|
|
108
|
+
|
|
109
|
+
Not designed yet — its pages come from its modules' defaults on the base layout. See `TEMPLATE-MANIFEST.md` in this directory for the roster. Shared foundation: a 1280px container, sections at 4rem, card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
|
|
110
|
+
|
|
111
|
+
## Shapes
|
|
112
|
+
|
|
113
|
+
Two radii today: buttons at 0.25rem, cards and outlined boxes at 0.75rem. Headed toward square corners — see below.
|
|
114
|
+
|
|
115
|
+
## Components
|
|
116
|
+
|
|
117
|
+
### Buttons
|
|
118
|
+
|
|
119
|
+
Primary: black fill, white label, 0.25rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
|
|
120
|
+
|
|
121
|
+
### Cards / Containers
|
|
122
|
+
|
|
123
|
+
White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding. The one exception today: the "how it works" steps render as dark filled cards (see below).
|
|
124
|
+
|
|
125
|
+
### Navigation
|
|
126
|
+
|
|
127
|
+
Base navigation, unchanged.
|
|
128
|
+
|
|
129
|
+
## Where this is heading
|
|
130
|
+
|
|
131
|
+
The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. Six parts of that direction cannot be expressed through a site's theme today, so they wait on a platform change rather than being hand-coded. Until they land, this file describes the rendered site above, not these targets.
|
|
132
|
+
|
|
133
|
+
| Target | Reference value | Blocked by |
|
|
134
|
+
| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
135
|
+
| Square corners on buttons, cards and inputs | radius 0 | A site's `theme:` block accepts colours only — no radius |
|
|
136
|
+
| Bold, tighter headings | hero ~3.6rem and section headings ~2.9rem, both at weight 700 with tracking about -0.02em (today 6rem and 2.25rem at weight 400) | No per-site type-role override |
|
|
137
|
+
| Generous section pacing | about 10rem between sections, not 4rem | No per-site section-spacing override; `spacious` (6rem) is not author-selectable |
|
|
138
|
+
| Section label in sentence case, bold, no tracking | "Core Features", not "CORE FEATURES" | The eyebrow role bakes in uppercase and tracking |
|
|
139
|
+
| Whitespace between sections, not rules | no rule between bands | Section dividers share the one `border` colour with card outlines, so black outlines make black dividers |
|
|
140
|
+
| Outlined steps in "how it works" | three plain outlined columns | The steps section renders dark filled cards; no outlined variant |
|
|
141
|
+
|
|
142
|
+
## Do's and Don'ts
|
|
143
|
+
|
|
144
|
+
- **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
|
|
145
|
+
- **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
|
|
146
|
+
- **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
|
|
147
|
+
- **Don't** replace a black rule with a shadow or a grey fill.
|
|
148
|
+
- **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Simple service (Pro) — simple-service
|
|
3
|
+
description: A local-service site: three priced services, online booking, checkout, and the policy pages a paying customer expects.
|
|
4
|
+
colors:
|
|
5
|
+
bg: "#ffffff"
|
|
6
|
+
fg: "#000000"
|
|
7
|
+
surface: "#ffffff"
|
|
8
|
+
surface-secondary: "#ffffff"
|
|
9
|
+
border: "#000000"
|
|
10
|
+
text-muted: "#333333"
|
|
11
|
+
brand: "#000000"
|
|
12
|
+
fg-on-brand: "#ffffff"
|
|
13
|
+
accent: "#000000"
|
|
14
|
+
bg-dark: "#000000"
|
|
15
|
+
fg-dark: "#ffffff"
|
|
16
|
+
border-dark: "#ffffff"
|
|
17
|
+
brand-dark: "#ffffff"
|
|
18
|
+
typography:
|
|
19
|
+
display:
|
|
20
|
+
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
21
|
+
fontSize: "6rem"
|
|
22
|
+
fontWeight: 400
|
|
23
|
+
lineHeight: 1
|
|
24
|
+
letterSpacing: "-0.05em"
|
|
25
|
+
heading-section:
|
|
26
|
+
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
27
|
+
fontSize: "2.25rem"
|
|
28
|
+
fontWeight: 400
|
|
29
|
+
lineHeight: 1.25
|
|
30
|
+
letterSpacing: "-0.05em"
|
|
31
|
+
heading-item:
|
|
32
|
+
fontSize: "1.25rem"
|
|
33
|
+
fontWeight: 600
|
|
34
|
+
lineHeight: 1.375
|
|
35
|
+
body:
|
|
36
|
+
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
|
|
37
|
+
fontSize: "1.125rem"
|
|
38
|
+
fontWeight: 400
|
|
39
|
+
lineHeight: 1.5
|
|
40
|
+
eyebrow:
|
|
41
|
+
fontSize: "0.875rem"
|
|
42
|
+
fontWeight: 600
|
|
43
|
+
lineHeight: 1.4
|
|
44
|
+
letterSpacing: "0.05em"
|
|
45
|
+
rounded:
|
|
46
|
+
button: "0.25rem"
|
|
47
|
+
card: "0.75rem"
|
|
48
|
+
spacing:
|
|
49
|
+
section: "4rem"
|
|
50
|
+
card: "1.5rem"
|
|
51
|
+
grid: "1.5rem"
|
|
52
|
+
container: "1280px"
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
<!--
|
|
56
|
+
Source template: simple-service
|
|
57
|
+
Version: create-ailk {{CREATE_AILK_VERSION}}
|
|
58
|
+
Extends: _base — installing this template replaces the base scaffold's
|
|
59
|
+
DESIGN.md with this file. Its tokens are the base foundation's, unchanged:
|
|
60
|
+
this template carries no theme of its own.
|
|
61
|
+
|
|
62
|
+
The tokens above describe what the site RENDERS today. Colours come from
|
|
63
|
+
content/_site.mdx (`theme.colors`); type, radius and spacing are platform
|
|
64
|
+
defaults a site cannot override yet — see "Where this is heading" below.
|
|
65
|
+
-->
|
|
66
|
+
|
|
67
|
+
# Simple service (Pro)
|
|
68
|
+
|
|
69
|
+
## Overview
|
|
70
|
+
|
|
71
|
+
A template for a local service business — the reference shape is a lawn-care company. Three priced services, a booking page, a checkout return pair, a customer account, and the returns, cancellation and shipping policies. It runs on the base foundation; the design job is trust and clarity, so nothing competes with the price and the book button.
|
|
72
|
+
|
|
73
|
+
## Colors
|
|
74
|
+
|
|
75
|
+
### Primary
|
|
76
|
+
|
|
77
|
+
**Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
|
|
78
|
+
|
|
79
|
+
### Neutral
|
|
80
|
+
|
|
81
|
+
Pure white ground (`bg` `#ffffff`), pure black ink for headings (`fg` `#000000`), and near-black `#333333` for body copy — well above AA on white. **Borders are black** (`#000000`): card outlines, the rule under the navigation, the rules between sections and the rule above the footer are all 1px black lines. Cards are white, not tinted (`surface-secondary` is white too). There is no accent colour — `accent` is black.
|
|
82
|
+
|
|
83
|
+
Dark mode inverts: black ground, white ink, white rules, white primary button with black label.
|
|
84
|
+
|
|
85
|
+
### Named Rules
|
|
86
|
+
|
|
87
|
+
- **Rules, not fills.** A container is drawn with a black hairline on the white ground. Grey fills are reserved for image placeholders.
|
|
88
|
+
|
|
89
|
+
## Typography
|
|
90
|
+
|
|
91
|
+
System sans throughout; no web font.
|
|
92
|
+
|
|
93
|
+
### Hierarchy
|
|
94
|
+
|
|
95
|
+
| Role | Size | Weight | Notes |
|
|
96
|
+
| --------------- | -------- | ------ | --------------------------------------------------------------------------- |
|
|
97
|
+
| Hero headline | 6rem | 400 | Tracking -0.05em, line-height 1 |
|
|
98
|
+
| Section heading | 2.25rem | 400 | Tracking -0.05em — light and tight, not bold |
|
|
99
|
+
| Item heading | 1.25rem | 600 | Card, feature and step titles |
|
|
100
|
+
| Body | 1.125rem | 400 | `#333333`, line-height 1.5 |
|
|
101
|
+
| Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
|
|
102
|
+
|
|
103
|
+
Measured from the rendered scaffold (1440px wide), not transcribed from tokens.
|
|
104
|
+
|
|
105
|
+
The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
|
|
106
|
+
|
|
107
|
+
## Layout
|
|
108
|
+
|
|
109
|
+
Full navigation with the announcement banner; a multi-column footer; the default home. Every page and its sections are listed in `TEMPLATE-MANIFEST.md` in this directory. Shared foundation: a 1280px container, sections at 4rem, card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
|
|
110
|
+
|
|
111
|
+
## Shapes
|
|
112
|
+
|
|
113
|
+
Two radii today: buttons at 0.25rem, cards and outlined boxes at 0.75rem. Headed toward square corners — see below.
|
|
114
|
+
|
|
115
|
+
## Components
|
|
116
|
+
|
|
117
|
+
### Buttons
|
|
118
|
+
|
|
119
|
+
Primary: black fill, white label, 0.25rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
|
|
120
|
+
|
|
121
|
+
### Cards / Containers
|
|
122
|
+
|
|
123
|
+
White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding. The one exception today: the "how it works" steps render as dark filled cards (see below).
|
|
124
|
+
|
|
125
|
+
### Navigation
|
|
126
|
+
|
|
127
|
+
Full navigation: wordmark left, page links, an outlined and a filled button at the far right, the announcement banner above. A black hairline separates it from the page.
|
|
128
|
+
|
|
129
|
+
## Where this is heading
|
|
130
|
+
|
|
131
|
+
The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. Six parts of that direction cannot be expressed through a site's theme today, so they wait on a platform change rather than being hand-coded. Until they land, this file describes the rendered site above, not these targets.
|
|
132
|
+
|
|
133
|
+
| Target | Reference value | Blocked by |
|
|
134
|
+
| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
135
|
+
| Square corners on buttons, cards and inputs | radius 0 | A site's `theme:` block accepts colours only — no radius |
|
|
136
|
+
| Bold, tighter headings | hero ~3.6rem and section headings ~2.9rem, both at weight 700 with tracking about -0.02em (today 6rem and 2.25rem at weight 400) | No per-site type-role override |
|
|
137
|
+
| Generous section pacing | about 10rem between sections, not 4rem | No per-site section-spacing override; `spacious` (6rem) is not author-selectable |
|
|
138
|
+
| Section label in sentence case, bold, no tracking | "Core Features", not "CORE FEATURES" | The eyebrow role bakes in uppercase and tracking |
|
|
139
|
+
| Whitespace between sections, not rules | no rule between bands | Section dividers share the one `border` colour with card outlines, so black outlines make black dividers |
|
|
140
|
+
| Outlined steps in "how it works" | three plain outlined columns | The steps section renders dark filled cards; no outlined variant |
|
|
141
|
+
|
|
142
|
+
## Do's and Don'ts
|
|
143
|
+
|
|
144
|
+
- **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
|
|
145
|
+
- **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
|
|
146
|
+
- **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
|
|
147
|
+
- **Don't** replace a black rule with a shadow or a grey fill.
|
|
148
|
+
- **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
{
|
|
2
|
+
"template": "simple-service",
|
|
3
|
+
"requires": ["marketing", "scheduling", "commerce"],
|
|
4
|
+
"categories": ["landscaping"],
|
|
5
|
+
"generatedHash": "f0dce515363186cee7ec9d1b1fd91d0ca11e039db31e843d1235d451dd49e736",
|
|
6
|
+
"layout": {
|
|
7
|
+
"nav": "full",
|
|
8
|
+
"footer": "columns",
|
|
9
|
+
"announcementBanner": true,
|
|
10
|
+
"home": "default"
|
|
11
|
+
},
|
|
12
|
+
"rows": [
|
|
13
|
+
{
|
|
14
|
+
"route": "/",
|
|
15
|
+
"pageType": "HomePage",
|
|
16
|
+
"schema": "HomePage",
|
|
17
|
+
"shell": "MarketingShell",
|
|
18
|
+
"chrome": "on",
|
|
19
|
+
"sections": [
|
|
20
|
+
{
|
|
21
|
+
"type": "hero",
|
|
22
|
+
"component": "Hero"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "items",
|
|
26
|
+
"component": "Items"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"type": "cta",
|
|
30
|
+
"component": "CTA"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"route": "/services",
|
|
36
|
+
"pageType": "ServicesList",
|
|
37
|
+
"schema": "ServicesList",
|
|
38
|
+
"shell": "MarketingShell",
|
|
39
|
+
"chrome": "on",
|
|
40
|
+
"sections": [
|
|
41
|
+
{
|
|
42
|
+
"type": "hero",
|
|
43
|
+
"component": "Hero"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"type": "items",
|
|
47
|
+
"component": "Items"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"type": "cta",
|
|
51
|
+
"component": "CTA"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"route": "/services/[slug]",
|
|
57
|
+
"pageType": null,
|
|
58
|
+
"schema": null,
|
|
59
|
+
"shell": "MarketingShell",
|
|
60
|
+
"chrome": "on",
|
|
61
|
+
"sections": []
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"route": "/about",
|
|
65
|
+
"pageType": "AboutPage",
|
|
66
|
+
"schema": "AboutPage",
|
|
67
|
+
"shell": "MarketingShell",
|
|
68
|
+
"chrome": "on",
|
|
69
|
+
"sections": [
|
|
70
|
+
{
|
|
71
|
+
"type": "content-block",
|
|
72
|
+
"component": "ContentBlock"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"type": "cta",
|
|
76
|
+
"component": "CTA"
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"route": "/contact",
|
|
82
|
+
"pageType": "ContactPage",
|
|
83
|
+
"schema": "ContactPage",
|
|
84
|
+
"shell": "MarketingShell",
|
|
85
|
+
"chrome": "on",
|
|
86
|
+
"sections": [
|
|
87
|
+
{
|
|
88
|
+
"type": "hero",
|
|
89
|
+
"component": "Hero"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"type": "contact-form",
|
|
93
|
+
"component": "ContactForm"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"type": "cta",
|
|
97
|
+
"component": "CTA"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"route": "/faq",
|
|
103
|
+
"pageType": "FAQPage",
|
|
104
|
+
"schema": "FAQPage",
|
|
105
|
+
"shell": "MarketingShell",
|
|
106
|
+
"chrome": "on",
|
|
107
|
+
"sections": [
|
|
108
|
+
{
|
|
109
|
+
"type": "faq",
|
|
110
|
+
"component": "FAQ"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"type": "cta",
|
|
114
|
+
"component": "CTA"
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"route": "/returns",
|
|
120
|
+
"pageType": "ReturnsPolicyPage",
|
|
121
|
+
"schema": "ReturnsPolicyPage",
|
|
122
|
+
"shell": "MarketingShell",
|
|
123
|
+
"chrome": "on",
|
|
124
|
+
"sections": [
|
|
125
|
+
{
|
|
126
|
+
"type": "document-chassis",
|
|
127
|
+
"component": "DocumentChassis"
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"route": "/cancellation",
|
|
133
|
+
"pageType": "CancellationPolicyPage",
|
|
134
|
+
"schema": "CancellationPolicyPage",
|
|
135
|
+
"shell": "MarketingShell",
|
|
136
|
+
"chrome": "on",
|
|
137
|
+
"sections": [
|
|
138
|
+
{
|
|
139
|
+
"type": "document-chassis",
|
|
140
|
+
"component": "DocumentChassis"
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"route": "/shipping",
|
|
146
|
+
"pageType": "ShippingPolicyPage",
|
|
147
|
+
"schema": "ShippingPolicyPage",
|
|
148
|
+
"shell": "MarketingShell",
|
|
149
|
+
"chrome": "on",
|
|
150
|
+
"sections": [
|
|
151
|
+
{
|
|
152
|
+
"type": "document-chassis",
|
|
153
|
+
"component": "DocumentChassis"
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"route": "/privacy",
|
|
159
|
+
"pageType": "PrivacyPage",
|
|
160
|
+
"schema": "PrivacyPage",
|
|
161
|
+
"shell": "MarketingShell",
|
|
162
|
+
"chrome": "on",
|
|
163
|
+
"sections": [
|
|
164
|
+
{
|
|
165
|
+
"type": "document-chassis",
|
|
166
|
+
"component": "DocumentChassis"
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"route": "/terms",
|
|
172
|
+
"pageType": "TermsPage",
|
|
173
|
+
"schema": "TermsPage",
|
|
174
|
+
"shell": "MarketingShell",
|
|
175
|
+
"chrome": "on",
|
|
176
|
+
"sections": [
|
|
177
|
+
{
|
|
178
|
+
"type": "document-chassis",
|
|
179
|
+
"component": "DocumentChassis"
|
|
180
|
+
}
|
|
181
|
+
]
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"route": "/account",
|
|
185
|
+
"pageType": null,
|
|
186
|
+
"schema": null,
|
|
187
|
+
"shell": "MarketingShell",
|
|
188
|
+
"chrome": "on",
|
|
189
|
+
"sections": []
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"route": "/purchase/success",
|
|
193
|
+
"pageType": null,
|
|
194
|
+
"schema": null,
|
|
195
|
+
"shell": "MarketingShell",
|
|
196
|
+
"chrome": "on",
|
|
197
|
+
"sections": []
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"route": "/purchase/cancel",
|
|
201
|
+
"pageType": null,
|
|
202
|
+
"schema": null,
|
|
203
|
+
"shell": "MarketingShell",
|
|
204
|
+
"chrome": "on",
|
|
205
|
+
"sections": []
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"route": "/meet",
|
|
209
|
+
"pageType": null,
|
|
210
|
+
"schema": null,
|
|
211
|
+
"shell": "MarketingShell",
|
|
212
|
+
"chrome": "on",
|
|
213
|
+
"sections": []
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"route": "/meet/[slug]",
|
|
217
|
+
"pageType": null,
|
|
218
|
+
"schema": null,
|
|
219
|
+
"shell": "MarketingShell",
|
|
220
|
+
"chrome": "on",
|
|
221
|
+
"sections": []
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"route": "/meet/confirmed",
|
|
225
|
+
"pageType": null,
|
|
226
|
+
"schema": null,
|
|
227
|
+
"shell": "MarketingShell",
|
|
228
|
+
"chrome": "on",
|
|
229
|
+
"sections": []
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"route": "/appointments",
|
|
233
|
+
"pageType": null,
|
|
234
|
+
"schema": null,
|
|
235
|
+
"shell": "MarketingShell",
|
|
236
|
+
"chrome": "on",
|
|
237
|
+
"sections": []
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
}
|