Skip to content

Commit 9250c0f

Browse files
feat: VocaHQ parity (output polish, power controls, settings shell) (#207)
* docs: add VocaHQ parity plan from VocaLinux v0.15 Capture the Mac gap matrix and phased port plan (settings sidebar + search, auto-pause, idle unload, dictation polish) and point ARCHITECTURE cross-platform notes at VocaLinux / VocaHQ. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * feat: add dictation polish, auto-pause, and idle model unload Port VocaLinux output polish (#554/#608) and power controls (#592): trailing space + auto-capitalize before inject, AutoPauseMonitor, ModelKeepAlive, sleep/wake recovery, and SpeechTranscribing.unloadModel. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * feat: searchable sidebar settings and expanded language catalog Replace TabView settings chrome with NavigationSplitView, live search, and a status/Test Dictation footer. Expand the transcription language catalog with a searchable picker and update the VocaHQ parity matrix. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * ci: retrigger CI against main Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * fix: mark keep-alive/auto-pause constants nonisolated Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * fix: keep recording overlay controls in Application settings search Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * fix: polish settings shell, About layout, and recording overlay Fix Tahoe NavigationSplitView About breakage via safeAreaInset footer, improve Test Dictation feedback, slim Speech Model IA, add Stats Share, bury menu-bar Setup Wizard, and replace overlay cancel/red-dot with the Voca mark. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * fix: avoid assigning computed averageWPM in share card test Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * ui: polish share card, Advanced pills, test dictation, overlay glow Dark branded stats share image, compact Advanced resource columns, Settings Test Dictation without inject, sidebar search/logo consistency, and a pulsing VocaMac-green glow around the recording overlay. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * ui: match System Settings sidebar search placement Remove the fake VocaMac sidebar row, drop toolbar .searchable, and pin a System Settings–style Search field to the top of the sidebar column so collapse no longer shifts search into the detail toolbar. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * ui: adaptive overlay theme, sensitive waveform, slide-in Respect system light/dark appearance with high-contrast surfaces, boost waveform sensitivity for quiet speech, and animate the pill in from the top/bottom edge based on overlay position. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * ui: pin settings sidebar toggle to the top-right Replace NavigationSplitView's relocating system sidebar button with a custom trailing toolbar control and hide the default toggle on macOS 15+. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * fix: replace NavigationSplitView to stop duplicate sidebar toggles Use a manual sidebar + detail layout with a single top-right toolbar button so Tahoe no longer injects relocating left/right system toggles. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * feat: surface model load status for auto-pause and idle unload Show loaded/unloaded state with estimated RAM in Performance, track unload reason and approx freed RSS, and explain auto-pause clearly in the menu bar popover. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * ui: use brand teal for hot mic and yellow for processing Align menu bar mark, popover status, and overlay processing colors with the trademark teal recording state instead of red/purple. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * chore: scrub em dashes and tighten user-facing copy No behavior changes. Clean up strings and docs added in this branch so the UI does not read like generated filler. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> * docs: refresh VOCAHQ_PARITY.md to match shipped #207 UX Correct sidebar implementation notes, footer behavior, Performance vs Advanced placement, resolved open questions, and follow-up items. Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> --------- Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent 73df0be commit 9250c0f

30 files changed

Lines changed: 3179 additions & 463 deletions

Sources/VocaMac/App/BrandAssets.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ enum BrandAssets {
3333
enum MenuBarIconStyle: Equatable {
3434
/// Black mark drawn as a template so macOS follows the menu bar appearance.
3535
case brandMarkTemplate
36-
/// Mark tinted with the status color (recording).
36+
/// Mark tinted with brand teal while recording (mic hot).
3737
case brandMarkTinted
3838
/// SF Symbol for processing / error.
3939
case systemSymbol(name: String)

Sources/VocaMac/App/VocaMacApp.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ final class SettingsWindowManager: ObservableObject {
2626

2727
// Create a new window
2828
let window = NSWindow(
29-
contentRect: NSRect(x: 0, y: 0, width: 560, height: 520),
29+
contentRect: NSRect(x: 0, y: 0, width: 760, height: 560),
3030
styleMask: [.titled, .closable, .miniaturizable, .resizable],
3131
backing: .buffered,
3232
defer: false
@@ -315,16 +315,16 @@ struct VocaMacApp: App {
315315
/// Renders the Voca mark in the menu bar with color changes based on app status.
316316
///
317317
/// Idle uses a template silhouette so macOS follows the menu bar appearance.
318-
/// Recording tints that same mark red. Processing and error keep SF Symbols.
318+
/// Recording tints that same mark brand teal. Processing and error keep SF Symbols.
319319
///
320320
/// MenuBarExtra strips SwiftUI `.foregroundStyle()` colors, so status colors
321321
/// are applied via `NSImage` + `sourceAtop` with `isTemplate = false`.
322322
///
323323
/// States:
324324
/// • idle → Voca mark (template, adapts to menu bar)
325-
/// • recording → Voca mark in red
326-
/// • processing → purple ellipsis (non-template, colored)
327-
/// • error → yellow warning (non-template, colored)
325+
/// • recording → Voca mark in brand teal (mic hot)
326+
/// • processing → yellow ellipsis (non-template, colored)
327+
/// • error → orange warning (non-template, colored)
328328
struct MenuBarIcon: View {
329329
let appStatus: AppStatus
330330

@@ -343,9 +343,9 @@ struct MenuBarIcon: View {
343343

344344
case .brandMarkTinted:
345345
if let mark = sizedMark() {
346-
return tintedImage(base: mark, color: .systemRed)
346+
return tintedImage(base: mark, color: BrandAssets.brandGreen)
347347
}
348-
return fallbackSymbol(named: "mic.fill", tint: .systemRed)
348+
return fallbackSymbol(named: "mic.fill", tint: BrandAssets.brandGreen)
349349

350350
case .systemSymbol(let name):
351351
return fallbackSymbol(named: name, tint: statusColor)
@@ -413,9 +413,9 @@ struct MenuBarIcon: View {
413413
private var statusColor: NSColor {
414414
switch appStatus {
415415
case .idle: return BrandAssets.brandGreen
416-
case .recording: return .systemRed
417-
case .processing: return NSColor(red: 0.749, green: 0.353, blue: 0.949, alpha: 1.0) // #BF5AF2
418-
case .error: return .systemYellow
416+
case .recording: return BrandAssets.brandGreen
417+
case .processing: return .systemYellow
418+
case .error: return .systemOrange
419419
}
420420
}
421421
}

0 commit comments

Comments
 (0)