62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
|
|
export type TransformType = 'move' | 'rotate' | 'scale' | 'free-transform';
|
||
|
|
|
||
|
|
export type TransformHandle =
|
||
|
|
| 'top-left'
|
||
|
|
| 'top-center'
|
||
|
|
| 'top-right'
|
||
|
|
| 'middle-left'
|
||
|
|
| 'middle-right'
|
||
|
|
| 'bottom-left'
|
||
|
|
| 'bottom-center'
|
||
|
|
| 'bottom-right'
|
||
|
|
| 'rotate';
|
||
|
|
|
||
|
|
export interface TransformBounds {
|
||
|
|
x: number;
|
||
|
|
y: number;
|
||
|
|
width: number;
|
||
|
|
height: number;
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface TransformState {
|
||
|
|
x: number;
|
||
|
|
y: number;
|
||
|
|
scaleX: number;
|
||
|
|
scaleY: number;
|
||
|
|
rotation: number; // in degrees
|
||
|
|
skewX: number;
|
||
|
|
skewY: number;
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface Transform {
|
||
|
|
layerId: string;
|
||
|
|
originalBounds: TransformBounds;
|
||
|
|
currentState: TransformState;
|
||
|
|
isActive: boolean;
|
||
|
|
maintainAspectRatio: boolean;
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface TransformMatrix {
|
||
|
|
a: number; // scaleX
|
||
|
|
b: number; // skewY
|
||
|
|
c: number; // skewX
|
||
|
|
d: number; // scaleY
|
||
|
|
e: number; // translateX
|
||
|
|
f: number; // translateY
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface TransformStore {
|
||
|
|
activeTransform: Transform | null;
|
||
|
|
transformType: TransformType;
|
||
|
|
showHandles: boolean;
|
||
|
|
maintainAspectRatio: boolean;
|
||
|
|
|
||
|
|
setTransformType: (type: TransformType) => void;
|
||
|
|
setShowHandles: (show: boolean) => void;
|
||
|
|
setMaintainAspectRatio: (maintain: boolean) => void;
|
||
|
|
startTransform: (layerId: string, bounds: TransformBounds) => void;
|
||
|
|
updateTransform: (state: Partial<TransformState>) => void;
|
||
|
|
applyTransform: () => void;
|
||
|
|
cancelTransform: () => void;
|
||
|
|
}
|