Files
paint-ui/types/layer.ts
Sebastian Krüger 4ddb8fe0e3 feat(phase-13): implement layer masks foundation for non-destructive editing
Add comprehensive layer mask system with core functionality for non-destructive editing.

Features:
- LayerMask interface with canvas, enabled, and inverted properties
- Layer interface updated with mask property
- Full mask management in layer store:
  * addMask() - Creates white mask (fully visible)
  * removeMask() - Removes mask from layer
  * toggleMask() - Enable/disable mask
  * invertMask() - Invert mask values
  * applyMask() - Apply mask to layer and remove
- Duplicate layer now clones masks
- Grayscale mask system (white=reveal, black=hide)

Changes:
- Updated types/layer.ts with LayerMask interface
- Modified Layer interface to include mask property
- Updated store/layer-store.ts:
  * Added mask property initialization to createLayer
  * Added 5 new mask management functions
  * Updated duplicateLayer to clone masks

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 19:57:49 +01:00

86 lines
1.8 KiB
TypeScript

/**
* Blend modes for layer compositing
*/
export type BlendMode =
| 'normal'
| 'multiply'
| 'screen'
| 'overlay'
| 'darken'
| 'lighten'
| 'color-dodge'
| 'color-burn'
| 'hard-light'
| 'soft-light'
| 'difference'
| 'exclusion'
| 'hue'
| 'saturation'
| 'color'
| 'luminosity';
/**
* Layer mask data
*/
export interface LayerMask {
/** Canvas element containing the mask's grayscale data */
canvas: HTMLCanvasElement | null;
/** Whether the mask is currently enabled */
enabled: boolean;
/** Whether to invert the mask (white=hide, black=reveal) */
inverted: boolean;
}
/**
* Layer interface representing a single layer in the canvas
*/
export interface Layer {
/** Unique identifier for the layer */
id: string;
/** Display name of the layer */
name: string;
/** Canvas element containing the layer's image data */
canvas: HTMLCanvasElement | null;
/** Visibility state */
visible: boolean;
/** Opacity (0-1) */
opacity: number;
/** Blend mode for compositing */
blendMode: BlendMode;
/** Z-index order (higher = on top) */
order: number;
/** Lock state (prevents editing) */
locked: boolean;
/** Layer dimensions */
width: number;
height: number;
/** Position offset */
x: number;
y: number;
/** Layer mask for non-destructive editing */
mask: LayerMask | null;
/** Timestamp of creation */
createdAt: number;
/** Timestamp of last modification */
updatedAt: number;
}
/**
* Partial layer data for updates
*/
export type LayerUpdate = Partial<Omit<Layer, 'id' | 'createdAt'>>;
/**
* Layer creation parameters
*/
export interface CreateLayerParams {
name?: string;
width: number;
height: number;
x?: number;
y?: number;
opacity?: number;
blendMode?: BlendMode;
fillColor?: string;
}