@@ -591,6 +591,122 @@ Comparison vs Phase 1 (legacy) and Phase 2 (streaming) digital averages:
591591- ** Signing/notarization** : still NOT done (no Apple Developer identity).
592592 Same BLOCKED status as M10 Phase 3.
593593
594+ ### M11 UI — shadcn-style design-system revamp (2026-08-31, complete)
595+
596+ - ** Scope** : UI/design-system only. STT, Translation, TTS, Audio Output,
597+ SessionManager, IPC, telemetry, provider logic, audio routing, BlackHole
598+ detection, and meeting functionality are ** unchanged** . ` App.tsx ` and
599+ ` packages/shared/index.ts ` were not modified — every panel's prop contract
600+ is preserved, so no data-flow wiring changed.
601+ - ** Design tokens** (` src/renderer/styles/App.css ` , file replaced): ` :root `
602+ CSS-variable tokens — ` --bg ` , ` --panel ` , ` --surface ` , ` --border ` , ` --fg* ` ,
603+ semantic colors (` --success/warning/destructive/info/brand ` ), ` --radius-* `
604+ (4/6/8/10), spacing scale ` --sp-* ` (4/6/8/12/16), ` --font-sans ` ,
605+ ` --font-urdu ` , type scale ` --text-xs/sm/base/lg ` . Layout helpers
606+ (` .stack/.row/.split/.grow ` ), ui primitive classes (` .btn*/.card*/.badge* `
607+ ` .label/.separator*/.select*/.alert*/.progress*/.textbox* ` ), and
608+ screen-specific classes (` .setup-*/.meeting-stage/.error-text ` ). Removed all
609+ hard-coded hex colors and the 8/10/12px radius inconsistency.
610+ - ** Hand-rolled shadcn-style primitives** (` src/renderer/components/ui/ ` ):
611+ ` button.tsx ` (variants ` default/primary/success/destructive/outline/ghost ` ,
612+ sizes ` sm/md/lg ` ), ` card.tsx ` , ` badge.tsx ` (+` dot ` ), ` label.tsx ` ,
613+ ` select.tsx ` (` Select/SelectItem ` ), ` separator.tsx ` (h/v),
614+ ` alert.tsx ` (variants + optional ` title ` ), ` progress.tsx `
615+ (` role=progressbar ` + ` aria-* ` ). ** Zero new runtime dependencies** — no
616+ Tailwind/Radix/shadcn-CLI per the minimal-dependency constraint; the
617+ primitives share the shadcn component API/variants but are plain CSS + TSX
618+ with CSS-variable tokens.
619+ - ** Onboarding redesigned** (` SetupPanel.tsx ` ): compact "Get Ready" card —
620+ three rows (Microphone, Audio Output, BlackHole), each with a step icon,
621+ status Badge (` Ready ` /` Action required ` /` Checking… ` ), detail text, and
622+ inline actions; Separators between rows; a "Ready — Press Start Meeting
623+ below." banner (success) when all three pass, or a pending banner
624+ ("Complete the required setup") otherwise. Same ` setupState.ts ` logic, no
625+ data changes.
626+ - ** Existing panels rebuilt** into compact shadcn-style cards:
627+ - ` HomeScreen.tsx ` (rewritten): header (app title + session status Badge
628+ dot), Get Ready card, Meeting Mode card (4 stage Badges STT/Translate/
629+ TTS/Audio + large Start/Stop Meeting button), Separator, then Translation,
630+ Microphone, Text-to-Speech, Audio Output, Speech Recognition cards, then
631+ Pipeline Performance (dev-gated by ` PIPELINE_DEBUG ` ).
632+ - ` MicrophonePanel.tsx ` : device Select, Input Level (Progress bar),
633+ Start/Stop, warning/destructive Alerts for no-device/denied permission.
634+ - ` SttPanel.tsx ` (now Speech Recognition only): Urdu RTL transcript textbox,
635+ provider + status Badges, Start/Stop Listening — monolith split.
636+ - ` TranslationPanel.tsx ` , ` TtsPanel.tsx ` , ` AudioOutputPanel.tsx ` (new):
637+ single-purpose compact cards split out of the old ` SttPanel ` /home.
638+ - ` AudioLevelMeter.tsx ` : uses Progress.
639+ - ` PipelinePanel.tsx ` : Card/Badge + inline token styles.
640+ - Dead-but-consistent legacy kept up to date: ` StatusBar.tsx ` ,
641+ ` SubtitleDisplay.tsx ` (fixed missing Card import),
642+ ` LiveTranslationScreen.tsx ` .
643+ - ** Accessibility** : ` role=progressbar ` , ` role=alert ` , ` aria-* ` on controls,
644+ keyboard focus states, semantic labels/contrast.
645+ - ** Functional regression verified** (CDP against dev + packaged app): all
646+ selects (setup output, mic, output) populated; Get Ready → "Ready — Press
647+ Start Meeting below."; Start Meeting → session Active, button → Stop
648+ Meeting, header Badge → Active; ×3 start/stop cycles all return to Ready.
649+ Zero console errors/exceptions on reload. App renders from ` app.asar `
650+ identically.
651+
652+ ### M11 follow-up — Migrate to real shadcn/ui + Tailwind CSS (2026-09-01, complete)
653+
654+ - ** Scope** : UI/design-system migration only. Replaced the previous hand-rolled
655+ plain-CSS shadcn-style implementation with the actual shadcn/ui + Tailwind
656+ CSS foundation. The M11 UX structure, component split, compact layout, and
657+ functional wiring are all preserved — no redesign, no business-logic change
658+ (STT/Translation/TTS/audio-output providers, SessionManager, IPC, mic
659+ permission, BlackHole detection, telemetry, meeting start/stop, audio
660+ routing, ` PIPELINE_DEBUG ` all untouched; ` src/main/* ` , ` src/preload/* ` ,
661+ ` packages/shared/index.ts ` unchanged).
662+ - ** Tailwind integration** : ` tailwind.config.js ` added (Tailwind v3, class dark
663+ mode, zinc/neutral theme tokens, ` @/ ` content scan). ` esbuild.config.js ` adds
664+ a Tailwind CLI pre-build that compiles ` styles/globals.css ` →
665+ ` dist/renderer/tailwind.css ` , plus a ` @/ ` alias. ` index.html ` now links
666+ ` tailwind.css ` (removed ` bundle.css ` ; App.tsx no longer imports CSS). Main/
667+ preload/renderer esbuild bundling unchanged — no Vite, no new framework.
668+ - ** Real shadcn/ui components** (` src/renderer/components/ui/ ` ): ` button.tsx `
669+ (cva + Radix Slot), ` card.tsx ` , ` badge.tsx ` (cva + semantic variants
670+ success/warning/info/muted + ` dot ` ), ` select.tsx ` (Radix Select), ` label.tsx `
671+ (Radix Label), ` separator.tsx ` (Radix Separator), ` alert.tsx ` (cva +
672+ AlertTitle/AlertDescription + warning/success), ` progress.tsx ` (Radix
673+ Progress), ` dropdown-menu.tsx ` (Radix DropdownMenu); ` lib/utils.ts ` ` cn() `
674+ (clsx + tailwind-merge). ` @/ ` alias → ` src/renderer ` in ` tsconfig.json ` +
675+ esbuild.
676+ - ** Theme system** (` components/theme-provider.tsx ` , ` theme-selector.tsx ` ):
677+ shadcn CSS-variable token model in ` globals.css ` (` :root ` light + ` .dark `
678+ zinc/neutral palette; semantic background/foreground/card/popover/primary/
679+ secondary/muted/accent/destructive/border/input/ring; ` --radius ` ). No
680+ hard-coded colors scattered in components. Theme toggle is the standard shadcn
681+ mode-toggle: icon Button (Sun/Moon) + DropdownMenu → Light/Dark/System.
682+ Persists via ` localStorage["ui-theme"] ` ; System follows
683+ ` prefers-color-scheme ` reactively via ` matchMedia ` .
684+ - ** Components migrated** to Tailwind utilities (zero custom CSS classes):
685+ HomeScreen, SetupPanel, MicrophonePanel, SttPanel, TranslationPanel,
686+ TtsPanel, AudioOutputPanel, PipelinePanel, AudioLevelMeter. Panels now use
687+ Radix Select (was native ` <select> ` ). Compact/neutral/technical aesthetic
688+ preserved (h-8 controls, 13px titles, no gradients/glass/excess shadows).
689+ - ** Obsolete implementation removed** : deleted ` styles/App.css ` and the dead
690+ legacy stubs ` StatusBar.tsx ` , ` SubtitleDisplay.tsx ` , `LiveTranslationScreen
691+ .tsx` ; removed ` import "./styles/App.css"` from App.tsx. Only app-specific
692+ CSS remains in ` globals.css ` (Urdu RTL/Nastaliq transcript ` .textbox-urdu ` ,
693+ thin scrollbars). One UI system remains.
694+ - ** Dependencies added** : Tailwind v3 (dev); ` class-variance-authority ` ,
695+ ` clsx ` , ` tailwind-merge ` , ` tailwindcss-animate ` , `@radix-ui/react-slot/select/
696+ label/separator/progress/dropdown-menu` , ` lucide-react`. Removed redundant
697+ root ` postcss ` /` autoprefixer ` . No UI framework, no animation/state libs, no
698+ build-tooling migration.
699+ - ** Accessibility** kept: ` role=progressbar ` /` role=alert ` /` aria-* ` ,
700+ focus-visible rings, Radix-managed keyboard/interaction for menus & selects.
701+ - ** Validation** : ` npm run type-check ` clean; ` npm test ` 60/60; ` npm run build `
702+ OK (outputs ` bundle.js ` + ` tailwind.css ` + ` index.html ` ); `npm run
703+ package: dir ` OK and ` app.asar` contains all three renderer assets. Packaged
704+ app CDP-verified (from ` app.asar ` ): all 7 panels render; theme toggle opens
705+ menu; Light (white) / Dark (zinc-950) / System (follows OS) all switch and
706+ persist (` ui-theme ` ) across app restart; mic & output Radix selects enumerate
707+ devices (incl. BlackHole) and fire onSelect; Start/Stop Meeting 2-cycle
708+ returns Ready; zero console errors on reload + interaction.
709+
594710## What is NOT implemented (intentionally)
595711
596712Meeting-app integration, authentication, database, backend server, Python.
@@ -600,9 +716,10 @@ cross-platform ready; not exercised in M10 Phase 3).
600716
601717## Next task
602718
603- M10 Phase 3 (production packaging & macOS distribution) and M10 Phase 4
604- (non-technical install + first-launch onboarding) are complete and documented
605- above. M10 is fully complete — do not start M11.
719+ M10 Phase 3/4 (production packaging & macOS distribution + non-technical
720+ onboarding), M11 (UI design-system revamp), and the M11 follow-up (real
721+ shadcn/ui + Tailwind migration) are complete and documented. M10, M11, and the
722+ M11 follow-up are fully complete — do not start M12.
606723Remaining (manual, outside repo code):
6077241 . ** upload ` docs/demo/demo-v1.0.0.mp4 ` as a v1.0.0 Release asset** ,
6087252 . ** sign/notarize + release the built app** when Apple Developer credentials
@@ -630,12 +747,15 @@ src/main/ipc/{audio,audio-output,session,stt,translation,tts,system}.ts
630747src/preload/index.ts
631748src/renderer/{App.tsx,index.tsx,index.html}
632749src/renderer/pages/HomeScreen.tsx
633- src/renderer/components/{MicrophonePanel,AudioLevelMeter,SttPanel,SetupPanel}.tsx
634- src/renderer/components/{SubtitleDisplay,StatusBar}.tsx
635- src/renderer/pages/LiveTranslationScreen.tsx
750+ src/renderer/lib/utils.ts
751+ src/renderer/components/ui/{button,card,badge,label,select,separator,alert,progress,dropdown-menu}.tsx
752+ src/renderer/components/{theme-provider,theme-selector}.tsx
753+ src/renderer/components/{MicrophonePanel,AudioLevelMeter,SetupPanel}.tsx
754+ src/renderer/components/{TranslationPanel,TtsPanel,AudioOutputPanel}.tsx
755+ src/renderer/components/{SttPanel,PipelinePanel}.tsx
636756src/renderer/setup/{setupState,useSetup}.ts
637757src/renderer/services/{useMicrophone,useSession,useStt,useTranslation,useTts,useAudioOutput}.ts
638- src/renderer/styles/App .css
758+ src/renderer/styles/globals .css
639759src/renderer/types/electron.d.ts
640760packages/shared/index.ts
641761tests/tts-dedup.test.ts
@@ -644,6 +764,7 @@ tests/session.test.ts
644764tests/setup-onboarding.test.ts
645765scripts/setup-whisper.sh
646766esbuild.config.js
767+ tailwind.config.js
647768packaging/entitlements.mac.plist
648769package.json (includes electron-builder "build" config + package scripts)
649770tsconfig.json
0 commit comments