Skip to content

Commit 6c6c650

Browse files
committed
docs: add deploy modes and comparison sections with new components
1 parent 38c4559 commit 6c6c650

3 files changed

Lines changed: 234 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Check, X } from 'lucide-react';
2+
import { cn } from '@/lib/utils';
3+
4+
interface ComparisonTableProps {
5+
columns: { criterion: string; saas: string; objectos: string };
6+
rows: Array<{ criterion: string; saas: string; objectos: string }>;
7+
className?: string;
8+
}
9+
10+
export function ComparisonTable({ columns, rows, className }: ComparisonTableProps) {
11+
return (
12+
<div className={cn('w-full overflow-x-auto rounded-xl border border-border bg-card/40 backdrop-blur-sm', className)}>
13+
<table className="w-full text-left text-sm">
14+
<thead>
15+
<tr className="border-b border-border bg-muted/40">
16+
<th className="px-6 py-4 font-semibold text-foreground/70">{columns.criterion}</th>
17+
<th className="px-6 py-4 font-semibold text-foreground/70">{columns.saas}</th>
18+
<th className="px-6 py-4 font-semibold text-primary">{columns.objectos}</th>
19+
</tr>
20+
</thead>
21+
<tbody>
22+
{rows.map((row, i) => (
23+
<tr key={i} className="border-b border-border/40 last:border-0 hover:bg-muted/20 transition-colors">
24+
<td className="px-6 py-4 font-medium text-foreground/90">{row.criterion}</td>
25+
<td className="px-6 py-4 text-foreground/60">
26+
<span className="inline-flex items-center gap-2">
27+
<X className="h-4 w-4 text-red-500/70 shrink-0" />
28+
{row.saas}
29+
</span>
30+
</td>
31+
<td className="px-6 py-4 text-foreground">
32+
<span className="inline-flex items-center gap-2">
33+
<Check className="h-4 w-4 text-green-500 shrink-0" />
34+
{row.objectos}
35+
</span>
36+
</td>
37+
</tr>
38+
))}
39+
</tbody>
40+
</table>
41+
</div>
42+
);
43+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import Link from 'next/link';
2+
import { ArrowRight } from 'lucide-react';
3+
import { Card } from '@/components/ui/card';
4+
import { cn } from '@/lib/utils';
5+
6+
interface DeployModeCardProps {
7+
icon: React.ReactNode;
8+
title: string;
9+
tagline: string;
10+
description: string;
11+
href: string;
12+
cta: string;
13+
className?: string;
14+
}
15+
16+
export function DeployModeCard({ icon, title, tagline, description, href, cta, className }: DeployModeCardProps) {
17+
return (
18+
<Link href={href} className="block h-full group">
19+
<Card className={cn(
20+
"flex flex-col items-start p-7 h-full border-border/60 hover:border-primary/40 hover:shadow-lg hover:shadow-primary/5 transition-all duration-300",
21+
className
22+
)}>
23+
<div className="mb-5 inline-flex items-center justify-center rounded-lg bg-primary/10 p-3 text-primary transition-transform duration-300 group-hover:scale-110">
24+
{icon}
25+
</div>
26+
<div className="text-xs font-mono uppercase tracking-wider text-primary/70 mb-2">
27+
{tagline}
28+
</div>
29+
<h3 className="text-xl font-bold mb-3 group-hover:text-primary transition-colors">
30+
{title}
31+
</h3>
32+
<p className="text-foreground/70 text-sm leading-relaxed mb-6 flex-grow">
33+
{description}
34+
</p>
35+
<div className="flex items-center gap-2 text-sm font-semibold text-primary mt-auto group-hover:gap-3 transition-all duration-300">
36+
<span>{cta}</span>
37+
<ArrowRight className="h-4 w-4 transition-transform duration-300 group-hover:translate-x-1" />
38+
</div>
39+
</Card>
40+
</Link>
41+
);
42+
}

apps/docs/lib/homepage-i18n.ts

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,55 @@ export interface HomepageTranslations {
6767
};
6868
};
6969

70+
// Deploy Modes Section
71+
deployModes: {
72+
heading: string;
73+
subheading: string;
74+
docker: {
75+
title: string;
76+
tagline: string;
77+
description: string;
78+
href: string;
79+
cta: string;
80+
};
81+
kubernetes: {
82+
title: string;
83+
tagline: string;
84+
description: string;
85+
href: string;
86+
cta: string;
87+
};
88+
airGapped: {
89+
title: string;
90+
tagline: string;
91+
description: string;
92+
href: string;
93+
cta: string;
94+
};
95+
};
96+
97+
// Comparison Section
98+
comparison: {
99+
heading: string;
100+
subheading: string;
101+
columns: {
102+
criterion: string;
103+
saas: string;
104+
objectos: string;
105+
};
106+
rows: Array<{ criterion: string; saas: string; objectos: string }>;
107+
};
108+
109+
// Bottom CTA
110+
bottomCta: {
111+
heading: string;
112+
subheading: string;
113+
primary: string;
114+
primaryHref: string;
115+
secondary: string;
116+
secondaryHref: string;
117+
};
118+
70119
// Personas Section
71120
personas: {
72121
heading: string;
@@ -163,6 +212,56 @@ export const en: HomepageTranslations = {
163212
action: 'Architecture Overview',
164213
},
165214
},
215+
deployModes: {
216+
heading: 'Three Ways to Run It',
217+
subheading: 'Same artifact, same behavior. Pick the shape that matches your infrastructure.',
218+
docker: {
219+
title: 'Docker',
220+
tagline: 'Single host, single command',
221+
description: 'One container against your own database. Ideal for evaluation, internal tools, and small-team deployments.',
222+
href: '/docs/deploy/docker',
223+
cta: 'Docker guide',
224+
},
225+
kubernetes: {
226+
title: 'Kubernetes',
227+
tagline: 'Production HA',
228+
description: 'Deployment + Service + PersistentVolumeClaim, with secrets and config from the mechanisms you already use. Helm chart included.',
229+
href: '/docs/deploy/kubernetes',
230+
cta: 'Kubernetes guide',
231+
},
232+
airGapped: {
233+
title: 'Air-Gapped',
234+
tagline: 'No internet egress',
235+
description: 'Ship a release bundle into a network with no public connectivity. ObjectOS reads its artifact from disk and never calls home.',
236+
href: '/docs/deploy/air-gapped',
237+
cta: 'Air-gapped guide',
238+
},
239+
},
240+
comparison: {
241+
heading: 'ObjectOS vs. Hosted SaaS',
242+
subheading: 'For teams that cannot — or will not — put customer data into someone else’s cloud.',
243+
columns: {
244+
criterion: '',
245+
saas: 'Hosted SaaS',
246+
objectos: 'ObjectOS',
247+
},
248+
rows: [
249+
{ criterion: 'Where data lives', saas: 'Vendor cloud', objectos: 'Your infrastructure' },
250+
{ criterion: 'Network egress required', saas: 'Always', objectos: 'Optional / none' },
251+
{ criterion: 'Identity provider', saas: 'Vendor-controlled', objectos: 'Your SSO / OIDC / SAML' },
252+
{ criterion: 'Audit & backup target', saas: 'Vendor storage', objectos: 'Your storage' },
253+
{ criterion: 'Failure radius', saas: 'Vendor outage', objectos: 'Your operations' },
254+
{ criterion: 'Upgrade cadence', saas: 'Forced', objectos: 'You decide' },
255+
],
256+
},
257+
bottomCta: {
258+
heading: 'Run it where your data already lives.',
259+
subheading: 'A single artifact, the same behavior everywhere — from a laptop to an air-gapped data center.',
260+
primary: 'Quickstart',
261+
primaryHref: '/docs/quickstart',
262+
secondary: 'Architecture',
263+
secondaryHref: '/docs/architecture',
264+
},
166265
};
167266

168267
/**
@@ -240,6 +339,56 @@ export const cn: HomepageTranslations = {
240339
action: '架构总览',
241340
},
242341
},
342+
deployModes: {
343+
heading: '三种部署形态',
344+
subheading: '同一个发布包,同一种行为。挑一种贴合你基础设施的方式即可。',
345+
docker: {
346+
title: 'Docker',
347+
tagline: '单机单条命令',
348+
description: '一个容器对接你自己的数据库。适合评估、内部工具与小团队部署。',
349+
href: '/docs/deploy/docker',
350+
cta: 'Docker 指南',
351+
},
352+
kubernetes: {
353+
title: 'Kubernetes',
354+
tagline: '生产级高可用',
355+
description: 'Deployment + Service + PersistentVolumeClaim,密钥和配置来自你已经在用的机制。提供 Helm Chart。',
356+
href: '/docs/deploy/kubernetes',
357+
cta: 'Kubernetes 指南',
358+
},
359+
airGapped: {
360+
title: '完全离线',
361+
tagline: '无公网出口',
362+
description: '把发布包送进完全离线的网络。ObjectOS 从本地文件读取工件,不向任何外部服务发起调用。',
363+
href: '/docs/deploy/air-gapped',
364+
cta: '离线部署指南',
365+
},
366+
},
367+
comparison: {
368+
heading: 'ObjectOS 与托管 SaaS 的对比',
369+
subheading: '面向那些不能 —— 或不愿 —— 把客户数据放到别人云上的团队。',
370+
columns: {
371+
criterion: '',
372+
saas: '托管 SaaS',
373+
objectos: 'ObjectOS',
374+
},
375+
rows: [
376+
{ criterion: '数据存放位置', saas: '厂商云', objectos: '你的基础设施' },
377+
{ criterion: '是否需要公网出口', saas: '始终需要', objectos: '可选 / 完全不需要' },
378+
{ criterion: '身份提供方', saas: '由厂商控制', objectos: '你的 SSO / OIDC / SAML' },
379+
{ criterion: '审计与备份目标', saas: '厂商存储', objectos: '你自己的存储' },
380+
{ criterion: '故障影响范围', saas: '厂商宕机', objectos: '你自己的运维' },
381+
{ criterion: '升级节奏', saas: '强制升级', objectos: '由你决定' },
382+
],
383+
},
384+
bottomCta: {
385+
heading: '让应用跑在你数据已经在的地方。',
386+
subheading: '一份发布包,在笔记本和完全离线的数据中心里表现一致。',
387+
primary: '快速开始',
388+
primaryHref: '/docs/quickstart',
389+
secondary: '架构总览',
390+
secondaryHref: '/docs/architecture',
391+
},
243392
};
244393

245394
/**

0 commit comments

Comments
 (0)