--- /** * Icon.astro — 把原型里的 `` 机械替换为「构建期内联 SVG」。 * 使用 lucide-react,但**不**水合(无 client: 指令)→ Astro 在构建期渲染成静态 , * 零运行时 JS、零第三方 CDN(原型用的是 unpkg.com 的 lucide,已按任务要求去除)。 * 尺寸/描边颜色沿用 website.css 里对 `svg` 的选择器控制,故此处不强加尺寸。 */ import * as Lucide from 'lucide-react'; interface Props { name: string; class?: string; [key: string]: unknown; } const { name, class: className, ...rest } = Astro.props; // kebab-case → PascalCase(lucide-react 导出名) const pascal = name .split('-') .map((s) => s.charAt(0).toUpperCase() + s.slice(1)) .join(''); // 个别图标的兜底别名(lucide 改名历史)。 const ALIASES: Record = { CheckCircle: 'CircleCheckBig', CircleHelp: 'CircleHelp', }; const lib = Lucide as unknown as Record; const Comp = lib[pascal] ?? lib[ALIASES[pascal] ?? ''] ?? null; if (!Comp) { throw new Error(`[Icon] 未知 lucide 图标: "${name}" (尝试 ${pascal})`); } ---