4df8dc6f87
新建 web/website/(Astro 零 SSR): - 组件迁移:交互块保留 .jsx 经 @astrojs/react(Header/AnnouncementBar/SignupForm/PricingPlans),纯展示块转 .astro 去运行时 JS;像素以原型为基准。 - 令牌同源:build-tokens.mjs 从 design/colors_and_type.css 生成 tokens.gen.css,仅剔除第三方 Google Fonts @import,数值不改。 - 字体自托管:@fontsource(Sora/Manrope/Noto Sans SC/JetBrains Mono),无第三方 CDN。 - 图标:Lucide 构建期内联 SVG(替代 unpkg CDN),零运行时、零 CDN。 - i18n:/(zh)与 /en/(en)双路由单显,语言切换组件;文案沿用 ui_kits 脱敏文案。 - 安全:public/_headers 严格 CSP(全 self + 自托管资源 + 内联片段 sha256,无 unsafe-inline)+ HSTS;无支付表单。 - CI:.gitea/workflows/website.yml 构建(红线扫描+lint+CSP 哈希)→ 同时发布 Cloudflare Pages 主站与镜像。 - 灾备:README 写明干净环境 npm ci && npm run build 可直接部署到任意静态托管;dist 指纹确定性,主站镜像一致。 测试:npm run lint(0 error)/ npm test(build+CSP 哈希注入+红线扫描 0 命中)/ 两次干净构建 dist 指纹一致。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
33 lines
1.6 KiB
Plaintext
33 lines
1.6 KiB
Plaintext
---
|
||
/**
|
||
* Brand.astro — 品牌母题「行走穿山甲」内联 SVG(铁律 11:直接用既有矢量,不另绘)。
|
||
* 逐字取自 design/ui_kits/website/index.html 的内联 mark。
|
||
* variant: header(clay 实心 + 浅色鳞纹)/ footer(浅色实心 + clay 圆点)。
|
||
*/
|
||
interface Props {
|
||
variant?: 'header' | 'footer';
|
||
size?: number;
|
||
}
|
||
const { variant = 'header', size = 30 } = Astro.props;
|
||
---
|
||
{variant === 'header' ? (
|
||
<svg width={size} height={size} viewBox="0 0 96 96" fill="none" aria-hidden="true">
|
||
<g transform="translate(96,0) scale(-1,1)">
|
||
<path d="M16 59 Q17 51 26 50 Q34 31 45 30 Q55 30 62 37 Q69 41 75 45 Q85 49 89 44 Q92 50 84 52 Q75 53 67 53 Q66 62 60 62 L56 62 Q54 55 49 55 Q47 62 37 62 L33 62 Q31 56 26 56 Q20 59 16 59 Z" fill="#B96A3D"></path>
|
||
<g stroke="#FAF3ED" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.85">
|
||
<path d="M26 50 Q34 43 42 50"></path>
|
||
<path d="M36 48 Q44 41 52 48"></path>
|
||
<path d="M46 48 Q54 41 62 49"></path>
|
||
</g>
|
||
<circle cx="23" cy="55" r="2.2" fill="#FAF3ED"></circle>
|
||
</g>
|
||
</svg>
|
||
) : (
|
||
<svg width={size} height={size} viewBox="0 0 96 96" fill="none" aria-hidden="true">
|
||
<g transform="translate(96,0) scale(-1,1)">
|
||
<path d="M16 59 Q17 51 26 50 Q34 31 45 30 Q55 30 62 37 Q69 41 75 45 Q85 49 89 44 Q92 50 84 52 Q75 53 67 53 Q66 62 60 62 L56 62 Q54 55 49 55 Q47 62 37 62 L33 62 Q31 56 26 56 Q20 59 16 59 Z" fill="#F4EFE8"></path>
|
||
<circle cx="23" cy="55" r="2.2" fill="#9E5630"></circle>
|
||
</g>
|
||
</svg>
|
||
)}
|