Skip to content

Fix UI/UX findability: home page, command palette, settings consolidation, promoted controls - #121

Closed
alpha5611331 wants to merge 9 commits into
mainfrom
feat/home-page-ux-conventions
Closed

Fix UI/UX findability: home page, command palette, settings consolidation, promoted controls#121
alpha5611331 wants to merge 9 commits into
mainfrom
feat/home-page-ux-conventions

Conversation

@alpha5611331

@alpha5611331 alpha5611331 commented Sep 4, 2026

Copy link
Copy Markdown
Member

Why

A user reported that even developers can't find things in the client UI. Investigation confirmed this is an information-architecture problem, not a visual one:

  • / was a pure redirect straight into the dense /main control console, with no orientation.
  • Nearly all core functionality lived in a 32px icon-only toolbar.
  • The one existing "Show Hotkeys" affordance was hover-only - nothing visible without pointing at it first.
  • ~15 real capabilities (window placement, capture, trigger, etc.) existed only as hotkeys with no on-screen affordance anywhere, some down to a console.log line.
  • Settings/account/billing/password were three separate, unrelated-looking rows in a dropdown menu, and both Settings and Documentation were modals stacked over whatever route happened to be open.
  • No search or command palette existed anywhere.
  • No written convention existed for where a new capability should go, or when something should be a dialog vs. its own page.

This PR resolves it in one pass. Not merging - for manual review.

What changed (8 commits, buildable/testable at every commit)

  1. docs(ux) - docs/ux-conventions.md: a placement-tier rule (always-visible / discoverable-on-demand / configure-once / hotkey) plus a mandatory design-principles checklist.
  2. feat(home) - / now renders a real landing page (pages/home/index.tsx) instead of redirecting straight to /main. Logged-out users still redirect to /auth/login unchanged.
  3. fix(hotkeys) - the hover-only hotkey list becomes a click-to-open dialog (plus a new local ? shortcut). Extracted hotkey-cheatsheet.tsx so it isn't duplicated.
  4. feat(command-palette) - a searchable Cmd/Ctrl+K command palette (new cmdk dependency + shadcn command.tsx) plus a visible titlebar button. Renderer-local shortcut, not a global OS hotkey. Inert during stealth mode.
  5. feat(settings) - consolidates Account/Session/Shortcuts/Billing into one tabbed surface, folding in Change Password and Buy Credits from separate menu rows.
  6. feat(control-bar) - Capture Screenshot / Clear Captures / Generate Suggestion get real icon buttons and the IPC handlers they never had (the service methods already existed - hotkey-only, zero UI).
  7. docs(ux) - updates the conventions doc's forward references now that the palette and cheat-sheet exist.
  8. refactor(settings) - converts Settings and Documentation from modals into routed pages (/settings, /documentation), following the pattern pages/payment/index.tsx already established (sticky header + back button). Removes configuration-dialog.tsx, documentation-dialog.tsx, and the use-configuration-dialog.tsx context; updates every call site. Adds a "dialog vs. page" rule to the conventions doc: a transient in-context action (password change, a permission prompt) is a dialog, a destination you go to do a batch of related things is a page. The hotkey cheat-sheet stays a dialog under this rule - quick glance, not a destination.

Notable judgment calls (made while implementing)

  • main doesn't have the mock-interview feature yet (only on the unmerged feat/mock-interview-client branch) - the home page's second launch card and the plan's mock-interview-URL phase don't apply here.
  • Cmd/Ctrl+K and ? are renderer-local keydown listeners, not registered Electron globalShortcuts - grabbing Ctrl+K system-wide would hijack it in every other app while this one merely runs.
  • The command palette only wires actions with a real, already-existing renderer-callable handler. Directional/parameterized hotkeys (window placement, move, resize, zoom, scroll) stay reference-only via Keyboard Shortcuts rather than faking a palette action that doesn't do anything.
  • Capture/Clear/Trigger needed three new ipcMain.handle wrappers - thin wrappers around already-implemented service methods, no new business logic.
  • Not included: the shared app-dialog.tsx/app-notice.tsx composition wrapper for the app's remaining dialogs (tracked in the conventions doc as explicit follow-up) - a consistency improvement, not a findability fix.

Test plan

  • pnpm lint clean (full project)
  • tsc -b clean (renderer) and tsc -p tsconfig.electron.json clean (main process)
  • pnpm run build succeeds end-to-end
  • Every new/changed renderer file smoke-tested via vite dev server (transforms without error)
  • Manual walkthrough in the packaged Electron app: login → home → Start Interview → Cmd/Ctrl+K palette from multiple routes → /settings tabs (including Save and Change Password) → /documentation → back-button behavior on both → Capture/Clear/Trigger buttons on /main while a session is running → ? and hover-free "Show Hotkeys" → stealth mode hides the palette/titlebar button as expected

Nothing in the repo currently says where a new setting or action
should live, which is how core functionality ended up split across
a 32px toolbar, disconnected menu items, and hotkeys with zero
on-screen affordance. Establishes placement tiers, the control bar's
space budget, and a mandatory design-principles checklist so future
additions stay findable.
/ used to just redirect straight into /main with no page of its own,
dropping users into the dense control console with zero orientation.
Renders a real landing page instead: a primary Start Interview action,
an account/credits summary, and Settings/Documentation entry points -
the T1/T2 discovery surface the UX conventions doc calls for, applied
to the first thing a user sees.

Logged-out users still redirect to /auth/login unchanged.
@gitar-bot

gitar-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown

Gitar is working

Gitar

…only

status-panel.tsx's "Show Hotkeys" control only ever revealed the list
on hover - nothing visible without pointing at it first, the exact
antipattern the rest of the control bar has. Converts it to a proper
dialog opened by click or a new '?' shortcut (local to this window,
not a registered global hotkey - it only needs focus, not stealth-mode
reach).

Extracts the hotkey list itself into hotkey-cheatsheet.tsx so
status-panel.tsx and documentation-dialog.tsx render the same data
instead of two independently-drifting copies.
The centerpiece fix for capabilities that were T1 (occasional) or
T3 (hotkey-only) with nothing to point at: a Cmd/Ctrl+K palette
listing navigation, session toggles, and app actions (Settings,
Documentation, Keyboard Shortcuts, theme, sign out), plus a visible
titlebar button so the entry point isn't itself hotkey-only.

The shortcut is a renderer-local keydown listener, not a registered
global hotkey - Cmd/Ctrl+K is common enough elsewhere that grabbing
it system-wide via Electron's globalShortcut would hijack it in
every other running app. Inert during stealth mode for the same
reason the control bar is: popping a dialog over a screen share
defeats the point of stealth.

Only wires actions that already have a real, renderer-callable
handler (Zustand-store-backed toggles, existing IPC calls) - hotkeys
with no renderer entry point (window placement/move/resize, capture)
stay reference-only via the Keyboard Shortcuts entry rather than
faking an action that doesn't exist.

Adds cmdk + a shadcn command.tsx wrapper (new dependency).
Configuration, Change password, and Buy Credits were three separate,
unrelated-looking rows in the titlebar menu, plus a fourth settings
surface (control-bar toggles) with no relationship to any of them.
Turns the settings dialog into a tabbed hub instead:

- Account: existing profile fields, plus a Change Password action
  (folds change-password-dialog.tsx in as a nested dialog rather
  than a separate menu item)
- Session: professional mode and transcript panel defaults
- Shortcuts: the same hotkey-cheatsheet.tsx list used elsewhere
- Billing: credits balance and a Buy Credits action

Titlebar menu trims to one guessable "Settings" entry instead of
three - the underlying actions haven't gone anywhere, just moved
somewhere a person only has to learn once.
…buttons

Capture Screenshot, Clear Captures, and Generate Suggestion were only
reachable via their hotkeys (Ctrl+Shift+F9/F10/F11) - the service
methods behind them (suggestion-action.service.ts) were fully
implemented, but nothing on screen pointed at them: no button, no
IPC handler for the renderer to call them through at all.

Adds the three missing ipcMain handlers (thin wrappers around the
existing service methods - no new business logic), exposes them via
preload, and adds icon buttons to tools-group.tsx next to the other
session tools. Window placement/move/resize/zoom/scroll stay
hotkey+palette+cheat-sheet only, correctly: those are directional,
not single-shot actions, and don't map to a one-click button the way
capture/clear/trigger do.
Both existed only as forward references when the doc was first
written; points at the real files now that command-palette.tsx and
hotkey-cheatsheet.tsx exist, and states directly that directional
hotkeys (window placement/move/resize/zoom/scroll) are correctly
hotkey+cheat-sheet-only rather than a gap the palette should fill.
@alpha5611331 alpha5611331 changed the title Add home page + UX conventions doc (findability fix, part 1) Fix UI/UX findability: home page, command palette, settings consolidation, promoted controls Sep 4, 2026
Both were modals stacked on top of whatever route the user opened
them from. Converts them to routed pages (/settings, /documentation)
following the pattern pages/payment/index.tsx already established -
sticky header with a back button, content below - since they're
destinations a user goes to do a batch of related things, not
transient in-context actions.

Removes configuration-dialog.tsx, documentation-dialog.tsx, and the
use-configuration-dialog.tsx context (openConfigurationDialog is now
just navigate('/settings')); updates every call site (titlebar menu,
command palette, home page, control panel's start-checks). The
hotkey cheat-sheet stays a dialog - it's a quick glance meant not to
lose your place mid-session, not a destination.

docs/ux-conventions.md gets a new "dialog vs. page" rule so the next
addition doesn't have to guess which one it should be.
Resolves conflicts between the mock-interview feature (merged via main)
and this branch's settings/documentation dialog-to-page refactor:

- control-panel/index.tsx and titlebar.tsx: keep both branches' additions
  (command palette, mock-interview setup) and drop the dead
  useConfigurationDialog/config-for-llmModel usages main's side no longer
  needs.
- use-mock-interview-setup-form.ts (new on main) called the deleted
  useConfigurationDialog hook; switched it to navigate('/settings') to
  match this branch's dialog-to-page refactor.
- test/rtl-rendering.test.mjs still pointed at the removed
  documentation-dialog.tsx; repointed at pages/documentation/index.tsx.

Verified with tsc -b and pnpm test:main.
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