feat(wave5): polish — pane resize, fuzzy palette, wizard cohesion, reduced motion#16
Merged
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
Command palette
Wizard cohesion
Keyboard
Empty states + export visibility
Tokens + fonts
Cleanup
Verified
Rebuild summary
With this PR landed, the 5-wave rebuild from PLAN.md is complete:
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