@kokoa/clotho-editor 0.3.0 → 0.4.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.
@@ -395,7 +395,13 @@ function deleteElement(id) {
395
395
  mutateDef(
396
396
  (def) => {
397
397
  def.elements = def.elements.filter((e) => e.id !== id);
398
- def.effects = def.effects.filter((e) => e.elementId !== id);
398
+ def.effects = def.effects.flatMap((effect) => {
399
+ if (effect.type !== "spotlight") {
400
+ return effect.elementId === id ? [] : [effect];
401
+ }
402
+ const elementIds = effect.elementIds.filter((target) => target !== id);
403
+ return elementIds.length > 0 ? [{ ...effect, elementIds }] : [];
404
+ });
399
405
  for (const el of def.elements) {
400
406
  if (el.parentId === id) delete el.parentId;
401
407
  }
@@ -675,6 +681,18 @@ function updateEffect(id, patch) {
675
681
  "effect"
676
682
  );
677
683
  }
684
+ function replaceEffect(id, next) {
685
+ mutateDef(
686
+ (def) => {
687
+ const idx = def.effects.findIndex((effect) => effect.id === id);
688
+ if (idx < 0) return;
689
+ def.effects[idx] = next;
690
+ def.effects.sort((a, b) => a.time - b.time);
691
+ },
692
+ `\uD6A8\uACFC \uC885\uB958 \uBCC0\uACBD: ${id} \u2192 ${next.type}`,
693
+ "effect"
694
+ );
695
+ }
678
696
  function deleteEffect(id) {
679
697
  mutateDef(
680
698
  (def) => {
@@ -1449,6 +1467,6 @@ function mountEditorPlugins(root, plugins, resolvePermissions, state2) {
1449
1467
  };
1450
1468
  }
1451
1469
 
1452
- export { addAppearance, addCameraFocus, addChapter, addCheckpoint, addEffect, addElement, animationDocumentFileName, animationDocumentToJson, apiBaseUrl, beginTransient, cameraControlAt, canRedo, canUndo, childIdsOf, clearCamera, configureAnimationRepository, configureApi, configureHost, createAnimation, createEditorPluginContext, createLayout, deleteAnimation, deleteCameraFocus, deleteChapter, deleteCheckpoint, deleteEffect, deleteElement, detachFromLayout, downloadAnimationJson, duplicateAnimation, endTransient, findContainingGroup, findLayoutCollisions, garbageCollectAnimationAssets, getCamera, getCurrentSnapshot, getCurrentTime, getDef, getHistory, getSelectedElementIds, getSelection, groupBbox, groupElements, hasCamera, importAnimation, isDirty, isDraft, isElementSelected, isGroup, jumpBack, jumpForward, layoutIdsFor, listAnimations, loadAnimation, markClean, mountEditorPlugins, moveCameraKeyframe, moveElementToEnd, moveElementToFront, moveGroupBy, placeholderImageUrl, promoteDraftToSaved, redo, registerDataUriAsset, registerExternalAsset, registerInlineAsset, removeAppearance, removeCameraKeyframe, removeCameraTrack, removeTrack, removeTrackKeyframe, reorderElement, resetHistory, saveAnimation, setCameraKeyframe, setCameraStrokeScaling, setCurrentTime, setDef, setDraft, setElementValueAtTime, setSelection, setTrackKeyframe, subscribe, toggleSelectionFor, undo, ungroupElement, uniqueChapterId, uniqueCheckpointId, uniqueEffectId, uniqueElementId, updateAppearance, updateCameraFocus, updateCanvas, updateChapter, updateCheckpoint, updateData, updateDuration, updateEffect, updateElementBase, updateLocales, updateMeta, updateResponsive, updateSettings, validateEditorPlugin };
1453
- //# sourceMappingURL=chunk-N47HF4VB.js.map
1454
- //# sourceMappingURL=chunk-N47HF4VB.js.map
1470
+ export { addAppearance, addCameraFocus, addChapter, addCheckpoint, addEffect, addElement, animationDocumentFileName, animationDocumentToJson, apiBaseUrl, beginTransient, cameraControlAt, canRedo, canUndo, childIdsOf, clearCamera, configureAnimationRepository, configureApi, configureHost, createAnimation, createEditorPluginContext, createLayout, deleteAnimation, deleteCameraFocus, deleteChapter, deleteCheckpoint, deleteEffect, deleteElement, detachFromLayout, downloadAnimationJson, duplicateAnimation, endTransient, findContainingGroup, findLayoutCollisions, garbageCollectAnimationAssets, getCamera, getCurrentSnapshot, getCurrentTime, getDef, getHistory, getSelectedElementIds, getSelection, groupBbox, groupElements, hasCamera, importAnimation, isDirty, isDraft, isElementSelected, isGroup, jumpBack, jumpForward, layoutIdsFor, listAnimations, loadAnimation, markClean, mountEditorPlugins, moveCameraKeyframe, moveElementToEnd, moveElementToFront, moveGroupBy, placeholderImageUrl, promoteDraftToSaved, redo, registerDataUriAsset, registerExternalAsset, registerInlineAsset, removeAppearance, removeCameraKeyframe, removeCameraTrack, removeTrack, removeTrackKeyframe, reorderElement, replaceEffect, resetHistory, saveAnimation, setCameraKeyframe, setCameraStrokeScaling, setCurrentTime, setDef, setDraft, setElementValueAtTime, setSelection, setTrackKeyframe, subscribe, toggleSelectionFor, undo, ungroupElement, uniqueChapterId, uniqueCheckpointId, uniqueEffectId, uniqueElementId, updateAppearance, updateCameraFocus, updateCanvas, updateChapter, updateCheckpoint, updateData, updateDuration, updateEffect, updateElementBase, updateLocales, updateMeta, updateResponsive, updateSettings, validateEditorPlugin };
1471
+ //# sourceMappingURL=chunk-WOP52KFW.js.map
1472
+ //# sourceMappingURL=chunk-WOP52KFW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/export-json.ts","../src/legacy/api.ts","../src/legacy/state/internals.ts","../src/legacy/state/core.ts","../src/legacy/state/history.ts","../src/legacy/state/elements.ts","../src/legacy/state/timeline.ts","../src/legacy/state/camera.ts","../src/legacy/state/meta.ts","../src/legacy/state/layouts.ts","../src/legacy/state/checkpoints.ts","../src/legacy/studio-groups.ts","../src/legacy/host.ts","../src/plugin-host.ts"],"names":["animationDocumentSchema","next","id","state","document"],"mappings":"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","file":"chunk-WOP52KFW.js","sourcesContent":["import { animationDocumentSchema, type AnimationDocument } from \"@kokoa/clotho\";\n\n/** 검증된 애니메이션 문서를 읽기 쉬운 JSON으로 변환한다. */\nexport function animationDocumentToJson(def: AnimationDocument): string {\n const parsed = garbageCollectAnimationAssets(def);\n return `${JSON.stringify(parsed, null, 2)}\\n`;\n}\n\n/** 어떤 image 요소에서도 참조하지 않는 asset을 제거한 새 문서를 반환한다. */\nexport function garbageCollectAnimationAssets(\n def: AnimationDocument,\n): AnimationDocument {\n const parsed = animationDocumentSchema.parse(def);\n const used = new Set(\n parsed.elements\n .filter((element) => element.type === \"image\")\n .map((element) => element.assetId),\n );\n return animationDocumentSchema.parse({\n ...parsed,\n assets: Object.fromEntries(\n Object.entries(parsed.assets).filter(([id]) => used.has(id)),\n ),\n });\n}\n\n/** 문서 ID를 운영체제에서 안전하게 사용할 수 있는 파일 이름으로 바꾼다. */\nexport function animationDocumentFileName(def: AnimationDocument): string {\n const id = def.id.trim().replace(/[^a-zA-Z0-9._-]+/g, \"-\");\n return `${id || \"animation\"}.json`;\n}\n\n/** 현재 문서를 브라우저에서 JSON 파일로 내려받는다. */\nexport function downloadAnimationJson(def: AnimationDocument): void {\n if (\n typeof document === \"undefined\" ||\n typeof URL.createObjectURL !== \"function\"\n ) {\n throw new Error(\"JSON 파일은 브라우저에서만 내려받을 수 있습니다.\");\n }\n\n const url = URL.createObjectURL(\n new Blob([animationDocumentToJson(def)], {\n type: \"application/json;charset=utf-8\",\n }),\n );\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = animationDocumentFileName(def);\n link.hidden = true;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n}\n","import { animationDocumentSchema, type AnimationDocument } from \"@kokoa/clotho\";\nimport type { AnimationRepository, AnimationSummary } from \"../repository\";\nexport type { AnimationRepository, AnimationSummary } from \"../repository\";\n\n// Where documents live is the host's business, not the editor's.\n//\n// This was hardcoded to one blog's admin route. A standalone editor cannot assume any\n// particular backend, so the base is configurable and defaults to the previous value —\n// existing hosts keep working without a change.\nconst DEFAULT_BASE = \"/api/admin/animations\";\nlet BASE = DEFAULT_BASE;\n\n/** Point the editor at the host's animation endpoints. Call once at startup. */\nexport function configureApi(options: { baseUrl?: string }): void {\n if (options.baseUrl) BASE = options.baseUrl.replace(/\\/+$/, \"\");\n repository = httpRepository;\n}\n\n/** The base currently in use, for hosts that need to build matching links. */\nexport function apiBaseUrl(): string {\n return BASE;\n}\n\nconst revisions = new Map<string, number>();\n\nexport class MissingAnimationRevisionError extends Error {}\nexport class AnimationStudioApiError extends Error {}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nasync function readJson(res: Response): Promise<unknown> {\n if (!res.ok) {\n const text = await res.text();\n throw new AnimationStudioApiError(`HTTP ${res.status}: ${text}`);\n }\n return res.json();\n}\n\nfunction parseRevision(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 1) {\n throw new TypeError(\"Animation revision is malformed\");\n }\n return value;\n}\n\nfunction parseAnimationEnvelope(value: unknown): {\n readonly def: AnimationDocument;\n readonly revision: number;\n} {\n if (!isRecord(value)) throw new TypeError(\"Animation response is malformed\");\n return {\n def: animationDocumentSchema.parse(value.def),\n revision: parseRevision(value.revision),\n };\n}\n\nconst httpRepository: AnimationRepository = {\n list: async (): Promise<AnimationSummary[]> => {\n const res = await fetch(BASE);\n const data = await readJson(res);\n if (!isRecord(data) || !Array.isArray(data.items))\n throw new TypeError(\"Animation list response is malformed\");\n return data.items.map((item) => {\n if (\n !isRecord(item) ||\n typeof item.id !== \"string\" ||\n typeof item.title !== \"string\" ||\n typeof item.description !== \"string\"\n ) {\n throw new TypeError(\"Animation summary is malformed\");\n }\n return {\n id: item.id,\n title: item.title,\n description: item.description,\n ...(typeof item.updatedAt === \"string\"\n ? { updatedAt: item.updatedAt }\n : {}),\n };\n });\n },\n\n load: async (id: string): Promise<AnimationDocument> => {\n const res = await fetch(`${BASE}/${encodeURIComponent(id)}`);\n const data = parseAnimationEnvelope(await readJson(res));\n revisions.set(data.def.id, data.revision);\n return data.def;\n },\n\n save: async (def: AnimationDocument): Promise<AnimationDocument> => {\n const revision = revisions.get(def.id);\n if (revision === undefined)\n throw new MissingAnimationRevisionError(\n `Animation '${def.id}' has no loaded revision`,\n );\n const res = await fetch(`${BASE}/${encodeURIComponent(def.id)}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ def, revision }),\n });\n const data = parseAnimationEnvelope(await readJson(res));\n revisions.set(data.def.id, data.revision);\n return data.def;\n },\n\n create: async (id: string, title: string): Promise<AnimationDocument> => {\n const res = await fetch(BASE, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id, title }),\n });\n const data = parseAnimationEnvelope(await readJson(res));\n revisions.set(data.def.id, data.revision);\n return data.def;\n },\n\n delete: async (id: string): Promise<void> => {\n const res = await fetch(`${BASE}/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n });\n await readJson(res);\n revisions.delete(id);\n },\n};\n\nlet repository: AnimationRepository = httpRepository;\n\nexport function configureAnimationRepository(next: AnimationRepository): void {\n repository = next;\n}\n\nexport const listAnimations = (): Promise<AnimationSummary[]> =>\n repository.list();\nexport const loadAnimation = (id: string): Promise<AnimationDocument> =>\n repository.load(id);\nexport const saveAnimation = (\n def: AnimationDocument,\n): Promise<AnimationDocument> => repository.save(def);\nexport const createAnimation = (\n id: string,\n title: string,\n): Promise<AnimationDocument> => repository.create(id, title);\nexport const deleteAnimation = (id: string): Promise<void> =>\n repository.delete(id);\n\nexport async function importAnimation(\n def: AnimationDocument,\n): Promise<AnimationDocument> {\n const parsed = animationDocumentSchema.parse(def);\n try {\n await repository.load(parsed.id);\n } catch {\n await repository.create(parsed.id, parsed.title || parsed.id);\n }\n return repository.save(parsed);\n}\n\nexport async function duplicateAnimation(\n sourceId: string,\n newId: string,\n newTitle: string,\n): Promise<AnimationDocument> {\n const source = await loadAnimation(sourceId);\n const cloned: AnimationDocument = { ...source, id: newId, title: newTitle };\n await createAnimation(newId, newTitle);\n return await saveAnimation(cloned);\n}\n","import type { AnimationDocument, AnimationElement } from \"@kokoa/clotho\";\nimport { animationDocumentSchema } from \"@kokoa/clotho\";\nimport type {\n HistoryEntry,\n HistoryKind,\n InternalState,\n Listener,\n} from \"./types\";\n\nconst listeners = new Set<Listener>();\n\nexport const state: InternalState = {\n def: null,\n dirty: false,\n selection: { kind: \"none\" },\n currentTime: 0,\n isDraft: false,\n};\n\nconst HISTORY_LIMIT = 60;\n\nexport const past: HistoryEntry[] = [];\nexport const future: HistoryEntry[] = [];\n\nlet inTransient = false;\n\nexport function snapshotJson(): string | null {\n return state.def ? JSON.stringify(state.def) : null;\n}\n\nexport function pushHistory(label: string, kind: HistoryKind): void {\n const snap = snapshotJson();\n if (snap === null) return;\n past.push({ snap, label, kind, timestamp: Date.now() });\n if (past.length > HISTORY_LIMIT) past.shift();\n future.length = 0;\n}\n\nexport function setInTransient(value: boolean): void {\n inTransient = value;\n}\n\nexport function subscribe(fn: Listener): () => void {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\nexport function emit(): void {\n for (const fn of listeners) fn();\n}\n\nexport function mutateDef(\n fn: (def: AnimationDocument) => void,\n label = \"edit\",\n kind: HistoryKind = \"other\",\n): void {\n if (!state.def) return;\n if (!inTransient) pushHistory(label, kind);\n const cloned = JSON.parse(JSON.stringify(state.def));\n fn(cloned);\n const parsed = animationDocumentSchema.safeParse(cloned);\n if (!parsed.success) {\n past.pop();\n console.warn(\"[studio.state] invalid mutation\", parsed.error.issues);\n return;\n }\n // Older compatible Clotho versions strip newly introduced localization\n // properties. Preserve them while the editor supports the current schema.\n const localized = cloned as AnimationDocument & { locales?: string[] };\n const next = parsed.data as AnimationDocument & { locales?: string[] };\n if (localized.locales) next.locales = localized.locales;\n next.elements = next.elements.map((element, index) => {\n const source = localized.elements[index] as AnimationElement & {\n locales?: string[];\n translations?: Record<string, string>;\n };\n if (source?.id !== element.id || element.type !== \"text\") return element;\n return {\n ...element,\n ...(source.locales ? { locales: source.locales } : {}),\n ...(source.translations ? { translations: source.translations } : {}),\n } as AnimationElement;\n });\n state.def = next;\n state.dirty = true;\n emit();\n}\n","import type { AnimationDocument, SnapshotMap } from \"@kokoa/clotho\";\nimport { compileDataBindings, computeSnapshot } from \"@kokoa/clotho\";\nimport type { Selection } from \"./types\";\nimport { emit, state, past, future } from \"./internals\";\n\nexport function isDraft(): boolean {\n return state.isDraft;\n}\n\nexport function setDraft(def: AnimationDocument): void {\n state.def = def;\n state.dirty = false;\n state.isDraft = true;\n state.selection = { kind: \"none\" };\n state.currentTime = 0;\n past.length = 0;\n future.length = 0;\n emit();\n}\n\nexport function promoteDraftToSaved(): void {\n state.isDraft = false;\n emit();\n}\n\nexport function getDef(): AnimationDocument | null {\n return state.def;\n}\n\nexport function getSelection(): Selection {\n return state.selection;\n}\n\nexport function isDirty(): boolean {\n return state.dirty;\n}\n\nexport function getCurrentTime(): number {\n return state.currentTime;\n}\n\nexport function setCurrentTime(time: number): void {\n state.currentTime = Math.max(0, Math.round(time));\n emit();\n}\n\nexport function setDef(def: AnimationDocument | null, markDirty = false): void {\n state.def = def;\n state.dirty = markDirty;\n state.isDraft = false;\n state.selection = { kind: \"none\" };\n state.currentTime = 0;\n past.length = 0;\n future.length = 0;\n emit();\n}\n\nexport function markClean(): void {\n state.dirty = false;\n emit();\n}\n\nexport function setSelection(sel: Selection): void {\n state.selection = sel;\n emit();\n}\n\nexport function getSelectedElementIds(sel: Selection): string[] {\n if (sel.kind === \"element\") return [sel.elementId];\n if (sel.kind === \"elements\") return sel.elementIds;\n return [];\n}\n\nexport function isElementSelected(sel: Selection, id: string): boolean {\n if (sel.kind === \"element\") return sel.elementId === id;\n if (sel.kind === \"elements\") return sel.elementIds.includes(id);\n return false;\n}\n\nexport function toggleSelectionFor(sel: Selection, id: string): Selection {\n const cur = getSelectedElementIds(sel);\n if (cur.includes(id)) {\n const next = cur.filter((x) => x !== id);\n if (next.length === 0) return { kind: \"none\" };\n if (next.length === 1) return { kind: \"element\", elementId: next[0] };\n return { kind: \"elements\", elementIds: next };\n }\n const next = [...cur, id];\n if (next.length === 1) return { kind: \"element\", elementId: next[0] };\n return { kind: \"elements\", elementIds: next };\n}\n\nexport function getCurrentSnapshot(): SnapshotMap {\n if (!state.def) return new Map();\n return computeSnapshot(\n compileDataBindings(state.def).document,\n state.currentTime,\n );\n}\n","import type { HistoryEntry, HistoryKind } from \"./types\";\nimport {\n emit,\n future,\n past,\n pushHistory,\n setInTransient,\n snapshotJson,\n state,\n} from \"./internals\";\n\nexport function beginTransient(\n label = \"edit\",\n kind: HistoryKind = \"other\",\n): void {\n if (!state.def) return;\n pushHistory(label, kind);\n setInTransient(true);\n}\n\nexport function endTransient(): void {\n setInTransient(false);\n}\n\nexport function canUndo(): boolean {\n return past.length > 0;\n}\n\nexport function canRedo(): boolean {\n return future.length > 0;\n}\n\nexport function undo(): void {\n if (past.length === 0) return;\n const prev = past[past.length - 1]!;\n const cur = snapshotJson();\n if (cur !== null) {\n future.push({\n snap: cur,\n label: prev.label,\n kind: prev.kind,\n timestamp: prev.timestamp,\n });\n }\n past.pop();\n state.def = JSON.parse(prev.snap);\n state.dirty = true;\n emit();\n}\n\nexport function redo(): void {\n if (future.length === 0) return;\n const next = future[future.length - 1]!;\n const cur = snapshotJson();\n if (cur !== null) {\n past.push({\n snap: cur,\n label: next.label,\n kind: next.kind,\n timestamp: next.timestamp,\n });\n }\n future.pop();\n state.def = JSON.parse(next.snap);\n state.dirty = true;\n emit();\n}\n\nexport function resetHistory(): void {\n past.length = 0;\n future.length = 0;\n}\n\nexport function getHistory(): {\n past: readonly HistoryEntry[];\n future: readonly HistoryEntry[];\n} {\n return { past, future };\n}\n\nexport function jumpBack(steps: number): void {\n if (steps <= 0 || past.length === 0) return;\n const n = Math.min(steps, past.length);\n for (let i = 0; i < n; i += 1) undo();\n}\n\nexport function jumpForward(steps: number): void {\n if (steps <= 0 || future.length === 0) return;\n const n = Math.min(steps, future.length);\n for (let i = 0; i < n; i += 1) redo();\n}\n","import type {\n AnimationDocument,\n AnimationElement,\n Appearance,\n PropertyTrack,\n TrackKeyframe,\n} from \"@kokoa/clotho\";\nimport type { HistoryKind } from \"./types\";\nimport type { AnimationEffect } from \"@kokoa/clotho\";\nimport { emit, mutateDef, state } from \"./internals\";\n\nfunction ensureAppearance(el: AnimationElement, def: AnimationDocument): void {\n if (!el.appearances || el.appearances.length === 0) {\n el.appearances = [\n { start: 0, end: def.duration, entryDuration: 300, exitDuration: 300 },\n ];\n }\n}\n\nexport function addElement(el: AnimationElement): void {\n const kind: HistoryKind = el.type === \"group\" ? \"group\" : \"add\";\n const label = el.type === \"group\" ? \"그룹 생성\" : `요소 추가: ${el.type}`;\n mutateDef(\n (def) => {\n const cloned = JSON.parse(JSON.stringify(el)) as AnimationElement;\n ensureAppearance(cloned, def);\n if (!cloned.tracks) cloned.tracks = [];\n def.elements.push(cloned);\n },\n label,\n kind,\n );\n state.selection = { kind: \"element\", elementId: el.id };\n emit();\n}\n\nexport function deleteElement(id: string): void {\n const targetEl = state.def?.elements.find((e) => e.id === id);\n const isGroupKind = targetEl?.type === \"group\";\n mutateDef(\n (def) => {\n def.elements = def.elements.filter((e) => e.id !== id);\n // A spotlight names a set, so losing one target narrows it rather than\n // ending it — unless it was the last one, and a spotlight with nothing to\n // light would fail the schema anyway.\n def.effects = def.effects.flatMap((effect): AnimationEffect[] => {\n if (effect.type !== \"spotlight\") {\n return effect.elementId === id ? [] : [effect];\n }\n const elementIds = effect.elementIds.filter((target) => target !== id);\n return elementIds.length > 0 ? [{ ...effect, elementIds }] : [];\n });\n // Anything that pointed at the deleted element is re-rooted. A dangling parentId\n // would make the tree builder report a missing parent on every render.\n for (const el of def.elements) {\n if (el.parentId === id) delete el.parentId;\n }\n },\n isGroupKind ? `그룹 해제` : `요소 삭제: ${id}`,\n isGroupKind ? \"group\" : \"delete\",\n );\n if (state.selection.kind === \"element\" && state.selection.elementId === id) {\n state.selection = { kind: \"none\" };\n } else if (state.selection.kind === \"elements\") {\n const remaining = state.selection.elementIds.filter((x) => x !== id);\n if (remaining.length === 0) state.selection = { kind: \"none\" };\n else if (remaining.length === 1)\n state.selection = { kind: \"element\", elementId: remaining[0] };\n else state.selection = { kind: \"elements\", elementIds: remaining };\n }\n emit();\n}\n\nfunction labelForPatch(\n id: string,\n patch: Record<string, unknown>,\n): { label: string; kind: HistoryKind } {\n const keys = Object.keys(patch);\n if (keys.length === 0) return { label: `요소 수정: ${id}`, kind: \"other\" };\n const posKeys = [\"x\", \"y\", \"cx\", \"cy\", \"x1\", \"y1\", \"x2\", \"y2\", \"points\"];\n const sizeKeys = [\"width\", \"height\", \"r\", \"fontSize\", \"cellWidth\"];\n const styleKeys = [\n \"fill\",\n \"stroke\",\n \"strokeWidth\",\n \"color\",\n \"opacity\",\n \"cornerRadius\",\n \"labelColor\",\n \"labelSize\",\n ];\n if (keys.some((k) => posKeys.includes(k)))\n return { label: `이동: ${id}`, kind: \"move\" };\n if (keys.some((k) => sizeKeys.includes(k)))\n return { label: `크기 변경: ${id}`, kind: \"resize\" };\n if (keys.includes(\"rotation\"))\n return { label: `회전: ${id}`, kind: \"rotate\" };\n if (keys.some((k) => styleKeys.includes(k)))\n return { label: `스타일: ${id} (${keys.join(\", \")})`, kind: \"style\" };\n if (keys.includes(\"name\")) return { label: `이름 변경: ${id}`, kind: \"meta\" };\n return { label: `요소 수정: ${id} (${keys.join(\", \")})`, kind: \"other\" };\n}\n\nexport function updateElementBase(\n id: string,\n patch: Record<string, unknown>,\n): void {\n const { label, kind } = labelForPatch(id, patch);\n mutateDef(\n (def) => {\n const idx = def.elements.findIndex((e) => e.id === id);\n if (idx < 0) return;\n const baseEl = def.elements[idx];\n const merged: Record<string, unknown> = {\n ...(baseEl as unknown as Record<string, unknown>),\n };\n for (const [k, v] of Object.entries(patch)) {\n if (v === null || v === undefined) delete merged[k];\n else merged[k] = v;\n }\n def.elements[idx] = merged as unknown as AnimationElement;\n },\n label,\n kind,\n );\n}\n\nexport function reorderElement(\n sourceId: string,\n targetId: string,\n position: \"before\" | \"after\",\n): void {\n mutateDef(\n (def) => {\n const srcIdx = def.elements.findIndex((e) => e.id === sourceId);\n if (srcIdx < 0) return;\n const [moved] = def.elements.splice(srcIdx, 1);\n let targetIdx = def.elements.findIndex((e) => e.id === targetId);\n if (targetIdx < 0) {\n def.elements.push(moved);\n return;\n }\n if (position === \"after\") targetIdx += 1;\n def.elements.splice(targetIdx, 0, moved);\n },\n `순서 변경: ${sourceId}`,\n \"reorder\",\n );\n}\n\nexport function moveElementToEnd(id: string): void {\n mutateDef(\n (def) => {\n const idx = def.elements.findIndex((e) => e.id === id);\n if (idx < 0) return;\n const [moved] = def.elements.splice(idx, 1);\n def.elements.push(moved);\n },\n `맨 앞으로: ${id}`,\n \"reorder\",\n );\n}\n\nexport function moveElementToFront(id: string): void {\n mutateDef(\n (def) => {\n const idx = def.elements.findIndex((e) => e.id === id);\n if (idx < 0) return;\n const [moved] = def.elements.splice(idx, 1);\n def.elements.unshift(moved);\n },\n `맨 뒤로: ${id}`,\n \"reorder\",\n );\n}\n\nexport function addAppearance(id: string, ap: Appearance): void {\n mutateDef(\n (def) => {\n const el = def.elements.find((e) => e.id === id);\n if (!el) return;\n el.appearances.push(ap);\n el.appearances.sort((a, b) => a.start - b.start);\n },\n `출현 추가: ${id}`,\n \"appearance\",\n );\n}\n\nexport function updateAppearance(\n id: string,\n apIdx: number,\n patch: Partial<Appearance>,\n): void {\n mutateDef(\n (def) => {\n const el = def.elements.find((e) => e.id === id);\n if (!el || !el.appearances[apIdx]) return;\n el.appearances[apIdx] = { ...el.appearances[apIdx], ...patch };\n el.appearances.sort((a, b) => a.start - b.start);\n },\n `출현 조정: ${id}`,\n \"appearance\",\n );\n}\n\nexport function removeAppearance(id: string, apIdx: number): void {\n mutateDef(\n (def) => {\n const el = def.elements.find((e) => e.id === id);\n if (!el) return;\n el.appearances.splice(apIdx, 1);\n if (el.appearances.length === 0) ensureAppearance(el, def);\n },\n `출현 삭제: ${id}`,\n \"appearance\",\n );\n}\n\nfunction findTrack(\n el: AnimationElement,\n property: string,\n): PropertyTrack | undefined {\n return el.tracks.find((t) => t.property === property);\n}\n\nexport function setTrackKeyframe(\n elementId: string,\n property: string,\n time: number,\n value: TrackKeyframe[\"value\"],\n): void {\n mutateDef(\n (def) => {\n const el = def.elements.find((e) => e.id === elementId);\n if (!el) return;\n let track = findTrack(el, property);\n if (!track) {\n track = { property, keyframes: [] };\n el.tracks.push(track);\n }\n const existing = track.keyframes.find((k) => k.time === time);\n if (existing) {\n existing.value = value;\n } else {\n track.keyframes.push({ time, value });\n track.keyframes.sort((a, b) => a.time - b.time);\n }\n },\n `keyframe ${property} @ ${time}ms`,\n \"track\",\n );\n}\n\nexport function removeTrackKeyframe(\n elementId: string,\n property: string,\n time: number,\n): void {\n mutateDef(\n (def) => {\n const el = def.elements.find((e) => e.id === elementId);\n if (!el) return;\n const track = findTrack(el, property);\n if (!track) return;\n track.keyframes = track.keyframes.filter((k) => k.time !== time);\n if (track.keyframes.length === 0) {\n el.tracks = el.tracks.filter((t) => t.property !== property);\n }\n },\n `keyframe 삭제 ${property} @ ${time}ms`,\n \"track\",\n );\n}\n\nexport function setElementValueAtTime(\n elementId: string,\n patch: Record<string, unknown>,\n): void {\n const time = state.currentTime;\n if (time <= 0) {\n updateElementBase(elementId, patch);\n return;\n }\n if (!state.def) return;\n const el = state.def.elements.find((e) => e.id === elementId);\n if (!el) return;\n for (const [prop, value] of Object.entries(patch)) {\n if (value === null || value === undefined) continue;\n if (\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n )\n continue;\n const hasTrack = el.tracks.some((t) => t.property === prop);\n if (!hasTrack) {\n const baseVal = (el as unknown as Record<string, unknown>)[prop];\n if (\n typeof baseVal === \"string\" ||\n typeof baseVal === \"number\" ||\n typeof baseVal === \"boolean\"\n ) {\n setTrackKeyframe(elementId, prop, 0, baseVal);\n }\n }\n setTrackKeyframe(elementId, prop, time, value);\n }\n}\n\nexport function removeTrack(elementId: string, property: string): void {\n mutateDef(\n (def) => {\n const el = def.elements.find((e) => e.id === elementId);\n if (!el) return;\n el.tracks = el.tracks.filter((t) => t.property !== property);\n },\n `트랙 삭제: ${property}`,\n \"track\",\n );\n}\n","import type { AnimationEffect, Chapter } from \"@kokoa/clotho\";\nimport { emit, mutateDef, state } from \"./internals\";\n\nexport function addChapter(c: Chapter): void {\n mutateDef(\n (def) => {\n def.chapters.push(c);\n def.chapters.sort((a, b) => a.time - b.time);\n },\n `Chapter 추가: ${c.label || c.id}`,\n \"chapter\",\n );\n state.selection = { kind: \"chapter\", chapterId: c.id };\n emit();\n}\n\nexport function updateChapter(id: string, patch: Partial<Chapter>): void {\n const keys = Object.keys(patch).join(\", \");\n mutateDef(\n (def) => {\n const idx = def.chapters.findIndex((c) => c.id === id);\n if (idx < 0) return;\n def.chapters[idx] = { ...def.chapters[idx], ...patch };\n def.chapters.sort((a, b) => a.time - b.time);\n },\n `Chapter 수정: ${id} (${keys})`,\n \"chapter\",\n );\n}\n\nexport function deleteChapter(id: string): void {\n mutateDef(\n (def) => {\n def.chapters = def.chapters.filter((c) => c.id !== id);\n },\n `Chapter 삭제: ${id}`,\n \"chapter\",\n );\n if (state.selection.kind === \"chapter\" && state.selection.chapterId === id) {\n state.selection = { kind: \"none\" };\n }\n emit();\n}\n\nexport function addEffect(eff: AnimationEffect): void {\n mutateDef(\n (def) => {\n def.effects.push(eff);\n def.effects.sort((a, b) => a.time - b.time);\n },\n `효과 추가: ${eff.type}`,\n \"effect\",\n );\n}\n\nexport function updateEffect(\n id: string,\n patch: Partial<AnimationEffect>,\n): void {\n mutateDef(\n (def) => {\n const idx = def.effects.findIndex((e) => e.id === id);\n if (idx < 0) return;\n def.effects[idx] = { ...def.effects[idx], ...patch } as AnimationEffect;\n def.effects.sort((a, b) => a.time - b.time);\n },\n `효과 수정: ${id}`,\n \"effect\",\n );\n}\n\n/**\n * Swap one effect for another with the same id.\n *\n * Changing an effect's type is a replacement, not a patch: `spotlight` carries\n * `elementIds` where the others carry `elementId`, so merging the new fields over\n * the old ones would leave a shape the schema rejects — and `mutateDef` drops a\n * rejected edit without saying so.\n */\nexport function replaceEffect(id: string, next: AnimationEffect): void {\n mutateDef(\n (def) => {\n const idx = def.effects.findIndex((effect) => effect.id === id);\n if (idx < 0) return;\n def.effects[idx] = next;\n def.effects.sort((a, b) => a.time - b.time);\n },\n `효과 종류 변경: ${id} → ${next.type}`,\n \"effect\",\n );\n}\n\nexport function deleteEffect(id: string): void {\n mutateDef(\n (def) => {\n def.effects = def.effects.filter((e) => e.id !== id);\n },\n `효과 삭제: ${id}`,\n \"effect\",\n );\n if (state.selection.kind === \"effect\" && state.selection.effectId === id) {\n state.selection = { kind: \"none\" };\n }\n emit();\n}\n\nexport function updateDuration(ms: number): void {\n mutateDef(\n (def) => {\n def.duration = Math.max(0, Math.round(ms));\n for (const el of def.elements) {\n for (const ap of el.appearances) {\n if (ap.end > def.duration) ap.end = def.duration;\n if (ap.start > def.duration) ap.start = def.duration;\n }\n }\n for (const ch of def.chapters) {\n if (ch.time > def.duration) ch.time = def.duration;\n }\n for (const eff of def.effects) {\n if (eff.time > def.duration) eff.time = def.duration;\n }\n },\n `duration: ${ms} ms`,\n \"meta\",\n );\n if (state.currentTime > ms) state.currentTime = ms;\n}\n","import type { Camera, CameraFocus, CameraProperty } from \"@kokoa/clotho\";\nimport { emit, mutateDef, state } from \"./internals\";\n\n// The camera is document-level, not per element, so it does not fit the element\n// track helpers next door. It has its own module for the same reason chapters and\n// effects do.\n//\n// A document without a camera has no `camera` field at all — that is deliberate in\n// the schema, so that every document written before the camera existed renders\n// exactly as it did. So every mutation here creates the field on demand, and\n// `clearCamera` removes it again rather than leaving an empty one behind.\n\nconst EMPTY: Camera = { tracks: [], focus: [], strokeScaling: \"scale\" };\n\nexport function getCamera(): Camera {\n return state.def?.camera ?? EMPTY;\n}\n\n/** Whether the document actually carries a camera, as opposed to defaults. */\nexport function hasCamera(): boolean {\n const camera = state.def?.camera;\n return (\n camera !== undefined &&\n (camera.tracks.length > 0 ||\n camera.focus.length > 0 ||\n camera.strokeScaling !== \"scale\")\n );\n}\n\n/**\n * Which mechanism decides the view at `time`.\n *\n * The renderer's rule is that a focus entry that has already started wins, and the\n * tracks supply the value otherwise. Direct manipulation on the canvas has to know\n * which one it is editing — dragging the frame when a focus is in control would\n * write track keyframes that the focus immediately overrides, and a control that\n * silently does nothing is worse than one that is disabled.\n */\nexport type CameraControl =\n { kind: \"none\" } | { kind: \"tracks\" } | { kind: \"focus\"; index: number };\n\nexport function cameraControlAt(time: number): CameraControl {\n const camera = state.def?.camera;\n if (!camera || (camera.tracks.length === 0 && camera.focus.length === 0)) {\n return { kind: \"none\" };\n }\n let index = -1;\n camera.focus.forEach((entry, i) => {\n if (entry.time <= time) index = i;\n });\n return index >= 0 ? { kind: \"focus\", index } : { kind: \"tracks\" };\n}\n\nfunction ensure(def: { camera?: Camera }): Camera {\n def.camera ??= { tracks: [], focus: [], strokeScaling: \"scale\" };\n return def.camera;\n}\n\nexport function setCameraStrokeScaling(value: Camera[\"strokeScaling\"]): void {\n mutateDef(\n (def) => {\n ensure(def).strokeScaling = value;\n },\n `카메라 선 두께: ${value}`,\n \"camera\",\n );\n}\n\n/** Add or replace the keyframe at `time` on one camera property. */\nexport function setCameraKeyframe(\n property: CameraProperty,\n time: number,\n value: number,\n ease?: CameraKeyframeEase,\n): void {\n mutateDef(\n (def) => {\n const camera = ensure(def);\n let track = camera.tracks.find((t) => t.property === property);\n if (!track) {\n track = { property, keyframes: [] };\n camera.tracks.push(track);\n camera.tracks.sort(\n (a, b) => ORDER.indexOf(a.property) - ORDER.indexOf(b.property),\n );\n }\n const existing = track.keyframes.findIndex((kf) => kf.time === time);\n const next = { time, value, ...(ease ? { ease } : {}) };\n if (existing >= 0) track.keyframes[existing] = next;\n else track.keyframes.push(next);\n track.keyframes.sort((a, b) => a.time - b.time);\n },\n `카메라 keyframe: ${property} @ ${time}ms`,\n \"camera\",\n );\n}\n\ntype CameraKeyframeEase = NonNullable<\n Camera[\"tracks\"][number][\"keyframes\"][number][\"ease\"]\n>;\n\n/** Camera properties in the order they are shown, which is also authoring order. */\nconst ORDER: CameraProperty[] = [\"zoom\", \"x\", \"y\"];\n\n/**\n * Move a keyframe in time, keeping its value.\n *\n * Separate from `setCameraKeyframe` because a timeline drag has to remove the old\n * time as well; doing it as remove-then-set would push two history entries for one\n * gesture.\n */\nexport function moveCameraKeyframe(\n property: CameraProperty,\n from: number,\n to: number,\n): void {\n if (from === to) return;\n mutateDef(\n (def) => {\n const track = def.camera?.tracks.find((t) => t.property === property);\n const kf = track?.keyframes.find((k) => k.time === from);\n if (!track || !kf) return;\n // A keyframe already sitting on the destination is replaced, which is what\n // dragging one onto another means everywhere else in this timeline.\n track.keyframes = track.keyframes.filter(\n (k) => k.time !== from && k.time !== to,\n );\n track.keyframes.push({ ...kf, time: to });\n track.keyframes.sort((a, b) => a.time - b.time);\n },\n `카메라 keyframe 이동: ${property} ${from}→${to}ms`,\n \"camera\",\n );\n}\n\nexport function removeCameraKeyframe(\n property: CameraProperty,\n time: number,\n): void {\n mutateDef(\n (def) => {\n const camera = def.camera;\n const track = camera?.tracks.find((t) => t.property === property);\n if (!camera || !track) return;\n track.keyframes = track.keyframes.filter((kf) => kf.time !== time);\n // The schema requires at least one keyframe, so an emptied track is dropped\n // rather than left as an invalid stub that `mutateDef` would reject.\n if (track.keyframes.length === 0) {\n camera.tracks = camera.tracks.filter((t) => t.property !== property);\n }\n },\n `카메라 keyframe 삭제: ${property} @ ${time}ms`,\n \"camera\",\n );\n}\n\nexport function removeCameraTrack(property: CameraProperty): void {\n mutateDef(\n (def) => {\n if (def.camera) {\n def.camera.tracks = def.camera.tracks.filter(\n (t) => t.property !== property,\n );\n }\n },\n `카메라 track 삭제: ${property}`,\n \"camera\",\n );\n}\n\nexport function addCameraFocus(focus: CameraFocus): void {\n mutateDef(\n (def) => {\n const camera = ensure(def);\n camera.focus.push(focus);\n camera.focus.sort((a, b) => a.time - b.time);\n },\n `카메라 focus 추가 @ ${focus.time}ms`,\n \"camera\",\n );\n const index = getCamera().focus.findIndex(\n (f) =>\n f.time === focus.time && f.elementIds.join() === focus.elementIds.join(),\n );\n state.selection = {\n kind: \"camera\",\n focusIndex: index < 0 ? undefined : index,\n };\n emit();\n}\n\n/**\n * Patch one focus entry.\n *\n * Sorting can move it, so the selection is re-pointed at the same entry rather than\n * at whatever ends up at the old index.\n */\nexport function updateCameraFocus(\n index: number,\n patch: Partial<CameraFocus>,\n): void {\n const before = getCamera().focus[index];\n if (!before) return;\n const after = { ...before, ...patch };\n mutateDef(\n (def) => {\n const camera = def.camera;\n if (!camera?.focus[index]) return;\n camera.focus[index] = after;\n camera.focus.sort((a, b) => a.time - b.time);\n },\n `카메라 focus 수정: ${Object.keys(patch).join(\", \")}`,\n \"camera\",\n );\n if (state.selection.kind === \"camera\") {\n // Matched by value, not identity: `mutateDef` clones the document and re-parses\n // it, so the object written above is never the one that comes back.\n const moved = getCamera().focus.findIndex(\n (f) =>\n f.time === after.time &&\n f.elementIds.join() === after.elementIds.join() &&\n f.duration === after.duration,\n );\n state.selection = {\n kind: \"camera\",\n focusIndex: moved < 0 ? undefined : moved,\n };\n emit();\n }\n}\n\nexport function deleteCameraFocus(index: number): void {\n mutateDef(\n (def) => {\n if (def.camera) {\n def.camera.focus = def.camera.focus.filter((_, i) => i !== index);\n }\n },\n `카메라 focus 삭제 #${index + 1}`,\n \"camera\",\n );\n if (state.selection.kind === \"camera\") {\n state.selection = { kind: \"camera\" };\n emit();\n }\n}\n\n/** Remove the camera entirely, so the document renders as it did without one. */\nexport function clearCamera(): void {\n mutateDef(\n (def) => {\n delete (def as { camera?: Camera }).camera;\n },\n \"카메라 제거\",\n \"camera\",\n );\n if (state.selection.kind === \"camera\") {\n state.selection = { kind: \"none\" };\n emit();\n }\n}\n","import type { AnimationDocument, DataValue } from \"@kokoa/clotho\";\nimport { encodeImageAsset, inlineAssetFromDataUri } from \"@kokoa/clotho\";\nimport { mutateDef, state } from \"./internals\";\nimport { getDef } from \"./core\";\n\nexport function updateMeta(\n patch: Partial<Pick<AnimationDocument, \"title\" | \"description\">>,\n): void {\n const keys = Object.keys(patch).join(\", \");\n mutateDef(\n (def) => {\n Object.assign(def, patch);\n },\n `메타 수정: ${keys}`,\n \"meta\",\n );\n}\n\n/** Update the locales offered to localized text elements in this document. */\nexport function updateLocales(locales: string[]): void {\n mutateDef(\n (def) => {\n (def as AnimationDocument & { locales: string[] }).locales = locales;\n },\n \"문서 언어 변경\",\n \"meta\",\n );\n}\n\nexport function updateData(data: Record<string, DataValue>): void {\n mutateDef(\n (def) => {\n def.data = data;\n },\n \"샘플 데이터 변경\",\n \"meta\",\n );\n}\n\nexport function updateResponsive(\n responsive: NonNullable<AnimationDocument[\"responsive\"]>,\n): void {\n mutateDef(\n (def) => {\n def.responsive = responsive;\n },\n \"Responsive Stage 변경\",\n \"canvas\",\n );\n}\n\nexport function updateCanvas(\n patch: Partial<AnimationDocument[\"canvas\"]>,\n): void {\n const keys = Object.keys(patch).join(\", \");\n mutateDef(\n (def) => {\n def.canvas = { ...def.canvas, ...patch };\n },\n `캔버스: ${keys}`,\n \"canvas\",\n );\n}\n\nexport function updateSettings(\n patch: Partial<AnimationDocument[\"settings\"]>,\n): void {\n const keys = Object.keys(patch).join(\", \");\n mutateDef(\n (def) => {\n def.settings = { ...def.settings, ...patch };\n },\n `설정: ${keys}`,\n \"settings\",\n );\n}\n\nexport function uniqueElementId(type: string): string {\n if (!state.def) return type + \"-1\";\n const used = new Set(state.def.elements.map((e) => e.id));\n let i = 1;\n while (used.has(`${type}-${i}`)) i += 1;\n return `${type}-${i}`;\n}\n\nexport function uniqueChapterId(): string {\n if (!state.def) return \"chapter-1\";\n const used = new Set(state.def.chapters.map((c) => c.id));\n let i = 1;\n while (used.has(`chapter-${i}`)) i += 1;\n return `chapter-${i}`;\n}\n\nexport function uniqueEffectId(): string {\n if (!state.def) return \"effect-1\";\n const used = new Set(state.def.effects.map((e) => e.id));\n let i = 1;\n while (used.has(`effect-${i}`)) i += 1;\n return `effect-${i}`;\n}\n\n/**\n * Register an external image URL as a document asset and return its id.\n *\n * clotho v1 keeps image sources in a document-level `assets` registry rather than on the\n * element, so a document can be self-contained or host-resolved rather than tied to one\n * site's paths. An identical URL reuses its entry, so dropping the same image twice does\n * not grow the document.\n */\nexport function registerExternalAsset(url: string): string {\n const def = getDef();\n if (def) {\n for (const [id, asset] of Object.entries(def.assets)) {\n if (asset.kind === \"external\" && asset.url === url) return id;\n }\n }\n const id = uniqueAssetId();\n mutateDef(\n (draft) => {\n draft.assets[id] = { kind: \"external\", url };\n },\n `에셋 등록: ${id}`,\n \"asset\",\n );\n return id;\n}\n\n/** Register raw image bytes as an inline (base64) asset and return its id. */\nexport function registerInlineAsset(bytes: Uint8Array, mime: string): string {\n const { asset } = encodeImageAsset(bytes, mime);\n const def = getDef();\n if (def) {\n for (const [id, existing] of Object.entries(def.assets)) {\n if (\n existing.kind === \"inline\" &&\n existing.mime === asset.mime &&\n existing.data === asset.data\n )\n return id;\n }\n }\n const id = uniqueAssetId();\n mutateDef(\n (draft) => {\n draft.assets[id] = asset;\n },\n `에셋 등록: ${id}`,\n \"asset\",\n );\n return id;\n}\n\nfunction uniqueAssetId(): string {\n const def = getDef();\n const existing = def ? new Set(Object.keys(def.assets)) : new Set<string>();\n let n = 1;\n while (existing.has(`asset-${n}`)) n += 1;\n return `asset-${n}`;\n}\n\n/**\n * Register a `data:` URI as an inline asset and return its id.\n *\n * What a dropped or pasted file becomes. Storing it inline keeps the document\n * self-contained; a non-image or non-base64 URI falls back to an external reference so\n * the element still points at something.\n */\nexport function registerDataUriAsset(dataUri: string): string {\n const inline = inlineAssetFromDataUri(dataUri);\n if (!inline) return registerExternalAsset(dataUri);\n const def = getDef();\n if (def) {\n for (const [id, existing] of Object.entries(def.assets)) {\n if (\n existing.kind === \"inline\" &&\n existing.mime === inline.mime &&\n existing.data === inline.data\n )\n return id;\n }\n }\n const id = uniqueAssetId();\n mutateDef(\n (draft) => {\n draft.assets[id] = inline;\n },\n `에셋 등록: ${id}`,\n \"asset\",\n );\n return id;\n}\n","import {\n compileLayouts,\n type AnimationDocument,\n type LayoutMode,\n} from \"@kokoa/clotho\";\nimport { mutateDef, state } from \"./internals\";\n\nexport interface LayoutCollision {\n readonly firstId: string;\n readonly secondId: string;\n}\n\nfunction uniqueLayoutId(def: AnimationDocument): string {\n const used = new Set(def.layouts.map((layout) => layout.id));\n let index = 1;\n while (used.has(`layout-${index}`)) index += 1;\n return `layout-${index}`;\n}\n\nexport function createLayout(\n elementIds: readonly string[],\n mode: LayoutMode,\n): void {\n if (elementIds.length === 0) return;\n mutateDef(\n (def) => {\n const selected = def.elements.filter((element) =>\n elementIds.includes(element.id),\n );\n if (selected.length === 0) return;\n const measured = compileLayouts({ ...def, layouts: [] }).boxes;\n const boxes = selected.flatMap((element) => {\n const box = measured[element.id];\n return box ? [box] : [];\n });\n const x = boxes.length > 0 ? Math.min(...boxes.map((box) => box.x)) : 0;\n const y = boxes.length > 0 ? Math.min(...boxes.map((box) => box.y)) : 0;\n def.layouts = def.layouts.filter(\n (layout) => !layout.elementIds.some((id) => elementIds.includes(id)),\n );\n def.layouts.push({\n id: uniqueLayoutId(def),\n mode,\n elementIds: selected.map((element) => element.id),\n x,\n y,\n gap: 16,\n align: \"start\",\n constraints: [],\n });\n def.elements = compileLayouts(def).document.elements;\n },\n `${mode} layout 생성`,\n \"layout\",\n );\n}\n\nexport function detachFromLayout(elementIds: readonly string[]): void {\n const ids = new Set(elementIds);\n mutateDef(\n (def) => {\n def.layouts = def.layouts.flatMap((layout) => {\n const remaining = layout.elementIds.filter((id) => !ids.has(id));\n return remaining.length === 0\n ? []\n : [{ ...layout, elementIds: remaining }];\n });\n },\n \"layout에서 분리\",\n \"layout\",\n );\n}\n\nexport function layoutIdsFor(elementIds: readonly string[]): string[] {\n if (!state.def) return [];\n const ids = new Set(elementIds);\n return state.def.layouts\n .filter((layout) => layout.elementIds.some((id) => ids.has(id)))\n .map((layout) => layout.id);\n}\n\nexport function findLayoutCollisions(\n def: AnimationDocument,\n): LayoutCollision[] {\n const { boxes } = compileLayouts(def);\n const collisions: LayoutCollision[] = [];\n for (const layout of def.layouts) {\n for (\n let firstIndex = 0;\n firstIndex < layout.elementIds.length;\n firstIndex += 1\n ) {\n for (\n let secondIndex = firstIndex + 1;\n secondIndex < layout.elementIds.length;\n secondIndex += 1\n ) {\n const firstId = layout.elementIds[firstIndex]!;\n const secondId = layout.elementIds[secondIndex]!;\n const first = boxes[firstId];\n const second = boxes[secondId];\n if (!first || !second) continue;\n const overlaps =\n first.x < second.x + second.width &&\n first.x + first.width > second.x &&\n first.y < second.y + second.height &&\n first.y + first.height > second.y;\n if (overlaps) collisions.push({ firstId, secondId });\n }\n }\n }\n return collisions;\n}\n","import type { Checkpoint } from \"@kokoa/clotho\";\nimport { mutateDef } from \"./internals\";\n\nexport function addCheckpoint(checkpoint: Checkpoint): void {\n mutateDef(\n (def) => {\n def.checkpoints.push(checkpoint);\n def.checkpoints.sort((a, b) => a.time - b.time);\n },\n `Checkpoint 추가: ${checkpoint.id}`,\n \"checkpoint\",\n );\n}\n\nexport function updateCheckpoint(id: string, patch: Partial<Checkpoint>): void {\n mutateDef(\n (def) => {\n const index = def.checkpoints.findIndex(\n (checkpoint) => checkpoint.id === id,\n );\n if (index < 0) return;\n def.checkpoints[index] = {\n ...def.checkpoints[index],\n ...patch,\n } as Checkpoint;\n def.checkpoints.sort((a, b) => a.time - b.time);\n },\n `Checkpoint 수정: ${id}`,\n \"checkpoint\",\n );\n}\n\nexport function deleteCheckpoint(id: string): void {\n mutateDef(\n (def) => {\n def.checkpoints = def.checkpoints.filter(\n (checkpoint) => checkpoint.id !== id,\n );\n },\n `Checkpoint 삭제: ${id}`,\n \"checkpoint\",\n );\n}\n\nexport function uniqueCheckpointId(): string {\n return `checkpoint-${Date.now().toString(36)}`;\n}\n","import type { AnimationElement, GroupElement } from \"@kokoa/clotho\";\nimport {\n addElement,\n deleteElement,\n getDef,\n setSelection,\n uniqueElementId,\n updateElementBase,\n} from \"./state\";\n\nexport function isGroup(el: AnimationElement): el is GroupElement {\n return el.type === \"group\";\n}\n\n/** Direct children of a group, in document order (which is also paint order). */\nexport function childIdsOf(groupId: string): string[] {\n const def = getDef();\n if (!def) return [];\n return def.elements\n .filter((el) => el.parentId === groupId)\n .map((el) => el.id);\n}\n\n/**\n * The outermost group containing `elementId`, or null when it is at the root.\n *\n * clotho v1 groups by `parentId` on the child rather than `group.childIds`. The old\n * model could not work: a reference list produces no nested `<g>`, so a group's\n * transform never reached its children — and the legacy renderer had no `group` branch\n * at all. Grouping does something for the first time here.\n */\nexport function findContainingGroup(elementId: string): GroupElement | null {\n const def = getDef();\n if (!def) return null;\n const element = def.elements.find((el) => el.id === elementId);\n const parentId = element?.parentId;\n if (parentId === undefined) return null;\n const parent = def.elements.find((el) => el.id === parentId);\n if (!parent || !isGroup(parent)) return null;\n return findContainingGroup(parent.id) ?? parent;\n}\n\nexport function expandToLeafIds(ids: string[]): string[] {\n const def = getDef();\n if (!def) return ids;\n const seen = new Set<string>();\n const stack = [...ids];\n while (stack.length) {\n const id = stack.pop()!;\n if (seen.has(id)) continue;\n seen.add(id);\n const el = def.elements.find((e) => e.id === id);\n if (el && isGroup(el)) {\n for (const childId of childIdsOf(el.id)) stack.push(childId);\n }\n }\n const out: string[] = [];\n for (const id of seen) {\n const el = def.elements.find((e) => e.id === id);\n if (el && !isGroup(el)) out.push(id);\n }\n return out;\n}\n\nexport function groupBbox(\n groupId: string,\n): { x: number; y: number; w: number; h: number } | null {\n const def = getDef();\n if (!def) return null;\n const leafIds = expandToLeafIds([groupId]);\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n let any = false;\n for (const id of leafIds) {\n const el = def.elements.find((e) => e.id === id);\n if (!el) continue;\n const b = elementBbox(el);\n if (!b) continue;\n any = true;\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n if (b.x + b.w > maxX) maxX = b.x + b.w;\n if (b.y + b.h > maxY) maxY = b.y + b.h;\n }\n return any ? { x: minX, y: minY, w: maxX - minX, h: maxY - minY } : null;\n}\n\nfunction elementBbox(\n el: AnimationElement,\n): { x: number; y: number; w: number; h: number } | null {\n if (el.type === \"rect\" || el.type === \"image\")\n return { x: el.x, y: el.y, w: el.width, h: el.height };\n if (el.type === \"circle\")\n return { x: el.cx - el.r, y: el.cy - el.r, w: el.r * 2, h: el.r * 2 };\n if (el.type === \"text\")\n return {\n x: el.x - 40,\n y: el.y - (el.fontSize ?? 16),\n w: 80,\n h: el.fontSize ?? 16,\n };\n if (el.type === \"line\" || el.type === \"arrow\") {\n if (\n typeof el.x1 !== \"number\" ||\n typeof el.x2 !== \"number\" ||\n typeof el.y1 !== \"number\" ||\n typeof el.y2 !== \"number\"\n )\n return null;\n return {\n x: Math.min(el.x1, el.x2),\n y: Math.min(el.y1, el.y2),\n w: Math.abs(el.x2 - el.x1),\n h: Math.abs(el.y2 - el.y1),\n };\n }\n if (el.type === \"polygon\") {\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n let any = false;\n for (const pair of el.points.trim().split(/\\s+/)) {\n const [x, y] = pair.split(\",\").map(Number);\n if (!Number.isFinite(x) || !Number.isFinite(y)) continue;\n any = true;\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n return any ? { x: minX, y: minY, w: maxX - minX, h: maxY - minY } : null;\n }\n if (el.type === \"path\") return { x: el.x ?? 0, y: el.y ?? 0, w: 60, h: 60 };\n return null;\n}\n\nfunction shiftLeafBy(el: AnimationElement, dx: number, dy: number): void {\n if (dx === 0 && dy === 0) return;\n if (el.type === \"rect\" || el.type === \"image\" || el.type === \"text\") {\n updateElementBase(el.id, { x: el.x + dx, y: el.y + dy });\n } else if (el.type === \"circle\") {\n updateElementBase(el.id, { cx: el.cx + dx, cy: el.cy + dy });\n } else if (el.type === \"line\" || el.type === \"arrow\") {\n const patch: Record<string, unknown> = {};\n if (typeof el.x1 === \"number\") patch.x1 = el.x1 + dx;\n if (typeof el.y1 === \"number\") patch.y1 = el.y1 + dy;\n if (typeof el.x2 === \"number\") patch.x2 = el.x2 + dx;\n if (typeof el.y2 === \"number\") patch.y2 = el.y2 + dy;\n updateElementBase(el.id, patch);\n } else if (el.type === \"path\") {\n updateElementBase(el.id, { x: (el.x ?? 0) + dx, y: (el.y ?? 0) + dy });\n } else if (el.type === \"polygon\") {\n const shifted = el.points\n .trim()\n .split(/\\s+/)\n .map((pair) => {\n const [x, y] = pair.split(\",\").map(Number);\n if (Number.isFinite(x) && Number.isFinite(y))\n return `${(x + dx).toFixed(1)},${(y + dy).toFixed(1)}`;\n return pair;\n })\n .join(\" \");\n updateElementBase(el.id, { points: shifted });\n }\n}\n\nexport function moveGroupBy(groupId: string, dx: number, dy: number): void {\n const def = getDef();\n if (!def) return;\n const leafIds = expandToLeafIds([groupId]);\n for (const id of leafIds) {\n const el = def.elements.find((e) => e.id === id);\n if (el) shiftLeafBy(el, dx, dy);\n }\n const group = def.elements.find((e) => e.id === groupId);\n if (group && isGroup(group)) {\n updateElementBase(groupId, { x: group.x + dx, y: group.y + dy });\n }\n}\n\nexport function groupElements(ids: string[]): string | null {\n if (ids.length < 2) return null;\n const def = getDef();\n if (!def) return null;\n const valid = ids.filter((id) => def.elements.some((e) => e.id === id));\n if (valid.length < 2) return null;\n const newId = uniqueElementId(\"group\");\n const group: GroupElement = {\n type: \"group\",\n id: newId,\n name: `Group ${newId.split(\"-\")[1] ?? \"\"}`.trim(),\n rotation: 0,\n appearances: [],\n tracks: [],\n bindings: [],\n // Children keep their absolute coordinates, so the group's own transform starts at\n // the identity. Setting x/y here would shift every member on the next render.\n x: 0,\n y: 0,\n };\n addElement(group);\n for (const id of valid) updateElementBase(id, { parentId: newId });\n setSelection({ kind: \"element\", elementId: newId });\n return newId;\n}\n\nexport function ungroupElement(groupId: string): string[] {\n const def = getDef();\n if (!def) return [];\n const group = def.elements.find((e) => e.id === groupId);\n if (!group || !isGroup(group)) return [];\n const childIds = childIdsOf(groupId);\n // Clear the pointers before removing the group, or the children would be re-rooted\n // by the tree builder and reported as having a missing parent.\n for (const id of childIds) updateElementBase(id, { parentId: undefined });\n deleteElement(groupId);\n if (childIds.length === 1) {\n setSelection({ kind: \"element\", elementId: childIds[0] });\n } else if (childIds.length > 1) {\n setSelection({ kind: \"elements\", elementIds: childIds });\n } else {\n setSelection({ kind: \"none\" });\n }\n return childIds;\n}\n","// Host-supplied resources.\n//\n// The Studio grew inside a blog, so a few of its paths were that blog's: the admin API\n// route, the uploads directory. A package cannot assume any of them. Each is now a\n// setting with the original value as the default, so an existing host keeps working\n// without changing anything and a new one is not stuck with someone else's layout.\n\nlet placeholderUrl = \"/uploads/placeholder.png\";\n\nexport interface HostOptions {\n /** Image used when inserting a placeholder image element. */\n readonly placeholderImageUrl?: string;\n}\n\nexport function configureHost(options: HostOptions): void {\n if (options.placeholderImageUrl) placeholderUrl = options.placeholderImageUrl;\n}\n\nexport function placeholderImageUrl(): string {\n return placeholderUrl;\n}\n","import type { AnimationDocument } from \"@kokoa/clotho\";\nimport type { PaletteCommand } from \"./legacy/studio-palette\";\nimport type { Selection } from \"./legacy/state\";\n\nexport type EditorPluginSlot = \"toolbar\" | \"panel\" | \"inspector\";\n\nexport interface EditorPluginManifestLike {\n id: string;\n name: string;\n capabilities: readonly string[];\n editor?: {\n toolbarItems?: readonly string[];\n panels?: readonly string[];\n inspectors?: readonly string[];\n };\n}\n\nexport interface EditorPluginPermissions {\n ui?: boolean;\n documentRead?: boolean;\n documentWrite?: boolean;\n}\n\nexport interface EditorPluginContext {\n readonly pluginId: string;\n getDocument(): AnimationDocument;\n replaceDocument(document: AnimationDocument): void;\n getSelection(): Selection;\n setSelection(selection: Selection): void;\n}\n\nexport interface EditorPluginView {\n id: string;\n label: string;\n mount(\n container: HTMLElement,\n context: EditorPluginContext,\n ): void | (() => void);\n}\n\nexport interface EditorPluginDefinition {\n manifest: EditorPluginManifestLike;\n toolbarItems?: Record<string, EditorPluginView>;\n panels?: Record<string, EditorPluginView>;\n inspectors?: Record<string, EditorPluginView>;\n commands?: readonly PaletteCommand[];\n}\n\nexport type EditorPluginPermissionResolver = (\n plugin: EditorPluginManifestLike,\n) => EditorPluginPermissions;\n\nexport type DocumentImporter = (\n input: unknown,\n) => AnimationDocument | Promise<AnimationDocument>;\n\nexport interface EditorPluginHostState {\n getDocument(): AnimationDocument | null;\n replaceDocument(document: AnimationDocument): void;\n getSelection(): Selection;\n setSelection(selection: Selection): void;\n}\n\nexport interface EditorPluginMountResult {\n commands: PaletteCommand[];\n dispose(): void;\n}\n\nexport interface EditorPluginIssue {\n pluginId: string;\n message: string;\n}\n\nconst SLOT_KEYS: Record<\n EditorPluginSlot,\n keyof NonNullable<EditorPluginManifestLike[\"editor\"]>\n> = {\n toolbar: \"toolbarItems\",\n panel: \"panels\",\n inspector: \"inspectors\",\n};\n\nfunction viewsFor(\n plugin: EditorPluginDefinition,\n slot: EditorPluginSlot,\n): Record<string, EditorPluginView> {\n if (slot === \"toolbar\") return plugin.toolbarItems ?? {};\n if (slot === \"panel\") return plugin.panels ?? {};\n return plugin.inspectors ?? {};\n}\n\nexport function validateEditorPlugin(\n plugin: EditorPluginDefinition,\n): EditorPluginIssue[] {\n const issues: EditorPluginIssue[] = [];\n const { id, capabilities, editor } = plugin.manifest;\n if (!capabilities.includes(\"editor\")) {\n issues.push({ pluginId: id, message: \"editor capability가 필요합니다.\" });\n }\n for (const slot of [\"toolbar\", \"panel\", \"inspector\"] as const) {\n const declared = new Set(editor?.[SLOT_KEYS[slot]] ?? []);\n const implemented = new Set(Object.keys(viewsFor(plugin, slot)));\n for (const viewId of declared) {\n if (!implemented.has(viewId)) {\n issues.push({\n pluginId: id,\n message: `${slot} ${viewId} 구현이 없습니다.`,\n });\n }\n }\n for (const viewId of implemented) {\n if (!declared.has(viewId)) {\n issues.push({\n pluginId: id,\n message: `${slot} ${viewId}가 manifest에 없습니다.`,\n });\n }\n }\n }\n return issues;\n}\n\nfunction permissionError(\n pluginId: string,\n permission: keyof EditorPluginPermissions,\n): Error {\n return new Error(\n `Editor plugin ${pluginId}에는 ${permission} 권한이 없습니다.`,\n );\n}\n\nexport function createEditorPluginContext(\n pluginId: string,\n permissions: EditorPluginPermissions,\n state: EditorPluginHostState,\n): EditorPluginContext {\n return Object.freeze({\n pluginId,\n getDocument() {\n if (!permissions.documentRead)\n throw permissionError(pluginId, \"documentRead\");\n const document = state.getDocument();\n if (!document) throw new Error(\"열린 애니메이션이 없습니다.\");\n return structuredClone(document);\n },\n replaceDocument(document: AnimationDocument) {\n if (!permissions.documentWrite)\n throw permissionError(pluginId, \"documentWrite\");\n state.replaceDocument(structuredClone(document));\n },\n getSelection() {\n if (!permissions.documentRead)\n throw permissionError(pluginId, \"documentRead\");\n return structuredClone(state.getSelection());\n },\n setSelection(selection: Selection) {\n if (!permissions.documentWrite)\n throw permissionError(pluginId, \"documentWrite\");\n state.setSelection(structuredClone(selection));\n },\n });\n}\n\nexport function mountEditorPlugins(\n root: HTMLElement,\n plugins: readonly EditorPluginDefinition[],\n resolvePermissions: EditorPluginPermissionResolver,\n state: EditorPluginHostState,\n): EditorPluginMountResult {\n const cleanups: (() => void)[] = [];\n const commands: PaletteCommand[] = [];\n const seen = new Set<string>();\n\n for (const plugin of plugins) {\n const { id } = plugin.manifest;\n if (seen.has(id))\n throw new Error(`Editor plugin ${id}가 중복 등록되었습니다.`);\n seen.add(id);\n const issues = validateEditorPlugin(plugin);\n if (issues.length > 0)\n throw new Error(issues.map((issue) => issue.message).join(\" \"));\n const permissions = resolvePermissions(plugin.manifest);\n if (!permissions.ui) continue;\n const context = createEditorPluginContext(id, permissions, state);\n commands.push(...(plugin.commands ?? []));\n\n for (const slot of [\"toolbar\", \"panel\", \"inspector\"] as const) {\n const target = root.querySelector<HTMLElement>(\n `[data-editor-plugin-slot=\"${slot}\"]`,\n );\n if (!target) continue;\n for (const viewId of plugin.manifest.editor?.[SLOT_KEYS[slot]] ?? []) {\n const view = viewsFor(plugin, slot)[viewId];\n if (!view) continue;\n const container = document.createElement(\n slot === \"toolbar\" ? \"span\" : \"section\",\n );\n container.dataset.editorPlugin = id;\n container.dataset.editorPluginView = viewId;\n container.setAttribute(\"aria-label\", view.label);\n target.append(container);\n const cleanup = view.mount(container, context);\n if (cleanup) cleanups.push(cleanup);\n }\n }\n }\n\n return {\n commands,\n dispose() {\n cleanups.reverse().forEach((cleanup) => cleanup());\n root\n .querySelectorAll(\"[data-editor-plugin]\")\n .forEach((element) => element.remove());\n },\n };\n}\n"]}
@@ -1144,6 +1144,11 @@ body.studio-player-popout #clotho-player-preview {
1144
1144
  font-family: var(--font-mono);
1145
1145
  font-size: 11px;
1146
1146
  }
1147
+ .studio-spotlight-preview-label {
1148
+ fill: #f59e0b;
1149
+ font-family: var(--font-mono);
1150
+ font-size: 12px;
1151
+ }
1147
1152
  .studio-camera-readout {
1148
1153
  padding: 0.4rem 0.55rem;
1149
1154
  margin-bottom: 0.4rem;
@@ -1224,6 +1229,13 @@ body.studio-player-popout #clotho-player-preview {
1224
1229
  font-size: 0.66rem;
1225
1230
  color: var(--color-fg-muted);
1226
1231
  }
1232
+ /* A hint about something that will silently do nothing, rather than about taste. */
1233
+ .studio-props-warn {
1234
+ color: #b45309;
1235
+ background-color: color-mix(in srgb, #d97706 12%, transparent);
1236
+ border-radius: 4px;
1237
+ padding: 0.3rem 0.4rem;
1238
+ }
1227
1239
  .studio-camera-chips {
1228
1240
  display: flex;
1229
1241
  flex-wrap: wrap;
@@ -1677,6 +1689,24 @@ body.studio-player-popout #clotho-player-preview {
1677
1689
  font-size: 0.65rem;
1678
1690
  margin-right: 0.2rem;
1679
1691
  }
1692
+ /* One effect on the selected element, as a button that selects it. */
1693
+ .studio-effect-chip {
1694
+ display: block;
1695
+ width: 100%;
1696
+ text-align: left;
1697
+ margin-bottom: 0.25rem;
1698
+ padding: 0.28rem 0.4rem;
1699
+ border: 1px solid var(--color-border);
1700
+ border-radius: 4px;
1701
+ background-color: var(--color-surface);
1702
+ color: var(--color-fg);
1703
+ font-family: var(--font-mono);
1704
+ font-size: 0.66rem;
1705
+ cursor: pointer;
1706
+ }
1707
+ .studio-effect-chip:hover {
1708
+ border-color: var(--color-accent);
1709
+ }
1680
1710
  .studio-add-effect-bar {
1681
1711
  display: grid;
1682
1712
  grid-template-columns: 1fr 1fr auto;
@@ -2232,7 +2262,8 @@ body.studio-player-popout #clotho-player-preview {
2232
2262
  .studio-tl-element-track {
2233
2263
  position: relative;
2234
2264
  width: 100%;
2235
- height: 32px;
2265
+ /* Room for an effect strip under the appearance bars. */
2266
+ height: 42px;
2236
2267
  user-select: none;
2237
2268
  }
2238
2269
  .studio-tl-appearance {
@@ -2278,6 +2309,64 @@ body.studio-player-popout #clotho-player-preview {
2278
2309
  pointer-events: none;
2279
2310
  white-space: nowrap;
2280
2311
  }
2312
+ /*
2313
+ * Effects on the row of the element they decorate.
2314
+ *
2315
+ * They were nowhere on the timeline before, so an author scrubbing to find out
2316
+ * when something was emphasised had nothing to scrub against. A thin strip under
2317
+ * the appearance bars, because an effect is a note on an element's life rather
2318
+ * than a life of its own.
2319
+ */
2320
+ .studio-tl-effect {
2321
+ position: absolute;
2322
+ top: 31px;
2323
+ height: 9px;
2324
+ border-radius: 3px;
2325
+ background-color: color-mix(in srgb, #d97706 45%, var(--color-surface));
2326
+ border: 1px solid #d97706;
2327
+ cursor: pointer;
2328
+ display: flex;
2329
+ align-items: center;
2330
+ overflow: visible;
2331
+ }
2332
+ .studio-tl-effect.is-spotlight {
2333
+ background-color: color-mix(in srgb, #7c3aed 45%, var(--color-surface));
2334
+ border-color: #7c3aed;
2335
+ }
2336
+ .studio-tl-effect.is-trail {
2337
+ background-color: color-mix(in srgb, #0891b2 45%, var(--color-surface));
2338
+ border-color: #0891b2;
2339
+ }
2340
+ .studio-tl-effect.is-selected {
2341
+ outline: 2px solid var(--color-accent);
2342
+ outline-offset: 1px;
2343
+ }
2344
+ .studio-tl-effect-label {
2345
+ padding: 0 4px;
2346
+ pointer-events: none;
2347
+ white-space: nowrap;
2348
+ font-family: var(--font-mono);
2349
+ font-size: 0.58rem;
2350
+ line-height: 1;
2351
+ color: var(--color-fg);
2352
+ opacity: 0.85;
2353
+ }
2354
+ /*
2355
+ * How far a trail reaches back before its own start. `window` is the field
2356
+ * authors get wrong, and drawing it makes it a length rather than a number.
2357
+ */
2358
+ .studio-tl-effect-reach {
2359
+ position: absolute;
2360
+ top: 2px;
2361
+ bottom: 2px;
2362
+ border-radius: 3px 0 0 3px;
2363
+ background: repeating-linear-gradient(
2364
+ 90deg,
2365
+ color-mix(in srgb, #0891b2 40%, transparent) 0 3px,
2366
+ transparent 3px 6px
2367
+ );
2368
+ pointer-events: none;
2369
+ }
2281
2370
  .studio-tl-keyframe {
2282
2371
  position: absolute;
2283
2372
  top: 50%;
package/dist/index.d.ts CHANGED
@@ -114,6 +114,15 @@ declare function updateChapter(id: string, patch: Partial<Chapter>): void;
114
114
  declare function deleteChapter(id: string): void;
115
115
  declare function addEffect(eff: AnimationEffect): void;
116
116
  declare function updateEffect(id: string, patch: Partial<AnimationEffect>): void;
117
+ /**
118
+ * Swap one effect for another with the same id.
119
+ *
120
+ * Changing an effect's type is a replacement, not a patch: `spotlight` carries
121
+ * `elementIds` where the others carry `elementId`, so merging the new fields over
122
+ * the old ones would leave a shape the schema rejects — and `mutateDef` drops a
123
+ * rejected edit without saying so.
124
+ */
125
+ declare function replaceEffect(id: string, next: AnimationEffect): void;
117
126
  declare function deleteEffect(id: string): void;
118
127
  declare function updateDuration(ms: number): void;
119
128
 
@@ -354,4 +363,4 @@ declare function createPerformanceProfilerPlugin(): EditorPluginDefinition;
354
363
 
355
364
  declare function createLinterPlugin(): EditorPluginDefinition;
356
365
 
357
- export { type AnimationRepository, type AnimationSummary, type CameraControl, type DocumentImporter, type EditorPluginContext, type EditorPluginDefinition, type EditorPluginHostState, type EditorPluginManifestLike, type EditorPluginMountResult, type EditorPluginPermissionResolver, type EditorPluginPermissions, type EditorPluginSlot, type EditorPluginView, type HistoryEntry, type HistoryKind, type HostOptions, type ImageUploadResolver, type LocalStorageRepositoryOptions, RESPONSIVE_VIEWPORTS, type SceneProfile, type Selection, type StoryEditorOptions, Studio, StudioMount, type StudioMountProps, type StudioProps, addAppearance, addCameraFocus, addChapter, addCheckpoint, addDefaultResponsiveVariants, addEffect, addElement, animationDocumentFileName, animationDocumentToJson, apiBaseUrl, appendStoryEdge, beginTransient, cameraControlAt, canRedo, canUndo, childIdsOf, clearCamera, configureAnimationRepository, configureApi, configureHost, createEditorPluginContext, createLayout, createLinterPlugin, createLocalStorageRepository, createPerformanceProfilerPlugin, createResponsiveInspectorPlugin, createStoryEditorPlugin, createTemplateEditorPlugin, createVisualRegressionPlugin, deleteCameraFocus, deleteChapter, deleteCheckpoint, deleteEffect, deleteElement, detachFromLayout, downloadAnimationJson, endTransient, findLayoutCollisions, garbageCollectAnimationAssets, getCamera, getCurrentSnapshot, getCurrentTime, getDef, getHistory, getSelectedElementIds, getSelection, groupElements, hasCamera, initialParameterValue, isDirty, isDraft, isElementSelected, isGroup, jumpBack, jumpForward, layoutIdsFor, markClean, mountEditorPlugins, moveCameraKeyframe, moveElementToEnd, moveElementToFront, parameterInputValue, placeholderImageUrl, profileAnimation, promoteDraftToSaved, redo, registerDataUriAsset, registerExternalAsset, registerInlineAsset, removeAppearance, removeCameraKeyframe, removeCameraTrack, removeTrack, removeTrackKeyframe, reorderElement, replaceStoryNodeDocument, resetHistory, setCameraKeyframe, setCameraStrokeScaling, setCurrentTime, setDef, setDraft, setElementValueAtTime, setSelection, setTrackKeyframe, subscribe, toggleSelectionFor, undo, ungroupElement, uniqueChapterId, uniqueCheckpointId, uniqueEffectId, uniqueElementId, updateAppearance, updateCameraFocus, updateCanvas, updateChapter, updateCheckpoint, updateData, updateDuration, updateEffect, updateElementBase, updateLocales, updateMeta, updateResponsive, updateSettings, validateEditorPlugin };
366
+ export { type AnimationRepository, type AnimationSummary, type CameraControl, type DocumentImporter, type EditorPluginContext, type EditorPluginDefinition, type EditorPluginHostState, type EditorPluginManifestLike, type EditorPluginMountResult, type EditorPluginPermissionResolver, type EditorPluginPermissions, type EditorPluginSlot, type EditorPluginView, type HistoryEntry, type HistoryKind, type HostOptions, type ImageUploadResolver, type LocalStorageRepositoryOptions, RESPONSIVE_VIEWPORTS, type SceneProfile, type Selection, type StoryEditorOptions, Studio, StudioMount, type StudioMountProps, type StudioProps, addAppearance, addCameraFocus, addChapter, addCheckpoint, addDefaultResponsiveVariants, addEffect, addElement, animationDocumentFileName, animationDocumentToJson, apiBaseUrl, appendStoryEdge, beginTransient, cameraControlAt, canRedo, canUndo, childIdsOf, clearCamera, configureAnimationRepository, configureApi, configureHost, createEditorPluginContext, createLayout, createLinterPlugin, createLocalStorageRepository, createPerformanceProfilerPlugin, createResponsiveInspectorPlugin, createStoryEditorPlugin, createTemplateEditorPlugin, createVisualRegressionPlugin, deleteCameraFocus, deleteChapter, deleteCheckpoint, deleteEffect, deleteElement, detachFromLayout, downloadAnimationJson, endTransient, findLayoutCollisions, garbageCollectAnimationAssets, getCamera, getCurrentSnapshot, getCurrentTime, getDef, getHistory, getSelectedElementIds, getSelection, groupElements, hasCamera, initialParameterValue, isDirty, isDraft, isElementSelected, isGroup, jumpBack, jumpForward, layoutIdsFor, markClean, mountEditorPlugins, moveCameraKeyframe, moveElementToEnd, moveElementToFront, parameterInputValue, placeholderImageUrl, profileAnimation, promoteDraftToSaved, redo, registerDataUriAsset, registerExternalAsset, registerInlineAsset, removeAppearance, removeCameraKeyframe, removeCameraTrack, removeTrack, removeTrackKeyframe, reorderElement, replaceEffect, replaceStoryNodeDocument, resetHistory, setCameraKeyframe, setCameraStrokeScaling, setCurrentTime, setDef, setDraft, setElementValueAtTime, setSelection, setTrackKeyframe, subscribe, toggleSelectionFor, undo, ungroupElement, uniqueChapterId, uniqueCheckpointId, uniqueEffectId, uniqueElementId, updateAppearance, updateCameraFocus, updateCanvas, updateChapter, updateCheckpoint, updateData, updateDuration, updateEffect, updateElementBase, updateLocales, updateMeta, updateResponsive, updateSettings, validateEditorPlugin };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { downloadAnimationJson, configureAnimationRepository } from './chunk-N47HF4VB.js';
2
- export { addAppearance, addCameraFocus, addChapter, addCheckpoint, addEffect, addElement, animationDocumentFileName, animationDocumentToJson, apiBaseUrl, beginTransient, cameraControlAt, canRedo, canUndo, childIdsOf, clearCamera, configureAnimationRepository, configureApi, configureHost, createEditorPluginContext, createLayout, deleteCameraFocus, deleteChapter, deleteCheckpoint, deleteEffect, deleteElement, detachFromLayout, downloadAnimationJson, endTransient, findLayoutCollisions, garbageCollectAnimationAssets, getCamera, getCurrentSnapshot, getCurrentTime, getDef, getHistory, getSelectedElementIds, getSelection, groupElements, hasCamera, isDirty, isDraft, isElementSelected, isGroup, jumpBack, jumpForward, layoutIdsFor, markClean, mountEditorPlugins, moveCameraKeyframe, moveElementToEnd, moveElementToFront, placeholderImageUrl, promoteDraftToSaved, redo, registerDataUriAsset, registerExternalAsset, registerInlineAsset, removeAppearance, removeCameraKeyframe, removeCameraTrack, removeTrack, removeTrackKeyframe, reorderElement, resetHistory, setCameraKeyframe, setCameraStrokeScaling, setCurrentTime, setDef, setDraft, setElementValueAtTime, setSelection, setTrackKeyframe, subscribe, toggleSelectionFor, undo, ungroupElement, uniqueChapterId, uniqueCheckpointId, uniqueEffectId, uniqueElementId, updateAppearance, updateCameraFocus, updateCanvas, updateChapter, updateCheckpoint, updateData, updateDuration, updateEffect, updateElementBase, updateLocales, updateMeta, updateResponsive, updateSettings, validateEditorPlugin } from './chunk-N47HF4VB.js';
1
+ import { downloadAnimationJson, configureAnimationRepository } from './chunk-WOP52KFW.js';
2
+ export { addAppearance, addCameraFocus, addChapter, addCheckpoint, addEffect, addElement, animationDocumentFileName, animationDocumentToJson, apiBaseUrl, beginTransient, cameraControlAt, canRedo, canUndo, childIdsOf, clearCamera, configureAnimationRepository, configureApi, configureHost, createEditorPluginContext, createLayout, deleteCameraFocus, deleteChapter, deleteCheckpoint, deleteEffect, deleteElement, detachFromLayout, downloadAnimationJson, endTransient, findLayoutCollisions, garbageCollectAnimationAssets, getCamera, getCurrentSnapshot, getCurrentTime, getDef, getHistory, getSelectedElementIds, getSelection, groupElements, hasCamera, isDirty, isDraft, isElementSelected, isGroup, jumpBack, jumpForward, layoutIdsFor, markClean, mountEditorPlugins, moveCameraKeyframe, moveElementToEnd, moveElementToFront, placeholderImageUrl, promoteDraftToSaved, redo, registerDataUriAsset, registerExternalAsset, registerInlineAsset, removeAppearance, removeCameraKeyframe, removeCameraTrack, removeTrack, removeTrackKeyframe, reorderElement, replaceEffect, resetHistory, setCameraKeyframe, setCameraStrokeScaling, setCurrentTime, setDef, setDraft, setElementValueAtTime, setSelection, setTrackKeyframe, subscribe, toggleSelectionFor, undo, ungroupElement, uniqueChapterId, uniqueCheckpointId, uniqueEffectId, uniqueElementId, updateAppearance, updateCameraFocus, updateCanvas, updateChapter, updateCheckpoint, updateData, updateDuration, updateEffect, updateElementBase, updateLocales, updateMeta, updateResponsive, updateSettings, validateEditorPlugin } from './chunk-WOP52KFW.js';
3
3
  import { useState, useEffect, useRef, useMemo } from 'react';
4
4
  import { usePlayer, AnimationStage } from '@kokoa/clotho/react';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -703,7 +703,7 @@ function StudioMount({
703
703
  if (repository) configureAnimationRepository(repository);
704
704
  let disposed = false;
705
705
  let cleanup;
706
- void import('./main-DC6D6RNQ.js').then(({ initStudio }) => {
706
+ void import('./main-VRQTHHZE.js').then(({ initStudio }) => {
707
707
  if (disposed) return;
708
708
  cleanup = initStudio({
709
709
  initialId,