Skip to content

feat(wave5): polish — pane resize, fuzzy palette, wizard cohesion, reduced motion#16

Merged
vikranthreddimasu merged 1 commit into
mainfrom
feat/wave5-polish
Apr 18, 2026
Merged

feat(wave5): polish — pane resize, fuzzy palette, wizard cohesion, reduced motion#16
vikranthreddimasu merged 1 commit into
mainfrom
feat/wave5-polish

Conversation

@vikranthreddimasu

Copy link
Copy Markdown
Owner

Context

Final wave of 5 from PLAN.md. With Waves 1–4 in, the product no longer corrupts data, the signature citation feature renders, table-stakes actions exist, and the backend doesn't silently OOM or freeze. This closes the loose ends that made the app feel inconsistent at close inspection.

Layout

  • Pane resize. New `usePaneResize` hook + resize handles between sidebar/chat and chat/source-panel. Widths persist to localStorage, clamp to sensible ranges (sidebar 200–420px, source 240–520px), support keyboard arrow-key adjustment with `role="separator"` + `aria-orientation="vertical"`. Fixed-width panels on a 13" screen left the chat column at ~760px — now it's yours.
  • Reduced motion. `animation: none !important` replaces `animation-duration: 0.01ms !important`. Prior rule made shimmer/pulse keyframes flicker at seizure speed instead of stopping.

Command palette

  • Multi-word fuzzy scoring. `"note sum"` now matches "Summarize this notebook" — old substring matcher returned zero. Token prefix and word-boundary hits are ranked above generic inclusions.
  • Keyboard shortcut hints. Action items render their shortcut as an inline mono `kbd` chip (⌘N, ⌘/, ⌘⇧E).
  • Focus trap + `role="dialog"`. Tab/Shift-Tab cycle inside the palette. Selected row gets an accent left-border so it's visually distinct from mouse hover.

Wizard cohesion

  • Card elevation. `.wizard-card` now has background, border, `--radius-modal`, and `--shadow-lg` — was floating as a bare flex column.
  • Primary button color parity. Wizard + Zotero primary buttons switched from `#fff` to `#0c0a09` to match the rest of the app's sage-on-ink buttons.
  • Step dots. Idle background bumped from `--color-border` (invisible) to `--color-border-hover`.

Keyboard

  • `⌘⇧?` as a global shortcut for the Shortcuts overlay. The bare `?` binding was blocked when a text input had focus (which is ~always), so the hint was effectively unreachable.

Empty states + export visibility

  • Chat empty state is doc-aware. When the notebook has no documents, the prompt swaps to "No documents here yet. Drop a PDF, DOCX, or Markdown file anywhere on this window."
  • BibTeX export no longer hides on context reset. Was disabled whenever `activeSources` cleared (on every notebook switch / clear chat). Now enabled whenever the visible conversation has assistant messages.

Tokens + fonts

  • Context menu border-radius: `--radius-card` → `--radius-modal`.
  • Bunny Fonts URL uses variable-axis weight syntax (`plus-jakarta-sans:wght@200..800`, `geist-mono:wght@100..900`) so 450/550 mid-weights render instead of rounding.

Cleanup

  • `DropZone.tsx` deleted — complete component, imported nowhere.
  • `backend/services/chat.py` had a duplicate `final_reply = ...` assignment from a past copy-paste. Removed.

Verified

  • `cd apps/desktop && npm run build` — clean (273 modules, 875ms)
  • `cd backend && uv run ruff check .` — clean
  • `cd backend && uv run pytest -q` — 33 passed

Rebuild summary

With this PR landed, the 5-wave rebuild from PLAN.md is complete:

Wave PR Theme
1 #12 Stop the bleeding — data integrity, security, destructive guards
2 #13 Citation trust layer resurrection
3 #14 Missing actions + error visibility
4 #15 Reliability — threadpools, timeouts, WAL, OCR guard
5 this Polish

Deferred items with rationale in each PR: 4.1 backend-crash recovery IPC, 4.3 exponential backoff, 4.9 stream-to-disk upload, 4.13 per-conversation lock, 4.15 list_documents optimization, 4.16 background summary task, 3.3/3.4/3.6 (duplicate detection, real upload progress, wizard model wire).

🤖 Generated with Claude Code

…duced motion

Final wave of 5 from .gstack/qa-reports/PLAN.md. The audits flagged a
handful of loose ends that don't break the product but leave it feeling
inconsistent once you use it for more than five minutes. This closes them.

## Layout

- Pane resize. New usePaneResize hook + <div className="pane-resizer"/>
  handles between sidebar/chat and chat/source-panel. Widths persist to
  localStorage, clamp to sensible ranges (sidebar 200-420px, source panel
  240-520px), support keyboard arrow-key adjustment for accessibility,
  and drive the layout via --sidebar-width / --source-panel-width CSS
  vars set on .app-shell style. Fixed-240/280 split on a 13" screen used
  to leave the chat column at ~760px.
- Reduced motion: `animation: none !important` (was 0.01ms, which made
  the shimmer/pulse keyframes strobe at seizure speed instead of stopping).

## Command palette

- Multi-word fuzzy scoring. `"note sum"` now matches "Summarize this
  notebook" — prior substring matcher returned zero. Token prefix +
  word-boundary matches are ranked above generic inclusions.
- Keyboard shortcut hints. Palette action items render their shortcut as
  an inline mono-font kbd chip (⌘N, ⌘/, ⌘⇧E).
- Focus trap + role="dialog". Tab/Shift-Tab cycle inside the palette
  instead of landing on background elements.
- Selected-vs-hover visually distinct now — selected row gets an accent
  left-border in addition to the hover background.

## Wizard cohesion

- Card elevation. setup-wizard.css .wizard-card adds
  background / border / border-radius: var(--radius-modal) / shadow-lg —
  the wizard was floating as a bare flex column before.
- Primary button text color parity. Wizard + Zotero primary buttons
  switched from `color: #fff` to `#0c0a09` so they match the rest of the
  app's sage-on-ink buttons.
- Step dots. Idle dot background bumped from --color-border (rgba 0.07,
  effectively invisible) to --color-border-hover (rgba 0.14).

## Keyboard

- ⌘⇧? opens the shortcuts overlay as a global override of the bare `?`
  binding. The bare ? form remains when no text input is focused, but in
  practice the chat textarea has focus almost always, so a modifier form
  is needed for the hint to be reachable.

## UX empty states

- Chat empty state is doc-aware. When the notebook has no documents,
  the prompt swaps from "What would you like to know?" to "No documents
  here yet. Drop a PDF, DOCX, or Markdown file anywhere on this window."
- BibTeX export stops hiding. It used to disable whenever activeSources
  was cleared (every notebook switch, every clearChat). Now enables as
  long as the visible conversation has assistant messages — the
  persisted messages carry their own sources.

## Tokens + fonts

- Context menu border-radius: --radius-card → --radius-modal so its
  container radius matches the rest of the modal tier.
- Bunny Fonts URL uses variable-axis weight syntax
  (plus-jakarta-sans:wght@200..800, geist-mono:wght@100..900) so the
  450/550 mid-weights used in a few components actually render instead
  of getting rounded to the nearest discrete weight.

## Cleanup

- apps/desktop/src/components/documents/DropZone.tsx deleted. Complete
  component styled and ready — imported nowhere, never rendered.
- backend/services/chat.py had a duplicate `final_reply = ...` on
  consecutive lines from a past copy-paste. Removed.

## Verified

- cd apps/desktop && npm run build — clean (273 modules, 875ms)
- cd backend && uv run ruff check . — clean
- cd backend && uv run pytest -q — 33 passed

With Waves 1-5 landed, the rebuild from PLAN.md is complete:
1. stop the bleeding (data integrity, security, destructive guards)
2. citation trust layer resurrection
3. missing actions + error visibility
4. reliability (threadpools, timeouts, WAL, OCR guard)
5. polish (this PR)

Deferred items with rationale documented: 4.1 backend-crash recovery IPC,
4.3 exponential backoff, 4.9 stream-to-disk upload, 4.13 per-conversation
lock, 4.15 list_documents optimization, 4.16 background summary, and
3.3/3.4/3.6 (duplicate detection, real upload progress, wizard model wire).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vikranthreddimasu vikranthreddimasu merged commit 531e278 into main Apr 18, 2026
2 checks passed
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