@wildo-ai/saas-website 1.1.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/LICENSE +34 -0
- package/dist/esm/.builder.pid +9 -0
- package/dist/esm/astro/blog-post-bridge.d.ts +324 -0
- package/dist/esm/astro/blog-post-bridge.d.ts.map +1 -0
- package/dist/esm/astro/blog-post-bridge.js +57 -0
- package/dist/esm/astro/blog-post-bridge.js.map +1 -0
- package/dist/esm/astro/blog-post-head.renderer.d.ts +129 -0
- package/dist/esm/astro/blog-post-head.renderer.d.ts.map +1 -0
- package/dist/esm/astro/blog-post-head.renderer.js +139 -0
- package/dist/esm/astro/blog-post-head.renderer.js.map +1 -0
- package/dist/esm/astro/bridge-runtime.d.ts +224 -0
- package/dist/esm/astro/bridge-runtime.d.ts.map +1 -0
- package/dist/esm/astro/bridge-runtime.js +30 -0
- package/dist/esm/astro/bridge-runtime.js.map +1 -0
- package/dist/esm/astro/collect-expected-label-keys.d.ts +65 -0
- package/dist/esm/astro/collect-expected-label-keys.d.ts.map +1 -0
- package/dist/esm/astro/collect-expected-label-keys.js +101 -0
- package/dist/esm/astro/collect-expected-label-keys.js.map +1 -0
- package/dist/esm/astro/headers-renderer.d.ts +32 -0
- package/dist/esm/astro/headers-renderer.d.ts.map +1 -0
- package/dist/esm/astro/headers-renderer.js +64 -0
- package/dist/esm/astro/headers-renderer.js.map +1 -0
- package/dist/esm/astro/i18n-routing.helper.d.ts +91 -0
- package/dist/esm/astro/i18n-routing.helper.d.ts.map +1 -0
- package/dist/esm/astro/i18n-routing.helper.js +23 -0
- package/dist/esm/astro/i18n-routing.helper.js.map +1 -0
- package/dist/esm/astro/internal/html-escape.d.ts +31 -0
- package/dist/esm/astro/internal/html-escape.d.ts.map +1 -0
- package/dist/esm/astro/internal/html-escape.js +40 -0
- package/dist/esm/astro/internal/html-escape.js.map +1 -0
- package/dist/esm/astro/label-pack-loader.d.ts +134 -0
- package/dist/esm/astro/label-pack-loader.d.ts.map +1 -0
- package/dist/esm/astro/label-pack-loader.js +298 -0
- package/dist/esm/astro/label-pack-loader.js.map +1 -0
- package/dist/esm/astro/llms-txt-server.d.ts +28 -0
- package/dist/esm/astro/llms-txt-server.d.ts.map +1 -0
- package/dist/esm/astro/llms-txt-server.js +33 -0
- package/dist/esm/astro/llms-txt-server.js.map +1 -0
- package/dist/esm/astro/pick-labels-for-page.d.ts +63 -0
- package/dist/esm/astro/pick-labels-for-page.d.ts.map +1 -0
- package/dist/esm/astro/pick-labels-for-page.js +73 -0
- package/dist/esm/astro/pick-labels-for-page.js.map +1 -0
- package/dist/esm/astro/robots-renderer.d.ts +85 -0
- package/dist/esm/astro/robots-renderer.d.ts.map +1 -0
- package/dist/esm/astro/robots-renderer.js +157 -0
- package/dist/esm/astro/robots-renderer.js.map +1 -0
- package/dist/esm/astro/sitemap-coverage.d.ts +101 -0
- package/dist/esm/astro/sitemap-coverage.d.ts.map +1 -0
- package/dist/esm/astro/sitemap-coverage.js +67 -0
- package/dist/esm/astro/sitemap-coverage.js.map +1 -0
- package/dist/esm/astro/structured-data.renderer.d.ts +21 -0
- package/dist/esm/astro/structured-data.renderer.d.ts.map +1 -0
- package/dist/esm/astro/structured-data.renderer.js +142 -0
- package/dist/esm/astro/structured-data.renderer.js.map +1 -0
- package/dist/esm/astro/website-page-head.renderer.d.ts +93 -0
- package/dist/esm/astro/website-page-head.renderer.d.ts.map +1 -0
- package/dist/esm/astro/website-page-head.renderer.js +184 -0
- package/dist/esm/astro/website-page-head.renderer.js.map +1 -0
- package/dist/esm/astro/website-page-runtime.helper.d.ts +112 -0
- package/dist/esm/astro/website-page-runtime.helper.d.ts.map +1 -0
- package/dist/esm/astro/website-page-runtime.helper.js +60 -0
- package/dist/esm/astro/website-page-runtime.helper.js.map +1 -0
- package/dist/esm/astro/website-site-context.d.ts +126 -0
- package/dist/esm/astro/website-site-context.d.ts.map +1 -0
- package/dist/esm/astro/website-site-context.js +37 -0
- package/dist/esm/astro/website-site-context.js.map +1 -0
- package/dist/esm/astro-island.d.ts +56 -0
- package/dist/esm/astro-island.d.ts.map +1 -0
- package/dist/esm/astro-island.js +61 -0
- package/dist/esm/astro-island.js.map +1 -0
- package/dist/esm/astro.d.ts +151 -0
- package/dist/esm/astro.d.ts.map +1 -0
- package/dist/esm/astro.js +151 -0
- package/dist/esm/astro.js.map +1 -0
- package/dist/esm/companion-exports.d.ts +38 -0
- package/dist/esm/companion-exports.d.ts.map +1 -0
- package/dist/esm/companion-exports.js +38 -0
- package/dist/esm/companion-exports.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteButton.d.ts +73 -0
- package/dist/esm/components/low-level/WebsiteButton.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteButton.js +68 -0
- package/dist/esm/components/low-level/WebsiteButton.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteHeading.d.ts +78 -0
- package/dist/esm/components/low-level/WebsiteHeading.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteHeading.js +41 -0
- package/dist/esm/components/low-level/WebsiteHeading.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteImage.d.ts +73 -0
- package/dist/esm/components/low-level/WebsiteImage.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteImage.js +21 -0
- package/dist/esm/components/low-level/WebsiteImage.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.d.ts +90 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.js +47 -0
- package/dist/esm/components/low-level/WebsiteInternalButton.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.d.ts +99 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.js +68 -0
- package/dist/esm/components/low-level/WebsiteInternalLink.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteLink.d.ts +50 -0
- package/dist/esm/components/low-level/WebsiteLink.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteLink.js +22 -0
- package/dist/esm/components/low-level/WebsiteLink.js.map +1 -0
- package/dist/esm/components/low-level/WebsiteText.d.ts +57 -0
- package/dist/esm/components/low-level/WebsiteText.d.ts.map +1 -0
- package/dist/esm/components/low-level/WebsiteText.js +57 -0
- package/dist/esm/components/low-level/WebsiteText.js.map +1 -0
- package/dist/esm/config/define-website-config.d.ts +83 -0
- package/dist/esm/config/define-website-config.d.ts.map +1 -0
- package/dist/esm/config/define-website-config.js +126 -0
- package/dist/esm/config/define-website-config.js.map +1 -0
- package/dist/esm/config/index.d.ts +38 -0
- package/dist/esm/config/index.d.ts.map +1 -0
- package/dist/esm/config/index.js +38 -0
- package/dist/esm/config/index.js.map +1 -0
- package/dist/esm/config/load-website-config.d.ts +136 -0
- package/dist/esm/config/load-website-config.d.ts.map +1 -0
- package/dist/esm/config/load-website-config.js +177 -0
- package/dist/esm/config/load-website-config.js.map +1 -0
- package/dist/esm/config/wildo-website-config.schemas.d.ts +251 -0
- package/dist/esm/config/wildo-website-config.schemas.d.ts.map +1 -0
- package/dist/esm/config/wildo-website-config.schemas.js +302 -0
- package/dist/esm/config/wildo-website-config.schemas.js.map +1 -0
- package/dist/esm/config-loader.d.ts +35 -0
- package/dist/esm/config-loader.d.ts.map +1 -0
- package/dist/esm/config-loader.js +35 -0
- package/dist/esm/config-loader.js.map +1 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.d.ts +38 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.d.ts.map +1 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.js +77 -0
- package/dist/esm/core/anonymous-session/InboundContactForm.js.map +1 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.d.ts +41 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.d.ts.map +1 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.js +58 -0
- package/dist/esm/core/anonymous-session/inbound-contact-form.schema.js.map +1 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.d.ts +81 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.d.ts.map +1 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.js +177 -0
- package/dist/esm/core/anonymous-session/website-anonymous-session-client.js.map +1 -0
- package/dist/esm/core/contexts/WebsitePageContext.d.ts +40 -0
- package/dist/esm/core/contexts/WebsitePageContext.d.ts.map +1 -0
- package/dist/esm/core/contexts/WebsitePageContext.js +8 -0
- package/dist/esm/core/contexts/WebsitePageContext.js.map +1 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.d.ts +162 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.d.ts.map +1 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.js +22 -0
- package/dist/esm/core/contexts/WebsiteRuntimeContext.js.map +1 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.d.ts +47 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.d.ts.map +1 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.js +8 -0
- package/dist/esm/core/contexts/WebsiteSectionContext.js.map +1 -0
- package/dist/esm/core/contexts/useWebsitePage.d.ts +13 -0
- package/dist/esm/core/contexts/useWebsitePage.d.ts.map +1 -0
- package/dist/esm/core/contexts/useWebsitePage.js +22 -0
- package/dist/esm/core/contexts/useWebsitePage.js.map +1 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.d.ts +19 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.d.ts.map +1 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.js +28 -0
- package/dist/esm/core/contexts/useWebsiteRuntime.js.map +1 -0
- package/dist/esm/core/contexts/useWebsiteSection.d.ts +12 -0
- package/dist/esm/core/contexts/useWebsiteSection.d.ts.map +1 -0
- package/dist/esm/core/contexts/useWebsiteSection.js +22 -0
- package/dist/esm/core/contexts/useWebsiteSection.js.map +1 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.d.ts +17 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.d.ts.map +1 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.js +23 -0
- package/dist/esm/core/external-providers/frontend-provider-registry.website.js.map +1 -0
- package/dist/esm/core/factories/define-website-page-manifest.d.ts +70 -0
- package/dist/esm/core/factories/define-website-page-manifest.d.ts.map +1 -0
- package/dist/esm/core/factories/define-website-page-manifest.js +51 -0
- package/dist/esm/core/factories/define-website-page-manifest.js.map +1 -0
- package/dist/esm/core/factories/define-website-section.d.ts +101 -0
- package/dist/esm/core/factories/define-website-section.d.ts.map +1 -0
- package/dist/esm/core/factories/define-website-section.js +71 -0
- package/dist/esm/core/factories/define-website-section.js.map +1 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.d.ts +23 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.d.ts.map +1 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.js +25 -0
- package/dist/esm/core/hooks/useWebsiteDesignTokens.js.map +1 -0
- package/dist/esm/core/hooks/useWebsiteLabel.d.ts +68 -0
- package/dist/esm/core/hooks/useWebsiteLabel.d.ts.map +1 -0
- package/dist/esm/core/hooks/useWebsiteLabel.js +103 -0
- package/dist/esm/core/hooks/useWebsiteLabel.js.map +1 -0
- package/dist/esm/core/layouts/WebsitePageLayout.d.ts +87 -0
- package/dist/esm/core/layouts/WebsitePageLayout.d.ts.map +1 -0
- package/dist/esm/core/layouts/WebsitePageLayout.js +170 -0
- package/dist/esm/core/layouts/WebsitePageLayout.js.map +1 -0
- package/dist/esm/core/layouts/WebsiteSection.d.ts +91 -0
- package/dist/esm/core/layouts/WebsiteSection.d.ts.map +1 -0
- package/dist/esm/core/layouts/WebsiteSection.js +26 -0
- package/dist/esm/core/layouts/WebsiteSection.js.map +1 -0
- package/dist/esm/core/routing/internal-routing.utils.d.ts +65 -0
- package/dist/esm/core/routing/internal-routing.utils.d.ts.map +1 -0
- package/dist/esm/core/routing/internal-routing.utils.js +14 -0
- package/dist/esm/core/routing/internal-routing.utils.js.map +1 -0
- package/dist/esm/index.d.ts +129 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +129 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/mdx/BlogPost.d.ts +193 -0
- package/dist/esm/mdx/BlogPost.d.ts.map +1 -0
- package/dist/esm/mdx/BlogPost.js +161 -0
- package/dist/esm/mdx/BlogPost.js.map +1 -0
- package/dist/esm/mdx/blog-post-collection.config.d.ts +139 -0
- package/dist/esm/mdx/blog-post-collection.config.d.ts.map +1 -0
- package/dist/esm/mdx/blog-post-collection.config.js +27 -0
- package/dist/esm/mdx/blog-post-collection.config.js.map +1 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.d.ts +12 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.d.ts.map +1 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.js +13 -0
- package/dist/esm/mdx/blog-post-frontmatter-source.js.map +1 -0
- package/dist/esm/mdx/index.d.ts +22 -0
- package/dist/esm/mdx/index.d.ts.map +1 -0
- package/dist/esm/mdx/index.js +22 -0
- package/dist/esm/mdx/index.js.map +1 -0
- package/dist/esm/mdx/website-mdx-provider.d.ts +90 -0
- package/dist/esm/mdx/website-mdx-provider.d.ts.map +1 -0
- package/dist/esm/mdx/website-mdx-provider.js +8 -0
- package/dist/esm/mdx/website-mdx-provider.js.map +1 -0
- package/dist/esm/mdx.d.ts +38 -0
- package/dist/esm/mdx.d.ts.map +1 -0
- package/dist/esm/mdx.js +38 -0
- package/dist/esm/mdx.js.map +1 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.d.ts +75 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.js +85 -0
- package/dist/esm/schemas/blog/blog-post-frontmatter.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.d.ts +120 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.js +152 -0
- package/dist/esm/schemas/design-tokens/website-design-tokens.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.d.ts +73 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.js +76 -0
- package/dist/esm/schemas/label-keys/website-label-key.schemas.js.map +1 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.d.ts +209 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.js +218 -0
- package/dist/esm/schemas/manifests/website-page-manifest.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.d.ts +431 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.js +438 -0
- package/dist/esm/schemas/manifests/website-root-config.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/refs/page-ref.schemas.d.ts +40 -0
- package/dist/esm/schemas/refs/page-ref.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/refs/page-ref.schemas.js +43 -0
- package/dist/esm/schemas/refs/page-ref.schemas.js.map +1 -0
- package/dist/esm/schemas/refs/section-ref.schemas.d.ts +41 -0
- package/dist/esm/schemas/refs/section-ref.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/refs/section-ref.schemas.js +44 -0
- package/dist/esm/schemas/refs/section-ref.schemas.js.map +1 -0
- package/dist/esm/schemas/sections/website-section-category.shared.d.ts +63 -0
- package/dist/esm/schemas/sections/website-section-category.shared.d.ts.map +1 -0
- package/dist/esm/schemas/sections/website-section-category.shared.js +64 -0
- package/dist/esm/schemas/sections/website-section-category.shared.js.map +1 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.d.ts +114 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.js +69 -0
- package/dist/esm/schemas/sections/website-section-definition.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.d.ts +100 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.d.ts.map +1 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.js +355 -0
- package/dist/esm/schemas/structured-data/structured-data-reconciliation.shared.js.map +1 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.d.ts +58 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.js +2 -0
- package/dist/esm/schemas/structured-data/website-structured-data.shared.schemas.js.map +1 -0
- package/dist/esm/schemas/validators/label-pack.validator.d.ts +144 -0
- package/dist/esm/schemas/validators/label-pack.validator.d.ts.map +1 -0
- package/dist/esm/schemas/validators/label-pack.validator.js +100 -0
- package/dist/esm/schemas/validators/label-pack.validator.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +143 -0
- package/src/__tests__/bundle-isolation.test.ts +607 -0
- package/src/astro/__tests__/blog-post-bridge.test.tsx +288 -0
- package/src/astro/__tests__/blog-post-head.renderer.test.ts +249 -0
- package/src/astro/__tests__/bridge-runtime.test.tsx +198 -0
- package/src/astro/__tests__/collect-expected-label-keys.test.ts +69 -0
- package/src/astro/__tests__/headers-renderer.test.ts +143 -0
- package/src/astro/__tests__/i18n-routing.helper.test.ts +116 -0
- package/src/astro/__tests__/label-pack-loader.test.ts +305 -0
- package/src/astro/__tests__/llms-txt-server.test.ts +127 -0
- package/src/astro/__tests__/pick-labels-for-page.test.ts +60 -0
- package/src/astro/__tests__/robots-renderer.test.ts +228 -0
- package/src/astro/__tests__/sitemap-coverage.test.ts +230 -0
- package/src/astro/__tests__/structured-data.renderer.test.ts +172 -0
- package/src/astro/__tests__/website-page-head.renderer.test.ts +424 -0
- package/src/astro/__tests__/website-page-runtime.helper.test.ts +157 -0
- package/src/astro/__tests__/website-site-context.test.ts +121 -0
- package/src/astro/blog-post-bridge.tsx +404 -0
- package/src/astro/blog-post-head.renderer.ts +293 -0
- package/src/astro/bridge-runtime.tsx +270 -0
- package/src/astro/collect-expected-label-keys.ts +113 -0
- package/src/astro/headers-renderer.ts +82 -0
- package/src/astro/i18n-routing.helper.ts +116 -0
- package/src/astro/internal/html-escape.ts +41 -0
- package/src/astro/label-pack-loader.ts +385 -0
- package/src/astro/llms-txt-server.ts +56 -0
- package/src/astro/pick-labels-for-page.ts +85 -0
- package/src/astro/robots-renderer.ts +171 -0
- package/src/astro/sitemap-coverage.ts +186 -0
- package/src/astro/structured-data.renderer.ts +171 -0
- package/src/astro/website-page-head.renderer.ts +279 -0
- package/src/astro/website-page-runtime.helper.ts +188 -0
- package/src/astro/website-site-context.ts +136 -0
- package/src/astro-island.ts +61 -0
- package/src/astro.ts +151 -0
- package/src/companion-exports.ts +38 -0
- package/src/components/low-level/WebsiteButton.tsx +118 -0
- package/src/components/low-level/WebsiteHeading.tsx +96 -0
- package/src/components/low-level/WebsiteImage.tsx +96 -0
- package/src/components/low-level/WebsiteInternalButton.tsx +172 -0
- package/src/components/low-level/WebsiteInternalLink.tsx +193 -0
- package/src/components/low-level/WebsiteLink.tsx +71 -0
- package/src/components/low-level/WebsiteText.tsx +75 -0
- package/src/components/low-level/__tests__/WebsiteInternalButton.test.tsx +169 -0
- package/src/components/low-level/__tests__/WebsiteInternalLink.test.tsx +202 -0
- package/src/components/low-level/__tests__/primitives.test.tsx +141 -0
- package/src/config/__tests__/define-website-config.test.ts +231 -0
- package/src/config/__tests__/load-website-config.test.ts +215 -0
- package/src/config/define-website-config.ts +134 -0
- package/src/config/index.ts +38 -0
- package/src/config/load-website-config.ts +229 -0
- package/src/config/wildo-website-config.schemas.ts +322 -0
- package/src/config-loader.ts +35 -0
- package/src/core/__tests__/WebsitePageLayout.test.tsx +184 -0
- package/src/core/__tests__/WebsiteSection.test.tsx +85 -0
- package/src/core/__tests__/contexts.test.tsx +133 -0
- package/src/core/__tests__/core-boundary.test.ts +85 -0
- package/src/core/__tests__/define-website-page-manifest.test.tsx +111 -0
- package/src/core/__tests__/define-website-section.test.tsx +89 -0
- package/src/core/__tests__/useWebsiteDesignTokens.test.tsx +41 -0
- package/src/core/__tests__/useWebsiteLabel.test.tsx +117 -0
- package/src/core/anonymous-session/InboundContactForm.tsx +157 -0
- package/src/core/anonymous-session/__tests__/inbound-contact-form.schema.test.ts +44 -0
- package/src/core/anonymous-session/inbound-contact-form.schema.ts +62 -0
- package/src/core/anonymous-session/website-anonymous-session-client.ts +194 -0
- package/src/core/contexts/WebsitePageContext.tsx +52 -0
- package/src/core/contexts/WebsiteRuntimeContext.tsx +175 -0
- package/src/core/contexts/WebsiteSectionContext.tsx +59 -0
- package/src/core/contexts/useWebsitePage.ts +28 -0
- package/src/core/contexts/useWebsiteRuntime.ts +34 -0
- package/src/core/contexts/useWebsiteSection.ts +28 -0
- package/src/core/external-providers/frontend-provider-registry.website.ts +62 -0
- package/src/core/factories/define-website-page-manifest.ts +102 -0
- package/src/core/factories/define-website-section.ts +128 -0
- package/src/core/hooks/useWebsiteDesignTokens.ts +26 -0
- package/src/core/hooks/useWebsiteLabel.ts +121 -0
- package/src/core/layouts/WebsitePageLayout.tsx +311 -0
- package/src/core/layouts/WebsiteSection.tsx +139 -0
- package/src/core/routing/__tests__/internal-routing.utils.test.ts +134 -0
- package/src/core/routing/internal-routing.utils.ts +77 -0
- package/src/index.ts +132 -0
- package/src/mdx/BlogPost.tsx +296 -0
- package/src/mdx/__tests__/BlogPost.test.tsx +218 -0
- package/src/mdx/__tests__/blog-post-collection.config.test.ts +127 -0
- package/src/mdx/__tests__/website-mdx-provider.test.tsx +82 -0
- package/src/mdx/blog-post-collection.config.ts +177 -0
- package/src/mdx/blog-post-frontmatter-source.ts +31 -0
- package/src/mdx/index.ts +39 -0
- package/src/mdx/website-mdx-provider.tsx +95 -0
- package/src/mdx.ts +38 -0
- package/src/schemas/__tests__/blog-frontmatter.test.ts +50 -0
- package/src/schemas/__tests__/companion-exports-react-free.test.ts +51 -0
- package/src/schemas/__tests__/design-tokens.test.ts +163 -0
- package/src/schemas/__tests__/label-key.test.ts +46 -0
- package/src/schemas/__tests__/label-pack-validator.test.ts +146 -0
- package/src/schemas/__tests__/page-manifest.test.ts +66 -0
- package/src/schemas/__tests__/refs.test.ts +37 -0
- package/src/schemas/__tests__/root-config.test.ts +292 -0
- package/src/schemas/__tests__/section-definition.test.ts +47 -0
- package/src/schemas/__tests__/structured-data-reconciliation.test.ts +543 -0
- package/src/schemas/blog/blog-post-frontmatter.shared.schemas.ts +111 -0
- package/src/schemas/design-tokens/website-design-tokens.shared.schemas.ts +166 -0
- package/src/schemas/label-keys/website-label-key.schemas.ts +88 -0
- package/src/schemas/manifests/website-page-manifest.shared.schemas.ts +266 -0
- package/src/schemas/manifests/website-root-config.shared.schemas.ts +504 -0
- package/src/schemas/refs/page-ref.schemas.ts +49 -0
- package/src/schemas/refs/section-ref.schemas.ts +50 -0
- package/src/schemas/sections/website-section-category.shared.ts +65 -0
- package/src/schemas/sections/website-section-definition.shared.schemas.ts +120 -0
- package/src/schemas/structured-data/structured-data-reconciliation.shared.ts +579 -0
- package/src/schemas/structured-data/website-structured-data.shared.schemas.ts +62 -0
- package/src/schemas/validators/label-pack.validator.ts +201 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { type WebsitePageManifest } from './website-page-manifest.shared.schemas';
|
|
4
|
+
/**
|
|
5
|
+
* @wildo_source:part:start saas.website.seo.sitemap-config facet:layer:shared facet:family:website
|
|
6
|
+
*
|
|
7
|
+
* `WebsiteSitemapConfig` — site-wide sitemap policy block.
|
|
8
|
+
*
|
|
9
|
+
* Materialized at build time by `@astrojs/sitemap` (the official
|
|
10
|
+
* Astro plugin) when the consumer wires it into `astro.config.ts`
|
|
11
|
+
* (see `website-seo-aeo-geo` SKILL). The framework owns the
|
|
12
|
+
* **schema** (so config + enforcement live in lock-step with the
|
|
13
|
+
* page registry) but the framework does NOT own the runtime
|
|
14
|
+
* generator — `@astrojs/sitemap` already covers per-page
|
|
15
|
+
* `lastmod` / `changefreq` / `priority` + i18n `xhtml:link
|
|
16
|
+
* hreflang` annotations natively, and re-implementing that surface
|
|
17
|
+
* inside the engine would duplicate well-trodden Astro tooling for
|
|
18
|
+
* zero added value.
|
|
19
|
+
*
|
|
20
|
+
* # Field rationale
|
|
21
|
+
*
|
|
22
|
+
* **Why `enabled` defaults to `true`**:
|
|
23
|
+
* - Marketing sites that want to ship public pages overwhelmingly
|
|
24
|
+
* also want them in `sitemap.xml` (search engines treat its
|
|
25
|
+
* absence as a discoverability signal). The opt-OUT shape avoids
|
|
26
|
+
* a silent regression where a consumer ships pages that crawlers
|
|
27
|
+
* never index because they forgot to flip a flag.
|
|
28
|
+
* - The escape hatch (`enabled: false`) covers staging deployments
|
|
29
|
+
* and the rare per-app decision to suppress sitemap emission
|
|
30
|
+
* entirely (e.g. a private beta surface routed under a
|
|
31
|
+
* `noindex` policy).
|
|
32
|
+
*
|
|
33
|
+
* **Why `changefreq` / `priority` are OPTIONAL** (no defaults):
|
|
34
|
+
* - Both fields are non-binding hints — Google explicitly
|
|
35
|
+
* ignores `priority` and treats `changefreq` as a soft signal.
|
|
36
|
+
* Forcing the consumer to pick a value would either invite
|
|
37
|
+
* superstitious authoring (`priority: 1.0` on every page) or
|
|
38
|
+
* bury the field's actual ergonomic shape (per-page overrides
|
|
39
|
+
* via `WebsitePageManifest.seo` — deferred until a real
|
|
40
|
+
* consumer requests it).
|
|
41
|
+
* - Unset values are simply omitted from the emitted `<url>`
|
|
42
|
+
* entries; `@astrojs/sitemap` handles that automatically.
|
|
43
|
+
*
|
|
44
|
+
* **Validation**:
|
|
45
|
+
* - `priority` is `z.number().min(0).max(1)` — outside the spec
|
|
46
|
+
* range would silently break crawler ingestion.
|
|
47
|
+
* - `changefreq` is the union of the seven values the sitemap
|
|
48
|
+
* spec defines; arbitrary strings would be silently dropped by
|
|
49
|
+
* compliant crawlers.
|
|
50
|
+
*/
|
|
51
|
+
declare const _WebsiteSitemapConfigSchema: z.ZodObject<{
|
|
52
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
53
|
+
changefreq: z.ZodOptional<z.ZodEnum<{
|
|
54
|
+
never: "never";
|
|
55
|
+
always: "always";
|
|
56
|
+
hourly: "hourly";
|
|
57
|
+
daily: "daily";
|
|
58
|
+
weekly: "weekly";
|
|
59
|
+
monthly: "monthly";
|
|
60
|
+
yearly: "yearly";
|
|
61
|
+
}>>;
|
|
62
|
+
priority: z.ZodOptional<z.ZodNumber>;
|
|
63
|
+
}, z.core.$strip>;
|
|
64
|
+
export declare const WebsiteSitemapConfigSchema: typeof _WebsiteSitemapConfigSchema;
|
|
65
|
+
export type WebsiteSitemapConfig = z.infer<typeof _WebsiteSitemapConfigSchema>;
|
|
66
|
+
/** @wildo_source:part:end saas.website.seo.sitemap-config */
|
|
67
|
+
/**
|
|
68
|
+
* @wildo_source:part:start saas.website.seo.robots-config facet:layer:shared facet:family:website
|
|
69
|
+
*
|
|
70
|
+
* `WebsiteRobotsConfig` — site-wide `robots.txt` policy block.
|
|
71
|
+
*
|
|
72
|
+
* Materialized at request time by `renderRobotsTxt(siteContext)`
|
|
73
|
+
* from `@wildo-ai/saas-website/astro` (consumer wires a thin
|
|
74
|
+
* `src/pages/robots.txt.ts` Astro endpoint that returns the helper's
|
|
75
|
+
* output). Scoped to the SITE-WIDE policy surface — per-page
|
|
76
|
+
* `noindex` is a separate concern that lands on
|
|
77
|
+
* `WebsitePageManifest.seo` once a real consumer requests it (today
|
|
78
|
+
* the site-wide `disallow[]` covers staging-environment exclusion of
|
|
79
|
+
* specific path prefixes, the dominant real-world use case).
|
|
80
|
+
*
|
|
81
|
+
* # Field rationale
|
|
82
|
+
*
|
|
83
|
+
* **Why `policy` defaults to `'index'`**:
|
|
84
|
+
* - The default for a public marketing site is "let crawlers in";
|
|
85
|
+
* `'noindex'` is the deliberate exception (staging environments,
|
|
86
|
+
* beta surfaces, sites still under construction). The opt-OUT
|
|
87
|
+
* shape mirrors `WebsiteSitemapConfig.enabled` for consistency.
|
|
88
|
+
* - `'noindex'` emits a `User-agent: *\nDisallow: /` block — the
|
|
89
|
+
* standard "tell every well-behaved crawler to stay away"
|
|
90
|
+
* primitive.
|
|
91
|
+
*
|
|
92
|
+
* **Why `disallow[]` is a path-prefix list (not a regex)**:
|
|
93
|
+
* - The `robots.txt` spec only supports literal path prefixes
|
|
94
|
+
* with `*` / `$` wildcards; Disallow is NOT a regex surface.
|
|
95
|
+
* Typing it as `string[]` (validated to start with `/`) keeps
|
|
96
|
+
* the contract honest and lets consumers paste from their CDN
|
|
97
|
+
* allowlists without translation.
|
|
98
|
+
*
|
|
99
|
+
* **Why `allowedCrawlers` and `disallowedCrawlers` are mutually
|
|
100
|
+
* exclusive**:
|
|
101
|
+
* - The two fields are two halves of the SAME AI-crawler policy
|
|
102
|
+
* decision. `allowedCrawlers` is the deny-by-default shape
|
|
103
|
+
* (only the named bots may crawl); `disallowedCrawlers` is the
|
|
104
|
+
* allow-by-default shape (every bot except the named ones may
|
|
105
|
+
* crawl). Mixing both would emit a contradictory `robots.txt`
|
|
106
|
+
* (a bot in both lists would receive conflicting directives).
|
|
107
|
+
* A `superRefine` enforces the mutual-exclusion invariant at
|
|
108
|
+
* parse time so the build fails fast.
|
|
109
|
+
*
|
|
110
|
+
* **Validation**:
|
|
111
|
+
* - `disallow[]` entries must start with `/` (sitemap path-prefix
|
|
112
|
+
* spec) — anything else would silently match nothing.
|
|
113
|
+
* - `allowedCrawlers` / `disallowedCrawlers` entries must be
|
|
114
|
+
* non-empty strings (a blank User-agent token would emit
|
|
115
|
+
* `User-agent: ` which compliant crawlers ignore — silent
|
|
116
|
+
* misconfig).
|
|
117
|
+
* - `superRefine` rejects the combined-list anti-pattern.
|
|
118
|
+
*/
|
|
119
|
+
declare const _WebsiteRobotsConfigSchema: z.ZodObject<{
|
|
120
|
+
policy: z.ZodDefault<z.ZodEnum<{
|
|
121
|
+
index: "index";
|
|
122
|
+
noindex: "noindex";
|
|
123
|
+
}>>;
|
|
124
|
+
disallow: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
125
|
+
allowedCrawlers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
126
|
+
disallowedCrawlers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
127
|
+
}, z.core.$strip>;
|
|
128
|
+
export declare const WebsiteRobotsConfigSchema: typeof _WebsiteRobotsConfigSchema;
|
|
129
|
+
export type WebsiteRobotsConfig = z.infer<typeof _WebsiteRobotsConfigSchema>;
|
|
130
|
+
/** @wildo_source:part:end saas.website.seo.robots-config */
|
|
131
|
+
/**
|
|
132
|
+
* @wildo_source:part:start saas.website.seo.llms-txt-config facet:layer:shared facet:family:website
|
|
133
|
+
*
|
|
134
|
+
* `WebsiteLlmsTxtConfig` — site-wide `llms.txt` publication policy.
|
|
135
|
+
*
|
|
136
|
+
* The framework owns only the SERVING surface; the CONTENT remains
|
|
137
|
+
* hand-authored in `src/content/llms.txt`. This block therefore needs
|
|
138
|
+
* exactly one knob:
|
|
139
|
+
*
|
|
140
|
+
* - `enabled?: boolean`
|
|
141
|
+
* - `true` → publish when the file exists
|
|
142
|
+
* - `false` → suppress publication even if the file exists
|
|
143
|
+
* - `undefined` → auto-detect (`readLlmsTxtBody` publishes when the
|
|
144
|
+
* file exists, returns `null` when absent)
|
|
145
|
+
*
|
|
146
|
+
* Keeping the "auto-detect when undefined" convention in the HELPER
|
|
147
|
+
* (not as a schema default) is deliberate: schema defaults are static,
|
|
148
|
+
* while file presence is runtime/build-time state.
|
|
149
|
+
*/
|
|
150
|
+
declare const _WebsiteLlmsTxtConfigSchema: z.ZodObject<{
|
|
151
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
152
|
+
}, z.core.$strip>;
|
|
153
|
+
export declare const WebsiteLlmsTxtConfigSchema: typeof _WebsiteLlmsTxtConfigSchema;
|
|
154
|
+
export type WebsiteLlmsTxtConfig = z.infer<typeof _WebsiteLlmsTxtConfigSchema>;
|
|
155
|
+
/** @wildo_source:part:end saas.website.seo.llms-txt-config */
|
|
156
|
+
/**
|
|
157
|
+
* @wildo_source:part:start saas.website.root-config.seo facet:layer:shared facet:family:website
|
|
158
|
+
*
|
|
159
|
+
* `WebsiteSeoConfig` — site-wide SEO/social-graph configuration
|
|
160
|
+
* AUTHORED ON THE ROOT CONFIG.
|
|
161
|
+
*
|
|
162
|
+
* # Scope
|
|
163
|
+
*
|
|
164
|
+
* The public marketing-site origin belongs only in the per-service
|
|
165
|
+
* `wildo.website.config.ts` declaration. Keep it out of this site-level SEO
|
|
166
|
+
* block so the origin and localized routing have one source of truth.
|
|
167
|
+
*
|
|
168
|
+
* What stays on this block: site-level branding + hero-image
|
|
169
|
+
* fallbacks that are co-authored with chrome labels and page
|
|
170
|
+
* manifests respectively, NOT with the URL/i18n routing surface.
|
|
171
|
+
*
|
|
172
|
+
* # Field rationale
|
|
173
|
+
*
|
|
174
|
+
* **Why `siteName` is REQUIRED**:
|
|
175
|
+
* - `og:site_name` is the brand label social platforms render
|
|
176
|
+
* above the page title in shared previews. Without it, every
|
|
177
|
+
* LinkedIn / Facebook / Slack preview shows the bare title with
|
|
178
|
+
* no brand context.
|
|
179
|
+
* - It is also the recommended `application-name` meta tag value
|
|
180
|
+
* and a useful default for JSON-LD `Organization.name` schema
|
|
181
|
+
* when the application ships structured data.
|
|
182
|
+
*
|
|
183
|
+
* **Why `defaultOgImageUrl` is OPTIONAL**:
|
|
184
|
+
* - Each page's `WebsitePageManifest.metaLabelKeys.ogImageUrl`
|
|
185
|
+
* takes precedence; the site-level default is a fallback for
|
|
186
|
+
* pages that did not commit to a hero image.
|
|
187
|
+
* - Marketing surfaces shipping no OG images at all (acceptable
|
|
188
|
+
* for a placeholder build) should not be forced to author one.
|
|
189
|
+
*
|
|
190
|
+
* **Why `sitemap?` and `robots?` are OPTIONAL** (with sensible
|
|
191
|
+
* defaults inside each sub-schema):
|
|
192
|
+
* - The marketing-site default ships a public surface — every
|
|
193
|
+
* page indexable, no AI-crawler restrictions, no per-path
|
|
194
|
+
* disallow. Forcing every consumer to author both blocks just
|
|
195
|
+
* to land in that default state would pollute the call site.
|
|
196
|
+
* - Omitting either block at the call site is equivalent to
|
|
197
|
+
* authoring `{}` — `WebsiteSitemapConfig.enabled` defaults to
|
|
198
|
+
* `true`, `WebsiteRobotsConfig.policy` defaults to `'index'`.
|
|
199
|
+
* The per-block field rationale lives on each sub-schema.
|
|
200
|
+
* - `llmsTxt?` is similarly optional, but with a different default
|
|
201
|
+
* mechanic: omitting the block means "auto-detect from file
|
|
202
|
+
* presence" rather than "use a static schema default". The helper
|
|
203
|
+
* `readLlmsTxtBody(...)` publishes when `src/content/llms.txt`
|
|
204
|
+
* exists and returns `null` otherwise.
|
|
205
|
+
*
|
|
206
|
+
* **Validation**:
|
|
207
|
+
* - `siteName` is `z.string().min(1)` — empty strings would emit
|
|
208
|
+
* `<meta property="og:site_name" content="" />` which social
|
|
209
|
+
* platforms render as a blank line.
|
|
210
|
+
* - `defaultOgImageUrl` (when present) is `z.url()`.
|
|
211
|
+
* - `sitemap` / `robots` validation lives on the sub-schemas.
|
|
212
|
+
*/
|
|
213
|
+
declare const _WebsiteSeoConfigSchema: z.ZodObject<{
|
|
214
|
+
siteName: z.ZodString;
|
|
215
|
+
defaultOgImageUrl: z.ZodOptional<z.ZodURL>;
|
|
216
|
+
sitemap: z.ZodOptional<z.ZodObject<{
|
|
217
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
218
|
+
changefreq: z.ZodOptional<z.ZodEnum<{
|
|
219
|
+
never: "never";
|
|
220
|
+
always: "always";
|
|
221
|
+
hourly: "hourly";
|
|
222
|
+
daily: "daily";
|
|
223
|
+
weekly: "weekly";
|
|
224
|
+
monthly: "monthly";
|
|
225
|
+
yearly: "yearly";
|
|
226
|
+
}>>;
|
|
227
|
+
priority: z.ZodOptional<z.ZodNumber>;
|
|
228
|
+
}, z.core.$strip>>;
|
|
229
|
+
robots: z.ZodOptional<z.ZodObject<{
|
|
230
|
+
policy: z.ZodDefault<z.ZodEnum<{
|
|
231
|
+
index: "index";
|
|
232
|
+
noindex: "noindex";
|
|
233
|
+
}>>;
|
|
234
|
+
disallow: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
235
|
+
allowedCrawlers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
236
|
+
disallowedCrawlers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
237
|
+
}, z.core.$strip>>;
|
|
238
|
+
llmsTxt: z.ZodOptional<z.ZodObject<{
|
|
239
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
240
|
+
}, z.core.$strip>>;
|
|
241
|
+
}, z.core.$strip>;
|
|
242
|
+
export declare const WebsiteSeoConfigSchema: typeof _WebsiteSeoConfigSchema;
|
|
243
|
+
export type WebsiteSeoConfig = z.infer<typeof _WebsiteSeoConfigSchema>;
|
|
244
|
+
/** @wildo_source:part:end saas.website.root-config.seo */
|
|
245
|
+
/**
|
|
246
|
+
* @wildo_source:part:start saas.website.root-config.navigation facet:layer:shared facet:family:website
|
|
247
|
+
*
|
|
248
|
+
* `WebsiteNavigationConfig` — site-wide header/footer slot bindings.
|
|
249
|
+
*
|
|
250
|
+
* The framework intentionally ships no concrete header or footer. The
|
|
251
|
+
* application authors both as React components, registers them once here, and
|
|
252
|
+
* the page layout renders the site-wide chrome around every page.
|
|
253
|
+
*
|
|
254
|
+
* Both fields are typed as `unknown` at the schema layer with the
|
|
255
|
+
* `WebsiteNavigationConfig` interface narrowing them to
|
|
256
|
+
* `ComponentType<unknown>` — same rationale as
|
|
257
|
+
* `WebsiteSectionDefinition.Component` and `WebsitePageManifest.pageComponent`.
|
|
258
|
+
*/
|
|
259
|
+
declare const _WebsiteNavigationConfigSchema: z.ZodObject<{
|
|
260
|
+
headerComponent: z.ZodUnknown;
|
|
261
|
+
footerComponent: z.ZodUnknown;
|
|
262
|
+
}, z.core.$strip>;
|
|
263
|
+
export declare const WebsiteNavigationConfigSchema: typeof _WebsiteNavigationConfigSchema;
|
|
264
|
+
export interface WebsiteNavigationConfig extends z.infer<typeof _WebsiteNavigationConfigSchema> {
|
|
265
|
+
headerComponent: ComponentType<unknown>;
|
|
266
|
+
footerComponent: ComponentType<unknown>;
|
|
267
|
+
}
|
|
268
|
+
/** @wildo_source:part:end saas.website.root-config.navigation */
|
|
269
|
+
/**
|
|
270
|
+
* @wildo_source:part:start saas.website.root-config.schema facet:layer:shared facet:family:website
|
|
271
|
+
*
|
|
272
|
+
* `WebsiteRootConfig` — the site-level configuration consumed by:
|
|
273
|
+
* - the Astro adapter to drive i18n routing, page mounting,
|
|
274
|
+
* and design-token CSS emission,
|
|
275
|
+
* - the website audit command to validate label-pack
|
|
276
|
+
* coverage and SEO structured-data conformance,
|
|
277
|
+
* - the runtime `<WebsitePageLayout>` to render navigation
|
|
278
|
+
* and apply design tokens.
|
|
279
|
+
*
|
|
280
|
+
* **Authoring convention**: each marketing-site service exports a single
|
|
281
|
+
* `WEBSITE_ROOT_CONFIG: WebsiteRootConfig` from `src/website-root.config.ts`.
|
|
282
|
+
* The Astro adapter and the audit command
|
|
283
|
+
* both consume this canonical entry point; there is exactly one site
|
|
284
|
+
* config per marketing site (no per-page or per-section overrides at
|
|
285
|
+
* this level — overrides flow through the L0/L1/L1.5 component
|
|
286
|
+
* registration hierarchy described in D6).
|
|
287
|
+
*
|
|
288
|
+
* # Scope
|
|
289
|
+
*
|
|
290
|
+
* This block carries site-level chrome and registry data only. Per-locale
|
|
291
|
+
* routing (`locales` / `defaultLocale`) and the public origin belong in the
|
|
292
|
+
* per-service `wildo.website.config.ts` declaration, avoiding duplicated
|
|
293
|
+
* configuration that could diverge during site generation.
|
|
294
|
+
*
|
|
295
|
+
* **Field-by-field rationale**:
|
|
296
|
+
*
|
|
297
|
+
* - `pageManifests` — the registry of every page on the site. Indexed
|
|
298
|
+
* downstream by `manifest.ref`. Refs MUST be unique (refinement
|
|
299
|
+
* below).
|
|
300
|
+
* - `designTokens` — see `WebsiteDesignTokensSchema`.
|
|
301
|
+
* - `navigation` — see `WebsiteNavigationConfigSchema`.
|
|
302
|
+
* - `chromeLabelKeys` — OPTIONAL. The set of fully-composed label keys
|
|
303
|
+
* the site-wide chrome (header / footer / any global slot the
|
|
304
|
+
* consumer renders outside a section context) reads via
|
|
305
|
+
* `useWebsiteLabelByKey(...)`. Declared here, NOT in section
|
|
306
|
+
* `expectedLabelKeys`, because chrome is rendered outside the
|
|
307
|
+
* page+section context — `useWebsiteLabel(slot)` is structurally
|
|
308
|
+
* unavailable to it. Threading these through the label-pack
|
|
309
|
+
* validator (a) silences the always-on "orphaned chrome key" build
|
|
310
|
+
* warnings and (b) lets the build fail fast when a chrome key is
|
|
311
|
+
* missing from a locale pack, the same way section keys do.
|
|
312
|
+
* Defaults to an empty array; sites with no chrome label reads
|
|
313
|
+
* may omit the field entirely.
|
|
314
|
+
* - `seo` — site-level branding + hero-image fallback (see
|
|
315
|
+
* `WebsiteSeoConfigSchema`). The marketing-site origin USED to live
|
|
316
|
+
* here as `seo.siteOrigin`; it now lives only on
|
|
317
|
+
* `WildoMarketingWebsiteConfig.publicOrigin`.
|
|
318
|
+
* - `skipToMainContentLabelKey` — see field JSDoc below.
|
|
319
|
+
*
|
|
320
|
+
* **Refinements**:
|
|
321
|
+
* - `pageManifests[].ref` uniqueness — the registry is keyed by ref;
|
|
322
|
+
* duplicates would silently overwrite each other in the lookup
|
|
323
|
+
* table the bridge uses for cross-page links.
|
|
324
|
+
* - `pageManifests[].routePath` uniqueness — two pages cannot mount
|
|
325
|
+
* at the same path (Astro would error at build time, but we
|
|
326
|
+
* surface it earlier here with a clearer diagnostic).
|
|
327
|
+
* - `chromeLabelKeys` uniqueness — duplicates indicate copy-paste
|
|
328
|
+
* bugs at the consumer's call site; surface them here.
|
|
329
|
+
*/
|
|
330
|
+
declare const _WebsiteRootConfigSchema: z.ZodObject<{
|
|
331
|
+
pageManifests: z.ZodArray<z.ZodObject<{
|
|
332
|
+
ref: z.core.$ZodBranded<z.ZodString, "WebsitePageRef", "out">;
|
|
333
|
+
routePath: z.core.$ZodBranded<z.ZodString, "WebsitePageRoutePath", "out">;
|
|
334
|
+
pageComponent: z.ZodUnknown;
|
|
335
|
+
sectionRefs: z.ZodArray<z.core.$ZodBranded<z.ZodString, "WebsiteSectionRef", "out">>;
|
|
336
|
+
metaLabelKeys: z.ZodObject<{
|
|
337
|
+
titleKey: z.core.$ZodBranded<z.ZodString, "WebsiteLabelKey", "out">;
|
|
338
|
+
descriptionKey: z.core.$ZodBranded<z.ZodString, "WebsiteLabelKey", "out">;
|
|
339
|
+
ogImageUrl: z.ZodOptional<z.ZodURL>;
|
|
340
|
+
}, z.core.$strip>;
|
|
341
|
+
hydration: z.ZodOptional<z.ZodEnum<typeof import("./website-page-manifest.shared.schemas").WebsitePageHydrationStrategy>>;
|
|
342
|
+
seo: z.ZodOptional<z.ZodObject<{
|
|
343
|
+
noaiOptOut: z.ZodOptional<z.ZodBoolean>;
|
|
344
|
+
}, z.core.$strip>>;
|
|
345
|
+
}, z.core.$strip>>;
|
|
346
|
+
designTokens: z.ZodObject<{
|
|
347
|
+
colors: z.ZodObject<{
|
|
348
|
+
background: z.ZodString;
|
|
349
|
+
foreground: z.ZodString;
|
|
350
|
+
primary: z.ZodString;
|
|
351
|
+
primaryForeground: z.ZodString;
|
|
352
|
+
accent: z.ZodString;
|
|
353
|
+
accentForeground: z.ZodString;
|
|
354
|
+
surface: z.ZodString;
|
|
355
|
+
surfaceForeground: z.ZodString;
|
|
356
|
+
border: z.ZodString;
|
|
357
|
+
muted: z.ZodString;
|
|
358
|
+
mutedForeground: z.ZodString;
|
|
359
|
+
}, z.core.$strip>;
|
|
360
|
+
radii: z.ZodObject<{
|
|
361
|
+
none: z.ZodString;
|
|
362
|
+
sm: z.ZodString;
|
|
363
|
+
md: z.ZodString;
|
|
364
|
+
lg: z.ZodString;
|
|
365
|
+
xl: z.ZodString;
|
|
366
|
+
full: z.ZodString;
|
|
367
|
+
}, z.core.$strip>;
|
|
368
|
+
}, z.core.$strip>;
|
|
369
|
+
navigation: z.ZodObject<{
|
|
370
|
+
headerComponent: z.ZodUnknown;
|
|
371
|
+
footerComponent: z.ZodUnknown;
|
|
372
|
+
}, z.core.$strip>;
|
|
373
|
+
chromeLabelKeys: z.ZodDefault<z.ZodArray<z.core.$ZodBranded<z.ZodString, "WebsiteLabelKey", "out">>>;
|
|
374
|
+
seo: z.ZodObject<{
|
|
375
|
+
siteName: z.ZodString;
|
|
376
|
+
defaultOgImageUrl: z.ZodOptional<z.ZodURL>;
|
|
377
|
+
sitemap: z.ZodOptional<z.ZodObject<{
|
|
378
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
379
|
+
changefreq: z.ZodOptional<z.ZodEnum<{
|
|
380
|
+
never: "never";
|
|
381
|
+
always: "always";
|
|
382
|
+
hourly: "hourly";
|
|
383
|
+
daily: "daily";
|
|
384
|
+
weekly: "weekly";
|
|
385
|
+
monthly: "monthly";
|
|
386
|
+
yearly: "yearly";
|
|
387
|
+
}>>;
|
|
388
|
+
priority: z.ZodOptional<z.ZodNumber>;
|
|
389
|
+
}, z.core.$strip>>;
|
|
390
|
+
robots: z.ZodOptional<z.ZodObject<{
|
|
391
|
+
policy: z.ZodDefault<z.ZodEnum<{
|
|
392
|
+
index: "index";
|
|
393
|
+
noindex: "noindex";
|
|
394
|
+
}>>;
|
|
395
|
+
disallow: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
396
|
+
allowedCrawlers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
397
|
+
disallowedCrawlers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
398
|
+
}, z.core.$strip>>;
|
|
399
|
+
llmsTxt: z.ZodOptional<z.ZodObject<{
|
|
400
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
401
|
+
}, z.core.$strip>>;
|
|
402
|
+
}, z.core.$strip>;
|
|
403
|
+
skipToMainContentLabelKey: z.core.$ZodBranded<z.ZodString, "WebsiteLabelKey", "out">;
|
|
404
|
+
}, z.core.$strip>;
|
|
405
|
+
export declare const WebsiteRootConfigSchema: typeof _WebsiteRootConfigSchema;
|
|
406
|
+
/**
|
|
407
|
+
* Runtime shape of `WebsiteRootConfig`.
|
|
408
|
+
*
|
|
409
|
+
* Hand-written (NOT a bare `z.infer<typeof _WebsiteRootConfigSchema>`)
|
|
410
|
+
* because `z.infer` walks the schema tree and would type
|
|
411
|
+
* `pageManifests[number].pageComponent`, `navigation.headerComponent`
|
|
412
|
+
* and `navigation.footerComponent` as `unknown` (their schema field
|
|
413
|
+
* type), losing the `ComponentType<unknown>` narrowing carried by the
|
|
414
|
+
* hand-written `WebsitePageManifest` and `WebsiteNavigationConfig`
|
|
415
|
+
* interfaces. Factories such as `defineWebsiteRootConfig` and the
|
|
416
|
+
* layout primitives consume `WebsiteRootConfig` and must see those
|
|
417
|
+
* fields pre-narrowed; otherwise every consumer would need a local
|
|
418
|
+
* `as ComponentType` cast at the JSX call site, defeating the type-safe
|
|
419
|
+
* component contract.
|
|
420
|
+
*
|
|
421
|
+
* The `Omit` + intersection pattern keeps the rest of the inferred
|
|
422
|
+
* shape (`designTokens`, `seo`, `chromeLabelKeys`,
|
|
423
|
+
* `skipToMainContentLabelKey`) sourced directly from the schema.
|
|
424
|
+
*/
|
|
425
|
+
export type WebsiteRootConfig = Omit<z.infer<typeof _WebsiteRootConfigSchema>, 'pageManifests' | 'navigation'> & {
|
|
426
|
+
pageManifests: WebsitePageManifest[];
|
|
427
|
+
navigation: WebsiteNavigationConfig;
|
|
428
|
+
};
|
|
429
|
+
export {};
|
|
430
|
+
/** @wildo_source:part:end saas.website.root-config.schema */
|
|
431
|
+
//# sourceMappingURL=website-root-config.shared.schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"website-root-config.shared.schemas.d.ts","sourceRoot":"","sources":["../../../../../src/schemas/manifests/website-root-config.shared.schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,wCAAwC,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,QAAA,MAAM,2BAA2B;;;;;;;;;;;;iBAU/B,CAAC;AAEH,eAAO,MAAM,0BAA0B,EAAE,OAAO,2BACnB,CAAC;AAE9B,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAC/E,6DAA6D;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,QAAA,MAAM,0BAA0B;;;;;;;;iBAsC5B,CAAC;AAEL,eAAO,MAAM,yBAAyB,EAAE,OAAO,0BACnB,CAAC;AAE7B,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC7E,4DAA4D;AAE5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,QAAA,MAAM,2BAA2B;;iBAE/B,CAAC;AAEH,eAAO,MAAM,0BAA0B,EAAE,OAAO,2BACnB,CAAC;AAE9B,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAC/E,8DAA8D;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BzB,CAAC;AAEL,eAAO,MAAM,sBAAsB,EAAE,OAAO,uBAAiD,CAAC;AAE9F,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACvE,0DAA0D;AAE1D;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,8BAA8B;;;iBAGlC,CAAC;AAEH,eAAO,MAAM,6BAA6B,EAAE,OAAO,8BACnB,CAAC;AAEjC,MAAM,WAAW,uBACf,SAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC;IACtD,eAAe,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,eAAe,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACzC;AACD,iEAAiE;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,QAAA,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2F1B,CAAC;AAEL,eAAO,MAAM,uBAAuB,EAAE,OAAO,wBAAmD,CAAC;AAEjG;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,EACxC,eAAe,GAAG,YAAY,CAC/B,GAAG;IACF,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,UAAU,EAAE,uBAAuB,CAAC;CACrC,CAAC;;AACF,6DAA6D"}
|