···14141. Milestone A: Repo skeleton + dev loop *wb-A*
1515================================================================================
16161717-Goal: a monorepo that can run a blank canvas in web + desktop.
1818-1919-[ ] Create workspace:
2020- - /apps/web (SvelteKit)
2121- - /apps/desktop (Tauri wrapper)
2222- - /packages/core (pure TS engine)
2323- - /packages/renderer (Canvas2D renderer)
2424-2525-[ ] Add TypeScript config(s):
2626- - one shared tsconfig.base.json
2727- - package-level tsconfig.json extends base
2828-2929-[ ] Add lint/format:
3030- - eslint + prettier
3131- - one command: pnpm lint / pnpm fmt
3232-3333-[ ] Add test runner for core:
3434- - vitest in /packages/core
3535- - one command: pnpm test
3636-3737-[ ] Add CI:
3838- - install, lint, test (core only)
3939-4040-(DoD):
4141-- `pnpm dev:web` shows an empty page with a <canvas>.
4242-- `pnpm dev:desktop` launches a Tauri window that shows the same canvas.
4343-- `pnpm test` runs at least 1 passing core test.
1717+Created a project monorepo/workspace.
44184519================================================================================
46202. Milestone B: Math + coordinate systems *wb-B*
···14211615. Milestone O: Export (PNG/SVG) *wb-O*
143117================================================================================
144118145145-Goal: export drawings as shareable artifacts.
146146-147147-[x] Implement exportViewportToPNG(canvas) (screen export)
148148-[x] Implement exportSelectionToPNG (render selection bounds)
149149-[x] Implement SVG export for basic shapes:
150150- - rect/ellipse/line/arrow/text
151151- - camera transform NOT included (exports in world coordinates)
152152-[x] Export controls are in Toolbar (between zoom & history)
153153-154154-Tests:
155155-[x] exported SVG parses and contains expected elements
156156-157157-(DoD):
158158-- One-click export works in both web and desktop. ✓
119119+PNG/SVG export flows now deliver one-click viewport or selection exports from
120120+the Toolbar across web and desktop builds.
159121160122================================================================================
16112316. Milestone P: Desktop packaging (Tauri) *wb-P*
···29125319. Milestone S: Quality polish (what makes it feel "real") *wb-S*
292254================================================================================
293255294294-Goal: the UX crosses the "this is legit" threshold.
295295-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
318318-[ ] Handles:
319319- - resize handles for rect/ellipse
320320- - rotate handle
321321- - cursor affordances
322322-323323-(DoD):
324324-- A user can comfortably draw and edit without surprises.
256256+Comprehensive UX polish adds BEM CSS, space-drag panning, richer keyboard
257257+affordances, improved accessibility and styling, refined snapping, and handles
258258+so drawing feels production-ready.
325259326260================================================================================
327261References (URLs) *wb-refs*