Files
heicode-win/website/components/features.tsx
T

115 lines
4.5 KiB
TypeScript

import { FileText, GitBranch, ShieldCheck, Workflow } from "lucide-react";
import type { Lang } from "@/app/page";
const icons = [FileText, GitBranch, Workflow, ShieldCheck];
const copy = {
en: {
eyebrow: "Core abilities",
title: "Four loops Heicode must close",
description:
"From idea, resources, team, and permissions to execution, launch, and maintenance, Heicode turns software delivery into an auditable lifecycle.",
features: [
{
title: "Ideas become development work",
description:
"Users do not need a complete PRD first. Heicode turns natural-language goals into requirement summaries, task drafts, prototype notes, role suggestions, and resource needs.",
},
{
title: "Resource binding and permission assignment",
description:
"Git, SK, project docs, and cloud resources are modeled as Resource Bindings, then assigned to specific sub Agnet roles through Resource Grants.",
},
{
title: "Sub Agnets execute continuously",
description:
"Work is not thrown over the wall once. Agnets keep moving through requirements, design, development, testing, fixes, and deployment.",
},
{
title: "Usage, logs, security, and audit loop",
description:
"Model balance, call logs, resource access, risky approvals, and deployment records return to Heicode. Long-lived secrets never enter Git, Markdown, or logs.",
},
],
},
zh: {
eyebrow: "Core abilities",
title: "Heicode 要闭环的四件事",
description:
"从想法、资源、团队、权限到执行、上线、维护,形成一条可审计的软件生命周期。",
features: [
{
title: "想法转开发任务",
description:
"用户不需要先写完整 PRD。Heicode 会把自然语言目标整理成需求摘要、任务草案、原型描述、角色建议和资源需求。",
},
{
title: "资源绑定和权限分配",
description:
"Git、SK、项目文档和云资源被建模为 Resource Binding,再通过 Resource Grant 分配给具体子 Agnet 角色。",
},
{
title: "子 Agnet 持续执行",
description:
"不是一次性把任务丢出去,而是在需求、设计、开发、测试、修复、部署的子环节中持续调用 Agnet 推进。",
},
{
title: "用量、日志、安全和审计闭环",
description:
"模型余额、调用日志、资源访问、高危审批、部署记录统一回到 Heicode,长期密钥不进入 Git、Markdown 或日志。",
},
],
},
} satisfies Record<Lang, {
eyebrow: string;
title: string;
description: string;
features: Array<{ title: string; description: string }>;
}>;
export function Features({ lang }: { lang: Lang }) {
const t = copy[lang];
return (
<section id="features" className="border-y border-border bg-card/30 py-20 sm:py-28">
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<div className="mx-auto max-w-2xl text-center">
<p className="text-sm font-bold tracking-widest text-primary uppercase">
{t.eyebrow}
</p>
<h2 className="mt-4 text-3xl font-black tracking-tight sm:text-5xl">
{t.title}
</h2>
<p className="mt-4 text-muted-foreground">
{t.description}
</p>
</div>
<div className="mt-14 grid gap-5 sm:grid-cols-2 lg:gap-6">
{t.features.map((feature, index) => {
const Icon = icons[index];
return (
<div
key={feature.title}
className="relative flex gap-6 overflow-hidden rounded-[1.7rem] border border-border bg-background/80 p-6 shadow-sm sm:p-8"
>
<div className="flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl bg-primary/10 text-primary">
<Icon className="h-5 w-5" />
</div>
<div>
<h3 className="text-lg font-semibold">{feature.title}</h3>
<p className="mt-2 text-sm leading-relaxed text-muted-foreground">
{feature.description}
</p>
</div>
<span className="absolute -bottom-4 right-5 text-7xl font-black text-secondary/55">
{String(index + 1).padStart(2, "0")}
</span>
</div>
)})}
</div>
</div>
</section>
);
}