@a-company/atelier-studio 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3621 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +827 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +114 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.js +3578 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/panels/canvas-panel.ts","../src/player.ts","../src/utils/drag-reorder.ts","../src/panels/layer-panel.ts","../src/controls/number-input.ts","../src/controls/color-picker.ts","../src/controls/select-input.ts","../src/controls/slider-input.ts","../src/controls/gradient-editor.ts","../src/controls/fill-editor.ts","../src/controls/easing-curve-editor.ts","../src/controls/easing-picker.ts","../src/controls/range-slider.ts","../src/panels/delta-panel.ts","../src/panels/property-panel.ts","../src/panels/yaml-panel.ts","../src/theme.ts","../src/history.ts","../src/export/video-exporter.ts","../src/export/gif-encoder.ts","../src/export/export-dialog.ts","../src/studio.ts"],"sourcesContent":["import \"./styles.css\";\nexport { AtelierStudio } from \"./studio.js\";\nexport type { StudioOptions, RightTab } from \"./studio.js\";\nexport type { StudioTheme } from \"./theme.js\";\nexport { defaultTheme, applyStudioTheme } from \"./theme.js\";\nexport { exportDocument, supportsWebCodecs, supportsWebM, supportsGifExport } from \"./export/video-exporter.js\";\nexport type { ExportFormat, ExportOptions, ExportResult } from \"./export/video-exporter.js\";\n","import type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { resolveFrame } from \"@a-company/atelier-core\";\nimport { renderFrame, ImageCache } from \"@a-company/atelier-canvas\";\nimport { Player } from \"../player.js\";\n\nexport interface CanvasPanelOptions {\n onFrameChange?: (frame: number) => void;\n}\n\nexport class CanvasPanel {\n readonly el: HTMLElement;\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private player: Player | null = null;\n private playBtn: HTMLButtonElement;\n private scrubber: HTMLInputElement;\n private frameDisplay: HTMLSpanElement;\n private doc: AtelierDocument | null = null;\n private stateName = \"\";\n private imageCache: ImageCache;\n\n constructor(parent: HTMLElement, private opts: CanvasPanelOptions = {}) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-canvas-panel\";\n\n // Canvas\n const wrap = document.createElement(\"div\");\n wrap.className = \"atel-canvas-wrap\";\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = 600;\n this.canvas.height = 400;\n this.ctx = this.canvas.getContext(\"2d\")!;\n this.imageCache = new ImageCache({\n onLoad: () => this.refresh(),\n createImage: (src, onLoad, onError) => {\n const img = new Image();\n img.onload = onLoad;\n img.onerror = onError;\n img.src = src;\n return img;\n },\n });\n wrap.appendChild(this.canvas);\n this.el.appendChild(wrap);\n\n // Playback controls\n const playback = document.createElement(\"div\");\n playback.className = \"atel-playback\";\n\n this.playBtn = document.createElement(\"button\");\n this.playBtn.className = \"atel-playback__btn\";\n this.playBtn.textContent = \"\\u25B6\";\n\n this.scrubber = document.createElement(\"input\");\n this.scrubber.type = \"range\";\n this.scrubber.className = \"atel-playback__scrubber\";\n this.scrubber.min = \"0\";\n this.scrubber.max = \"0\";\n this.scrubber.value = \"0\";\n\n this.frameDisplay = document.createElement(\"span\");\n this.frameDisplay.className = \"atel-playback__frame\";\n this.frameDisplay.textContent = \"0 / 0\";\n\n playback.appendChild(this.playBtn);\n playback.appendChild(this.scrubber);\n playback.appendChild(this.frameDisplay);\n this.el.appendChild(playback);\n\n parent.appendChild(this.el);\n\n // Events\n this.playBtn.addEventListener(\"click\", () => this.togglePlay());\n\n let wasPlaying = false;\n this.scrubber.addEventListener(\"mousedown\", () => {\n wasPlaying = this.player?.isPlaying ?? false;\n this.player?.pause();\n this.updatePlayBtn();\n });\n this.scrubber.addEventListener(\"input\", () => {\n this.player?.seek(Number(this.scrubber.value));\n });\n this.scrubber.addEventListener(\"mouseup\", () => {\n if (wasPlaying) {\n this.player?.play();\n this.updatePlayBtn();\n }\n });\n }\n\n loadDocument(doc: AtelierDocument, stateName?: string): void {\n this.doc = doc;\n this.stateName = stateName ?? Object.keys(doc.states)[0];\n const state = doc.states[this.stateName];\n if (!state) return;\n\n this.canvas.width = doc.canvas.width;\n this.canvas.height = doc.canvas.height;\n\n // Scale canvas to fit container\n const maxWidth = 500;\n if (doc.canvas.width > maxWidth) {\n const scale = maxWidth / doc.canvas.width;\n this.canvas.style.width = `${doc.canvas.width * scale}px`;\n this.canvas.style.height = `${doc.canvas.height * scale}px`;\n } else {\n this.canvas.style.width = \"\";\n this.canvas.style.height = \"\";\n }\n\n const totalFrames = state.duration;\n this.scrubber.max = String(totalFrames - 1);\n this.scrubber.value = \"0\";\n\n if (this.player) this.player.destroy();\n this.player = new Player(doc.canvas.fps, totalFrames, (f) => this.renderAt(f), true);\n\n this.renderAt(0);\n this.player.play();\n this.updatePlayBtn();\n }\n\n setStateName(name: string): void {\n if (!this.doc) return;\n this.stateName = name;\n const state = this.doc.states[name];\n if (!state) return;\n this.scrubber.max = String(state.duration - 1);\n this.scrubber.value = \"0\";\n this.player?.setTotalFrames(state.duration);\n this.player?.seek(0);\n }\n\n renderAt(frame: number): void {\n if (!this.doc) return;\n const resolved = resolveFrame(this.doc, this.stateName, frame);\n renderFrame(this.ctx as any, resolved, this.doc, this.imageCache);\n this.scrubber.value = String(frame);\n const total = this.doc.states[this.stateName]?.duration ?? 0;\n this.frameDisplay.textContent = `${frame} / ${total - 1}`;\n this.opts.onFrameChange?.(frame);\n }\n\n /** Re-render current frame (after doc mutation) */\n refresh(): void {\n if (!this.doc || !this.player) return;\n this.renderAt(this.player.frame);\n }\n\n togglePlay(): void {\n this.player?.toggle();\n this.updatePlayBtn();\n }\n\n stepForward(): void {\n if (this.player) this.player.seek(this.player.frame + 1);\n }\n\n stepBack(): void {\n if (this.player) this.player.seek(Math.max(0, this.player.frame - 1));\n }\n\n private updatePlayBtn(): void {\n this.playBtn.textContent = this.player?.isPlaying ? \"\\u275A\\u275A\" : \"\\u25B6\";\n }\n\n getCanvas(): HTMLCanvasElement {\n return this.canvas;\n }\n\n getImageCache(): ImageCache {\n return this.imageCache;\n }\n\n pause(): void {\n this.player?.pause();\n this.updatePlayBtn();\n }\n\n destroy(): void {\n this.player?.destroy();\n }\n}\n","export class Player {\n private animationId: number | null = null;\n private currentFrame = 0;\n private playing = false;\n private lastTimestamp = 0;\n private accumulator = 0;\n\n constructor(\n private fps: number,\n private totalFrames: number,\n private onFrame: (frame: number) => void,\n private loop = true,\n ) {}\n\n play(): void {\n if (this.playing) return;\n this.playing = true;\n this.lastTimestamp = 0;\n this.accumulator = 0;\n this.animationId = requestAnimationFrame((ts) => this.tick(ts));\n }\n\n pause(): void {\n this.playing = false;\n if (this.animationId !== null) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n }\n\n seek(frame: number): void {\n this.currentFrame = Math.max(0, Math.min(frame, this.totalFrames - 1));\n this.onFrame(this.currentFrame);\n }\n\n toggle(): void {\n if (this.playing) this.pause();\n else this.play();\n }\n\n get isPlaying(): boolean {\n return this.playing;\n }\n\n get frame(): number {\n return this.currentFrame;\n }\n\n setTotalFrames(total: number): void {\n this.totalFrames = total;\n if (this.currentFrame >= total) {\n this.currentFrame = 0;\n }\n }\n\n destroy(): void {\n this.pause();\n }\n\n private tick(timestamp: number): void {\n if (!this.playing) return;\n if (this.lastTimestamp === 0) this.lastTimestamp = timestamp;\n const elapsed = timestamp - this.lastTimestamp;\n this.lastTimestamp = timestamp;\n this.accumulator += elapsed;\n const frameDuration = 1000 / this.fps;\n let frameChanged = false;\n while (this.accumulator >= frameDuration) {\n this.accumulator -= frameDuration;\n this.currentFrame++;\n if (this.currentFrame >= this.totalFrames) {\n if (this.loop) {\n this.currentFrame = 0;\n } else {\n this.currentFrame = this.totalFrames - 1;\n this.pause();\n this.onFrame(this.currentFrame);\n return;\n }\n }\n frameChanged = true;\n }\n if (frameChanged) this.onFrame(this.currentFrame);\n this.animationId = requestAnimationFrame((ts) => this.tick(ts));\n }\n}\n","export interface DragReorderOptions {\n list: HTMLElement;\n itemClass: string;\n onReorder: (from: number, to: number) => void;\n}\n\nexport function enableDragReorder(opts: DragReorderOptions): { destroy: () => void } {\n const { list, itemClass, onReorder } = opts;\n const ac = new AbortController();\n const signal = ac.signal;\n\n let fromIndex = -1;\n\n function getItems(): HTMLElement[] {\n return Array.from(list.querySelectorAll<HTMLElement>(`.${itemClass}`));\n }\n\n function setupHandles(): void {\n for (const item of getItems()) {\n const handle = item.querySelector<HTMLElement>(\".atel-drag-handle\");\n if (!handle || handle.dataset.bound) continue;\n handle.dataset.bound = \"1\";\n\n handle.addEventListener(\n \"pointerdown\",\n () => {\n item.draggable = true;\n },\n { signal },\n );\n\n handle.addEventListener(\n \"pointerup\",\n () => {\n item.draggable = false;\n },\n { signal },\n );\n }\n }\n\n const observer = new MutationObserver(() => setupHandles());\n observer.observe(list, { childList: true });\n setupHandles();\n\n list.addEventListener(\n \"dragstart\",\n (e) => {\n const item = (e.target as HTMLElement).closest<HTMLElement>(`.${itemClass}`);\n if (!item) return;\n fromIndex = getItems().indexOf(item);\n item.classList.add(\"atel-drag-item--dragging\");\n if (e.dataTransfer) e.dataTransfer.effectAllowed = \"move\";\n },\n { signal },\n );\n\n list.addEventListener(\n \"dragover\",\n (e) => {\n e.preventDefault();\n const items = getItems();\n for (const it of items) {\n it.classList.remove(\"atel-drag-indicator--above\", \"atel-drag-indicator--below\");\n }\n const target = (e.target as HTMLElement).closest<HTMLElement>(`.${itemClass}`);\n if (!target) return;\n const rect = target.getBoundingClientRect();\n const mid = rect.top + rect.height / 2;\n if (e.clientY < mid) {\n target.classList.add(\"atel-drag-indicator--above\");\n } else {\n target.classList.add(\"atel-drag-indicator--below\");\n }\n },\n { signal },\n );\n\n list.addEventListener(\n \"drop\",\n (e) => {\n e.preventDefault();\n const items = getItems();\n const target = (e.target as HTMLElement).closest<HTMLElement>(`.${itemClass}`);\n if (!target || fromIndex < 0) return;\n let toIndex = items.indexOf(target);\n const rect = target.getBoundingClientRect();\n const mid = rect.top + rect.height / 2;\n if (e.clientY >= mid) toIndex++;\n // Adjust for source removal\n if (fromIndex < toIndex) toIndex--;\n if (fromIndex !== toIndex && toIndex >= 0) {\n onReorder(fromIndex, toIndex);\n }\n cleanup();\n },\n { signal },\n );\n\n list.addEventListener(\n \"dragend\",\n () => {\n cleanup();\n },\n { signal },\n );\n\n function cleanup(): void {\n fromIndex = -1;\n for (const item of getItems()) {\n item.draggable = false;\n item.classList.remove(\n \"atel-drag-item--dragging\",\n \"atel-drag-indicator--above\",\n \"atel-drag-indicator--below\",\n );\n }\n }\n\n return {\n destroy() {\n ac.abort();\n observer.disconnect();\n },\n };\n}\n","import type { AtelierDocument, Layer } from \"@a-company/atelier-types\";\nimport { enableDragReorder } from \"../utils/drag-reorder.js\";\n\nconst TYPE_ICONS: Record<string, string> = {\n shape: \"\\u25A0\",\n text: \"T\",\n image: \"\\u25A3\",\n group: \"\\u25A8\",\n ref: \"\\u2192\",\n};\n\nexport interface LayerPanelOptions {\n onSelectLayer: (layerId: string | null) => void;\n onDocumentChange: () => void;\n}\n\nexport class LayerPanel {\n readonly el: HTMLElement;\n private list: HTMLElement;\n private doc: AtelierDocument | null = null;\n private selectedId: string | null = null;\n\n constructor(parent: HTMLElement, private opts: LayerPanelOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-layer-panel\";\n\n // Header\n const header = document.createElement(\"div\");\n header.className = \"atel-panel-header\";\n header.textContent = \"Layers\";\n this.el.appendChild(header);\n\n // List\n this.list = document.createElement(\"div\");\n this.list.className = \"atel-layer-list\";\n this.el.appendChild(this.list);\n\n enableDragReorder({\n list: this.list,\n itemClass: \"atel-layer-item\",\n onReorder: (from, to) => this.reorderLayer(from, to),\n });\n\n // Actions\n const actions = document.createElement(\"div\");\n actions.className = \"atel-layer-actions\";\n\n const addBtn = document.createElement(\"button\");\n addBtn.textContent = \"+ Add\";\n addBtn.addEventListener(\"click\", () => this.addLayer());\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.textContent = \"- Remove\";\n removeBtn.addEventListener(\"click\", () => this.removeLayer());\n\n actions.appendChild(addBtn);\n actions.appendChild(removeBtn);\n this.el.appendChild(actions);\n\n parent.appendChild(this.el);\n }\n\n loadDocument(doc: AtelierDocument): void {\n this.doc = doc;\n this.selectedId = null;\n this.render();\n }\n\n getSelectedId(): string | null {\n return this.selectedId;\n }\n\n selectLayer(id: string | null): void {\n this.selectedId = id;\n this.render();\n this.opts.onSelectLayer(id);\n }\n\n removeSelectedLayer(): void {\n this.removeLayer();\n }\n\n refresh(): void {\n this.render();\n }\n\n private render(): void {\n const scrollTop = this.list.scrollTop;\n this.list.innerHTML = \"\";\n if (!this.doc) return;\n\n for (const layer of this.doc.layers) {\n const item = document.createElement(\"div\");\n item.className = `atel-layer-item${layer.id === this.selectedId ? \" atel-layer-item--selected\" : \"\"}`;\n\n const handle = document.createElement(\"span\");\n handle.className = \"atel-drag-handle\";\n handle.textContent = \"\\u2630\";\n\n const icon = document.createElement(\"span\");\n icon.className = \"atel-layer-item__icon\";\n icon.textContent = TYPE_ICONS[layer.visual.type] ?? \"?\";\n\n const idSpan = document.createElement(\"span\");\n idSpan.className = \"atel-layer-item__id\";\n idSpan.textContent = layer.id;\n\n const visBtn = document.createElement(\"button\");\n visBtn.className = \"atel-layer-item__vis\";\n visBtn.textContent = layer.visible === false ? \"\\u25CB\" : \"\\u25C9\";\n visBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n layer.visible = layer.visible === false ? true : false;\n this.render();\n this.opts.onDocumentChange();\n });\n\n item.appendChild(handle);\n item.appendChild(icon);\n item.appendChild(idSpan);\n item.appendChild(visBtn);\n\n item.addEventListener(\"click\", () => {\n this.selectLayer(layer.id);\n });\n\n this.list.appendChild(item);\n }\n this.list.scrollTop = scrollTop;\n }\n\n private reorderLayer(from: number, to: number): void {\n if (!this.doc) return;\n const [moved] = this.doc.layers.splice(from, 1);\n this.doc.layers.splice(to, 0, moved);\n this.render();\n this.opts.onDocumentChange();\n }\n\n private addLayer(): void {\n if (!this.doc) return;\n const id = `layer-${this.doc.layers.length + 1}`;\n const newLayer: Layer = {\n id,\n visual: {\n type: \"shape\",\n shape: { type: \"rect\" },\n fill: { type: \"solid\", color: \"#888888\" },\n },\n frame: { x: 50, y: 50 },\n bounds: { width: 100, height: 100 },\n opacity: 1,\n };\n this.doc.layers.push(newLayer);\n this.selectLayer(id);\n this.opts.onDocumentChange();\n }\n\n private removeLayer(): void {\n if (!this.doc || !this.selectedId) return;\n const idx = this.doc.layers.findIndex((l) => l.id === this.selectedId);\n if (idx === -1) return;\n this.doc.layers.splice(idx, 1);\n\n // Remove associated deltas from all states\n for (const state of Object.values(this.doc.states)) {\n state.deltas = state.deltas.filter((d) => d.layer !== this.selectedId);\n }\n\n this.selectedId = null;\n this.render();\n this.opts.onSelectLayer(null);\n this.opts.onDocumentChange();\n }\n}\n","export interface NumberInputOptions {\n label: string;\n value: number;\n step?: number;\n min?: number;\n max?: number;\n suffix?: string;\n onChange: (value: number) => void;\n}\n\nexport class NumberInput {\n readonly el: HTMLElement;\n private input: HTMLInputElement;\n\n constructor(parent: HTMLElement, private opts: NumberInputOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-number-input\";\n\n const label = document.createElement(\"label\");\n label.className = \"atel-control-label\";\n label.textContent = opts.label;\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"atel-number-input__wrap\";\n\n this.input = document.createElement(\"input\");\n this.input.type = \"number\";\n this.input.className = \"atel-input\";\n this.input.value = String(opts.value);\n if (opts.step !== undefined) this.input.step = String(opts.step);\n if (opts.min !== undefined) this.input.min = String(opts.min);\n if (opts.max !== undefined) this.input.max = String(opts.max);\n\n wrap.appendChild(this.input);\n\n if (opts.suffix) {\n const suf = document.createElement(\"span\");\n suf.className = \"atel-number-input__suffix\";\n suf.textContent = opts.suffix;\n wrap.appendChild(suf);\n }\n\n this.el.appendChild(label);\n this.el.appendChild(wrap);\n parent.appendChild(this.el);\n\n this.input.addEventListener(\"input\", () => {\n const v = parseFloat(this.input.value);\n if (!isNaN(v)) opts.onChange(v);\n });\n }\n\n setValue(v: number): void {\n this.input.value = String(v);\n }\n}\n","export interface ColorPickerOptions {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nexport class ColorPicker {\n readonly el: HTMLElement;\n private input: HTMLInputElement;\n private hex: HTMLSpanElement;\n\n constructor(parent: HTMLElement, private opts: ColorPickerOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-color-picker\";\n\n const label = document.createElement(\"label\");\n label.className = \"atel-control-label\";\n label.textContent = opts.label;\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"atel-color-picker__wrap\";\n\n this.input = document.createElement(\"input\");\n this.input.type = \"color\";\n this.input.className = \"atel-color-picker__input\";\n this.input.value = normalizeHex(opts.value);\n\n this.hex = document.createElement(\"span\");\n this.hex.className = \"atel-color-picker__hex\";\n this.hex.textContent = this.input.value;\n\n wrap.appendChild(this.input);\n wrap.appendChild(this.hex);\n this.el.appendChild(label);\n this.el.appendChild(wrap);\n parent.appendChild(this.el);\n\n this.input.addEventListener(\"input\", () => {\n this.hex.textContent = this.input.value;\n opts.onChange(this.input.value);\n });\n }\n\n setValue(v: string): void {\n this.input.value = normalizeHex(v);\n this.hex.textContent = this.input.value;\n }\n}\n\nfunction normalizeHex(c: string): string {\n if (c.startsWith(\"#\") && c.length >= 7) return c.slice(0, 7);\n if (c.startsWith(\"#\") && c.length === 4) {\n return \"#\" + c[1] + c[1] + c[2] + c[2] + c[3] + c[3];\n }\n return c;\n}\n","export interface SelectInputOptions {\n label: string;\n value: string;\n options: { label: string; value: string }[];\n onChange: (value: string) => void;\n}\n\nexport class SelectInput {\n readonly el: HTMLElement;\n private select: HTMLSelectElement;\n\n constructor(parent: HTMLElement, private opts: SelectInputOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-select-input\";\n\n const label = document.createElement(\"label\");\n label.className = \"atel-control-label\";\n label.textContent = opts.label;\n\n this.select = document.createElement(\"select\");\n this.select.className = \"atel-input\";\n\n for (const opt of opts.options) {\n const o = document.createElement(\"option\");\n o.value = opt.value;\n o.textContent = opt.label;\n if (opt.value === opts.value) o.selected = true;\n this.select.appendChild(o);\n }\n\n this.el.appendChild(label);\n this.el.appendChild(this.select);\n parent.appendChild(this.el);\n\n this.select.addEventListener(\"change\", () => {\n opts.onChange(this.select.value);\n });\n }\n\n setValue(v: string): void {\n this.select.value = v;\n }\n}\n","export interface SliderInputOptions {\n label: string;\n value: number;\n min: number;\n max: number;\n step?: number;\n onChange: (value: number) => void;\n}\n\nexport class SliderInput {\n readonly el: HTMLElement;\n private input: HTMLInputElement;\n private display: HTMLSpanElement;\n\n constructor(parent: HTMLElement, private opts: SliderInputOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-slider-input\";\n\n const label = document.createElement(\"label\");\n label.className = \"atel-control-label\";\n label.textContent = opts.label;\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"atel-slider-input__wrap\";\n\n this.input = document.createElement(\"input\");\n this.input.type = \"range\";\n this.input.className = \"atel-slider-input__range\";\n this.input.min = String(opts.min);\n this.input.max = String(opts.max);\n this.input.step = String(opts.step ?? 0.01);\n this.input.value = String(opts.value);\n\n this.display = document.createElement(\"span\");\n this.display.className = \"atel-slider-input__value\";\n this.display.textContent = formatValue(opts.value);\n\n wrap.appendChild(this.input);\n wrap.appendChild(this.display);\n this.el.appendChild(label);\n this.el.appendChild(wrap);\n parent.appendChild(this.el);\n\n this.input.addEventListener(\"input\", () => {\n const v = parseFloat(this.input.value);\n this.display.textContent = formatValue(v);\n opts.onChange(v);\n });\n }\n\n setValue(v: number): void {\n this.input.value = String(v);\n this.display.textContent = formatValue(v);\n }\n}\n\nfunction formatValue(v: number): string {\n return v % 1 === 0 ? String(v) : v.toFixed(2);\n}\n","import type { GradientStop } from \"@a-company/atelier-types\";\nimport { ColorPicker } from \"./color-picker.js\";\nimport { SliderInput } from \"./slider-input.js\";\n\nexport interface GradientEditorOptions {\n stops: GradientStop[];\n onChange: (stops: GradientStop[]) => void;\n}\n\nexport class GradientEditor {\n readonly el: HTMLElement;\n private stopsContainer: HTMLElement;\n private preview: HTMLElement;\n\n constructor(parent: HTMLElement, private opts: GradientEditorOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-gradient-editor\";\n\n // Preview bar\n this.preview = document.createElement(\"div\");\n this.preview.className = \"atel-gradient-editor__preview\";\n this.el.appendChild(this.preview);\n\n // Stops container\n this.stopsContainer = document.createElement(\"div\");\n this.stopsContainer.className = \"atel-gradient-editor__stops\";\n this.el.appendChild(this.stopsContainer);\n\n // Add stop button\n const addBtn = document.createElement(\"button\");\n addBtn.className = \"atel-gradient-editor__add\";\n addBtn.textContent = \"+ Add Stop\";\n addBtn.addEventListener(\"click\", () => this.addStop());\n this.el.appendChild(addBtn);\n\n parent.appendChild(this.el);\n\n this.buildStops();\n this.updatePreview();\n }\n\n private buildStops(): void {\n this.stopsContainer.innerHTML = \"\";\n const sorted = this.sortedStops();\n\n for (let i = 0; i < sorted.length; i++) {\n const stop = sorted[i];\n const row = document.createElement(\"div\");\n row.className = \"atel-gradient-editor__stop\";\n\n const color = typeof stop.color === \"string\" ? stop.color : \"#888888\";\n new ColorPicker(row, {\n label: \"\",\n value: color,\n onChange: (v) => {\n stop.color = v;\n this.updatePreview();\n this.opts.onChange(this.opts.stops);\n },\n });\n\n new SliderInput(row, {\n label: \"\",\n value: stop.offset,\n min: 0,\n max: 1,\n step: 0.01,\n onChange: (v) => {\n stop.offset = v;\n this.updatePreview();\n this.opts.onChange(this.opts.stops);\n },\n });\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.className = \"atel-gradient-editor__remove\";\n removeBtn.textContent = \"\\u00D7\";\n removeBtn.disabled = this.opts.stops.length <= 2;\n removeBtn.addEventListener(\"click\", () => {\n const idx = this.opts.stops.indexOf(stop);\n if (idx !== -1 && this.opts.stops.length > 2) {\n this.opts.stops.splice(idx, 1);\n this.buildStops();\n this.updatePreview();\n this.opts.onChange(this.opts.stops);\n }\n });\n row.appendChild(removeBtn);\n\n this.stopsContainer.appendChild(row);\n }\n }\n\n private addStop(): void {\n const sorted = this.sortedStops();\n const a = sorted[sorted.length - 2];\n const b = sorted[sorted.length - 1];\n const offset = (a.offset + b.offset) / 2;\n const color = typeof b.color === \"string\" ? b.color : \"#888888\";\n this.opts.stops.push({ offset, color });\n this.buildStops();\n this.updatePreview();\n this.opts.onChange(this.opts.stops);\n }\n\n private sortedStops(): GradientStop[] {\n return [...this.opts.stops].sort((a, b) => a.offset - b.offset);\n }\n\n private updatePreview(): void {\n const sorted = this.sortedStops();\n const parts = sorted.map((s) => {\n const c = typeof s.color === \"string\" ? s.color : \"#888888\";\n return `${c} ${(s.offset * 100).toFixed(0)}%`;\n });\n this.preview.style.background =\n `linear-gradient(90deg, ${parts.join(\", \")})`;\n }\n}\n","import type { Fill, GradientStop } from \"@a-company/atelier-types\";\nimport { ColorPicker } from \"./color-picker.js\";\nimport { NumberInput } from \"./number-input.js\";\nimport { SelectInput } from \"./select-input.js\";\nimport { GradientEditor } from \"./gradient-editor.js\";\n\nexport interface FillEditorOptions {\n fill: Fill;\n onChange: (fill: Fill) => void;\n}\n\nconst FILL_TYPE_OPTIONS = [\n { label: \"Solid\", value: \"solid\" },\n { label: \"Linear Gradient\", value: \"linear-gradient\" },\n { label: \"Radial Gradient\", value: \"radial-gradient\" },\n];\n\nexport class FillEditor {\n readonly el: HTMLElement;\n private body: HTMLElement;\n\n constructor(parent: HTMLElement, private opts: FillEditorOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-fill-editor\";\n\n new SelectInput(this.el, {\n label: \"Fill Type\",\n value: opts.fill.type,\n options: FILL_TYPE_OPTIONS,\n onChange: (v) => this.switchType(v as Fill[\"type\"]),\n });\n\n this.body = document.createElement(\"div\");\n this.body.className = \"atel-fill-editor__body\";\n this.el.appendChild(this.body);\n\n parent.appendChild(this.el);\n\n this.buildBody();\n }\n\n private buildBody(): void {\n this.body.innerHTML = \"\";\n const fill = this.opts.fill;\n\n if (fill.type === \"solid\") {\n const color = typeof fill.color === \"string\" ? fill.color : \"#888888\";\n new ColorPicker(this.body, {\n label: \"Color\",\n value: color,\n onChange: (v) => {\n if (this.opts.fill.type === \"solid\") {\n this.opts.fill.color = v;\n this.opts.onChange(this.opts.fill);\n }\n },\n });\n } else if (fill.type === \"linear-gradient\") {\n new NumberInput(this.body, {\n label: \"Angle\",\n value: fill.angle,\n step: 1,\n suffix: \"\\u00B0\",\n onChange: (v) => {\n if (this.opts.fill.type === \"linear-gradient\") {\n this.opts.fill.angle = v;\n this.opts.onChange(this.opts.fill);\n }\n },\n });\n\n new GradientEditor(this.body, {\n stops: fill.stops,\n onChange: (stops) => {\n if (this.opts.fill.type === \"linear-gradient\") {\n this.opts.fill.stops = stops;\n this.opts.onChange(this.opts.fill);\n }\n },\n });\n } else if (fill.type === \"radial-gradient\") {\n const row = document.createElement(\"div\");\n row.className = \"atel-prop-row\";\n this.body.appendChild(row);\n\n new NumberInput(row, {\n label: \"Center X\",\n value: parseUnit(fill.center.x),\n step: 1,\n suffix: \"%\",\n onChange: (v) => {\n if (this.opts.fill.type === \"radial-gradient\") {\n this.opts.fill.center.x = `${v}%`;\n this.opts.onChange(this.opts.fill);\n }\n },\n });\n\n new NumberInput(row, {\n label: \"Center Y\",\n value: parseUnit(fill.center.y),\n step: 1,\n suffix: \"%\",\n onChange: (v) => {\n if (this.opts.fill.type === \"radial-gradient\") {\n this.opts.fill.center.y = `${v}%`;\n this.opts.onChange(this.opts.fill);\n }\n },\n });\n\n new NumberInput(this.body, {\n label: \"Radius\",\n value: parseUnit(fill.radius),\n step: 1,\n suffix: \"%\",\n onChange: (v) => {\n if (this.opts.fill.type === \"radial-gradient\") {\n this.opts.fill.radius = `${v}%`;\n this.opts.onChange(this.opts.fill);\n }\n },\n });\n\n new GradientEditor(this.body, {\n stops: fill.stops,\n onChange: (stops) => {\n if (this.opts.fill.type === \"radial-gradient\") {\n this.opts.fill.stops = stops;\n this.opts.onChange(this.opts.fill);\n }\n },\n });\n }\n }\n\n private switchType(newType: Fill[\"type\"]): void {\n const current = this.opts.fill;\n let newFill: Fill;\n\n if (newType === \"solid\") {\n // Gradient → solid: use first stop's color\n const color = extractFirstColor(current);\n newFill = { type: \"solid\", color };\n } else if (newType === \"linear-gradient\") {\n const stops = extractStops(current);\n const angle = current.type === \"linear-gradient\" ? current.angle : 0;\n newFill = { type: \"linear-gradient\", angle, stops };\n } else {\n const stops = extractStops(current);\n const center = current.type === \"radial-gradient\"\n ? current.center\n : { x: \"50%\" as const, y: \"50%\" as const };\n const radius = current.type === \"radial-gradient\"\n ? current.radius\n : (\"50%\" as const);\n newFill = { type: \"radial-gradient\", center, radius, stops };\n }\n\n this.opts.fill = newFill;\n this.opts.onChange(newFill);\n this.buildBody();\n }\n}\n\nfunction extractFirstColor(fill: Fill): string {\n if (fill.type === \"solid\") {\n return typeof fill.color === \"string\" ? fill.color : \"#888888\";\n }\n const first = fill.stops[0];\n return first && typeof first.color === \"string\" ? first.color : \"#888888\";\n}\n\nfunction extractStops(fill: Fill): GradientStop[] {\n if (fill.type === \"solid\") {\n const color = typeof fill.color === \"string\" ? fill.color : \"#888888\";\n return [\n { offset: 0, color },\n { offset: 1, color: \"#ffffff\" },\n ];\n }\n return fill.stops;\n}\n\nfunction parseUnit(v: number | string): number {\n if (typeof v === \"number\") return v;\n return parseFloat(v) || 0;\n}\n","import type { Easing, CubicBezierEasing, SpringEasing, StepEasing } from \"@a-company/atelier-types\";\nimport { cubicBezier, easeIn, easeOut, easeInOut, step, linear } from \"@a-company/atelier-math\";\n\nexport interface EasingCurveEditorOptions {\n value: Easing | undefined;\n onChange: (value: Easing) => void;\n}\n\nconst CANVAS_SIZE = 160;\nconst PAD = 20;\nconst PLOT_SIZE = CANVAS_SIZE - PAD * 2;\nconst HANDLE_R = 6;\n\n/**\n * Visual easing curve editor.\n * Draws the easing function as a graph with draggable control points for cubic-bezier.\n */\nexport class EasingCurveEditor {\n readonly el: HTMLElement;\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private easing: Easing;\n private dragging: \"p1\" | \"p2\" | null = null;\n private abortController = new AbortController();\n\n constructor(parent: HTMLElement, private opts: EasingCurveEditorOptions) {\n this.easing = opts.value ?? { type: \"linear\" };\n\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-easing-curve\";\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = CANVAS_SIZE * 2; // 2x for retina\n this.canvas.height = CANVAS_SIZE * 2;\n this.canvas.style.width = `${CANVAS_SIZE}px`;\n this.canvas.style.height = `${CANVAS_SIZE}px`;\n this.canvas.className = \"atel-easing-curve__canvas\";\n\n this.ctx = this.canvas.getContext(\"2d\")!;\n this.ctx.scale(2, 2);\n\n this.el.appendChild(this.canvas);\n\n // Info label\n const info = document.createElement(\"div\");\n info.className = \"atel-easing-curve__info\";\n info.textContent = this.getLabel();\n this.el.appendChild(info);\n\n parent.appendChild(this.el);\n\n // Interaction for cubic-bezier\n const signal = this.abortController.signal;\n this.canvas.addEventListener(\"mousedown\", (e) => this.onMouseDown(e), { signal });\n this.canvas.addEventListener(\"mousemove\", (e) => this.onMouseMove(e), { signal });\n this.canvas.addEventListener(\"mouseup\", () => this.onMouseUp(), { signal });\n this.canvas.addEventListener(\"mouseleave\", () => this.onMouseUp(), { signal });\n\n this.draw();\n }\n\n setValue(v: Easing | undefined): void {\n this.easing = v ?? { type: \"linear\" };\n this.draw();\n this.updateInfo();\n }\n\n destroy(): void {\n this.abortController.abort();\n }\n\n private getLabel(): string {\n const e = this.easing;\n if (typeof e === \"string\") return e;\n if (e.type === \"cubic-bezier\") {\n return `cubic-bezier(${e.x1.toFixed(2)}, ${e.y1.toFixed(2)}, ${e.x2.toFixed(2)}, ${e.y2.toFixed(2)})`;\n }\n if (e.type === \"spring\") {\n return `spring(m:${e.mass ?? 1} k:${e.stiffness ?? 100} d:${e.damping ?? 10})`;\n }\n if (e.type === \"step\") {\n return `steps(${e.steps}, ${e.position ?? \"end\"})`;\n }\n return e.type;\n }\n\n private updateInfo(): void {\n const info = this.el.querySelector(\".atel-easing-curve__info\") as HTMLElement;\n if (info) info.textContent = this.getLabel();\n }\n\n private getEasingFunction(): (t: number) => number {\n const e = this.easing;\n if (typeof e === \"string\") {\n switch (e) {\n case \"ease-in\": return easeIn;\n case \"ease-out\": return easeOut;\n case \"ease-in-out\": return easeInOut;\n default: return linear;\n }\n }\n switch (e.type) {\n case \"linear\": return linear;\n case \"cubic-bezier\": return cubicBezier(e.x1, e.y1, e.x2, e.y2);\n case \"spring\": return this.buildSpringFn(e);\n case \"step\": return step(e.steps, e.position);\n default: return linear;\n }\n }\n\n private buildSpringFn(s: SpringEasing): (t: number) => number {\n const mass = s.mass ?? 1;\n const stiffness = s.stiffness ?? 100;\n const damping = s.damping ?? 10;\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\n return (t: number): number => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n const scaledT = t * 3; // scale to ~3 seconds\n if (zeta >= 1) {\n // Overdamped\n return 1 - Math.exp(-w0 * scaledT) * (1 + w0 * scaledT);\n }\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * scaledT) * (Math.cos(wd * scaledT) + (zeta * w0 / wd) * Math.sin(wd * scaledT));\n };\n }\n\n // ── Drawing ──────────────────────────────────────────────\n\n private draw(): void {\n const ctx = this.ctx;\n const w = CANVAS_SIZE;\n const h = CANVAS_SIZE;\n\n ctx.clearRect(0, 0, w, h);\n\n // Background\n ctx.fillStyle = \"rgba(0,0,0,0.3)\";\n ctx.fillRect(PAD, PAD, PLOT_SIZE, PLOT_SIZE);\n\n // Grid lines\n ctx.strokeStyle = \"rgba(255,255,255,0.08)\";\n ctx.lineWidth = 1;\n for (let i = 1; i < 4; i++) {\n const pos = PAD + (PLOT_SIZE / 4) * i;\n ctx.beginPath();\n ctx.moveTo(pos, PAD);\n ctx.lineTo(pos, PAD + PLOT_SIZE);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(PAD, pos);\n ctx.lineTo(PAD + PLOT_SIZE, pos);\n ctx.stroke();\n }\n\n // Diagonal reference (linear)\n ctx.strokeStyle = \"rgba(255,255,255,0.15)\";\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n ctx.moveTo(PAD, PAD + PLOT_SIZE);\n ctx.lineTo(PAD + PLOT_SIZE, PAD);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Easing curve\n const fn = this.getEasingFunction();\n ctx.strokeStyle = \"#58a6ff\";\n ctx.lineWidth = 2;\n ctx.beginPath();\n\n const samples = 100;\n for (let i = 0; i <= samples; i++) {\n const t = i / samples;\n const v = fn(t);\n const x = PAD + t * PLOT_SIZE;\n const y = PAD + PLOT_SIZE - v * PLOT_SIZE;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.stroke();\n\n // Draw control point handles for cubic-bezier\n const e = this.easing;\n if (typeof e !== \"string\" && e.type === \"cubic-bezier\") {\n this.drawBezierHandles(e);\n }\n\n // Axis labels\n ctx.fillStyle = \"rgba(255,255,255,0.3)\";\n ctx.font = \"9px monospace\";\n ctx.textAlign = \"center\";\n ctx.fillText(\"0\", PAD, PAD + PLOT_SIZE + 14);\n ctx.fillText(\"1\", PAD + PLOT_SIZE, PAD + PLOT_SIZE + 14);\n ctx.textAlign = \"right\";\n ctx.fillText(\"0\", PAD - 4, PAD + PLOT_SIZE + 3);\n ctx.fillText(\"1\", PAD - 4, PAD + 3);\n }\n\n private drawBezierHandles(e: CubicBezierEasing): void {\n const ctx = this.ctx;\n\n // P0 = (0, 0) at bottom-left, P3 = (1, 1) at top-right\n const p0x = PAD;\n const p0y = PAD + PLOT_SIZE;\n const p3x = PAD + PLOT_SIZE;\n const p3y = PAD;\n\n const p1x = PAD + e.x1 * PLOT_SIZE;\n const p1y = PAD + PLOT_SIZE - e.y1 * PLOT_SIZE;\n const p2x = PAD + e.x2 * PLOT_SIZE;\n const p2y = PAD + PLOT_SIZE - e.y2 * PLOT_SIZE;\n\n // Control lines\n ctx.strokeStyle = \"rgba(255,255,255,0.3)\";\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(p0x, p0y);\n ctx.lineTo(p1x, p1y);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(p3x, p3y);\n ctx.lineTo(p2x, p2y);\n ctx.stroke();\n\n // Control point circles\n // P1\n ctx.fillStyle = \"#ff6b6b\";\n ctx.beginPath();\n ctx.arc(p1x, p1y, HANDLE_R, 0, Math.PI * 2);\n ctx.fill();\n ctx.strokeStyle = \"rgba(255,255,255,0.6)\";\n ctx.lineWidth = 1.5;\n ctx.stroke();\n\n // P2\n ctx.fillStyle = \"#51cf66\";\n ctx.beginPath();\n ctx.arc(p2x, p2y, HANDLE_R, 0, Math.PI * 2);\n ctx.fill();\n ctx.strokeStyle = \"rgba(255,255,255,0.6)\";\n ctx.lineWidth = 1.5;\n ctx.stroke();\n }\n\n // ── Interaction ──────────────────────────────────────────\n\n private canvasToPlot(e: MouseEvent): { x: number; y: number } {\n const rect = this.canvas.getBoundingClientRect();\n const px = (e.clientX - rect.left);\n const py = (e.clientY - rect.top);\n const x = (px - PAD) / PLOT_SIZE;\n const y = 1 - (py - PAD) / PLOT_SIZE;\n return { x, y };\n }\n\n private onMouseDown(e: MouseEvent): void {\n const easing = this.easing;\n if (typeof easing === \"string\" || easing.type !== \"cubic-bezier\") return;\n\n const { x, y } = this.canvasToPlot(e);\n const dist1 = Math.hypot(x - easing.x1, y - easing.y1);\n const dist2 = Math.hypot(x - easing.x2, y - easing.y2);\n const threshold = HANDLE_R / PLOT_SIZE + 0.03;\n\n if (dist1 < threshold && dist1 <= dist2) {\n this.dragging = \"p1\";\n this.canvas.style.cursor = \"grabbing\";\n } else if (dist2 < threshold) {\n this.dragging = \"p2\";\n this.canvas.style.cursor = \"grabbing\";\n }\n }\n\n private onMouseMove(e: MouseEvent): void {\n const easing = this.easing;\n if (typeof easing === \"string\" || easing.type !== \"cubic-bezier\") return;\n\n if (!this.dragging) {\n // Hover cursor\n const { x, y } = this.canvasToPlot(e);\n const dist1 = Math.hypot(x - easing.x1, y - easing.y1);\n const dist2 = Math.hypot(x - easing.x2, y - easing.y2);\n const threshold = HANDLE_R / PLOT_SIZE + 0.03;\n this.canvas.style.cursor = (dist1 < threshold || dist2 < threshold) ? \"grab\" : \"\";\n return;\n }\n\n const { x, y } = this.canvasToPlot(e);\n // Clamp x to [0, 1], allow y to overshoot slightly for bounce effects\n const cx = Math.max(0, Math.min(1, x));\n const cy = Math.max(-0.5, Math.min(1.5, y));\n\n if (this.dragging === \"p1\") {\n easing.x1 = Math.round(cx * 100) / 100;\n easing.y1 = Math.round(cy * 100) / 100;\n } else {\n easing.x2 = Math.round(cx * 100) / 100;\n easing.y2 = Math.round(cy * 100) / 100;\n }\n\n this.draw();\n this.updateInfo();\n this.opts.onChange(easing);\n }\n\n private onMouseUp(): void {\n if (this.dragging) {\n this.dragging = null;\n this.canvas.style.cursor = \"\";\n }\n }\n}\n","import type { Easing } from \"@a-company/atelier-types\";\nimport { EasingCurveEditor } from \"./easing-curve-editor.js\";\nimport { NumberInput } from \"./number-input.js\";\nimport { SelectInput } from \"./select-input.js\";\n\nexport interface EasingPickerOptions {\n label: string;\n value: Easing | undefined;\n onChange: (value: Easing | undefined) => void;\n}\n\nconst PRESET_OPTIONS = [\n { label: \"Linear\", value: \"linear\" },\n { label: \"Ease In\", value: \"ease-in\" },\n { label: \"Ease Out\", value: \"ease-out\" },\n { label: \"Ease In-Out\", value: \"ease-in-out\" },\n { label: \"Spring\", value: \"spring\" },\n { label: \"Cubic Bezier\", value: \"cubic-bezier\" },\n { label: \"Step\", value: \"step\" },\n];\n\nexport class EasingPicker {\n readonly el: HTMLElement;\n private select: HTMLSelectElement;\n private configContainer: HTMLElement;\n private curveEditor: EasingCurveEditor | null = null;\n private currentEasing: Easing | undefined;\n\n constructor(parent: HTMLElement, private opts: EasingPickerOptions) {\n this.currentEasing = opts.value;\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-easing-picker\";\n\n const label = document.createElement(\"label\");\n label.className = \"atel-control-label\";\n label.textContent = opts.label;\n\n this.select = document.createElement(\"select\");\n this.select.className = \"atel-input\";\n\n for (const o of PRESET_OPTIONS) {\n const opt = document.createElement(\"option\");\n opt.value = o.value;\n opt.textContent = o.label;\n this.select.appendChild(opt);\n }\n\n this.configContainer = document.createElement(\"div\");\n this.configContainer.className = \"atel-easing-picker__config\";\n\n this.el.appendChild(label);\n this.el.appendChild(this.select);\n this.el.appendChild(this.configContainer);\n parent.appendChild(this.el);\n\n // Set initial selection\n this.syncFromValue(opts.value);\n\n this.select.addEventListener(\"change\", () => {\n this.emitChange();\n });\n }\n\n private syncFromValue(v: Easing | undefined): void {\n this.currentEasing = v;\n if (!v) {\n this.select.value = \"linear\";\n } else if (typeof v === \"string\") {\n this.select.value = v;\n } else {\n this.select.value = v.type;\n }\n this.updateConfig();\n }\n\n private updateConfig(): void {\n this.configContainer.innerHTML = \"\";\n this.curveEditor?.destroy();\n this.curveEditor = null;\n\n const easing = this.currentEasing;\n\n // Curve preview for all types\n this.curveEditor = new EasingCurveEditor(this.configContainer, {\n value: easing,\n onChange: (v) => {\n this.currentEasing = v;\n this.opts.onChange(v);\n },\n });\n\n // Config inputs for parameterized types\n if (typeof easing !== \"string\" && easing) {\n if (easing.type === \"cubic-bezier\") {\n this.buildBezierConfig(easing);\n } else if (easing.type === \"spring\") {\n this.buildSpringConfig(easing);\n } else if (easing.type === \"step\") {\n this.buildStepConfig(easing);\n }\n }\n }\n\n private buildBezierConfig(easing: { type: \"cubic-bezier\"; x1: number; y1: number; x2: number; y2: number }): void {\n const row = document.createElement(\"div\");\n row.className = \"atel-easing-picker__params\";\n\n new NumberInput(row, {\n label: \"x1\",\n value: easing.x1,\n step: 0.01,\n min: 0,\n max: 1,\n onChange: (v) => {\n easing.x1 = v;\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n new NumberInput(row, {\n label: \"y1\",\n value: easing.y1,\n step: 0.01,\n onChange: (v) => {\n easing.y1 = v;\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n new NumberInput(row, {\n label: \"x2\",\n value: easing.x2,\n step: 0.01,\n min: 0,\n max: 1,\n onChange: (v) => {\n easing.x2 = v;\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n new NumberInput(row, {\n label: \"y2\",\n value: easing.y2,\n step: 0.01,\n onChange: (v) => {\n easing.y2 = v;\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n\n this.configContainer.appendChild(row);\n }\n\n private buildSpringConfig(easing: { type: \"spring\"; mass?: number; stiffness?: number; damping?: number }): void {\n const row = document.createElement(\"div\");\n row.className = \"atel-easing-picker__params\";\n\n new NumberInput(row, {\n label: \"Mass\",\n value: easing.mass ?? 1,\n step: 0.1,\n min: 0.1,\n onChange: (v) => {\n easing.mass = v;\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n new NumberInput(row, {\n label: \"Stiffness\",\n value: easing.stiffness ?? 100,\n step: 10,\n min: 1,\n onChange: (v) => {\n easing.stiffness = v;\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n new NumberInput(row, {\n label: \"Damping\",\n value: easing.damping ?? 10,\n step: 1,\n min: 0,\n onChange: (v) => {\n easing.damping = v;\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n\n this.configContainer.appendChild(row);\n }\n\n private buildStepConfig(easing: { type: \"step\"; steps: number; position?: \"start\" | \"end\" }): void {\n const row = document.createElement(\"div\");\n row.className = \"atel-easing-picker__params\";\n\n new NumberInput(row, {\n label: \"Steps\",\n value: easing.steps,\n step: 1,\n min: 1,\n max: 20,\n onChange: (v) => {\n easing.steps = Math.round(v);\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n new SelectInput(row, {\n label: \"Position\",\n value: easing.position ?? \"end\",\n options: [\n { label: \"End\", value: \"end\" },\n { label: \"Start\", value: \"start\" },\n ],\n onChange: (v) => {\n easing.position = v as \"start\" | \"end\";\n this.curveEditor?.setValue(easing);\n this.opts.onChange(easing);\n },\n });\n\n this.configContainer.appendChild(row);\n }\n\n private emitChange(): void {\n const val = this.select.value;\n let easing: Easing | undefined;\n if (val === \"linear\") {\n easing = { type: \"linear\" };\n } else if (val === \"ease-in\" || val === \"ease-out\" || val === \"ease-in-out\") {\n easing = val;\n } else if (val === \"spring\") {\n easing = { type: \"spring\", mass: 1, stiffness: 100, damping: 10 };\n } else if (val === \"cubic-bezier\") {\n easing = { type: \"cubic-bezier\", x1: 0.25, y1: 0.1, x2: 0.25, y2: 1 };\n } else if (val === \"step\") {\n easing = { type: \"step\", steps: 5, position: \"end\" };\n }\n this.currentEasing = easing;\n this.updateConfig();\n this.opts.onChange(easing);\n }\n\n setValue(v: Easing | undefined): void {\n this.syncFromValue(v);\n }\n}\n","export interface RangeSliderOptions {\n label: string;\n min: number;\n max: number;\n step?: number;\n valueLow: number;\n valueHigh: number;\n onChangeLow: (v: number) => void;\n onChangeHigh: (v: number) => void;\n}\n\nexport class RangeSlider {\n readonly el: HTMLElement;\n private inputLow: HTMLInputElement;\n private inputHigh: HTMLInputElement;\n private fill: HTMLElement;\n\n constructor(parent: HTMLElement, private opts: RangeSliderOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-range-slider-control\";\n\n const label = document.createElement(\"label\");\n label.className = \"atel-control-label\";\n label.textContent = opts.label;\n this.el.appendChild(label);\n\n const slider = document.createElement(\"div\");\n slider.className = \"atel-range-slider\";\n\n const track = document.createElement(\"div\");\n track.className = \"atel-range-slider__track\";\n slider.appendChild(track);\n\n this.fill = document.createElement(\"div\");\n this.fill.className = \"atel-range-slider__fill\";\n slider.appendChild(this.fill);\n\n const step = opts.step ?? 1;\n\n this.inputLow = document.createElement(\"input\");\n this.inputLow.type = \"range\";\n this.inputLow.min = String(opts.min);\n this.inputLow.max = String(opts.max);\n this.inputLow.step = String(step);\n this.inputLow.value = String(opts.valueLow);\n\n this.inputHigh = document.createElement(\"input\");\n this.inputHigh.type = \"range\";\n this.inputHigh.min = String(opts.min);\n this.inputHigh.max = String(opts.max);\n this.inputHigh.step = String(step);\n this.inputHigh.value = String(opts.valueHigh);\n\n slider.appendChild(this.inputLow);\n slider.appendChild(this.inputHigh);\n\n this.el.appendChild(slider);\n parent.appendChild(this.el);\n\n this.updateFill();\n\n this.inputLow.addEventListener(\"input\", () => {\n let low = parseInt(this.inputLow.value, 10);\n const high = parseInt(this.inputHigh.value, 10);\n if (low > high) {\n low = high;\n this.inputLow.value = String(low);\n }\n this.updateFill();\n opts.onChangeLow(low);\n });\n\n this.inputHigh.addEventListener(\"input\", () => {\n const low = parseInt(this.inputLow.value, 10);\n let high = parseInt(this.inputHigh.value, 10);\n if (high < low) {\n high = low;\n this.inputHigh.value = String(high);\n }\n this.updateFill();\n opts.onChangeHigh(high);\n });\n }\n\n setValue(low: number, high: number): void {\n this.inputLow.value = String(low);\n this.inputHigh.value = String(high);\n this.updateFill();\n }\n\n private updateFill(): void {\n const min = this.opts.min;\n const max = this.opts.max;\n const range = max - min || 1;\n const low = parseInt(this.inputLow.value, 10);\n const high = parseInt(this.inputHigh.value, 10);\n const left = ((low - min) / range) * 100;\n const right = ((max - high) / range) * 100;\n this.fill.style.left = `${left}%`;\n this.fill.style.right = `${right}%`;\n }\n}\n","import type { AtelierDocument, State, Delta, AnimatableProperty, Easing } from \"@a-company/atelier-types\";\nimport { NumberInput } from \"../controls/number-input.js\";\nimport { SliderInput } from \"../controls/slider-input.js\";\nimport { ColorPicker } from \"../controls/color-picker.js\";\nimport { SelectInput } from \"../controls/select-input.js\";\nimport { EasingPicker } from \"../controls/easing-picker.js\";\nimport { RangeSlider } from \"../controls/range-slider.js\";\nimport { enableDragReorder } from \"../utils/drag-reorder.js\";\n\nconst ANIMATABLE_PROPERTIES: { label: string; value: AnimatableProperty }[] = [\n { label: \"frame.x\", value: \"frame.x\" },\n { label: \"frame.y\", value: \"frame.y\" },\n { label: \"bounds.width\", value: \"bounds.width\" },\n { label: \"bounds.height\", value: \"bounds.height\" },\n { label: \"opacity\", value: \"opacity\" },\n { label: \"rotation\", value: \"rotation\" },\n { label: \"scale.x\", value: \"scale.x\" },\n { label: \"scale.y\", value: \"scale.y\" },\n { label: \"anchorPoint.x\", value: \"anchorPoint.x\" },\n { label: \"anchorPoint.y\", value: \"anchorPoint.y\" },\n { label: \"visual.fill.color\", value: \"visual.fill.color\" },\n { label: \"visual.stroke.color\", value: \"visual.stroke.color\" },\n { label: \"visual.stroke.width\", value: \"visual.stroke.width\" },\n { label: \"visual.stroke.start\", value: \"visual.stroke.start\" },\n { label: \"visual.stroke.end\", value: \"visual.stroke.end\" },\n { label: \"visual.shape.cornerRadius\", value: \"visual.shape.cornerRadius\" },\n { label: \"visual.style.fontSize\", value: \"visual.style.fontSize\" },\n { label: \"visual.style.color\", value: \"visual.style.color\" },\n { label: \"shadow.blur\", value: \"shadow.blur\" },\n { label: \"shadow.color\", value: \"shadow.color\" },\n { label: \"shadow.offsetX\", value: \"shadow.offsetX\" },\n { label: \"shadow.offsetY\", value: \"shadow.offsetY\" },\n];\n\nexport interface DeltaPanelOptions {\n doc: AtelierDocument;\n state: State;\n stateName: string;\n layerId: string;\n onDeltaChange: () => void;\n}\n\nexport class DeltaPanel {\n readonly el: HTMLElement;\n private deltas: Delta[];\n private list: HTMLElement;\n private title: HTMLElement;\n private expandedIndex: number | null = null;\n\n constructor(parent: HTMLElement, private opts: DeltaPanelOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-prop-section\";\n\n this.deltas = opts.state.deltas.filter((d) => d.layer === opts.layerId);\n\n this.title = document.createElement(\"div\");\n this.title.className = \"atel-prop-section__title atel-prop-section__title--deltas\";\n\n const titleText = document.createElement(\"span\");\n titleText.textContent = `Deltas (${this.deltas.length})`;\n this.title.appendChild(titleText);\n\n const sortBtn = document.createElement(\"button\");\n sortBtn.className = \"atel-delta-sort-btn\";\n sortBtn.textContent = \"\\u2195 Sort\";\n sortBtn.title = \"Sort by start frame\";\n sortBtn.addEventListener(\"click\", () => this.sortByStartFrame());\n this.title.appendChild(sortBtn);\n\n this.el.appendChild(this.title);\n\n this.list = document.createElement(\"div\");\n this.list.className = \"atel-delta-list\";\n this.el.appendChild(this.list);\n\n enableDragReorder({\n list: this.list,\n itemClass: \"atel-delta-item\",\n onReorder: (from, to) => this.reorderDelta(from, to),\n });\n\n this.renderList();\n\n // Add delta button\n const actions = document.createElement(\"div\");\n actions.className = \"atel-delta-actions\";\n const addBtn = document.createElement(\"button\");\n addBtn.textContent = \"+ Add Delta\";\n addBtn.addEventListener(\"click\", () => this.addDelta());\n actions.appendChild(addBtn);\n this.el.appendChild(actions);\n\n parent.appendChild(this.el);\n }\n\n private updateTitleCount(): void {\n const span = this.title.firstElementChild;\n if (span) span.textContent = `Deltas (${this.deltas.length})`;\n }\n\n private renderList(): void {\n this.list.innerHTML = \"\";\n for (let i = 0; i < this.deltas.length; i++) {\n this.list.appendChild(this.renderDelta(this.deltas[i], i));\n }\n }\n\n private renderDelta(delta: Delta, index: number): HTMLElement {\n const expanded = this.expandedIndex === index;\n const item = document.createElement(\"div\");\n item.className = \"atel-delta-item\" + (expanded ? \" atel-delta-item--expanded\" : \"\");\n\n // Header row\n const header = document.createElement(\"div\");\n header.className = \"atel-delta-item__header\";\n\n const handle = document.createElement(\"span\");\n handle.className = \"atel-drag-handle\";\n handle.textContent = \"\\u2630\";\n\n const prop = document.createElement(\"span\");\n prop.className = \"atel-delta-item__prop\";\n prop.textContent = delta.property;\n\n const range = document.createElement(\"span\");\n range.className = \"atel-delta-item__range\";\n range.textContent = `[${delta.range[0]}\\u2013${delta.range[1]}]`;\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.className = \"atel-delta-item__remove\";\n removeBtn.textContent = \"\\u2715\";\n removeBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n this.removeDelta(delta);\n });\n\n header.addEventListener(\"click\", () => {\n this.expandedIndex = this.expandedIndex === index ? null : index;\n this.renderList();\n });\n\n header.appendChild(handle);\n if (delta.name) {\n const nameSpan = document.createElement(\"span\");\n nameSpan.className = \"atel-delta-item__name\";\n nameSpan.textContent = delta.name;\n header.appendChild(nameSpan);\n }\n header.appendChild(prop);\n header.appendChild(range);\n header.appendChild(removeBtn);\n item.appendChild(header);\n\n if (expanded) {\n item.appendChild(this.buildEditor(delta));\n } else {\n // Detail row (collapsed summary)\n const detail = document.createElement(\"div\");\n detail.className = \"atel-delta-item__detail\";\n const easingLabel = formatEasing(delta.easing);\n detail.textContent = `${formatValue(delta.from)} \\u2192 ${formatValue(delta.to)} ${easingLabel}`;\n item.appendChild(detail);\n\n // Mini timeline bar\n const duration = this.opts.state.duration || 1;\n const bar = document.createElement(\"div\");\n bar.className = \"atel-delta-item__minibar\";\n const fill = document.createElement(\"div\");\n fill.className = \"atel-delta-item__minibar-fill\";\n const left = (delta.range[0] / duration) * 100;\n const right = ((duration - delta.range[1]) / duration) * 100;\n fill.style.left = `${left}%`;\n fill.style.right = `${right}%`;\n bar.appendChild(fill);\n item.appendChild(bar);\n }\n\n return item;\n }\n\n private buildEditor(delta: Delta): HTMLElement {\n const editor = document.createElement(\"div\");\n editor.className = \"atel-delta-item__editor\";\n\n const notify = () => this.opts.onDeltaChange();\n\n // Name input\n const nameRow = document.createElement(\"div\");\n nameRow.className = \"atel-delta-item__editor-row\";\n const nameLabel = document.createElement(\"label\");\n nameLabel.className = \"atel-control-label\";\n nameLabel.textContent = \"Name\";\n const nameInput = document.createElement(\"input\");\n nameInput.type = \"text\";\n nameInput.className = \"atel-input\";\n nameInput.placeholder = \"unnamed\";\n nameInput.value = delta.name ?? \"\";\n nameInput.addEventListener(\"input\", () => {\n const v = nameInput.value.trim();\n delta.name = v || undefined;\n this.renderList();\n notify();\n });\n nameRow.appendChild(nameLabel);\n nameRow.appendChild(nameInput);\n editor.appendChild(nameRow);\n\n // Property selector\n const propRow = document.createElement(\"div\");\n propRow.className = \"atel-delta-item__editor-row\";\n new SelectInput(propRow, {\n label: \"Property\",\n value: delta.property,\n options: ANIMATABLE_PROPERTIES,\n onChange: (v) => {\n const prev = delta.property;\n delta.property = v as AnimatableProperty;\n if (prev !== delta.property) {\n const defaults = getDefaultValues(delta.property);\n delta.from = defaults.from;\n delta.to = defaults.to;\n this.renderList();\n }\n notify();\n },\n });\n editor.appendChild(propRow);\n\n // From control\n const fromRow = document.createElement(\"div\");\n fromRow.className = \"atel-delta-item__editor-row\";\n this.buildControlForProperty(fromRow, delta.property, \"From\", delta.from, (v) => {\n delta.from = v;\n notify();\n });\n editor.appendChild(fromRow);\n\n // To control\n const toRow = document.createElement(\"div\");\n toRow.className = \"atel-delta-item__editor-row\";\n this.buildControlForProperty(toRow, delta.property, \"To\", delta.to, (v) => {\n delta.to = v;\n notify();\n });\n editor.appendChild(toRow);\n\n // Easing picker\n const easingRow = document.createElement(\"div\");\n easingRow.className = \"atel-delta-item__editor-row\";\n new EasingPicker(easingRow, {\n label: \"Easing\",\n value: delta.easing,\n onChange: (v) => {\n delta.easing = v;\n notify();\n },\n });\n editor.appendChild(easingRow);\n\n // Range slider\n const sliderRow = document.createElement(\"div\");\n sliderRow.className = \"atel-delta-item__editor-row\";\n const rangeSlider = new RangeSlider(sliderRow, {\n label: \"Frame Range\",\n min: 0,\n max: Math.max(1, this.opts.state.duration),\n step: 1,\n valueLow: delta.range[0],\n valueHigh: delta.range[1],\n onChangeLow: (v) => {\n delta.range[0] = v;\n startInput.setValue(v);\n notify();\n },\n onChangeHigh: (v) => {\n delta.range[1] = v;\n endInput.setValue(v);\n notify();\n },\n });\n editor.appendChild(sliderRow);\n\n // Range inputs\n const rangeRow = document.createElement(\"div\");\n rangeRow.className = \"atel-delta-item__editor-row atel-delta-item__editor-row--range\";\n const startInput = new NumberInput(rangeRow, {\n label: \"Start Frame\",\n value: delta.range[0],\n step: 1,\n min: 0,\n onChange: (v) => {\n delta.range[0] = Math.round(v);\n rangeSlider.setValue(delta.range[0], delta.range[1]);\n notify();\n },\n });\n const endInput = new NumberInput(rangeRow, {\n label: \"End Frame\",\n value: delta.range[1],\n step: 1,\n min: 0,\n onChange: (v) => {\n delta.range[1] = Math.round(v);\n rangeSlider.setValue(delta.range[0], delta.range[1]);\n notify();\n },\n });\n editor.appendChild(rangeRow);\n\n return editor;\n }\n\n private buildControlForProperty(\n parent: HTMLElement,\n property: AnimatableProperty,\n label: string,\n value: unknown,\n onChange: (v: unknown) => void,\n ): void {\n if (isColorProperty(property)) {\n new ColorPicker(parent, {\n label,\n value: typeof value === \"string\" ? value : \"#000000\",\n onChange,\n });\n } else if (property === \"opacity\" || property === \"visual.stroke.start\" || property === \"visual.stroke.end\") {\n new SliderInput(parent, {\n label,\n value: typeof value === \"number\" ? value : 0,\n min: 0,\n max: 1,\n step: 0.01,\n onChange,\n });\n } else {\n const config = getNumberConfig(property);\n new NumberInput(parent, {\n label,\n value: typeof value === \"number\" ? value : 0,\n ...config,\n onChange: (v) => onChange(v),\n });\n }\n }\n\n private reorderDelta(from: number, to: number): void {\n const allDeltas = this.opts.state.deltas;\n const layerId = this.opts.layerId;\n\n // Find absolute indices of this layer's deltas in the flat array\n const absIndices: number[] = [];\n for (let i = 0; i < allDeltas.length; i++) {\n if (allDeltas[i].layer === layerId) absIndices.push(i);\n }\n\n const absFrom = absIndices[from];\n const [moved] = allDeltas.splice(absFrom, 1);\n\n // Re-scan after removal to find where to insert\n const newAbsIndices: number[] = [];\n for (let i = 0; i < allDeltas.length; i++) {\n if (allDeltas[i].layer === layerId) newAbsIndices.push(i);\n }\n\n let insertAt: number;\n if (to >= newAbsIndices.length) {\n // Insert after the last delta of this layer\n insertAt = (newAbsIndices.length > 0 ? newAbsIndices[newAbsIndices.length - 1] : absFrom) + 1;\n } else {\n insertAt = newAbsIndices[to];\n }\n\n allDeltas.splice(insertAt, 0, moved);\n this.deltas = allDeltas.filter((d) => d.layer === layerId);\n this.expandedIndex = null;\n this.renderList();\n this.opts.onDeltaChange();\n }\n\n private sortByStartFrame(): void {\n this.deltas.sort((a, b) => a.range[0] - b.range[0]);\n\n // Apply sorted order back to the flat state.deltas array\n const allDeltas = this.opts.state.deltas;\n const layerId = this.opts.layerId;\n\n // Remove this layer's deltas from the flat array\n const otherDeltas = allDeltas.filter((d) => d.layer !== layerId);\n\n // Find where the first delta of this layer was (insertion point)\n let insertAt = allDeltas.findIndex((d) => d.layer === layerId);\n if (insertAt === -1) insertAt = allDeltas.length;\n\n // Rebuild: other deltas before + sorted layer deltas + other deltas after\n allDeltas.length = 0;\n for (let i = 0; i < otherDeltas.length; i++) {\n allDeltas.push(otherDeltas[i]);\n }\n // Re-insert sorted deltas at original position\n for (let i = this.deltas.length - 1; i >= 0; i--) {\n allDeltas.splice(Math.min(insertAt, allDeltas.length), 0, this.deltas[i]);\n }\n\n this.expandedIndex = null;\n this.renderList();\n this.opts.onDeltaChange();\n }\n\n private addDelta(): void {\n const delta: Delta = {\n layer: this.opts.layerId,\n property: \"opacity\",\n range: [0, Math.max(1, this.opts.state.duration - 1)],\n from: 0,\n to: 1,\n easing: \"ease-out\",\n };\n this.opts.state.deltas.push(delta);\n this.deltas = this.opts.state.deltas.filter((d) => d.layer === this.opts.layerId);\n this.expandedIndex = this.deltas.length - 1;\n this.updateTitleCount();\n this.renderList();\n this.opts.onDeltaChange();\n }\n\n private removeDelta(delta: Delta): void {\n const idx = this.opts.state.deltas.indexOf(delta);\n if (idx !== -1) {\n this.opts.state.deltas.splice(idx, 1);\n this.deltas = this.opts.state.deltas.filter((d) => d.layer === this.opts.layerId);\n this.expandedIndex = null;\n this.updateTitleCount();\n this.renderList();\n this.opts.onDeltaChange();\n }\n }\n}\n\nfunction isColorProperty(p: AnimatableProperty): boolean {\n return p === \"visual.fill.color\" || p === \"visual.stroke.color\" || p === \"visual.style.color\" || p === \"shadow.color\";\n}\n\nfunction getNumberConfig(p: AnimatableProperty): { step?: number; min?: number; max?: number; suffix?: string } {\n switch (p) {\n case \"frame.x\":\n case \"frame.y\":\n case \"anchorPoint.x\":\n case \"anchorPoint.y\":\n return { step: 1 };\n case \"bounds.width\":\n case \"bounds.height\":\n return { step: 1, min: 1 };\n case \"rotation\":\n return { step: 1, suffix: \"\\u00B0\" };\n case \"scale.x\":\n case \"scale.y\":\n return { step: 0.1 };\n case \"visual.stroke.width\":\n case \"visual.shape.cornerRadius\":\n return { step: 1, min: 0 };\n case \"visual.style.fontSize\":\n return { step: 1, min: 1 };\n case \"shadow.blur\":\n return { step: 1, min: 0, max: 50 };\n case \"shadow.offsetX\":\n case \"shadow.offsetY\":\n return { step: 1 };\n default:\n return { step: 1 };\n }\n}\n\nfunction getDefaultValues(p: AnimatableProperty): { from: unknown; to: unknown } {\n if (isColorProperty(p)) return { from: \"#000000\", to: \"#ffffff\" };\n if (p === \"opacity\" || p === \"visual.stroke.start\" || p === \"visual.stroke.end\") return { from: 0, to: 1 };\n if (p === \"scale.x\" || p === \"scale.y\") return { from: 1, to: 2 };\n if (p === \"bounds.width\" || p === \"bounds.height\") return { from: 100, to: 200 };\n if (p === \"shadow.blur\") return { from: 0, to: 30 };\n if (p === \"shadow.offsetX\" || p === \"shadow.offsetY\") return { from: 0, to: 10 };\n return { from: 0, to: 100 };\n}\n\nfunction formatValue(v: unknown): string {\n if (typeof v === \"number\") return v % 1 === 0 ? String(v) : (v as number).toFixed(2);\n if (typeof v === \"string\") return v;\n return String(v);\n}\n\nfunction formatEasing(e: Easing | undefined): string {\n if (!e) return \"linear\";\n if (typeof e === \"string\") return e;\n return e.type;\n}\n","import type { AtelierDocument, Layer, AnimatableProperty } from \"@a-company/atelier-types\";\nimport { NumberInput } from \"../controls/number-input.js\";\nimport { ColorPicker } from \"../controls/color-picker.js\";\nimport { SelectInput } from \"../controls/select-input.js\";\nimport { SliderInput } from \"../controls/slider-input.js\";\nimport { FillEditor } from \"../controls/fill-editor.js\";\nimport { DeltaPanel } from \"./delta-panel.js\";\n\nexport interface PropertyPanelOptions {\n onPropertyChange: () => void;\n}\n\nexport class PropertyPanel {\n readonly el: HTMLElement;\n private scroll: HTMLElement;\n private deltaPanel: DeltaPanel | null = null;\n private doc: AtelierDocument | null = null;\n private stateName = \"\";\n private layerId: string | null = null;\n\n constructor(parent: HTMLElement, private opts: PropertyPanelOptions) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-property-panel\";\n\n const header = document.createElement(\"div\");\n header.className = \"atel-panel-header\";\n header.textContent = \"Properties\";\n this.el.appendChild(header);\n\n this.scroll = document.createElement(\"div\");\n this.scroll.className = \"atel-property-scroll\";\n this.el.appendChild(this.scroll);\n\n parent.appendChild(this.el);\n }\n\n loadDocument(doc: AtelierDocument, stateName: string): void {\n this.doc = doc;\n this.stateName = stateName;\n }\n\n setStateName(name: string): void {\n this.stateName = name;\n if (this.layerId) this.selectLayer(this.layerId);\n }\n\n selectLayer(layerId: string | null): void {\n this.layerId = layerId;\n this.render();\n }\n\n refresh(): void {\n this.render();\n }\n\n private render(): void {\n this.scroll.innerHTML = \"\";\n this.deltaPanel = null;\n\n if (!this.doc || !this.layerId) {\n const empty = document.createElement(\"div\");\n empty.className = \"atel-empty\";\n empty.textContent = \"Select a layer\";\n this.scroll.appendChild(empty);\n return;\n }\n\n const layer = this.doc.layers.find((l) => l.id === this.layerId);\n if (!layer) return;\n\n // Layer ID\n this.addSection(\"Layer\", () => {\n const row = this.makeRow(true);\n this.addTextInput(row, \"ID\", layer.id, (v) => {\n // Update all delta references\n for (const state of Object.values(this.doc!.states)) {\n for (const d of state.deltas) {\n if (d.layer === layer.id) d.layer = v;\n }\n }\n layer.id = v;\n this.layerId = v;\n this.opts.onPropertyChange();\n });\n });\n\n // Position\n this.addSection(\"Position\", () => {\n const row = this.makeRow();\n new NumberInput(row, {\n label: \"X\", value: layer.frame.x as number, step: 1,\n onChange: (v) => { layer.frame.x = v; this.opts.onPropertyChange(); },\n });\n new NumberInput(row, {\n label: \"Y\", value: layer.frame.y as number, step: 1,\n onChange: (v) => { layer.frame.y = v; this.opts.onPropertyChange(); },\n });\n });\n\n // Size\n this.addSection(\"Size\", () => {\n const row = this.makeRow();\n new NumberInput(row, {\n label: \"W\", value: layer.bounds.width as number, step: 1, min: 1,\n onChange: (v) => { layer.bounds.width = v; this.opts.onPropertyChange(); },\n });\n new NumberInput(row, {\n label: \"H\", value: layer.bounds.height as number, step: 1, min: 1,\n onChange: (v) => { layer.bounds.height = v; this.opts.onPropertyChange(); },\n });\n });\n\n // Transform\n this.addSection(\"Transform\", () => {\n const row1 = this.makeRow(true);\n new SliderInput(row1, {\n label: \"Opacity\", value: layer.opacity ?? 1, min: 0, max: 1, step: 0.01,\n onChange: (v) => { layer.opacity = v; this.opts.onPropertyChange(); },\n });\n\n const row2 = this.makeRow();\n new NumberInput(row2, {\n label: \"Rotation\", value: layer.rotation ?? 0, step: 1, suffix: \"\\u00B0\",\n onChange: (v) => { layer.rotation = v; this.opts.onPropertyChange(); },\n });\n\n const row3 = this.makeRow();\n new NumberInput(row3, {\n label: \"Scale X\", value: layer.scale?.x ?? 1, step: 0.1,\n onChange: (v) => {\n if (!layer.scale) layer.scale = { x: 1, y: 1 };\n layer.scale.x = v;\n this.opts.onPropertyChange();\n },\n });\n new NumberInput(row3, {\n label: \"Scale Y\", value: layer.scale?.y ?? 1, step: 0.1,\n onChange: (v) => {\n if (!layer.scale) layer.scale = { x: 1, y: 1 };\n layer.scale.y = v;\n this.opts.onPropertyChange();\n },\n });\n });\n\n // Shadow\n this.addShadowSection(layer);\n\n // Visual-specific properties\n this.addVisualSection(layer);\n\n // Deltas\n const state = this.doc.states[this.stateName];\n if (state) {\n this.deltaPanel = new DeltaPanel(this.scroll, {\n doc: this.doc,\n state,\n stateName: this.stateName,\n layerId: this.layerId,\n onDeltaChange: () => this.opts.onPropertyChange(),\n });\n }\n }\n\n private addVisualSection(layer: Layer): void {\n const visual = layer.visual;\n\n if (visual.type === \"shape\") {\n this.addSection(\"Visual\", () => {\n // Fill\n if (visual.fill) {\n const row = this.makeRow(true);\n new FillEditor(row, {\n fill: visual.fill,\n onChange: (newFill) => {\n visual.fill = newFill;\n this.opts.onPropertyChange();\n },\n });\n }\n\n // Stroke\n if (visual.stroke) {\n const row = this.makeRow(true);\n const strokeColor = typeof visual.stroke.color === \"string\"\n ? visual.stroke.color : \"#000000\";\n new ColorPicker(row, {\n label: \"Stroke\",\n value: strokeColor,\n onChange: (v) => {\n if (visual.stroke) {\n visual.stroke.color = v;\n this.opts.onPropertyChange();\n }\n },\n });\n\n const row2 = this.makeRow(true);\n new NumberInput(row2, {\n label: \"Stroke Width\",\n value: visual.stroke.width,\n step: 1,\n min: 0,\n onChange: (v) => {\n if (visual.stroke) {\n visual.stroke.width = v;\n this.opts.onPropertyChange();\n }\n },\n });\n\n const row2b = this.makeRow();\n new SliderInput(row2b, {\n label: \"Start\",\n value: visual.stroke.strokeStart ?? 0,\n min: 0, max: 1, step: 0.01,\n onChange: (v) => {\n if (visual.stroke) {\n visual.stroke.strokeStart = v;\n this.opts.onPropertyChange();\n }\n },\n });\n new SliderInput(row2b, {\n label: \"End\",\n value: visual.stroke.strokeEnd ?? 1,\n min: 0, max: 1, step: 0.01,\n onChange: (v) => {\n if (visual.stroke) {\n visual.stroke.strokeEnd = v;\n this.opts.onPropertyChange();\n }\n },\n });\n }\n\n // Corner radius (rect only)\n if (visual.shape.type === \"rect\") {\n const cr = typeof visual.shape.cornerRadius === \"number\"\n ? visual.shape.cornerRadius : 0;\n const row = this.makeRow(true);\n new NumberInput(row, {\n label: \"Corner Radius\",\n value: cr,\n step: 1,\n min: 0,\n onChange: (v) => {\n if (visual.shape.type === \"rect\") {\n visual.shape.cornerRadius = v;\n this.opts.onPropertyChange();\n }\n },\n });\n }\n });\n\n // Path point editing\n if (visual.shape.type === \"path\") {\n this.addSection(\"Path Points\", () => {\n const points = visual.shape.points;\n for (let i = 0; i < points.length; i++) {\n const row = this.makeRow();\n const label = document.createElement(\"span\");\n label.className = \"atel-control-label\";\n label.textContent = `P${i}`;\n label.style.minWidth = \"24px\";\n row.appendChild(label);\n\n const idx = i; // capture for closures\n new NumberInput(row, {\n label: \"X\", value: points[idx].x, step: 1,\n onChange: (v) => { points[idx].x = v; this.opts.onPropertyChange(); },\n });\n new NumberInput(row, {\n label: \"Y\", value: points[idx].y, step: 1,\n onChange: (v) => { points[idx].y = v; this.opts.onPropertyChange(); },\n });\n\n const rmBtn = document.createElement(\"button\");\n rmBtn.className = \"atel-toolbar__btn\";\n rmBtn.textContent = \"\\u2715\";\n rmBtn.style.padding = \"2px 6px\";\n rmBtn.addEventListener(\"click\", () => {\n points.splice(idx, 1);\n this.render();\n this.opts.onPropertyChange();\n });\n row.appendChild(rmBtn);\n }\n\n // Closed toggle\n const closedRow = this.makeRow(true);\n const closedLabel = document.createElement(\"label\");\n closedLabel.className = \"atel-control-label\";\n closedLabel.textContent = \"Closed\";\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = visual.shape.closed ?? false;\n checkbox.addEventListener(\"change\", () => {\n if (visual.shape.type === \"path\") {\n visual.shape.closed = checkbox.checked;\n this.opts.onPropertyChange();\n }\n });\n closedRow.appendChild(closedLabel);\n closedRow.appendChild(checkbox);\n\n // Add point button\n const addRow = this.makeRow(true);\n const addBtn = document.createElement(\"button\");\n addBtn.className = \"atel-toolbar__btn\";\n addBtn.textContent = \"+ Add Point\";\n addBtn.addEventListener(\"click\", () => {\n if (visual.shape.type === \"path\") {\n const last = visual.shape.points[visual.shape.points.length - 1] ?? { x: 0, y: 0 };\n visual.shape.points.push({ x: last.x + 20, y: last.y });\n this.render();\n this.opts.onPropertyChange();\n }\n });\n addRow.appendChild(addBtn);\n });\n }\n }\n\n if (visual.type === \"image\") {\n this.addSection(\"Image\", () => {\n const iv = visual;\n\n // Asset ID (read-only display)\n const row1 = this.makeRow(true);\n this.addTextInput(row1, \"Asset ID\", iv.assetId ?? \"\", (v) => {\n iv.assetId = v;\n this.opts.onPropertyChange();\n });\n\n // src (direct URL / data-URL)\n const row2 = this.makeRow(true);\n this.addTextInput(row2, \"Src\", iv.src ?? \"\", (v) => {\n iv.src = v;\n this.opts.onPropertyChange();\n });\n\n // If doc.assets has a matching asset, show \"Use Asset\" button\n if (this.doc && iv.assetId && this.doc.assets?.[iv.assetId]) {\n const row3 = this.makeRow(true);\n const useBtn = document.createElement(\"button\");\n useBtn.className = \"atel-toolbar__btn\";\n useBtn.textContent = \"Use Asset\";\n useBtn.addEventListener(\"click\", () => {\n if (this.doc?.assets?.[iv.assetId]) {\n iv.src = this.doc.assets[iv.assetId].src;\n this.render();\n this.opts.onPropertyChange();\n }\n });\n row3.appendChild(useBtn);\n }\n });\n }\n\n if (visual.type === \"text\") {\n this.addSection(\"Text\", () => {\n const row1 = this.makeRow(true);\n this.addTextInput(row1, \"Content\", visual.content, (v) => {\n visual.content = v;\n this.opts.onPropertyChange();\n });\n\n const row2 = this.makeRow();\n new NumberInput(row2, {\n label: \"Font Size\",\n value: visual.style.fontSize,\n step: 1,\n min: 1,\n onChange: (v) => {\n visual.style.fontSize = v;\n this.opts.onPropertyChange();\n },\n });\n\n const textColor = typeof visual.style.color === \"string\"\n ? visual.style.color : \"#FFFFFF\";\n new ColorPicker(row2, {\n label: \"Color\",\n value: textColor,\n onChange: (v) => {\n visual.style.color = v;\n this.opts.onPropertyChange();\n },\n });\n\n const row3 = this.makeRow();\n new SelectInput(row3, {\n label: \"Align\",\n value: visual.style.textAlign ?? \"left\",\n options: [\n { label: \"Left\", value: \"left\" },\n { label: \"Center\", value: \"center\" },\n { label: \"Right\", value: \"right\" },\n ],\n onChange: (v) => {\n visual.style.textAlign = v as \"left\" | \"center\" | \"right\";\n this.opts.onPropertyChange();\n },\n });\n });\n }\n }\n\n private addShadowSection(layer: Layer): void {\n if (!layer.shadow) {\n // Show \"Add Shadow\" button\n this.addSection(\"Shadow\", () => {\n const row = this.makeRow(true);\n const addBtn = document.createElement(\"button\");\n addBtn.className = \"atel-toolbar__btn\";\n addBtn.textContent = \"+ Add Shadow\";\n addBtn.addEventListener(\"click\", () => {\n layer.shadow = { color: \"#00000080\", blur: 10 };\n this.render();\n this.opts.onPropertyChange();\n });\n row.appendChild(addBtn);\n });\n return;\n }\n\n this.addSection(\"Shadow\", () => {\n const shadow = layer.shadow!;\n\n const row1 = this.makeRow(true);\n const shadowColor = typeof shadow.color === \"string\" ? shadow.color : \"#00000080\";\n new ColorPicker(row1, {\n label: \"Color\",\n value: shadowColor,\n onChange: (v) => {\n shadow.color = v;\n this.opts.onPropertyChange();\n },\n });\n\n const row2 = this.makeRow(true);\n new SliderInput(row2, {\n label: \"Blur\",\n value: shadow.blur,\n min: 0, max: 50, step: 1,\n onChange: (v) => {\n shadow.blur = v;\n this.opts.onPropertyChange();\n },\n });\n\n const row3 = this.makeRow();\n new NumberInput(row3, {\n label: \"Offset X\", value: shadow.offsetX ?? 0, step: 1,\n onChange: (v) => { shadow.offsetX = v; this.opts.onPropertyChange(); },\n });\n new NumberInput(row3, {\n label: \"Offset Y\", value: shadow.offsetY ?? 0, step: 1,\n onChange: (v) => { shadow.offsetY = v; this.opts.onPropertyChange(); },\n });\n\n // Remove shadow button\n const row4 = this.makeRow(true);\n const rmBtn = document.createElement(\"button\");\n rmBtn.className = \"atel-toolbar__btn\";\n rmBtn.textContent = \"Remove Shadow\";\n rmBtn.addEventListener(\"click\", () => {\n delete layer.shadow;\n this.render();\n this.opts.onPropertyChange();\n });\n row4.appendChild(rmBtn);\n });\n }\n\n private addSection(title: string, buildContent: () => void): void {\n const section = document.createElement(\"div\");\n section.className = \"atel-prop-section\";\n\n const titleEl = document.createElement(\"div\");\n titleEl.className = \"atel-prop-section__title\";\n titleEl.textContent = title;\n section.appendChild(titleEl);\n\n this.scroll.appendChild(section);\n buildContent();\n }\n\n private makeRow(full = false): HTMLElement {\n const row = document.createElement(\"div\");\n row.className = full ? \"atel-prop-row atel-prop-row--full\" : \"atel-prop-row\";\n // Find last section in scroll and append\n const sections = this.scroll.querySelectorAll(\".atel-prop-section\");\n const lastSection = sections[sections.length - 1];\n if (lastSection) lastSection.appendChild(row);\n return row;\n }\n\n private addTextInput(parent: HTMLElement, label: string, value: string, onChange: (v: string) => void): void {\n const wrap = document.createElement(\"div\");\n const lbl = document.createElement(\"label\");\n lbl.className = \"atel-control-label\";\n lbl.textContent = label;\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.className = \"atel-input\";\n input.value = value;\n input.addEventListener(\"change\", () => onChange(input.value));\n wrap.appendChild(lbl);\n wrap.appendChild(input);\n parent.appendChild(wrap);\n }\n}\n","import type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { serializeAtelier } from \"@a-company/atelier-schema\";\n\nexport class YamlPanel {\n readonly el: HTMLElement;\n private pre: HTMLPreElement;\n private copyBtn: HTMLButtonElement;\n private doc: AtelierDocument | null = null;\n\n constructor(parent: HTMLElement) {\n this.el = document.createElement(\"div\");\n this.el.className = \"atel-yaml-panel\";\n\n // Header with copy button\n const header = document.createElement(\"div\");\n header.className = \"atel-panel-header\";\n\n const label = document.createElement(\"span\");\n label.textContent = \"YAML Source\";\n\n this.copyBtn = document.createElement(\"button\");\n this.copyBtn.className = \"atel-yaml-copy-btn\";\n this.copyBtn.textContent = \"Copy\";\n this.copyBtn.addEventListener(\"click\", () => this.copyToClipboard());\n\n header.appendChild(label);\n header.appendChild(this.copyBtn);\n this.el.appendChild(header);\n\n // Content\n const content = document.createElement(\"div\");\n content.className = \"atel-yaml-content\";\n this.pre = document.createElement(\"pre\");\n content.appendChild(this.pre);\n this.el.appendChild(content);\n\n parent.appendChild(this.el);\n }\n\n loadDocument(doc: AtelierDocument): void {\n this.doc = doc;\n this.refresh();\n }\n\n refresh(): void {\n if (!this.doc) {\n this.pre.innerHTML = \"\";\n return;\n }\n const yaml = serializeAtelier(this.doc);\n this.pre.innerHTML = highlightYaml(yaml);\n }\n\n private async copyToClipboard(): Promise<void> {\n if (!this.doc) return;\n const yaml = serializeAtelier(this.doc);\n try {\n await navigator.clipboard.writeText(yaml);\n const orig = this.copyBtn.textContent;\n this.copyBtn.textContent = \"Copied!\";\n setTimeout(() => { this.copyBtn.textContent = orig; }, 1500);\n } catch {\n // Fallback: select text\n const range = document.createRange();\n range.selectNodeContents(this.pre);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n }\n}\n\n/** Simple YAML syntax highlighter — no external dependencies */\nfunction highlightYaml(yaml: string): string {\n return yaml\n .split(\"\\n\")\n .map((line) => highlightLine(line))\n .join(\"\\n\");\n}\n\nfunction highlightLine(line: string): string {\n // Comment\n if (line.trimStart().startsWith(\"#\")) {\n return `<span class=\"atel-yaml-comment\">${esc(line)}</span>`;\n }\n\n // Key: value pairs\n const kvMatch = line.match(/^(\\s*)(- )?([^:]+?)(:)(.*)/);\n if (kvMatch) {\n const [, indent, dash, key, colon, rest] = kvMatch;\n let result = esc(indent);\n if (dash) result += `<span class=\"atel-yaml-dash\">- </span>`;\n result += `<span class=\"atel-yaml-key\">${esc(key)}</span>`;\n result += `<span class=\"atel-yaml-colon\">:</span>`;\n result += highlightValue(rest);\n return result;\n }\n\n // List item without key\n const listMatch = line.match(/^(\\s*)(- )(.*)/);\n if (listMatch) {\n const [, indent, dash, val] = listMatch;\n return esc(indent) + `<span class=\"atel-yaml-dash\">${esc(dash)}</span>` + highlightValue(val);\n }\n\n return esc(line);\n}\n\nfunction highlightValue(val: string): string {\n const trimmed = val.trim();\n if (!trimmed) return esc(val);\n\n // Inline string\n if (trimmed.startsWith('\"') || trimmed.startsWith(\"'\")) {\n return ` <span class=\"atel-yaml-string\">${esc(trimmed)}</span>`;\n }\n\n // Number\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return ` <span class=\"atel-yaml-number\">${esc(trimmed)}</span>`;\n }\n\n // Boolean\n if (trimmed === \"true\" || trimmed === \"false\") {\n return ` <span class=\"atel-yaml-bool\">${esc(trimmed)}</span>`;\n }\n\n // Null\n if (trimmed === \"null\" || trimmed === \"~\") {\n return ` <span class=\"atel-yaml-null\">${esc(trimmed)}</span>`;\n }\n\n // Unquoted string value\n return ` <span class=\"atel-yaml-string\">${esc(trimmed)}</span>`;\n}\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","export interface StudioTheme {\n bg: string;\n bgSecondary: string;\n bgTertiary: string;\n text: string;\n textMuted: string;\n textAccent: string;\n border: string;\n buttonBg: string;\n buttonHover: string;\n buttonActive: string;\n accent: string;\n accentHover: string;\n sliderTrack: string;\n sliderThumb: string;\n fontFamily: string;\n fontMono: string;\n canvasShadow: string;\n}\n\nexport const defaultTheme: StudioTheme = {\n bg: \"#2C2C2C\",\n bgSecondary: \"#333333\",\n bgTertiary: \"#3D3D3D\",\n text: \"#F5F0EB\",\n textMuted: \"#A89F95\",\n textAccent: \"#F5F0EB\",\n border: \"#4A4A4A\",\n buttonBg: \"#3D3D3D\",\n buttonHover: \"#4A4A4A\",\n buttonActive: \"#555555\",\n accent: \"#C75B39\",\n accentHover: \"#D4724E\",\n sliderTrack: \"#4A4A4A\",\n sliderThumb: \"#C75B39\",\n fontFamily: \"'Cormorant Garamond', Georgia, serif\",\n fontMono: \"'SF Mono', 'Fira Code', monospace\",\n canvasShadow: \"0 4px 60px rgba(199, 91, 57, 0.12), 0 0 40px rgba(0,0,0,0.4)\",\n};\n\nexport function applyStudioTheme(container: HTMLElement, theme: StudioTheme): void {\n const s = container.style;\n s.setProperty(\"--atel-bg\", theme.bg);\n s.setProperty(\"--atel-bg-secondary\", theme.bgSecondary);\n s.setProperty(\"--atel-bg-tertiary\", theme.bgTertiary);\n s.setProperty(\"--atel-text\", theme.text);\n s.setProperty(\"--atel-text-muted\", theme.textMuted);\n s.setProperty(\"--atel-text-accent\", theme.textAccent);\n s.setProperty(\"--atel-border\", theme.border);\n s.setProperty(\"--atel-button-bg\", theme.buttonBg);\n s.setProperty(\"--atel-button-hover\", theme.buttonHover);\n s.setProperty(\"--atel-button-active\", theme.buttonActive);\n s.setProperty(\"--atel-accent\", theme.accent);\n s.setProperty(\"--atel-accent-hover\", theme.accentHover);\n s.setProperty(\"--atel-slider-track\", theme.sliderTrack);\n s.setProperty(\"--atel-slider-thumb\", theme.sliderThumb);\n s.setProperty(\"--atel-font-family\", theme.fontFamily);\n s.setProperty(\"--atel-font-mono\", theme.fontMono);\n s.setProperty(\"--atel-canvas-shadow\", theme.canvasShadow);\n}\n","/**\n * Snapshot-based undo/redo history.\n * Stores JSON-serialized document snapshots for O(1) restore.\n */\nexport class History {\n private undoStack: string[] = [];\n private redoStack: string[] = [];\n private maxSize = 50;\n\n /** Push a snapshot (JSON string of the doc before mutation). Clears redo stack. */\n snapshot(json: string): void {\n this.undoStack.push(json);\n if (this.undoStack.length > this.maxSize) {\n this.undoStack.shift();\n }\n this.redoStack.length = 0;\n }\n\n /** Undo: pops from undo stack, pushes current state to redo, returns the restored JSON. */\n undo(currentJson: string): string | null {\n const prev = this.undoStack.pop();\n if (prev === undefined) return null;\n this.redoStack.push(currentJson);\n return prev;\n }\n\n /** Redo: pops from redo stack, pushes current state to undo, returns the restored JSON. */\n redo(currentJson: string): string | null {\n const next = this.redoStack.pop();\n if (next === undefined) return null;\n this.undoStack.push(currentJson);\n return next;\n }\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n }\n}\n","/**\n * Browser-based export for Atelier documents.\n *\n * MP4 path: WebCodecs VideoEncoder + mp4-muxer (dynamic import).\n * WebM path: WebCodecs VideoEncoder + webm-muxer (dynamic import) — supports alpha.\n * GIF path: Built-in GIF89a encoder (no deps).\n */\n\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { resolveFrame } from \"@a-company/atelier-core\";\nimport { renderFrame, ImageCache } from \"@a-company/atelier-canvas\";\nimport { createGifEncoder } from \"./gif-encoder.js\";\n\n// ── Capability checks ──────────────────────────────────────────\n\n/** Returns true if the browser supports WebCodecs (needed for MP4/WebM export). */\nexport function supportsWebCodecs(): boolean {\n return (\n typeof VideoEncoder !== \"undefined\" &&\n typeof VideoFrame !== \"undefined\"\n );\n}\n\n/** WebM export uses the same WebCodecs API as MP4. */\nexport function supportsWebM(): boolean {\n return supportsWebCodecs();\n}\n\n/** GIF export is always available (built-in encoder). */\nexport function supportsGifExport(): boolean {\n return true;\n}\n\n// ── Public types ───────────────────────────────────────────────\n\nexport type ExportFormat = \"mp4\" | \"gif\" | \"webm\";\n\nexport interface ExportOptions {\n format: ExportFormat;\n /** Which states to render. Defaults to all states in document order. */\n states?: string[];\n /** Progress callback — called after each frame. */\n onProgress?: (info: { frame: number; total: number; percent: number }) => void;\n}\n\nexport interface ExportResult {\n blob: Blob;\n format: ExportFormat;\n totalFrames: number;\n durationMs: number;\n}\n\n// ── Main export entry ──────────────────────────────────────────\n\n/**\n * Render all frames of a document and encode to MP4, WebM, or GIF.\n *\n * The provided canvas is used as a scratch surface — its contents will\n * be overwritten during export. Caller should pause playback first.\n */\nexport async function exportDocument(\n doc: AtelierDocument,\n canvas: HTMLCanvasElement,\n imageCache: ImageCache,\n opts: ExportOptions,\n): Promise<ExportResult> {\n if (opts.format === \"mp4\") {\n return exportMP4(doc, canvas, imageCache, opts);\n }\n if (opts.format === \"webm\") {\n return exportWebM(doc, canvas, imageCache, opts);\n }\n return exportGIF(doc, canvas, imageCache, opts);\n}\n\n// ── Managed encoder wrapper ────────────────────────────────────\n\n/**\n * Wraps VideoEncoder with proper error capture and backpressure.\n *\n * The raw VideoEncoder fires errors via an async callback that can't\n * propagate to our async function. This wrapper captures errors and\n * exposes them synchronously so the frame loop can check before each\n * encode.\n */\ninterface ManagedEncoder {\n encoder: VideoEncoder;\n /** Throws the stored error if the encoder has failed. */\n checkError(): void;\n /** Wait until the encode queue drains below the threshold. */\n waitForDrain(): Promise<void>;\n}\n\nfunction createManagedEncoder(\n onChunk: (chunk: EncodedVideoChunk, meta?: EncodedVideoChunkMetadata) => void,\n): ManagedEncoder {\n let encError: DOMException | null = null;\n\n const encoder = new VideoEncoder({\n output: (chunk, meta) => {\n onChunk(chunk, meta ?? undefined);\n },\n error: (e) => {\n encError = e;\n },\n });\n\n function checkError(): void {\n if (encError) {\n const msg = encError.message;\n encError = null;\n throw new Error(`VideoEncoder error: ${msg}`);\n }\n if (encoder.state === \"closed\") {\n throw new Error(\"VideoEncoder closed unexpectedly.\");\n }\n }\n\n async function waitForDrain(): Promise<void> {\n // Drain if the encoder has more than 5 frames queued, to avoid\n // memory pressure and give the encoder time to process.\n while (encoder.state === \"configured\" && encoder.encodeQueueSize > 5) {\n await yieldToMain();\n if (encError) checkError();\n }\n }\n\n return { encoder, checkError, waitForDrain };\n}\n\n// ── MP4 Export (WebCodecs + mp4-muxer) ─────────────────────────\n\nasync function exportMP4(\n doc: AtelierDocument,\n canvas: HTMLCanvasElement,\n imageCache: ImageCache,\n opts: ExportOptions,\n): Promise<ExportResult> {\n if (!supportsWebCodecs()) {\n throw new Error(\"WebCodecs API not available — MP4 export requires a modern browser.\");\n }\n\n const { Muxer, ArrayBufferTarget } = await import(\"mp4-muxer\");\n\n const fps = doc.canvas.fps ?? 30;\n const width = doc.canvas.width;\n const height = doc.canvas.height;\n\n // H.264 requires even dimensions\n const encWidth = width % 2 === 0 ? width : width + 1;\n const encHeight = height % 2 === 0 ? height : height + 1;\n\n // Validate codec support before starting\n const codecConfig: VideoEncoderConfig = {\n codec: \"avc1.42001f\",\n width: encWidth,\n height: encHeight,\n bitrate: 5_000_000,\n framerate: fps,\n };\n\n const support = await VideoEncoder.isConfigSupported(codecConfig);\n if (!support.supported) {\n throw new Error(\n `H.264 codec not supported for ${encWidth}\\u00D7${encHeight} at ${fps}fps. ` +\n `Try exporting as GIF or WebM instead.`,\n );\n }\n\n const target = new ArrayBufferTarget();\n const muxer = new Muxer({\n target,\n video: {\n codec: \"avc\",\n width: encWidth,\n height: encHeight,\n },\n fastStart: \"in-memory\",\n });\n\n const { encoder, checkError, waitForDrain } = createManagedEncoder(\n (chunk, meta) => muxer.addVideoChunk(chunk, meta),\n );\n\n encoder.configure(support.config!);\n\n // Let the encoder process the config before we start encoding\n await yieldToMain();\n checkError();\n\n const frames = collectFrames(doc, opts.states);\n const totalFrames = frames.length;\n const frameDurationUs = Math.round(1_000_000 / fps);\n\n const ctx = canvas.getContext(\"2d\")!;\n const origWidth = canvas.width;\n const origHeight = canvas.height;\n if (encWidth !== width || encHeight !== height) {\n canvas.width = encWidth;\n canvas.height = encHeight;\n }\n\n try {\n for (let i = 0; i < totalFrames; i++) {\n checkError();\n await waitForDrain();\n\n const { state, frame } = frames[i];\n const resolved = resolveFrame(doc, state, frame);\n renderFrame(ctx as any, resolved, doc, imageCache);\n\n const timestamp = i * frameDurationUs;\n const videoFrame = new VideoFrame(canvas, { timestamp });\n encoder.encode(videoFrame, { keyFrame: i % 60 === 0 });\n videoFrame.close();\n\n opts.onProgress?.({\n frame: i + 1,\n total: totalFrames,\n percent: Math.round(((i + 1) / totalFrames) * 100),\n });\n\n if (i % 10 === 9) await yieldToMain();\n }\n\n await encoder.flush();\n checkError();\n encoder.close();\n muxer.finalize();\n } finally {\n // Restore canvas dimensions even if encoding fails\n if (encWidth !== width || encHeight !== height) {\n canvas.width = origWidth;\n canvas.height = origHeight;\n }\n }\n\n const durationMs = Math.round((totalFrames / fps) * 1000);\n return {\n blob: new Blob([target.buffer], { type: \"video/mp4\" }),\n format: \"mp4\",\n totalFrames,\n durationMs,\n };\n}\n\n// ── WebM Export (WebCodecs VP9 + webm-muxer, alpha support) ────\n\nasync function exportWebM(\n doc: AtelierDocument,\n _canvas: HTMLCanvasElement,\n imageCache: ImageCache,\n opts: ExportOptions,\n): Promise<ExportResult> {\n if (!supportsWebCodecs()) {\n throw new Error(\"WebCodecs API not available — WebM export requires a modern browser.\");\n }\n\n const { Muxer, ArrayBufferTarget } = await import(\"webm-muxer\");\n\n const fps = doc.canvas.fps ?? 30;\n const width = doc.canvas.width;\n const height = doc.canvas.height;\n\n // Try VP9 with alpha first, fall back to VP9 without alpha, then VP8\n const codecCandidates: VideoEncoderConfig[] = [\n {\n codec: \"vp09.00.10.08\",\n width,\n height,\n bitrate: 5_000_000,\n framerate: fps,\n alpha: \"keep\",\n },\n {\n codec: \"vp09.00.10.08\",\n width,\n height,\n bitrate: 5_000_000,\n framerate: fps,\n },\n {\n codec: \"vp8\",\n width,\n height,\n bitrate: 5_000_000,\n framerate: fps,\n },\n ];\n\n let chosenConfig: VideoEncoderConfig | null = null;\n for (const candidate of codecCandidates) {\n const support = await VideoEncoder.isConfigSupported(candidate);\n if (support.supported) {\n chosenConfig = support.config!;\n break;\n }\n }\n\n if (!chosenConfig) {\n throw new Error(\n `No supported VP9/VP8 codec for ${width}\\u00D7${height}. ` +\n `Try exporting as MP4 or GIF instead.`,\n );\n }\n\n const hasAlpha = chosenConfig.alpha === \"keep\";\n const muxCodec = chosenConfig.codec.startsWith(\"vp09\") ? \"V_VP9\" : \"V_VP8\";\n\n const target = new ArrayBufferTarget();\n const muxer = new Muxer({\n target,\n video: {\n codec: muxCodec,\n width,\n height,\n },\n });\n\n const { encoder, checkError, waitForDrain } = createManagedEncoder(\n (chunk, meta) => muxer.addVideoChunk(chunk, meta),\n );\n\n encoder.configure(chosenConfig);\n\n await yieldToMain();\n checkError();\n\n const frames = collectFrames(doc, opts.states);\n const totalFrames = frames.length;\n const frameDurationUs = Math.round(1_000_000 / fps);\n\n // Use a separate canvas with explicit alpha setting\n const alphaCanvas = document.createElement(\"canvas\");\n alphaCanvas.width = width;\n alphaCanvas.height = height;\n const ctx = alphaCanvas.getContext(\"2d\", { alpha: hasAlpha })!;\n\n for (let i = 0; i < totalFrames; i++) {\n checkError();\n await waitForDrain();\n\n const { state, frame } = frames[i];\n const resolved = resolveFrame(doc, state, frame);\n ctx.clearRect(0, 0, width, height);\n renderFrame(ctx as any, resolved, doc, imageCache);\n\n const timestamp = i * frameDurationUs;\n const frameOpts: VideoFrameInit = { timestamp };\n if (hasAlpha) (frameOpts as any).alpha = \"keep\";\n const videoFrame = new VideoFrame(alphaCanvas, frameOpts);\n encoder.encode(videoFrame, { keyFrame: i % 60 === 0 });\n videoFrame.close();\n\n opts.onProgress?.({\n frame: i + 1,\n total: totalFrames,\n percent: Math.round(((i + 1) / totalFrames) * 100),\n });\n\n if (i % 10 === 9) await yieldToMain();\n }\n\n await encoder.flush();\n checkError();\n encoder.close();\n muxer.finalize();\n\n const durationMs = Math.round((totalFrames / fps) * 1000);\n return {\n blob: new Blob([target.buffer], { type: \"video/webm\" }),\n format: \"webm\",\n totalFrames,\n durationMs,\n };\n}\n\n// ── GIF Export ──────────────────────────────────────────────────\n\nasync function exportGIF(\n doc: AtelierDocument,\n canvas: HTMLCanvasElement,\n imageCache: ImageCache,\n opts: ExportOptions,\n): Promise<ExportResult> {\n const fps = doc.canvas.fps ?? 30;\n const width = doc.canvas.width;\n const height = doc.canvas.height;\n const ctx = canvas.getContext(\"2d\")!;\n\n const frames = collectFrames(doc, opts.states);\n const totalFrames = frames.length;\n\n const encoder = createGifEncoder(width, height);\n\n // GIF delays are in centiseconds (10ms granularity). Browsers clamp\n // very short delays — Firefox treats ≤2cs as 100ms, Chrome ≤1cs.\n // We use 3cs (30ms) minimum, which is safe across all browsers and\n // gives a maximum effective GIF framerate of ~33fps.\n //\n // For high-fps documents (e.g. 60fps) we skip source frames so the\n // animation plays at the correct speed — just at reduced smoothness,\n // not reduced tempo.\n const MIN_DELAY_CS = 3;\n const minFrameMs = MIN_DELAY_CS * 10;\n\n let accGifTimeMs = 0;\n let gifFrameCount = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const frameEndMs = ((i + 1) * 1000) / fps;\n\n // Skip this frame if not enough real time has elapsed for a GIF\n // frame — but always emit the last frame.\n if (frameEndMs - accGifTimeMs < minFrameMs && i < totalFrames - 1) {\n opts.onProgress?.({\n frame: i + 1,\n total: totalFrames,\n percent: Math.round(((i + 1) / totalFrames) * 100),\n });\n continue;\n }\n\n const { state, frame } = frames[i];\n const resolved = resolveFrame(doc, state, frame);\n renderFrame(ctx as any, resolved, doc, imageCache);\n\n const delayCentiseconds = Math.max(MIN_DELAY_CS, Math.round((frameEndMs - accGifTimeMs) / 10));\n accGifTimeMs += delayCentiseconds * 10;\n\n const imageData = ctx.getImageData(0, 0, width, height);\n encoder.addFrame(imageData.data, delayCentiseconds);\n gifFrameCount++;\n\n opts.onProgress?.({\n frame: i + 1,\n total: totalFrames,\n percent: Math.round(((i + 1) / totalFrames) * 100),\n });\n\n if (gifFrameCount % 10 === 9) await yieldToMain();\n }\n\n const bytes = encoder.finish();\n const durationMs = Math.round((totalFrames / fps) * 1000);\n\n return {\n blob: new Blob([bytes.buffer as ArrayBuffer], { type: \"image/gif\" }),\n format: \"gif\",\n totalFrames,\n durationMs,\n };\n}\n\n// ── Helpers ────────────────────────────────────────────────────\n\ninterface FrameEntry {\n state: string;\n frame: number;\n}\n\nfunction collectFrames(\n doc: AtelierDocument,\n stateNames?: string[],\n): FrameEntry[] {\n const names = stateNames ?? Object.keys(doc.states);\n const entries: FrameEntry[] = [];\n for (const state of names) {\n const s = doc.states[state];\n if (!s) continue;\n for (let f = 0; f < s.duration; f++) {\n entries.push({ state, frame: f });\n }\n }\n return entries;\n}\n\nfunction yieldToMain(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n","/**\n * Minimal GIF89a animated encoder — zero dependencies.\n *\n * Produces looping animated GIFs from RGBA pixel data.\n * Uses popularity-based color quantization (top 256 colors)\n * and standard variable-length LZW compression.\n *\n * Performance-critical paths use typed arrays and numeric\n * lookups — no string allocations in the hot loop.\n */\n\nexport interface GifEncoder {\n /** Add a frame. `pixels` is RGBA (width*height*4). `delay` is in centiseconds. */\n addFrame(pixels: Uint8ClampedArray, delay: number): void;\n /** Finalize and return the complete GIF byte stream. */\n finish(): Uint8Array;\n}\n\nexport function createGifEncoder(width: number, height: number): GifEncoder {\n const chunks: Uint8Array[] = [];\n\n // ── Header + Logical Screen Descriptor ────────────────────\n const header = new Uint8Array([\n 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, // \"GIF89a\"\n width & 0xff, (width >> 8) & 0xff,\n height & 0xff, (height >> 8) & 0xff,\n 0xf7, // GCT flag, 8-bit color, 256 entries (7+1=8 → 2^8=256)\n 0x00, // background color index\n 0x00, // pixel aspect ratio\n ]);\n chunks.push(header);\n\n let globalPalette: Uint8Array | null = null;\n\n // NETSCAPE2.0 looping extension (loop forever)\n const loopExt = new Uint8Array([\n 0x21, 0xff, 0x0b,\n 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x50, 0x45, // \"NETSCAPE\"\n 0x32, 0x2e, 0x30, // \"2.0\"\n 0x03, 0x01,\n 0x00, 0x00, // loop count = 0 (infinite)\n 0x00, // terminator\n ]);\n\n let frameCount = 0;\n\n function addFrame(pixels: Uint8ClampedArray, delay: number): void {\n const { palette, indices } = quantize(pixels, width, height);\n\n if (frameCount === 0) {\n globalPalette = palette;\n chunks.push(globalPalette);\n chunks.push(loopExt);\n }\n\n // Graphic Control Extension\n const gce = new Uint8Array([\n 0x21, 0xf9, 0x04,\n 0x08, // disposal = restore to background, no transparency\n delay & 0xff, (delay >> 8) & 0xff,\n 0x00, 0x00,\n ]);\n chunks.push(gce);\n\n // Image Descriptor\n const imgDesc = new Uint8Array([\n 0x2c,\n 0x00, 0x00, 0x00, 0x00,\n width & 0xff, (width >> 8) & 0xff,\n height & 0xff, (height >> 8) & 0xff,\n frameCount === 0 ? 0x00 : 0x87,\n ]);\n chunks.push(imgDesc);\n\n if (frameCount > 0) {\n chunks.push(palette);\n }\n\n chunks.push(lzwEncode(indices, 8));\n frameCount++;\n }\n\n function finish(): Uint8Array {\n if (frameCount === 0 && !globalPalette) {\n globalPalette = new Uint8Array(256 * 3);\n chunks.push(globalPalette);\n chunks.push(loopExt);\n }\n\n chunks.push(new Uint8Array([0x3b])); // trailer\n\n let total = 0;\n for (const c of chunks) total += c.length;\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n out.set(c, offset);\n offset += c.length;\n }\n return out;\n }\n\n return { addFrame, finish };\n}\n\n// ── Color Quantization ────────────────────────────────────────\n\ninterface QuantizeResult {\n palette: Uint8Array;\n indices: Uint8Array;\n}\n\n/**\n * 15-bit frequency table (32768 entries) — avoids Map overhead entirely.\n * Reused across frames to avoid re-allocation.\n */\nconst freqTable = new Uint32Array(32768);\n\nfunction quantize(\n pixels: Uint8ClampedArray,\n width: number,\n height: number,\n): QuantizeResult {\n const pixelCount = width * height;\n\n // ── Pass 1: count 15-bit color frequencies ──\n freqTable.fill(0);\n const pixelKeys = new Uint16Array(pixelCount); // 15-bit key per pixel\n\n for (let i = 0; i < pixelCount; i++) {\n const off = i * 4;\n const key = ((pixels[off] >> 3) << 10) | ((pixels[off + 1] >> 3) << 5) | (pixels[off + 2] >> 3);\n freqTable[key]++;\n pixelKeys[i] = key;\n }\n\n // ── Pass 2: pick top 256 colors ──\n // Collect non-zero entries, partial-sort for top 256\n const entries: { key: number; count: number }[] = [];\n for (let k = 0; k < 32768; k++) {\n if (freqTable[k] > 0) entries.push({ key: k, count: freqTable[k] });\n }\n\n // Only need top 256 — full sort is fine when entries.length is bounded by 32768\n // but we can use a partial approach: if <= 256 unique colors, skip sort entirely\n let top: { key: number; count: number }[];\n if (entries.length <= 256) {\n top = entries;\n } else {\n entries.sort((a, b) => b.count - a.count);\n top = entries.slice(0, 256);\n }\n\n // ── Build palette + full 15-bit → index lookup table ──\n const palette = new Uint8Array(256 * 3);\n // paletteLut[15-bit-key] = palette index (for direct hits)\n // We'll fill misses via nearest-neighbor in a second pass\n const paletteR5 = new Uint8Array(256);\n const paletteG5 = new Uint8Array(256);\n const paletteB5 = new Uint8Array(256);\n const paletteCount = top.length;\n\n // Mark which 15-bit keys map directly to a palette entry\n const directLut = new Int16Array(32768);\n directLut.fill(-1);\n\n for (let i = 0; i < paletteCount; i++) {\n const key = top[i].key;\n const r5 = (key >> 10) & 0x1f;\n const g5 = (key >> 5) & 0x1f;\n const b5 = key & 0x1f;\n palette[i * 3] = r5 << 3;\n palette[i * 3 + 1] = g5 << 3;\n palette[i * 3 + 2] = b5 << 3;\n paletteR5[i] = r5;\n paletteG5[i] = g5;\n paletteB5[i] = b5;\n directLut[key] = i;\n }\n\n // Build full 32768-entry LUT: every possible 15-bit color → nearest palette index.\n // This makes the per-pixel mapping O(1) instead of O(256).\n const colorLut = new Uint8Array(32768);\n for (let k = 0; k < 32768; k++) {\n const direct = directLut[k];\n if (direct >= 0) {\n colorLut[k] = direct;\n continue;\n }\n // Nearest-neighbor search (only runs for non-palette colors during LUT build,\n // NOT per pixel — so this 32768 × 256 loop runs once per frame, not per pixel)\n const r = (k >> 10) & 0x1f;\n const g = (k >> 5) & 0x1f;\n const b = k & 0x1f;\n let best = 0;\n let bestDist = 0x7fffffff;\n for (let i = 0; i < paletteCount; i++) {\n const dr = r - paletteR5[i];\n const dg = g - paletteG5[i];\n const db = b - paletteB5[i];\n const dist = dr * dr + dg * dg + db * db;\n if (dist < bestDist) {\n bestDist = dist;\n best = i;\n if (dist === 0) break;\n }\n }\n colorLut[k] = best;\n }\n\n // ── Pass 3: map pixels to palette indices — O(1) per pixel ──\n const indices = new Uint8Array(pixelCount);\n for (let i = 0; i < pixelCount; i++) {\n indices[i] = colorLut[pixelKeys[i]];\n }\n\n return { palette, indices };\n}\n\n// ── LZW Compression (numeric hash-trie, no string allocs) ─────\n\n/**\n * LZW dictionary as a hash table of (prefix, suffix) → code.\n * Uses open addressing with a power-of-2 table for fast modulo.\n *\n * Key encoding: (prefix << 8) | suffix — fits in 20 bits (max prefix 4095, suffix 0-255).\n * Hash table size is 8192 (next power of 2 above 4096).\n */\nconst LZW_HASH_SIZE = 8192;\nconst LZW_HASH_MASK = LZW_HASH_SIZE - 1;\nconst hashKeys = new Int32Array(LZW_HASH_SIZE);\nconst hashVals = new Int16Array(LZW_HASH_SIZE);\n\nfunction lzwEncode(indices: Uint8Array, minCodeSize: number): Uint8Array {\n const clearCode = 1 << minCodeSize;\n const eoiCode = clearCode + 1;\n const maxDictSize = 4096;\n\n // Output buffer — pre-allocate generous size, grow if needed\n let buf = new Uint8Array(256 + (indices.length >>> 1));\n let bufPos = 0;\n buf[bufPos++] = minCodeSize; // first byte = min code size\n\n // Sub-block writer\n let subBlockStart = bufPos; // position where sub-block length byte will go\n buf[bufPos++] = 0; // placeholder for sub-block length\n let subBlockLen = 0;\n let bitBuf = 0;\n let bitCount = 0;\n\n function ensureCapacity(need: number): void {\n if (bufPos + need >= buf.length) {\n const next = new Uint8Array(Math.max(buf.length * 2, bufPos + need + 256));\n next.set(buf);\n buf = next;\n }\n }\n\n function writeBits(code: number, codeSize: number): void {\n bitBuf |= code << bitCount;\n bitCount += codeSize;\n while (bitCount >= 8) {\n ensureCapacity(4);\n buf[bufPos++] = bitBuf & 0xff;\n bitBuf >>>= 8;\n bitCount -= 8;\n subBlockLen++;\n if (subBlockLen === 255) {\n buf[subBlockStart] = 255;\n subBlockStart = bufPos;\n buf[bufPos++] = 0; // next sub-block length placeholder\n subBlockLen = 0;\n }\n }\n }\n\n function flushBits(): void {\n if (bitCount > 0) {\n ensureCapacity(4);\n buf[bufPos++] = bitBuf & 0xff;\n bitBuf = 0;\n bitCount = 0;\n subBlockLen++;\n }\n // Write final sub-block length\n if (subBlockLen > 0) {\n buf[subBlockStart] = subBlockLen;\n ensureCapacity(1);\n buf[bufPos++] = 0; // sub-block terminator\n } else {\n // Remove unused sub-block header, write terminator\n bufPos = subBlockStart;\n ensureCapacity(1);\n buf[bufPos++] = 0;\n }\n }\n\n // ── Dictionary (hash table) ──\n let codeSize = minCodeSize + 1;\n let nextCode = eoiCode + 1;\n\n function resetDict(): void {\n hashKeys.fill(-1);\n // Seed single-byte entries (0..255) — these are looked up by\n // their initial code, no hash table entry needed since we\n // always start with `current = indices[i]` as a known code.\n codeSize = minCodeSize + 1;\n nextCode = eoiCode + 1;\n }\n\n function hashLookup(prefix: number, suffix: number): number {\n const key = (prefix << 8) | suffix;\n let slot = (key * 2654435761) & LZW_HASH_MASK; // Knuth multiplicative hash\n while (true) {\n if (hashKeys[slot] === key) return hashVals[slot];\n if (hashKeys[slot] === -1) return -1;\n slot = (slot + 1) & LZW_HASH_MASK;\n }\n }\n\n function hashInsert(prefix: number, suffix: number, code: number): void {\n const key = (prefix << 8) | suffix;\n let slot = (key * 2654435761) & LZW_HASH_MASK;\n while (hashKeys[slot] !== -1) {\n slot = (slot + 1) & LZW_HASH_MASK;\n }\n hashKeys[slot] = key;\n hashVals[slot] = code;\n }\n\n // Begin encoding\n resetDict();\n writeBits(clearCode, codeSize);\n\n if (indices.length === 0) {\n writeBits(eoiCode, codeSize);\n flushBits();\n return buf.subarray(0, bufPos);\n }\n\n let current = indices[0]; // current code (starts as single-byte code = pixel value)\n\n for (let i = 1; i < indices.length; i++) {\n const suffix = indices[i];\n const found = hashLookup(current, suffix);\n if (found >= 0) {\n current = found;\n } else {\n writeBits(current, codeSize);\n if (nextCode < maxDictSize) {\n hashInsert(current, suffix, nextCode++);\n if (nextCode > (1 << codeSize) && codeSize < 12) {\n codeSize++;\n }\n } else {\n writeBits(clearCode, codeSize);\n resetDict();\n }\n current = suffix;\n }\n }\n\n writeBits(current, codeSize);\n writeBits(eoiCode, codeSize);\n flushBits();\n\n return buf.subarray(0, bufPos);\n}\n","/**\n * Export dialog — modal overlay for choosing format and showing progress.\n *\n * UI states: options → progress → done.\n * Built with vanilla DOM, matching existing studio patterns.\n */\n\nimport type { AtelierDocument } from \"@a-company/atelier-types\";\nimport type { ImageCache } from \"@a-company/atelier-canvas\";\nimport { exportDocument, supportsWebCodecs, type ExportFormat, type ExportResult } from \"./video-exporter.js\";\n\nexport class ExportDialog {\n private overlay: HTMLElement | null = null;\n private dialog: HTMLElement | null = null;\n private blobUrl: string | null = null;\n private parentEl: HTMLElement | null = null;\n\n /**\n * Mount the export overlay into the given parent element.\n * Typically called with the studio root.\n */\n show(\n doc: AtelierDocument,\n canvas: HTMLCanvasElement,\n imageCache: ImageCache,\n parentEl: HTMLElement,\n ): void {\n this.parentEl = parentEl;\n\n // Overlay\n this.overlay = document.createElement(\"div\");\n this.overlay.className = \"atel-export-overlay\";\n this.overlay.addEventListener(\"click\", (e) => {\n if (e.target === this.overlay) this.destroy();\n });\n\n // Dialog card\n this.dialog = document.createElement(\"div\");\n this.dialog.className = \"atel-export-dialog\";\n this.overlay.appendChild(this.dialog);\n parentEl.appendChild(this.overlay);\n\n this.renderOptions(doc, canvas, imageCache);\n }\n\n destroy(): void {\n if (this.blobUrl) {\n URL.revokeObjectURL(this.blobUrl);\n this.blobUrl = null;\n }\n if (this.overlay && this.parentEl) {\n this.parentEl.removeChild(this.overlay);\n }\n this.overlay = null;\n this.dialog = null;\n this.parentEl = null;\n }\n\n // ── Options screen ─────────────────────────────────────────\n\n private renderOptions(\n doc: AtelierDocument,\n canvas: HTMLCanvasElement,\n imageCache: ImageCache,\n ): void {\n if (!this.dialog) return;\n this.dialog.innerHTML = \"\";\n\n // Title\n const title = document.createElement(\"div\");\n title.className = \"atel-export-dialog__title\";\n title.textContent = \"Export Animation\";\n this.dialog.appendChild(title);\n\n // Format picker\n const formatRow = document.createElement(\"div\");\n formatRow.className = \"atel-export-dialog__row\";\n\n const formatLabel = document.createElement(\"label\");\n formatLabel.className = \"atel-control-label\";\n formatLabel.textContent = \"FORMAT\";\n formatRow.appendChild(formatLabel);\n\n const formatSelect = document.createElement(\"select\");\n formatSelect.className = \"atel-toolbar__select atel-export-dialog__select\";\n\n const gifOpt = document.createElement(\"option\");\n gifOpt.value = \"gif\";\n gifOpt.textContent = \"GIF\";\n formatSelect.appendChild(gifOpt);\n\n const mp4Opt = document.createElement(\"option\");\n mp4Opt.value = \"mp4\";\n if (supportsWebCodecs()) {\n mp4Opt.textContent = \"MP4\";\n } else {\n mp4Opt.textContent = \"MP4 (not supported)\";\n mp4Opt.disabled = true;\n }\n formatSelect.appendChild(mp4Opt);\n\n const webmOpt = document.createElement(\"option\");\n webmOpt.value = \"webm\";\n if (supportsWebCodecs()) {\n webmOpt.textContent = \"WebM (transparent)\";\n } else {\n webmOpt.textContent = \"WebM (not supported)\";\n webmOpt.disabled = true;\n }\n formatSelect.appendChild(webmOpt);\n\n formatRow.appendChild(formatSelect);\n this.dialog.appendChild(formatRow);\n\n // Info line\n const fps = doc.canvas.fps ?? 30;\n const stateNames = Object.keys(doc.states);\n let totalFrames = 0;\n for (const name of stateNames) {\n totalFrames += doc.states[name]?.duration ?? 0;\n }\n const info = document.createElement(\"div\");\n info.className = \"atel-export-dialog__info\";\n info.textContent = `${doc.canvas.width}\\u00D7${doc.canvas.height} \\u2022 ${fps} fps \\u2022 ${totalFrames} frames \\u2022 ${stateNames.length} state${stateNames.length !== 1 ? \"s\" : \"\"}`;\n this.dialog.appendChild(info);\n\n // Button row\n const btnRow = document.createElement(\"div\");\n btnRow.className = \"atel-export-dialog__actions\";\n\n const cancelBtn = document.createElement(\"button\");\n cancelBtn.className = \"atel-toolbar__btn\";\n cancelBtn.textContent = \"Cancel\";\n cancelBtn.addEventListener(\"click\", () => this.destroy());\n btnRow.appendChild(cancelBtn);\n\n const exportBtn = document.createElement(\"button\");\n exportBtn.className = \"atel-toolbar__btn atel-toolbar__btn--active\";\n exportBtn.textContent = \"Export\";\n exportBtn.addEventListener(\"click\", () => {\n const format = formatSelect.value as ExportFormat;\n this.renderProgress(doc, canvas, imageCache, format);\n });\n btnRow.appendChild(exportBtn);\n\n this.dialog.appendChild(btnRow);\n }\n\n // ── Progress screen ────────────────────────────────────────\n\n private renderProgress(\n doc: AtelierDocument,\n canvas: HTMLCanvasElement,\n imageCache: ImageCache,\n format: ExportFormat,\n ): void {\n if (!this.dialog) return;\n this.dialog.innerHTML = \"\";\n\n const title = document.createElement(\"div\");\n title.className = \"atel-export-dialog__title\";\n title.textContent = \"Exporting\\u2026\";\n this.dialog.appendChild(title);\n\n const progress = document.createElement(\"progress\");\n progress.className = \"atel-export-dialog__progress\";\n progress.max = 100;\n progress.value = 0;\n this.dialog.appendChild(progress);\n\n const statusText = document.createElement(\"div\");\n statusText.className = \"atel-export-dialog__status\";\n statusText.textContent = \"Preparing\\u2026\";\n this.dialog.appendChild(statusText);\n\n exportDocument(doc, canvas, imageCache, {\n format,\n onProgress: ({ frame, total, percent }) => {\n progress.value = percent;\n statusText.textContent = `Rendering frame ${frame} / ${total}`;\n },\n })\n .then((result) => {\n this.renderDone(result);\n })\n .catch((err) => {\n this.renderError(err);\n });\n }\n\n // ── Done screen ────────────────────────────────────────────\n\n private renderDone(result: ExportResult): void {\n if (!this.dialog) return;\n this.dialog.innerHTML = \"\";\n\n const title = document.createElement(\"div\");\n title.className = \"atel-export-dialog__title\";\n title.textContent = \"Export Complete\";\n this.dialog.appendChild(title);\n\n const info = document.createElement(\"div\");\n info.className = \"atel-export-dialog__info\";\n const sizeMB = (result.blob.size / (1024 * 1024)).toFixed(2);\n const durationSec = (result.durationMs / 1000).toFixed(1);\n info.textContent = `${result.totalFrames} frames \\u2022 ${durationSec}s \\u2022 ${sizeMB} MB`;\n this.dialog.appendChild(info);\n\n // Download link\n this.blobUrl = URL.createObjectURL(result.blob);\n const ext = result.format;\n\n const downloadBtn = document.createElement(\"a\");\n downloadBtn.href = this.blobUrl;\n downloadBtn.download = `animation.${ext}`;\n downloadBtn.className = \"atel-toolbar__btn atel-toolbar__btn--active atel-export-download\";\n downloadBtn.textContent = `Download .${ext}`;\n this.dialog.appendChild(downloadBtn);\n\n // Close button\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"atel-toolbar__btn\";\n closeBtn.textContent = \"Close\";\n closeBtn.style.marginTop = \"8px\";\n closeBtn.addEventListener(\"click\", () => this.destroy());\n this.dialog.appendChild(closeBtn);\n }\n\n // ── Error screen ───────────────────────────────────────────\n\n private renderError(err: unknown): void {\n if (!this.dialog) return;\n this.dialog.innerHTML = \"\";\n\n const title = document.createElement(\"div\");\n title.className = \"atel-export-dialog__title\";\n title.textContent = \"Export Failed\";\n this.dialog.appendChild(title);\n\n const msg = document.createElement(\"div\");\n msg.className = \"atel-export-dialog__info\";\n msg.textContent = err instanceof Error ? err.message : String(err);\n this.dialog.appendChild(msg);\n\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"atel-toolbar__btn\";\n closeBtn.textContent = \"Close\";\n closeBtn.style.marginTop = \"8px\";\n closeBtn.addEventListener(\"click\", () => this.destroy());\n this.dialog.appendChild(closeBtn);\n }\n}\n","import type { AtelierDocument } from \"@a-company/atelier-types\";\nimport { CanvasPanel } from \"./panels/canvas-panel.js\";\nimport { LayerPanel } from \"./panels/layer-panel.js\";\nimport { PropertyPanel } from \"./panels/property-panel.js\";\nimport { YamlPanel } from \"./panels/yaml-panel.js\";\nimport { applyStudioTheme, defaultTheme, type StudioTheme } from \"./theme.js\";\nimport { History } from \"./history.js\";\nimport { ExportDialog } from \"./export/export-dialog.js\";\n\nexport type RightTab = \"yaml\" | \"editor\";\n\nexport interface StudioOptions {\n mode?: \"full\" | \"compact\";\n initialTab?: RightTab;\n allowSave?: boolean;\n onDocumentChange?: (doc: AtelierDocument) => void;\n onSave?: (doc: AtelierDocument) => void;\n}\n\nexport class AtelierStudio {\n private root: HTMLElement;\n private toolbar: HTMLElement;\n private body: HTMLElement;\n private rightPanel: HTMLElement;\n private stateSelect!: HTMLSelectElement;\n private tabBtns: Map<RightTab, HTMLButtonElement> = new Map();\n private undoBtn!: HTMLButtonElement;\n private redoBtn!: HTMLButtonElement;\n\n private canvasPanel: CanvasPanel;\n private layerPanel: LayerPanel;\n private propertyPanel: PropertyPanel;\n private yamlPanel: YamlPanel;\n\n private doc: AtelierDocument | null = null;\n private originalDoc: AtelierDocument | null = null;\n private currentTab: RightTab;\n private stateName = \"\";\n private abortController = new AbortController();\n private history = new History();\n private lastSnapshot = \"\";\n\n constructor(\n private container: HTMLElement,\n private opts: StudioOptions = {},\n ) {\n this.currentTab = opts.initialTab ?? \"yaml\";\n\n // Root\n this.root = document.createElement(\"div\");\n this.root.className = \"atel-studio\";\n applyStudioTheme(this.root, defaultTheme);\n\n // Toolbar\n this.toolbar = document.createElement(\"div\");\n this.toolbar.className = \"atel-toolbar\";\n this.buildToolbar();\n this.root.appendChild(this.toolbar);\n\n // Body — two-column grid: canvas (left) + right panel\n this.body = document.createElement(\"div\");\n this.body.className = \"atel-body\";\n this.root.appendChild(this.body);\n\n // Right panel container\n this.rightPanel = document.createElement(\"div\");\n this.rightPanel.className = \"atel-right-panel\";\n\n // Canvas panel → left side of body (always visible)\n this.canvasPanel = new CanvasPanel(this.body, {\n onFrameChange: () => {},\n });\n\n // Right panel → right side of body\n this.body.appendChild(this.rightPanel);\n\n // Layer panel → inside right panel (editor tab)\n this.layerPanel = new LayerPanel(this.rightPanel, {\n onSelectLayer: (id) => {\n this.propertyPanel.selectLayer(id);\n },\n onDocumentChange: () => this.onDocChange(),\n });\n\n // Property panel → inside right panel (editor tab)\n this.propertyPanel = new PropertyPanel(this.rightPanel, {\n onPropertyChange: () => this.onDocChange(),\n });\n\n // YAML panel → inside right panel (yaml tab)\n this.yamlPanel = new YamlPanel(this.rightPanel);\n\n container.appendChild(this.root);\n this.applyTab();\n\n // Keyboard shortcuts\n this.root.tabIndex = 0;\n this.root.addEventListener(\"keydown\", (e) => this.handleKeydown(e), {\n signal: this.abortController.signal,\n });\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n const mod = e.metaKey || e.ctrlKey;\n\n // Undo/redo always works, even in inputs\n if (mod && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n this.undoAction();\n return;\n }\n if (mod && e.key === \"z\" && e.shiftKey) {\n e.preventDefault();\n this.redoAction();\n return;\n }\n\n // Don't intercept other keys when typing in inputs\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement ||\n e.target instanceof HTMLSelectElement\n ) return;\n\n switch (e.key) {\n case \" \":\n e.preventDefault();\n this.canvasPanel.togglePlay();\n break;\n case \"ArrowRight\":\n e.preventDefault();\n this.canvasPanel.stepForward();\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n this.canvasPanel.stepBack();\n break;\n case \"Delete\":\n case \"Backspace\":\n e.preventDefault();\n this.layerPanel.removeSelectedLayer();\n this.onDocChange();\n break;\n }\n }\n\n loadDocument(doc: AtelierDocument): void {\n // Deep clone for reset support\n this.originalDoc = structuredClone(doc);\n this.doc = structuredClone(doc);\n this.stateName = Object.keys(this.doc.states)[0] ?? \"\";\n this.lastSnapshot = JSON.stringify(this.doc);\n this.history.clear();\n\n // Populate state selector\n this.stateSelect.innerHTML = \"\";\n const stateNames = Object.keys(this.doc.states);\n for (const name of stateNames) {\n const o = document.createElement(\"option\");\n o.value = name;\n o.textContent = name;\n this.stateSelect.appendChild(o);\n }\n this.stateSelect.value = this.stateName;\n this.stateSelect.style.display = stateNames.length > 1 ? \"\" : \"none\";\n\n // Load into panels\n this.canvasPanel.loadDocument(this.doc, this.stateName);\n this.layerPanel.loadDocument(this.doc);\n this.propertyPanel.loadDocument(this.doc, this.stateName);\n this.yamlPanel.loadDocument(this.doc);\n }\n\n getDocument(): AtelierDocument | null {\n return this.doc ? structuredClone(this.doc) : null;\n }\n\n setTheme(theme: StudioTheme): void {\n applyStudioTheme(this.root, theme);\n }\n\n setTab(tab: RightTab): void {\n this.currentTab = tab;\n this.applyTab();\n }\n\n destroy(): void {\n this.abortController.abort();\n this.canvasPanel.destroy();\n this.container.removeChild(this.root);\n }\n\n private buildToolbar(): void {\n // Left group: state selector + reset\n const leftGroup = document.createElement(\"div\");\n leftGroup.className = \"atel-toolbar__group atel-toolbar__group--controls\";\n\n this.stateSelect = document.createElement(\"select\");\n this.stateSelect.className = \"atel-toolbar__select\";\n this.stateSelect.style.display = \"none\";\n this.stateSelect.addEventListener(\"change\", () => {\n this.stateName = this.stateSelect.value;\n this.canvasPanel.setStateName(this.stateName);\n this.propertyPanel.setStateName(this.stateName);\n });\n leftGroup.appendChild(this.stateSelect);\n\n const resetBtn = document.createElement(\"button\");\n resetBtn.className = \"atel-toolbar__btn\";\n resetBtn.textContent = \"Reset\";\n resetBtn.dataset.action = \"reset\";\n resetBtn.addEventListener(\"click\", () => this.resetDocument());\n leftGroup.appendChild(resetBtn);\n\n this.undoBtn = document.createElement(\"button\");\n this.undoBtn.className = \"atel-toolbar__btn\";\n this.undoBtn.textContent = \"\\u21A9 Undo\";\n this.undoBtn.dataset.action = \"undo\";\n this.undoBtn.disabled = true;\n this.undoBtn.addEventListener(\"click\", () => this.undoAction());\n leftGroup.appendChild(this.undoBtn);\n\n this.redoBtn = document.createElement(\"button\");\n this.redoBtn.className = \"atel-toolbar__btn\";\n this.redoBtn.textContent = \"Redo \\u21AA\";\n this.redoBtn.dataset.action = \"redo\";\n this.redoBtn.disabled = true;\n this.redoBtn.addEventListener(\"click\", () => this.redoAction());\n leftGroup.appendChild(this.redoBtn);\n\n this.toolbar.appendChild(leftGroup);\n\n // Spacer\n const spacer = document.createElement(\"div\");\n spacer.className = \"atel-toolbar__spacer\";\n this.toolbar.appendChild(spacer);\n\n // Export button\n const exportGroup = document.createElement(\"div\");\n exportGroup.className = \"atel-toolbar__group--controls\";\n const exportBtn = document.createElement(\"button\");\n exportBtn.className = \"atel-toolbar__btn\";\n exportBtn.textContent = \"Export\";\n exportBtn.dataset.action = \"export\";\n exportBtn.addEventListener(\"click\", () => this.showExportDialog());\n exportGroup.appendChild(exportBtn);\n this.toolbar.appendChild(exportGroup);\n\n // Right group: tab toggle\n const tabGroup = document.createElement(\"div\");\n tabGroup.className = \"atel-toolbar__group\";\n\n const tabs: { id: RightTab; label: string }[] = [\n { id: \"yaml\", label: \"{ } YAML\" },\n { id: \"editor\", label: \"\\u270E Editor\" },\n ];\n\n for (const t of tabs) {\n const btn = document.createElement(\"button\");\n btn.className = \"atel-toolbar__btn\";\n btn.textContent = t.label;\n btn.addEventListener(\"click\", () => this.setTab(t.id));\n this.tabBtns.set(t.id, btn);\n tabGroup.appendChild(btn);\n }\n\n this.toolbar.appendChild(tabGroup);\n }\n\n private applyTab(): void {\n // Update button states\n for (const [id, btn] of this.tabBtns) {\n btn.classList.toggle(\"atel-toolbar__btn--active\", id === this.currentTab);\n }\n\n // Toggle right panel content\n this.layerPanel.el.style.display = \"none\";\n this.propertyPanel.el.style.display = \"none\";\n this.yamlPanel.el.style.display = \"none\";\n\n this.rightPanel.className = \"atel-right-panel\";\n\n switch (this.currentTab) {\n case \"yaml\":\n this.rightPanel.classList.add(\"atel-right-panel--yaml\");\n this.yamlPanel.el.style.display = \"\";\n this.yamlPanel.refresh();\n break;\n case \"editor\":\n this.rightPanel.classList.add(\"atel-right-panel--editor\");\n this.layerPanel.el.style.display = \"\";\n this.propertyPanel.el.style.display = \"\";\n break;\n }\n }\n\n private onDocChange(): void {\n // Push previous state to undo stack before accepting mutation\n if (this.doc) {\n this.history.snapshot(this.lastSnapshot);\n this.lastSnapshot = JSON.stringify(this.doc);\n }\n\n // Re-render canvas (always visible)\n this.canvasPanel.refresh();\n\n // Update YAML if visible\n if (this.currentTab === \"yaml\") {\n this.yamlPanel.refresh();\n }\n\n // Refresh layer panel (visibility toggles, etc.)\n this.layerPanel.refresh();\n\n this.updateUndoRedoButtons();\n\n // Notify consumer\n if (this.doc) {\n this.opts.onDocumentChange?.(this.doc);\n }\n }\n\n private undoAction(): void {\n if (!this.doc) return;\n const json = this.history.undo(this.lastSnapshot);\n if (json === null) return;\n this.lastSnapshot = json;\n this.doc = JSON.parse(json);\n this.reloadPanels();\n this.updateUndoRedoButtons();\n }\n\n private redoAction(): void {\n if (!this.doc) return;\n const json = this.history.redo(this.lastSnapshot);\n if (json === null) return;\n this.lastSnapshot = json;\n this.doc = JSON.parse(json);\n this.reloadPanels();\n this.updateUndoRedoButtons();\n }\n\n private updateUndoRedoButtons(): void {\n this.undoBtn.disabled = !this.history.canUndo;\n this.redoBtn.disabled = !this.history.canRedo;\n }\n\n private reloadPanels(): void {\n if (!this.doc) return;\n this.stateName = Object.keys(this.doc.states)[0] ?? \"\";\n this.canvasPanel.loadDocument(this.doc, this.stateName);\n this.layerPanel.loadDocument(this.doc);\n this.propertyPanel.loadDocument(this.doc, this.stateName);\n this.yamlPanel.loadDocument(this.doc);\n if (this.currentTab === \"yaml\") this.yamlPanel.refresh();\n this.opts.onDocumentChange?.(this.doc);\n }\n\n private resetDocument(): void {\n if (this.originalDoc) {\n this.loadDocument(this.originalDoc);\n }\n }\n\n private showExportDialog(): void {\n if (!this.doc) return;\n this.canvasPanel.pause();\n const dialog = new ExportDialog();\n dialog.show(\n this.doc,\n this.canvasPanel.getCanvas(),\n this.canvasPanel.getImageCache(),\n this.root,\n );\n }\n}\n"],"mappings":"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","names":["x","y","step","formatValue","state","import_atelier_core","import_atelier_canvas","codeSize"]}
|