Skip to content

Product-wide UX redesign: universal resize, smart alignment, contextual selection toolbar, color/tool simplification, vector SF Symbols, board library#19

Merged
pedrobritx merged 1 commit into
mainfrom
claude/trusting-cerf-ho17lx
Jun 11, 2026
Merged

Product-wide UX redesign: universal resize, smart alignment, contextual selection toolbar, color/tool simplification, vector SF Symbols, board library#19
pedrobritx merged 1 commit into
mainfrom
claude/trusting-cerf-ho17lx

Conversation

@pedrobritx

Copy link
Copy Markdown
Owner

Whiteboard Platform UI/UX Redesign — Foundation Tier (M-A) + Design Doc Set

This PR delivers the holistic redesign in two parts: the complete design document set (all 10 requested deliverables, grounded in file-level audit evidence) and the first implementation tier — the fixes and features with the highest impact-to-complexity ratio.

📐 Design documents — docs/redesign/

Doc Deliverables covered
README Executive summary, principles, what shipped
01 · UX audit UX audit + redundancy/simplification analysis
02 · Information architecture Workspace → Folders → Boards IA
03 · Design system Design system + Apple visual language + component inventory
04 · Interaction specs Normative interaction specifications
05 · Workflows Teacher/student workflows, PDF-centric learning, online classes
06 · Benchmarks Freeform, Notes, GoodNotes, Notability, LiquidText, FigJam, Miro, Excalidraw, Concepts
07 · Roadmap M-A…M-G prioritised by impact ÷ complexity

🔧 Implemented (M-A)

Object manipulation

  • Universal resize/rotate. Root cause found: TransformLayer was imported but never mounted — no object on the board had handles at all. Now mounted and extended to every kind: strokes bake the node's affine transform into their points (brush size scales with mean scale), stickies scale their type with the note, text scales with its box, and images/PDFs/embeds resize aspect-locked.
  • Endpoint editing for lines/arrows: Freeform-style draggable endpoint dots, Shift = 45° constrain.
  • Smart alignment: magnetic edge/center snapping with Keynote-style guide lines, zoom-independent 8 px tolerance, Alt to bypass; align (6) + distribute (2) commands for multi-selections.

Contextual menus

  • The fixed right-edge SelectionInspector is replaced by a contextual selection toolbar that floats adjacent to the selection, flips/clamps intelligently around the dock and viewport, tracks live during drags, shows only applicable controls, and adds one-click Duplicate / Arrange / Lock / Delete. Locked selections collapse to a single Unlock pill.

Hover states (light mode)

  • Diagnosed the defect class: generic :hover (specificity 0,2,0) overrode --active modifiers (0,1,0), painting near-white glass under white glyphs — invisible icons in light mode. Fixed with a new --accent-hover token + paired --active:hover rules across dock, glass buttons, width presets, brush styles, menu segments, and the text toolbar. Hover is now contrast-additive by rule.

Opacity controls

  • Sliders are container-safe (min-width: 0, compact tabular value box) and the same Slider component now serves every surface (the inspector previously used a bare native range input).

Color system

  • Two-layer picker: quick layer = curated 14-color palette + auto-tracked Recents + Saved colors (one click); advanced layer = hex / opacity / save behind a single "More" disclosure. Eyedropper stays in the header. The color wheel is consciously retired (rationale in audit §5). Same model in the dock picker and selection toolbar.

Drawing tools

  • Fineliner retired from the pen-style picker — it was Pen at width 2. One pen tool, three appearances (Pen/Pencil/Marker), orthogonal width/opacity. Existing fineliner strokes keep rendering (back-compat preserved).

Iconography

  • PNG icon masks replaced with the supplied SF Symbols SVGs (78 glyphs), normalized onto a uniform 72-unit optical canvas so glyph sizing stays consistent, tinted via currentColor. New glyphs for align/distribute/duplicate/opacity/search/star/folder/board. All icon-only controls keep tooltips + ARIA labels.

Information architecture

  • Home is now a board library: Workspace → Folders → Boards with Favorites, Recents, search, drag-a-board-onto-a-folder filing, inline rename, board menus, and an empty state. Local-first (works in local-only and Supabase modes); server-side library sync is roadmap M-B.

✅ Verification

  • pnpm -r typecheck green across all 5 packages.
  • pnpm run build (tsc + Vite + SPA fallback) green.
  • All 78 normalized SVGs validated well-formed (a stray DOCTYPE issue was caught and fixed during normalization).

Notes for review

  • apps/web gains a zustand dependency (was already used transitively by the canvas package).
  • SelectionInspector.tsx is deleted; its logic lives on in SelectionToolbar.tsx.
  • Konva Transformer mounts only in Select mode; body drags stay with SelectTool (snapping), handle drags go to Konva — the existing pointer-routing guard covers this.

https://claude.ai/code/session_013oiDiwJchzuxKWmTvHP2L3


Generated by Claude Code

…al selection toolbar, two-layer color system, vector SF Symbols, board library

Foundation tier (M-A) of the holistic redesign, plus the full design doc set
(docs/redesign/): UX audit, IA, design system, interaction specs, workflows,
benchmarks, and prioritised roadmap.

Object manipulation
- Mount the Transformer (it was imported but never rendered — nothing on the
  board could be resized) and extend it to every shape kind: strokes bake the
  affine transform into their points and scale brush size, stickies scale
  their type with the note, media (images/PDFs/embeds) resizes aspect-locked.
- Lines/arrows get draggable endpoint dots with 45-degree shift-constrain.
- Magnetic edge/center snapping with Keynote-style guides while dragging
  (zoom-independent 8px tolerance, Alt bypasses), plus align and distribute
  commands for multi-selections.

Contextual UI
- Replace the fixed right-edge SelectionInspector with a floating selection
  toolbar that tracks the selection, flips around the dock, shows only
  applicable controls, and adds Duplicate / Arrange / Lock / Delete.
- New viewportStore projects world bounds into screen space for DOM chrome.

Design system fixes
- Light-mode hover bug: generic :hover rules outranked --active modifiers,
  painting near-white under white glyphs. Added --accent-hover token and
  paired --active:hover rules across dock/buttons/presets/menus.
- Opacity sliders no longer overflow popovers; both surfaces share the same
  Slider component.
- Color picker restructured into quick layer (palette, recents, saved) with
  hex/opacity/save behind one disclosure; recents tracked device-locally.
- Pen styles deduplicated: Fineliner retired from the picker (kept rendering
  for existing boards); Pen/Pencil/Marker remain as styles of one pen tool.
- Icons migrated from PNG masks to the supplied SF Symbols SVGs, normalized
  onto a uniform optical canvas, with new glyphs for align/distribute/
  duplicate/opacity/library actions.

Information architecture
- Home becomes a board library: folders, favorites, recents, search,
  drag-and-drop filing, inline rename, empty state — local-first via
  localStorage, server sync sequenced as M-B.

https://claude.ai/code/session_013oiDiwJchzuxKWmTvHP2L3
@pedrobritx pedrobritx marked this pull request as ready for review June 11, 2026 15:28
@pedrobritx pedrobritx merged commit 7f9142d into main Jun 11, 2026
4 checks passed
@pedrobritx pedrobritx deleted the claude/trusting-cerf-ho17lx branch June 11, 2026 15:28
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.

2 participants