feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
'use client';
|
|
|
|
|
|
|
|
|
|
|
|
import { useLayerStore } from '@/store';
|
2025-11-21 15:52:35 +01:00
|
|
|
|
import { useContextMenuStore } from '@/store/context-menu-store';
|
|
|
|
|
|
import { Eye, EyeOff, Trash2, Copy, Layers, MoveUp, MoveDown } from 'lucide-react';
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
import { cn } from '@/lib/utils';
|
2025-11-20 21:24:59 +01:00
|
|
|
|
import {
|
|
|
|
|
|
deleteLayerWithHistory,
|
|
|
|
|
|
updateLayerWithHistory,
|
|
|
|
|
|
duplicateLayerWithHistory,
|
|
|
|
|
|
} from '@/lib/layer-operations';
|
2025-11-21 17:42:36 +01:00
|
|
|
|
import { LayerEffectsPanel } from './layer-effects-panel';
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
|
|
|
|
|
|
export function LayersPanel() {
|
2025-11-21 15:52:35 +01:00
|
|
|
|
const { layers, activeLayerId, setActiveLayer, reorderLayer } = useLayerStore();
|
|
|
|
|
|
const { showContextMenu } = useContextMenuStore();
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
|
|
|
|
|
|
// Sort layers by order (highest first)
|
|
|
|
|
|
const sortedLayers = [...layers].sort((a, b) => b.order - a.order);
|
|
|
|
|
|
|
2025-11-21 15:52:35 +01:00
|
|
|
|
const handleMoveLayer = (layerId: string, direction: 'up' | 'down') => {
|
|
|
|
|
|
const layer = layers.find((l) => l.id === layerId);
|
|
|
|
|
|
if (!layer) return;
|
|
|
|
|
|
|
|
|
|
|
|
const layerIndex = sortedLayers.findIndex((l) => l.id === layerId);
|
|
|
|
|
|
if (direction === 'up' && layerIndex > 0) {
|
|
|
|
|
|
const targetLayer = sortedLayers[layerIndex - 1];
|
|
|
|
|
|
reorderLayer(layerId, targetLayer.order);
|
|
|
|
|
|
} else if (direction === 'down' && layerIndex < sortedLayers.length - 1) {
|
|
|
|
|
|
const targetLayer = sortedLayers[layerIndex + 1];
|
|
|
|
|
|
reorderLayer(layerId, targetLayer.order);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleContextMenu = (e: React.MouseEvent, layerId: string) => {
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
const layer = layers.find((l) => l.id === layerId);
|
|
|
|
|
|
if (!layer) return;
|
|
|
|
|
|
|
|
|
|
|
|
const layerIndex = sortedLayers.findIndex((l) => l.id === layerId);
|
|
|
|
|
|
const canMoveUp = layerIndex > 0;
|
|
|
|
|
|
const canMoveDown = layerIndex < sortedLayers.length - 1;
|
|
|
|
|
|
const canDelete = layers.length > 1;
|
|
|
|
|
|
|
|
|
|
|
|
showContextMenu(e.clientX, e.clientY, [
|
|
|
|
|
|
{
|
|
|
|
|
|
label: 'Duplicate Layer',
|
|
|
|
|
|
icon: <Copy className="h-4 w-4" />,
|
|
|
|
|
|
onClick: () => duplicateLayerWithHistory(layerId),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
separator: true,
|
|
|
|
|
|
label: '',
|
|
|
|
|
|
onClick: () => {},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: 'Move Up',
|
|
|
|
|
|
icon: <MoveUp className="h-4 w-4" />,
|
|
|
|
|
|
onClick: () => handleMoveLayer(layerId, 'up'),
|
|
|
|
|
|
disabled: !canMoveUp,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: 'Move Down',
|
|
|
|
|
|
icon: <MoveDown className="h-4 w-4" />,
|
|
|
|
|
|
onClick: () => handleMoveLayer(layerId, 'down'),
|
|
|
|
|
|
disabled: !canMoveDown,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
separator: true,
|
|
|
|
|
|
label: '',
|
|
|
|
|
|
onClick: () => {},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: layer.visible ? 'Hide Layer' : 'Show Layer',
|
|
|
|
|
|
icon: layer.visible ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />,
|
|
|
|
|
|
onClick: () => updateLayerWithHistory(layerId, { visible: !layer.visible }, 'Toggle Visibility'),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
separator: true,
|
|
|
|
|
|
label: '',
|
|
|
|
|
|
onClick: () => {},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
label: 'Delete Layer',
|
|
|
|
|
|
icon: <Trash2 className="h-4 w-4" />,
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (confirm('Delete this layer?')) {
|
|
|
|
|
|
deleteLayerWithHistory(layerId);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
disabled: !canDelete,
|
|
|
|
|
|
danger: true,
|
|
|
|
|
|
},
|
|
|
|
|
|
]);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
return (
|
|
|
|
|
|
<div className="flex h-full flex-col bg-card">
|
|
|
|
|
|
<div className="border-b border-border p-3">
|
|
|
|
|
|
<h2 className="text-sm font-semibold text-card-foreground">Layers</h2>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2025-11-21 17:42:36 +01:00
|
|
|
|
<div className="flex-1 overflow-y-auto">
|
|
|
|
|
|
<div className="p-2 space-y-1">
|
|
|
|
|
|
{sortedLayers.length === 0 ? (
|
|
|
|
|
|
<div className="flex h-full items-center justify-center">
|
|
|
|
|
|
<p className="text-sm text-muted-foreground">No layers</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
sortedLayers.map((layer) => (
|
|
|
|
|
|
<div
|
|
|
|
|
|
key={layer.id}
|
|
|
|
|
|
className={cn(
|
|
|
|
|
|
'group flex items-center gap-2 rounded-md border p-2 transition-colors cursor-pointer',
|
|
|
|
|
|
activeLayerId === layer.id
|
|
|
|
|
|
? 'border-primary bg-primary/10'
|
|
|
|
|
|
: 'border-border hover:border-primary/50 hover:bg-accent/50'
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
)}
|
2025-11-21 17:42:36 +01:00
|
|
|
|
onClick={() => setActiveLayer(layer.id)}
|
|
|
|
|
|
onContextMenu={(e) => handleContextMenu(e, layer.id)}
|
|
|
|
|
|
>
|
2025-11-20 21:24:59 +01:00
|
|
|
|
<button
|
|
|
|
|
|
className="shrink-0 text-muted-foreground hover:text-foreground"
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
e.stopPropagation();
|
2025-11-21 17:42:36 +01:00
|
|
|
|
updateLayerWithHistory(layer.id, { visible: !layer.visible }, 'Toggle Visibility');
|
2025-11-20 21:24:59 +01:00
|
|
|
|
}}
|
2025-11-21 17:42:36 +01:00
|
|
|
|
title="Toggle visibility"
|
2025-11-20 21:24:59 +01:00
|
|
|
|
>
|
2025-11-21 17:42:36 +01:00
|
|
|
|
{layer.visible ? (
|
|
|
|
|
|
<Eye className="h-4 w-4" />
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<EyeOff className="h-4 w-4" />
|
|
|
|
|
|
)}
|
2025-11-20 21:24:59 +01:00
|
|
|
|
</button>
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
|
2025-11-21 17:42:36 +01:00
|
|
|
|
<div className="flex-1 min-w-0">
|
|
|
|
|
|
<p className="text-sm font-medium text-card-foreground truncate">
|
|
|
|
|
|
{layer.name}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p className="text-xs text-muted-foreground">
|
|
|
|
|
|
{layer.width} × {layer.height}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity">
|
|
|
|
|
|
<button
|
|
|
|
|
|
className="shrink-0 text-muted-foreground hover:text-foreground"
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
|
duplicateLayerWithHistory(layer.id);
|
|
|
|
|
|
}}
|
|
|
|
|
|
title="Duplicate layer"
|
|
|
|
|
|
>
|
|
|
|
|
|
<Copy className="h-4 w-4" />
|
|
|
|
|
|
</button>
|
|
|
|
|
|
<button
|
|
|
|
|
|
className="shrink-0 text-muted-foreground hover:text-destructive"
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
|
if (layers.length > 1 && confirm('Delete this layer?')) {
|
|
|
|
|
|
deleteLayerWithHistory(layer.id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
title="Delete layer"
|
|
|
|
|
|
>
|
|
|
|
|
|
<Trash2 className="h-4 w-4" />
|
|
|
|
|
|
</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="shrink-0 text-xs text-muted-foreground">
|
|
|
|
|
|
{Math.round(layer.opacity * 100)}%
|
|
|
|
|
|
</div>
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
</div>
|
2025-11-21 17:42:36 +01:00
|
|
|
|
))
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{/* Layer Effects Panel for Active Layer */}
|
|
|
|
|
|
{activeLayerId && <LayerEffectsPanel layerId={activeLayerId} />}
|
feat: implement Phase 2 - Core Canvas Engine with layer system
Complete canvas rendering infrastructure and state management:
**Type System (types/)**
- Layer interface with blend modes, opacity, visibility
- Canvas state with zoom, pan, grid, rulers
- Tool types and settings interfaces
- Selection and pointer state types
**State Management (store/)**
- Layer store: CRUD operations, reordering, merging, flattening
- Canvas store: zoom (0.1x-10x), pan, grid, rulers, coordinate conversion
- Tool store: active tool, brush settings (size, opacity, hardness, flow)
- Full Zustand integration with selectors
**Utilities (lib/)**
- Canvas utils: create, clone, resize, load images, draw grid/checkerboard
- General utils: cn, clamp, lerp, distance, snap to grid, debounce, throttle
- Image data handling with error safety
**Components**
- CanvasWrapper: Multi-layer rendering with transformations
- Checkerboard transparency background
- Layer compositing with blend modes and opacity
- Grid overlay support
- Selection visualization
- Mouse wheel zoom (Ctrl+scroll)
- Middle-click or Shift+click panning
- LayersPanel: Interactive layer management
- Visibility toggle with eye icon
- Active layer selection
- Opacity display
- Delete with confirmation
- Sorted by z-order
- EditorLayout: Full editor interface
- Top toolbar with zoom controls (±, fit to screen, percentage)
- Canvas area with full viewport
- Right sidebar for layers panel
- "New Layer" button with auto-naming
**Features Implemented**
✓ Multi-layer canvas with proper z-ordering
✓ Layer visibility, opacity, blend modes
✓ Zoom: 10%-1000% with Ctrl+wheel
✓ Pan: Middle-click or Shift+drag
✓ Grid overlay (toggleable)
✓ Selection rendering
✓ Background color support
✓ Create/delete/duplicate layers
✓ Layer merging and flattening
**Performance**
- Dev server: 451ms startup
- Efficient canvas rendering with transformations
- Debounced/throttled event handlers ready
- Memory-safe image data operations
Ready for Phase 3: History & Undo System
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 21:20:06 +01:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|