feat(web): 官网 ui_kits/website → Astro 纯静态 SSG 迁移 (tsk_acMYQ-Z-EIF_)
新建 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>
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* SignupForm.jsx — Hero 内联邮箱注册(演示,React island)。迁自原型 .signup + site.js __signup。
|
||||
* 注意(铁律 10):这不是支付表单;仅演示「发送验证码」交互,真实实现由后端 auth 接管。
|
||||
*/
|
||||
import { useState } from 'react';
|
||||
import { Mail, CheckCircle, Download } from 'lucide-react';
|
||||
|
||||
export default function SignupForm({ ph, btn, ok, hint, dl }) {
|
||||
const [done, setDone] = useState(false);
|
||||
|
||||
const onSubmit = (e) => {
|
||||
e.preventDefault();
|
||||
const email = e.currentTarget.elements['su-email'];
|
||||
if (!/\S+@\S+\.\S+/.test(email.value)) {
|
||||
email.focus();
|
||||
return;
|
||||
}
|
||||
setDone(true);
|
||||
};
|
||||
|
||||
return (
|
||||
<form class="signup" id="signup" onSubmit={onSubmit}>
|
||||
<div class="su-row">
|
||||
<div class="su-field">
|
||||
<Mail />
|
||||
<input type="email" id="su-email" name="su-email" placeholder={ph} required />
|
||||
</div>
|
||||
<button class="btn btn-primary btn-lg su-btn" type="submit">
|
||||
<span>{btn}</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="su-ok" id="su-ok" hidden={!done}>
|
||||
<CheckCircle />
|
||||
<span>{ok}</span>
|
||||
</div>
|
||||
<div class="su-hint">
|
||||
<span>{hint}</span>
|
||||
<a class="su-dl" href="#download">
|
||||
<Download />
|
||||
<span>{dl}</span>
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user