feat(site): loop a faithful copy of the app's recording capsule in the hero

Replace the press-to-play demo and the "see how it works" button with an
example that keeps playing on the right: hold Right Alt, the capsule appears
with live wave bars, elapsed time and the partial transcript, releasing shows
the processing bar, and the cleaned sentence is pasted at the cursor of a
notes window. It cycles through two samples per language.

- Same numbers as apps/desktop recording-tip: 9 bars with cos weights, 100 ms
  updates, 0.5 smoothing, +/-35% jitter, 2-28 px, per-bar colours, 120 px
  progress bar min(95, (1 - 1/(1 + 1.5t)) * 100)%.
- WCAG 2.2.2: a pause button; stops when off screen or the tab is hidden.
  Reduced motion shows one still frame. The animation is aria-hidden with a
  text description for screen readers. Chinese and Japanese transcripts
  appear three characters at a time.
- Add 404.html so unknown paths stop falling back to the landing page, delete
  the duplicate accept-invite.html (/accept-invite/ is canonical) and link it
  straight to /#download, and move the legal pages off the retired orange
  accent (primary button contrast 5.2:1).
This commit is contained in:
Yun Chan 2026-09-26 15:49:08 +09:00
parent dc43884e3e
commit 92978607da
23 changed files with 707 additions and 467 deletions

View file

@ -19,6 +19,11 @@ export interface TitledText {
body: string
}
export interface DemoSample {
raw: string
clean: string
}
export interface FaqItem {
q: string
a: string
@ -62,24 +67,28 @@ export interface Translations {
subtitle: string
hotkeyKey: string
hotkeyAction: string
secondaryCta: string
trust: string
/** 방문자가 Windows가 아닐 때 다운로드 버튼 아래에 보인다. */
windowsOnly: string
}
demo: {
title: string
/** figure 의 접근 가능한 이름 */
label: string
/** 화면 낭독용 설명. 애니메이션 자체는 aria-hidden 이다. */
description: string
note: string
idle: string
listening: string
polishing: string
done: string
windowTitle: string
docLine: string
/** 캡슐의 처리 중 문구 */
processing: string
stateIdle: string
stateListening: string
statePolishing: string
stateDone: string
pause: string
play: string
replay: string
rawLabel: string
cleanLabel: string
sampleRaw: string
sampleClean: string
/** raw 는 띄어쓰기 단위로 한 낱말씩 나타난다. */
samples: [DemoSample, DemoSample]
}
features: {
title: string