Wave 3 of the 2026-09-28 design overhaul.
- Esc (no modifiers) cancels an in-progress dictation, recording or
processing: VoiceModeService.requestEscape() queues the dead 'escape'
action. Clicking the capsule cancels only while recording, so a stray
click during processing no longer throws the text away.
- Errors show in the user's language: bootstrap now passes error.code to
the tip (the translated branch never ran), and one core classifier
(voice-error-message) feeds both the tip and the main-window alert.
- Capsule: bars stay flat without input (no fake "alive" wobble before the
mic opens), an indeterminate bar replaces the made-up percentage, the
partial transcript stays visible while processing, an Esc hint, and a
brief "Inserted" state so success is visible.
- All six popups share popups/_shared (Pretendard, one panel radius,
selection, kbd hints, reduced motion). History/command popups get
titles, listbox roles and window sizes from popup-list-geometry (empty
states were clipped); the command popup's "0" key is registered;
result popup explains why it appeared and can be closed; captions keep
a theme-independent dark backing on purpose.
- Popup themes follow the OS when set to system and the document lang
follows the app language.
- Site hero demo mirrors the new capsule (done state, indeterminate bar,
Esc hint; 10 locales).
Popup pages loaded their scripts as classic <script src> tags, which the
renderer build never bundles, so an installed app rendered only the static
markup: the recording tip stayed at 0:00 with no wave bars and live captions
showed nothing.
- declare popup scripts as modules so the build emits them, and fail
packaging when a renderer page references an asset that was never produced
- hold popup IPC until the renderer has loaded and re-assert visibility on
every show, so a popup hidden once still appears next time
- surface popup renderer console and load failures in the main log
💘 Generated with Crush
Assisted-by: Crush:deepseek-v4.1-flash
- npm workspaces 루트 (apps/*, packages/*) 세팅
- V1 전체를 apps/desktop/으로 git mv (src, resources, tests, sidecar,
scripts, electron.vite.config.ts, electron-builder.yml, vitest.config.ts,
tsconfig.node.json, tsconfig.web.json)
- apps/desktop/package.json 신규 (name=@d3ro/desktop)
- productName: 'd3ro-voice' 명시 — app.getName()을 고정하여 userData 경로
%APPDATA%\d3ro-voice\ 그대로 유지 (기존 DB/설정 연속성 보장)
- 루트 package.json을 workspace 루트로 재구성, 공통 devDep만 유지
(typescript, eslint, prettier)
- turbo.json, tsconfig.base.json 추가 (Turborepo 자체 설치는 별도 sub-phase)
- memory/project_status.md 생성 (규칙 13)
검증:
- npm run typecheck 통과
- npm run build 통과 (electron-vite main+preload+renderer)
- npm run dev 실제 실행 → DB/핫키/Ollama 자동 실행 모두 정상
2026-04-08 14:04:41 +09:00
Renamed from src/renderer/popups/history-popup/index.html (Browse further)