Adds right-click context menu for canvas with full operation support:
**Clipboard Operations:**
- Cut/Copy/Paste with selection mask support
- Browser clipboard API integration for external images
- Internal clipboard buffer for canvas selections
- Toast notifications for user feedback
**Selection Operations:**
- Select All - creates full canvas selection with proper mask
- Deselect - clears active selection
- Selection state properly integrated with canvas operations
**Layer Operations:**
- New Layer - creates layer with history support
- Duplicate Layer - clones active layer
- Merge Down - merges layer with one below
**Transform Operations:**
- Rotate 90° CW - rotates active layer clockwise
- Flip Horizontal - mirrors layer horizontally
- Flip Vertical - mirrors layer vertically
- All transforms preserve image quality and support undo/redo
**Edit Operations:**
- Undo/Redo - integrated with history system
- Disabled states for unavailable operations
- Context-aware menu items
**New Files Created:**
- lib/clipboard-operations.ts - Cut/copy/paste implementation
- lib/canvas-operations.ts - Rotate/flip canvas functions
**Modified Files:**
- components/canvas/canvas-with-tools.tsx - Context menu integration
- store/selection-store.ts - Added selectAll() method
- core/commands/index.ts - Export all command types
**Technical Improvements:**
- Proper Selection type structure with mask/bounds
- History command integration for all operations
- Lazy-loaded operations for performance
- Toast feedback for all user actions
- Full TypeScript type safety
All operations work with undo/redo and maintain app state consistency.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added comprehensive touch support for mobile/tablet usage:
Touch Gestures Hook:
- Created useTouchGestures hook for pinch-to-zoom and two-finger pan
- Handles multi-touch events with distance calculation
- Integrated with canvas store for zoom and pan state
- Prevents default touch behaviors (pull-to-refresh, page scroll)
Features:
- Pinch-to-zoom: Two-finger pinch gesture for zoom in/out
- Two-finger pan: Pan canvas with two fingers
- Touch drawing: Single touch works for all drawing tools (pointer events already supported)
- Min/max zoom limits (0.1x - 32x)
- Smooth gesture handling with distance thresholds
UI Improvements:
- Added touch-action: none CSS to prevent default touch behaviors
- Added touch-none Tailwind class for better touch handling
- Canvas container properly handles touch events
Mobile Experience:
- Drawing tools work with single touch
- Zoom/pan gestures feel natural
- No interference with browser touch behaviors
- Optimized for tablets and touch-enabled devices
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
TypeScript compilation fixes:
- Added modifier keys (altKey, ctrlKey, shiftKey, metaKey) to PointerState interface
- Updated all PointerState creations in canvas to include modifier keys
- Added 'smudge' and 'dodge' cursor definitions to tool store
Tool integration:
- Added 'clone', 'smudge', 'dodge' to drawing tools array in canvas
- Clone Stamp uses Alt+Click to set source point
- Dodge/Burn uses Alt key to toggle between dodge (lighten) and burn (darken) modes
- Smudge tool benefits from modifier key tracking for future enhancements
All tools now properly receive keyboard modifier state for advanced interactions.
Build verified successful with pnpm build.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The canvas container's pointer handler was capturing ALL events when the text
tool was active, including clicks on the text editor UI (overlay, textarea,
handles). This prevented text selection, click-outside commit, and text
dragging from working.
Now the handler checks if the on-canvas editor is already active and returns
early, allowing the OnCanvasTextEditor to handle its own events properly.
Fixes:
- Text selection now works in textarea
- Clicking outside editor commits text
- Dragging transform handles moves text
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replaced modal dialog with inline on-canvas text editor
- Text objects stored as editable entities (non-rasterized)
- Live preview with transparent textarea overlay
- Click on existing text to re-edit
- Drag transform handles to move text
- Auto-commit on click outside (via overlay)
- Text selection with visible highlight
- Hidden original text during editing to prevent double vision
- Position alignment fixes for editing existing text
- Keyboard shortcuts: Ctrl+Enter to commit, Escape to cancel
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed two critical issues preventing text tool usage:
**Pointer Event Integration:**
- Added text tool to canvas pointer event handler
- Text tool now properly responds to canvas clicks
- Opens text dialog on click with correct position
**Tool Options Bar:**
- Added text tool options section to toolbar
- Font family selection (6 common fonts)
- Font size control (8-500px with number input)
- Color picker with hex input
- Helpful hint: "Click on canvas to add text"
- Options bar now appears when text tool is active
**Changes:**
- components/canvas/canvas-with-tools.tsx:
- Added dedicated text tool handler before selection tools
- Handles pointer down event to open text dialog
- components/editor/tool-options.tsx:
- Imported useTextStore
- Added isTextTool check
- Created text tool options UI section
- Shows font, size, and color controls
Text tool is now fully functional - click the Type icon, then
click anywhere on canvas to open the text editor dialog!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add complete text rendering system with the following features:
**Text Tool Core:**
- TextTool class with click-to-place text functionality
- Text cursor and pointer event handling
- Integration with DrawCommand for undo/redo support
**Text Rendering:**
- Multi-line text support with line height control
- Custom letter spacing
- Text alignment (left/center/right)
- Font families: 13 web-safe fonts + 14 popular Google Fonts
- Dynamic Google Font loading via Web Font Loader API
- Font styles (normal/italic) and weights (100-900)
**Text Dialog UI:**
- Full-featured text editor dialog
- Live preview of text with all formatting
- Font family selection (web-safe + Google Fonts)
- Font size (8-500px), style, and weight controls
- Color picker with hex input
- Text alignment options
- Line height slider (0.5-3x)
- Letter spacing slider (-10 to 50px)
- Multi-line text input with textarea
**State Management:**
- text-store with Zustand + persist middleware
- All text settings preserved across sessions
- Dialog state management (open/close)
- Click position tracking
**Integration:**
- Added text tool to tool palette with Type icon
- Registered TextTool in canvas tool system
- Added TextDialog to editor layout
- Full type safety with TypeScript interfaces
**Undoable:**
- Text rendering fully integrated with command pattern
- Each text insertion creates single undo point
- Proper before/after state capture
This completes Phase 11 of the implementation plan, marking
the transition from MVP to a fully-featured image editor.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major improvements to UI state management and user preferences:
- Add theme toggle with dark/light mode support
- Implement Zustand persist middleware for UI state
- Add ui-store for panel layout preferences (dock width, heights, tabs)
- Persist tool settings (active tool, size, opacity, hardness, etc.)
- Persist canvas view preferences (grid, rulers, snap-to-grid)
- Persist shape tool settings
- Persist collapsible section states
- Fix canvas coordinate transformation for centered rendering
- Constrain checkerboard and grid to canvas bounds
- Add icons to all tab buttons and collapsible sections
- Restructure panel-dock to use persisted state
Storage impact: ~3.5KB total across all preferences
Storage keys: tool-storage, canvas-view-storage, shape-storage, ui-storage
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add comprehensive shape drawing system with support for 7 shape types:
rectangle, ellipse, line, arrow, polygon, star, and triangle.
Features:
- Created types/shape.ts with ShapeType and ShapeSettings interfaces
- Implemented lib/shape-utils.ts with drawing algorithms for all shapes:
* Rectangle with optional corner radius
* Ellipse with independent x/y radii
* Line with stroke support
* Arrow with configurable head size and angle
* Polygon with adjustable sides (3-20)
* Star with points and inner radius control
* Triangle (equilateral style)
- Created store/shape-store.ts for shape state management
- Implemented tools/shape-tool.ts as unified tool handling all shapes
- Built components/shapes/shape-panel.tsx with comprehensive UI:
* Grid selector for all 7 shape types
* Fill/stroke toggles with color pickers
* Dynamic properties panel (corner radius, sides, inner radius, etc.)
* Real-time stroke width adjustment
- Integrated ShapeTool into canvas-with-tools.tsx
- Added ShapePanel to editor-layout.tsx sidebar
- Removed duplicate ShapeType/ShapeSettings from types/tool.ts
All shapes support:
- Fill with color selection
- Stroke with color and width controls
- Shape-specific properties (corners, sides, arrow heads, etc.)
- Undo/redo via DrawCommand integration
Build Status: ✓ Successful (1290ms)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>