{"_id":"@alphablue/astro-site","_rev":"5-4242e738e74e1b31e0fb859da1503905","name":"@alphablue/astro-site","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@alphablue/astro-site","version":"0.1.0","license":"MIT","_id":"@alphablue/astro-site@0.1.0","maintainers":[{"name":"lukesproxy","email":"luke@soft.pw"}],"//":"publishConfig rewrites the entry points at publish time (pnpm applies these); in the workspace the package resolves to TypeScript source. Same arrangement as @alphablue/site-runtime.","dist":{"shasum":"2fedbe4821dba33a59114be9f69c708658188d94","tarball":"https://registry.npmjs.org/@alphablue/astro-site/-/astro-site-0.1.0.tgz","fileCount":26,"integrity":"sha512-wfvMfhRnrGmusAf8h4L8KId9Ki1VJ1Z9Co+7hJYQmyCKoldMZX6n7aNbgvVLe1FQbuGzOAqFwEietRJCPmg3hA==","signatures":[{"sig":"MEUCIAa29rxvJXbLaC5Xapy4eaHDW23b1q2CqWyZHL+X58RMAiEA2vvJ3UhAvD9V9z6ulhEHonWn9Dolw/RheYsJak6k3dI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60445},"main":"./dist/index.js","type":"module","_from":"file:/var/folders/x9/t0h3hmd52hq13mvw9drwtz500000gn/T/tmp.0vIxYbgGNJ/alphablue-astro-site-0.1.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./content":{"types":"./dist/content.d.ts","default":"./dist/content.js"},"./runtime":{"types":"./dist/runtime.d.ts","default":"./dist/runtime.js"},"./articles":"./src/articles/ArticleRenderer.astro","./articles/seo":{"types":"./dist/articles/seo.d.ts","default":"./dist/articles/seo.js"},"./mourning.css":"./mourning.css","./preview-review":{"types":"./dist/preview-review/integration.d.ts","default":"./dist/preview-review/integration.js"},"./articles/renderer":"./src/articles/ArticleRenderer.astro","./articles/styles.css":"./src/articles/article.css","./preview-review/runtime":{"types":"./dist/preview-review/runtime.d.ts","default":"./dist/preview-review/runtime.js"}},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:astro-matrix":"node scripts/check-astro-matrix.mjs"},"_npmUser":{"name":"lukesproxy","email":"luke@soft.pw"},"_resolved":"/var/folders/x9/t0h3hmd52hq13mvw9drwtz500000gn/T/tmp.0vIxYbgGNJ/alphablue-astro-site-0.1.0.tgz","_integrity":"sha512-wfvMfhRnrGmusAf8h4L8KId9Ki1VJ1Z9Co+7hJYQmyCKoldMZX6n7aNbgvVLe1FQbuGzOAqFwEietRJCPmg3hA==","_npmVersion":"10.9.4","description":"AlphaBlue Astro live-layer integration, static Article renderer, and SEO helpers.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"@alphablue/site-runtime":"0.1.0","@alphablue/content-model":"0.1.0","@alphablue/content-client":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","vitest":"^4.1.10","astro-5":"npm:astro@^5.0.0","astro-6":"npm:astro@^6.0.0","astro-7":"npm:astro@^7.0.0","typescript":"^5.6.0","@types/node":"^22.0.0","@astrojs/check":"^0.9.0"},"peerDependencies":{"astro":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/astro-site_0.1.0_1785597753742_0.25326474161758084","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alphablue/astro-site","version":"0.1.1","license":"MIT","_id":"@alphablue/astro-site@0.1.1","maintainers":[{"name":"lukesproxy","email":"luke@soft.pw"}],"//":"publishConfig rewrites the entry points at publish time (pnpm applies these); in the workspace the package resolves to TypeScript source. Same arrangement as @alphablue/site-runtime.","dist":{"shasum":"2b0f5f4461930f0ae550ce5b889b42ca6908f802","tarball":"https://registry.npmjs.org/@alphablue/astro-site/-/astro-site-0.1.1.tgz","fileCount":31,"integrity":"sha512-vlMVl4WA4ZgCCl7Ze8DlDzYISu55aqdQ7Z+Ho1g49PNF5Jyus0fO8LXV7GjU7jtAXjjjCM1WJB9v2CVx2sKbrw==","signatures":[{"sig":"MEUCIQCQOkPizQVp3j6CEBtnG3y+C94CyHySzd3yF+jbRMVZZQIgQ6lVZFAVwslYpY3lLFV2A7Tlcquz+k1hOOWYVp+jYoM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69202},"type":"module","exports":{".":"./src/index.ts","./faqs":"./src/faqs/FaqSection.astro","./content":"./src/content.ts","./runtime":"./src/runtime.ts","./articles":"./src/articles/ArticleRenderer.astro","./faqs/seo":"./src/faqs/seo.ts","./articles/seo":"./src/articles/seo.ts","./mourning.css":"./mourning.css","./faqs/renderer":"./src/faqs/FaqSection.astro","./preview-review":"./src/preview-review/integration.ts","./faqs/styles.css":"./src/faqs/faq.css","./articles/renderer":"./src/articles/ArticleRenderer.astro","./articles/styles.css":"./src/articles/article.css","./preview-review/runtime":"./src/preview-review/runtime.ts"},"gitHead":"bc2c97a53f6d77985842bfc13444abc096ef1faa","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:astro-matrix":"node scripts/check-astro-matrix.mjs"},"_npmUser":{"name":"lukesproxy","email":"luke@soft.pw"},"_npmVersion":"11.12.1","description":"AlphaBlue Astro live-layer integration, static Article and FAQ renderers, and SEO helpers.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@alphablue/site-runtime":"workspace:*","@alphablue/content-model":"workspace:*","@alphablue/content-client":"workspace:*"},"publishConfig":{"main":"./dist/index.js","types":"./dist/index.d.ts","access":"public","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./faqs":"./src/faqs/FaqSection.astro","./content":{"types":"./dist/content.d.ts","default":"./dist/content.js"},"./runtime":{"types":"./dist/runtime.d.ts","default":"./dist/runtime.js"},"./articles":"./src/articles/ArticleRenderer.astro","./faqs/seo":{"types":"./dist/faqs/seo.d.ts","default":"./dist/faqs/seo.js"},"./articles/seo":{"types":"./dist/articles/seo.d.ts","default":"./dist/articles/seo.js"},"./mourning.css":"./mourning.css","./faqs/renderer":"./src/faqs/FaqSection.astro","./preview-review":{"types":"./dist/preview-review/integration.d.ts","default":"./dist/preview-review/integration.js"},"./faqs/styles.css":"./src/faqs/faq.css","./articles/renderer":"./src/articles/ArticleRenderer.astro","./articles/styles.css":"./src/articles/article.css","./preview-review/runtime":{"types":"./dist/preview-review/runtime.d.ts","default":"./dist/preview-review/runtime.js"}}},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","vitest":"^4.1.10","astro-5":"npm:astro@^5.0.0","astro-6":"npm:astro@^6.0.0","astro-7":"npm:astro@^7.0.0","typescript":"^5.6.0","@types/node":"^22.0.0","@astrojs/check":"^0.9.0"},"peerDependencies":{"astro":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/astro-site_0.1.1_1785675951950_0.2106785911375464","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alphablue/astro-site","version":"0.2.0","license":"MIT","_id":"@alphablue/astro-site@0.2.0","maintainers":[{"name":"lukesproxy","email":"luke@soft.pw"}],"//":"publishConfig rewrites the entry points at publish time (pnpm applies these); in the workspace the package resolves to TypeScript source. Same arrangement as @alphablue/site-runtime.","dist":{"shasum":"f8e2bf85ceb1d530887b71ed84122b67b4538753","tarball":"https://registry.npmjs.org/@alphablue/astro-site/-/astro-site-0.2.0.tgz","fileCount":39,"integrity":"sha512-daHQwfG4ZqxaR4aQOb3JzJWrx8yoN+WU1U694W/msJwHJ6huK5GFfUMSNsntsY0U5cmdmoAR9IeSh7xlfV9tMw==","signatures":[{"sig":"MEQCIBTXlDWdOmJfJ2KdkiRuYH2TRcgtneUF3D7BDFArpHXbAiAIVMu+NqDNa76rhMpQ5j2WXSO+J7QaT7qFxE+WFFwaKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100908},"main":"./dist/index.js","type":"module","_from":"file:alphablue-astro-site-0.2.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./faqs":"./src/faqs/FaqSection.astro","./content":{"types":"./dist/content.d.ts","default":"./dist/content.js"},"./runtime":{"types":"./dist/runtime.d.ts","default":"./dist/runtime.js"},"./articles":"./src/articles/ArticleRenderer.astro","./faqs/seo":{"types":"./dist/faqs/seo.d.ts","default":"./dist/faqs/seo.js"},"./articles/seo":{"types":"./dist/articles/seo.d.ts","default":"./dist/articles/seo.js"},"./mourning.css":"./mourning.css","./faqs/renderer":"./src/faqs/FaqSection.astro","./preview-review":{"types":"./dist/preview-review/integration.d.ts","default":"./dist/preview-review/integration.js"},"./proposals/flow":"./src/proposals/FlowDiagram.astro","./faqs/styles.css":"./src/faqs/faq.css","./articles/renderer":"./src/articles/ArticleRenderer.astro","./proposals/section":"./src/proposals/ProposalSection.astro","./articles/styles.css":"./src/articles/article.css","./proposals/evolution":"./src/proposals/EvolutionPath.astro","./proposals/styles.css":"./src/proposals/proposal.css","./preview-review/runtime":{"types":"./dist/preview-review/runtime.d.ts","default":"./dist/preview-review/runtime.js"},"./proposals/lo-fi-website":"./src/proposals/LoFiWebsite.astro","./proposals/branching-workflow":"./src/proposals/BranchingWorkflow.astro"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:astro-matrix":"node scripts/check-astro-matrix.mjs"},"_npmUser":{"name":"lukesproxy","email":"luke@soft.pw"},"_resolved":"/private/var/folders/x9/t0h3hmd52hq13mvw9drwtz500000gn/T/566377e783cb48e88ca8ef0c70d9c365/alphablue-astro-site-0.2.0.tgz","_integrity":"sha512-daHQwfG4ZqxaR4aQOb3JzJWrx8yoN+WU1U694W/msJwHJ6huK5GFfUMSNsntsY0U5cmdmoAR9IeSh7xlfV9tMw==","_npmVersion":"11.12.1","description":"AlphaBlue Astro live-layer integration, static Article and FAQ renderers, and SEO helpers.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@alphablue/site-runtime":"^0.1.0","@alphablue/content-model":"^0.1.0","@alphablue/content-client":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","vitest":"^4.1.10","astro-5":"npm:astro@^5.0.0","astro-6":"npm:astro@^6.0.0","astro-7":"npm:astro@^7.0.0","typescript":"^5.6.0","@types/node":"^22.0.0","@astrojs/check":"^0.9.0"},"peerDependencies":{"astro":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/astro-site_0.2.0_1787235641271_0.18684215117889247","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alphablue/astro-site","version":"0.3.0","license":"MIT","_id":"@alphablue/astro-site@0.3.0","maintainers":[{"name":"lukesproxy","email":"luke@soft.pw"}],"//":"publishConfig rewrites the entry points at publish time (pnpm applies these); in the workspace the package resolves to TypeScript source. Same arrangement as @alphablue/site-runtime.","dist":{"shasum":"df91c597924677e79c0615e377569020dca122b4","tarball":"https://registry.npmjs.org/@alphablue/astro-site/-/astro-site-0.3.0.tgz","fileCount":41,"integrity":"sha512-bBNT+qFMzksE4HNXrbB33x8JY06Al40g5jiCJdp98NM5WMPKIRdXISYZ2JwChse8wBX4QUha+kcw2a+aMnEFgQ==","signatures":[{"sig":"MEUCIFd6EfOZSAMduqis/22xzcpsiy2Y+L925txmXii/ZH/nAiEA2mhVT08AeFIPYUg08t6qC9FsU58RXMCqyej2CE/ttLk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110989},"type":"module","exports":{".":"./src/index.ts","./faqs":"./src/faqs/FaqSection.astro","./catalog":"./src/catalog/CatalogDetailRenderer.astro","./content":"./src/content.ts","./runtime":"./src/runtime.ts","./articles":"./src/articles/ArticleRenderer.astro","./faqs/seo":"./src/faqs/seo.ts","./articles/seo":"./src/articles/seo.ts","./mourning.css":"./mourning.css","./faqs/renderer":"./src/faqs/FaqSection.astro","./preview-review":"./src/preview-review/integration.ts","./proposals/flow":"./src/proposals/FlowDiagram.astro","./faqs/styles.css":"./src/faqs/faq.css","./catalog/renderer":"./src/catalog/CatalogDetailRenderer.astro","./articles/renderer":"./src/articles/ArticleRenderer.astro","./proposals/section":"./src/proposals/ProposalSection.astro","./catalog/styles.css":"./src/catalog/catalog.css","./articles/styles.css":"./src/articles/article.css","./proposals/evolution":"./src/proposals/EvolutionPath.astro","./proposals/styles.css":"./src/proposals/proposal.css","./preview-review/runtime":"./src/preview-review/runtime.ts","./proposals/lo-fi-website":"./src/proposals/LoFiWebsite.astro","./proposals/branching-workflow":"./src/proposals/BranchingWorkflow.astro"},"gitHead":"9784ce28fd34a080fd6faa5d84fb085bfb2a7c4f","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test:astro-matrix":"node scripts/check-astro-matrix.mjs"},"_npmUser":{"name":"lukesproxy","email":"luke@soft.pw"},"_npmVersion":"11.12.1","description":"AlphaBlue Astro live-layer integration, static Article and FAQ renderers, and SEO helpers.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@alphablue/site-runtime":"workspace:^","@alphablue/content-model":"workspace:^","@alphablue/content-client":"workspace:^"},"publishConfig":{"main":"./dist/index.js","types":"./dist/index.d.ts","access":"public","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./faqs":"./src/faqs/FaqSection.astro","./catalog":"./src/catalog/CatalogDetailRenderer.astro","./content":{"types":"./dist/content.d.ts","default":"./dist/content.js"},"./runtime":{"types":"./dist/runtime.d.ts","default":"./dist/runtime.js"},"./articles":"./src/articles/ArticleRenderer.astro","./faqs/seo":{"types":"./dist/faqs/seo.d.ts","default":"./dist/faqs/seo.js"},"./articles/seo":{"types":"./dist/articles/seo.d.ts","default":"./dist/articles/seo.js"},"./mourning.css":"./mourning.css","./faqs/renderer":"./src/faqs/FaqSection.astro","./preview-review":{"types":"./dist/preview-review/integration.d.ts","default":"./dist/preview-review/integration.js"},"./proposals/flow":"./src/proposals/FlowDiagram.astro","./faqs/styles.css":"./src/faqs/faq.css","./catalog/renderer":"./src/catalog/CatalogDetailRenderer.astro","./articles/renderer":"./src/articles/ArticleRenderer.astro","./proposals/section":"./src/proposals/ProposalSection.astro","./catalog/styles.css":"./src/catalog/catalog.css","./articles/styles.css":"./src/articles/article.css","./proposals/evolution":"./src/proposals/EvolutionPath.astro","./proposals/styles.css":"./src/proposals/proposal.css","./preview-review/runtime":{"types":"./dist/preview-review/runtime.d.ts","default":"./dist/preview-review/runtime.js"},"./proposals/lo-fi-website":"./src/proposals/LoFiWebsite.astro","./proposals/branching-workflow":"./src/proposals/BranchingWorkflow.astro"}},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","vitest":"^4.1.10","astro-5":"npm:astro@^5.0.0","astro-6":"npm:astro@^6.0.0","astro-7":"npm:astro@^7.0.0","typescript":"^5.6.0","@types/node":"^22.0.0","@astrojs/check":"^0.9.0"},"peerDependencies":{"astro":"^5.0.0 || ^6.0.0 || ^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/astro-site_0.3.0_1787641079318_0.29012795772904854","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@alphablue/astro-site","version":"0.3.1","description":"AlphaBlue Astro live-layer integration, static Article and FAQ renderers, and SEO helpers.","license":"MIT","type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./content":{"types":"./dist/content.d.ts","default":"./dist/content.js"},"./runtime":{"types":"./dist/runtime.d.ts","default":"./dist/runtime.js"},"./articles":"./src/articles/ArticleRenderer.astro","./articles/renderer":"./src/articles/ArticleRenderer.astro","./articles/seo":{"types":"./dist/articles/seo.d.ts","default":"./dist/articles/seo.js"},"./articles/styles.css":"./src/articles/article.css","./faqs":"./src/faqs/FaqSection.astro","./faqs/renderer":"./src/faqs/FaqSection.astro","./faqs/seo":{"types":"./dist/faqs/seo.d.ts","default":"./dist/faqs/seo.js"},"./faqs/styles.css":"./src/faqs/faq.css","./catalog":"./src/catalog/CatalogDetailRenderer.astro","./catalog/renderer":"./src/catalog/CatalogDetailRenderer.astro","./catalog/styles.css":"./src/catalog/catalog.css","./proposals/section":"./src/proposals/ProposalSection.astro","./proposals/flow":"./src/proposals/FlowDiagram.astro","./proposals/branching-workflow":"./src/proposals/BranchingWorkflow.astro","./proposals/evolution":"./src/proposals/EvolutionPath.astro","./proposals/lo-fi-website":"./src/proposals/LoFiWebsite.astro","./proposals/styles.css":"./src/proposals/proposal.css","./preview-review":{"types":"./dist/preview-review/integration.d.ts","default":"./dist/preview-review/integration.js"},"./preview-review/runtime":{"types":"./dist/preview-review/runtime.d.ts","default":"./dist/preview-review/runtime.js"},"./mourning.css":"./mourning.css"},"//":"publishConfig rewrites the entry points at publish time (pnpm applies these); in the workspace the package resolves to TypeScript source. Same arrangement as @alphablue/site-runtime.","publishConfig":{"access":"public"},"peerDependencies":{"astro":"^5.0.0 || ^6.0.0 || ^7.0.0"},"dependencies":{"@alphablue/content-client":"^0.3.1","@alphablue/content-model":"^0.2.1","@alphablue/site-runtime":"^0.1.0"},"devDependencies":{"@astrojs/check":"^0.9.0","@types/node":"^22.0.0","astro":"^5.0.0","astro-5":"npm:astro@^5.0.0","astro-6":"npm:astro@^6.0.0","astro-7":"npm:astro@^7.0.0","typescript":"^5.6.0","vitest":"^4.1.10"},"scripts":{"build":"tsc -p tsconfig.build.json","test":"vitest run","test:astro-matrix":"node scripts/check-astro-matrix.mjs","typecheck":"tsc --noEmit"},"main":"./dist/index.js","types":"./dist/index.d.ts","_id":"@alphablue/astro-site@0.3.1","_integrity":"sha512-XeLMYrG1ooZ62MgYXsePOHuwZ9ZambOQ1UYkJ8mn4ICH+zm2Wfecr0KKcAyfB2uw7E+IaT5B7v581udCNFu2KQ==","_resolved":"/tmp/alphablue-npm-remediation.ZV630E/alphablue-astro-site-0.3.1.tgz","_from":"file:/tmp/alphablue-npm-remediation.ZV630E/alphablue-astro-site-0.3.1.tgz","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-XeLMYrG1ooZ62MgYXsePOHuwZ9ZambOQ1UYkJ8mn4ICH+zm2Wfecr0KKcAyfB2uw7E+IaT5B7v581udCNFu2KQ==","shasum":"584ae6e67c5957c3e8b1d07adc56437b6b8800cb","tarball":"https://registry.npmjs.org/@alphablue/astro-site/-/astro-site-0.3.1.tgz","fileCount":41,"unpackedSize":109603,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDpeuNIQxlxLr0xa8+1yHCiYmv/jXKHC4mjALOtlmYp/wIhAPnF5dJoOpOhDvCM2HNkyn0IofQDy8HlWWsnpHHemnc0"}]},"_npmUser":{"name":"lukesproxy","email":"luke@soft.pw"},"directories":{},"maintainers":[{"name":"lukesproxy","email":"luke@soft.pw"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/astro-site_0.3.1_1787641282320_0.9153299289118517"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-01T15:22:33.658Z","modified":"2026-08-25T07:01:22.707Z","0.1.0":"2026-08-01T15:22:33.915Z","0.1.1":"2026-08-02T13:05:52.209Z","0.2.0":"2026-08-20T14:20:41.416Z","0.3.0":"2026-08-25T06:57:59.461Z","0.3.1":"2026-08-25T07:01:22.464Z"},"license":"MIT","description":"AlphaBlue Astro live-layer integration, static Article and FAQ renderers, and SEO helpers.","maintainers":[{"name":"lukesproxy","email":"luke@soft.pw"}],"readme":"# @alphablue/astro-site\n\n客户 Astro 网站共用的 AlphaBlue integration、Article／FAQ 静态 Renderer 与 SEO helper。\n套件正式支援 Astro 5、6、7。\n\n客户网站只需直接安装本套件。Content API client 与 Cloudflare edge runtime 分别由\n`@alphablue/astro-site/content`、`@alphablue/astro-site/runtime` 提供稳定入口；底层\npackage 仍保持 framework-neutral，但不需要出现在客户网站的 direct dependencies。\n\n```ts\nimport { createContentClient, money, val } from \"@alphablue/astro-site/content\";\n```\n\n## Article Renderer\n\nRenderer 只输出静态 HTML，不依赖 React、不产生 hydration script，也不接受 raw HTML。\n未知 document version、未知 block 或缺失图片会让 build 明确失败。\n\n```astro\n---\nimport ArticleRenderer from \"@alphablue/astro-site/articles\";\nimport \"@alphablue/astro-site/articles/styles.css\";\n\nconst article = await fetchArticle(Astro.params.slug!);\n---\n\n<ArticleRenderer\n  document={article.body.value}\n  images={article.images}\n  lang={article.body.resolved_locale}\n  class=\"prose\"\n/>\n```\n\n`@alphablue/astro-site/articles` 与\n`@alphablue/astro-site/articles/renderer` 是同一个 component 的公开入口。Props：\n\n| Prop       | 必填 | 说明                                                    |\n| ---------- | ---- | ------------------------------------------------------- |\n| `document` | 是   | `ArticleDocument` 或待 migration／validation 的未知输入 |\n| `images`   | 否   | `Record<imageId, ArticleImage>`；正文引用图片时必须提供 |\n| `lang`     | 否   | 输出容器的实际 resolved locale                          |\n| `class`    | 否   | 附加到 `.ab-article` 容器                               |\n\n结构 CSS 不负责客户品牌。可在页面或 theme 中覆写：\n\n```css\n.ab-article {\n  --ab-article-text: #0f1b2e;\n  --ab-article-muted: #667085;\n  --ab-article-accent: #1f5fd6;\n  --ab-article-success: #18794e;\n  --ab-article-warning: #8a5d00;\n  --ab-article-danger: #b42318;\n  --ab-article-highlight-accent: #eaf2fe;\n  --ab-article-highlight-success: #e8f5ee;\n  --ab-article-highlight-warning: #fff4ce;\n  --ab-article-highlight-danger: #feeceb;\n  --ab-article-border: #dcd1bc;\n}\n```\n\n## Article SEO\n\nSEO helper 从同一份公开 Article contract 产生 canonical、hreflang、Open Graph、\n`BlogPosting` JSON-LD、RSS item 与 sitemap entry：\n\n```ts\nimport {\n  createArticleFeedItem,\n  createArticleSeo,\n  createArticleSitemapEntry,\n  serializeArticleJsonLd,\n} from \"@alphablue/astro-site/articles/seo\";\n\nconst seo = createArticleSeo({\n  article,\n  canonicalUrl: \"https://example.com/articles/store-opening/\",\n  alternates: [\n    { locale: \"en\", url: \"https://example.com/articles/store-opening/\" },\n    { locale: \"th\", url: \"https://example.com/th/articles/store-opening/\" },\n  ],\n  siteName: \"Example Merchant\",\n  publisherUrl: \"https://example.com/\",\n});\n\nconst jsonLd = serializeArticleJsonLd(seo.jsonLd);\nconst feedItem = createArticleFeedItem(article, seo.canonical);\nconst sitemapEntry = createArticleSitemapEntry(\n  article,\n  seo.canonical,\n  seo.alternates,\n);\n```\n\n`serializeArticleJsonLd()` 会处理 inline script 所需的字符 escaping；不要用未经处理的\n`JSON.stringify()` 直接写入页面。\n\n## FAQ Renderer 与 SEO\n\nFAQ Renderer 使用原生 `<details>` / `<summary>` 输出静态 section，不产生 hydration\nscript。question 与 answer 分别带上 Content API 实际解析的语系。以下示例假设客户 repo\n依集成指南集中从 `src/lib/site.ts` 取得 client：\n\n```astro\n---\nimport FaqSection from \"@alphablue/astro-site/faqs\";\nimport \"@alphablue/astro-site/faqs/styles.css\";\nimport {\n  faqPageJsonLd,\n  serializeFaqJsonLd,\n} from \"@alphablue/astro-site/faqs/seo\";\nimport { content, publishedBuildOptions } from \"../lib/site\";\n\nconst locale = \"en\";\nconst published = await content.content(publishedBuildOptions(locale));\nconst visibleFaqs = published.faqs;\nconst faqJsonLd = faqPageJsonLd(visibleFaqs);\n---\n\n<FaqSection faqs={visibleFaqs} heading=\"Frequently asked questions\" />\n{\n  faqJsonLd ? (\n    <script\n      type=\"application/ld+json\"\n      is:inline\n      set:html={serializeFaqJsonLd(faqJsonLd)}\n    />\n  ) : null\n}\n```\n\n`FaqSection` 会忽略 question 或 answer 无法解析的项目；空列表不输出 section。\n`itemAttributes` 可为每个项目附加 Preview Review 或 analytics 的稳定 attributes，Renderer\n本身不依赖这些系统。结构 CSS 可用 `--ab-faq-*` variables 覆写。JSON-LD 应放在页面\n`<head>`，并与实际交给 Renderer 的 array 完全相同；完整 layout、locale、build revision 与\n验证范例见\n[Content API 客户网站集成指南](../../docs/04-products-components/website-portal/content-api-integration-guide.md)。\n\n## Live layer integration\n\n```js\n// astro.config.mjs\nimport { defineConfig } from \"astro/config\";\nimport alphablue from \"@alphablue/astro-site\";\n\nexport default defineConfig({\n  integrations: [alphablue({ siteId: \"0195…\", liveLayer: true })],\n});\n```\n\n| Host            | 生成文件                                             |\n| --------------- | ---------------------------------------------------- |\n| `pages`（默认） | `functions/_middleware.js`                           |\n| `workers`       | `worker/index.js`；仅在不存在时生成 `wrangler.jsonc` |\n\n既有 `wrangler.jsonc` 不会被覆写。旧项目须自行确认 `LIVE_STATE` KV、`SITE_ID`\nvar 与 `run_worker_first`。Cloudflare Pages 的 binding 在项目设置中配置。\n\n| Option      | 默认          | 说明                            |\n| ----------- | ------------- | ------------------------------- |\n| `siteId`    | 必填          | 当前部署所属的 Site             |\n| `liveLayer` | `true`        | `false` 时完全不生成边缘入口    |\n| `host`      | `\"pages\"`     | `\"pages\"` 或 `\"workers\"`        |\n| `widget`    | `true`        | 挂载 Portal 控制的浏览器 widget |\n| `widgetSrc` | AlphaBlue CDN | 覆写 widget URL                 |\n\n`liveLayer: false` 代表纯静态站：没有 Worker invocation、KV read 或额外 request\nlatency；日后开启需要重新 build。\n\n## Preview Review\n\n客户网站仓库只在 Preview build 明确启用审阅桥接。`deploymentTarget` 必须由部署环境\n提供，不应以 hostname 猜测：\n\n```js\n// astro.config.mjs\nimport { defineConfig } from \"astro/config\";\nimport { previewReview } from \"@alphablue/astro-site/preview-review\";\n\nconst isReviewPreview = process.env.AB_DEPLOYMENT_TARGET === \"preview\";\n\nexport default defineConfig({\n  integrations: [\n    previewReview({\n      enabled: isReviewPreview,\n      deploymentTarget: isReviewPreview ? \"preview\" : \"production\",\n      reviewOrigin: process.env.AB_REVIEW_ORIGIN ?? \"http://localhost:4324\",\n      apiOrigin: process.env.AB_API_ORIGIN ?? \"http://localhost:8000\",\n    }),\n  ],\n});\n```\n\nOperator 或 Customer Portal 产生的短效 code 会通过 URL fragment\n`#ab_review=...` 送到 Preview；桥接读取后立即清除 fragment，再由隔离 iframe\n载入 Review Panel。普通 Preview URL 不会读取反馈资料。\n\nProduction build 若同时设置 `enabled: true` 会直接失败，避免把审阅 Runtime 误带到\n正式网站。Review 功能失效时不会阻止网站本身浏览。\n\n对于会长期保留的主要 section 或 interactive element，应提供稳定 id，降低 Layout\n调整后的定位漂移：\n\n```astro\n---\nimport { reviewAttributes } from \"@alphablue/astro-site/preview-review\";\n---\n\n<section {...reviewAttributes(\"home.hero\")}>\n  ...\n</section>\n```\n\n未提供 stable id 时，Runtime 会组合 selector、ancestor path、文字 fingerprint 与元素内\n相对位置；若无法可靠重定位则标记为 `drifted`，而不是猜测位置后进入 Revision Bundle。\n\n## Proposal Primitives\n\nProposal 页面可以使用独立的静态 primitives 表达观点、流程与阶段演进。这些组件不包含客户文案、品牌决定或未来 VD／V1 成果：\n\n```astro\n---\nimport ProposalSection from \"@alphablue/astro-site/proposals/section\";\nimport FlowDiagram from \"@alphablue/astro-site/proposals/flow\";\nimport BranchingWorkflow from \"@alphablue/astro-site/proposals/branching-workflow\";\nimport \"@alphablue/astro-site/proposals/styles.css\";\n---\n\n<ProposalSection title=\"Make the next decision visible\" body=\"Explain what happens now and what evidence unlocks the next investment.\">\n  <FlowDiagram slot=\"visual\" label=\"Example workflow\" nodes={nodes} />\n</ProposalSection>\n```\n\n`FlowDiagram` 节点使用 `id`、`title`、`work` 与 `goal`。页面默认只显示短标题；pointer hover、keyboard focus 或 touch open 后显示工作与目标，\nprint 会展开全部细节。`BranchingWorkflow` 用于两条或多条资料／工作路径在共同处理环节汇合的场景；节点以通用 `details[]` key-value rows\n呈现 owner、input、work、output、goal、exception 或案例需要的其他短字段，不把任何行业语义冻结进 component schema。`LoFiWebsite` 只画中性结构\n示意，必须明确标记为 prototype，不得包装成客户网站截图。\n\n## 兼容与发布 gate\n\n```bash\npnpm --filter @alphablue/astro-site test\npnpm --filter @alphablue/astro-site typecheck\npnpm --filter @alphablue/astro-site build\npnpm --filter @alphablue/astro-site test:astro-matrix\npnpm --dir packages/astro-site pack --pack-destination <temp-dir>\n```\n\nmatrix 会以隔离 consumer 对 Astro 5、6、7 分别执行 component import、\n`astro check` 与静态 build。发布前必须先发布\n`@alphablue/content-model` 与 `@alphablue/site-runtime`，再检查 tarball 的\nmanifest 已把 `workspace:` dependency 改成正式版本。\n\n## License\n\nMIT\n","readmeFilename":"README.md"}