3.8 KiB
3.8 KiB
| id | title | status | assignee | created_date | updated_date | labels | dependencies | priority | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
| TASK-68 | Canvas toolbar popout, click-to-place, double-click edit, SVG persistence | Done | 2026-02-28 00:26 | 2026-02-28 00:26 |
|
medium |
Description
Canvas UX improvements: toolbar popout panel replaces inline dropdowns, click-to-place shapes at cursor position, double-click to edit shapes, whiteboard SVG drawing persistence via Automerge, + button opens rApps, dblclick canvas for pencil mode.
Acceptance Criteria
- #1 Toolbar group click opens popout panel to the right (not inline dropdown)
- #2 Click toolbar tool → cursor changes to crosshair → click canvas → shape at click position
- #3 Shape avoids overlapping existing shapes (spiral search from click point)
- #4 Double-click shape → edit mode → can type/interact with content
- #5 Double-click empty canvas → pencil draw mode activates
- #6 Draw with pencil → reload → drawings persist (wb-svg in Automerge)
- #7 Click + button → rApp list opens in popout panel
- #8 Reload page → all shapes retain x,y positions
- #9 bunx tsc --noEmit passes
Final Summary
Changes
Toolbar Popout Panel (canvas.html CSS/HTML/JS)
- Added
#toolbar-panelwith header + body positioned right of#toolbar - Group toggles populate the popout panel via
openToolbarPanel()/closeToolbarPanel() - Inline
.toolbar-dropdownhidden withdisplay: none !importantwhen group is open - Mobile: panel slides up from bottom as a sheet
Click-to-Place (canvas.html)
pendingToolstate withsetPendingTool()/clearPendingTool()- All toolbar buttons set pending tool instead of calling
newShape()directly - Canvas
pointerdowncheckspendingTool, converts screen→canvas coords, places shape - Ghost outline (dashed teal) follows cursor while tool is pending; ESC cancels
findFreePosition(width, height, preferX?, preferY?)refactored to accept anchor point
Double-Click Edit Mode (folk-shape.ts)
enterEditMode()/exitEditMode()with:state(editing)internal state- CSS: editing state enables
pointer-events: autoon.slot-container, teal outline dblclicklistener on shape callsenterEditMode(), focuses first focusable child- Canvas background click calls
exitEditMode()on all shapes
Click-to-Edit Markdown (folk-markdown.ts)
- Preview area click enters edit mode
edit-enter/edit-exitcustom events sync with parent shape editing state- Refactored into
enterMarkdownEdit()/exitMarkdownEdit()helpers
+ Button Opens rApps (canvas.html)
#quick-addbutton at top of toolbar opens rApps group in popout panel- Mobile FAB first tap auto-opens rApps panel
SVG Drawing Persistence (community-sync.ts + canvas.html)
addShapeData()method on CommunitySync for DOM-less shapeswb-svgtype: SVG serialized on pointerup, stored in Automerge, recreated on load- Eraser removes from both DOM and Automerge doc
Canvas dblclick → Pencil Mode
- dblclick on empty canvas background activates pencil drawing tool
Files Modified
website/canvas.html— toolbar panel, click-to-place, findFreePosition, +button, SVG persistence, dblclicklib/folk-shape.ts— dblclick→editing state, enterEditMode/exitEditMode, CSSlib/folk-markdown.ts— click-to-edit preview, edit-enter/exit eventslib/community-sync.ts— svgMarkup field, addShapeData() method
Commits
eee9cbe— shape overlap push-aside, coordinate persistence, toolbar panel clipping645f1fc— SVG drawing persistence, click-to-edit markdown, quick-add rApps, dblclick pencil