Skip to content

feat: welcome modal, demo navbar pill, segmented Settings, reset app#53

Merged
aicayzer merged 1 commit into
mainfrom
feat/settings-and-welcome
May 12, 2026
Merged

feat: welcome modal, demo navbar pill, segmented Settings, reset app#53
aicayzer merged 1 commit into
mainfrom
feat/settings-and-welcome

Conversation

@aicayzer
Copy link
Copy Markdown
Owner

End-to-end UX pass for the first-run + demo-mode flows, plus a Settings reshuffle so all of it has room to breathe.

Summary

  • Welcome modal (replaces FirstRunModal). Two-step: Welcome with three bold-led bullets and a chart icon → Folder picker with Default-vs-Custom option cards. 400px wide, fixed 392px shell height so the modal never resizes between steps. "Start with demo data" link bottom-left, "Choose folder" → "Get started" primary on the right.
  • Demo-mode navbar pill in the centre slot of MainHeader. Orange split-pill: persistent "Demo mode" label on the left, contextual action chip on the right ("Set folder" opens the picker, "Exit" flips demo off).
  • Settings reorganised into General / Data / About tabs using a new SegmentedTabs primitive. Range pill hides on /settings.
  • Reset app card in About — wipes config.json back to defaults and re-triggers the welcome flow even when SuperWhisper is auto-detected at the default location.
  • Cache demo fallback: when no folder is configured, main serves the synthetic dataset so the welcome modal renders against populated screens instead of a blank shell.
  • Parent-folder auto-resolve: picking the SuperWhisper container folder promotes to its `recordings/` subdir automatically.

Test plan

  • `pnpm typecheck && pnpm lint && pnpm format:check && pnpm test`
  • Reset app from Settings → About → Reset… → Confirm. Welcome reappears.
  • Step 1 → "Start with demo data" → app shows demo, navbar pill says "Demo mode | Set folder".
  • Click the "Set folder" action chip → native picker → pick folder → real data loads, pill disappears, no welcome flash.
  • In step 2 of welcome: default option auto-selected when path detected (with Recommended badge); when not, default card disables with "Not found on this Mac" and custom is auto-selected.
  • Pick the SuperWhisper parent folder instead of its `recordings/` subdir — both work.
  • In Settings → General → Recordings folder, click Choose… while demo is on. Demo auto-disables, real data scans, no welcome flash.
  • Tab strip keyboard focus uses a subtle bg tint (no "stuck selection" ring).

End-to-end UX pass for first-run + demo-mode flows, plus a Settings
reshuffle that lets all of this breathe.

Welcome modal (replaces FirstRunModal):
- Two-step: Welcome (BarChart3 icon + 3 bold-led bullets) → Folder
  (option cards for Default vs Choose-another). 400px wide, fixed
  392px shell height so the modal never resizes between steps.
- "Start with demo data" link bottom-left, "Choose folder" → "Get
  started" primary on the right.
- Default card surfaces the Recommended badge when the path is
  detected, or "Not found on this Mac" disabled state when it's not.
- Clicking the custom card opens the native picker directly.

Demo-mode navbar pill (new):
- Orange split-pill that lives in the navbar's centre slot whenever
  demoMode is on. Left half is the persistent "Demo mode" label
  (routes to Settings). Right half is a contextual action chip —
  "Set folder" opens the picker, "Exit" flips demo off in one click.
- Centered via MainHeader switching to a grid-cols-[1fr_auto_1fr]
  layout; left/right slots balance around it.

Settings reorganised:
- Segmented tabs at the top (General / Data / About). Range pill
  hides on /settings so the tab strip owns the chrome.
- General: Recordings folder, Appearance, Transcripts, Demo data.
- Data: Indexing, Filler-phrase dictionary.
- About: tagline+disclaimer combined, version table, updater. Reset
  app moved to its own card so the action sits separately.
- Drop the auto-hide-sidebar toggle row (behaviour stays default-on
  in config; the row was UI overkill).

Reset app (new):
- IPC channel writes config.json back to defaults.
- Renderer's resetApp flips a transient welcomeForceShow flag so the
  welcome modal re-appears even when SuperWhisper is installed at the
  default location (which would otherwise be auto-adopted on hydrate).
- Two-step confirm with accent-orange "Confirm reset" (not red —
  recordings on disk are untouched).

Plumbing:
- main/cache.ts demo fallback: when no folder is configured, serve
  the synthetic dataset so the welcome modal renders against
  populated screens instead of a blank shell.
- main/config.ts resolveRecordingsPath: a picked SuperWhisper parent
  folder auto-promotes to its `recordings/` subdirectory if the
  parent itself isn't a valid recordings dir.
- Settings → Recordings folder choose() and WelcomeModal done() set
  the path FIRST, then disable demo — the reverse order leaves the
  renderer briefly in (!path && !demoMode) which fires the welcome
  trigger and flashes the modal.
- App.tsx hydrate-on-no-path (instead of clearData) so the demo
  fallback reaches the renderer behind the welcome.
- LoadingOverlay gated on configValid so the welcome doesn't peek
  through a "Loading recordings…" curtain on fresh installs.

Cosmetic:
- New accent-orange token (light + dark) for the demo pill and reset
  confirm. Strong orange that doesn't compete with chart greys or
  accent-blue identity cues.
- Reusable SegmentedTabs primitive (same lifted-pill aesthetic as
  RangePill). Keyboard focus uses a subtle bg tint, not a ring, so
  tabbing through doesn't leave a stuck-selection look.
- middleTruncate util for paths that need to keep their leaf visible
  (e.g. ~/Library/.../recordings).
- OptionCard detailMono prop: mono font only when displaying actual
  paths, sans-serif for prose ("Pick a folder anywhere on your Mac").
@aicayzer aicayzer merged commit fbd3bf4 into main May 12, 2026
2 checks passed
@aicayzer aicayzer deleted the feat/settings-and-welcome branch May 12, 2026 18:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant