···293293294294Goal: the UX crosses the "this is legit" threshold.
295295296296-[ ] Snapping:
297297- - snap move to grid
298298- - snap to other shape edges/centers
296296+[x] BEM-ify CSS classes
297297+ - Dialog, Sheet, Toolbar, and StatusBar now use BEM naming
298298+ - Fixed hardcoded white backgrounds in Dialog/Sheet (now use CSS vars)
299299+ - All text colors use proper CSS variables for dark mode support
300300+[x] Panning viewport
301301+ - Hold space + drag to pan the canvas
302302+ - Camera.pan integration in Canvas.svelte
303303+[x] Keyboard affordances:
304304+ - Arrow keys nudge selected shapes (1px, 10px with Shift)
305305+ - Ctrl/Cmd+D duplicates selected shapes
306306+ - Ctrl/Cmd+] brings shapes forward
307307+ - Ctrl/Cmd+[ sends shapes backward
308308+[x] Accessibility:
309309+ - Tool buttons have ARIA labels and aria-pressed states
310310+ - Zoom and Export menus have proper ARIA attributes (haspopup, expanded, role=menu)
311311+ - Visible focus states on all interactive elements
312312+ - Checkboxes in StatusBar have ARIA labels
313313+ - All controls keyboard-navigable with Tab
314314+315315+[ ] Editable Text
316316+[ ] Snapping refinement
317317+ - Guideline positioning
299318[ ] Handles:
300319 - resize handles for rect/ellipse
301320 - rotate handle
302321 - cursor affordances
303303-[ ] Keyboard affordances:
304304- - nudge with arrow keys
305305- - duplicate (Ctrl/Cmd+D)
306306- - bring forward/back
307307-[ ] Accessibility:
308308- - tool buttons navigable with keyboard
309309- - visible focus states
310310- - ARIA labels for controls
311322312323(DoD):
313324- A user can comfortably draw and edit without surprises.