import type { LeviarObject } from './LeviarObject.js'; export interface Attribute { type: string; id: string; name: string; className: string; physics?: 'dynamic' | 'static' | null; density?: number; friction?: number; frictionAir?: number; restitution?: number; fixedRotation?: boolean; gravityScale?: number; collisionGroup?: number; collisionMask?: number; collisionCategory?: number; } export type DatasetValue = string | number | boolean | object | Array; export interface Dataset { [key: string]: DatasetValue; } export type CssCursor = 'auto' | 'default' | 'none' | 'context-menu' | 'help' | 'pointer' | 'progress' | 'wait' | 'cell' | 'crosshair' | 'text' | 'vertical-text' | 'alias' | 'copy' | 'move' | 'no-drop' | 'not-allowed' | 'grab' | 'grabbing' | 'all-scroll' | 'col-resize' | 'row-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | 'ne-resize' | 'nw-resize' | 'se-resize' | 'sw-resize' | 'ew-resize' | 'ns-resize' | 'nesw-resize' | 'nwse-resize' | 'zoom-in' | 'zoom-out'; export type BlendMode = 'source-over' | 'source-in' | 'source-out' | 'source-atop' | 'destination-over' | 'destination-in' | 'destination-out' | 'lighter' | 'copy' | 'xor' | 'multiply' | 'screen' | 'lighten' | 'darken' | 'exclusion' | 'difference'; export interface Style { /** text 객체의 텍스트 색상 전용 */ color?: string; /** * 도형(rect, ellipse) 배경. 아래 3가지 방식 중 하나로 동작합니다. * - `'url(에셋키)'` — load로 불러온 이미지 에셋을 배경으로 표시 * - `'linear-gradient(...)'` — 선형 그라디언트 * - `'radial-gradient(...)'` — 원형 그라디언트 * - `'rgba(...)' | '#hex' | ...` — 단색 배경 */ background?: string; /** 이미지 배경의 크기 조절 방식 ('cover' | 'contain' | 'auto') */ backgroundSize?: 'cover' | 'contain' | 'auto'; opacity: number; width?: number; height?: number; minWidth?: number; maxWidth?: number; minHeight?: number; maxHeight?: number; blur?: number; borderColor?: string; borderWidth?: number; outlineColor?: string; outlineWidth?: number; fontSize?: number; fontFamily?: string; fontWeight?: string | number; fontStyle?: 'normal' | 'italic'; textAlign?: 'left' | 'center' | 'right'; lineHeight?: number; display: 'block' | 'none'; pointerEvents: boolean; margin?: string; textShadowColor?: string; textShadowBlur?: number; textShadowOffsetX?: number; textShadowOffsetY?: number; boxShadowColor?: string; boxShadowBlur?: number; boxShadowSpread?: number; boxShadowOffsetX?: number; boxShadowOffsetY?: number; zIndex: number; blendMode?: BlendMode; letterSpacing?: number; borderRadius?: string | number; cursor?: CssCursor; overflow: 'hidden' | 'visible'; transformStyle?: 'preserve-3d' | 'flat'; } export interface Vec3 { x: number; y: number; z: number; } export interface Transform { readonly position: Vec3; readonly rotation: Vec3; readonly scale: Vec3; readonly pivot: { x: number; y: number; }; } export interface LeviarObjectOptions = Record, D extends Record = Record> { attribute?: Partial & T>; dataset?: D; style?: Partial