- Vite + React 19 + Tailwind CSS - 4가지 디자인 레퍼런스 통합 (CRT 스크린, 크로스헤어, 노이즈, 인스트루먼트) - 섹션 9개: Hero, Features, HowItWorks, Privacy, Pricing, FAQ, CTA, Header, Footer - 재사용 컴포넌트 8개 (Badge, Container, InstrumentCard, GlowButton 등) - i18n 10개 국어 (en/ko/ja/zh/es/fr/de/pt/ru/vi) - GitHub Pages 자동 배포 워크플로우
112 lines
5.3 KiB
TypeScript
112 lines
5.3 KiB
TypeScript
import { SectionHeader } from '../components/SectionHeader'
|
|
import { Crosshair } from '../components/Crosshair'
|
|
import { Container } from '../components/Container'
|
|
import { Led } from '../components/Led'
|
|
import { WaveBars } from '../components/WaveBars'
|
|
import { useI18n } from '../i18n'
|
|
|
|
export function HowItWorks() {
|
|
const { t } = useI18n()
|
|
|
|
return (
|
|
<section id="pipeline" className="relative py-24 md:py-32">
|
|
<div className="absolute inset-0 bg-gradient-to-b from-transparent via-surface-800/40 to-transparent pointer-events-none" />
|
|
|
|
<Container className="relative">
|
|
<SectionHeader
|
|
index={t.pipeline.index}
|
|
title={t.pipeline.title}
|
|
subtitle={t.pipeline.subtitle}
|
|
/>
|
|
|
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-16 items-start">
|
|
{/* Left: visual panel */}
|
|
<Crosshair className="order-2 lg:order-1">
|
|
<div className="crt-screen rounded-card p-6 md:p-8 aspect-[4/3] flex flex-col justify-between">
|
|
<div className="relative z-10 flex items-center justify-between mb-6">
|
|
<span className="font-mono text-nano uppercase tracking-widest text-brand-amber/60">
|
|
{t.pipeline.panelTitle}
|
|
</span>
|
|
<div className="flex items-center gap-2">
|
|
<Led color="green" />
|
|
<span className="font-mono text-nano uppercase tracking-widest text-neutral-500">{t.pipeline.panelActive}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="relative z-10 flex-1 flex flex-col justify-center space-y-4">
|
|
{/* Simulated terminal output */}
|
|
<div className="font-mono text-xs text-neutral-500 leading-relaxed space-y-2">
|
|
<div className="flex items-center gap-2">
|
|
<Led color="green" size="sm" />
|
|
<span className="text-emerald-400/70">{t.pipeline.sttReady}</span>
|
|
<span className="text-neutral-600">faster-whisper base</span>
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
<Led color="green" size="sm" />
|
|
<span className="text-emerald-400/70">{t.pipeline.llmConnected}</span>
|
|
<span className="text-neutral-600">qwen3:4b @ localhost:11434</span>
|
|
</div>
|
|
<div className="h-px bg-white/[0.04] my-3" />
|
|
<div className="flex items-start gap-2">
|
|
<Led color="amber" size="sm" pulse className="mt-1" />
|
|
<div>
|
|
<span className="text-brand-amber/50 block mb-1">{t.pipeline.transcription}</span>
|
|
<span className="text-neutral-300">"{t.pipeline.sampleInput}"</span>
|
|
</div>
|
|
</div>
|
|
<div className="flex items-start gap-2">
|
|
<Led color="green" size="sm" className="mt-1" />
|
|
<div>
|
|
<span className="text-emerald-400/50 block mb-1">{t.pipeline.aiPolish}</span>
|
|
<span className="text-neutral-300">"{t.pipeline.sampleOutput}"</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="relative z-10 flex items-center justify-between pt-4 border-t border-white/[0.04]">
|
|
<WaveBars className="h-6" />
|
|
<span className="font-mono text-nano text-neutral-600">{t.pipeline.panelLatency}</span>
|
|
</div>
|
|
</div>
|
|
</Crosshair>
|
|
|
|
{/* Right: numbered steps */}
|
|
<div className="order-1 lg:order-2 space-y-1">
|
|
{t.pipeline.steps.map((step, i) => (
|
|
<div
|
|
key={i}
|
|
className="group relative flex gap-5 p-5 rounded-card border border-transparent hover:border-white/[0.04] hover:bg-surface-700/30 transition-all"
|
|
>
|
|
{/* Number */}
|
|
<div className="flex-shrink-0 w-12 h-12 rounded-card bg-surface-600 border border-white/[0.06] flex items-center justify-center">
|
|
<span className="font-mono text-lg font-bold text-brand-amber">{String(i + 1).padStart(2, '0')}</span>
|
|
</div>
|
|
|
|
<div className="flex-1 min-w-0">
|
|
<span className="font-mono text-nano uppercase tracking-widest text-brand-amber/60 block mb-1">
|
|
{step.label}
|
|
</span>
|
|
<h3 className="font-display text-lg font-semibold text-neutral-100 mb-1.5">
|
|
{step.title}
|
|
</h3>
|
|
<p className="text-sm text-neutral-400 leading-relaxed mb-2">
|
|
{step.description}
|
|
</p>
|
|
<span className="inline-block font-mono text-nano text-neutral-600 bg-surface-600/60 px-2.5 py-1 rounded-sm border border-white/[0.03]">
|
|
{step.detail}
|
|
</span>
|
|
</div>
|
|
|
|
{/* Connector */}
|
|
{i < t.pipeline.steps.length - 1 && (
|
|
<div className="absolute left-[42px] top-[72px] w-px h-5 bg-gradient-to-b from-surface-300 to-transparent hidden lg:block" />
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</Container>
|
|
</section>
|
|
)
|
|
}
|