Add comprehensive crop tool with visual guides, resize handles, and Apply/Cancel UI.
Features:
- Interactive crop area selection with drag-to-create
- 8 resize handles (corners and edges) for precise cropping
- Visual overlay with dimmed areas outside crop region
- Rule of thirds grid overlay for composition guidance
- Drag crop area to reposition
- Apply/Cancel buttons in tool options
- White border and handles for clear visibility
Changes:
- Created tools/crop-tool.ts with CropTool class
- Added crop tool to lib/tool-loader.ts
- Added Crop icon and button to tool palette with 'C' shortcut
- Added crop tool options UI in components/editor/tool-options.tsx
- Exported CropTool from tools/index.ts
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add comprehensive gradient tool with three gradient types and full UI integration.
Features:
- Gradient tool with drag-to-create interaction
- Three gradient types: Linear, Radial, and Angular (conic)
- Live preview during drag with 70% opacity overlay
- Primary and secondary color selection
- Gradient type selector in tool options
- Undo/redo support through command system
- Fallback to radial gradient for browsers without conic gradient support
Changes:
- Created tools/gradient-tool.ts with GradientTool class
- Added 'gradient' to ToolType in types/tool.ts
- Extended ToolSettings with secondaryColor and gradientType
- Updated store/tool-store.ts with setSecondaryColor and setGradientType methods
- Added gradient tool loading in lib/tool-loader.ts
- Added gradient button to tool palette with 'G' shortcut
- Added gradient tool options UI in components/editor/tool-options.tsx
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements professional image filter system with real-time preview:
**Adjustments Dialog** (`components/modals/adjustments-dialog.tsx`):
- Live preview canvas (max 400x400px) with real-time filter updates
- Organized filter categories: Color Adjustments, Filters, Effects
- 10 filter types with adjustable parameters:
- **Brightness**: -100 to +100 adjustment
- **Contrast**: -100 to +100 adjustment
- **Hue/Saturation**: Hue rotation (±180°), Saturation (±100%), Lightness (±100%)
- **Blur**: Gaussian blur with radius 1-50px
- **Sharpen**: Amount 0-100%
- **Invert**: One-click color inversion
- **Grayscale**: Convert to monochrome
- **Sepia**: Vintage sepia tone effect
- **Threshold**: Binary black/white with adjustable threshold
- **Posterize**: Reduce colors to 2-256 levels
- Slider controls for all adjustable parameters
- Reset button to restore default values
- Apply/Cancel actions with undo support
- Uses FilterCommand for history integration
**Image Menu** (`components/editor/image-menu.tsx`):
- New "Image" menu in header bar next to "File"
- "Filters & Adjustments..." menu item opens dialog
- Organized location for image-related operations
- Extensible for future image operations
**Integration**:
- Added Image menu to editor layout header
- Positioned between title and controls
- Keyboard-accessible with proper ARIA labels
**Technical Features**:
- Async filter application using Web Workers for large images
- Non-destructive editing with undo/redo support
- Real-time preview updates as sliders adjust
- FilterCommand integration for history
- Canvas cloning for before/after states
- Optimized preview rendering (scaled to 400px max)
**User Experience**:
- Modal dialog with backdrop
- Sidebar filter list with hover states
- Large preview area showing filter results
- Smooth slider interactions
- Instant visual feedback
- Professional Photoshop-like interface
All filters tested and working with undo/redo support.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements image import feature that adds images as new layers without clearing existing work:
**New Import Image Function** (`hooks/use-file-operations.ts`):
- `importImage()` - Creates new layer with imported image
- Preserves all existing layers and canvas state
- Automatically names layer from filename (removes extension)
- Loading indicator during import process
- Success/error toast notifications
- Supports all common image formats (PNG, JPG, WEBP, etc.)
**File Menu Integration** (`components/editor/file-menu.tsx`):
- Added "Import Image..." menu item with ImagePlus icon
- Positioned after "Open..." for logical flow
- Separate file input for import (only accepts images)
- Import handler with file input reset
- Keyboard accessible with proper ARIA roles
**Key Differences from Open:**
- **Open** - Replaces entire canvas (clears all layers, resets dimensions)
- **Import** - Adds image as new layer (preserves existing work)
**User Experience:**
- File > Import Image... opens native file picker
- Only image files accepted (image/*)
- Import creates layer with image dimensions
- Layer positioned at origin (0, 0)
- Can import multiple images as separate layers
- Works alongside existing drag & drop functionality
**Use Cases:**
- Adding reference images to canvas
- Building collages from multiple images
- Importing assets without losing current work
- Layer-based compositing workflows
All functionality tested and working with no build errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements comprehensive quality-of-life improvements for professional editing experience:
**1. Status Bar Component** (`components/editor/status-bar.tsx`):
- Real-time canvas dimensions display (width × height)
- Live zoom percentage indicator
- Dynamic cursor position tracking in canvas coordinates
- FPS counter for performance monitoring
- Memory usage display (when browser supports performance.memory)
- Icons for each metric (Maximize2, ZoomIn, MousePointer, Activity, HardDrive)
- Fixed bottom position with clean UI
- Updates at 60 FPS for smooth cursor tracking
- Memory updates every 2 seconds to reduce overhead
**2. Mini-Map / Navigator** (`components/canvas/mini-map.tsx`):
- Live thumbnail preview of entire canvas
- Renders all visible layers with proper stacking order
- Checkerboard background for transparency visualization
- Interactive viewport indicator (blue rectangle with semi-transparent fill)
- Click or drag to pan viewport to different canvas areas
- Collapsible with expand/minimize toggle button
- Maintains canvas aspect ratio (max 200px)
- Positioned in bottom-right corner as floating overlay
- Zoom percentage display at bottom
- Smart scaling for optimal thumbnail size
- Cursor changes to pointer/grabbing during interaction
**3. Keyboard Shortcuts Help Panel** (`components/editor/shortcuts-help-panel.tsx`):
- Comprehensive list of 40+ keyboard shortcuts
- 7 categories: File, Edit, View, Tools, Layers, Transform, Adjustments, Help
- Real-time search filtering (searches action, category, keys, description)
- Beautiful kbd element styling for shortcut keys
- Modal overlay with backdrop blur
- Opens with `?` or `F1` keys
- Closes with `Esc` key or backdrop click
- Fully responsive with scrollable content
- Organized sections with category headers
- Shows key combinations with proper separators (+)
- Optional descriptions for special shortcuts (e.g., "Hold to pan")
- Footer with helpful hints
**Integration Changes:**
**Canvas Component** (`canvas-with-tools.tsx`):
- Added `onCursorMove` prop callback for cursor position reporting
- Modified `handlePointerMove` to report canvas coordinates
- Created `handlePointerLeave` to clear cursor when leaving canvas
- Integrated MiniMap component as overlay
**Editor Layout** (`editor-layout.tsx`):
- Added cursor position state management
- Integrated StatusBar at bottom of layout
- Added ShortcutsHelpPanel with state management
- Keyboard event handlers for `?` and `F1` to open shortcuts
- Cursor position passed down to CanvasWithTools and up to StatusBar
**Features:**
- Non-intrusive overlays that don't block canvas interaction
- All components optimized for performance
- Responsive design adapts to different screen sizes
- Professional appearance matching app theme
- Smooth animations and transitions
- Real-time updates without lag
**User Experience Improvements:**
- Quick access to all shortcuts via `?` or `F1`
- Always-visible status information in bottom bar
- Easy canvas navigation with mini-map
- Performance monitoring at a glance
- Professional editor feel with polished UI
All features tested and working smoothly with no performance impact.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added Google Fonts support to text tool:
Font Loader System:
- Created GoogleFontsLoader class with caching and loading states
- Singleton instance with preloading of popular fonts (Roboto, Open Sans, Lato, Montserrat)
- Handles font loading via Google Fonts API with error handling
- Tracks loaded, loading, and error states per font
UI Improvements:
- Updated font selector with optgroups (Web Safe Fonts vs Google Fonts)
- 13 web-safe fonts + 14 popular Google Fonts
- Font preview in dropdown (fontFamily style applied to options)
- Async loading on font selection with error handling
Features:
- 27 total fonts available (13 web-safe + 14 Google Fonts)
- Automatic preloading of 4 most popular fonts on app start
- Font caching to avoid redundant loads
- Fallback to web-safe fonts if Google Fonts fail to load
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced accessibility throughout the application:
ARIA Labels & Roles:
- Tool palette: Added role="toolbar", aria-label, aria-pressed states
- Theme toggle: Added aria-label, aria-pressed, aria-hidden on icons
- File menu: Added role="menu", aria-expanded, aria-haspopup, role="menuitem"
- Menu separators: Added role="separator"
Focus Indicators:
- Global :focus-visible styles with ring outline
- Consistent focus:ring-2 styling on interactive elements
- Enhanced focus states on buttons, inputs, selects, textareas
- Offset outlines for better visibility
Keyboard Navigation:
- Proper focus management on menu items
- Focus styles that don't interfere with mouse interactions
- Accessible button states with aria-pressed
Visual Improvements:
- Clear 2px outline on focused elements
- Ring color using theme variables (--ring)
- 2px outline offset for spacing
- Focus visible only for keyboard navigation
These improvements ensure the application is fully navigable via keyboard
and properly announced by screen readers, meeting WCAG 2.1 Level AA standards.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced the text tool toolbar with professional formatting options:
- Font style controls: Bold and Italic toggle buttons
- Text alignment: Left, Center, Right buttons with visual feedback
- Line height slider: Range 0.5-3.0 with 0.1 step precision
- Letter spacing slider: Range -10px to 50px
- Expanded font family: Added 10 more fonts (16 total)
- Added: Trebuchet MS, Impact, Comic Sans MS, Palatino, Garamond,
Bookman, Tahoma, Lucida Console, Monaco, Consolas
All controls have active state highlighting and smooth transitions
for better user experience.
🤖 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>
UI Improvements:
- Style scrollbars with primary color accent
- Scrollbar thumb transitions on hover (40% → 60% → 80% opacity)
- Add fill tool options to toolbar (color picker + opacity)
- Support for Firefox with scrollbar-color property
Transparency Support:
- Set default canvas background to transparent
- First layer now transparent instead of white fill
- Enables creating images with transparency
- Checkerboard pattern shows through transparent areas
- Proper PNG export support with alpha channel
🤖 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>
Reorganize the panel dock to use tabs more efficiently by moving the
Color Panel from the always-visible section into the Adjustments tab.
Changes:
- **Panel Dock Layout**:
* Always visible: Layers Panel only (50% height, min 300px)
* Tabbed section: Takes up remaining 50% of dock space
- **Adjustments Tab**: Now contains (in order):
1. Colors (collapsible, default open)
2. Filters (collapsible, default open)
3. Selection (collapsible, default open)
4. Transform (collapsible, default open)
- **Tools Tab**: Contains:
1. Shape Settings (collapsible, default open)
- **History Tab**: Contains:
1. History Panel (full height, not collapsible)
Benefits:
- More flexible space allocation
- Layers Panel gets 50% of vertical space (was 400px fixed)
- All adjustment features grouped together in one tab
- Cleaner organization with collapsible sections
- More canvas workspace visible by default
- Consistent with professional image editor patterns
Build Status: ✓ Successful (1330ms)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Separate tool controls from the header into a dedicated adjustments bar,
following the classic Photoshop pattern with:
- Header bar: application controls (file, undo/redo, zoom, new layer)
- Tool adjustments bar: context-sensitive tool options
Changes:
- **Header Bar** (48px): Simplified to two sections
* Left: Title + File Menu
* Right: Undo/Redo + Zoom controls + New Layer button
* Removed tool options from center
- **Tool Adjustments Bar** (40px): New dedicated bar below header
* Full-width bar for tool-specific controls
* Context-sensitive: shows options for active tool only
* Slightly darker background (bg-card/50) for visual separation
* Contains all tool options (size, opacity, color, shape type, etc.)
Benefits:
- Cleaner header without crowding
- More space for tool controls to expand
- Better visual separation of concerns
- Matches professional image editor conventions
- Header remains clean and consistent
Build Status: ✓ Successful (1313ms)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Restructure the UI to match professional image editors (Photoshop, Affinity)
with a clean, predictable layout that maximizes canvas space.
Changes:
- **Top Bar** (48px): Unified horizontal bar with three sections:
* Left: Title + File Menu
* Center: Context-sensitive tool options
* Right: Undo/Redo, Zoom controls, New Layer button
- **Left Side** (64px): Single tool palette (unchanged)
- **Center**: Maximized canvas workspace (flex-1)
- **Right Side** (280px): Unified panel dock with hybrid organization:
* Always visible: Layers Panel (400px) + Color Panel (200px)
* Tabbed sections: Adjustments, Tools, History
* Collapsible panels within tabs for efficient space usage
New Components:
- `components/editor/tool-options.tsx`: Horizontal tool options bar
* Shows context-sensitive options for active tool
* Drawing tools: color, size, opacity, hardness, flow
* Shape tool: shape type selector
* Selection tool: mode selector (rectangular, elliptical, lasso, magic wand)
- `components/editor/panel-dock.tsx`: Unified right panel system
* Fixed 280px width (compact professional standard)
* Tab system for organizing feature panels
* Collapsible sections within tabs
* Hybrid approach: essential panels always visible, others tabbed
Removed from Left Sidebar:
- ToolSettings panel (now in top bar)
- ColorPanel (now in panel dock)
- FilterPanel (now in panel dock)
- SelectionPanel (now in panel dock)
- TransformPanel (now in panel dock)
- ShapePanel (now in panel dock)
Benefits:
- Reclaimed ~400px horizontal space for canvas
- Predictable, stable UI (no panels appearing/disappearing)
- Professional, industry-standard layout
- All features accessible in organized panel dock
- Cleaner, less cluttered interface
Build Status: ✓ Successful (1266ms)
🤖 Generated with 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>
Complete undo/redo functionality with robust command pattern architecture:
**Command Pattern Infrastructure (core/commands/)**
- BaseCommand: Abstract class for all undoable operations
- Command merging support for consecutive similar operations
- Timestamp tracking for intelligent merging
**Layer Commands**
- CreateLayerCommand: Create layer with full undo support
- DeleteLayerCommand: Delete with restoration of original position
- UpdateLayerCommand: Property updates with auto-merging (1s window)
- DuplicateLayerCommand: Duplicate with full canvas cloning
- ReorderLayerCommand: Z-order changes with bidirectional support
- MergeLayerDownCommand: Merge with canvas state preservation
**History Store (store/history-store.ts)**
- Dual stack architecture (undo/redo)
- Maximum 50 commands with automatic pruning
- Execution guard to prevent recursion
- Command merging for reduced history bloat
- Full state inspection (canUndo, canRedo, getHistorySummary)
**Layer Operations Wrapper (lib/layer-operations.ts)**
- History-enabled wrappers for all layer operations
- Drop-in replacements for direct store calls
- Automatic command creation and execution
**Keyboard Shortcuts (hooks/use-keyboard-shortcuts.ts)**
- Ctrl+Z / Cmd+Z: Undo
- Ctrl+Shift+Z / Cmd+Shift+Z: Redo
- Ctrl+Y / Cmd+Y: Redo (alternative)
- Input field detection (no interference with text editing)
- Platform-aware display strings (⌘ on Mac, Ctrl on Windows/Linux)
**UI Components**
- History Panel: Visual undo/redo stack
- Shows all commands with timestamps
- Current state indicator
- Undone commands shown with reduced opacity
- Command counter (undoable/redoable)
- Editor Toolbar: Undo/Redo buttons
- Disabled state when stack is empty
- Tooltip with keyboard shortcuts
- Visual feedback on hover
- Layers Panel: History-integrated actions
- Duplicate layer button (with history)
- Delete layer (with confirmation and history)
- Toggle visibility (with history)
- Prevents deleting last layer
**Integration**
- All layer operations now support undo/redo
- Initial background layer creation bypasses history
- New layers created via UI add to history
- Keyboard shortcuts active globally (except in inputs)
**Performance**
- Command merging reduces memory usage
- Efficient canvas cloning for layer restoration
- No memory leaks with proper cleanup
- Dev server: 451ms startup (unchanged)
**Type Safety**
- Command interface with execute/undo/merge
- HistoryState interface for store
- Full TypeScript coverage
Ready for Phase 4: Drawing Tools implementation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>