@lottiefiles/dotlottie-web 0.69.0 → 0.70.0
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/dotlottie-player.wasm +0 -0
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -44
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +0 -66
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/webgl/dotlottie-player.wasm +0 -0
- package/dist/webgl/index.cjs +2 -2
- package/dist/webgl/index.cjs.map +1 -1
- package/dist/webgl/index.d.cts +0 -28
- package/dist/webgl/index.d.cts.map +1 -1
- package/dist/webgl/index.d.ts +0 -50
- package/dist/webgl/index.d.ts.map +1 -1
- package/dist/webgl/index.js +2 -2
- package/dist/webgl/index.js.map +1 -1
- package/dist/webgpu/dotlottie-player.wasm +0 -0
- package/dist/webgpu/index.cjs +2 -2
- package/dist/webgpu/index.cjs.map +1 -1
- package/dist/webgpu/index.d.cts +0 -28
- package/dist/webgpu/index.d.cts.map +1 -1
- package/dist/webgpu/index.d.ts +0 -50
- package/dist/webgpu/index.d.ts.map +1 -1
- package/dist/webgpu/index.js +2 -2
- package/dist/webgpu/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["init","CoreMode","DotLottieWebWorker"],"sources":["../src/animation-frame-manager.ts","../src/constants.ts","../src/core/dotlottie-player.js","../src/event-manager.ts","../src/offscreen-observer.ts","../src/resize-observer.ts","../src/utils.ts","../src/wasm-loader.ts","../src/dotlottie.ts","../src/worker/worker-manager.ts","../src/worker/dotlottie.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\ninterface AnimationFrameStrategy {\n cancelAnimationFrame(id: number): void;\n requestAnimationFrame(callback: (time: number) => void): number;\n}\n\nclass WebAnimationFrameStrategy implements AnimationFrameStrategy {\n public requestAnimationFrame(callback: (time: number) => void): number {\n return requestAnimationFrame(callback);\n }\n\n public cancelAnimationFrame(id: number): void {\n cancelAnimationFrame(id);\n }\n}\n\nclass NodeAnimationFrameStrategy implements AnimationFrameStrategy {\n private _lastHandleId: number = 0;\n\n private _lastImmediate: NodeJS.Immediate | null = null;\n\n public requestAnimationFrame(callback: (time: number) => void): number {\n if (this._lastHandleId >= Number.MAX_SAFE_INTEGER) {\n this._lastHandleId = 0;\n }\n\n this._lastHandleId += 1;\n\n this._lastImmediate = setImmediate(() => {\n callback(Date.now());\n });\n\n return this._lastHandleId;\n }\n\n public cancelAnimationFrame(_id: number): void {\n if (this._lastImmediate) {\n clearImmediate(this._lastImmediate);\n }\n }\n}\n\nexport class AnimationFrameManager {\n private readonly _strategy: AnimationFrameStrategy;\n\n public constructor() {\n this._strategy =\n typeof requestAnimationFrame === 'function' ? new WebAnimationFrameStrategy() : new NodeAnimationFrameStrategy();\n }\n\n public requestAnimationFrame(callback: (time: number) => void): number {\n return this._strategy.requestAnimationFrame(callback);\n }\n\n public cancelAnimationFrame(id: number): void {\n this._strategy.cancelAnimationFrame(id);\n }\n}\n","export const IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nexport const MS_TO_SEC_FACTOR = 1000;\nexport const DEFAULT_BG_COLOR = '#00000000';\nexport const ZIP_SIGNATURE = new Uint8Array([0x50, 0x4b, 0x03, 0x04]);\nexport const LOTTIE_JSON_MANDATORY_FIELDS = ['v', 'ip', 'op', 'layers', 'fr', 'w', 'h'];\n\n// These values are replace during the build process with the package version and name\nexport const PACKAGE_VERSION = __PACKAGE_VERSION__;\nexport const PACKAGE_NAME = __PACKAGE_NAME__;\n\nexport const DEFAULT_DPR_FACTOR = 0.75;\n\nexport const BYTES_PER_PIXEL = 4;\n","let wasm;\n\nconst cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );\n\nif (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); };\n\nlet cachedUint8ArrayMemory0 = null;\n\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc_command_export();\n wasm.__wbindgen_export_3.set(idx, obj);\n return idx;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store_command_export(idx);\n }\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedDataViewMemory0 = null;\n\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nlet cachedFloat32ArrayMemory0 = null;\n\nfunction getFloat32ArrayMemory0() {\n if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {\n cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);\n }\n return cachedFloat32ArrayMemory0;\n}\n\nfunction passArrayF32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getFloat32ArrayMemory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArrayJsValueToWasm0(array, malloc) {\n const ptr = malloc(array.length * 4, 4) >>> 0;\n for (let i = 0; i < array.length; i++) {\n const add = addToExternrefTable0(array[i]);\n getDataViewMemory0().setUint32(ptr + 4 * i, add, true);\n }\n WASM_VECTOR_LEN = array.length;\n return ptr;\n}\n/**\n * Register a font globally (static, not tied to a player instance).\n * @param {string} name\n * @param {Uint8Array} data\n * @returns {boolean}\n */\nexport function register_font(name, data) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray8ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.register_font(ptr0, len0, ptr1, len1);\n return ret !== 0;\n}\n\n/**\n * Playback direction / bounce mode.\n * @enum {0 | 1 | 2 | 3}\n */\nexport const Mode = Object.freeze({\n Forward: 0, \"0\": \"Forward\",\n Reverse: 1, \"1\": \"Reverse\",\n Bounce: 2, \"2\": \"Bounce\",\n ReverseBounce: 3, \"3\": \"ReverseBounce\",\n});\n\nconst DotLottiePlayerWasmFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_dotlottieplayerwasm_free(ptr >>> 0, 1));\n\nexport class DotLottiePlayerWasm {\n\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n DotLottiePlayerWasmFinalization.unregister(this);\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_dotlottieplayerwasm_free(ptr, 0);\n }\n /**\n * @param {string} id\n * @returns {boolean}\n */\n clear_slot(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_clear_slot(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_playing() {\n const ret = wasm.dotlottieplayerwasm_is_playing(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_stopped() {\n const ret = wasm.dotlottieplayerwasm_is_stopped(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {string}\n */\n layout_fit() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_layout_fit(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * @returns {number}\n */\n loop_count() {\n const ret = wasm.dotlottieplayerwasm_loop_count(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Poll the next player event. Returns `null` if the queue is empty,\n * otherwise a plain JS object with a `type` string field and optional\n * payload fields (`frameNo`, `loopCount`).\n * @returns {any}\n */\n poll_event() {\n const ret = wasm.dotlottieplayerwasm_poll_event(this.__wbg_ptr);\n return ret;\n }\n /**\n * Reset a slot to its default value from the animation.\n * @param {string} id\n * @returns {boolean}\n */\n reset_slot(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_reset_slot(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Set the layout.\n *\n * `fit` is one of `\"contain\"`, `\"fill\"`, `\"cover\"`, `\"fit-width\"`,\n * `\"fit-height\"`, `\"none\"`. `align_x` / `align_y` are in [0, 1].\n * @param {string} fit\n * @param {number} align_x\n * @param {number} align_y\n * @returns {boolean}\n */\n set_layout(fit, align_x, align_y) {\n const ptr0 = passStringToWasm0(fit, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_layout(this.__wbg_ptr, ptr0, len0, align_x, align_y);\n return ret !== 0;\n }\n /**\n * @param {string} name\n */\n set_marker(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n wasm.dotlottieplayerwasm_set_marker(this.__wbg_ptr, ptr0, len0);\n }\n /**\n * @returns {boolean}\n */\n tween_stop() {\n const ret = wasm.dotlottieplayerwasm_tween_stop(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n clear_slots() {\n const ret = wasm.dotlottieplayerwasm_clear_slots(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n has_segment() {\n const ret = wasm.dotlottieplayerwasm_has_segment(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_complete() {\n const ret = wasm.dotlottieplayerwasm_is_complete(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_tweening() {\n const ret = wasm.dotlottieplayerwasm_is_tweening(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Reset all slots to their default values from the animation.\n * @returns {boolean}\n */\n reset_slots() {\n const ret = wasm.dotlottieplayerwasm_reset_slots(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n reset_theme() {\n const ret = wasm.dotlottieplayerwasm_reset_theme(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n segment_end() {\n const ret = wasm.dotlottieplayerwasm_segment_end(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {number} quality\n * @returns {boolean}\n */\n set_quality(quality) {\n const ret = wasm.dotlottieplayerwasm_set_quality(this.__wbg_ptr, quality);\n return ret !== 0;\n }\n /**\n * @param {number} start\n * @param {number} end\n * @returns {boolean}\n */\n set_segment(start, end) {\n const ret = wasm.dotlottieplayerwasm_set_segment(this.__wbg_ptr, start, end);\n return ret !== 0;\n }\n /**\n * @param {string} name\n * @returns {boolean}\n */\n static unload_font(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_unload_font(ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {string | undefined}\n */\n animation_id() {\n const ret = wasm.dotlottieplayerwasm_animation_id(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n clear_marker() {\n wasm.dotlottieplayerwasm_clear_marker(this.__wbg_ptr);\n }\n emit_on_loop() {\n wasm.dotlottieplayerwasm_emit_on_loop(this.__wbg_ptr);\n }\n /**\n * Get all slot IDs as a JS array.\n * @returns {any}\n */\n get_slot_ids() {\n const ret = wasm.dotlottieplayerwasm_get_slot_ids(this.__wbg_ptr);\n return ret;\n }\n /**\n * Get the JSON value of a single slot by ID, or `undefined` if not found.\n * @param {string} id\n * @returns {string | undefined}\n */\n get_slot_str(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_slot_str(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * Returns an array of marker name strings.\n * @returns {any}\n */\n marker_names() {\n const ret = wasm.dotlottieplayerwasm_marker_names(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {boolean} v\n */\n set_autoplay(v) {\n wasm.dotlottieplayerwasm_set_autoplay(this.__wbg_ptr, v);\n }\n /**\n * Set a single slot by ID from a JSON value string.\n * @param {string} id\n * @param {string} json\n * @returns {boolean}\n */\n set_slot_str(id, json) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(json, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_slot_str(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @returns {boolean}\n */\n set_viewport(x, y, w, h) {\n const ret = wasm.dotlottieplayerwasm_set_viewport(this.__wbg_ptr, x, y, w, h);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n total_frames() {\n const ret = wasm.dotlottieplayerwasm_total_frames(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {number | null} [progress]\n * @returns {boolean}\n */\n tween_update(progress) {\n const ret = wasm.dotlottieplayerwasm_tween_update(this.__wbg_ptr, isLikeNone(progress) ? 0x100000001 : Math.fround(progress));\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n clear_segment() {\n const ret = wasm.dotlottieplayerwasm_clear_segment(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n current_frame() {\n const ret = wasm.dotlottieplayerwasm_current_frame(this.__wbg_ptr);\n return ret;\n }\n /**\n * Get the type string of a slot, or `undefined` if not found.\n * @param {string} id\n * @returns {string | undefined}\n */\n get_slot_type(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_slot_type(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * Get all slots as a JSON object string.\n * @returns {string}\n */\n get_slots_str() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_get_slots_str(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Returns the current affine transform as a flat `Float32Array`.\n * @returns {Float32Array}\n */\n get_transform() {\n const ret = wasm.dotlottieplayerwasm_get_transform(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n request_frame() {\n const ret = wasm.dotlottieplayerwasm_request_frame(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n segment_start() {\n const ret = wasm.dotlottieplayerwasm_segment_start(this.__wbg_ptr);\n return ret;\n }\n /**\n * Set multiple slots at once from a JSON string.\n * @param {string} json\n * @returns {boolean}\n */\n set_slots_str(json) {\n const ptr0 = passStringToWasm0(json, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_slots_str(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @param {string} id\n * @param {string} text\n * @returns {boolean}\n */\n set_text_slot(id, text) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(text, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_text_slot(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * @param {Float32Array} data\n * @returns {boolean}\n */\n set_transform(data) {\n const ptr0 = passArrayF32ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_transform(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Returns all state machine inputs as a JS array of strings.\n * @returns {any}\n */\n sm_get_inputs() {\n const ret = wasm.dotlottieplayerwasm_sm_get_inputs(this.__wbg_ptr);\n return ret;\n }\n /**\n * Poll the next state machine event. Returns `null` if the queue is empty,\n * otherwise a JS object with a `type` field and optional payload.\n * @returns {any}\n */\n sm_poll_event() {\n const ret = wasm.dotlottieplayerwasm_sm_poll_event(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_click(x, y) {\n wasm.dotlottieplayerwasm_sm_post_click(this.__wbg_ptr, x, y);\n }\n /**\n * `[width, height]` of the animation in its native coordinate space.\n * @returns {Float32Array}\n */\n animation_size() {\n const ret = wasm.dotlottieplayerwasm_animation_size(this.__wbg_ptr);\n return ret;\n }\n /**\n * Name of the currently active marker, or `undefined` if none.\n * @returns {string | undefined}\n */\n current_marker() {\n const ret = wasm.dotlottieplayerwasm_current_marker(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @returns {number}\n */\n layout_align_x() {\n const ret = wasm.dotlottieplayerwasm_layout_align_x(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n layout_align_y() {\n const ret = wasm.dotlottieplayerwasm_layout_align_y(this.__wbg_ptr);\n return ret;\n }\n /**\n * Load a Lottie JSON animation. Sets up the rendering target automatically.\n * @param {string} data\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n load_animation(data, width, height) {\n const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_animation(this.__wbg_ptr, ptr0, len0, width, height);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n loop_animation() {\n const ret = wasm.dotlottieplayerwasm_loop_animation(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Set a color slot (`r`, `g`, `b` in [0, 1]).\n * @param {string} id\n * @param {number} r\n * @param {number} g\n * @param {number} b\n * @returns {boolean}\n */\n set_color_slot(id, r, g, b) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_color_slot(this.__wbg_ptr, ptr0, len0, r, g, b);\n return ret !== 0;\n }\n /**\n * @param {number} n\n */\n set_loop_count(n) {\n wasm.dotlottieplayerwasm_set_loop_count(this.__wbg_ptr, n);\n }\n /**\n * @param {string} data\n * @returns {boolean}\n */\n set_theme_data(data) {\n const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_theme_data(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @param {string} key\n */\n sm_reset_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n wasm.dotlottieplayerwasm_sm_reset_input(this.__wbg_ptr, ptr0, len0);\n }\n /**\n * Returns the animation manifest as a JSON string, or empty string if unavailable.\n * @returns {string}\n */\n manifest_string() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_manifest_string(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * @param {string} id\n * @param {number} value\n * @returns {boolean}\n */\n set_scalar_slot(id, value) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_scalar_slot(this.__wbg_ptr, ptr0, len0, value);\n return ret !== 0;\n }\n /**\n * @param {string} id\n * @param {number} x\n * @param {number} y\n * @returns {boolean}\n */\n set_vector_slot(id, x, y) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_vector_slot(this.__wbg_ptr, ptr0, len0, x, y);\n return ret !== 0;\n }\n /**\n * @param {string} marker\n * @param {number | null} [duration]\n * @returns {boolean}\n */\n tween_to_marker(marker, duration) {\n const ptr0 = passStringToWasm0(marker, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_tween_to_marker(this.__wbg_ptr, ptr0, len0, isLikeNone(duration) ? 0x100000001 : Math.fround(duration));\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n background_color() {\n const ret = wasm.dotlottieplayerwasm_background_color(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Returns `[x, y, width, height]` of the layer's bounding box.\n * @param {string} layer_name\n * @returns {Float32Array}\n */\n get_layer_bounds(layer_name) {\n const ptr0 = passStringToWasm0(layer_name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_layer_bounds(this.__wbg_ptr, ptr0, len0);\n return ret;\n }\n /**\n * Zero-copy `Uint8Array` view into WASM linear memory.\n *\n * **Use the returned array immediately.** Do not store the reference across\n * any call that may reallocate the buffer (e.g. `resize` / `load_animation`\n * with different dimensions).\n * @returns {Uint8Array}\n */\n get_pixel_buffer() {\n const ret = wasm.dotlottieplayerwasm_get_pixel_buffer(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n segment_duration() {\n const ret = wasm.dotlottieplayerwasm_segment_duration(this.__wbg_ptr);\n return ret;\n }\n /**\n * Get the name of the current state.\n * @returns {string}\n */\n sm_current_state() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_sm_current_state(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Returns the ID of the currently active state machine, or `undefined`.\n * @returns {string | undefined}\n */\n state_machine_id() {\n const ret = wasm.dotlottieplayerwasm_state_machine_id(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Returns the raw JSON definition of a state machine by ID, or `undefined`.\n * @param {string} id\n * @returns {string | undefined}\n */\n get_state_machine(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_state_machine(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * @param {string} id\n * @param {number} x\n * @param {number} y\n * @returns {boolean}\n */\n set_position_slot(id, x, y) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_position_slot(this.__wbg_ptr, ptr0, len0, x, y);\n return ret !== 0;\n }\n /**\n * Tween with a cubic-bezier easing (`e0..e3`).\n * @param {number} to\n * @param {number | null | undefined} duration\n * @param {number} e0\n * @param {number} e1\n * @param {number} e2\n * @param {number} e3\n * @returns {boolean}\n */\n tween_with_easing(to, duration, e0, e1, e2, e3) {\n const ret = wasm.dotlottieplayerwasm_tween_with_easing(this.__wbg_ptr, to, isLikeNone(duration) ? 0x100000001 : Math.fround(duration), e0, e1, e2, e3);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n current_loop_count() {\n const ret = wasm.dotlottieplayerwasm_current_loop_count(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Returns the framework setup listeners as a JS array of strings.\n * @returns {any}\n */\n sm_framework_setup() {\n const ret = wasm.dotlottieplayerwasm_sm_framework_setup(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_up(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_up(this.__wbg_ptr, x, y);\n }\n /**\n * Load a state machine from a JSON definition string. Returns `true` on\n * success. The engine is kept alive inside the player and interacted\n * with via the `sm_*` methods.\n * @param {string} definition\n * @returns {boolean}\n */\n state_machine_load(definition) {\n const ptr0 = passStringToWasm0(definition, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_state_machine_load(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Load a .lottie archive from raw bytes.\n * @param {Uint8Array} data\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n load_dotlottie_data(data, width, height) {\n const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_dotlottie_data(this.__wbg_ptr, ptr0, len0, width, height);\n return ret !== 0;\n }\n /**\n * @param {string} key\n * @returns {string | undefined}\n */\n sm_get_string_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_get_string_input(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * @param {string} key\n * @param {string} value\n * @returns {boolean}\n */\n sm_set_string_input(key, value) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(value, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_set_string_input(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * Set background colour (`0xAARRGGBB`).\n * @param {number} color\n * @returns {boolean}\n */\n set_background_color(color) {\n const ret = wasm.dotlottieplayerwasm_set_background_color(this.__wbg_ptr, color);\n return ret !== 0;\n }\n /**\n * @param {string} key\n * @returns {boolean | undefined}\n */\n sm_get_boolean_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_get_boolean_input(this.__wbg_ptr, ptr0, len0);\n return ret === 0xFFFFFF ? undefined : ret !== 0;\n }\n /**\n * @param {string} key\n * @returns {number | undefined}\n */\n sm_get_numeric_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_get_numeric_input(this.__wbg_ptr, ptr0, len0);\n return ret === 0x100000001 ? undefined : ret;\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_down(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_down(this.__wbg_ptr, x, y);\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_exit(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_exit(this.__wbg_ptr, x, y);\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_move(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_move(this.__wbg_ptr, x, y);\n }\n /**\n * @param {string} key\n * @param {boolean} value\n * @returns {boolean}\n */\n sm_set_boolean_input(key, value) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_set_boolean_input(this.__wbg_ptr, ptr0, len0, value);\n return ret !== 0;\n }\n /**\n * @param {string} key\n * @param {number} value\n * @returns {boolean}\n */\n sm_set_numeric_input(key, value) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_set_numeric_input(this.__wbg_ptr, ptr0, len0, value);\n return ret !== 0;\n }\n /**\n * Unload the active state machine.\n */\n state_machine_unload() {\n wasm.dotlottieplayerwasm_state_machine_unload(this.__wbg_ptr);\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_enter(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_enter(this.__wbg_ptr, x, y);\n }\n /**\n * Clear the background colour (transparent).\n * @returns {boolean}\n */\n clear_background_color() {\n const ret = wasm.dotlottieplayerwasm_clear_background_color(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Load an animation from an already-loaded .lottie archive by its ID.\n * @param {string} id\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n load_animation_from_id(id, width, height) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_animation_from_id(this.__wbg_ptr, ptr0, len0, width, height);\n return ret !== 0;\n }\n /**\n * Poll the next state machine internal event. Returns `null` if the\n * queue is empty, otherwise a JS object `{ type: \"Message\", message }`.\n * @returns {any}\n */\n sm_poll_internal_event() {\n const ret = wasm.dotlottieplayerwasm_sm_poll_internal_event(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {boolean}\n */\n use_frame_interpolation() {\n const ret = wasm.dotlottieplayerwasm_use_frame_interpolation(this.__wbg_ptr);\n return ret !== 0;\n }\n reset_current_loop_count() {\n wasm.dotlottieplayerwasm_reset_current_loop_count(this.__wbg_ptr);\n }\n /**\n * Override the current state.\n * @param {string} state\n * @param {boolean} immediate\n * @returns {boolean}\n */\n sm_override_current_state(state, immediate) {\n const ptr0 = passStringToWasm0(state, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_override_current_state(this.__wbg_ptr, ptr0, len0, immediate);\n return ret !== 0;\n }\n /**\n * Load a state machine from a .lottie archive by state-machine ID.\n * @param {string} id\n * @returns {boolean}\n */\n state_machine_load_from_id(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_state_machine_load_from_id(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @param {boolean} v\n */\n set_use_frame_interpolation(v) {\n wasm.dotlottieplayerwasm_set_use_frame_interpolation(this.__wbg_ptr, v);\n }\n constructor() {\n const ret = wasm.dotlottieplayerwasm_new();\n this.__wbg_ptr = ret >>> 0;\n DotLottiePlayerWasmFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @returns {Mode}\n */\n mode() {\n const ret = wasm.dotlottieplayerwasm_mode(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {boolean}\n */\n play() {\n const ret = wasm.dotlottieplayerwasm_play(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @param {number} no\n * @returns {boolean}\n */\n seek(no) {\n const ret = wasm.dotlottieplayerwasm_seek(this.__wbg_ptr, no);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n stop() {\n const ret = wasm.dotlottieplayerwasm_stop(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Advance time and render. Call once per `requestAnimationFrame`.\n * @returns {boolean}\n */\n tick() {\n const ret = wasm.dotlottieplayerwasm_tick(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Clear the canvas to the background colour.\n */\n clear() {\n wasm.dotlottieplayerwasm_clear(this.__wbg_ptr);\n }\n /**\n * @returns {boolean}\n */\n pause() {\n const ret = wasm.dotlottieplayerwasm_pause(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n speed() {\n const ret = wasm.dotlottieplayerwasm_speed(this.__wbg_ptr);\n return ret;\n }\n /**\n * Tween to `to` frame. `duration` in seconds; pass `undefined` for default.\n * @param {number} to\n * @param {number | null} [duration]\n * @returns {boolean}\n */\n tween(to, duration) {\n const ret = wasm.dotlottieplayerwasm_tween(this.__wbg_ptr, to, isLikeNone(duration) ? 0x100000001 : Math.fround(duration));\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n width() {\n const ret = wasm.dotlottieplayerwasm_width(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * @returns {number}\n */\n height() {\n const ret = wasm.dotlottieplayerwasm_height(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Render the current frame without advancing time.\n * @returns {boolean}\n */\n render() {\n const ret = wasm.dotlottieplayerwasm_render(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Resize the canvas. For the SW renderer this also resizes the pixel buffer.\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n resize(width, height) {\n const ret = wasm.dotlottieplayerwasm_resize(this.__wbg_ptr, width, height);\n return ret !== 0;\n }\n /**\n * Returns an array of `{ name, time, duration }` objects.\n * @returns {any}\n */\n markers() {\n const ret = wasm.dotlottieplayerwasm_markers(this.__wbg_ptr);\n return ret;\n }\n /**\n * Fire a named event into the state machine.\n * @param {string} event\n * @returns {boolean}\n */\n sm_fire(event) {\n const ptr0 = passStringToWasm0(event, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_fire(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Stop the state machine.\n * @returns {boolean}\n */\n sm_stop() {\n const ret = wasm.dotlottieplayerwasm_sm_stop(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Advance the state machine by one tick. Returns `false` if no state machine\n * is loaded, otherwise `true` (even if the machine is stopped or errored).\n * @returns {boolean}\n */\n sm_tick() {\n const ret = wasm.dotlottieplayerwasm_sm_tick(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n autoplay() {\n const ret = wasm.dotlottieplayerwasm_autoplay(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n duration() {\n const ret = wasm.dotlottieplayerwasm_duration(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {boolean} v\n */\n set_loop(v) {\n wasm.dotlottieplayerwasm_set_loop(this.__wbg_ptr, v);\n }\n /**\n * @param {Mode} mode\n */\n set_mode(mode) {\n wasm.dotlottieplayerwasm_set_mode(this.__wbg_ptr, mode);\n }\n /**\n * Start the state machine with an open-URL policy.\n * @param {boolean} require_user_interaction\n * @param {any[]} whitelist\n * @returns {boolean}\n */\n sm_start(require_user_interaction, whitelist) {\n const ptr0 = passArrayJsValueToWasm0(whitelist, wasm.__wbindgen_malloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_start(this.__wbg_ptr, require_user_interaction, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {string | undefined}\n */\n theme_id() {\n const ret = wasm.dotlottieplayerwasm_theme_id(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {string} layer_name\n * @returns {boolean}\n */\n intersect(x, y, layer_name) {\n const ptr0 = passStringToWasm0(layer_name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_intersect(this.__wbg_ptr, x, y, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_loaded() {\n const ret = wasm.dotlottieplayerwasm_is_loaded(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_paused() {\n const ret = wasm.dotlottieplayerwasm_is_paused(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @param {string} name\n * @param {Uint8Array} data\n * @returns {boolean}\n */\n load_font(name, data) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray8ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_font(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * @param {number} no\n * @returns {boolean}\n */\n set_frame(no) {\n const ret = wasm.dotlottieplayerwasm_set_frame(this.__wbg_ptr, no);\n return ret !== 0;\n }\n /**\n * @param {number} speed\n */\n set_speed(speed) {\n wasm.dotlottieplayerwasm_set_speed(this.__wbg_ptr, speed);\n }\n /**\n * @param {string} id\n * @returns {boolean}\n */\n set_theme(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_theme(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Get the current status of the state machine as a string.\n * @returns {string}\n */\n sm_status() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_sm_status(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg_buffer_609cc3eee51ed158 = function(arg0) {\n const ret = arg0.buffer;\n return ret;\n };\n imports.wbg.__wbg_error_7534b8e9a36f1ab4 = function(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free_command_export(deferred0_0, deferred0_1, 1);\n }\n };\n imports.wbg.__wbg_new_405e22f390576ce2 = function() {\n const ret = new Object();\n return ret;\n };\n imports.wbg.__wbg_new_78feb108b6472713 = function() {\n const ret = new Array();\n return ret;\n };\n imports.wbg.__wbg_new_8a6f238a6ece86ea = function() {\n const ret = new Error();\n return ret;\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a = function(arg0, arg1, arg2) {\n const ret = new Uint8Array(arg0, arg1 >>> 0, arg2 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_newwithlength_5a5efe313cfd59f1 = function(arg0) {\n const ret = new Float32Array(arg0 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_now_807e54c39636c349 = function() {\n const ret = Date.now();\n return ret;\n };\n imports.wbg.__wbg_push_737cfc8c1432c2c6 = function(arg0, arg1) {\n const ret = arg0.push(arg1);\n return ret;\n };\n imports.wbg.__wbg_set_bb8cecf6a62b9f46 = function() { return handleError(function (arg0, arg1, arg2) {\n const ret = Reflect.set(arg0, arg1, arg2);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_setindex_4e73afdcd9bb95cd = function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n };\n imports.wbg.__wbg_stack_0ed75d68575b0f3c = function(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_export_3;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n ;\n };\n imports.wbg.__wbindgen_memory = function() {\n const ret = wasm.memory;\n return ret;\n };\n imports.wbg.__wbindgen_number_new = function(arg0) {\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_string_get = function(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbindgen_string_new = function(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n imports.wbg.__wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {\n\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedDataViewMemory0 = null;\n cachedFloat32ArrayMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n throw new Error('WASM module URL must be provided via DotLottieWasmLoader or setWasmUrl().');\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","/**\n * Represents the different types of events that can be dispatched.\n */\nexport type EventType =\n | 'complete'\n | 'frame'\n | 'load'\n | 'loadError'\n | 'renderError'\n | 'loop'\n | 'pause'\n | 'play'\n | 'stop'\n | 'destroy'\n | 'freeze'\n | 'unfreeze'\n | 'render'\n | 'ready'\n | 'stateMachineStart'\n | 'stateMachineStop'\n | 'stateMachineTransition'\n | 'stateMachineStateEntered'\n | 'stateMachineStateExit'\n | 'stateMachineCustomEvent'\n | 'stateMachineError'\n | 'stateMachineBooleanInputValueChange'\n | 'stateMachineNumericInputValueChange'\n | 'stateMachineStringInputValueChange'\n | 'stateMachineInputFired'\n | 'stateMachineInternalMessage';\n\n/**\n * Maps an event type string to its respective event interface.\n */\ntype EventByType<T extends EventType> = Extract<Event, { type: T }>;\n\n/**\n * Base interface for all events.\n */\nexport interface BaseEvent {\n type: EventType;\n}\n\nexport interface RenderEvent extends BaseEvent {\n currentFrame: number;\n type: 'render';\n}\n\nexport interface FreezeEvent extends BaseEvent {\n type: 'freeze';\n}\n\nexport interface UnfreezeEvent extends BaseEvent {\n type: 'unfreeze';\n}\n\n/*\n * Event fired when a destroy action occurs.\n */\nexport interface DestroyEvent extends BaseEvent {\n type: 'destroy';\n}\n\n/**\n * Event fired when a loop action occurs.\n */\nexport interface LoopEvent extends BaseEvent {\n loopCount: number;\n type: 'loop';\n}\n\n/**\n * Event fired during frame changes.\n */\nexport interface FrameEvent extends BaseEvent {\n currentFrame: number;\n type: 'frame';\n}\n\n/**\n * Event fired when a load action occurs.\n */\nexport interface LoadEvent extends BaseEvent {\n type: 'load';\n}\n\n/**\n * Event fired when a loading error occurs.\n */\nexport interface LoadErrorEvent extends BaseEvent {\n error: Error;\n type: 'loadError';\n}\n\n/**\n * Event fired when a loading error occurs.\n */\nexport interface RenderErrorEvent extends BaseEvent {\n error: Error;\n type: 'renderError';\n}\n\n/**\n * Event fired when a completion action occurs.\n */\nexport interface CompleteEvent extends BaseEvent {\n type: 'complete';\n}\n\n/**\n * Event fired when a pause action occurs.\n */\nexport interface PauseEvent extends BaseEvent {\n type: 'pause';\n}\n\n/**\n * Event fired when a play action occurs.\n */\nexport interface PlayEvent extends BaseEvent {\n type: 'play';\n}\n\n/**\n * Event fired when a stop action occurs.\n */\nexport interface StopEvent extends BaseEvent {\n type: 'stop';\n}\n\n/**\n * Event fired when a WASM module is initialized and ready.\n */\nexport interface ReadyEvent extends BaseEvent {\n type: 'ready';\n}\n\nexport interface StateMachineStartEvent extends BaseEvent {\n type: 'stateMachineStart';\n}\n\nexport interface StateMachineStopEvent extends BaseEvent {\n type: 'stateMachineStop';\n}\n\nexport interface StateMachineTransitionEvent extends BaseEvent {\n fromState: string;\n toState: string;\n type: 'stateMachineTransition';\n}\n\nexport interface StateMachineStateEnteredEvent extends BaseEvent {\n state: string;\n type: 'stateMachineStateEntered';\n}\n\nexport interface StateMachineStateExitEvent extends BaseEvent {\n state: string;\n type: 'stateMachineStateExit';\n}\n\nexport interface StateMachineCustomEvent extends BaseEvent {\n eventName: string;\n type: 'stateMachineCustomEvent';\n}\n\nexport interface StateMachineErrorEvent extends BaseEvent {\n error: string;\n type: 'stateMachineError';\n}\n\nexport interface StateMachineBooleanInputValueChangeEvent extends BaseEvent {\n inputName: string;\n newValue: boolean;\n oldValue: boolean;\n type: 'stateMachineBooleanInputValueChange';\n}\n\nexport interface StateMachineNumericInputValueChangeEvent extends BaseEvent {\n inputName: string;\n newValue: number;\n oldValue: number;\n type: 'stateMachineNumericInputValueChange';\n}\n\nexport interface StateMachineStringInputValueChangeEvent extends BaseEvent {\n inputName: string;\n newValue: string;\n oldValue: string;\n type: 'stateMachineStringInputValueChange';\n}\n\nexport interface StateMachineInputFiredEvent extends BaseEvent {\n inputName: string;\n type: 'stateMachineInputFired';\n}\n\nexport interface StateMachineInternalMessage extends BaseEvent {\n message: string;\n type: 'stateMachineInternalMessage';\n}\n\n/**\n * Type representing all possible event types.\n */\nexport type Event =\n | LoopEvent\n | FrameEvent\n | LoadEvent\n | LoadErrorEvent\n | RenderErrorEvent\n | CompleteEvent\n | PauseEvent\n | PlayEvent\n | StopEvent\n | DestroyEvent\n | FreezeEvent\n | UnfreezeEvent\n | RenderEvent\n | ReadyEvent\n | StateMachineStartEvent\n | StateMachineStopEvent\n | StateMachineTransitionEvent\n | StateMachineStateEnteredEvent\n | StateMachineStateExitEvent\n | StateMachineCustomEvent\n | StateMachineErrorEvent\n | StateMachineBooleanInputValueChangeEvent\n | StateMachineNumericInputValueChangeEvent\n | StateMachineStringInputValueChangeEvent\n | StateMachineInputFiredEvent\n | StateMachineInternalMessage;\n\nexport type EventListener<T extends EventType> = (event: EventByType<T>) => void;\n\n/**\n * Manages registration and dispatching of event listeners.\n */\nexport class EventManager {\n private readonly _eventListeners: Map<EventType, Set<EventListener<EventType>>> = new Map();\n\n public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n let listeners = this._eventListeners.get(type);\n\n if (!listeners) {\n listeners = new Set<EventListener<EventType>>();\n this._eventListeners.set(type, listeners);\n }\n\n listeners.add(listener as unknown as EventListener<EventType>);\n }\n\n public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n const listeners = this._eventListeners.get(type);\n\n if (!listeners) return;\n\n if (listener) {\n listeners.delete(listener as unknown as EventListener<EventType>);\n\n if (listeners.size === 0) {\n this._eventListeners.delete(type);\n }\n } else {\n this._eventListeners.delete(type);\n }\n }\n\n public dispatch<T extends EventType>(event: EventByType<T>): void {\n const listeners = this._eventListeners.get(event.type);\n\n listeners?.forEach((listener) => listener(event));\n }\n\n public removeAllEventListeners(): void {\n this._eventListeners.clear();\n }\n}\n","import type { DotLottie } from './dotlottie';\nimport type { DotLottieWorker } from './worker/dotlottie';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class OffscreenObserver {\n private static _observer: IntersectionObserver | null = null;\n\n private static readonly _observedCanvases = new Map<HTMLCanvasElement, DotLottie | DotLottieWorker>();\n\n private static _initializeObserver(): void {\n if (OffscreenObserver._observer) return;\n\n const intersectionObserverCallback = (entries: IntersectionObserverEntry[]): void => {\n entries.forEach((entry) => {\n const instance = OffscreenObserver._observedCanvases.get(entry.target as HTMLCanvasElement);\n\n if (instance) {\n if (entry.isIntersecting) {\n instance.unfreeze();\n } else {\n instance.freeze();\n }\n }\n });\n };\n\n OffscreenObserver._observer = new IntersectionObserver(intersectionObserverCallback, {\n threshold: 0,\n });\n }\n\n public static observe(canvas: HTMLCanvasElement, dotLottieInstance: DotLottie | DotLottieWorker): void {\n OffscreenObserver._initializeObserver();\n\n if (OffscreenObserver._observedCanvases.has(canvas)) return;\n\n OffscreenObserver._observedCanvases.set(canvas, dotLottieInstance);\n OffscreenObserver._observer?.observe(canvas);\n }\n\n public static unobserve(canvas: HTMLCanvasElement): void {\n OffscreenObserver._observer?.unobserve(canvas);\n OffscreenObserver._observedCanvases.delete(canvas);\n\n if (OffscreenObserver._observedCanvases.size === 0) {\n OffscreenObserver._observer?.disconnect();\n OffscreenObserver._observer = null;\n }\n }\n}\n","import type { DotLottie } from './dotlottie';\nimport type { DotLottieWorker } from './worker/dotlottie';\n\nexport const RESIZE_DEBOUNCE_TIME = 100;\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class CanvasResizeObserver {\n private static _observer: ResizeObserver | null = null;\n\n private static readonly _observedCanvases = new Map<HTMLCanvasElement, [DotLottie | DotLottieWorker, number]>();\n\n private static _initializeObserver(): void {\n if (CanvasResizeObserver._observer) return;\n\n const resizeHandler = (entries: ResizeObserverEntry[]): void => {\n entries.forEach((entry) => {\n const element = CanvasResizeObserver._observedCanvases.get(entry.target as HTMLCanvasElement);\n\n if (!element) return;\n\n const [dotLottieInstance, timeout] = element;\n\n clearTimeout(timeout);\n\n const newTimeout = setTimeout(() => {\n dotLottieInstance.resize();\n }, RESIZE_DEBOUNCE_TIME) as unknown as number;\n\n CanvasResizeObserver._observedCanvases.set(entry.target as HTMLCanvasElement, [dotLottieInstance, newTimeout]);\n });\n };\n\n CanvasResizeObserver._observer = new ResizeObserver(resizeHandler);\n }\n\n public static observe(canvas: HTMLCanvasElement, dotLottieInstance: DotLottie | DotLottieWorker): void {\n CanvasResizeObserver._initializeObserver();\n\n if (CanvasResizeObserver._observedCanvases.has(canvas)) return;\n\n CanvasResizeObserver._observedCanvases.set(canvas, [dotLottieInstance, 0]);\n CanvasResizeObserver._observer?.observe(canvas);\n }\n\n public static unobserve(canvas: HTMLCanvasElement): void {\n const element = CanvasResizeObserver._observedCanvases.get(canvas);\n\n if (element) {\n const timeoutId = element[1];\n\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n CanvasResizeObserver._observer?.unobserve(canvas);\n CanvasResizeObserver._observedCanvases.delete(canvas);\n\n if (!CanvasResizeObserver._observedCanvases.size && CanvasResizeObserver._observer) {\n CanvasResizeObserver._observer.disconnect();\n CanvasResizeObserver._observer = null;\n }\n }\n}\n","import { DEFAULT_DPR_FACTOR, IS_BROWSER, LOTTIE_JSON_MANDATORY_FIELDS, ZIP_SIGNATURE } from './constants';\n\n/**\n * Validates if a string is a valid hex color in #RRGGBB or #RRGGBBAA format.\n * @param color - Color string to validate\n * @returns True if valid hex color format, false otherwise\n */\nexport function isHexColor(color: string): boolean {\n return /^#([\\da-f]{6}|[\\da-f]{8})$/iu.test(color);\n}\n\n/**\n * Converts a hex color string to an RGBA integer for WASM consumption.\n * Adds full opacity (alpha = 255, 0xFF in hex) if alpha channel is not specified.\n * @param colorHex - Hex color string (e.g., '#FFFFFF' or '#FFFFFFFF')\n * @returns RGBA value as a 32-bit integer, or 0 if invalid hex color\n */\nexport function hexStringToRGBAInt(colorHex: string): number {\n if (!isHexColor(colorHex)) {\n return 0;\n }\n\n let hex = colorHex.replace('#', '');\n\n // Add alpha if it's not included\n hex = hex.length === 6 ? `${hex}ff` : hex;\n\n return parseInt(hex, 16);\n}\n\n/**\n * Detects if file data is a .lottie file by checking for ZIP signature.\n * dotLottie files are ZIP archives containing Lottie JSON and metadata.\n * @param fileData - Raw file data as ArrayBuffer\n * @returns True if data starts with ZIP signature, false otherwise\n */\nexport function isDotLottie(fileData: ArrayBuffer): boolean {\n if (fileData.byteLength < 4) {\n return false;\n }\n\n const fileSignature = new Uint8Array(fileData.slice(0, ZIP_SIGNATURE.byteLength));\n\n for (let i = 0; i < ZIP_SIGNATURE.length; i += 1) {\n if (ZIP_SIGNATURE[i] !== fileSignature[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns whether the given object looks like a valid Lottie JSON structure.\n */\nexport function isLottieJSON(json: Record<string, unknown>): boolean {\n return LOTTIE_JSON_MANDATORY_FIELDS.every((field) => Object.hasOwn(json, field));\n}\n\n/**\n * Detects if data is a valid Lottie animation by checking for required JSON fields.\n * Accepts either a JSON string or a parsed object.\n * @param fileData - Lottie data as JSON string or parsed object\n * @returns True if data contains required Lottie fields, false otherwise\n */\nexport function isLottie(fileData: string | Record<string, unknown>): boolean {\n if (typeof fileData === 'string') {\n try {\n return isLottieJSON(JSON.parse(fileData));\n } catch (_e) {\n return false;\n }\n } else {\n return isLottieJSON(fileData);\n }\n}\n\n/**\n * Calculates the default device pixel ratio with a scaling factor.\n * Applies a factor to balance quality and performance on high-DPI displays.\n * @returns Adjusted device pixel ratio value\n */\nexport function getDefaultDPR(): number {\n const dpr = IS_BROWSER ? window.devicePixelRatio : 1;\n\n return 1 + (dpr - 1) * DEFAULT_DPR_FACTOR;\n}\n\n/**\n * Checks if an HTML element is currently visible within the browser viewport.\n * Used to determine when to freeze/unfreeze rendering for performance optimization.\n * @param element - HTMLElement to check visibility for\n * @returns True if element is at least partially visible in viewport, false otherwise\n */\nexport function isElementInViewport(element: HTMLElement): boolean {\n const rect = element.getBoundingClientRect();\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n const viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n\n return !(rect.bottom < 0 || rect.top > viewportHeight || rect.right < 0 || rect.left > viewportWidth);\n}\n\n/**\n * Calculate pointer position relative to the canvas coordinate system\n * @param event - The mouse or pointer event (target should be the canvas element)\n * @returns The calculated position or null if calculation fails or target is not a valid canvas\n */\nexport function getPointerPosition(event: MouseEvent | PointerEvent): { x: number; y: number } | null {\n const canvas = event.target;\n\n if (canvas instanceof HTMLCanvasElement) {\n const rect = canvas.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0 || canvas.width === 0 || canvas.height === 0) {\n return null;\n }\n\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n\n const x = (event.clientX - rect.left) * scaleX;\n const y = (event.clientY - rect.top) * scaleY;\n\n if (!Number.isFinite(x) || !Number.isFinite(y) || Number.isNaN(x) || Number.isNaN(y)) {\n return null;\n }\n\n return { x, y };\n }\n\n // Return null if target is not an HTMLCanvasElement or calculation fails\n return null;\n}\n\nexport function handleOpenUrl(message: string): void {\n const content = message.replace('OpenUrl: ', '');\n\n const targetSeparatorIndex = content.indexOf(' | Target: ');\n let urlToOpen: string;\n let target: string;\n\n if (targetSeparatorIndex === -1) {\n // Format: \"OpenUrl: {url}\"\n urlToOpen = content;\n target = '_blank';\n } else {\n // Format: \"OpenUrl: {url} | Target: {target}\"\n urlToOpen = content.substring(0, targetSeparatorIndex);\n target = content.substring(targetSeparatorIndex + ' | Target: '.length);\n }\n\n window.open(urlToOpen, target);\n}\n","type WasmInitFn = (options: { module_or_path: string }) => Promise<unknown>;\n\nexport function createWasmLoader(initFn: WasmInitFn, primaryUrl: string, backupUrl: string) {\n let initPromise: Promise<void> | null = null;\n let wasmUrl = primaryUrl;\n\n return {\n load(): Promise<void> {\n if (!initPromise) {\n initPromise = initFn({ module_or_path: wasmUrl })\n .then(() => undefined)\n .catch(async (initialError: unknown): Promise<void> => {\n console.warn(`Primary WASM load failed from ${wasmUrl}: ${(initialError as Error).message}`);\n console.warn(`Attempting to load WASM from backup URL: ${backupUrl}`);\n\n try {\n await initFn({ module_or_path: backupUrl });\n } catch (backupError) {\n console.error(`Primary WASM URL failed: ${(initialError as Error).message}`);\n console.error(`Backup WASM URL failed: ${(backupError as Error).message}`);\n initPromise = null;\n throw new Error('WASM loading failed from all sources.');\n }\n });\n }\n\n return initPromise;\n },\n\n setWasmUrl(url: string): void {\n if (url === wasmUrl) return;\n\n wasmUrl = url;\n initPromise = null;\n },\n };\n}\n","/* eslint-disable no-warning-comments */\nimport { AnimationFrameManager } from './animation-frame-manager';\nimport { BYTES_PER_PIXEL, IS_BROWSER, PACKAGE_NAME, PACKAGE_VERSION } from './constants';\nimport init, { Mode as CoreMode, DotLottiePlayerWasm, register_font } from './core/dotlottie-player';\nimport type { EventListener, EventType } from './event-manager';\nimport { EventManager } from './event-manager';\nimport { OffscreenObserver } from './offscreen-observer';\nimport { CanvasResizeObserver } from './resize-observer';\nimport type {\n ColorSlotValue,\n Config,\n Data,\n Fit,\n GradientSlotValue,\n Layout,\n Manifest,\n Marker,\n Mode,\n RenderConfig,\n RenderSurface,\n ScalarSlotValue,\n SlotType,\n StateMachineConfig,\n TextSlotValue,\n Theme,\n Transform,\n VectorSlotValue,\n} from './types';\nimport {\n getDefaultDPR,\n getPointerPosition,\n handleOpenUrl,\n hexStringToRGBAInt,\n isDotLottie,\n isElementInViewport,\n isLottie,\n} from './utils';\nimport { createWasmLoader } from './wasm-loader';\n\nconst dotLottieWasmLoader = createWasmLoader(\n init,\n `https://cdn.jsdelivr.net/npm/${PACKAGE_NAME}@${PACKAGE_VERSION}/dist/dotlottie-player.wasm`,\n `https://unpkg.com/${PACKAGE_NAME}@${PACKAGE_VERSION}/dist/dotlottie-player.wasm`,\n);\n\n// ── Mode conversion helpers ──────────────────────────────────────────────────\n\nconst modeToCore = (mode: Mode): CoreMode => {\n switch (mode) {\n case 'reverse':\n return CoreMode.Reverse;\n\n case 'bounce':\n return CoreMode.Bounce;\n\n case 'reverse-bounce':\n return CoreMode.ReverseBounce;\n\n default:\n return CoreMode.Forward;\n }\n};\n\nconst coreToMode = (mode: CoreMode): Mode => {\n switch (mode) {\n case CoreMode.Reverse:\n return 'reverse';\n\n case CoreMode.Bounce:\n return 'bounce';\n\n case CoreMode.ReverseBounce:\n return 'reverse-bounce';\n\n default:\n return 'forward';\n }\n};\n\n// ── Fit string helpers ───────────────────────────────────────────────────────\n\nconst fitToString = (fit: string): Fit => {\n switch (fit) {\n case 'contain':\n return 'contain';\n\n case 'cover':\n return 'cover';\n\n case 'fill':\n return 'fill';\n\n case 'fit-height':\n return 'fit-height';\n\n case 'fit-width':\n return 'fit-width';\n\n case 'none':\n return 'none';\n\n default:\n return 'contain';\n }\n};\n\nexport class DotLottie {\n protected _canvas: HTMLCanvasElement | OffscreenCanvas | RenderSurface | null = null;\n\n private _pendingLoad: { data?: Data; src?: string } | null = null;\n\n protected _context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null = null;\n\n private readonly _eventManager: EventManager;\n\n private _animationFrameId: number | null = null;\n\n private readonly _frameManager: AnimationFrameManager;\n\n protected _dotLottieCore: DotLottiePlayerWasm | null = null;\n\n private _stateMachineId: string = '';\n\n private _stateMachineConfig: StateMachineConfig | null = null;\n\n private _isStateMachineRunning: boolean = false;\n\n protected _renderConfig: RenderConfig = {};\n\n private _isFrozen: boolean = false;\n\n private _backgroundColor: string | null = null;\n\n // Bound event listeners for state machine\n private _boundOnClick: ((event: MouseEvent) => void) | null = null;\n\n private _boundOnPointerUp: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerDown: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerMove: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerEnter: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerLeave: ((event: PointerEvent) => void) | null = null;\n\n private _bufferMismatchCount = 0;\n\n private _lastExpectedBufferSize = 0;\n\n private _marker: string = '';\n\n /**\n * Creates a new DotLottie player instance for rendering Lottie animations.\n * Initializes the WASM module, event system, and loads animation if src or data is provided in config.\n * @param config - Configuration object specifying animation source, playback settings, and rendering options\n */\n public constructor(config: Config) {\n this._canvas = config.canvas ?? null;\n\n this._eventManager = new EventManager();\n this._frameManager = new AnimationFrameManager();\n this._renderConfig = {\n ...config.renderConfig,\n devicePixelRatio: config.renderConfig?.devicePixelRatio || getDefaultDPR(),\n // freezeOnOffscreen is true by default to prevent unnecessary rendering when the canvas is offscreen\n freezeOnOffscreen: config.renderConfig?.freezeOnOffscreen ?? true,\n };\n\n this._initWasm()\n .then(() => {\n this._dotLottieCore = this._createCore();\n\n // Apply config via individual setters\n this._dotLottieCore.set_autoplay(config.autoplay ?? false);\n this._dotLottieCore.set_loop(config.loop ?? false);\n this._dotLottieCore.set_loop_count(config.loopCount ?? 0);\n this._dotLottieCore.set_mode(modeToCore(config.mode ?? 'forward'));\n this._dotLottieCore.set_speed(config.speed ?? 1);\n this._dotLottieCore.set_use_frame_interpolation(config.useFrameInterpolation ?? true);\n if (config.segment && config.segment.length === 2) {\n this._dotLottieCore.set_segment(config.segment[0] as number, config.segment[1] as number);\n }\n this._marker = config.marker ?? '';\n if (this._marker) {\n this._dotLottieCore.set_marker(this._marker);\n }\n this._dotLottieCore.set_layout(\n config.layout?.fit ?? 'contain',\n config.layout?.align?.[0] ?? 0.5,\n config.layout?.align?.[1] ?? 0.5,\n );\n\n this._stateMachineId = config.stateMachineId ?? '';\n this._stateMachineConfig = config.stateMachineConfig ?? null;\n\n this._onCoreCreated();\n\n this._eventManager.dispatch({ type: 'ready' });\n\n if (config.data) {\n if (this._canvas) {\n this._loadFromData(config.data);\n } else {\n this._pendingLoad = { data: config.data };\n }\n } else if (config.src) {\n if (this._canvas) {\n this._loadFromSrc(config.src);\n } else {\n this._pendingLoad = { src: config.src };\n }\n }\n\n if (config.backgroundColor) {\n this.setBackgroundColor(config.backgroundColor);\n }\n })\n .catch((error) => {\n console.error('[dotlottie-web] Initialization failed:', error);\n this._eventManager.dispatch({\n type: 'loadError',\n error: new Error(`Failed to load wasm module: ${error}`),\n });\n });\n }\n\n // ── Override hooks for subclasses ─────────────────────────────────────\n\n protected async _initWasm(): Promise<void> {\n return dotLottieWasmLoader.load();\n }\n\n protected _createCore(): DotLottiePlayerWasm {\n return new DotLottiePlayerWasm();\n }\n\n protected _onCoreCreated(): void {\n // No-op for software renderer. GPU renderers override to set GL/GPU context.\n }\n\n // ── Event draining ─────────────────────────────────────────────────────\n\n private _drainPlayerEvents(): void {\n if (!this._dotLottieCore) return;\n\n let evt: unknown;\n\n while ((evt = this._dotLottieCore.poll_event()) !== null && evt !== undefined) {\n const event = evt as { type: string; frameNo?: number; loopCount?: number };\n\n switch (event.type) {\n case 'Load':\n setTimeout(() => this._eventManager.dispatch({ type: 'load' }), 0);\n break;\n\n case 'LoadError':\n setTimeout(() => this._eventManager.dispatch({ type: 'loadError', error: new Error('failed to load') }), 0);\n break;\n\n case 'Play':\n setTimeout(() => this._eventManager.dispatch({ type: 'play' }), 0);\n break;\n\n case 'Pause':\n setTimeout(() => this._eventManager.dispatch({ type: 'pause' }), 0);\n break;\n\n case 'Stop':\n setTimeout(() => this._eventManager.dispatch({ type: 'stop' }), 0);\n break;\n\n case 'Frame':\n setTimeout(() => this._eventManager.dispatch({ type: 'frame', currentFrame: event.frameNo ?? 0 }), 0);\n break;\n\n case 'Render':\n setTimeout(() => this._eventManager.dispatch({ type: 'render', currentFrame: event.frameNo ?? 0 }), 0);\n break;\n\n case 'Loop':\n setTimeout(() => this._eventManager.dispatch({ type: 'loop', loopCount: event.loopCount ?? 0 }), 0);\n break;\n\n case 'Complete':\n setTimeout(() => this._eventManager.dispatch({ type: 'complete' }), 0);\n break;\n\n default:\n break;\n }\n }\n }\n\n private _drainSmEvents(): void {\n if (!this._dotLottieCore) return;\n\n // Drain state machine events\n let evt: unknown;\n\n while ((evt = this._dotLottieCore.sm_poll_event()) !== null && evt !== undefined) {\n const event = evt as {\n type: string;\n previousState?: string;\n newState?: string;\n state?: string;\n message?: string;\n name?: string;\n oldValue?: unknown;\n newValue?: unknown;\n };\n\n switch (event.type) {\n case 'Start':\n setTimeout(() => {\n this._isStateMachineRunning = true;\n this._eventManager.dispatch({ type: 'stateMachineStart' });\n this._startAnimationLoop();\n }, 0);\n break;\n\n case 'Stop':\n setTimeout(() => {\n this._isStateMachineRunning = false;\n this._eventManager.dispatch({ type: 'stateMachineStop' });\n if (!this._dotLottieCore?.is_playing()) {\n this._stopAnimationLoop();\n }\n }, 0);\n break;\n\n case 'CustomEvent':\n this._eventManager.dispatch({ type: 'stateMachineCustomEvent', eventName: event.message ?? '' });\n break;\n\n case 'BooleanInputChange':\n this._eventManager.dispatch({\n type: 'stateMachineBooleanInputValueChange',\n inputName: event.name ?? '',\n newValue: event.newValue as boolean,\n oldValue: event.oldValue as boolean,\n });\n break;\n\n case 'NumericInputChange':\n this._eventManager.dispatch({\n type: 'stateMachineNumericInputValueChange',\n inputName: event.name ?? '',\n newValue: event.newValue as number,\n oldValue: event.oldValue as number,\n });\n break;\n\n case 'StringInputChange':\n this._eventManager.dispatch({\n type: 'stateMachineStringInputValueChange',\n inputName: event.name ?? '',\n newValue: event.newValue as string,\n oldValue: event.oldValue as string,\n });\n break;\n\n case 'InputFired':\n this._eventManager.dispatch({ type: 'stateMachineInputFired', inputName: event.name ?? '' });\n break;\n\n case 'Transition':\n this._eventManager.dispatch({\n type: 'stateMachineTransition',\n fromState: event.previousState ?? '',\n toState: event.newState ?? '',\n });\n break;\n\n case 'StateEntered':\n this._eventManager.dispatch({ type: 'stateMachineStateEntered', state: event.state ?? '' });\n break;\n\n case 'StateExit':\n this._eventManager.dispatch({ type: 'stateMachineStateExit', state: event.state ?? '' });\n break;\n\n case 'Error':\n this._eventManager.dispatch({ type: 'stateMachineError', error: event.message ?? '' });\n break;\n\n default:\n break;\n }\n }\n\n // Drain internal events\n let internal: unknown;\n\n while ((internal = this._dotLottieCore.sm_poll_internal_event()) !== null && internal !== undefined) {\n const internalEvt = internal as { type: string; message?: string };\n\n if (internalEvt.type === 'Message') {\n const message = internalEvt.message ?? '';\n\n if (IS_BROWSER && message.startsWith('OpenUrl: ')) {\n handleOpenUrl(message);\n } else {\n this._eventManager.dispatch({ type: 'stateMachineInternalMessage', message });\n }\n }\n }\n }\n\n // ── Private methods ────────────────────────────────────────────────────\n\n private _dispatchError(message: string): void {\n console.error(message);\n this._eventManager.dispatch({ type: 'loadError', error: new Error(message) });\n }\n\n private async _fetchData(src: string): Promise<string | ArrayBuffer> {\n const response = await fetch(src);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch animation data from URL: ${src}. ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.arrayBuffer();\n\n if (isDotLottie(data)) {\n return data;\n }\n\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n return new TextDecoder().decode(data);\n }\n\n private _loadFromData(data: Data): void {\n if (this._dotLottieCore === null) return;\n\n if (!this._canvas) {\n console.warn('[dotlottie-web] Cannot load animation without canvas. Call setCanvas() first.');\n\n return;\n }\n\n const width = this._canvas.width;\n const height = this._canvas.height;\n\n let loaded = false;\n\n if (typeof data === 'string') {\n if (!isLottie(data)) {\n this._dispatchError(\n 'Invalid Lottie JSON string: The provided string does not conform to the Lottie JSON format.',\n );\n\n return;\n }\n loaded = this._dotLottieCore.load_animation(data, width, height);\n } else if (data instanceof ArrayBuffer) {\n if (!isDotLottie(data)) {\n this._dispatchError(\n 'Invalid dotLottie ArrayBuffer: The provided ArrayBuffer does not conform to the dotLottie format.',\n );\n\n return;\n }\n loaded = this._dotLottieCore.load_dotlottie_data(new Uint8Array(data), width, height);\n } else if (typeof data === 'object') {\n if (!isLottie(data as Record<string, unknown>)) {\n this._dispatchError(\n 'Invalid Lottie JSON object: The provided object does not conform to the Lottie JSON format.',\n );\n\n return;\n }\n loaded = this._dotLottieCore.load_animation(JSON.stringify(data), width, height);\n } else {\n this._dispatchError(\n `Unsupported data type for animation data. Expected:\n - string (Lottie JSON),\n - ArrayBuffer (dotLottie),\n - object (Lottie JSON).\n Received: ${typeof data}`,\n );\n\n return;\n }\n\n if (loaded) {\n if (this._renderConfig.quality !== undefined) {\n this._dotLottieCore.set_quality(this._renderConfig.quality);\n }\n\n if (IS_BROWSER) {\n this.resize();\n }\n\n // Drain any events produced by loading (Load/LoadError)\n this._drainPlayerEvents();\n\n // Re-apply marker after load since markers are only available after animation data is parsed\n if (this._marker) {\n this._dotLottieCore.set_marker(this._marker);\n }\n\n setTimeout(() => {\n // FIXME: frame is not triggered from the dotlottie-rs core\n this._eventManager.dispatch({\n type: 'frame',\n currentFrame: this.currentFrame,\n });\n }, 0);\n\n this._dotLottieCore.render();\n this._drainPlayerEvents();\n\n this._draw();\n\n if (this._stateMachineId) {\n const smLoaded = this.stateMachineLoad(this._stateMachineId);\n\n if (smLoaded) {\n const smStarted = this.stateMachineStart();\n\n if (smStarted) {\n this._startAnimationLoop();\n }\n }\n } else if (this._dotLottieCore.is_playing()) {\n this._startAnimationLoop();\n }\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is initially offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n this.freeze();\n }\n }\n\n if (this._renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n }\n }\n } else {\n // Drain any LoadError events the core may have queued\n this._drainPlayerEvents();\n }\n }\n\n private _loadFromSrc(src: string): void {\n this._fetchData(src)\n .then((data) => this._loadFromData(data))\n .catch((error) => this._dispatchError(`Failed to load animation data from URL: ${src}. ${error}`));\n }\n\n /**\n * Gets the raw pixel buffer containing the rendered animation frame.\n * Returns RGBA pixel data as a Uint8Array for advanced image processing or custom rendering.\n */\n public get buffer(): Uint8Array | null {\n if (!this._dotLottieCore) return null;\n\n return this._dotLottieCore.get_pixel_buffer();\n }\n\n /**\n * Gets the ID of the currently active animation from a multi-animation dotLottie file.\n * Returns undefined if no specific animation is active or for single-animation files.\n */\n public get activeAnimationId(): string | undefined {\n return this._dotLottieCore?.animation_id() ?? undefined;\n }\n\n /**\n * Gets the ID of the currently active theme applied to the animation.\n * Returns undefined if no theme is active. Themes modify colors and visual properties.\n */\n public get activeThemeId(): string | undefined {\n return this._dotLottieCore?.theme_id() ?? undefined;\n }\n\n /**\n * Gets the current layout configuration for positioning and scaling the animation.\n * Includes fit mode (contain, cover, fill, etc.) and alignment [x, y] values (0-1 range).\n */\n public get layout(): Layout | undefined {\n if (!this._dotLottieCore) return undefined;\n\n return {\n align: [this._dotLottieCore.layout_align_x(), this._dotLottieCore.layout_align_y()],\n fit: fitToString(this._dotLottieCore.layout_fit()),\n };\n }\n\n /**\n * Gets the currently active marker name if a marker-based segment is set.\n * Returns undefined if no marker is active. Use setMarker() to activate a named segment.\n */\n public get marker(): string | undefined {\n return this._dotLottieCore?.current_marker() ?? '';\n }\n\n /**\n * Gets the animation manifest containing metadata about animations, themes, and states.\n * Returns null if no manifest is available or if the loaded animation doesn't include one.\n */\n public get manifest(): Manifest | null {\n try {\n const manifest = this._dotLottieCore?.manifest_string();\n\n if (this._dotLottieCore === null || !manifest) return null;\n\n const manifestJson = JSON.parse(manifest);\n\n if (Object.keys(manifestJson).length === 0) return null;\n\n return manifestJson as Manifest;\n } catch (_err) {\n return null;\n }\n }\n\n /**\n * Gets the current rendering configuration.\n * Includes settings like devicePixelRatio, autoResize, and freezeOnOffscreen.\n */\n public get renderConfig(): RenderConfig {\n return this._renderConfig;\n }\n\n /**\n * Gets the currently active playback segment as [startFrame, endFrame].\n * If no segment is set, returns undefined and the full animation plays.\n */\n public get segment(): [number, number] | undefined {\n if (!this._dotLottieCore || !this._dotLottieCore.has_segment()) return undefined;\n\n return [this._dotLottieCore.segment_start(), this._dotLottieCore.segment_end()];\n }\n\n /**\n * Gets the current loop configuration.\n * Returns true if the animation is set to loop continuously.\n */\n public get loop(): boolean {\n return this._dotLottieCore?.loop_animation() ?? false;\n }\n\n /**\n * Gets the current playback mode.\n * Determines playback direction: 'forward', 'reverse', 'bounce' (forward then reverse), or 'reverse-bounce'.\n */\n public get mode(): Mode {\n if (!this._dotLottieCore) return 'forward';\n\n return coreToMode(this._dotLottieCore.mode());\n }\n\n /**\n * Indicates whether rendering is currently frozen.\n * True when freeze() has been called and the rendering loop is paused to save resources.\n */\n public get isFrozen(): boolean {\n return this._isFrozen;\n }\n\n /**\n * Indicates whether a state machine is currently active and running.\n * True after stateMachineStart() is called and until stateMachineStop() is called.\n */\n public get isStateMachineRunning(): boolean {\n return this._isStateMachineRunning;\n }\n\n /**\n * Gets the current background color.\n * Returns the background color as a string (e.g., '#FFFFFF' or 'transparent').\n */\n public get backgroundColor(): string {\n return this._backgroundColor ?? '';\n }\n\n /**\n * Gets the autoplay configuration.\n * Returns true if the animation is configured to start playing automatically when loaded.\n */\n public get autoplay(): boolean {\n return this._dotLottieCore?.autoplay() ?? false;\n }\n\n /**\n * Gets the frame interpolation setting.\n * Returns true if frame interpolation is enabled for smoother animation playback.\n */\n public get useFrameInterpolation(): boolean {\n return this._dotLottieCore?.use_frame_interpolation() ?? false;\n }\n\n /**\n * Gets the current playback speed.\n * Returns the speed multiplier (1 = normal speed, 2 = double speed, 0.5 = half speed).\n */\n public get speed(): number {\n return this._dotLottieCore?.speed() ?? 0;\n }\n\n /**\n * Indicates whether the WASM module and core player have been initialized.\n * Check this before performing operations that require the player to be ready.\n */\n public get isReady(): boolean {\n return this._dotLottieCore !== null;\n }\n\n /**\n * Indicates whether an animation has been successfully loaded and is ready for playback.\n * Check this before calling play() or other playback methods to ensure the animation is ready.\n */\n public get isLoaded(): boolean {\n return this._dotLottieCore?.is_loaded() ?? false;\n }\n\n /**\n * Indicates whether the animation is currently playing.\n * True when animation is actively playing, false when paused, stopped, or not started.\n */\n public get isPlaying(): boolean {\n return this._dotLottieCore?.is_playing() ?? false;\n }\n\n /**\n * Indicates whether the animation is currently paused.\n * True when pause() has been called and animation is not playing or stopped.\n */\n public get isPaused(): boolean {\n return this._dotLottieCore?.is_paused() ?? false;\n }\n\n /**\n * Indicates whether the animation is currently stopped.\n * True when stop() has been called or animation hasn't started yet.\n */\n public get isStopped(): boolean {\n return this._dotLottieCore?.is_stopped() ?? false;\n }\n\n /**\n * Gets the current frame number of the animation.\n * Useful for tracking playback position or implementing custom frame displays. Rounded to 2 decimal places.\n */\n public get currentFrame(): number {\n if (!this._dotLottieCore) return 0;\n\n return Math.round(this._dotLottieCore.current_frame() * 100) / 100;\n }\n\n /**\n * Gets the number of times the animation has completed a loop during the current playback.\n * Increments each time the animation completes one full cycle.\n */\n public get loopCount(): number {\n return this._dotLottieCore?.current_loop_count() ?? 0;\n }\n\n /**\n * Gets the total number of frames in the animation.\n * Use with currentFrame to calculate playback progress as a percentage.\n */\n public get totalFrames(): number {\n return this._dotLottieCore?.total_frames() ?? 0;\n }\n\n /**\n * Gets the total duration of the animation in seconds.\n * Represents the time to play from the first frame to the last at normal speed (speed = 1).\n */\n public get duration(): number {\n return this._dotLottieCore?.duration() ?? 0;\n }\n\n /**\n * Gets the duration of the currently active segment in seconds.\n * If no segment is set, returns the full animation duration.\n */\n public get segmentDuration(): number {\n return this._dotLottieCore?.segment_duration() ?? 0;\n }\n\n /**\n * Gets the canvas element used for rendering the animation.\n * Returns the HTMLCanvasElement, OffscreenCanvas, or RenderSurface set during initialization.\n */\n public get canvas(): HTMLCanvasElement | OffscreenCanvas | RenderSurface | null {\n return this._canvas;\n }\n\n /**\n * Dynamically loads a new animation, replacing the current one if any.\n * Stops current playback, cleans up resources, and loads from the provided src or data.\n * @param config - Configuration for the new animation (all Config properties except canvas)\n */\n public load(config: Omit<Config, 'canvas'>): void {\n if (this._dotLottieCore === null) return;\n\n this._stopAnimationLoop();\n\n this._cleanupCanvas();\n\n this._isFrozen = false;\n\n // Apply config via individual setters\n this._dotLottieCore.set_autoplay(config.autoplay ?? false);\n this._dotLottieCore.set_loop(config.loop ?? false);\n this._dotLottieCore.set_loop_count(config.loopCount ?? 0);\n this._dotLottieCore.set_mode(modeToCore(config.mode ?? 'forward'));\n this._dotLottieCore.set_speed(config.speed ?? 1);\n this._dotLottieCore.set_use_frame_interpolation(config.useFrameInterpolation ?? true);\n if (config.segment && config.segment.length === 2) {\n this._dotLottieCore.set_segment(config.segment[0] as number, config.segment[1] as number);\n } else {\n this._dotLottieCore.clear_segment();\n }\n this._marker = config.marker ?? '';\n if (this._marker) {\n this._dotLottieCore.set_marker(this._marker);\n } else {\n this._dotLottieCore.clear_marker();\n }\n this._dotLottieCore.set_layout(\n config.layout?.fit ?? 'contain',\n config.layout?.align?.[0] ?? 0.5,\n config.layout?.align?.[1] ?? 0.5,\n );\n\n if (config.data) {\n if (this._canvas) {\n this._loadFromData(config.data);\n } else {\n this._pendingLoad = { data: config.data };\n }\n } else if (config.src) {\n if (this._canvas) {\n this._loadFromSrc(config.src);\n } else {\n this._pendingLoad = { src: config.src };\n }\n }\n\n this.setBackgroundColor(config.backgroundColor ?? '');\n }\n\n protected _draw(): void {\n if (this._dotLottieCore === null || this._canvas === null) return;\n\n // Only try to get context if canvas has getContext method and no context exists yet\n if (\n !this._context &&\n 'getContext' in this._canvas &&\n typeof this._canvas.getContext === 'function' &&\n ((typeof HTMLCanvasElement !== 'undefined' && this._canvas instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && this._canvas instanceof OffscreenCanvas))\n ) {\n this._context = this._canvas.getContext('2d') as\n | CanvasRenderingContext2D\n | OffscreenCanvasRenderingContext2D\n | null;\n }\n\n // Only process visual output if we have a canvas with a valid context\n if (this._context) {\n const buffer = this._dotLottieCore.get_pixel_buffer();\n\n const expectedLength = this._canvas.width * this._canvas.height * BYTES_PER_PIXEL;\n\n /*\n frame buffer size mismatch can occur temporarily during resize operations when the WASM buffer allocation hasn't completed yet\n */\n if (buffer.byteLength !== expectedLength) {\n if (this._lastExpectedBufferSize === expectedLength) {\n this._bufferMismatchCount += 1;\n } else {\n this._bufferMismatchCount = 1;\n this._lastExpectedBufferSize = expectedLength;\n }\n\n if (this._bufferMismatchCount === 10) {\n console.warn(\n `[dotlottie-web] Persistent buffer size mismatch detected. ` +\n `Expected ${expectedLength} bytes for canvas ${this._canvas.width}x${this._canvas.height}, ` +\n `but got ${buffer.byteLength} bytes. ` +\n `This may indicate a WASM memory allocation issue or invalid canvas dimensions.`,\n );\n }\n\n return;\n }\n\n this._bufferMismatchCount = 0;\n this._lastExpectedBufferSize = expectedLength;\n\n let imageData = null;\n\n // get_pixel_buffer() returns a Uint8Array view into WASM memory\n const clampedBuffer = new Uint8ClampedArray(buffer.buffer as ArrayBuffer, buffer.byteOffset, buffer.byteLength);\n\n /*\n In Node.js, the ImageData constructor is not available.\n You can use createImageData function in the canvas context to create ImageData object.\n */\n if (typeof ImageData === 'undefined') {\n imageData = this._context.createImageData(this._canvas.width, this._canvas.height);\n imageData.data.set(clampedBuffer);\n } else {\n imageData = new ImageData(clampedBuffer, this._canvas.width, this._canvas.height);\n }\n\n this._context.putImageData(imageData, 0, 0);\n }\n }\n\n private _cleanupCanvas(): void {\n if (this._canvas && IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n OffscreenObserver.unobserve(this._canvas);\n CanvasResizeObserver.unobserve(this._canvas);\n this._cleanupStateMachineListeners();\n }\n }\n\n private _initializeCanvas(): void {\n this._setupRendererOnCanvas();\n\n if (this._canvas && IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this.isLoaded) {\n if (this._renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n if (!isElementInViewport(this._canvas)) {\n this.freeze();\n }\n }\n\n if (this._renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n }\n\n if (this._isStateMachineRunning) {\n this._setupStateMachineListeners();\n }\n }\n\n if (this._canvas && this._dotLottieCore && this.isLoaded) {\n const resized = this._dotLottieCore.resize(this._canvas.width, this._canvas.height);\n\n if (resized) {\n this._dotLottieCore.render();\n this._draw();\n }\n }\n }\n\n protected _setupRendererOnCanvas(): void {\n this._context = null;\n }\n\n private _stopAnimationLoop(): void {\n if (this._animationFrameId !== null) {\n this._frameManager.cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = null;\n }\n }\n\n private _startAnimationLoop(): void {\n // Start if we don't already have an active loop and either:\n // 1. The animation should be playing, OR\n // 2. The state machine is running\n if (\n this._animationFrameId === null &&\n this._dotLottieCore &&\n !this._isFrozen &&\n (this._dotLottieCore.is_playing() || this._isStateMachineRunning)\n ) {\n this._animationFrameId = this._frameManager.requestAnimationFrame(this._animationLoop.bind(this));\n }\n }\n\n private _animationLoop(): void {\n if (this._dotLottieCore === null) {\n this._stopAnimationLoop();\n\n return;\n }\n\n // Continue the loop if either the animation is playing OR the state machine is running\n if (!this._dotLottieCore.is_playing() && !this._isStateMachineRunning) {\n this._stopAnimationLoop();\n\n return;\n }\n\n try {\n const advanced = this._isStateMachineRunning ? this._dotLottieCore.sm_tick() : this._dotLottieCore.tick();\n\n if (this._isStateMachineRunning) {\n this._drainSmEvents();\n } else {\n this._drainPlayerEvents();\n }\n\n if (advanced) {\n this._draw();\n }\n\n this._animationFrameId = this._frameManager.requestAnimationFrame(this._animationLoop.bind(this));\n } catch (error) {\n console.error('Error in animation frame:', error);\n\n this._eventManager.dispatch({ type: 'renderError', error: error as unknown as Error });\n\n // destroy the instance if it's a runtime error\n if (error instanceof WebAssembly.RuntimeError) {\n this.destroy();\n }\n }\n }\n\n /**\n * Starts or resumes animation playback from the current frame.\n * Unfreezes rendering if frozen and starts the animation loop. Updates isPlaying state to true.\n */\n public play(): void {\n if (this._dotLottieCore === null || !this.isLoaded) return;\n\n this._stopAnimationLoop();\n\n const playing = this._dotLottieCore.play();\n\n this._drainPlayerEvents();\n\n // Always unfreeze and start animation loop if core is playing, regardless of play() return value\n if (playing || this._dotLottieCore.is_playing()) {\n this._isFrozen = false;\n this._startAnimationLoop();\n }\n\n /*\n Check if the canvas is offscreen and freezing is enabled\n If freezeOnOffscreen is true and the canvas is currently outside the viewport,\n we immediately freeze the animation to avoid unnecessary rendering and performance overhead.\n */\n if (\n this._canvas &&\n IS_BROWSER &&\n this._canvas instanceof HTMLCanvasElement &&\n this._renderConfig.freezeOnOffscreen &&\n !isElementInViewport(this._canvas)\n ) {\n this.freeze();\n }\n }\n\n /**\n * Pauses animation playback at the current frame.\n * Stops the animation loop while preserving the current frame position. Updates isPaused state to true.\n */\n public pause(): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.pause();\n\n this._drainPlayerEvents();\n\n this._stopAnimationLoop();\n }\n\n /**\n * Stops animation playback and resets to the start frame.\n * Halts the animation loop and returns to the beginning. Updates isStopped state to true.\n */\n public stop(): void {\n if (this._dotLottieCore === null) return;\n\n const ok = this._dotLottieCore.stop();\n\n this._drainPlayerEvents();\n\n this._stopAnimationLoop();\n\n if (ok) {\n // FIXME: frame is not triggered from the dotlottie-rs core on stop()\n this._eventManager.dispatch({ type: 'frame', currentFrame: this.currentFrame });\n // FIXME: stop() doesn't trigger render() internally\n this._dotLottieCore.render();\n this._draw();\n }\n }\n\n /**\n * Seeks to a specific frame in the animation and renders it.\n * Useful for implementing custom scrubbing controls or precise frame positioning.\n * @param frame - The target frame number to seek to\n */\n public setFrame(frame: number): void {\n if (this._dotLottieCore === null) return;\n\n const frameUpdated = this._dotLottieCore.seek(frame);\n\n if (frameUpdated) {\n const rendered = this._dotLottieCore.render();\n\n this._drainPlayerEvents();\n\n if (rendered) {\n this._draw();\n }\n }\n }\n\n /**\n * Changes the animation playback speed.\n * Values above 1 speed up playback, below 1 slow it down.\n * @param speed - Playback speed multiplier (e.g., 2 for 2x speed, 0.5 for half speed)\n */\n public setSpeed(speed: number): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_speed(speed);\n }\n\n /**\n * Changes the background color of the canvas or animation.\n * For HTMLCanvasElement, sets the CSS background. For other surfaces, renders behind the animation.\n * @param color - CSS color string (e.g., '#FFFFFF', 'rgba(0,0,0,0.5)', 'transparent')\n */\n public setBackgroundColor(color: string): void {\n if (this._dotLottieCore === null) return;\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n this._canvas.style.backgroundColor = color;\n } else {\n this._dotLottieCore.set_background_color(hexStringToRGBAInt(color));\n }\n\n this._backgroundColor = color;\n }\n\n /**\n * Enables or disables continuous looping of the animation.\n * When enabled with loopCount set to 0, animation repeats indefinitely.\n * @param loop - True to enable looping, false to play once\n */\n public setLoop(loop: boolean): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_loop(loop);\n }\n\n /**\n * Sets the number of additional times to replay the animation after the first play.\n * Requires loop to be true. A value of 0 means infinite replays; a positive value n means\n * the animation plays a total of n + 1 times (initial play + n replays).\n * @param loopCount - Number of additional replays (0 = infinite, 1 = plays twice, 2 = plays three times, etc.)\n */\n public setLoopCount(loopCount: number): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_loop_count(loopCount);\n }\n\n /**\n * Enables or disables frame interpolation for smoother playback.\n * When enabled, interpolates between frames. When disabled, shows exact frame-by-frame animation.\n * @param useFrameInterpolation - True for smooth interpolation, false for exact frames\n */\n public setUseFrameInterpolation(useFrameInterpolation: boolean): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_use_frame_interpolation(useFrameInterpolation);\n }\n\n /**\n * Subscribes to animation events like play, pause, frame, complete, etc.\n * Use this to react to animation state changes and playback progress.\n * @param type - Event type to listen for (e.g., 'play', 'frame', 'complete')\n * @param listener - Callback function invoked when the event occurs\n */\n public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n this._eventManager.addEventListener(type, listener);\n }\n\n /**\n * Unsubscribes from animation events.\n * If no listener is provided, removes all listeners for the given event type.\n * @param type - Event type to stop listening for\n * @param listener - Specific callback to remove, or undefined to remove all\n */\n public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n this._eventManager.removeEventListener(type, listener);\n }\n\n /**\n * Cleans up and destroys the player instance, releasing all resources.\n * Stops playback, removes event listeners, and frees WASM memory. Call when the player is no longer needed.\n */\n public destroy(): void {\n this._stopAnimationLoop();\n\n // Reset state machine status\n this._isStateMachineRunning = false;\n\n this._cleanupCanvas();\n\n this._dotLottieCore?.free();\n this._dotLottieCore = null;\n this._context = null;\n\n this._eventManager.dispatch({\n type: 'destroy',\n });\n\n this._eventManager.removeAllEventListeners();\n this._cleanupStateMachineListeners();\n }\n\n /**\n * Pauses the rendering loop without changing playback state.\n * Useful for reducing CPU/GPU usage when the animation is offscreen or hidden. Dispatches 'freeze' event.\n */\n public freeze(): void {\n if (this._animationFrameId === null) return;\n\n this._stopAnimationLoop();\n\n this._isFrozen = true;\n\n this._eventManager.dispatch({ type: 'freeze' });\n }\n\n /**\n * Resumes the rendering loop after being frozen.\n * Restarts frame rendering while maintaining the current playback state. Dispatches 'unfreeze' event.\n */\n public unfreeze(): void {\n if (this._animationFrameId !== null) return;\n\n this._isFrozen = false;\n\n this._eventManager.dispatch({ type: 'unfreeze' });\n\n this._startAnimationLoop();\n }\n\n /**\n * Recalculates and updates canvas dimensions based on current size.\n * Call this when the canvas container size changes to maintain proper rendering. Usually handled by autoResize.\n */\n public resize(): void {\n if (!this._dotLottieCore || !this.isLoaded || !this._canvas) return;\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n const dpr = this._renderConfig.devicePixelRatio || window.devicePixelRatio || 1;\n\n const { height: clientHeight, width: clientWidth } = this._canvas.getBoundingClientRect();\n\n if (clientHeight !== 0 && clientWidth !== 0) {\n this._canvas.width = clientWidth * dpr;\n this._canvas.height = clientHeight * dpr;\n }\n }\n\n const resized = this._dotLottieCore.resize(this._canvas.width, this._canvas.height);\n\n if (resized) {\n this._dotLottieCore.render();\n this._draw();\n }\n }\n\n /**\n * Changes the canvas element used for rendering.\n * Useful for moving the animation to a different canvas without recreating the player instance.\n * @param canvas - New HTMLCanvasElement, OffscreenCanvas, or RenderSurface to render to\n */\n public setCanvas(canvas: HTMLCanvasElement | OffscreenCanvas | RenderSurface): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!canvas || this._canvas === canvas) return;\n\n if (this._canvas) {\n this._cleanupCanvas();\n }\n\n this._canvas = canvas;\n\n this._initializeCanvas();\n\n if (this._pendingLoad) {\n const pending = this._pendingLoad;\n\n this._pendingLoad = null;\n\n if (pending.data) {\n this._loadFromData(pending.data);\n } else if (pending.src) {\n this._loadFromSrc(pending.src);\n }\n }\n }\n\n /**\n * Applies a 3x3 transformation matrix to the entire animation on the canvas.\n * Use this to translate, rotate, scale, or skew the animation rendering.\n * @param transform - 9-element array representing the transformation matrix in row-major order\n * @returns True if transformation was applied successfully, false otherwise\n */\n public setTransform(transform: Transform): boolean {\n if (!this._dotLottieCore) return false;\n\n const ok = this._dotLottieCore.set_transform(new Float32Array(transform));\n\n if (ok && this._dotLottieCore.render()) {\n this._draw();\n }\n\n return ok;\n }\n\n /**\n * Gets the 3x3 transformation matrix applied to the animation.\n * Returns a 9-element array representing affine transformations (translation, rotation, scale, skew).\n * @returns Transform array of 9 numbers, or undefined if not available\n */\n public getTransform(): Transform | undefined {\n if (!this._dotLottieCore) return undefined;\n\n const arr = this._dotLottieCore.get_transform();\n\n return Array.from(arr) as Transform;\n }\n\n /**\n * Sets a frame range to play instead of the full animation.\n * Useful for playing specific sections or creating animation sequences from subsections.\n * @param startFrame - Starting frame number (inclusive)\n * @param endFrame - Ending frame number (inclusive)\n */\n public setSegment(startFrame: number, endFrame: number): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_segment(startFrame, endFrame);\n }\n\n /**\n * Changes the playback direction mode.\n * Controls whether animation plays forward, in reverse, or alternates (bounce).\n * @param mode - Playback mode: 'forward', 'reverse', 'bounce', or 'reverse-bounce'\n */\n public setMode(mode: Mode): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_mode(modeToCore(mode));\n }\n\n /**\n * Updates rendering configuration like autoResize, devicePixelRatio, and freezeOnOffscreen.\n * Dynamically changes how the canvas behaves without reloading the animation.\n * @param config - Partial RenderConfig with properties to update\n */\n public setRenderConfig(config: RenderConfig): void {\n const { devicePixelRatio, freezeOnOffscreen, quality, ...restConfig } = config;\n\n this._renderConfig = {\n ...this._renderConfig,\n ...restConfig,\n // devicePixelRatio is a special case, it should be set to the default value if it's not provided\n devicePixelRatio: devicePixelRatio || getDefaultDPR(),\n freezeOnOffscreen: freezeOnOffscreen ?? true,\n ...(quality !== undefined && { quality }),\n };\n\n if (quality !== undefined && this._dotLottieCore) {\n this._dotLottieCore.set_quality(quality);\n }\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n } else {\n CanvasResizeObserver.unobserve(this._canvas);\n }\n\n if (this._renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is currently offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n this.freeze();\n }\n } else {\n OffscreenObserver.unobserve(this._canvas);\n // If the animation was previously frozen, we need to unfreeze it now\n // to ensure it resumes rendering when the canvas is back onscreen.\n if (this._isFrozen) {\n this.unfreeze();\n }\n }\n }\n }\n\n /**\n * Switches to a different animation within a multi-animation dotLottie file.\n * Use this to load a different animation by its ID without creating a new player instance.\n * @param animationId - ID of the animation to load (must exist in the manifest)\n */\n public loadAnimation(animationId: string): void {\n if (this._dotLottieCore === null || this._dotLottieCore.animation_id() === animationId || !this._canvas) return;\n\n const loaded = this._dotLottieCore.load_animation_from_id(animationId, this._canvas.width, this._canvas.height);\n\n if (loaded) {\n if (this._renderConfig.quality !== undefined) {\n this._dotLottieCore.set_quality(this._renderConfig.quality);\n }\n this.resize();\n this._drainPlayerEvents();\n\n this._dotLottieCore.render();\n this._draw();\n } else {\n this._dispatchError(`Failed to load animation with id: ${animationId}`);\n }\n }\n\n /**\n * Activates a named marker to play only that marked segment.\n * Markers define named sections within an animation. Use markers() to list available markers.\n * @param marker - Name of the marker to activate\n */\n public setMarker(marker: string): void {\n if (this._dotLottieCore === null) return;\n\n this._marker = marker;\n this._dotLottieCore.set_marker(marker);\n }\n\n /**\n * Gets all markers defined in the animation with their time and duration.\n * Markers represent named sections that can be played using setMarker().\n * @returns Array of marker objects with name, time, and duration properties\n */\n public markers(): Marker[] {\n const markers = this._dotLottieCore?.markers();\n\n if (markers && Array.isArray(markers)) {\n return markers as Marker[];\n }\n\n return [];\n }\n\n /**\n * Applies a theme to the animation, modifying colors and visual properties.\n * Themes are predefined in the dotLottie manifest. Returns true if theme was successfully loaded.\n * @param themeId - ID of the theme to apply (must exist in manifest)\n * @returns True if theme loaded successfully, false otherwise\n */\n public setTheme(themeId: string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const themeLoaded = this._dotLottieCore.set_theme(themeId);\n\n if (themeLoaded) {\n this._dotLottieCore.render();\n this._draw();\n }\n\n return themeLoaded;\n }\n\n /**\n * Removes the currently applied theme and restores original animation colors.\n * Use this to revert to the default appearance after applying a theme.\n * @returns True if theme was reset successfully, false otherwise\n */\n public resetTheme(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const themeReset = this._dotLottieCore.reset_theme();\n\n if (themeReset) {\n this._dotLottieCore.render();\n this._draw();\n }\n\n return themeReset;\n }\n\n /**\n * Applies a custom theme from theme data instead of manifest theme ID.\n * Useful for dynamically generated or user-created themes not in the manifest.\n *\n * @param themeData - Theme data as a JSON string or a structured Theme object\n * @returns True if theme loaded successfully, false otherwise\n */\n public setThemeData(themeData: Theme | string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const themeDataString = typeof themeData === 'string' ? themeData : JSON.stringify(themeData);\n\n const themeLoaded = this._dotLottieCore.set_theme_data(themeDataString);\n\n if (themeLoaded) {\n this._dotLottieCore.render();\n this._draw();\n }\n\n return themeLoaded;\n }\n\n /**\n * Sets multiple slot values at once for parameterized animations.\n * Slots allow runtime customization of colors, text, images, or other properties.\n * @param slots - Object mapping slot IDs to their values\n */\n public setSlots(slots: Record<string, unknown>): void {\n if (this._dotLottieCore === null) return;\n\n if (this._dotLottieCore.set_slots_str(JSON.stringify(slots))) {\n this._dotLottieCore.render();\n this._draw();\n }\n }\n\n // #region Typed Slot APIs\n\n /**\n * Check if value is an array of keyframes (has objects with 't' and 's' properties)\n */\n private _isKeyframeArray(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n value[0] !== null &&\n 't' in value[0] &&\n 's' in value[0]\n );\n }\n\n /**\n * Get all slot IDs in the animation\n * @returns Array of slot ID strings\n */\n public getSlotIds(): string[] {\n if (!this._dotLottieCore) return [];\n\n const ids = this._dotLottieCore.get_slot_ids();\n\n if (Array.isArray(ids)) {\n return ids as string[];\n }\n\n return [];\n }\n\n /**\n * Get the type of a slot\n * @param slotId - The slot ID to query\n * @returns The slot type ('color', 'gradient', 'text', 'scalar', 'vector', 'position', 'image') or undefined\n */\n public getSlotType(slotId: string): SlotType | undefined {\n if (!this._dotLottieCore) return undefined;\n\n const type = this._dotLottieCore.get_slot_type(slotId);\n\n if (!type) return undefined;\n\n return type as SlotType;\n }\n\n /**\n * Get the current value of a slot\n * @param slotId - The slot ID to query\n * @returns The parsed slot value or undefined if not found\n */\n public getSlot(slotId: string): unknown {\n if (!this._dotLottieCore) return undefined;\n\n const slotStr = this._dotLottieCore.get_slot_str(slotId);\n\n if (!slotStr) return undefined;\n\n try {\n return JSON.parse(slotStr);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get all slots as an object with slot IDs as keys\n * @returns Object containing all slots, or empty object if not loaded\n */\n public getSlots(): Record<string, unknown> {\n if (!this._dotLottieCore) return {};\n\n try {\n return JSON.parse(this._dotLottieCore.get_slots_str());\n } catch {\n return {};\n }\n }\n\n /**\n * Set a color slot value\n * @param slotId - The slot ID to set\n * @param value - Static color [r, g, b, a] or array of keyframes\n * @returns true if successful\n */\n public setColorSlot(slotId: string, value: ColorSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = this._isKeyframeArray(value);\n const slotJson = JSON.stringify({ a: isAnimated ? 1 : 0, k: value });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a scalar slot value (single number like rotation, opacity)\n * @param slotId - The slot ID to set\n * @param value - Static number or array of keyframes\n * @returns true if successful\n */\n public setScalarSlot(slotId: string, value: ScalarSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = typeof value !== 'number';\n const slotJson = JSON.stringify({ a: isAnimated ? 1 : 0, k: value });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a vector slot value (2D or 3D point for position, scale, etc.)\n * Handles both \"vector\" and \"position\" slot types\n * @param slotId - The slot ID to set\n * @param value - Static vector [x, y] or array of keyframes\n * @returns true if successful\n */\n public setVectorSlot(slotId: string, value: VectorSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = this._isKeyframeArray(value);\n const slotJson = JSON.stringify({ a: isAnimated ? 1 : 0, k: value });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a gradient slot value\n * @param slotId - The slot ID to set\n * @param value - Static gradient or array of keyframes\n * @param colorStopCount - Number of color stops\n * @returns true if successful\n */\n public setGradientSlot(slotId: string, value: GradientSlotValue, colorStopCount: number): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = this._isKeyframeArray(value);\n const slotJson = JSON.stringify({ k: { a: isAnimated ? 1 : 0, k: value }, p: colorStopCount });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a text slot value (always static - text documents don't support animation)\n * Supports partial updates - only provided properties will be changed, others inherit from existing value\n * @param slotId - The slot ID to set\n * @param value - Text document properties (partial allowed)\n * @returns true if successful\n */\n public setTextSlot(slotId: string, value: TextSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const existingStr = this._dotLottieCore.get_slot_str(slotId);\n let mergedTextDoc = value;\n\n if (existingStr) {\n const existingValue = JSON.parse(existingStr);\n\n if (existingValue && 'k' in existingValue && Array.isArray(existingValue.k)) {\n const keyframe0 = existingValue.k[0] as Record<string, unknown>;\n\n if ('s' in keyframe0 && typeof keyframe0['s'] === 'object') {\n mergedTextDoc = {\n ...(keyframe0['s'] as Record<string, unknown>),\n ...value,\n };\n }\n }\n }\n\n const slotJson = JSON.stringify({\n a: 0,\n k: [{ t: 0, s: mergedTextDoc }],\n });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Reset a slot to its original value\n * @param slotId - The slot ID to reset\n * @returns true if successful\n */\n public resetSlot(slotId: string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.reset_slot(slotId);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Clear a slot's custom value\n * @param slotId - The slot ID to clear\n * @returns true if successful\n */\n public clearSlot(slotId: string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.clear_slot(slotId);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Reset all slots to their original values\n * @returns true if successful\n */\n public resetSlots(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.reset_slots();\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Clear all slot custom values\n * @returns true if successful\n */\n public clearSlots(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.clear_slots();\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n // #endregion\n\n /**\n * Updates the layout configuration for positioning and scaling the animation.\n * Changes how the animation fits and aligns within the canvas without requiring a reload.\n * @param layout - New layout configuration with fit mode and alignment values\n */\n public setLayout(layout: Layout): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_layout(layout.fit ?? 'contain', layout.align?.[0] ?? 0.5, layout.align?.[1] ?? 0.5);\n }\n\n /**\n * Sets a custom viewport region for rendering a portion of the animation.\n * Defines a rectangular area to render, useful for implementing animation clipping or panning effects.\n * @param x - X coordinate of the viewport's top-left corner\n * @param y - Y coordinate of the viewport's top-left corner\n * @param width - Width of the viewport in pixels\n * @param height - Height of the viewport in pixels\n * @returns True if viewport was set successfully, false otherwise\n */\n public setViewport(x: number, y: number, width: number, height: number): boolean {\n if (this._dotLottieCore === null) return false;\n\n return this._dotLottieCore.set_viewport(x, y, width, height);\n }\n\n /**\n * Configures the URL for loading the WASM module.\n * Call this before creating any player instances to load the WASM from a custom CDN or local path.\n * @param url - URL pointing to the dotlottie WASM file\n */\n public static setWasmUrl(url: string): void {\n dotLottieWasmLoader.setWasmUrl(url);\n }\n\n /**\n * @experimental\n * Register a custom font for use in animations\n * @param fontName - The name of the font to register\n * @param fontSource - Either a URL string to fetch the font, or ArrayBuffer/Uint8Array of font data\n * @returns Promise<boolean> - true if registration succeeded, false otherwise\n */\n public static async registerFont(fontName: string, fontSource: string | ArrayBuffer | Uint8Array): Promise<boolean> {\n try {\n await dotLottieWasmLoader.load();\n\n let fontData: Uint8Array;\n\n if (typeof fontSource === 'string') {\n const response = await fetch(fontSource);\n\n if (!response.ok) {\n console.error(`Failed to fetch font from URL: ${fontSource}. Status: ${response.status}`);\n\n return false;\n }\n fontData = new Uint8Array(await response.arrayBuffer());\n } else if (fontSource instanceof Uint8Array) {\n fontData = fontSource;\n } else {\n fontData = new Uint8Array(fontSource);\n }\n\n const success = register_font(fontName, fontData);\n\n if (!success) {\n console.error(`Failed to register font \"${fontName}\". Font data may be invalid.`);\n }\n\n return success;\n } catch (error) {\n console.error(`Error registering font \"${fontName}\":`, error);\n\n return false;\n }\n }\n\n /**\n * @experimental\n * Animates smoothly to a specific frame over a duration using linear easing.\n * Creates a tween animation transitioning from the current frame to the target frame.\n * @param frame - Target frame number to tween to\n * @param duration - Duration of the tween animation in seconds\n * @returns True if tween started successfully, false otherwise\n */\n public tween(frame: number, duration: number): boolean {\n if (!this._dotLottieCore) return false;\n\n return this._dotLottieCore.tween_with_easing(frame, duration, 0, 0, 1, 1);\n }\n\n /**\n * @experimental\n * Start a tween animation to a specific marker\n * @param marker - The marker name to tween to\n * @param duration - Duration of the tween animation in seconds\n * @returns true if tween was started successfully\n */\n public tweenToMarker(marker: string, duration: number): boolean {\n if (!this._dotLottieCore) return false;\n\n return this._dotLottieCore.tween_to_marker(marker, duration);\n }\n\n /**\n * Gets the original dimensions of the animation as defined in the source file.\n * Returns width and height in pixels representing the animation's intrinsic size.\n * @returns Object with width and height properties in pixels\n */\n public animationSize(): { height: number; width: number } {\n const size = this._dotLottieCore?.animation_size();\n\n return {\n width: size?.[0] ?? 0,\n height: size?.[1] ?? 0,\n };\n }\n\n /**\n * Gets the Oriented Bounding Box (OBB) points of a layer by its name.\n * Returns 8 numbers representing 4 corner points (x,y) in clockwise order from top-left.\n * @param layerName - Name of the layer to get bounds for\n * @returns Array of 8 numbers representing the bounding box corners, or undefined if layer not found\n */\n public getLayerBoundingBox(layerName: string): number[] | undefined {\n const bounds = this._dotLottieCore?.get_layer_bounds(layerName);\n\n if (!bounds) return undefined;\n\n if (bounds.length !== 8) return undefined;\n\n return Array.from(bounds);\n }\n\n /**\n * Converts theme data into Lottie slot format for dynamic content replacement.\n * @param _theme - Theme data as a JSON string\n * @param _slots - Slot definitions as a JSON string\n * @returns Transformed slots data as a JSON string\n */\n public static transformThemeToLottieSlots(_theme: string, _slots: string): string {\n return '';\n }\n\n // #region State Machine\n\n /**\n * @experimental\n * Loads a state machine by its ID from the dotLottie manifest.\n * State machines enable interactive, event-driven animation behaviors.\n * @param stateMachineId - The ID of the state machine to load (must exist in manifest)\n * @returns True if the state machine was loaded successfully, false otherwise\n */\n public stateMachineLoad(stateMachineId: string): boolean {\n if (!this._dotLottieCore) return false;\n\n return this._dotLottieCore.state_machine_load_from_id(stateMachineId);\n }\n\n /**\n * @experimental\n * Load a state machine from data string\n * @param stateMachineData - The state machine data as a string\n * @returns true if the state machine was loaded successfully\n */\n public stateMachineLoadData(stateMachineData: string): boolean {\n if (!this._dotLottieCore) return false;\n\n return this._dotLottieCore.state_machine_load(stateMachineData);\n }\n\n /**\n * @experimental\n * Set the state machine config\n * @param config - The state machine config\n */\n public stateMachineSetConfig(config: StateMachineConfig | null): void {\n this._stateMachineConfig = config;\n }\n\n /**\n * @experimental\n * Start the state machine\n * @returns true if the state machine was started successfully\n */\n public stateMachineStart(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const started = this._dotLottieCore.sm_start(\n this._stateMachineConfig?.openUrlPolicy?.requireUserInteraction ?? true,\n (this._stateMachineConfig?.openUrlPolicy?.whitelist ?? []) as unknown[],\n );\n\n this._drainSmEvents();\n\n if (started) {\n this._isStateMachineRunning = true;\n this._setupStateMachineListeners();\n this._startAnimationLoop();\n }\n\n return started;\n }\n\n /**\n * @experimental\n * Stop the state machine\n * @returns true if the state machine was stopped successfully\n */\n public stateMachineStop(): boolean {\n if (!this._dotLottieCore) return false;\n\n const stopped = this._dotLottieCore.sm_stop();\n\n this._drainSmEvents();\n\n if (stopped) {\n this._isStateMachineRunning = false;\n this._cleanupStateMachineListeners();\n\n // Stop animation loop if animation is not playing\n if (!this._dotLottieCore.is_playing()) {\n this._stopAnimationLoop();\n }\n }\n\n return stopped;\n }\n\n /**\n * @experimental\n * Get the current status of the state machine\n * @returns The current status of the state machine as a string\n */\n public stateMachineGetStatus(): string {\n return this._dotLottieCore?.sm_status() ?? '';\n }\n\n /**\n * @experimental\n * Get the current state of the state machine\n * @returns The current state of the state machine as a string\n */\n public stateMachineGetCurrentState(): string {\n return this._dotLottieCore?.sm_current_state() ?? '';\n }\n\n /**\n * @experimental\n * Get the active state machine ID\n * @returns The active state machine ID as a string\n */\n public stateMachineGetActiveId(): string {\n return this._dotLottieCore?.state_machine_id() ?? '';\n }\n\n /**\n * @experimental\n * Override the current state of the state machine\n * @param state - The state to override to\n * @param immediate - Whether to immediately transition to the state\n * @returns true if the state override was successful\n */\n public stateMachineOverrideState(state: string, immediate: boolean = false): boolean {\n return this._dotLottieCore?.sm_override_current_state(state, immediate) ?? false;\n }\n\n /**\n * @experimental\n * Get a specific state machine by ID\n * @param stateMachineId - The ID of the state machine to get\n * @returns The state machine data as a string\n */\n public stateMachineGet(stateMachineId: string): string {\n return this._dotLottieCore?.get_state_machine(stateMachineId) ?? '';\n }\n\n /**\n * @experimental\n * Get the list of state machine listeners\n * @returns Array of listener names\n */\n public stateMachineGetListeners(): string[] {\n if (!this._dotLottieCore) return [];\n\n const listeners = this._dotLottieCore.sm_framework_setup();\n\n if (Array.isArray(listeners)) {\n return listeners as string[];\n }\n\n return [];\n }\n\n /**\n * @experimental\n * Set a boolean input value for the state machine\n * @param name - The name of the boolean input\n * @param value - The boolean value to set\n */\n public stateMachineSetBooleanInput(name: string, value: boolean): boolean {\n return this._dotLottieCore?.sm_set_boolean_input(name, value) ?? false;\n }\n\n /**\n * @experimental\n * Set a numeric input value for the state machine\n * @param name - The name of the numeric input\n * @param value - The numeric value to set\n */\n public stateMachineSetNumericInput(name: string, value: number): boolean {\n return this._dotLottieCore?.sm_set_numeric_input(name, value) ?? false;\n }\n\n /**\n * @experimental\n * Set a string input value for the state machine\n * @param name - The name of the string input\n * @param value - The string value to set\n */\n public stateMachineSetStringInput(name: string, value: string): boolean {\n return this._dotLottieCore?.sm_set_string_input(name, value) ?? false;\n }\n\n /**\n * @experimental\n * Get a boolean input value from the state machine\n * @param name - The name of the boolean input\n * @returns The boolean value or undefined if not found\n */\n public stateMachineGetBooleanInput(name: string): boolean | undefined {\n return this._dotLottieCore?.sm_get_boolean_input(name) ?? undefined;\n }\n\n /**\n * @experimental\n * Get a numeric input value from the state machine\n * @param name - The name of the numeric input\n * @returns The numeric value or undefined if not found\n */\n public stateMachineGetNumericInput(name: string): number | undefined {\n return this._dotLottieCore?.sm_get_numeric_input(name) ?? undefined;\n }\n\n /**\n * @experimental\n * Get a string input value from the state machine\n * @param name - The name of the string input\n * @returns The string value or undefined if not found\n */\n public stateMachineGetStringInput(name: string): string | undefined {\n return this._dotLottieCore?.sm_get_string_input(name) ?? undefined;\n }\n\n /**\n * @experimental\n * Get all the inputs of the current state machine.\n * @returns An array of input keys followed by its type at n+1.\n */\n public stateMachineGetInputs(): string[] {\n if (!this._dotLottieCore) return [];\n\n const inputs = this._dotLottieCore.sm_get_inputs();\n\n if (Array.isArray(inputs)) {\n return inputs as string[];\n }\n\n return [];\n }\n\n /**\n * @experimental\n * Fire an event in the state machine\n * @param name - The name of the event to fire\n */\n public stateMachineFireEvent(name: string): void {\n this._dotLottieCore?.sm_fire(name);\n }\n\n /**\n * @experimental\n * Post a click event to the state machine\n * @param x - The x coordinate of the click\n * @param y - The y coordinate of the click\n */\n public stateMachinePostClickEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_click(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer up event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerUpEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_up(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer down event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerDownEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_down(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer move event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerMoveEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_move(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer enter event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerEnterEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_enter(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer exit event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerExitEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_exit(x, y);\n }\n\n private _onClick(event: MouseEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostClickEvent(position.x, position.y);\n }\n }\n\n private _onPointerUp(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerUpEvent(position.x, position.y);\n }\n }\n\n private _onPointerDown(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerDownEvent(position.x, position.y);\n }\n }\n\n private _onPointerMove(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerMoveEvent(position.x, position.y);\n }\n }\n\n private _onPointerEnter(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerEnterEvent(position.x, position.y);\n }\n }\n\n private _onPointerLeave(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerExitEvent(position.x, position.y);\n }\n }\n\n private _setupStateMachineListeners(): void {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this._dotLottieCore !== null && this.isLoaded) {\n const listeners = this.stateMachineGetListeners();\n\n // Clean up any existing listeners first\n this._cleanupStateMachineListeners();\n\n if (listeners.includes('Click')) {\n this._boundOnClick = this._onClick.bind(this);\n this._canvas.addEventListener('click', this._boundOnClick);\n }\n if (listeners.includes('PointerUp')) {\n this._boundOnPointerUp = this._onPointerUp.bind(this);\n this._canvas.addEventListener('pointerup', this._boundOnPointerUp);\n }\n if (listeners.includes('PointerDown')) {\n this._boundOnPointerDown = this._onPointerDown.bind(this);\n this._canvas.addEventListener('pointerdown', this._boundOnPointerDown);\n }\n if (listeners.includes('PointerMove')) {\n this._boundOnPointerMove = this._onPointerMove.bind(this);\n this._canvas.addEventListener('pointermove', this._boundOnPointerMove);\n }\n if (listeners.includes('PointerEnter')) {\n this._boundOnPointerEnter = this._onPointerEnter.bind(this);\n this._canvas.addEventListener('pointerenter', this._boundOnPointerEnter);\n }\n if (listeners.includes('PointerExit')) {\n this._boundOnPointerLeave = this._onPointerLeave.bind(this);\n this._canvas.addEventListener('pointerleave', this._boundOnPointerLeave);\n }\n }\n }\n\n private _cleanupStateMachineListeners(): void {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._boundOnClick) {\n this._canvas.removeEventListener('click', this._boundOnClick);\n this._boundOnClick = null;\n }\n if (this._boundOnPointerUp) {\n this._canvas.removeEventListener('pointerup', this._boundOnPointerUp);\n this._boundOnPointerUp = null;\n }\n if (this._boundOnPointerDown) {\n this._canvas.removeEventListener('pointerdown', this._boundOnPointerDown);\n this._boundOnPointerDown = null;\n }\n if (this._boundOnPointerMove) {\n this._canvas.removeEventListener('pointermove', this._boundOnPointerMove);\n this._boundOnPointerMove = null;\n }\n if (this._boundOnPointerEnter) {\n this._canvas.removeEventListener('pointerenter', this._boundOnPointerEnter);\n this._boundOnPointerEnter = null;\n }\n if (this._boundOnPointerLeave) {\n this._canvas.removeEventListener('pointerleave', this._boundOnPointerLeave);\n this._boundOnPointerLeave = null;\n }\n }\n }\n // #endregion\n}\n","// resolved to a Worker constructor by plugin-inline-worker\nimport DotLottieWebWorker from './dotlottie.worker?worker&inline';\nimport type { MethodParamsMap, RpcRequest } from './types';\n\nexport class WorkerManager {\n private readonly _workers = new Map<string, Worker>();\n\n private readonly _animationWorkerMap = new Map<string, string>();\n\n public getWorker(workerId: string): Worker {\n if (!this._workers.has(workerId)) {\n this._workers.set(workerId, new DotLottieWebWorker());\n }\n\n return this._workers.get(workerId) as Worker;\n }\n\n public assignAnimationToWorker(animationId: string, workerId: string): void {\n this._animationWorkerMap.set(animationId, workerId);\n }\n\n public unassignAnimationFromWorker(animationId: string): void {\n this._animationWorkerMap.delete(animationId);\n }\n\n public sendMessage(workerId: string, message: RpcRequest<keyof MethodParamsMap>, transfer?: Transferable[]): void {\n this.getWorker(workerId).postMessage(message, transfer || []);\n }\n\n public broadcastMessage(message: RpcRequest<keyof MethodParamsMap>, transfer?: Transferable[]): void {\n this._workers.forEach((worker) => {\n worker.postMessage(message, transfer || []);\n });\n }\n\n public terminateWorker(workerId: string): void {\n const worker = this._workers.get(workerId);\n\n if (worker) {\n worker.terminate();\n this._workers.delete(workerId);\n }\n }\n}\n","import { IS_BROWSER } from '../constants';\nimport type { EventListener, EventType, FrameEvent, StateMachineInternalMessage } from '../event-manager';\nimport { EventManager } from '../event-manager';\nimport { OffscreenObserver } from '../offscreen-observer';\nimport { CanvasResizeObserver } from '../resize-observer';\nimport type {\n ColorSlotValue,\n Config,\n GradientSlotValue,\n Layout,\n Manifest,\n Marker,\n Mode,\n RenderConfig,\n ScalarSlotValue,\n SlotType,\n StateMachineConfig,\n TextSlotValue,\n Transform,\n VectorSlotValue,\n} from '../types';\nimport { getDefaultDPR, getPointerPosition, handleOpenUrl, isElementInViewport } from '../utils';\n\nimport type { MethodParamsMap, MethodResultMap, RpcRequest, RpcResponse } from './types';\nimport { WorkerManager } from './worker-manager';\n\nfunction getCanvasSize(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n devicePixelRatio: number,\n): { height: number; width: number } {\n if (typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement) {\n const { height: clientHeight, width: clientWidth } = canvas.getBoundingClientRect();\n\n if (clientHeight !== 0 && clientWidth !== 0) {\n return { width: clientWidth * devicePixelRatio, height: clientHeight * devicePixelRatio };\n }\n }\n\n return { width: canvas.width, height: canvas.height };\n}\n\nfunction generateUniqueId(): string {\n return Date.now().toString(36) + Math.random().toString(36).substr(2, 9);\n}\n\nexport interface DotLottieInstanceState {\n activeAnimationId: string | undefined;\n activeThemeId: string | undefined;\n autoplay: boolean;\n backgroundColor: string;\n currentFrame: number;\n duration: number;\n isFrozen: boolean;\n isLoaded: boolean;\n isPaused: boolean;\n isPlaying: boolean;\n isReady: boolean;\n isStopped: boolean;\n layout: Layout | undefined;\n loop: boolean;\n loopCount: number;\n manifest: Manifest | null;\n marker: string | undefined;\n markers: Marker[];\n mode: Mode;\n renderConfig: RenderConfig;\n segment: [number, number] | undefined;\n segmentDuration: number;\n speed: number;\n totalFrames: number;\n useFrameInterpolation: boolean;\n}\n\n/**\n * Worker-based DotLottie player that offloads animation processing to a Web Worker thread.\n * Use this for better performance when rendering multiple animations or to keep the main thread responsive.\n * All methods are async (return Promises) due to worker communication. Requires HTMLCanvasElement or OffscreenCanvas.\n */\nexport class DotLottieWorker {\n private static readonly _workerManager = new WorkerManager();\n\n private readonly _eventManager = new EventManager();\n\n private readonly _id: string;\n\n private readonly _worker: Worker;\n\n private _canvas: HTMLCanvasElement | OffscreenCanvas | null;\n\n private _dotLottieInstanceState: DotLottieInstanceState = {\n loopCount: 0,\n markers: [],\n autoplay: false,\n backgroundColor: '',\n currentFrame: 0,\n duration: 0,\n loop: false,\n mode: 'forward',\n segment: [0, 0],\n segmentDuration: 0,\n speed: 1,\n totalFrames: 0,\n isLoaded: false,\n isPlaying: false,\n isPaused: false,\n isStopped: true,\n isFrozen: false,\n useFrameInterpolation: false,\n renderConfig: {\n devicePixelRatio: getDefaultDPR(),\n },\n activeAnimationId: '',\n activeThemeId: '',\n layout: undefined,\n marker: '',\n isReady: false,\n manifest: null,\n };\n\n private static _wasmUrl: string = '';\n\n private _created: boolean = false;\n\n // Bound event listeners for state machine\n private _boundOnClick: ((event: MouseEvent) => void) | null = null;\n\n private _boundOnPointerUp: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerDown: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerMove: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerEnter: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerLeave: ((event: PointerEvent) => void) | null = null;\n\n private _pendingConfig: Config | null = null;\n\n /**\n * Creates a worker-based DotLottie player instance that runs in a separate thread.\n * Use workerId to share a worker across multiple animations for better resource management.\n * @param config - Configuration with optional workerId to share worker threads\n * @throws Error if canvas is not HTMLCanvasElement or OffscreenCanvas\n */\n public constructor(config: Config & { workerId?: string }) {\n if (config.canvas) {\n const isHTMLCanvas = typeof HTMLCanvasElement !== 'undefined' && config.canvas instanceof HTMLCanvasElement;\n const isOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' && config.canvas instanceof OffscreenCanvas;\n\n if (!isHTMLCanvas && !isOffscreenCanvas) {\n throw new Error('Worker-based DotLottie requires HTMLCanvasElement or OffscreenCanvas');\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this._canvas = (config.canvas as HTMLCanvasElement | OffscreenCanvas) ?? null;\n\n this._id = `dotlottie-${generateUniqueId()}`;\n const workerId = config.workerId || 'defaultWorker';\n\n // creates or gets the worker\n this._worker = DotLottieWorker._workerManager.getWorker(workerId);\n\n DotLottieWorker._workerManager.assignAnimationToWorker(this._id, workerId);\n\n if (DotLottieWorker._wasmUrl) {\n this._sendMessage('setWasmUrl', { url: DotLottieWorker._wasmUrl });\n }\n\n const fullConfig = {\n ...config,\n renderConfig: {\n ...config.renderConfig,\n devicePixelRatio: config.renderConfig?.devicePixelRatio || getDefaultDPR(),\n // freezeOnOffscreen is true by default to prevent unnecessary rendering when the canvas is offscreen\n freezeOnOffscreen: config.renderConfig?.freezeOnOffscreen ?? true,\n },\n };\n\n this._pendingConfig = fullConfig;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this._canvas) {\n this._create(fullConfig);\n this._pendingConfig = null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this._worker.addEventListener('message', this._handleWorkerEvent.bind(this));\n }\n\n private async _handleWorkerEvent(event: MessageEvent): Promise<void> {\n const rpcResponse: RpcResponse<\n | 'onComplete'\n | 'onLoad'\n | 'onDestroy'\n | 'onUnfreeze'\n | 'onFrame'\n | 'onRender'\n | 'onFreeze'\n | 'onPause'\n | 'onPlay'\n | 'onStop'\n | 'onLoadError'\n | 'onRenderError'\n | 'onReady'\n | 'onLoop'\n | 'onStateMachineStart'\n | 'onStateMachineStop'\n | 'onStateMachineTransition'\n | 'onStateMachineStateEntered'\n | 'onStateMachineStateExit'\n | 'onStateMachineCustomEvent'\n | 'onStateMachineError'\n | 'onStateMachineBooleanInputValueChange'\n // eslint-disable-next-line no-secrets/no-secrets\n | 'onStateMachineNumericInputValueChange'\n | 'onStateMachineStringInputValueChange'\n | 'onStateMachineInputFired'\n | 'onStateMachineInternalMessage'\n > = event.data;\n\n if (!rpcResponse.id) {\n if (rpcResponse.method === 'onLoad' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._dotLottieInstanceState.renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is initially offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n await this.freeze();\n }\n }\n\n if (this._dotLottieInstanceState.renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n }\n }\n }\n\n if (rpcResponse.method === 'onComplete' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onDestroy' && rpcResponse.result.instanceId === this._id) {\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onUnfreeze' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._dotLottieInstanceState.isFrozen = false;\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onFrame' && rpcResponse.result.instanceId === this._id) {\n this._dotLottieInstanceState.currentFrame = (rpcResponse.result.event as FrameEvent).currentFrame;\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onRender' && rpcResponse.result.instanceId === this._id) {\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onFreeze' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onPause' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onPlay' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStop' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onLoadError' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onRenderError' && rpcResponse.result.instanceId === this._id) {\n // Dont update the instance, since the Core crashed its no long accessible. Calling _updateDotLottieInstanceState will cause it to hang indefinitely.\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onReady' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onLoop' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStart' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._setupStateMachineListeners();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStop' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._cleanupStateMachineListeners();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineTransition' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStateEntered' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStateExit' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineCustomEvent' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineError' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (\n rpcResponse.method === 'onStateMachineBooleanInputValueChange' &&\n rpcResponse.result.instanceId === this._id\n ) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (\n // eslint-disable-next-line no-secrets/no-secrets\n rpcResponse.method === 'onStateMachineNumericInputValueChange' &&\n rpcResponse.result.instanceId === this._id\n ) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStringInputValueChange' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineInputFired' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineInternalMessage' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n\n const internalEvent = rpcResponse.result.event as StateMachineInternalMessage;\n\n if (internalEvent.message.startsWith('OpenUrl: ')) {\n handleOpenUrl(internalEvent.message);\n }\n }\n }\n }\n\n private async _create(config: Config): Promise<void> {\n if (!this._canvas) {\n return;\n }\n\n let offscreen: OffscreenCanvas;\n\n if (this._canvas instanceof HTMLCanvasElement) {\n offscreen = this._canvas.transferControlToOffscreen();\n } else {\n offscreen = this._canvas;\n }\n\n const { instanceId } = await this._sendMessage(\n 'create',\n {\n instanceId: this._id,\n config: {\n ...config,\n canvas: offscreen as unknown as HTMLCanvasElement,\n },\n ...getCanvasSize(this._canvas, config.renderConfig?.devicePixelRatio || getDefaultDPR()),\n },\n [offscreen],\n );\n\n if (instanceId !== this._id) {\n throw new Error('Instance ID mismatch');\n }\n\n this._created = true;\n\n await this._updateDotLottieInstanceState();\n }\n\n public get loopCount(): number {\n return this._dotLottieInstanceState.loopCount;\n }\n\n public get isLoaded(): boolean {\n return this._dotLottieInstanceState.isLoaded;\n }\n\n public get isPlaying(): boolean {\n return this._dotLottieInstanceState.isPlaying;\n }\n\n public get isPaused(): boolean {\n return this._dotLottieInstanceState.isPaused;\n }\n\n public get isStopped(): boolean {\n return this._dotLottieInstanceState.isStopped;\n }\n\n public get currentFrame(): number {\n return this._dotLottieInstanceState.currentFrame;\n }\n\n public get isFrozen(): boolean {\n return this._dotLottieInstanceState.isFrozen;\n }\n\n public get segmentDuration(): number {\n return this._dotLottieInstanceState.segmentDuration;\n }\n\n public get totalFrames(): number {\n return this._dotLottieInstanceState.totalFrames;\n }\n\n public get segment(): [number, number] | undefined {\n return this._dotLottieInstanceState.segment;\n }\n\n public get speed(): number {\n return this._dotLottieInstanceState.speed;\n }\n\n public get duration(): number {\n return this._dotLottieInstanceState.duration;\n }\n\n public get isReady(): boolean {\n return this._dotLottieInstanceState.isReady;\n }\n\n public get mode(): Mode {\n return this._dotLottieInstanceState.mode;\n }\n\n public get canvas(): HTMLCanvasElement | OffscreenCanvas | null {\n return this._canvas;\n }\n\n /**\n * Sets the canvas element for rendering in the worker thread.\n * Cannot change canvas after worker instance is created with a different canvas.\n * @param canvas - HTMLCanvasElement or OffscreenCanvas to render to\n * @returns Promise that resolves when canvas has been set\n * @throws Error if canvas is not HTMLCanvasElement or OffscreenCanvas\n * @throws Error if trying to change canvas after instance is already created\n */\n public async setCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): Promise<void> {\n const isHTMLCanvas = typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement;\n const isOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas;\n\n if (!isHTMLCanvas && !isOffscreenCanvas) {\n throw new Error('Worker-based DotLottie requires HTMLCanvasElement or OffscreenCanvas');\n }\n\n if (this._canvas === canvas) return;\n\n if (this._created && this._canvas !== null) {\n throw new Error('Cannot change canvas after worker instance is already created with a different canvas.');\n }\n\n this._canvas = canvas;\n\n if (!this._created && this._pendingConfig) {\n await this._create(this._pendingConfig);\n this._pendingConfig = null;\n }\n }\n\n public get autoplay(): boolean {\n return this._dotLottieInstanceState.autoplay;\n }\n\n public get backgroundColor(): string {\n return this._dotLottieInstanceState.backgroundColor;\n }\n\n public get loop(): boolean {\n return this._dotLottieInstanceState.loop;\n }\n\n public get useFrameInterpolation(): boolean {\n return this._dotLottieInstanceState.useFrameInterpolation;\n }\n\n public get renderConfig(): RenderConfig {\n return this._dotLottieInstanceState.renderConfig;\n }\n\n public get manifest(): Manifest | null {\n return this._dotLottieInstanceState.manifest;\n }\n\n public get activeAnimationId(): string | undefined {\n return this._dotLottieInstanceState.activeAnimationId;\n }\n\n public get marker(): string | undefined {\n return this._dotLottieInstanceState.marker;\n }\n\n public get activeThemeId(): string | undefined {\n return this._dotLottieInstanceState.activeThemeId;\n }\n\n public get layout(): Layout | undefined {\n return this._dotLottieInstanceState.layout;\n }\n\n /**\n * Starts or resumes animation playback in the worker thread.\n * Updates the internal playback state (e.g., isPlaying) to reflect that playback has started.\n * @returns Promise that resolves when playback has started and state has been updated\n */\n public async play(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('play', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n\n /*\n Check if the canvas is offscreen and freezing is enabled\n If freezeOnOffscreen is true and the canvas is currently outside the viewport,\n we immediately freeze the animation to avoid unnecessary rendering and performance overhead.\n */\n if (\n IS_BROWSER &&\n this._canvas instanceof HTMLCanvasElement &&\n this._dotLottieInstanceState.renderConfig.freezeOnOffscreen &&\n !isElementInViewport(this._canvas)\n ) {\n await this.freeze();\n }\n }\n\n /**\n * Pauses animation playback in the worker thread.\n * Awaits worker response before resolving. Updates isPaused state to true.\n * @returns Promise that resolves when playback has paused\n */\n public async pause(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('pause', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Stops animation playback and resets to start frame in the worker thread.\n * Awaits worker response before resolving. Updates isStopped state to true.\n * @returns Promise that resolves when playback has stopped\n */\n public async stop(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('stop', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Changes the animation playback speed in the worker thread.\n * Awaits worker response before resolving.\n * @param speed - Playback speed multiplier (e.g., 2 for 2x speed, 0.5 for half speed)\n * @returns Promise that resolves when speed has been updated\n */\n public async setSpeed(speed: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setSpeed', { instanceId: this._id, speed });\n await this._updateDotLottieInstanceState();\n }\n\n public async setMode(mode: Mode): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setMode', { instanceId: this._id, mode });\n await this._updateDotLottieInstanceState();\n }\n\n public async setFrame(frame: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setFrame', { frame, instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setSegment(start: number, end: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setSegment', { instanceId: this._id, segment: [start, end] });\n await this._updateDotLottieInstanceState();\n }\n\n public async setRenderConfig(renderConfig: RenderConfig): Promise<void> {\n if (!this._created) return;\n\n const { devicePixelRatio, freezeOnOffscreen, quality, ...restConfig } = renderConfig;\n\n await this._sendMessage('setRenderConfig', {\n instanceId: this._id,\n renderConfig: {\n ...this._dotLottieInstanceState.renderConfig,\n ...restConfig,\n // devicePixelRatio is a special case, it should be set to the default value if it's not provided\n devicePixelRatio: devicePixelRatio || getDefaultDPR(),\n freezeOnOffscreen: freezeOnOffscreen ?? true,\n ...(quality !== undefined && { quality }),\n },\n });\n\n await this._updateDotLottieInstanceState();\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._dotLottieInstanceState.renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n } else {\n CanvasResizeObserver.unobserve(this._canvas);\n }\n\n if (this._dotLottieInstanceState.renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is currently offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n await this.freeze();\n }\n } else {\n OffscreenObserver.unobserve(this._canvas);\n // If the animation was previously frozen, we need to unfreeze it now\n // to ensure it resumes rendering when the canvas is back onscreen.\n if (this._dotLottieInstanceState.isFrozen) {\n await this.unfreeze();\n }\n }\n }\n }\n\n public async setUseFrameInterpolation(useFrameInterpolation: boolean): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setUseFrameInterpolation', { instanceId: this._id, useFrameInterpolation });\n await this._updateDotLottieInstanceState();\n }\n\n public async setTheme(themeId: string): Promise<boolean> {\n if (!this._created) return false;\n\n const result = this._sendMessage('setTheme', { instanceId: this._id, themeId });\n\n await this._updateDotLottieInstanceState();\n\n return result;\n }\n\n /**\n * Dynamically loads a new animation in the worker thread, replacing the current one.\n * Awaits worker response before resolving. Stops current playback and cleans up resources.\n * @param config - Configuration for the new animation (all Config properties except canvas)\n * @returns Promise that resolves when animation has been loaded\n */\n public async load(config: Omit<Config, 'canvas'>): Promise<void> {\n if (!this._created) {\n if (this._pendingConfig) {\n this._pendingConfig = {\n ...this._pendingConfig,\n ...config,\n };\n }\n\n return;\n }\n\n await this._sendMessage('load', { config, instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setLoop(loop: boolean): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setLoop', { instanceId: this._id, loop });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Sets the number of additional times to replay the animation after the first play in the worker thread.\n * Requires loop to be true. A value of 0 means infinite replays; a positive value n means\n * the animation plays a total of n + 1 times (initial play + n replays).\n * @param loopCount - Number of additional replays (0 = infinite, 1 = plays twice, 2 = plays three times, etc.)\n * @returns Promise that resolves when loopCount has been updated\n */\n public async setLoopCount(loopCount: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setLoopCount', { instanceId: this._id, loopCount });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Recalculates and updates canvas dimensions in the worker thread.\n * Awaits worker response before resolving. Call when canvas container size changes.\n * @returns Promise that resolves when resize has completed\n */\n public async resize(): Promise<void> {\n if (!this._created || !this._canvas) return;\n\n const { height, width } = getCanvasSize(\n this._canvas,\n this._dotLottieInstanceState.renderConfig.devicePixelRatio || getDefaultDPR(),\n );\n\n await this._sendMessage('resize', { height, instanceId: this._id, width });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Cleans up and destroys the player instance in the worker thread, releasing resources.\n * Awaits worker response before resolving. Stops playback and removes event listeners.\n * @returns Promise that resolves when cleanup has completed\n */\n public async destroy(): Promise<void> {\n if (!this._created) return;\n\n this._created = false;\n\n await this._sendMessage('destroy', { instanceId: this._id });\n\n this._cleanupStateMachineListeners();\n\n DotLottieWorker._workerManager.unassignAnimationFromWorker(this._id);\n this._eventManager.removeAllEventListeners();\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n OffscreenObserver.unobserve(this._canvas);\n CanvasResizeObserver.unobserve(this._canvas);\n }\n }\n\n public async freeze(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('freeze', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async unfreeze(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('unfreeze', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setBackgroundColor(backgroundColor: string): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setBackgroundColor', { instanceId: this._id, backgroundColor });\n await this._updateDotLottieInstanceState();\n }\n\n public async loadAnimation(animationId: string): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('loadAnimation', { animationId, instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setLayout(layout: Layout): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setLayout', { instanceId: this._id, layout });\n await this._updateDotLottieInstanceState();\n }\n\n // #region Slots API\n\n public async setSlots(slots: Record<string, unknown>): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setSlots', { instanceId: this._id, slots });\n }\n\n public async getSlotIds(): Promise<string[]> {\n if (!this._created) return [];\n\n return this._sendMessage('getSlotIds', { instanceId: this._id });\n }\n\n public async getSlotType(slotId: string): Promise<SlotType | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('getSlotType', { instanceId: this._id, slotId });\n }\n\n public async getSlot(slotId: string): Promise<unknown> {\n if (!this._created) return undefined;\n\n return this._sendMessage('getSlot', { instanceId: this._id, slotId });\n }\n\n public async getSlots(): Promise<Record<string, unknown>> {\n if (!this._created) return {};\n\n return this._sendMessage('getSlots', { instanceId: this._id });\n }\n\n public async setColorSlot(slotId: string, value: ColorSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setColorSlot', { instanceId: this._id, slotId, value });\n }\n\n public async setScalarSlot(slotId: string, value: ScalarSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setScalarSlot', { instanceId: this._id, slotId, value });\n }\n\n public async setVectorSlot(slotId: string, value: VectorSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setVectorSlot', { instanceId: this._id, slotId, value });\n }\n\n public async setGradientSlot(slotId: string, value: GradientSlotValue, colorStopCount: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setGradientSlot', { instanceId: this._id, slotId, value, colorStopCount });\n }\n\n public async setTextSlot(slotId: string, value: TextSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setTextSlot', { instanceId: this._id, slotId, value });\n }\n\n public async resetSlot(slotId: string): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('resetSlot', { instanceId: this._id, slotId });\n }\n\n public async clearSlot(slotId: string): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('clearSlot', { instanceId: this._id, slotId });\n }\n\n public async resetSlots(): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('resetSlots', { instanceId: this._id });\n }\n\n public async clearSlots(): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('clearSlots', { instanceId: this._id });\n }\n\n // #endregion\n\n private async _updateDotLottieInstanceState(): Promise<void> {\n if (!this._created) return;\n\n const result = await this._sendMessage('getDotLottieInstanceState', { instanceId: this._id });\n\n this._dotLottieInstanceState = result.state;\n }\n\n public markers(): Marker[] {\n return this._dotLottieInstanceState.markers;\n }\n\n public async setMarker(marker: string): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setMarker', { instanceId: this._id, marker });\n await this._updateDotLottieInstanceState();\n }\n\n public async setThemeData(themeData: string): Promise<boolean> {\n if (!this._created) return false;\n\n const loaded = await this._sendMessage('setThemeData', { instanceId: this._id, themeData });\n\n await this._updateDotLottieInstanceState();\n\n return loaded;\n }\n\n public async setViewport(x: number, y: number, width: number, height: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setViewport', { x, y, width, height, instanceId: this._id });\n }\n\n public async animationSize(): Promise<{ height: number; width: number }> {\n if (!this._created) return { height: 0, width: 0 };\n\n return this._sendMessage('animationSize', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Start a tween animation between two frame values with custom easing\n * @param frame - Starting frame value\n * @param duration - Duration of the tween in seconds\n * @returns true if tween was started successfully\n */\n public async tween(frame: number, duration: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('tween', { instanceId: this._id, frame, duration });\n }\n\n /**\n * @experimental\n * Start a tween animation to a specific marker\n * @param marker - The marker name to tween to\n * @param duration - Duration of the tween in seconds\n * @returns true if tween was started successfully\n */\n public async tweenToMarker(marker: string, duration: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('tweenToMarker', { instanceId: this._id, marker, duration });\n }\n\n public async setTransform(transform: Transform): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setTransform', { instanceId: this._id, transform });\n }\n\n public async getTransform(): Promise<Transform | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('getTransform', { instanceId: this._id });\n }\n\n private async _sendMessage<T extends keyof MethodParamsMap>(\n method: T,\n params: MethodParamsMap[T],\n transfer?: Transferable[],\n ): Promise<MethodResultMap[T]> {\n const rpcRequest: RpcRequest<T> = {\n id: `dotlottie-request-${generateUniqueId()}`,\n method,\n params,\n };\n\n this._worker.postMessage(rpcRequest, transfer || []);\n\n return new Promise((resolve, reject) => {\n const onMessage = (event: MessageEvent): void => {\n const rpcResponse: RpcResponse<T> = event.data;\n\n // Check if the response corresponds to the request\n if (rpcResponse.id === rpcRequest.id) {\n this._worker.removeEventListener('message', onMessage);\n\n if (rpcResponse.error) {\n reject(new Error(`Failed to execute method ${method}: ${rpcResponse.error}`));\n } else {\n resolve(rpcResponse.result);\n }\n }\n };\n\n this._worker.addEventListener('message', onMessage);\n });\n }\n\n public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n this._eventManager.addEventListener(type, listener);\n }\n\n public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n this._eventManager.removeEventListener(type, listener);\n }\n\n public static setWasmUrl(url: string): void {\n DotLottieWorker._wasmUrl = url;\n }\n\n /**\n * @experimental\n *\n * Register a custom font for use in animations in worker contexts\n * @param fontName - The name of the font to register\n * @param fontSource - Either a URL string to fetch the font, or ArrayBuffer/Uint8Array of font data\n * @returns Promise<boolean> - true if registration message was sent successfully\n */\n public static async registerFont(fontName: string, fontSource: string | ArrayBuffer | Uint8Array): Promise<boolean> {\n try {\n const id = generateUniqueId();\n\n DotLottieWorker._workerManager.broadcastMessage({\n id,\n method: 'registerFont',\n params: {\n fontName,\n fontSource,\n },\n });\n\n // Note: we can't easily wait for responses from all workers in a broadcast,\n // so we return true if the broadcast was sent successfully\n return true;\n } catch (error) {\n console.error(`Error broadcasting registerFont for \"${fontName}\":`, error);\n\n return false;\n }\n }\n\n /**\n * @experimental\n * Load a state machine by ID\n * @param stateMachineId - The ID of the state machine to load\n * @returns true if the state machine was loaded successfully\n */\n public async stateMachineLoad(stateMachineId: string): Promise<boolean> {\n if (!this._created) return false;\n\n const result = await this._sendMessage('stateMachineLoad', { instanceId: this._id, stateMachineId });\n\n await this._updateDotLottieInstanceState();\n\n return result;\n }\n\n /**\n * @experimental\n * Load a state machine from data string\n * @param stateMachineData - The state machine data as a string\n * @returns true if the state machine was loaded successfully\n */\n public async stateMachineLoadData(stateMachineData: string): Promise<boolean> {\n if (!this._created) return false;\n\n const result = await this._sendMessage('stateMachineLoadData', { instanceId: this._id, stateMachineData });\n\n await this._updateDotLottieInstanceState();\n\n return result;\n }\n\n /**\n * @experimental\n * Start the state machine\n * @returns true if the state machine was started successfully\n */\n public async stateMachineStart(): Promise<boolean> {\n if (!this._created) return false;\n\n const started = await this._sendMessage('stateMachineStart', { instanceId: this._id });\n\n if (started) {\n this._setupStateMachineListeners();\n await this._updateDotLottieInstanceState();\n }\n\n return started;\n }\n\n /**\n * @experimental\n * Stop the state machine\n * @returns true if the state machine was stopped successfully\n */\n public async stateMachineStop(): Promise<boolean> {\n if (!this._created) return false;\n\n this._cleanupStateMachineListeners();\n\n return this._sendMessage('stateMachineStop', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Set a numeric input value for the state machine\n * @param name - The name of the numeric input\n * @param value - The numeric value to set\n * @returns true if the input was set successfully\n */\n public async stateMachineSetNumericInput(name: string, value: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineSetNumericInput', { instanceId: this._id, name, value });\n }\n\n /**\n * @experimental\n * Set a boolean input value for the state machine\n * @param name - The name of the boolean input\n * @param value - The boolean value to set\n * @returns true if the input was set successfully\n */\n public async stateMachineSetBooleanInput(name: string, value: boolean): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineSetBooleanInput', { instanceId: this._id, name, value });\n }\n\n /**\n * @experimental\n * Set the state machine config\n * @param config - The state machine config\n */\n public async stateMachineSetConfig(config: StateMachineConfig | null): Promise<void> {\n if (!this._created) return;\n\n this._sendMessage('stateMachineSetConfig', { instanceId: this._id, config });\n }\n\n /**\n * @experimental\n * Set a string input value for the state machine\n * @param name - The name of the string input\n * @param value - The string value to set\n * @returns true if the input was set successfully\n */\n public async stateMachineSetStringInput(name: string, value: string): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineSetStringInput', { instanceId: this._id, name, value });\n }\n\n /**\n * @experimental\n * Get a numeric input value from the state machine\n * @param name - The name of the numeric input\n * @returns The numeric value or undefined if not found\n */\n public async stateMachineGetNumericInput(name: string): Promise<number | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetNumericInput', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get a boolean input value from the state machine\n * @param name - The name of the boolean input\n * @returns The boolean value or undefined if not found\n */\n public async stateMachineGetBooleanInput(name: string): Promise<boolean | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetBooleanInput', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get a string input value from the state machine\n * @param name - The name of the string input\n * @returns The string value or undefined if not found\n */\n public async stateMachineGetStringInput(name: string): Promise<string | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetStringInput', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get all inputs\n * @returns All input keys, followed by their type\n */\n public async stateMachineGetInputs(): Promise<string[] | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetInputs', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Fire an event in the state machine\n * @param name - The name of the event to fire\n */\n public async stateMachineFireEvent(name: string): Promise<void> {\n if (!this._created) return;\n\n this._sendMessage('stateMachineFireEvent', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get the current status of the state machine\n * @returns The current status of the state machine as a string\n */\n public async stateMachineGetStatus(): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGetStatus', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Get the current state of the state machine\n * @returns The current state of the state machine as a string\n */\n public async stateMachineGetCurrentState(): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGetCurrentState', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Get the active state machine ID\n * @returns The active state machine ID as a string\n */\n public async stateMachineGetActiveId(): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGetActiveId', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Override the current state of the state machine\n * @param state - The state to override to\n * @param immediate - Whether to immediately transition to the state\n * @returns true if the state override was successful\n */\n public async stateMachineOverrideState(state: string, immediate: boolean = false): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineOverrideState', { instanceId: this._id, state, immediate });\n }\n\n /**\n * @experimental\n * Get a specific state machine by ID\n * @param stateMachineId - The ID of the state machine to get\n * @returns The state machine data as a string\n */\n public async stateMachineGet(stateMachineId: string): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGet', { instanceId: this._id, stateMachineId });\n }\n\n /**\n * @experimental\n * Get the list of state machine listeners\n * @returns Array of listener names\n */\n public async stateMachineGetListeners(): Promise<string[]> {\n if (!this._created) return [];\n\n return this._sendMessage('stateMachineGetListeners', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Post a click event to the state machine\n * @param x - The x coordinate of the click\n * @param y - The y coordinate of the click\n * @returns The event result or undefined\n */\n public async stateMachinePostClickEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostClickEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer up event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerUpEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerUpEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer down event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerDownEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerDownEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer move event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerMoveEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerMoveEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer enter event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerEnterEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerEnterEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer exit event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerExitEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerExitEvent', { instanceId: this._id, x, y });\n }\n\n private _onClick(event: MouseEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostClickEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerUp(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerUpEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerDown(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerDownEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerMove(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerMoveEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerEnter(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerEnterEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerLeave(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerExitEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private async _setupStateMachineListeners(): Promise<void> {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this.isLoaded) {\n const listeners = await this._sendMessage('stateMachineGetListeners', { instanceId: this._id });\n\n if (listeners.length === 0) {\n return;\n }\n\n // Clean up any existing listeners first\n this._cleanupStateMachineListeners();\n\n if (listeners.includes('Click')) {\n this._boundOnClick = this._onClick.bind(this);\n this._canvas.addEventListener('click', this._boundOnClick);\n }\n\n if (listeners.includes('PointerUp')) {\n this._boundOnPointerUp = this._onPointerUp.bind(this);\n this._canvas.addEventListener('pointerup', this._boundOnPointerUp);\n }\n\n if (listeners.includes('PointerDown')) {\n this._boundOnPointerDown = this._onPointerDown.bind(this);\n this._canvas.addEventListener('pointerdown', this._boundOnPointerDown);\n }\n\n if (listeners.includes('PointerMove')) {\n this._boundOnPointerMove = this._onPointerMove.bind(this);\n this._canvas.addEventListener('pointermove', this._boundOnPointerMove);\n }\n\n if (listeners.includes('PointerEnter')) {\n this._boundOnPointerEnter = this._onPointerEnter.bind(this);\n this._canvas.addEventListener('pointerenter', this._boundOnPointerEnter);\n }\n\n if (listeners.includes('PointerExit')) {\n this._boundOnPointerLeave = this._onPointerLeave.bind(this);\n this._canvas.addEventListener('pointerleave', this._boundOnPointerLeave);\n }\n }\n }\n\n private _cleanupStateMachineListeners(): void {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._boundOnClick) {\n this._canvas.removeEventListener('click', this._boundOnClick);\n this._boundOnClick = null;\n }\n if (this._boundOnPointerUp) {\n this._canvas.removeEventListener('pointerup', this._boundOnPointerUp);\n this._boundOnPointerUp = null;\n }\n if (this._boundOnPointerDown) {\n this._canvas.removeEventListener('pointerdown', this._boundOnPointerDown);\n this._boundOnPointerDown = null;\n }\n if (this._boundOnPointerMove) {\n this._canvas.removeEventListener('pointermove', this._boundOnPointerMove);\n this._boundOnPointerMove = null;\n }\n if (this._boundOnPointerEnter) {\n this._canvas.removeEventListener('pointerenter', this._boundOnPointerEnter);\n this._boundOnPointerEnter = null;\n }\n if (this._boundOnPointerLeave) {\n this._canvas.removeEventListener('pointerleave', this._boundOnPointerLeave);\n this._boundOnPointerLeave = null;\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["init","CoreMode","DotLottieWebWorker"],"sources":["../src/animation-frame-manager.ts","../src/constants.ts","../src/core/dotlottie-player.js","../src/event-manager.ts","../src/offscreen-observer.ts","../src/resize-observer.ts","../src/utils.ts","../src/wasm-loader.ts","../src/dotlottie.ts","../src/worker/worker-manager.ts","../src/worker/dotlottie.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\ninterface AnimationFrameStrategy {\n cancelAnimationFrame(id: number): void;\n requestAnimationFrame(callback: (time: number) => void): number;\n}\n\nclass WebAnimationFrameStrategy implements AnimationFrameStrategy {\n public requestAnimationFrame(callback: (time: number) => void): number {\n return requestAnimationFrame(callback);\n }\n\n public cancelAnimationFrame(id: number): void {\n cancelAnimationFrame(id);\n }\n}\n\nclass NodeAnimationFrameStrategy implements AnimationFrameStrategy {\n private _lastHandleId: number = 0;\n\n private _lastImmediate: NodeJS.Immediate | null = null;\n\n public requestAnimationFrame(callback: (time: number) => void): number {\n if (this._lastHandleId >= Number.MAX_SAFE_INTEGER) {\n this._lastHandleId = 0;\n }\n\n this._lastHandleId += 1;\n\n this._lastImmediate = setImmediate(() => {\n callback(Date.now());\n });\n\n return this._lastHandleId;\n }\n\n public cancelAnimationFrame(_id: number): void {\n if (this._lastImmediate) {\n clearImmediate(this._lastImmediate);\n }\n }\n}\n\nexport class AnimationFrameManager {\n private readonly _strategy: AnimationFrameStrategy;\n\n public constructor() {\n this._strategy =\n typeof requestAnimationFrame === 'function' ? new WebAnimationFrameStrategy() : new NodeAnimationFrameStrategy();\n }\n\n public requestAnimationFrame(callback: (time: number) => void): number {\n return this._strategy.requestAnimationFrame(callback);\n }\n\n public cancelAnimationFrame(id: number): void {\n this._strategy.cancelAnimationFrame(id);\n }\n}\n","export const IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nexport const MS_TO_SEC_FACTOR = 1000;\nexport const DEFAULT_BG_COLOR = '#00000000';\nexport const ZIP_SIGNATURE = new Uint8Array([0x50, 0x4b, 0x03, 0x04]);\nexport const LOTTIE_JSON_MANDATORY_FIELDS = ['v', 'ip', 'op', 'layers', 'fr', 'w', 'h'];\n\n// These values are replace during the build process with the package version and name\nexport const PACKAGE_VERSION = __PACKAGE_VERSION__;\nexport const PACKAGE_NAME = __PACKAGE_NAME__;\n\nexport const DEFAULT_DPR_FACTOR = 0.75;\n\nexport const BYTES_PER_PIXEL = 4;\n","let wasm;\n\nconst cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );\n\nif (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); };\n\nlet cachedUint8ArrayMemory0 = null;\n\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc_command_export();\n wasm.__wbindgen_export_3.set(idx, obj);\n return idx;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store_command_export(idx);\n }\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedDataViewMemory0 = null;\n\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nlet cachedFloat32ArrayMemory0 = null;\n\nfunction getFloat32ArrayMemory0() {\n if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {\n cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);\n }\n return cachedFloat32ArrayMemory0;\n}\n\nfunction passArrayF32ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 4, 4) >>> 0;\n getFloat32ArrayMemory0().set(arg, ptr / 4);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passArrayJsValueToWasm0(array, malloc) {\n const ptr = malloc(array.length * 4, 4) >>> 0;\n for (let i = 0; i < array.length; i++) {\n const add = addToExternrefTable0(array[i]);\n getDataViewMemory0().setUint32(ptr + 4 * i, add, true);\n }\n WASM_VECTOR_LEN = array.length;\n return ptr;\n}\n/**\n * Register a font globally (static, not tied to a player instance).\n * @param {string} name\n * @param {Uint8Array} data\n * @returns {boolean}\n */\nexport function register_font(name, data) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray8ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.register_font(ptr0, len0, ptr1, len1);\n return ret !== 0;\n}\n\n/**\n * Playback direction / bounce mode.\n * @enum {0 | 1 | 2 | 3}\n */\nexport const Mode = Object.freeze({\n Forward: 0, \"0\": \"Forward\",\n Reverse: 1, \"1\": \"Reverse\",\n Bounce: 2, \"2\": \"Bounce\",\n ReverseBounce: 3, \"3\": \"ReverseBounce\",\n});\n\nconst DotLottiePlayerWasmFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_dotlottieplayerwasm_free(ptr >>> 0, 1));\n\nexport class DotLottiePlayerWasm {\n\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n DotLottiePlayerWasmFinalization.unregister(this);\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_dotlottieplayerwasm_free(ptr, 0);\n }\n /**\n * @param {string} id\n * @returns {boolean}\n */\n clear_slot(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_clear_slot(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_playing() {\n const ret = wasm.dotlottieplayerwasm_is_playing(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_stopped() {\n const ret = wasm.dotlottieplayerwasm_is_stopped(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {string}\n */\n layout_fit() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_layout_fit(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * @returns {number}\n */\n loop_count() {\n const ret = wasm.dotlottieplayerwasm_loop_count(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Poll the next player event. Returns `null` if the queue is empty,\n * otherwise a plain JS object with a `type` string field and optional\n * payload fields (`frameNo`, `loopCount`).\n * @returns {any}\n */\n poll_event() {\n const ret = wasm.dotlottieplayerwasm_poll_event(this.__wbg_ptr);\n return ret;\n }\n /**\n * Reset a slot to its default value from the animation.\n * @param {string} id\n * @returns {boolean}\n */\n reset_slot(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_reset_slot(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Set the layout.\n *\n * `fit` is one of `\"contain\"`, `\"fill\"`, `\"cover\"`, `\"fit-width\"`,\n * `\"fit-height\"`, `\"none\"`. `align_x` / `align_y` are in [0, 1].\n * @param {string} fit\n * @param {number} align_x\n * @param {number} align_y\n * @returns {boolean}\n */\n set_layout(fit, align_x, align_y) {\n const ptr0 = passStringToWasm0(fit, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_layout(this.__wbg_ptr, ptr0, len0, align_x, align_y);\n return ret !== 0;\n }\n /**\n * @param {string} name\n */\n set_marker(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n wasm.dotlottieplayerwasm_set_marker(this.__wbg_ptr, ptr0, len0);\n }\n /**\n * @returns {boolean}\n */\n clear_slots() {\n const ret = wasm.dotlottieplayerwasm_clear_slots(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n has_segment() {\n const ret = wasm.dotlottieplayerwasm_has_segment(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_complete() {\n const ret = wasm.dotlottieplayerwasm_is_complete(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_tweening() {\n const ret = wasm.dotlottieplayerwasm_is_tweening(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Reset all slots to their default values from the animation.\n * @returns {boolean}\n */\n reset_slots() {\n const ret = wasm.dotlottieplayerwasm_reset_slots(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n reset_theme() {\n const ret = wasm.dotlottieplayerwasm_reset_theme(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n segment_end() {\n const ret = wasm.dotlottieplayerwasm_segment_end(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {number} quality\n * @returns {boolean}\n */\n set_quality(quality) {\n const ret = wasm.dotlottieplayerwasm_set_quality(this.__wbg_ptr, quality);\n return ret !== 0;\n }\n /**\n * @param {number} start\n * @param {number} end\n * @returns {boolean}\n */\n set_segment(start, end) {\n const ret = wasm.dotlottieplayerwasm_set_segment(this.__wbg_ptr, start, end);\n return ret !== 0;\n }\n /**\n * @param {string} name\n * @returns {boolean}\n */\n static unload_font(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_unload_font(ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {string | undefined}\n */\n animation_id() {\n const ret = wasm.dotlottieplayerwasm_animation_id(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n clear_marker() {\n wasm.dotlottieplayerwasm_clear_marker(this.__wbg_ptr);\n }\n emit_on_loop() {\n wasm.dotlottieplayerwasm_emit_on_loop(this.__wbg_ptr);\n }\n /**\n * Get all slot IDs as a JS array.\n * @returns {any}\n */\n get_slot_ids() {\n const ret = wasm.dotlottieplayerwasm_get_slot_ids(this.__wbg_ptr);\n return ret;\n }\n /**\n * Get the JSON value of a single slot by ID, or `undefined` if not found.\n * @param {string} id\n * @returns {string | undefined}\n */\n get_slot_str(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_slot_str(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * Returns an array of marker name strings.\n * @returns {any}\n */\n marker_names() {\n const ret = wasm.dotlottieplayerwasm_marker_names(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {boolean} v\n */\n set_autoplay(v) {\n wasm.dotlottieplayerwasm_set_autoplay(this.__wbg_ptr, v);\n }\n /**\n * Set a single slot by ID from a JSON value string.\n * @param {string} id\n * @param {string} json\n * @returns {boolean}\n */\n set_slot_str(id, json) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(json, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_slot_str(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @returns {boolean}\n */\n set_viewport(x, y, w, h) {\n const ret = wasm.dotlottieplayerwasm_set_viewport(this.__wbg_ptr, x, y, w, h);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n total_frames() {\n const ret = wasm.dotlottieplayerwasm_total_frames(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {boolean}\n */\n clear_segment() {\n const ret = wasm.dotlottieplayerwasm_clear_segment(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n current_frame() {\n const ret = wasm.dotlottieplayerwasm_current_frame(this.__wbg_ptr);\n return ret;\n }\n /**\n * Get the type string of a slot, or `undefined` if not found.\n * @param {string} id\n * @returns {string | undefined}\n */\n get_slot_type(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_slot_type(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * Get all slots as a JSON object string.\n * @returns {string}\n */\n get_slots_str() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_get_slots_str(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Returns the current affine transform as a flat `Float32Array`.\n * @returns {Float32Array}\n */\n get_transform() {\n const ret = wasm.dotlottieplayerwasm_get_transform(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n request_frame() {\n const ret = wasm.dotlottieplayerwasm_request_frame(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n segment_start() {\n const ret = wasm.dotlottieplayerwasm_segment_start(this.__wbg_ptr);\n return ret;\n }\n /**\n * Set multiple slots at once from a JSON string.\n * @param {string} json\n * @returns {boolean}\n */\n set_slots_str(json) {\n const ptr0 = passStringToWasm0(json, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_slots_str(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @param {string} id\n * @param {string} text\n * @returns {boolean}\n */\n set_text_slot(id, text) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(text, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_text_slot(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * @param {Float32Array} data\n * @returns {boolean}\n */\n set_transform(data) {\n const ptr0 = passArrayF32ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_transform(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Returns all state machine inputs as a JS array of strings.\n * @returns {any}\n */\n sm_get_inputs() {\n const ret = wasm.dotlottieplayerwasm_sm_get_inputs(this.__wbg_ptr);\n return ret;\n }\n /**\n * Poll the next state machine event. Returns `null` if the queue is empty,\n * otherwise a JS object with a `type` field and optional payload.\n * @returns {any}\n */\n sm_poll_event() {\n const ret = wasm.dotlottieplayerwasm_sm_poll_event(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_click(x, y) {\n wasm.dotlottieplayerwasm_sm_post_click(this.__wbg_ptr, x, y);\n }\n /**\n * `[width, height]` of the animation in its native coordinate space.\n * @returns {Float32Array}\n */\n animation_size() {\n const ret = wasm.dotlottieplayerwasm_animation_size(this.__wbg_ptr);\n return ret;\n }\n /**\n * Name of the currently active marker, or `undefined` if none.\n * @returns {string | undefined}\n */\n current_marker() {\n const ret = wasm.dotlottieplayerwasm_current_marker(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @returns {number}\n */\n layout_align_x() {\n const ret = wasm.dotlottieplayerwasm_layout_align_x(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n layout_align_y() {\n const ret = wasm.dotlottieplayerwasm_layout_align_y(this.__wbg_ptr);\n return ret;\n }\n /**\n * Load a Lottie JSON animation. Sets up the rendering target automatically.\n * @param {string} data\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n load_animation(data, width, height) {\n const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_animation(this.__wbg_ptr, ptr0, len0, width, height);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n loop_animation() {\n const ret = wasm.dotlottieplayerwasm_loop_animation(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Set a color slot (`r`, `g`, `b` in [0, 1]).\n * @param {string} id\n * @param {number} r\n * @param {number} g\n * @param {number} b\n * @returns {boolean}\n */\n set_color_slot(id, r, g, b) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_color_slot(this.__wbg_ptr, ptr0, len0, r, g, b);\n return ret !== 0;\n }\n /**\n * @param {number} n\n */\n set_loop_count(n) {\n wasm.dotlottieplayerwasm_set_loop_count(this.__wbg_ptr, n);\n }\n /**\n * @param {string} data\n * @returns {boolean}\n */\n set_theme_data(data) {\n const ptr0 = passStringToWasm0(data, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_theme_data(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @param {string} key\n */\n sm_reset_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n wasm.dotlottieplayerwasm_sm_reset_input(this.__wbg_ptr, ptr0, len0);\n }\n /**\n * Returns the animation manifest as a JSON string, or empty string if unavailable.\n * @returns {string}\n */\n manifest_string() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_manifest_string(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * @param {string} id\n * @param {number} value\n * @returns {boolean}\n */\n set_scalar_slot(id, value) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_scalar_slot(this.__wbg_ptr, ptr0, len0, value);\n return ret !== 0;\n }\n /**\n * @param {string} id\n * @param {number} x\n * @param {number} y\n * @returns {boolean}\n */\n set_vector_slot(id, x, y) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_vector_slot(this.__wbg_ptr, ptr0, len0, x, y);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n background_color() {\n const ret = wasm.dotlottieplayerwasm_background_color(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Returns `[x, y, width, height]` of the layer's bounding box.\n * @param {string} layer_name\n * @returns {Float32Array}\n */\n get_layer_bounds(layer_name) {\n const ptr0 = passStringToWasm0(layer_name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_layer_bounds(this.__wbg_ptr, ptr0, len0);\n return ret;\n }\n /**\n * Zero-copy `Uint8Array` view into WASM linear memory.\n *\n * **Use the returned array immediately.** Do not store the reference across\n * any call that may reallocate the buffer (e.g. `resize` / `load_animation`\n * with different dimensions).\n * @returns {Uint8Array}\n */\n get_pixel_buffer() {\n const ret = wasm.dotlottieplayerwasm_get_pixel_buffer(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n segment_duration() {\n const ret = wasm.dotlottieplayerwasm_segment_duration(this.__wbg_ptr);\n return ret;\n }\n /**\n * Get the name of the current state.\n * @returns {string}\n */\n sm_current_state() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_sm_current_state(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Returns the ID of the currently active state machine, or `undefined`.\n * @returns {string | undefined}\n */\n state_machine_id() {\n const ret = wasm.dotlottieplayerwasm_state_machine_id(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Returns the raw JSON definition of a state machine by ID, or `undefined`.\n * @param {string} id\n * @returns {string | undefined}\n */\n get_state_machine(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_get_state_machine(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * @param {string} id\n * @param {number} x\n * @param {number} y\n * @returns {boolean}\n */\n set_position_slot(id, x, y) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_position_slot(this.__wbg_ptr, ptr0, len0, x, y);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n current_loop_count() {\n const ret = wasm.dotlottieplayerwasm_current_loop_count(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Returns the framework setup listeners as a JS array of strings.\n * @returns {any}\n */\n sm_framework_setup() {\n const ret = wasm.dotlottieplayerwasm_sm_framework_setup(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_up(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_up(this.__wbg_ptr, x, y);\n }\n /**\n * Load a state machine from a JSON definition string. Returns `true` on\n * success. The engine is kept alive inside the player and interacted\n * with via the `sm_*` methods.\n * @param {string} definition\n * @returns {boolean}\n */\n state_machine_load(definition) {\n const ptr0 = passStringToWasm0(definition, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_state_machine_load(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Load a .lottie archive from raw bytes.\n * @param {Uint8Array} data\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n load_dotlottie_data(data, width, height) {\n const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_dotlottie_data(this.__wbg_ptr, ptr0, len0, width, height);\n return ret !== 0;\n }\n /**\n * @param {string} key\n * @returns {string | undefined}\n */\n sm_get_string_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_get_string_input(this.__wbg_ptr, ptr0, len0);\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * @param {string} key\n * @param {string} value\n * @returns {boolean}\n */\n sm_set_string_input(key, value) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(value, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_set_string_input(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * Set background colour (`0xAARRGGBB`).\n * @param {number} color\n * @returns {boolean}\n */\n set_background_color(color) {\n const ret = wasm.dotlottieplayerwasm_set_background_color(this.__wbg_ptr, color);\n return ret !== 0;\n }\n /**\n * @param {string} key\n * @returns {boolean | undefined}\n */\n sm_get_boolean_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_get_boolean_input(this.__wbg_ptr, ptr0, len0);\n return ret === 0xFFFFFF ? undefined : ret !== 0;\n }\n /**\n * @param {string} key\n * @returns {number | undefined}\n */\n sm_get_numeric_input(key) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_get_numeric_input(this.__wbg_ptr, ptr0, len0);\n return ret === 0x100000001 ? undefined : ret;\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_down(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_down(this.__wbg_ptr, x, y);\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_exit(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_exit(this.__wbg_ptr, x, y);\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_move(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_move(this.__wbg_ptr, x, y);\n }\n /**\n * @param {string} key\n * @param {boolean} value\n * @returns {boolean}\n */\n sm_set_boolean_input(key, value) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_set_boolean_input(this.__wbg_ptr, ptr0, len0, value);\n return ret !== 0;\n }\n /**\n * @param {string} key\n * @param {number} value\n * @returns {boolean}\n */\n sm_set_numeric_input(key, value) {\n const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_set_numeric_input(this.__wbg_ptr, ptr0, len0, value);\n return ret !== 0;\n }\n /**\n * Unload the active state machine.\n */\n state_machine_unload() {\n wasm.dotlottieplayerwasm_state_machine_unload(this.__wbg_ptr);\n }\n /**\n * @param {number} x\n * @param {number} y\n */\n sm_post_pointer_enter(x, y) {\n wasm.dotlottieplayerwasm_sm_post_pointer_enter(this.__wbg_ptr, x, y);\n }\n /**\n * Clear the background colour (transparent).\n * @returns {boolean}\n */\n clear_background_color() {\n const ret = wasm.dotlottieplayerwasm_clear_background_color(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Load an animation from an already-loaded .lottie archive by its ID.\n * @param {string} id\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n load_animation_from_id(id, width, height) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_animation_from_id(this.__wbg_ptr, ptr0, len0, width, height);\n return ret !== 0;\n }\n /**\n * Poll the next state machine internal event. Returns `null` if the\n * queue is empty, otherwise a JS object `{ type: \"Message\", message }`.\n * @returns {any}\n */\n sm_poll_internal_event() {\n const ret = wasm.dotlottieplayerwasm_sm_poll_internal_event(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {boolean}\n */\n use_frame_interpolation() {\n const ret = wasm.dotlottieplayerwasm_use_frame_interpolation(this.__wbg_ptr);\n return ret !== 0;\n }\n reset_current_loop_count() {\n wasm.dotlottieplayerwasm_reset_current_loop_count(this.__wbg_ptr);\n }\n /**\n * Override the current state.\n * @param {string} state\n * @param {boolean} immediate\n * @returns {boolean}\n */\n sm_override_current_state(state, immediate) {\n const ptr0 = passStringToWasm0(state, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_override_current_state(this.__wbg_ptr, ptr0, len0, immediate);\n return ret !== 0;\n }\n /**\n * Load a state machine from a .lottie archive by state-machine ID.\n * @param {string} id\n * @returns {boolean}\n */\n state_machine_load_from_id(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_state_machine_load_from_id(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @param {boolean} v\n */\n set_use_frame_interpolation(v) {\n wasm.dotlottieplayerwasm_set_use_frame_interpolation(this.__wbg_ptr, v);\n }\n constructor() {\n const ret = wasm.dotlottieplayerwasm_new();\n this.__wbg_ptr = ret >>> 0;\n DotLottiePlayerWasmFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @returns {Mode}\n */\n mode() {\n const ret = wasm.dotlottieplayerwasm_mode(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {boolean}\n */\n play() {\n const ret = wasm.dotlottieplayerwasm_play(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @param {number} no\n * @returns {boolean}\n */\n seek(no) {\n const ret = wasm.dotlottieplayerwasm_seek(this.__wbg_ptr, no);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n stop() {\n const ret = wasm.dotlottieplayerwasm_stop(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Advance time and render. Call once per `requestAnimationFrame`.\n * @returns {boolean}\n */\n tick() {\n const ret = wasm.dotlottieplayerwasm_tick(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Clear the canvas to the background colour.\n */\n clear() {\n wasm.dotlottieplayerwasm_clear(this.__wbg_ptr);\n }\n /**\n * @returns {boolean}\n */\n pause() {\n const ret = wasm.dotlottieplayerwasm_pause(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n speed() {\n const ret = wasm.dotlottieplayerwasm_speed(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n width() {\n const ret = wasm.dotlottieplayerwasm_width(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * @returns {number}\n */\n height() {\n const ret = wasm.dotlottieplayerwasm_height(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Render the current frame without advancing time.\n * @returns {boolean}\n */\n render() {\n const ret = wasm.dotlottieplayerwasm_render(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Resize the canvas. For the SW renderer this also resizes the pixel buffer.\n * @param {number} width\n * @param {number} height\n * @returns {boolean}\n */\n resize(width, height) {\n const ret = wasm.dotlottieplayerwasm_resize(this.__wbg_ptr, width, height);\n return ret !== 0;\n }\n /**\n * Returns an array of `{ name, time, duration }` objects.\n * @returns {any}\n */\n markers() {\n const ret = wasm.dotlottieplayerwasm_markers(this.__wbg_ptr);\n return ret;\n }\n /**\n * Fire a named event into the state machine.\n * @param {string} event\n * @returns {boolean}\n */\n sm_fire(event) {\n const ptr0 = passStringToWasm0(event, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_fire(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Stop the state machine.\n * @returns {boolean}\n */\n sm_stop() {\n const ret = wasm.dotlottieplayerwasm_sm_stop(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Advance the state machine by one tick. Returns `false` if no state machine\n * is loaded, otherwise `true` (even if the machine is stopped or errored).\n * @returns {boolean}\n */\n sm_tick() {\n const ret = wasm.dotlottieplayerwasm_sm_tick(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n autoplay() {\n const ret = wasm.dotlottieplayerwasm_autoplay(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {number}\n */\n duration() {\n const ret = wasm.dotlottieplayerwasm_duration(this.__wbg_ptr);\n return ret;\n }\n /**\n * @param {boolean} v\n */\n set_loop(v) {\n wasm.dotlottieplayerwasm_set_loop(this.__wbg_ptr, v);\n }\n /**\n * @param {Mode} mode\n */\n set_mode(mode) {\n wasm.dotlottieplayerwasm_set_mode(this.__wbg_ptr, mode);\n }\n /**\n * Start the state machine with an open-URL policy.\n * @param {boolean} require_user_interaction\n * @param {any[]} whitelist\n * @returns {boolean}\n */\n sm_start(require_user_interaction, whitelist) {\n const ptr0 = passArrayJsValueToWasm0(whitelist, wasm.__wbindgen_malloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_sm_start(this.__wbg_ptr, require_user_interaction, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {string | undefined}\n */\n theme_id() {\n const ret = wasm.dotlottieplayerwasm_theme_id(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {string} layer_name\n * @returns {boolean}\n */\n intersect(x, y, layer_name) {\n const ptr0 = passStringToWasm0(layer_name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_intersect(this.__wbg_ptr, x, y, ptr0, len0);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_loaded() {\n const ret = wasm.dotlottieplayerwasm_is_loaded(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n is_paused() {\n const ret = wasm.dotlottieplayerwasm_is_paused(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @param {string} name\n * @param {Uint8Array} data\n * @returns {boolean}\n */\n load_font(name, data) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray8ToWasm0(data, wasm.__wbindgen_malloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_load_font(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n return ret !== 0;\n }\n /**\n * @param {number} no\n * @returns {boolean}\n */\n set_frame(no) {\n const ret = wasm.dotlottieplayerwasm_set_frame(this.__wbg_ptr, no);\n return ret !== 0;\n }\n /**\n * @param {number} speed\n */\n set_speed(speed) {\n wasm.dotlottieplayerwasm_set_speed(this.__wbg_ptr, speed);\n }\n /**\n * @param {string} id\n * @returns {boolean}\n */\n set_theme(id) {\n const ptr0 = passStringToWasm0(id, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.dotlottieplayerwasm_set_theme(this.__wbg_ptr, ptr0, len0);\n return ret !== 0;\n }\n /**\n * Get the current status of the state machine as a string.\n * @returns {string}\n */\n sm_status() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.dotlottieplayerwasm_sm_status(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free_command_export(deferred1_0, deferred1_1, 1);\n }\n }\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg_buffer_609cc3eee51ed158 = function(arg0) {\n const ret = arg0.buffer;\n return ret;\n };\n imports.wbg.__wbg_error_7534b8e9a36f1ab4 = function(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free_command_export(deferred0_0, deferred0_1, 1);\n }\n };\n imports.wbg.__wbg_new_405e22f390576ce2 = function() {\n const ret = new Object();\n return ret;\n };\n imports.wbg.__wbg_new_78feb108b6472713 = function() {\n const ret = new Array();\n return ret;\n };\n imports.wbg.__wbg_new_8a6f238a6ece86ea = function() {\n const ret = new Error();\n return ret;\n };\n imports.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a = function(arg0, arg1, arg2) {\n const ret = new Uint8Array(arg0, arg1 >>> 0, arg2 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_newwithlength_5a5efe313cfd59f1 = function(arg0) {\n const ret = new Float32Array(arg0 >>> 0);\n return ret;\n };\n imports.wbg.__wbg_now_807e54c39636c349 = function() {\n const ret = Date.now();\n return ret;\n };\n imports.wbg.__wbg_push_737cfc8c1432c2c6 = function(arg0, arg1) {\n const ret = arg0.push(arg1);\n return ret;\n };\n imports.wbg.__wbg_set_bb8cecf6a62b9f46 = function() { return handleError(function (arg0, arg1, arg2) {\n const ret = Reflect.set(arg0, arg1, arg2);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_setindex_4e73afdcd9bb95cd = function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n };\n imports.wbg.__wbg_stack_0ed75d68575b0f3c = function(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_export_3;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n ;\n };\n imports.wbg.__wbindgen_memory = function() {\n const ret = wasm.memory;\n return ret;\n };\n imports.wbg.__wbindgen_number_new = function(arg0) {\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_string_get = function(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbindgen_string_new = function(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n imports.wbg.__wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {\n\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedDataViewMemory0 = null;\n cachedFloat32ArrayMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n throw new Error('WASM module URL must be provided via DotLottieWasmLoader or setWasmUrl().');\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","/**\n * Represents the different types of events that can be dispatched.\n */\nexport type EventType =\n | 'complete'\n | 'frame'\n | 'load'\n | 'loadError'\n | 'renderError'\n | 'loop'\n | 'pause'\n | 'play'\n | 'stop'\n | 'destroy'\n | 'freeze'\n | 'unfreeze'\n | 'render'\n | 'ready'\n | 'stateMachineStart'\n | 'stateMachineStop'\n | 'stateMachineTransition'\n | 'stateMachineStateEntered'\n | 'stateMachineStateExit'\n | 'stateMachineCustomEvent'\n | 'stateMachineError'\n | 'stateMachineBooleanInputValueChange'\n | 'stateMachineNumericInputValueChange'\n | 'stateMachineStringInputValueChange'\n | 'stateMachineInputFired'\n | 'stateMachineInternalMessage';\n\n/**\n * Maps an event type string to its respective event interface.\n */\ntype EventByType<T extends EventType> = Extract<Event, { type: T }>;\n\n/**\n * Base interface for all events.\n */\nexport interface BaseEvent {\n type: EventType;\n}\n\nexport interface RenderEvent extends BaseEvent {\n currentFrame: number;\n type: 'render';\n}\n\nexport interface FreezeEvent extends BaseEvent {\n type: 'freeze';\n}\n\nexport interface UnfreezeEvent extends BaseEvent {\n type: 'unfreeze';\n}\n\n/*\n * Event fired when a destroy action occurs.\n */\nexport interface DestroyEvent extends BaseEvent {\n type: 'destroy';\n}\n\n/**\n * Event fired when a loop action occurs.\n */\nexport interface LoopEvent extends BaseEvent {\n loopCount: number;\n type: 'loop';\n}\n\n/**\n * Event fired during frame changes.\n */\nexport interface FrameEvent extends BaseEvent {\n currentFrame: number;\n type: 'frame';\n}\n\n/**\n * Event fired when a load action occurs.\n */\nexport interface LoadEvent extends BaseEvent {\n type: 'load';\n}\n\n/**\n * Event fired when a loading error occurs.\n */\nexport interface LoadErrorEvent extends BaseEvent {\n error: Error;\n type: 'loadError';\n}\n\n/**\n * Event fired when a loading error occurs.\n */\nexport interface RenderErrorEvent extends BaseEvent {\n error: Error;\n type: 'renderError';\n}\n\n/**\n * Event fired when a completion action occurs.\n */\nexport interface CompleteEvent extends BaseEvent {\n type: 'complete';\n}\n\n/**\n * Event fired when a pause action occurs.\n */\nexport interface PauseEvent extends BaseEvent {\n type: 'pause';\n}\n\n/**\n * Event fired when a play action occurs.\n */\nexport interface PlayEvent extends BaseEvent {\n type: 'play';\n}\n\n/**\n * Event fired when a stop action occurs.\n */\nexport interface StopEvent extends BaseEvent {\n type: 'stop';\n}\n\n/**\n * Event fired when a WASM module is initialized and ready.\n */\nexport interface ReadyEvent extends BaseEvent {\n type: 'ready';\n}\n\nexport interface StateMachineStartEvent extends BaseEvent {\n type: 'stateMachineStart';\n}\n\nexport interface StateMachineStopEvent extends BaseEvent {\n type: 'stateMachineStop';\n}\n\nexport interface StateMachineTransitionEvent extends BaseEvent {\n fromState: string;\n toState: string;\n type: 'stateMachineTransition';\n}\n\nexport interface StateMachineStateEnteredEvent extends BaseEvent {\n state: string;\n type: 'stateMachineStateEntered';\n}\n\nexport interface StateMachineStateExitEvent extends BaseEvent {\n state: string;\n type: 'stateMachineStateExit';\n}\n\nexport interface StateMachineCustomEvent extends BaseEvent {\n eventName: string;\n type: 'stateMachineCustomEvent';\n}\n\nexport interface StateMachineErrorEvent extends BaseEvent {\n error: string;\n type: 'stateMachineError';\n}\n\nexport interface StateMachineBooleanInputValueChangeEvent extends BaseEvent {\n inputName: string;\n newValue: boolean;\n oldValue: boolean;\n type: 'stateMachineBooleanInputValueChange';\n}\n\nexport interface StateMachineNumericInputValueChangeEvent extends BaseEvent {\n inputName: string;\n newValue: number;\n oldValue: number;\n type: 'stateMachineNumericInputValueChange';\n}\n\nexport interface StateMachineStringInputValueChangeEvent extends BaseEvent {\n inputName: string;\n newValue: string;\n oldValue: string;\n type: 'stateMachineStringInputValueChange';\n}\n\nexport interface StateMachineInputFiredEvent extends BaseEvent {\n inputName: string;\n type: 'stateMachineInputFired';\n}\n\nexport interface StateMachineInternalMessage extends BaseEvent {\n message: string;\n type: 'stateMachineInternalMessage';\n}\n\n/**\n * Type representing all possible event types.\n */\nexport type Event =\n | LoopEvent\n | FrameEvent\n | LoadEvent\n | LoadErrorEvent\n | RenderErrorEvent\n | CompleteEvent\n | PauseEvent\n | PlayEvent\n | StopEvent\n | DestroyEvent\n | FreezeEvent\n | UnfreezeEvent\n | RenderEvent\n | ReadyEvent\n | StateMachineStartEvent\n | StateMachineStopEvent\n | StateMachineTransitionEvent\n | StateMachineStateEnteredEvent\n | StateMachineStateExitEvent\n | StateMachineCustomEvent\n | StateMachineErrorEvent\n | StateMachineBooleanInputValueChangeEvent\n | StateMachineNumericInputValueChangeEvent\n | StateMachineStringInputValueChangeEvent\n | StateMachineInputFiredEvent\n | StateMachineInternalMessage;\n\nexport type EventListener<T extends EventType> = (event: EventByType<T>) => void;\n\n/**\n * Manages registration and dispatching of event listeners.\n */\nexport class EventManager {\n private readonly _eventListeners: Map<EventType, Set<EventListener<EventType>>> = new Map();\n\n public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n let listeners = this._eventListeners.get(type);\n\n if (!listeners) {\n listeners = new Set<EventListener<EventType>>();\n this._eventListeners.set(type, listeners);\n }\n\n listeners.add(listener as unknown as EventListener<EventType>);\n }\n\n public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n const listeners = this._eventListeners.get(type);\n\n if (!listeners) return;\n\n if (listener) {\n listeners.delete(listener as unknown as EventListener<EventType>);\n\n if (listeners.size === 0) {\n this._eventListeners.delete(type);\n }\n } else {\n this._eventListeners.delete(type);\n }\n }\n\n public dispatch<T extends EventType>(event: EventByType<T>): void {\n const listeners = this._eventListeners.get(event.type);\n\n listeners?.forEach((listener) => listener(event));\n }\n\n public removeAllEventListeners(): void {\n this._eventListeners.clear();\n }\n}\n","import type { DotLottie } from './dotlottie';\nimport type { DotLottieWorker } from './worker/dotlottie';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class OffscreenObserver {\n private static _observer: IntersectionObserver | null = null;\n\n private static readonly _observedCanvases = new Map<HTMLCanvasElement, DotLottie | DotLottieWorker>();\n\n private static _initializeObserver(): void {\n if (OffscreenObserver._observer) return;\n\n const intersectionObserverCallback = (entries: IntersectionObserverEntry[]): void => {\n entries.forEach((entry) => {\n const instance = OffscreenObserver._observedCanvases.get(entry.target as HTMLCanvasElement);\n\n if (instance) {\n if (entry.isIntersecting) {\n instance.unfreeze();\n } else {\n instance.freeze();\n }\n }\n });\n };\n\n OffscreenObserver._observer = new IntersectionObserver(intersectionObserverCallback, {\n threshold: 0,\n });\n }\n\n public static observe(canvas: HTMLCanvasElement, dotLottieInstance: DotLottie | DotLottieWorker): void {\n OffscreenObserver._initializeObserver();\n\n if (OffscreenObserver._observedCanvases.has(canvas)) return;\n\n OffscreenObserver._observedCanvases.set(canvas, dotLottieInstance);\n OffscreenObserver._observer?.observe(canvas);\n }\n\n public static unobserve(canvas: HTMLCanvasElement): void {\n OffscreenObserver._observer?.unobserve(canvas);\n OffscreenObserver._observedCanvases.delete(canvas);\n\n if (OffscreenObserver._observedCanvases.size === 0) {\n OffscreenObserver._observer?.disconnect();\n OffscreenObserver._observer = null;\n }\n }\n}\n","import type { DotLottie } from './dotlottie';\nimport type { DotLottieWorker } from './worker/dotlottie';\n\nexport const RESIZE_DEBOUNCE_TIME = 100;\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class CanvasResizeObserver {\n private static _observer: ResizeObserver | null = null;\n\n private static readonly _observedCanvases = new Map<HTMLCanvasElement, [DotLottie | DotLottieWorker, number]>();\n\n private static _initializeObserver(): void {\n if (CanvasResizeObserver._observer) return;\n\n const resizeHandler = (entries: ResizeObserverEntry[]): void => {\n entries.forEach((entry) => {\n const element = CanvasResizeObserver._observedCanvases.get(entry.target as HTMLCanvasElement);\n\n if (!element) return;\n\n const [dotLottieInstance, timeout] = element;\n\n clearTimeout(timeout);\n\n const newTimeout = setTimeout(() => {\n dotLottieInstance.resize();\n }, RESIZE_DEBOUNCE_TIME) as unknown as number;\n\n CanvasResizeObserver._observedCanvases.set(entry.target as HTMLCanvasElement, [dotLottieInstance, newTimeout]);\n });\n };\n\n CanvasResizeObserver._observer = new ResizeObserver(resizeHandler);\n }\n\n public static observe(canvas: HTMLCanvasElement, dotLottieInstance: DotLottie | DotLottieWorker): void {\n CanvasResizeObserver._initializeObserver();\n\n if (CanvasResizeObserver._observedCanvases.has(canvas)) return;\n\n CanvasResizeObserver._observedCanvases.set(canvas, [dotLottieInstance, 0]);\n CanvasResizeObserver._observer?.observe(canvas);\n }\n\n public static unobserve(canvas: HTMLCanvasElement): void {\n const element = CanvasResizeObserver._observedCanvases.get(canvas);\n\n if (element) {\n const timeoutId = element[1];\n\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n CanvasResizeObserver._observer?.unobserve(canvas);\n CanvasResizeObserver._observedCanvases.delete(canvas);\n\n if (!CanvasResizeObserver._observedCanvases.size && CanvasResizeObserver._observer) {\n CanvasResizeObserver._observer.disconnect();\n CanvasResizeObserver._observer = null;\n }\n }\n}\n","import { DEFAULT_DPR_FACTOR, IS_BROWSER, LOTTIE_JSON_MANDATORY_FIELDS, ZIP_SIGNATURE } from './constants';\n\n/**\n * Validates if a string is a valid hex color in #RRGGBB or #RRGGBBAA format.\n * @param color - Color string to validate\n * @returns True if valid hex color format, false otherwise\n */\nexport function isHexColor(color: string): boolean {\n return /^#([\\da-f]{6}|[\\da-f]{8})$/iu.test(color);\n}\n\n/**\n * Converts a hex color string to an RGBA integer for WASM consumption.\n * Adds full opacity (alpha = 255, 0xFF in hex) if alpha channel is not specified.\n * @param colorHex - Hex color string (e.g., '#FFFFFF' or '#FFFFFFFF')\n * @returns RGBA value as a 32-bit integer, or 0 if invalid hex color\n */\nexport function hexStringToRGBAInt(colorHex: string): number {\n if (!isHexColor(colorHex)) {\n return 0;\n }\n\n let hex = colorHex.replace('#', '');\n\n // Add alpha if it's not included\n hex = hex.length === 6 ? `${hex}ff` : hex;\n\n return parseInt(hex, 16);\n}\n\n/**\n * Detects if file data is a .lottie file by checking for ZIP signature.\n * dotLottie files are ZIP archives containing Lottie JSON and metadata.\n * @param fileData - Raw file data as ArrayBuffer\n * @returns True if data starts with ZIP signature, false otherwise\n */\nexport function isDotLottie(fileData: ArrayBuffer): boolean {\n if (fileData.byteLength < 4) {\n return false;\n }\n\n const fileSignature = new Uint8Array(fileData.slice(0, ZIP_SIGNATURE.byteLength));\n\n for (let i = 0; i < ZIP_SIGNATURE.length; i += 1) {\n if (ZIP_SIGNATURE[i] !== fileSignature[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns whether the given object looks like a valid Lottie JSON structure.\n */\nexport function isLottieJSON(json: Record<string, unknown>): boolean {\n return LOTTIE_JSON_MANDATORY_FIELDS.every((field) => Object.hasOwn(json, field));\n}\n\n/**\n * Detects if data is a valid Lottie animation by checking for required JSON fields.\n * Accepts either a JSON string or a parsed object.\n * @param fileData - Lottie data as JSON string or parsed object\n * @returns True if data contains required Lottie fields, false otherwise\n */\nexport function isLottie(fileData: string | Record<string, unknown>): boolean {\n if (typeof fileData === 'string') {\n try {\n return isLottieJSON(JSON.parse(fileData));\n } catch (_e) {\n return false;\n }\n } else {\n return isLottieJSON(fileData);\n }\n}\n\n/**\n * Calculates the default device pixel ratio with a scaling factor.\n * Applies a factor to balance quality and performance on high-DPI displays.\n * @returns Adjusted device pixel ratio value\n */\nexport function getDefaultDPR(): number {\n const dpr = IS_BROWSER ? window.devicePixelRatio : 1;\n\n return 1 + (dpr - 1) * DEFAULT_DPR_FACTOR;\n}\n\n/**\n * Checks if an HTML element is currently visible within the browser viewport.\n * Used to determine when to freeze/unfreeze rendering for performance optimization.\n * @param element - HTMLElement to check visibility for\n * @returns True if element is at least partially visible in viewport, false otherwise\n */\nexport function isElementInViewport(element: HTMLElement): boolean {\n const rect = element.getBoundingClientRect();\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n const viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n\n return !(rect.bottom < 0 || rect.top > viewportHeight || rect.right < 0 || rect.left > viewportWidth);\n}\n\n/**\n * Calculate pointer position relative to the canvas coordinate system\n * @param event - The mouse or pointer event (target should be the canvas element)\n * @returns The calculated position or null if calculation fails or target is not a valid canvas\n */\nexport function getPointerPosition(event: MouseEvent | PointerEvent): { x: number; y: number } | null {\n const canvas = event.target;\n\n if (canvas instanceof HTMLCanvasElement) {\n const rect = canvas.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0 || canvas.width === 0 || canvas.height === 0) {\n return null;\n }\n\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n\n const x = (event.clientX - rect.left) * scaleX;\n const y = (event.clientY - rect.top) * scaleY;\n\n if (!Number.isFinite(x) || !Number.isFinite(y) || Number.isNaN(x) || Number.isNaN(y)) {\n return null;\n }\n\n return { x, y };\n }\n\n // Return null if target is not an HTMLCanvasElement or calculation fails\n return null;\n}\n\nexport function handleOpenUrl(message: string): void {\n const content = message.replace('OpenUrl: ', '');\n\n const targetSeparatorIndex = content.indexOf(' | Target: ');\n let urlToOpen: string;\n let target: string;\n\n if (targetSeparatorIndex === -1) {\n // Format: \"OpenUrl: {url}\"\n urlToOpen = content;\n target = '_blank';\n } else {\n // Format: \"OpenUrl: {url} | Target: {target}\"\n urlToOpen = content.substring(0, targetSeparatorIndex);\n target = content.substring(targetSeparatorIndex + ' | Target: '.length);\n }\n\n window.open(urlToOpen, target);\n}\n","type WasmInitFn = (options: { module_or_path: string }) => Promise<unknown>;\n\nexport function createWasmLoader(initFn: WasmInitFn, primaryUrl: string, backupUrl: string) {\n let initPromise: Promise<void> | null = null;\n let wasmUrl = primaryUrl;\n\n return {\n load(): Promise<void> {\n if (!initPromise) {\n initPromise = initFn({ module_or_path: wasmUrl })\n .then(() => undefined)\n .catch(async (initialError: unknown): Promise<void> => {\n console.warn(`Primary WASM load failed from ${wasmUrl}: ${(initialError as Error).message}`);\n console.warn(`Attempting to load WASM from backup URL: ${backupUrl}`);\n\n try {\n await initFn({ module_or_path: backupUrl });\n } catch (backupError) {\n console.error(`Primary WASM URL failed: ${(initialError as Error).message}`);\n console.error(`Backup WASM URL failed: ${(backupError as Error).message}`);\n initPromise = null;\n throw new Error('WASM loading failed from all sources.');\n }\n });\n }\n\n return initPromise;\n },\n\n setWasmUrl(url: string): void {\n if (url === wasmUrl) return;\n\n wasmUrl = url;\n initPromise = null;\n },\n };\n}\n","/* eslint-disable no-warning-comments */\nimport { AnimationFrameManager } from './animation-frame-manager';\nimport { BYTES_PER_PIXEL, IS_BROWSER, PACKAGE_NAME, PACKAGE_VERSION } from './constants';\nimport init, { Mode as CoreMode, DotLottiePlayerWasm, register_font } from './core/dotlottie-player';\nimport type { EventListener, EventType } from './event-manager';\nimport { EventManager } from './event-manager';\nimport { OffscreenObserver } from './offscreen-observer';\nimport { CanvasResizeObserver } from './resize-observer';\nimport type {\n ColorSlotValue,\n Config,\n Data,\n Fit,\n GradientSlotValue,\n Layout,\n Manifest,\n Marker,\n Mode,\n RenderConfig,\n RenderSurface,\n ScalarSlotValue,\n SlotType,\n StateMachineConfig,\n TextSlotValue,\n Theme,\n Transform,\n VectorSlotValue,\n} from './types';\nimport {\n getDefaultDPR,\n getPointerPosition,\n handleOpenUrl,\n hexStringToRGBAInt,\n isDotLottie,\n isElementInViewport,\n isLottie,\n} from './utils';\nimport { createWasmLoader } from './wasm-loader';\n\nconst dotLottieWasmLoader = createWasmLoader(\n init,\n `https://cdn.jsdelivr.net/npm/${PACKAGE_NAME}@${PACKAGE_VERSION}/dist/dotlottie-player.wasm`,\n `https://unpkg.com/${PACKAGE_NAME}@${PACKAGE_VERSION}/dist/dotlottie-player.wasm`,\n);\n\n// ── Mode conversion helpers ──────────────────────────────────────────────────\n\nconst modeToCore = (mode: Mode): CoreMode => {\n switch (mode) {\n case 'reverse':\n return CoreMode.Reverse;\n\n case 'bounce':\n return CoreMode.Bounce;\n\n case 'reverse-bounce':\n return CoreMode.ReverseBounce;\n\n default:\n return CoreMode.Forward;\n }\n};\n\nconst coreToMode = (mode: CoreMode): Mode => {\n switch (mode) {\n case CoreMode.Reverse:\n return 'reverse';\n\n case CoreMode.Bounce:\n return 'bounce';\n\n case CoreMode.ReverseBounce:\n return 'reverse-bounce';\n\n default:\n return 'forward';\n }\n};\n\n// ── Fit string helpers ───────────────────────────────────────────────────────\n\nconst fitToString = (fit: string): Fit => {\n switch (fit) {\n case 'contain':\n return 'contain';\n\n case 'cover':\n return 'cover';\n\n case 'fill':\n return 'fill';\n\n case 'fit-height':\n return 'fit-height';\n\n case 'fit-width':\n return 'fit-width';\n\n case 'none':\n return 'none';\n\n default:\n return 'contain';\n }\n};\n\nexport class DotLottie {\n protected _canvas: HTMLCanvasElement | OffscreenCanvas | RenderSurface | null = null;\n\n private _pendingLoad: { data?: Data; src?: string } | null = null;\n\n protected _context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null = null;\n\n private readonly _eventManager: EventManager;\n\n private _animationFrameId: number | null = null;\n\n private readonly _frameManager: AnimationFrameManager;\n\n protected _dotLottieCore: DotLottiePlayerWasm | null = null;\n\n private _stateMachineId: string = '';\n\n private _stateMachineConfig: StateMachineConfig | null = null;\n\n private _isStateMachineRunning: boolean = false;\n\n protected _renderConfig: RenderConfig = {};\n\n private _isFrozen: boolean = false;\n\n private _backgroundColor: string | null = null;\n\n // Bound event listeners for state machine\n private _boundOnClick: ((event: MouseEvent) => void) | null = null;\n\n private _boundOnPointerUp: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerDown: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerMove: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerEnter: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerLeave: ((event: PointerEvent) => void) | null = null;\n\n private _bufferMismatchCount = 0;\n\n private _lastExpectedBufferSize = 0;\n\n private _marker: string = '';\n\n /**\n * Creates a new DotLottie player instance for rendering Lottie animations.\n * Initializes the WASM module, event system, and loads animation if src or data is provided in config.\n * @param config - Configuration object specifying animation source, playback settings, and rendering options\n */\n public constructor(config: Config) {\n this._canvas = config.canvas ?? null;\n\n this._eventManager = new EventManager();\n this._frameManager = new AnimationFrameManager();\n this._renderConfig = {\n ...config.renderConfig,\n devicePixelRatio: config.renderConfig?.devicePixelRatio || getDefaultDPR(),\n // freezeOnOffscreen is true by default to prevent unnecessary rendering when the canvas is offscreen\n freezeOnOffscreen: config.renderConfig?.freezeOnOffscreen ?? true,\n };\n\n this._initWasm()\n .then(() => {\n this._dotLottieCore = this._createCore();\n\n // Apply config via individual setters\n this._dotLottieCore.set_autoplay(config.autoplay ?? false);\n this._dotLottieCore.set_loop(config.loop ?? false);\n this._dotLottieCore.set_loop_count(config.loopCount ?? 0);\n this._dotLottieCore.set_mode(modeToCore(config.mode ?? 'forward'));\n this._dotLottieCore.set_speed(config.speed ?? 1);\n this._dotLottieCore.set_use_frame_interpolation(config.useFrameInterpolation ?? true);\n if (config.segment && config.segment.length === 2) {\n this._dotLottieCore.set_segment(config.segment[0] as number, config.segment[1] as number);\n }\n this._marker = config.marker ?? '';\n if (this._marker) {\n this._dotLottieCore.set_marker(this._marker);\n }\n this._dotLottieCore.set_layout(\n config.layout?.fit ?? 'contain',\n config.layout?.align?.[0] ?? 0.5,\n config.layout?.align?.[1] ?? 0.5,\n );\n\n this._stateMachineId = config.stateMachineId ?? '';\n this._stateMachineConfig = config.stateMachineConfig ?? null;\n\n this._onCoreCreated();\n\n this._eventManager.dispatch({ type: 'ready' });\n\n if (config.data) {\n if (this._canvas) {\n this._loadFromData(config.data);\n } else {\n this._pendingLoad = { data: config.data };\n }\n } else if (config.src) {\n if (this._canvas) {\n this._loadFromSrc(config.src);\n } else {\n this._pendingLoad = { src: config.src };\n }\n }\n\n if (config.backgroundColor) {\n this.setBackgroundColor(config.backgroundColor);\n }\n })\n .catch((error) => {\n console.error('[dotlottie-web] Initialization failed:', error);\n this._eventManager.dispatch({\n type: 'loadError',\n error: new Error(`Failed to load wasm module: ${error}`),\n });\n });\n }\n\n // ── Override hooks for subclasses ─────────────────────────────────────\n\n protected async _initWasm(): Promise<void> {\n return dotLottieWasmLoader.load();\n }\n\n protected _createCore(): DotLottiePlayerWasm {\n return new DotLottiePlayerWasm();\n }\n\n protected _onCoreCreated(): void {\n // No-op for software renderer. GPU renderers override to set GL/GPU context.\n }\n\n // ── Event draining ─────────────────────────────────────────────────────\n\n private _drainPlayerEvents(): void {\n if (!this._dotLottieCore) return;\n\n let evt: unknown;\n\n while ((evt = this._dotLottieCore.poll_event()) !== null && evt !== undefined) {\n const event = evt as { type: string; frameNo?: number; loopCount?: number };\n\n switch (event.type) {\n case 'Load':\n setTimeout(() => this._eventManager.dispatch({ type: 'load' }), 0);\n break;\n\n case 'LoadError':\n setTimeout(() => this._eventManager.dispatch({ type: 'loadError', error: new Error('failed to load') }), 0);\n break;\n\n case 'Play':\n setTimeout(() => this._eventManager.dispatch({ type: 'play' }), 0);\n break;\n\n case 'Pause':\n setTimeout(() => this._eventManager.dispatch({ type: 'pause' }), 0);\n break;\n\n case 'Stop':\n setTimeout(() => this._eventManager.dispatch({ type: 'stop' }), 0);\n break;\n\n case 'Frame':\n setTimeout(() => this._eventManager.dispatch({ type: 'frame', currentFrame: event.frameNo ?? 0 }), 0);\n break;\n\n case 'Render':\n setTimeout(() => this._eventManager.dispatch({ type: 'render', currentFrame: event.frameNo ?? 0 }), 0);\n break;\n\n case 'Loop':\n setTimeout(() => this._eventManager.dispatch({ type: 'loop', loopCount: event.loopCount ?? 0 }), 0);\n break;\n\n case 'Complete':\n setTimeout(() => this._eventManager.dispatch({ type: 'complete' }), 0);\n break;\n\n default:\n break;\n }\n }\n }\n\n private _drainSmEvents(): void {\n if (!this._dotLottieCore) return;\n\n // Drain state machine events\n let evt: unknown;\n\n while ((evt = this._dotLottieCore.sm_poll_event()) !== null && evt !== undefined) {\n const event = evt as {\n type: string;\n previousState?: string;\n newState?: string;\n state?: string;\n message?: string;\n name?: string;\n oldValue?: unknown;\n newValue?: unknown;\n };\n\n switch (event.type) {\n case 'Start':\n setTimeout(() => {\n this._isStateMachineRunning = true;\n this._eventManager.dispatch({ type: 'stateMachineStart' });\n this._startAnimationLoop();\n }, 0);\n break;\n\n case 'Stop':\n setTimeout(() => {\n this._isStateMachineRunning = false;\n this._eventManager.dispatch({ type: 'stateMachineStop' });\n if (!this._dotLottieCore?.is_playing()) {\n this._stopAnimationLoop();\n }\n }, 0);\n break;\n\n case 'CustomEvent':\n this._eventManager.dispatch({ type: 'stateMachineCustomEvent', eventName: event.message ?? '' });\n break;\n\n case 'BooleanInputChange':\n this._eventManager.dispatch({\n type: 'stateMachineBooleanInputValueChange',\n inputName: event.name ?? '',\n newValue: event.newValue as boolean,\n oldValue: event.oldValue as boolean,\n });\n break;\n\n case 'NumericInputChange':\n this._eventManager.dispatch({\n type: 'stateMachineNumericInputValueChange',\n inputName: event.name ?? '',\n newValue: event.newValue as number,\n oldValue: event.oldValue as number,\n });\n break;\n\n case 'StringInputChange':\n this._eventManager.dispatch({\n type: 'stateMachineStringInputValueChange',\n inputName: event.name ?? '',\n newValue: event.newValue as string,\n oldValue: event.oldValue as string,\n });\n break;\n\n case 'InputFired':\n this._eventManager.dispatch({ type: 'stateMachineInputFired', inputName: event.name ?? '' });\n break;\n\n case 'Transition':\n this._eventManager.dispatch({\n type: 'stateMachineTransition',\n fromState: event.previousState ?? '',\n toState: event.newState ?? '',\n });\n break;\n\n case 'StateEntered':\n this._eventManager.dispatch({ type: 'stateMachineStateEntered', state: event.state ?? '' });\n break;\n\n case 'StateExit':\n this._eventManager.dispatch({ type: 'stateMachineStateExit', state: event.state ?? '' });\n break;\n\n case 'Error':\n this._eventManager.dispatch({ type: 'stateMachineError', error: event.message ?? '' });\n break;\n\n default:\n break;\n }\n }\n\n // Drain internal events\n let internal: unknown;\n\n while ((internal = this._dotLottieCore.sm_poll_internal_event()) !== null && internal !== undefined) {\n const internalEvt = internal as { type: string; message?: string };\n\n if (internalEvt.type === 'Message') {\n const message = internalEvt.message ?? '';\n\n if (IS_BROWSER && message.startsWith('OpenUrl: ')) {\n handleOpenUrl(message);\n } else {\n this._eventManager.dispatch({ type: 'stateMachineInternalMessage', message });\n }\n }\n }\n }\n\n // ── Private methods ────────────────────────────────────────────────────\n\n private _dispatchError(message: string): void {\n console.error(message);\n this._eventManager.dispatch({ type: 'loadError', error: new Error(message) });\n }\n\n private async _fetchData(src: string): Promise<string | ArrayBuffer> {\n const response = await fetch(src);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch animation data from URL: ${src}. ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.arrayBuffer();\n\n if (isDotLottie(data)) {\n return data;\n }\n\n // eslint-disable-next-line node/no-unsupported-features/node-builtins\n return new TextDecoder().decode(data);\n }\n\n private _loadFromData(data: Data): void {\n if (this._dotLottieCore === null) return;\n\n if (!this._canvas) {\n console.warn('[dotlottie-web] Cannot load animation without canvas. Call setCanvas() first.');\n\n return;\n }\n\n const width = this._canvas.width;\n const height = this._canvas.height;\n\n let loaded = false;\n\n if (typeof data === 'string') {\n if (!isLottie(data)) {\n this._dispatchError(\n 'Invalid Lottie JSON string: The provided string does not conform to the Lottie JSON format.',\n );\n\n return;\n }\n loaded = this._dotLottieCore.load_animation(data, width, height);\n } else if (data instanceof ArrayBuffer) {\n if (!isDotLottie(data)) {\n this._dispatchError(\n 'Invalid dotLottie ArrayBuffer: The provided ArrayBuffer does not conform to the dotLottie format.',\n );\n\n return;\n }\n loaded = this._dotLottieCore.load_dotlottie_data(new Uint8Array(data), width, height);\n } else if (typeof data === 'object') {\n if (!isLottie(data as Record<string, unknown>)) {\n this._dispatchError(\n 'Invalid Lottie JSON object: The provided object does not conform to the Lottie JSON format.',\n );\n\n return;\n }\n loaded = this._dotLottieCore.load_animation(JSON.stringify(data), width, height);\n } else {\n this._dispatchError(\n `Unsupported data type for animation data. Expected:\n - string (Lottie JSON),\n - ArrayBuffer (dotLottie),\n - object (Lottie JSON).\n Received: ${typeof data}`,\n );\n\n return;\n }\n\n if (loaded) {\n if (this._renderConfig.quality !== undefined) {\n this._dotLottieCore.set_quality(this._renderConfig.quality);\n }\n\n if (IS_BROWSER) {\n this.resize();\n }\n\n // Drain any events produced by loading (Load/LoadError)\n this._drainPlayerEvents();\n\n // Re-apply marker after load since markers are only available after animation data is parsed\n if (this._marker) {\n this._dotLottieCore.set_marker(this._marker);\n }\n\n setTimeout(() => {\n // FIXME: frame is not triggered from the dotlottie-rs core\n this._eventManager.dispatch({\n type: 'frame',\n currentFrame: this.currentFrame,\n });\n }, 0);\n\n this._dotLottieCore.render();\n this._drainPlayerEvents();\n\n this._draw();\n\n if (this._stateMachineId) {\n const smLoaded = this.stateMachineLoad(this._stateMachineId);\n\n if (smLoaded) {\n const smStarted = this.stateMachineStart();\n\n if (smStarted) {\n this._startAnimationLoop();\n }\n }\n } else if (this._dotLottieCore.is_playing()) {\n this._startAnimationLoop();\n }\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is initially offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n this.freeze();\n }\n }\n\n if (this._renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n }\n }\n } else {\n // Drain any LoadError events the core may have queued\n this._drainPlayerEvents();\n }\n }\n\n private _loadFromSrc(src: string): void {\n this._fetchData(src)\n .then((data) => this._loadFromData(data))\n .catch((error) => this._dispatchError(`Failed to load animation data from URL: ${src}. ${error}`));\n }\n\n /**\n * Gets the raw pixel buffer containing the rendered animation frame.\n * Returns RGBA pixel data as a Uint8Array for advanced image processing or custom rendering.\n */\n public get buffer(): Uint8Array | null {\n if (!this._dotLottieCore) return null;\n\n return this._dotLottieCore.get_pixel_buffer();\n }\n\n /**\n * Gets the ID of the currently active animation from a multi-animation dotLottie file.\n * Returns undefined if no specific animation is active or for single-animation files.\n */\n public get activeAnimationId(): string | undefined {\n return this._dotLottieCore?.animation_id() ?? undefined;\n }\n\n /**\n * Gets the ID of the currently active theme applied to the animation.\n * Returns undefined if no theme is active. Themes modify colors and visual properties.\n */\n public get activeThemeId(): string | undefined {\n return this._dotLottieCore?.theme_id() ?? undefined;\n }\n\n /**\n * Gets the current layout configuration for positioning and scaling the animation.\n * Includes fit mode (contain, cover, fill, etc.) and alignment [x, y] values (0-1 range).\n */\n public get layout(): Layout | undefined {\n if (!this._dotLottieCore) return undefined;\n\n return {\n align: [this._dotLottieCore.layout_align_x(), this._dotLottieCore.layout_align_y()],\n fit: fitToString(this._dotLottieCore.layout_fit()),\n };\n }\n\n /**\n * Gets the currently active marker name if a marker-based segment is set.\n * Returns undefined if no marker is active. Use setMarker() to activate a named segment.\n */\n public get marker(): string | undefined {\n return this._dotLottieCore?.current_marker() ?? '';\n }\n\n /**\n * Gets the animation manifest containing metadata about animations, themes, and states.\n * Returns null if no manifest is available or if the loaded animation doesn't include one.\n */\n public get manifest(): Manifest | null {\n try {\n const manifest = this._dotLottieCore?.manifest_string();\n\n if (this._dotLottieCore === null || !manifest) return null;\n\n const manifestJson = JSON.parse(manifest);\n\n if (Object.keys(manifestJson).length === 0) return null;\n\n return manifestJson as Manifest;\n } catch (_err) {\n return null;\n }\n }\n\n /**\n * Gets the current rendering configuration.\n * Includes settings like devicePixelRatio, autoResize, and freezeOnOffscreen.\n */\n public get renderConfig(): RenderConfig {\n return this._renderConfig;\n }\n\n /**\n * Gets the currently active playback segment as [startFrame, endFrame].\n * If no segment is set, returns undefined and the full animation plays.\n */\n public get segment(): [number, number] | undefined {\n if (!this._dotLottieCore || !this._dotLottieCore.has_segment()) return undefined;\n\n return [this._dotLottieCore.segment_start(), this._dotLottieCore.segment_end()];\n }\n\n /**\n * Gets the current loop configuration.\n * Returns true if the animation is set to loop continuously.\n */\n public get loop(): boolean {\n return this._dotLottieCore?.loop_animation() ?? false;\n }\n\n /**\n * Gets the current playback mode.\n * Determines playback direction: 'forward', 'reverse', 'bounce' (forward then reverse), or 'reverse-bounce'.\n */\n public get mode(): Mode {\n if (!this._dotLottieCore) return 'forward';\n\n return coreToMode(this._dotLottieCore.mode());\n }\n\n /**\n * Indicates whether rendering is currently frozen.\n * True when freeze() has been called and the rendering loop is paused to save resources.\n */\n public get isFrozen(): boolean {\n return this._isFrozen;\n }\n\n /**\n * Indicates whether a state machine is currently active and running.\n * True after stateMachineStart() is called and until stateMachineStop() is called.\n */\n public get isStateMachineRunning(): boolean {\n return this._isStateMachineRunning;\n }\n\n /**\n * Gets the current background color.\n * Returns the background color as a string (e.g., '#FFFFFF' or 'transparent').\n */\n public get backgroundColor(): string {\n return this._backgroundColor ?? '';\n }\n\n /**\n * Gets the autoplay configuration.\n * Returns true if the animation is configured to start playing automatically when loaded.\n */\n public get autoplay(): boolean {\n return this._dotLottieCore?.autoplay() ?? false;\n }\n\n /**\n * Gets the frame interpolation setting.\n * Returns true if frame interpolation is enabled for smoother animation playback.\n */\n public get useFrameInterpolation(): boolean {\n return this._dotLottieCore?.use_frame_interpolation() ?? false;\n }\n\n /**\n * Gets the current playback speed.\n * Returns the speed multiplier (1 = normal speed, 2 = double speed, 0.5 = half speed).\n */\n public get speed(): number {\n return this._dotLottieCore?.speed() ?? 0;\n }\n\n /**\n * Indicates whether the WASM module and core player have been initialized.\n * Check this before performing operations that require the player to be ready.\n */\n public get isReady(): boolean {\n return this._dotLottieCore !== null;\n }\n\n /**\n * Indicates whether an animation has been successfully loaded and is ready for playback.\n * Check this before calling play() or other playback methods to ensure the animation is ready.\n */\n public get isLoaded(): boolean {\n return this._dotLottieCore?.is_loaded() ?? false;\n }\n\n /**\n * Indicates whether the animation is currently playing.\n * True when animation is actively playing, false when paused, stopped, or not started.\n */\n public get isPlaying(): boolean {\n return this._dotLottieCore?.is_playing() ?? false;\n }\n\n /**\n * Indicates whether the animation is currently paused.\n * True when pause() has been called and animation is not playing or stopped.\n */\n public get isPaused(): boolean {\n return this._dotLottieCore?.is_paused() ?? false;\n }\n\n /**\n * Indicates whether the animation is currently stopped.\n * True when stop() has been called or animation hasn't started yet.\n */\n public get isStopped(): boolean {\n return this._dotLottieCore?.is_stopped() ?? false;\n }\n\n /**\n * Gets the current frame number of the animation.\n * Useful for tracking playback position or implementing custom frame displays. Rounded to 2 decimal places.\n */\n public get currentFrame(): number {\n if (!this._dotLottieCore) return 0;\n\n return Math.round(this._dotLottieCore.current_frame() * 100) / 100;\n }\n\n /**\n * Gets the number of times the animation has completed a loop during the current playback.\n * Increments each time the animation completes one full cycle.\n */\n public get loopCount(): number {\n return this._dotLottieCore?.current_loop_count() ?? 0;\n }\n\n /**\n * Gets the total number of frames in the animation.\n * Use with currentFrame to calculate playback progress as a percentage.\n */\n public get totalFrames(): number {\n return this._dotLottieCore?.total_frames() ?? 0;\n }\n\n /**\n * Gets the total duration of the animation in seconds.\n * Represents the time to play from the first frame to the last at normal speed (speed = 1).\n */\n public get duration(): number {\n return this._dotLottieCore?.duration() ?? 0;\n }\n\n /**\n * Gets the duration of the currently active segment in seconds.\n * If no segment is set, returns the full animation duration.\n */\n public get segmentDuration(): number {\n return this._dotLottieCore?.segment_duration() ?? 0;\n }\n\n /**\n * Gets the canvas element used for rendering the animation.\n * Returns the HTMLCanvasElement, OffscreenCanvas, or RenderSurface set during initialization.\n */\n public get canvas(): HTMLCanvasElement | OffscreenCanvas | RenderSurface | null {\n return this._canvas;\n }\n\n /**\n * Dynamically loads a new animation, replacing the current one if any.\n * Stops current playback, cleans up resources, and loads from the provided src or data.\n * @param config - Configuration for the new animation (all Config properties except canvas)\n */\n public load(config: Omit<Config, 'canvas'>): void {\n if (this._dotLottieCore === null) return;\n\n this._stopAnimationLoop();\n\n this._cleanupCanvas();\n\n this._isFrozen = false;\n\n // Apply config via individual setters\n this._dotLottieCore.set_autoplay(config.autoplay ?? false);\n this._dotLottieCore.set_loop(config.loop ?? false);\n this._dotLottieCore.set_loop_count(config.loopCount ?? 0);\n this._dotLottieCore.set_mode(modeToCore(config.mode ?? 'forward'));\n this._dotLottieCore.set_speed(config.speed ?? 1);\n this._dotLottieCore.set_use_frame_interpolation(config.useFrameInterpolation ?? true);\n if (config.segment && config.segment.length === 2) {\n this._dotLottieCore.set_segment(config.segment[0] as number, config.segment[1] as number);\n } else {\n this._dotLottieCore.clear_segment();\n }\n this._marker = config.marker ?? '';\n if (this._marker) {\n this._dotLottieCore.set_marker(this._marker);\n } else {\n this._dotLottieCore.clear_marker();\n }\n this._dotLottieCore.set_layout(\n config.layout?.fit ?? 'contain',\n config.layout?.align?.[0] ?? 0.5,\n config.layout?.align?.[1] ?? 0.5,\n );\n\n if (config.data) {\n if (this._canvas) {\n this._loadFromData(config.data);\n } else {\n this._pendingLoad = { data: config.data };\n }\n } else if (config.src) {\n if (this._canvas) {\n this._loadFromSrc(config.src);\n } else {\n this._pendingLoad = { src: config.src };\n }\n }\n\n this.setBackgroundColor(config.backgroundColor ?? '');\n }\n\n protected _draw(): void {\n if (this._dotLottieCore === null || this._canvas === null) return;\n\n // Only try to get context if canvas has getContext method and no context exists yet\n if (\n !this._context &&\n 'getContext' in this._canvas &&\n typeof this._canvas.getContext === 'function' &&\n ((typeof HTMLCanvasElement !== 'undefined' && this._canvas instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && this._canvas instanceof OffscreenCanvas))\n ) {\n this._context = this._canvas.getContext('2d') as\n | CanvasRenderingContext2D\n | OffscreenCanvasRenderingContext2D\n | null;\n }\n\n // Only process visual output if we have a canvas with a valid context\n if (this._context) {\n const buffer = this._dotLottieCore.get_pixel_buffer();\n\n const expectedLength = this._canvas.width * this._canvas.height * BYTES_PER_PIXEL;\n\n /*\n frame buffer size mismatch can occur temporarily during resize operations when the WASM buffer allocation hasn't completed yet\n */\n if (buffer.byteLength !== expectedLength) {\n if (this._lastExpectedBufferSize === expectedLength) {\n this._bufferMismatchCount += 1;\n } else {\n this._bufferMismatchCount = 1;\n this._lastExpectedBufferSize = expectedLength;\n }\n\n if (this._bufferMismatchCount === 10) {\n console.warn(\n `[dotlottie-web] Persistent buffer size mismatch detected. ` +\n `Expected ${expectedLength} bytes for canvas ${this._canvas.width}x${this._canvas.height}, ` +\n `but got ${buffer.byteLength} bytes. ` +\n `This may indicate a WASM memory allocation issue or invalid canvas dimensions.`,\n );\n }\n\n return;\n }\n\n this._bufferMismatchCount = 0;\n this._lastExpectedBufferSize = expectedLength;\n\n let imageData = null;\n\n // get_pixel_buffer() returns a Uint8Array view into WASM memory\n const clampedBuffer = new Uint8ClampedArray(buffer.buffer as ArrayBuffer, buffer.byteOffset, buffer.byteLength);\n\n /*\n In Node.js, the ImageData constructor is not available.\n You can use createImageData function in the canvas context to create ImageData object.\n */\n if (typeof ImageData === 'undefined') {\n imageData = this._context.createImageData(this._canvas.width, this._canvas.height);\n imageData.data.set(clampedBuffer);\n } else {\n imageData = new ImageData(clampedBuffer, this._canvas.width, this._canvas.height);\n }\n\n this._context.putImageData(imageData, 0, 0);\n }\n }\n\n private _cleanupCanvas(): void {\n if (this._canvas && IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n OffscreenObserver.unobserve(this._canvas);\n CanvasResizeObserver.unobserve(this._canvas);\n this._cleanupStateMachineListeners();\n }\n }\n\n private _initializeCanvas(): void {\n this._setupRendererOnCanvas();\n\n if (this._canvas && IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this.isLoaded) {\n if (this._renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n if (!isElementInViewport(this._canvas)) {\n this.freeze();\n }\n }\n\n if (this._renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n }\n\n if (this._isStateMachineRunning) {\n this._setupStateMachineListeners();\n }\n }\n\n if (this._canvas && this._dotLottieCore && this.isLoaded) {\n const resized = this._dotLottieCore.resize(this._canvas.width, this._canvas.height);\n\n if (resized) {\n this._dotLottieCore.render();\n this._draw();\n }\n }\n }\n\n protected _setupRendererOnCanvas(): void {\n this._context = null;\n }\n\n private _stopAnimationLoop(): void {\n if (this._animationFrameId !== null) {\n this._frameManager.cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = null;\n }\n }\n\n private _startAnimationLoop(): void {\n // Start if we don't already have an active loop and either:\n // 1. The animation should be playing, OR\n // 2. The state machine is running\n if (\n this._animationFrameId === null &&\n this._dotLottieCore &&\n !this._isFrozen &&\n (this._dotLottieCore.is_playing() || this._isStateMachineRunning)\n ) {\n this._animationFrameId = this._frameManager.requestAnimationFrame(this._animationLoop.bind(this));\n }\n }\n\n private _animationLoop(): void {\n if (this._dotLottieCore === null) {\n this._stopAnimationLoop();\n\n return;\n }\n\n // Continue the loop if either the animation is playing OR the state machine is running\n if (!this._dotLottieCore.is_playing() && !this._isStateMachineRunning) {\n this._stopAnimationLoop();\n\n return;\n }\n\n try {\n const advanced = this._isStateMachineRunning ? this._dotLottieCore.sm_tick() : this._dotLottieCore.tick();\n\n if (this._isStateMachineRunning) {\n this._drainSmEvents();\n } else {\n this._drainPlayerEvents();\n }\n\n if (advanced) {\n this._draw();\n }\n\n this._animationFrameId = this._frameManager.requestAnimationFrame(this._animationLoop.bind(this));\n } catch (error) {\n console.error('Error in animation frame:', error);\n\n this._eventManager.dispatch({ type: 'renderError', error: error as unknown as Error });\n\n // destroy the instance if it's a runtime error\n if (error instanceof WebAssembly.RuntimeError) {\n this.destroy();\n }\n }\n }\n\n /**\n * Starts or resumes animation playback from the current frame.\n * Unfreezes rendering if frozen and starts the animation loop. Updates isPlaying state to true.\n */\n public play(): void {\n if (this._dotLottieCore === null || !this.isLoaded) return;\n\n this._stopAnimationLoop();\n\n const playing = this._dotLottieCore.play();\n\n this._drainPlayerEvents();\n\n // Always unfreeze and start animation loop if core is playing, regardless of play() return value\n if (playing || this._dotLottieCore.is_playing()) {\n this._isFrozen = false;\n this._startAnimationLoop();\n }\n\n /*\n Check if the canvas is offscreen and freezing is enabled\n If freezeOnOffscreen is true and the canvas is currently outside the viewport,\n we immediately freeze the animation to avoid unnecessary rendering and performance overhead.\n */\n if (\n this._canvas &&\n IS_BROWSER &&\n this._canvas instanceof HTMLCanvasElement &&\n this._renderConfig.freezeOnOffscreen &&\n !isElementInViewport(this._canvas)\n ) {\n this.freeze();\n }\n }\n\n /**\n * Pauses animation playback at the current frame.\n * Stops the animation loop while preserving the current frame position. Updates isPaused state to true.\n */\n public pause(): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.pause();\n\n this._drainPlayerEvents();\n\n this._stopAnimationLoop();\n }\n\n /**\n * Stops animation playback and resets to the start frame.\n * Halts the animation loop and returns to the beginning. Updates isStopped state to true.\n */\n public stop(): void {\n if (this._dotLottieCore === null) return;\n\n const ok = this._dotLottieCore.stop();\n\n this._drainPlayerEvents();\n\n this._stopAnimationLoop();\n\n if (ok) {\n // FIXME: frame is not triggered from the dotlottie-rs core on stop()\n this._eventManager.dispatch({ type: 'frame', currentFrame: this.currentFrame });\n // FIXME: stop() doesn't trigger render() internally\n this._dotLottieCore.render();\n this._draw();\n }\n }\n\n /**\n * Seeks to a specific frame in the animation and renders it.\n * Useful for implementing custom scrubbing controls or precise frame positioning.\n * @param frame - The target frame number to seek to\n */\n public setFrame(frame: number): void {\n if (this._dotLottieCore === null) return;\n\n const frameUpdated = this._dotLottieCore.seek(frame);\n\n if (frameUpdated) {\n const rendered = this._dotLottieCore.render();\n\n this._drainPlayerEvents();\n\n if (rendered) {\n this._draw();\n }\n }\n }\n\n /**\n * Changes the animation playback speed.\n * Values above 1 speed up playback, below 1 slow it down.\n * @param speed - Playback speed multiplier (e.g., 2 for 2x speed, 0.5 for half speed)\n */\n public setSpeed(speed: number): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_speed(speed);\n }\n\n /**\n * Changes the background color of the canvas or animation.\n * For HTMLCanvasElement, sets the CSS background. For other surfaces, renders behind the animation.\n * @param color - CSS color string (e.g., '#FFFFFF', 'rgba(0,0,0,0.5)', 'transparent')\n */\n public setBackgroundColor(color: string): void {\n if (this._dotLottieCore === null) return;\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n this._canvas.style.backgroundColor = color;\n } else {\n this._dotLottieCore.set_background_color(hexStringToRGBAInt(color));\n }\n\n this._backgroundColor = color;\n }\n\n /**\n * Enables or disables continuous looping of the animation.\n * When enabled with loopCount set to 0, animation repeats indefinitely.\n * @param loop - True to enable looping, false to play once\n */\n public setLoop(loop: boolean): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_loop(loop);\n }\n\n /**\n * Sets the number of additional times to replay the animation after the first play.\n * Requires loop to be true. A value of 0 means infinite replays; a positive value n means\n * the animation plays a total of n + 1 times (initial play + n replays).\n * @param loopCount - Number of additional replays (0 = infinite, 1 = plays twice, 2 = plays three times, etc.)\n */\n public setLoopCount(loopCount: number): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_loop_count(loopCount);\n }\n\n /**\n * Enables or disables frame interpolation for smoother playback.\n * When enabled, interpolates between frames. When disabled, shows exact frame-by-frame animation.\n * @param useFrameInterpolation - True for smooth interpolation, false for exact frames\n */\n public setUseFrameInterpolation(useFrameInterpolation: boolean): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_use_frame_interpolation(useFrameInterpolation);\n }\n\n /**\n * Subscribes to animation events like play, pause, frame, complete, etc.\n * Use this to react to animation state changes and playback progress.\n * @param type - Event type to listen for (e.g., 'play', 'frame', 'complete')\n * @param listener - Callback function invoked when the event occurs\n */\n public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n this._eventManager.addEventListener(type, listener);\n }\n\n /**\n * Unsubscribes from animation events.\n * If no listener is provided, removes all listeners for the given event type.\n * @param type - Event type to stop listening for\n * @param listener - Specific callback to remove, or undefined to remove all\n */\n public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n this._eventManager.removeEventListener(type, listener);\n }\n\n /**\n * Cleans up and destroys the player instance, releasing all resources.\n * Stops playback, removes event listeners, and frees WASM memory. Call when the player is no longer needed.\n */\n public destroy(): void {\n this._stopAnimationLoop();\n\n // Reset state machine status\n this._isStateMachineRunning = false;\n\n this._cleanupCanvas();\n\n this._dotLottieCore?.free();\n this._dotLottieCore = null;\n this._context = null;\n\n this._eventManager.dispatch({\n type: 'destroy',\n });\n\n this._eventManager.removeAllEventListeners();\n this._cleanupStateMachineListeners();\n }\n\n /**\n * Pauses the rendering loop without changing playback state.\n * Useful for reducing CPU/GPU usage when the animation is offscreen or hidden. Dispatches 'freeze' event.\n */\n public freeze(): void {\n if (this._animationFrameId === null) return;\n\n this._stopAnimationLoop();\n\n this._isFrozen = true;\n\n this._eventManager.dispatch({ type: 'freeze' });\n }\n\n /**\n * Resumes the rendering loop after being frozen.\n * Restarts frame rendering while maintaining the current playback state. Dispatches 'unfreeze' event.\n */\n public unfreeze(): void {\n if (this._animationFrameId !== null) return;\n\n this._isFrozen = false;\n\n this._eventManager.dispatch({ type: 'unfreeze' });\n\n this._startAnimationLoop();\n }\n\n /**\n * Recalculates and updates canvas dimensions based on current size.\n * Call this when the canvas container size changes to maintain proper rendering. Usually handled by autoResize.\n */\n public resize(): void {\n if (!this._dotLottieCore || !this.isLoaded || !this._canvas) return;\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n const dpr = this._renderConfig.devicePixelRatio || window.devicePixelRatio || 1;\n\n const { height: clientHeight, width: clientWidth } = this._canvas.getBoundingClientRect();\n\n if (clientHeight !== 0 && clientWidth !== 0) {\n this._canvas.width = clientWidth * dpr;\n this._canvas.height = clientHeight * dpr;\n }\n }\n\n const resized = this._dotLottieCore.resize(this._canvas.width, this._canvas.height);\n\n if (resized) {\n this._dotLottieCore.render();\n this._draw();\n }\n }\n\n /**\n * Changes the canvas element used for rendering.\n * Useful for moving the animation to a different canvas without recreating the player instance.\n * @param canvas - New HTMLCanvasElement, OffscreenCanvas, or RenderSurface to render to\n */\n public setCanvas(canvas: HTMLCanvasElement | OffscreenCanvas | RenderSurface): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!canvas || this._canvas === canvas) return;\n\n if (this._canvas) {\n this._cleanupCanvas();\n }\n\n this._canvas = canvas;\n\n this._initializeCanvas();\n\n if (this._pendingLoad) {\n const pending = this._pendingLoad;\n\n this._pendingLoad = null;\n\n if (pending.data) {\n this._loadFromData(pending.data);\n } else if (pending.src) {\n this._loadFromSrc(pending.src);\n }\n }\n }\n\n /**\n * Applies a 3x3 transformation matrix to the entire animation on the canvas.\n * Use this to translate, rotate, scale, or skew the animation rendering.\n * @param transform - 9-element array representing the transformation matrix in row-major order\n * @returns True if transformation was applied successfully, false otherwise\n */\n public setTransform(transform: Transform): boolean {\n if (!this._dotLottieCore) return false;\n\n const ok = this._dotLottieCore.set_transform(new Float32Array(transform));\n\n if (ok && this._dotLottieCore.render()) {\n this._draw();\n }\n\n return ok;\n }\n\n /**\n * Gets the 3x3 transformation matrix applied to the animation.\n * Returns a 9-element array representing affine transformations (translation, rotation, scale, skew).\n * @returns Transform array of 9 numbers, or undefined if not available\n */\n public getTransform(): Transform | undefined {\n if (!this._dotLottieCore) return undefined;\n\n const arr = this._dotLottieCore.get_transform();\n\n return Array.from(arr) as Transform;\n }\n\n /**\n * Sets a frame range to play instead of the full animation.\n * Useful for playing specific sections or creating animation sequences from subsections.\n * @param startFrame - Starting frame number (inclusive)\n * @param endFrame - Ending frame number (inclusive)\n */\n public setSegment(startFrame: number, endFrame: number): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_segment(startFrame, endFrame);\n }\n\n /**\n * Changes the playback direction mode.\n * Controls whether animation plays forward, in reverse, or alternates (bounce).\n * @param mode - Playback mode: 'forward', 'reverse', 'bounce', or 'reverse-bounce'\n */\n public setMode(mode: Mode): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_mode(modeToCore(mode));\n }\n\n /**\n * Updates rendering configuration like autoResize, devicePixelRatio, and freezeOnOffscreen.\n * Dynamically changes how the canvas behaves without reloading the animation.\n * @param config - Partial RenderConfig with properties to update\n */\n public setRenderConfig(config: RenderConfig): void {\n const { devicePixelRatio, freezeOnOffscreen, quality, ...restConfig } = config;\n\n this._renderConfig = {\n ...this._renderConfig,\n ...restConfig,\n // devicePixelRatio is a special case, it should be set to the default value if it's not provided\n devicePixelRatio: devicePixelRatio || getDefaultDPR(),\n freezeOnOffscreen: freezeOnOffscreen ?? true,\n ...(quality !== undefined && { quality }),\n };\n\n if (quality !== undefined && this._dotLottieCore) {\n this._dotLottieCore.set_quality(quality);\n }\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n } else {\n CanvasResizeObserver.unobserve(this._canvas);\n }\n\n if (this._renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is currently offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n this.freeze();\n }\n } else {\n OffscreenObserver.unobserve(this._canvas);\n // If the animation was previously frozen, we need to unfreeze it now\n // to ensure it resumes rendering when the canvas is back onscreen.\n if (this._isFrozen) {\n this.unfreeze();\n }\n }\n }\n }\n\n /**\n * Switches to a different animation within a multi-animation dotLottie file.\n * Use this to load a different animation by its ID without creating a new player instance.\n * @param animationId - ID of the animation to load (must exist in the manifest)\n */\n public loadAnimation(animationId: string): void {\n if (this._dotLottieCore === null || this._dotLottieCore.animation_id() === animationId || !this._canvas) return;\n\n const loaded = this._dotLottieCore.load_animation_from_id(animationId, this._canvas.width, this._canvas.height);\n\n if (loaded) {\n if (this._renderConfig.quality !== undefined) {\n this._dotLottieCore.set_quality(this._renderConfig.quality);\n }\n this.resize();\n this._drainPlayerEvents();\n\n this._dotLottieCore.render();\n this._draw();\n } else {\n this._dispatchError(`Failed to load animation with id: ${animationId}`);\n }\n }\n\n /**\n * Activates a named marker to play only that marked segment.\n * Markers define named sections within an animation. Use markers() to list available markers.\n * @param marker - Name of the marker to activate\n */\n public setMarker(marker: string): void {\n if (this._dotLottieCore === null) return;\n\n this._marker = marker;\n this._dotLottieCore.set_marker(marker);\n }\n\n /**\n * Gets all markers defined in the animation with their time and duration.\n * Markers represent named sections that can be played using setMarker().\n * @returns Array of marker objects with name, time, and duration properties\n */\n public markers(): Marker[] {\n const markers = this._dotLottieCore?.markers();\n\n if (markers && Array.isArray(markers)) {\n return markers as Marker[];\n }\n\n return [];\n }\n\n /**\n * Applies a theme to the animation, modifying colors and visual properties.\n * Themes are predefined in the dotLottie manifest. Returns true if theme was successfully loaded.\n * @param themeId - ID of the theme to apply (must exist in manifest)\n * @returns True if theme loaded successfully, false otherwise\n */\n public setTheme(themeId: string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const themeLoaded = this._dotLottieCore.set_theme(themeId);\n\n if (themeLoaded) {\n this._dotLottieCore.render();\n this._draw();\n }\n\n return themeLoaded;\n }\n\n /**\n * Removes the currently applied theme and restores original animation colors.\n * Use this to revert to the default appearance after applying a theme.\n * @returns True if theme was reset successfully, false otherwise\n */\n public resetTheme(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const themeReset = this._dotLottieCore.reset_theme();\n\n if (themeReset) {\n this._dotLottieCore.render();\n this._draw();\n }\n\n return themeReset;\n }\n\n /**\n * Applies a custom theme from theme data instead of manifest theme ID.\n * Useful for dynamically generated or user-created themes not in the manifest.\n *\n * @param themeData - Theme data as a JSON string or a structured Theme object\n * @returns True if theme loaded successfully, false otherwise\n */\n public setThemeData(themeData: Theme | string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const themeDataString = typeof themeData === 'string' ? themeData : JSON.stringify(themeData);\n\n const themeLoaded = this._dotLottieCore.set_theme_data(themeDataString);\n\n if (themeLoaded) {\n this._dotLottieCore.render();\n this._draw();\n }\n\n return themeLoaded;\n }\n\n /**\n * Sets multiple slot values at once for parameterized animations.\n * Slots allow runtime customization of colors, text, images, or other properties.\n * @param slots - Object mapping slot IDs to their values\n */\n public setSlots(slots: Record<string, unknown>): void {\n if (this._dotLottieCore === null) return;\n\n if (this._dotLottieCore.set_slots_str(JSON.stringify(slots))) {\n this._dotLottieCore.render();\n this._draw();\n }\n }\n\n // #region Typed Slot APIs\n\n /**\n * Check if value is an array of keyframes (has objects with 't' and 's' properties)\n */\n private _isKeyframeArray(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'object' &&\n value[0] !== null &&\n 't' in value[0] &&\n 's' in value[0]\n );\n }\n\n /**\n * Get all slot IDs in the animation\n * @returns Array of slot ID strings\n */\n public getSlotIds(): string[] {\n if (!this._dotLottieCore) return [];\n\n const ids = this._dotLottieCore.get_slot_ids();\n\n if (Array.isArray(ids)) {\n return ids as string[];\n }\n\n return [];\n }\n\n /**\n * Get the type of a slot\n * @param slotId - The slot ID to query\n * @returns The slot type ('color', 'gradient', 'text', 'scalar', 'vector', 'position', 'image') or undefined\n */\n public getSlotType(slotId: string): SlotType | undefined {\n if (!this._dotLottieCore) return undefined;\n\n const type = this._dotLottieCore.get_slot_type(slotId);\n\n if (!type) return undefined;\n\n return type as SlotType;\n }\n\n /**\n * Get the current value of a slot\n * @param slotId - The slot ID to query\n * @returns The parsed slot value or undefined if not found\n */\n public getSlot(slotId: string): unknown {\n if (!this._dotLottieCore) return undefined;\n\n const slotStr = this._dotLottieCore.get_slot_str(slotId);\n\n if (!slotStr) return undefined;\n\n try {\n return JSON.parse(slotStr);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get all slots as an object with slot IDs as keys\n * @returns Object containing all slots, or empty object if not loaded\n */\n public getSlots(): Record<string, unknown> {\n if (!this._dotLottieCore) return {};\n\n try {\n return JSON.parse(this._dotLottieCore.get_slots_str());\n } catch {\n return {};\n }\n }\n\n /**\n * Set a color slot value\n * @param slotId - The slot ID to set\n * @param value - Static color [r, g, b, a] or array of keyframes\n * @returns true if successful\n */\n public setColorSlot(slotId: string, value: ColorSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = this._isKeyframeArray(value);\n const slotJson = JSON.stringify({ a: isAnimated ? 1 : 0, k: value });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a scalar slot value (single number like rotation, opacity)\n * @param slotId - The slot ID to set\n * @param value - Static number or array of keyframes\n * @returns true if successful\n */\n public setScalarSlot(slotId: string, value: ScalarSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = typeof value !== 'number';\n const slotJson = JSON.stringify({ a: isAnimated ? 1 : 0, k: value });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a vector slot value (2D or 3D point for position, scale, etc.)\n * Handles both \"vector\" and \"position\" slot types\n * @param slotId - The slot ID to set\n * @param value - Static vector [x, y] or array of keyframes\n * @returns true if successful\n */\n public setVectorSlot(slotId: string, value: VectorSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = this._isKeyframeArray(value);\n const slotJson = JSON.stringify({ a: isAnimated ? 1 : 0, k: value });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a gradient slot value\n * @param slotId - The slot ID to set\n * @param value - Static gradient or array of keyframes\n * @param colorStopCount - Number of color stops\n * @returns true if successful\n */\n public setGradientSlot(slotId: string, value: GradientSlotValue, colorStopCount: number): boolean {\n if (this._dotLottieCore === null) return false;\n\n const isAnimated = this._isKeyframeArray(value);\n const slotJson = JSON.stringify({ k: { a: isAnimated ? 1 : 0, k: value }, p: colorStopCount });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Set a text slot value (always static - text documents don't support animation)\n * Supports partial updates - only provided properties will be changed, others inherit from existing value\n * @param slotId - The slot ID to set\n * @param value - Text document properties (partial allowed)\n * @returns true if successful\n */\n public setTextSlot(slotId: string, value: TextSlotValue): boolean {\n if (this._dotLottieCore === null) return false;\n\n const existingStr = this._dotLottieCore.get_slot_str(slotId);\n let mergedTextDoc = value;\n\n if (existingStr) {\n const existingValue = JSON.parse(existingStr);\n\n if (existingValue && 'k' in existingValue && Array.isArray(existingValue.k)) {\n const keyframe0 = existingValue.k[0] as Record<string, unknown>;\n\n if ('s' in keyframe0 && typeof keyframe0['s'] === 'object') {\n mergedTextDoc = {\n ...(keyframe0['s'] as Record<string, unknown>),\n ...value,\n };\n }\n }\n }\n\n const slotJson = JSON.stringify({\n a: 0,\n k: [{ t: 0, s: mergedTextDoc }],\n });\n\n const result = this._dotLottieCore.set_slot_str(slotId, slotJson);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Reset a slot to its original value\n * @param slotId - The slot ID to reset\n * @returns true if successful\n */\n public resetSlot(slotId: string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.reset_slot(slotId);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Clear a slot's custom value\n * @param slotId - The slot ID to clear\n * @returns true if successful\n */\n public clearSlot(slotId: string): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.clear_slot(slotId);\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Reset all slots to their original values\n * @returns true if successful\n */\n public resetSlots(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.reset_slots();\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n /**\n * Clear all slot custom values\n * @returns true if successful\n */\n public clearSlots(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const result = this._dotLottieCore.clear_slots();\n\n this._dotLottieCore.render();\n this._draw();\n\n return result;\n }\n\n // #endregion\n\n /**\n * Updates the layout configuration for positioning and scaling the animation.\n * Changes how the animation fits and aligns within the canvas without requiring a reload.\n * @param layout - New layout configuration with fit mode and alignment values\n */\n public setLayout(layout: Layout): void {\n if (this._dotLottieCore === null) return;\n\n this._dotLottieCore.set_layout(layout.fit ?? 'contain', layout.align?.[0] ?? 0.5, layout.align?.[1] ?? 0.5);\n }\n\n /**\n * Sets a custom viewport region for rendering a portion of the animation.\n * Defines a rectangular area to render, useful for implementing animation clipping or panning effects.\n * @param x - X coordinate of the viewport's top-left corner\n * @param y - Y coordinate of the viewport's top-left corner\n * @param width - Width of the viewport in pixels\n * @param height - Height of the viewport in pixels\n * @returns True if viewport was set successfully, false otherwise\n */\n public setViewport(x: number, y: number, width: number, height: number): boolean {\n if (this._dotLottieCore === null) return false;\n\n return this._dotLottieCore.set_viewport(x, y, width, height);\n }\n\n /**\n * Configures the URL for loading the WASM module.\n * Call this before creating any player instances to load the WASM from a custom CDN or local path.\n * @param url - URL pointing to the dotlottie WASM file\n */\n public static setWasmUrl(url: string): void {\n dotLottieWasmLoader.setWasmUrl(url);\n }\n\n /**\n * @experimental\n * Register a custom font for use in animations\n * @param fontName - The name of the font to register\n * @param fontSource - Either a URL string to fetch the font, or ArrayBuffer/Uint8Array of font data\n * @returns Promise<boolean> - true if registration succeeded, false otherwise\n */\n public static async registerFont(fontName: string, fontSource: string | ArrayBuffer | Uint8Array): Promise<boolean> {\n try {\n await dotLottieWasmLoader.load();\n\n let fontData: Uint8Array;\n\n if (typeof fontSource === 'string') {\n const response = await fetch(fontSource);\n\n if (!response.ok) {\n console.error(`Failed to fetch font from URL: ${fontSource}. Status: ${response.status}`);\n\n return false;\n }\n fontData = new Uint8Array(await response.arrayBuffer());\n } else if (fontSource instanceof Uint8Array) {\n fontData = fontSource;\n } else {\n fontData = new Uint8Array(fontSource);\n }\n\n const success = register_font(fontName, fontData);\n\n if (!success) {\n console.error(`Failed to register font \"${fontName}\". Font data may be invalid.`);\n }\n\n return success;\n } catch (error) {\n console.error(`Error registering font \"${fontName}\":`, error);\n\n return false;\n }\n }\n\n /**\n * Gets the original dimensions of the animation as defined in the source file.\n * Returns width and height in pixels representing the animation's intrinsic size.\n * @returns Object with width and height properties in pixels\n */\n public animationSize(): { height: number; width: number } {\n const size = this._dotLottieCore?.animation_size();\n\n return {\n width: size?.[0] ?? 0,\n height: size?.[1] ?? 0,\n };\n }\n\n /**\n * Gets the Oriented Bounding Box (OBB) points of a layer by its name.\n * Returns 8 numbers representing 4 corner points (x,y) in clockwise order from top-left.\n * @param layerName - Name of the layer to get bounds for\n * @returns Array of 8 numbers representing the bounding box corners, or undefined if layer not found\n */\n public getLayerBoundingBox(layerName: string): number[] | undefined {\n const bounds = this._dotLottieCore?.get_layer_bounds(layerName);\n\n if (!bounds) return undefined;\n\n if (bounds.length !== 8) return undefined;\n\n return Array.from(bounds);\n }\n\n /**\n * Converts theme data into Lottie slot format for dynamic content replacement.\n * @param _theme - Theme data as a JSON string\n * @param _slots - Slot definitions as a JSON string\n * @returns Transformed slots data as a JSON string\n */\n public static transformThemeToLottieSlots(_theme: string, _slots: string): string {\n return '';\n }\n\n // #region State Machine\n\n /**\n * @experimental\n * Loads a state machine by its ID from the dotLottie manifest.\n * State machines enable interactive, event-driven animation behaviors.\n * @param stateMachineId - The ID of the state machine to load (must exist in manifest)\n * @returns True if the state machine was loaded successfully, false otherwise\n */\n public stateMachineLoad(stateMachineId: string): boolean {\n if (!this._dotLottieCore) return false;\n\n return this._dotLottieCore.state_machine_load_from_id(stateMachineId);\n }\n\n /**\n * @experimental\n * Load a state machine from data string\n * @param stateMachineData - The state machine data as a string\n * @returns true if the state machine was loaded successfully\n */\n public stateMachineLoadData(stateMachineData: string): boolean {\n if (!this._dotLottieCore) return false;\n\n return this._dotLottieCore.state_machine_load(stateMachineData);\n }\n\n /**\n * @experimental\n * Set the state machine config\n * @param config - The state machine config\n */\n public stateMachineSetConfig(config: StateMachineConfig | null): void {\n this._stateMachineConfig = config;\n }\n\n /**\n * @experimental\n * Start the state machine\n * @returns true if the state machine was started successfully\n */\n public stateMachineStart(): boolean {\n if (this._dotLottieCore === null) return false;\n\n const started = this._dotLottieCore.sm_start(\n this._stateMachineConfig?.openUrlPolicy?.requireUserInteraction ?? true,\n (this._stateMachineConfig?.openUrlPolicy?.whitelist ?? []) as unknown[],\n );\n\n this._drainSmEvents();\n\n if (started) {\n this._isStateMachineRunning = true;\n this._setupStateMachineListeners();\n this._startAnimationLoop();\n }\n\n return started;\n }\n\n /**\n * @experimental\n * Stop the state machine\n * @returns true if the state machine was stopped successfully\n */\n public stateMachineStop(): boolean {\n if (!this._dotLottieCore) return false;\n\n const stopped = this._dotLottieCore.sm_stop();\n\n this._drainSmEvents();\n\n if (stopped) {\n this._isStateMachineRunning = false;\n this._cleanupStateMachineListeners();\n\n // Stop animation loop if animation is not playing\n if (!this._dotLottieCore.is_playing()) {\n this._stopAnimationLoop();\n }\n }\n\n return stopped;\n }\n\n /**\n * @experimental\n * Get the current status of the state machine\n * @returns The current status of the state machine as a string\n */\n public stateMachineGetStatus(): string {\n return this._dotLottieCore?.sm_status() ?? '';\n }\n\n /**\n * @experimental\n * Get the current state of the state machine\n * @returns The current state of the state machine as a string\n */\n public stateMachineGetCurrentState(): string {\n return this._dotLottieCore?.sm_current_state() ?? '';\n }\n\n /**\n * @experimental\n * Get the active state machine ID\n * @returns The active state machine ID as a string\n */\n public stateMachineGetActiveId(): string {\n return this._dotLottieCore?.state_machine_id() ?? '';\n }\n\n /**\n * @experimental\n * Override the current state of the state machine\n * @param state - The state to override to\n * @param immediate - Whether to immediately transition to the state\n * @returns true if the state override was successful\n */\n public stateMachineOverrideState(state: string, immediate: boolean = false): boolean {\n return this._dotLottieCore?.sm_override_current_state(state, immediate) ?? false;\n }\n\n /**\n * @experimental\n * Get a specific state machine by ID\n * @param stateMachineId - The ID of the state machine to get\n * @returns The state machine data as a string\n */\n public stateMachineGet(stateMachineId: string): string {\n return this._dotLottieCore?.get_state_machine(stateMachineId) ?? '';\n }\n\n /**\n * @experimental\n * Get the list of state machine listeners\n * @returns Array of listener names\n */\n public stateMachineGetListeners(): string[] {\n if (!this._dotLottieCore) return [];\n\n const listeners = this._dotLottieCore.sm_framework_setup();\n\n if (Array.isArray(listeners)) {\n return listeners as string[];\n }\n\n return [];\n }\n\n /**\n * @experimental\n * Set a boolean input value for the state machine\n * @param name - The name of the boolean input\n * @param value - The boolean value to set\n */\n public stateMachineSetBooleanInput(name: string, value: boolean): boolean {\n return this._dotLottieCore?.sm_set_boolean_input(name, value) ?? false;\n }\n\n /**\n * @experimental\n * Set a numeric input value for the state machine\n * @param name - The name of the numeric input\n * @param value - The numeric value to set\n */\n public stateMachineSetNumericInput(name: string, value: number): boolean {\n return this._dotLottieCore?.sm_set_numeric_input(name, value) ?? false;\n }\n\n /**\n * @experimental\n * Set a string input value for the state machine\n * @param name - The name of the string input\n * @param value - The string value to set\n */\n public stateMachineSetStringInput(name: string, value: string): boolean {\n return this._dotLottieCore?.sm_set_string_input(name, value) ?? false;\n }\n\n /**\n * @experimental\n * Get a boolean input value from the state machine\n * @param name - The name of the boolean input\n * @returns The boolean value or undefined if not found\n */\n public stateMachineGetBooleanInput(name: string): boolean | undefined {\n return this._dotLottieCore?.sm_get_boolean_input(name) ?? undefined;\n }\n\n /**\n * @experimental\n * Get a numeric input value from the state machine\n * @param name - The name of the numeric input\n * @returns The numeric value or undefined if not found\n */\n public stateMachineGetNumericInput(name: string): number | undefined {\n return this._dotLottieCore?.sm_get_numeric_input(name) ?? undefined;\n }\n\n /**\n * @experimental\n * Get a string input value from the state machine\n * @param name - The name of the string input\n * @returns The string value or undefined if not found\n */\n public stateMachineGetStringInput(name: string): string | undefined {\n return this._dotLottieCore?.sm_get_string_input(name) ?? undefined;\n }\n\n /**\n * @experimental\n * Get all the inputs of the current state machine.\n * @returns An array of input keys followed by its type at n+1.\n */\n public stateMachineGetInputs(): string[] {\n if (!this._dotLottieCore) return [];\n\n const inputs = this._dotLottieCore.sm_get_inputs();\n\n if (Array.isArray(inputs)) {\n return inputs as string[];\n }\n\n return [];\n }\n\n /**\n * @experimental\n * Fire an event in the state machine\n * @param name - The name of the event to fire\n */\n public stateMachineFireEvent(name: string): void {\n this._dotLottieCore?.sm_fire(name);\n }\n\n /**\n * @experimental\n * Post a click event to the state machine\n * @param x - The x coordinate of the click\n * @param y - The y coordinate of the click\n */\n public stateMachinePostClickEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_click(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer up event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerUpEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_up(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer down event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerDownEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_down(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer move event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerMoveEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_move(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer enter event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerEnterEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_enter(x, y);\n }\n\n /**\n * @experimental\n * Post a pointer exit event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n */\n public stateMachinePostPointerExitEvent(x: number, y: number): void {\n this._dotLottieCore?.sm_post_pointer_exit(x, y);\n }\n\n private _onClick(event: MouseEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostClickEvent(position.x, position.y);\n }\n }\n\n private _onPointerUp(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerUpEvent(position.x, position.y);\n }\n }\n\n private _onPointerDown(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerDownEvent(position.x, position.y);\n }\n }\n\n private _onPointerMove(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerMoveEvent(position.x, position.y);\n }\n }\n\n private _onPointerEnter(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerEnterEvent(position.x, position.y);\n }\n }\n\n private _onPointerLeave(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this.stateMachinePostPointerExitEvent(position.x, position.y);\n }\n }\n\n private _setupStateMachineListeners(): void {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this._dotLottieCore !== null && this.isLoaded) {\n const listeners = this.stateMachineGetListeners();\n\n // Clean up any existing listeners first\n this._cleanupStateMachineListeners();\n\n if (listeners.includes('Click')) {\n this._boundOnClick = this._onClick.bind(this);\n this._canvas.addEventListener('click', this._boundOnClick);\n }\n if (listeners.includes('PointerUp')) {\n this._boundOnPointerUp = this._onPointerUp.bind(this);\n this._canvas.addEventListener('pointerup', this._boundOnPointerUp);\n }\n if (listeners.includes('PointerDown')) {\n this._boundOnPointerDown = this._onPointerDown.bind(this);\n this._canvas.addEventListener('pointerdown', this._boundOnPointerDown);\n }\n if (listeners.includes('PointerMove')) {\n this._boundOnPointerMove = this._onPointerMove.bind(this);\n this._canvas.addEventListener('pointermove', this._boundOnPointerMove);\n }\n if (listeners.includes('PointerEnter')) {\n this._boundOnPointerEnter = this._onPointerEnter.bind(this);\n this._canvas.addEventListener('pointerenter', this._boundOnPointerEnter);\n }\n if (listeners.includes('PointerExit')) {\n this._boundOnPointerLeave = this._onPointerLeave.bind(this);\n this._canvas.addEventListener('pointerleave', this._boundOnPointerLeave);\n }\n }\n }\n\n private _cleanupStateMachineListeners(): void {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._boundOnClick) {\n this._canvas.removeEventListener('click', this._boundOnClick);\n this._boundOnClick = null;\n }\n if (this._boundOnPointerUp) {\n this._canvas.removeEventListener('pointerup', this._boundOnPointerUp);\n this._boundOnPointerUp = null;\n }\n if (this._boundOnPointerDown) {\n this._canvas.removeEventListener('pointerdown', this._boundOnPointerDown);\n this._boundOnPointerDown = null;\n }\n if (this._boundOnPointerMove) {\n this._canvas.removeEventListener('pointermove', this._boundOnPointerMove);\n this._boundOnPointerMove = null;\n }\n if (this._boundOnPointerEnter) {\n this._canvas.removeEventListener('pointerenter', this._boundOnPointerEnter);\n this._boundOnPointerEnter = null;\n }\n if (this._boundOnPointerLeave) {\n this._canvas.removeEventListener('pointerleave', this._boundOnPointerLeave);\n this._boundOnPointerLeave = null;\n }\n }\n }\n // #endregion\n}\n","// resolved to a Worker constructor by plugin-inline-worker\nimport DotLottieWebWorker from './dotlottie.worker?worker&inline';\nimport type { MethodParamsMap, RpcRequest } from './types';\n\nexport class WorkerManager {\n private readonly _workers = new Map<string, Worker>();\n\n private readonly _animationWorkerMap = new Map<string, string>();\n\n public getWorker(workerId: string): Worker {\n if (!this._workers.has(workerId)) {\n this._workers.set(workerId, new DotLottieWebWorker());\n }\n\n return this._workers.get(workerId) as Worker;\n }\n\n public assignAnimationToWorker(animationId: string, workerId: string): void {\n this._animationWorkerMap.set(animationId, workerId);\n }\n\n public unassignAnimationFromWorker(animationId: string): void {\n this._animationWorkerMap.delete(animationId);\n }\n\n public sendMessage(workerId: string, message: RpcRequest<keyof MethodParamsMap>, transfer?: Transferable[]): void {\n this.getWorker(workerId).postMessage(message, transfer || []);\n }\n\n public broadcastMessage(message: RpcRequest<keyof MethodParamsMap>, transfer?: Transferable[]): void {\n this._workers.forEach((worker) => {\n worker.postMessage(message, transfer || []);\n });\n }\n\n public terminateWorker(workerId: string): void {\n const worker = this._workers.get(workerId);\n\n if (worker) {\n worker.terminate();\n this._workers.delete(workerId);\n }\n }\n}\n","import { IS_BROWSER } from '../constants';\nimport type { EventListener, EventType, FrameEvent, StateMachineInternalMessage } from '../event-manager';\nimport { EventManager } from '../event-manager';\nimport { OffscreenObserver } from '../offscreen-observer';\nimport { CanvasResizeObserver } from '../resize-observer';\nimport type {\n ColorSlotValue,\n Config,\n GradientSlotValue,\n Layout,\n Manifest,\n Marker,\n Mode,\n RenderConfig,\n ScalarSlotValue,\n SlotType,\n StateMachineConfig,\n TextSlotValue,\n Transform,\n VectorSlotValue,\n} from '../types';\nimport { getDefaultDPR, getPointerPosition, handleOpenUrl, isElementInViewport } from '../utils';\n\nimport type { MethodParamsMap, MethodResultMap, RpcRequest, RpcResponse } from './types';\nimport { WorkerManager } from './worker-manager';\n\nfunction getCanvasSize(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n devicePixelRatio: number,\n): { height: number; width: number } {\n if (typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement) {\n const { height: clientHeight, width: clientWidth } = canvas.getBoundingClientRect();\n\n if (clientHeight !== 0 && clientWidth !== 0) {\n return { width: clientWidth * devicePixelRatio, height: clientHeight * devicePixelRatio };\n }\n }\n\n return { width: canvas.width, height: canvas.height };\n}\n\nfunction generateUniqueId(): string {\n return Date.now().toString(36) + Math.random().toString(36).substr(2, 9);\n}\n\nexport interface DotLottieInstanceState {\n activeAnimationId: string | undefined;\n activeThemeId: string | undefined;\n autoplay: boolean;\n backgroundColor: string;\n currentFrame: number;\n duration: number;\n isFrozen: boolean;\n isLoaded: boolean;\n isPaused: boolean;\n isPlaying: boolean;\n isReady: boolean;\n isStopped: boolean;\n layout: Layout | undefined;\n loop: boolean;\n loopCount: number;\n manifest: Manifest | null;\n marker: string | undefined;\n markers: Marker[];\n mode: Mode;\n renderConfig: RenderConfig;\n segment: [number, number] | undefined;\n segmentDuration: number;\n speed: number;\n totalFrames: number;\n useFrameInterpolation: boolean;\n}\n\n/**\n * Worker-based DotLottie player that offloads animation processing to a Web Worker thread.\n * Use this for better performance when rendering multiple animations or to keep the main thread responsive.\n * All methods are async (return Promises) due to worker communication. Requires HTMLCanvasElement or OffscreenCanvas.\n */\nexport class DotLottieWorker {\n private static readonly _workerManager = new WorkerManager();\n\n private readonly _eventManager = new EventManager();\n\n private readonly _id: string;\n\n private readonly _worker: Worker;\n\n private _canvas: HTMLCanvasElement | OffscreenCanvas | null;\n\n private _dotLottieInstanceState: DotLottieInstanceState = {\n loopCount: 0,\n markers: [],\n autoplay: false,\n backgroundColor: '',\n currentFrame: 0,\n duration: 0,\n loop: false,\n mode: 'forward',\n segment: [0, 0],\n segmentDuration: 0,\n speed: 1,\n totalFrames: 0,\n isLoaded: false,\n isPlaying: false,\n isPaused: false,\n isStopped: true,\n isFrozen: false,\n useFrameInterpolation: false,\n renderConfig: {\n devicePixelRatio: getDefaultDPR(),\n },\n activeAnimationId: '',\n activeThemeId: '',\n layout: undefined,\n marker: '',\n isReady: false,\n manifest: null,\n };\n\n private static _wasmUrl: string = '';\n\n private _created: boolean = false;\n\n // Bound event listeners for state machine\n private _boundOnClick: ((event: MouseEvent) => void) | null = null;\n\n private _boundOnPointerUp: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerDown: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerMove: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerEnter: ((event: PointerEvent) => void) | null = null;\n\n private _boundOnPointerLeave: ((event: PointerEvent) => void) | null = null;\n\n private _pendingConfig: Config | null = null;\n\n /**\n * Creates a worker-based DotLottie player instance that runs in a separate thread.\n * Use workerId to share a worker across multiple animations for better resource management.\n * @param config - Configuration with optional workerId to share worker threads\n * @throws Error if canvas is not HTMLCanvasElement or OffscreenCanvas\n */\n public constructor(config: Config & { workerId?: string }) {\n if (config.canvas) {\n const isHTMLCanvas = typeof HTMLCanvasElement !== 'undefined' && config.canvas instanceof HTMLCanvasElement;\n const isOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' && config.canvas instanceof OffscreenCanvas;\n\n if (!isHTMLCanvas && !isOffscreenCanvas) {\n throw new Error('Worker-based DotLottie requires HTMLCanvasElement or OffscreenCanvas');\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this._canvas = (config.canvas as HTMLCanvasElement | OffscreenCanvas) ?? null;\n\n this._id = `dotlottie-${generateUniqueId()}`;\n const workerId = config.workerId || 'defaultWorker';\n\n // creates or gets the worker\n this._worker = DotLottieWorker._workerManager.getWorker(workerId);\n\n DotLottieWorker._workerManager.assignAnimationToWorker(this._id, workerId);\n\n if (DotLottieWorker._wasmUrl) {\n this._sendMessage('setWasmUrl', { url: DotLottieWorker._wasmUrl });\n }\n\n const fullConfig = {\n ...config,\n renderConfig: {\n ...config.renderConfig,\n devicePixelRatio: config.renderConfig?.devicePixelRatio || getDefaultDPR(),\n // freezeOnOffscreen is true by default to prevent unnecessary rendering when the canvas is offscreen\n freezeOnOffscreen: config.renderConfig?.freezeOnOffscreen ?? true,\n },\n };\n\n this._pendingConfig = fullConfig;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this._canvas) {\n this._create(fullConfig);\n this._pendingConfig = null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this._worker.addEventListener('message', this._handleWorkerEvent.bind(this));\n }\n\n private async _handleWorkerEvent(event: MessageEvent): Promise<void> {\n const rpcResponse: RpcResponse<\n | 'onComplete'\n | 'onLoad'\n | 'onDestroy'\n | 'onUnfreeze'\n | 'onFrame'\n | 'onRender'\n | 'onFreeze'\n | 'onPause'\n | 'onPlay'\n | 'onStop'\n | 'onLoadError'\n | 'onRenderError'\n | 'onReady'\n | 'onLoop'\n | 'onStateMachineStart'\n | 'onStateMachineStop'\n | 'onStateMachineTransition'\n | 'onStateMachineStateEntered'\n | 'onStateMachineStateExit'\n | 'onStateMachineCustomEvent'\n | 'onStateMachineError'\n | 'onStateMachineBooleanInputValueChange'\n // eslint-disable-next-line no-secrets/no-secrets\n | 'onStateMachineNumericInputValueChange'\n | 'onStateMachineStringInputValueChange'\n | 'onStateMachineInputFired'\n | 'onStateMachineInternalMessage'\n > = event.data;\n\n if (!rpcResponse.id) {\n if (rpcResponse.method === 'onLoad' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._dotLottieInstanceState.renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is initially offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n await this.freeze();\n }\n }\n\n if (this._dotLottieInstanceState.renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n }\n }\n }\n\n if (rpcResponse.method === 'onComplete' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onDestroy' && rpcResponse.result.instanceId === this._id) {\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onUnfreeze' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._dotLottieInstanceState.isFrozen = false;\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onFrame' && rpcResponse.result.instanceId === this._id) {\n this._dotLottieInstanceState.currentFrame = (rpcResponse.result.event as FrameEvent).currentFrame;\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onRender' && rpcResponse.result.instanceId === this._id) {\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onFreeze' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onPause' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onPlay' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStop' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onLoadError' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onRenderError' && rpcResponse.result.instanceId === this._id) {\n // Dont update the instance, since the Core crashed its no long accessible. Calling _updateDotLottieInstanceState will cause it to hang indefinitely.\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onReady' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onLoop' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStart' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._setupStateMachineListeners();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStop' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._cleanupStateMachineListeners();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineTransition' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStateEntered' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStateExit' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineCustomEvent' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineError' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (\n rpcResponse.method === 'onStateMachineBooleanInputValueChange' &&\n rpcResponse.result.instanceId === this._id\n ) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (\n // eslint-disable-next-line no-secrets/no-secrets\n rpcResponse.method === 'onStateMachineNumericInputValueChange' &&\n rpcResponse.result.instanceId === this._id\n ) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineStringInputValueChange' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineInputFired' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n this._eventManager.dispatch(rpcResponse.result.event);\n }\n\n if (rpcResponse.method === 'onStateMachineInternalMessage' && rpcResponse.result.instanceId === this._id) {\n await this._updateDotLottieInstanceState();\n\n const internalEvent = rpcResponse.result.event as StateMachineInternalMessage;\n\n if (internalEvent.message.startsWith('OpenUrl: ')) {\n handleOpenUrl(internalEvent.message);\n }\n }\n }\n }\n\n private async _create(config: Config): Promise<void> {\n if (!this._canvas) {\n return;\n }\n\n let offscreen: OffscreenCanvas;\n\n if (this._canvas instanceof HTMLCanvasElement) {\n offscreen = this._canvas.transferControlToOffscreen();\n } else {\n offscreen = this._canvas;\n }\n\n const { instanceId } = await this._sendMessage(\n 'create',\n {\n instanceId: this._id,\n config: {\n ...config,\n canvas: offscreen as unknown as HTMLCanvasElement,\n },\n ...getCanvasSize(this._canvas, config.renderConfig?.devicePixelRatio || getDefaultDPR()),\n },\n [offscreen],\n );\n\n if (instanceId !== this._id) {\n throw new Error('Instance ID mismatch');\n }\n\n this._created = true;\n\n await this._updateDotLottieInstanceState();\n }\n\n public get loopCount(): number {\n return this._dotLottieInstanceState.loopCount;\n }\n\n public get isLoaded(): boolean {\n return this._dotLottieInstanceState.isLoaded;\n }\n\n public get isPlaying(): boolean {\n return this._dotLottieInstanceState.isPlaying;\n }\n\n public get isPaused(): boolean {\n return this._dotLottieInstanceState.isPaused;\n }\n\n public get isStopped(): boolean {\n return this._dotLottieInstanceState.isStopped;\n }\n\n public get currentFrame(): number {\n return this._dotLottieInstanceState.currentFrame;\n }\n\n public get isFrozen(): boolean {\n return this._dotLottieInstanceState.isFrozen;\n }\n\n public get segmentDuration(): number {\n return this._dotLottieInstanceState.segmentDuration;\n }\n\n public get totalFrames(): number {\n return this._dotLottieInstanceState.totalFrames;\n }\n\n public get segment(): [number, number] | undefined {\n return this._dotLottieInstanceState.segment;\n }\n\n public get speed(): number {\n return this._dotLottieInstanceState.speed;\n }\n\n public get duration(): number {\n return this._dotLottieInstanceState.duration;\n }\n\n public get isReady(): boolean {\n return this._dotLottieInstanceState.isReady;\n }\n\n public get mode(): Mode {\n return this._dotLottieInstanceState.mode;\n }\n\n public get canvas(): HTMLCanvasElement | OffscreenCanvas | null {\n return this._canvas;\n }\n\n /**\n * Sets the canvas element for rendering in the worker thread.\n * Cannot change canvas after worker instance is created with a different canvas.\n * @param canvas - HTMLCanvasElement or OffscreenCanvas to render to\n * @returns Promise that resolves when canvas has been set\n * @throws Error if canvas is not HTMLCanvasElement or OffscreenCanvas\n * @throws Error if trying to change canvas after instance is already created\n */\n public async setCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): Promise<void> {\n const isHTMLCanvas = typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement;\n const isOffscreenCanvas = typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas;\n\n if (!isHTMLCanvas && !isOffscreenCanvas) {\n throw new Error('Worker-based DotLottie requires HTMLCanvasElement or OffscreenCanvas');\n }\n\n if (this._canvas === canvas) return;\n\n if (this._created && this._canvas !== null) {\n throw new Error('Cannot change canvas after worker instance is already created with a different canvas.');\n }\n\n this._canvas = canvas;\n\n if (!this._created && this._pendingConfig) {\n await this._create(this._pendingConfig);\n this._pendingConfig = null;\n }\n }\n\n public get autoplay(): boolean {\n return this._dotLottieInstanceState.autoplay;\n }\n\n public get backgroundColor(): string {\n return this._dotLottieInstanceState.backgroundColor;\n }\n\n public get loop(): boolean {\n return this._dotLottieInstanceState.loop;\n }\n\n public get useFrameInterpolation(): boolean {\n return this._dotLottieInstanceState.useFrameInterpolation;\n }\n\n public get renderConfig(): RenderConfig {\n return this._dotLottieInstanceState.renderConfig;\n }\n\n public get manifest(): Manifest | null {\n return this._dotLottieInstanceState.manifest;\n }\n\n public get activeAnimationId(): string | undefined {\n return this._dotLottieInstanceState.activeAnimationId;\n }\n\n public get marker(): string | undefined {\n return this._dotLottieInstanceState.marker;\n }\n\n public get activeThemeId(): string | undefined {\n return this._dotLottieInstanceState.activeThemeId;\n }\n\n public get layout(): Layout | undefined {\n return this._dotLottieInstanceState.layout;\n }\n\n /**\n * Starts or resumes animation playback in the worker thread.\n * Updates the internal playback state (e.g., isPlaying) to reflect that playback has started.\n * @returns Promise that resolves when playback has started and state has been updated\n */\n public async play(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('play', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n\n /*\n Check if the canvas is offscreen and freezing is enabled\n If freezeOnOffscreen is true and the canvas is currently outside the viewport,\n we immediately freeze the animation to avoid unnecessary rendering and performance overhead.\n */\n if (\n IS_BROWSER &&\n this._canvas instanceof HTMLCanvasElement &&\n this._dotLottieInstanceState.renderConfig.freezeOnOffscreen &&\n !isElementInViewport(this._canvas)\n ) {\n await this.freeze();\n }\n }\n\n /**\n * Pauses animation playback in the worker thread.\n * Awaits worker response before resolving. Updates isPaused state to true.\n * @returns Promise that resolves when playback has paused\n */\n public async pause(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('pause', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Stops animation playback and resets to start frame in the worker thread.\n * Awaits worker response before resolving. Updates isStopped state to true.\n * @returns Promise that resolves when playback has stopped\n */\n public async stop(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('stop', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Changes the animation playback speed in the worker thread.\n * Awaits worker response before resolving.\n * @param speed - Playback speed multiplier (e.g., 2 for 2x speed, 0.5 for half speed)\n * @returns Promise that resolves when speed has been updated\n */\n public async setSpeed(speed: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setSpeed', { instanceId: this._id, speed });\n await this._updateDotLottieInstanceState();\n }\n\n public async setMode(mode: Mode): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setMode', { instanceId: this._id, mode });\n await this._updateDotLottieInstanceState();\n }\n\n public async setFrame(frame: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setFrame', { frame, instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setSegment(start: number, end: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setSegment', { instanceId: this._id, segment: [start, end] });\n await this._updateDotLottieInstanceState();\n }\n\n public async setRenderConfig(renderConfig: RenderConfig): Promise<void> {\n if (!this._created) return;\n\n const { devicePixelRatio, freezeOnOffscreen, quality, ...restConfig } = renderConfig;\n\n await this._sendMessage('setRenderConfig', {\n instanceId: this._id,\n renderConfig: {\n ...this._dotLottieInstanceState.renderConfig,\n ...restConfig,\n // devicePixelRatio is a special case, it should be set to the default value if it's not provided\n devicePixelRatio: devicePixelRatio || getDefaultDPR(),\n freezeOnOffscreen: freezeOnOffscreen ?? true,\n ...(quality !== undefined && { quality }),\n },\n });\n\n await this._updateDotLottieInstanceState();\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._dotLottieInstanceState.renderConfig.autoResize) {\n CanvasResizeObserver.observe(this._canvas, this);\n } else {\n CanvasResizeObserver.unobserve(this._canvas);\n }\n\n if (this._dotLottieInstanceState.renderConfig.freezeOnOffscreen) {\n OffscreenObserver.observe(this._canvas, this);\n\n // Check if canvas is currently offscreen and freeze if necessary\n if (!isElementInViewport(this._canvas)) {\n await this.freeze();\n }\n } else {\n OffscreenObserver.unobserve(this._canvas);\n // If the animation was previously frozen, we need to unfreeze it now\n // to ensure it resumes rendering when the canvas is back onscreen.\n if (this._dotLottieInstanceState.isFrozen) {\n await this.unfreeze();\n }\n }\n }\n }\n\n public async setUseFrameInterpolation(useFrameInterpolation: boolean): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setUseFrameInterpolation', { instanceId: this._id, useFrameInterpolation });\n await this._updateDotLottieInstanceState();\n }\n\n public async setTheme(themeId: string): Promise<boolean> {\n if (!this._created) return false;\n\n const result = this._sendMessage('setTheme', { instanceId: this._id, themeId });\n\n await this._updateDotLottieInstanceState();\n\n return result;\n }\n\n /**\n * Dynamically loads a new animation in the worker thread, replacing the current one.\n * Awaits worker response before resolving. Stops current playback and cleans up resources.\n * @param config - Configuration for the new animation (all Config properties except canvas)\n * @returns Promise that resolves when animation has been loaded\n */\n public async load(config: Omit<Config, 'canvas'>): Promise<void> {\n if (!this._created) {\n if (this._pendingConfig) {\n this._pendingConfig = {\n ...this._pendingConfig,\n ...config,\n };\n }\n\n return;\n }\n\n await this._sendMessage('load', { config, instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setLoop(loop: boolean): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setLoop', { instanceId: this._id, loop });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Sets the number of additional times to replay the animation after the first play in the worker thread.\n * Requires loop to be true. A value of 0 means infinite replays; a positive value n means\n * the animation plays a total of n + 1 times (initial play + n replays).\n * @param loopCount - Number of additional replays (0 = infinite, 1 = plays twice, 2 = plays three times, etc.)\n * @returns Promise that resolves when loopCount has been updated\n */\n public async setLoopCount(loopCount: number): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setLoopCount', { instanceId: this._id, loopCount });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Recalculates and updates canvas dimensions in the worker thread.\n * Awaits worker response before resolving. Call when canvas container size changes.\n * @returns Promise that resolves when resize has completed\n */\n public async resize(): Promise<void> {\n if (!this._created || !this._canvas) return;\n\n const { height, width } = getCanvasSize(\n this._canvas,\n this._dotLottieInstanceState.renderConfig.devicePixelRatio || getDefaultDPR(),\n );\n\n await this._sendMessage('resize', { height, instanceId: this._id, width });\n await this._updateDotLottieInstanceState();\n }\n\n /**\n * Cleans up and destroys the player instance in the worker thread, releasing resources.\n * Awaits worker response before resolving. Stops playback and removes event listeners.\n * @returns Promise that resolves when cleanup has completed\n */\n public async destroy(): Promise<void> {\n if (!this._created) return;\n\n this._created = false;\n\n await this._sendMessage('destroy', { instanceId: this._id });\n\n this._cleanupStateMachineListeners();\n\n DotLottieWorker._workerManager.unassignAnimationFromWorker(this._id);\n this._eventManager.removeAllEventListeners();\n\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n OffscreenObserver.unobserve(this._canvas);\n CanvasResizeObserver.unobserve(this._canvas);\n }\n }\n\n public async freeze(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('freeze', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async unfreeze(): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('unfreeze', { instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setBackgroundColor(backgroundColor: string): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setBackgroundColor', { instanceId: this._id, backgroundColor });\n await this._updateDotLottieInstanceState();\n }\n\n public async loadAnimation(animationId: string): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('loadAnimation', { animationId, instanceId: this._id });\n await this._updateDotLottieInstanceState();\n }\n\n public async setLayout(layout: Layout): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setLayout', { instanceId: this._id, layout });\n await this._updateDotLottieInstanceState();\n }\n\n // #region Slots API\n\n public async setSlots(slots: Record<string, unknown>): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setSlots', { instanceId: this._id, slots });\n }\n\n public async getSlotIds(): Promise<string[]> {\n if (!this._created) return [];\n\n return this._sendMessage('getSlotIds', { instanceId: this._id });\n }\n\n public async getSlotType(slotId: string): Promise<SlotType | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('getSlotType', { instanceId: this._id, slotId });\n }\n\n public async getSlot(slotId: string): Promise<unknown> {\n if (!this._created) return undefined;\n\n return this._sendMessage('getSlot', { instanceId: this._id, slotId });\n }\n\n public async getSlots(): Promise<Record<string, unknown>> {\n if (!this._created) return {};\n\n return this._sendMessage('getSlots', { instanceId: this._id });\n }\n\n public async setColorSlot(slotId: string, value: ColorSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setColorSlot', { instanceId: this._id, slotId, value });\n }\n\n public async setScalarSlot(slotId: string, value: ScalarSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setScalarSlot', { instanceId: this._id, slotId, value });\n }\n\n public async setVectorSlot(slotId: string, value: VectorSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setVectorSlot', { instanceId: this._id, slotId, value });\n }\n\n public async setGradientSlot(slotId: string, value: GradientSlotValue, colorStopCount: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setGradientSlot', { instanceId: this._id, slotId, value, colorStopCount });\n }\n\n public async setTextSlot(slotId: string, value: TextSlotValue): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setTextSlot', { instanceId: this._id, slotId, value });\n }\n\n public async resetSlot(slotId: string): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('resetSlot', { instanceId: this._id, slotId });\n }\n\n public async clearSlot(slotId: string): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('clearSlot', { instanceId: this._id, slotId });\n }\n\n public async resetSlots(): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('resetSlots', { instanceId: this._id });\n }\n\n public async clearSlots(): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('clearSlots', { instanceId: this._id });\n }\n\n // #endregion\n\n private async _updateDotLottieInstanceState(): Promise<void> {\n if (!this._created) return;\n\n const result = await this._sendMessage('getDotLottieInstanceState', { instanceId: this._id });\n\n this._dotLottieInstanceState = result.state;\n }\n\n public markers(): Marker[] {\n return this._dotLottieInstanceState.markers;\n }\n\n public async setMarker(marker: string): Promise<void> {\n if (!this._created) return;\n\n await this._sendMessage('setMarker', { instanceId: this._id, marker });\n await this._updateDotLottieInstanceState();\n }\n\n public async setThemeData(themeData: string): Promise<boolean> {\n if (!this._created) return false;\n\n const loaded = await this._sendMessage('setThemeData', { instanceId: this._id, themeData });\n\n await this._updateDotLottieInstanceState();\n\n return loaded;\n }\n\n public async setViewport(x: number, y: number, width: number, height: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setViewport', { x, y, width, height, instanceId: this._id });\n }\n\n public async animationSize(): Promise<{ height: number; width: number }> {\n if (!this._created) return { height: 0, width: 0 };\n\n return this._sendMessage('animationSize', { instanceId: this._id });\n }\n\n public async setTransform(transform: Transform): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('setTransform', { instanceId: this._id, transform });\n }\n\n public async getTransform(): Promise<Transform | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('getTransform', { instanceId: this._id });\n }\n\n private async _sendMessage<T extends keyof MethodParamsMap>(\n method: T,\n params: MethodParamsMap[T],\n transfer?: Transferable[],\n ): Promise<MethodResultMap[T]> {\n const rpcRequest: RpcRequest<T> = {\n id: `dotlottie-request-${generateUniqueId()}`,\n method,\n params,\n };\n\n this._worker.postMessage(rpcRequest, transfer || []);\n\n return new Promise((resolve, reject) => {\n const onMessage = (event: MessageEvent): void => {\n const rpcResponse: RpcResponse<T> = event.data;\n\n // Check if the response corresponds to the request\n if (rpcResponse.id === rpcRequest.id) {\n this._worker.removeEventListener('message', onMessage);\n\n if (rpcResponse.error) {\n reject(new Error(`Failed to execute method ${method}: ${rpcResponse.error}`));\n } else {\n resolve(rpcResponse.result);\n }\n }\n };\n\n this._worker.addEventListener('message', onMessage);\n });\n }\n\n public addEventListener<T extends EventType>(type: T, listener: EventListener<T>): void {\n this._eventManager.addEventListener(type, listener);\n }\n\n public removeEventListener<T extends EventType>(type: T, listener?: EventListener<T>): void {\n this._eventManager.removeEventListener(type, listener);\n }\n\n public static setWasmUrl(url: string): void {\n DotLottieWorker._wasmUrl = url;\n }\n\n /**\n * @experimental\n *\n * Register a custom font for use in animations in worker contexts\n * @param fontName - The name of the font to register\n * @param fontSource - Either a URL string to fetch the font, or ArrayBuffer/Uint8Array of font data\n * @returns Promise<boolean> - true if registration message was sent successfully\n */\n public static async registerFont(fontName: string, fontSource: string | ArrayBuffer | Uint8Array): Promise<boolean> {\n try {\n const id = generateUniqueId();\n\n DotLottieWorker._workerManager.broadcastMessage({\n id,\n method: 'registerFont',\n params: {\n fontName,\n fontSource,\n },\n });\n\n // Note: we can't easily wait for responses from all workers in a broadcast,\n // so we return true if the broadcast was sent successfully\n return true;\n } catch (error) {\n console.error(`Error broadcasting registerFont for \"${fontName}\":`, error);\n\n return false;\n }\n }\n\n /**\n * @experimental\n * Load a state machine by ID\n * @param stateMachineId - The ID of the state machine to load\n * @returns true if the state machine was loaded successfully\n */\n public async stateMachineLoad(stateMachineId: string): Promise<boolean> {\n if (!this._created) return false;\n\n const result = await this._sendMessage('stateMachineLoad', { instanceId: this._id, stateMachineId });\n\n await this._updateDotLottieInstanceState();\n\n return result;\n }\n\n /**\n * @experimental\n * Load a state machine from data string\n * @param stateMachineData - The state machine data as a string\n * @returns true if the state machine was loaded successfully\n */\n public async stateMachineLoadData(stateMachineData: string): Promise<boolean> {\n if (!this._created) return false;\n\n const result = await this._sendMessage('stateMachineLoadData', { instanceId: this._id, stateMachineData });\n\n await this._updateDotLottieInstanceState();\n\n return result;\n }\n\n /**\n * @experimental\n * Start the state machine\n * @returns true if the state machine was started successfully\n */\n public async stateMachineStart(): Promise<boolean> {\n if (!this._created) return false;\n\n const started = await this._sendMessage('stateMachineStart', { instanceId: this._id });\n\n if (started) {\n this._setupStateMachineListeners();\n await this._updateDotLottieInstanceState();\n }\n\n return started;\n }\n\n /**\n * @experimental\n * Stop the state machine\n * @returns true if the state machine was stopped successfully\n */\n public async stateMachineStop(): Promise<boolean> {\n if (!this._created) return false;\n\n this._cleanupStateMachineListeners();\n\n return this._sendMessage('stateMachineStop', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Set a numeric input value for the state machine\n * @param name - The name of the numeric input\n * @param value - The numeric value to set\n * @returns true if the input was set successfully\n */\n public async stateMachineSetNumericInput(name: string, value: number): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineSetNumericInput', { instanceId: this._id, name, value });\n }\n\n /**\n * @experimental\n * Set a boolean input value for the state machine\n * @param name - The name of the boolean input\n * @param value - The boolean value to set\n * @returns true if the input was set successfully\n */\n public async stateMachineSetBooleanInput(name: string, value: boolean): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineSetBooleanInput', { instanceId: this._id, name, value });\n }\n\n /**\n * @experimental\n * Set the state machine config\n * @param config - The state machine config\n */\n public async stateMachineSetConfig(config: StateMachineConfig | null): Promise<void> {\n if (!this._created) return;\n\n this._sendMessage('stateMachineSetConfig', { instanceId: this._id, config });\n }\n\n /**\n * @experimental\n * Set a string input value for the state machine\n * @param name - The name of the string input\n * @param value - The string value to set\n * @returns true if the input was set successfully\n */\n public async stateMachineSetStringInput(name: string, value: string): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineSetStringInput', { instanceId: this._id, name, value });\n }\n\n /**\n * @experimental\n * Get a numeric input value from the state machine\n * @param name - The name of the numeric input\n * @returns The numeric value or undefined if not found\n */\n public async stateMachineGetNumericInput(name: string): Promise<number | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetNumericInput', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get a boolean input value from the state machine\n * @param name - The name of the boolean input\n * @returns The boolean value or undefined if not found\n */\n public async stateMachineGetBooleanInput(name: string): Promise<boolean | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetBooleanInput', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get a string input value from the state machine\n * @param name - The name of the string input\n * @returns The string value or undefined if not found\n */\n public async stateMachineGetStringInput(name: string): Promise<string | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetStringInput', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get all inputs\n * @returns All input keys, followed by their type\n */\n public async stateMachineGetInputs(): Promise<string[] | undefined> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachineGetInputs', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Fire an event in the state machine\n * @param name - The name of the event to fire\n */\n public async stateMachineFireEvent(name: string): Promise<void> {\n if (!this._created) return;\n\n this._sendMessage('stateMachineFireEvent', { instanceId: this._id, name });\n }\n\n /**\n * @experimental\n * Get the current status of the state machine\n * @returns The current status of the state machine as a string\n */\n public async stateMachineGetStatus(): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGetStatus', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Get the current state of the state machine\n * @returns The current state of the state machine as a string\n */\n public async stateMachineGetCurrentState(): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGetCurrentState', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Get the active state machine ID\n * @returns The active state machine ID as a string\n */\n public async stateMachineGetActiveId(): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGetActiveId', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Override the current state of the state machine\n * @param state - The state to override to\n * @param immediate - Whether to immediately transition to the state\n * @returns true if the state override was successful\n */\n public async stateMachineOverrideState(state: string, immediate: boolean = false): Promise<boolean> {\n if (!this._created) return false;\n\n return this._sendMessage('stateMachineOverrideState', { instanceId: this._id, state, immediate });\n }\n\n /**\n * @experimental\n * Get a specific state machine by ID\n * @param stateMachineId - The ID of the state machine to get\n * @returns The state machine data as a string\n */\n public async stateMachineGet(stateMachineId: string): Promise<string> {\n if (!this._created) return '';\n\n return this._sendMessage('stateMachineGet', { instanceId: this._id, stateMachineId });\n }\n\n /**\n * @experimental\n * Get the list of state machine listeners\n * @returns Array of listener names\n */\n public async stateMachineGetListeners(): Promise<string[]> {\n if (!this._created) return [];\n\n return this._sendMessage('stateMachineGetListeners', { instanceId: this._id });\n }\n\n /**\n * @experimental\n * Post a click event to the state machine\n * @param x - The x coordinate of the click\n * @param y - The y coordinate of the click\n * @returns The event result or undefined\n */\n public async stateMachinePostClickEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostClickEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer up event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerUpEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerUpEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer down event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerDownEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerDownEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer move event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerMoveEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerMoveEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer enter event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerEnterEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerEnterEvent', { instanceId: this._id, x, y });\n }\n\n /**\n * @experimental\n * Post a pointer exit event to the state machine\n * @param x - The x coordinate of the pointer\n * @param y - The y coordinate of the pointer\n * @returns The event result or undefined\n */\n public async stateMachinePostPointerExitEvent(x: number, y: number): Promise<void> {\n if (!this._created) return undefined;\n\n return this._sendMessage('stateMachinePostPointerExitEvent', { instanceId: this._id, x, y });\n }\n\n private _onClick(event: MouseEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostClickEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerUp(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerUpEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerDown(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerDownEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerMove(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerMoveEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerEnter(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerEnterEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private _onPointerLeave(event: PointerEvent): void {\n const position = getPointerPosition(event);\n\n if (position) {\n this._sendMessage('stateMachinePostPointerExitEvent', { instanceId: this._id, x: position.x, y: position.y });\n }\n }\n\n private async _setupStateMachineListeners(): Promise<void> {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement && this.isLoaded) {\n const listeners = await this._sendMessage('stateMachineGetListeners', { instanceId: this._id });\n\n if (listeners.length === 0) {\n return;\n }\n\n // Clean up any existing listeners first\n this._cleanupStateMachineListeners();\n\n if (listeners.includes('Click')) {\n this._boundOnClick = this._onClick.bind(this);\n this._canvas.addEventListener('click', this._boundOnClick);\n }\n\n if (listeners.includes('PointerUp')) {\n this._boundOnPointerUp = this._onPointerUp.bind(this);\n this._canvas.addEventListener('pointerup', this._boundOnPointerUp);\n }\n\n if (listeners.includes('PointerDown')) {\n this._boundOnPointerDown = this._onPointerDown.bind(this);\n this._canvas.addEventListener('pointerdown', this._boundOnPointerDown);\n }\n\n if (listeners.includes('PointerMove')) {\n this._boundOnPointerMove = this._onPointerMove.bind(this);\n this._canvas.addEventListener('pointermove', this._boundOnPointerMove);\n }\n\n if (listeners.includes('PointerEnter')) {\n this._boundOnPointerEnter = this._onPointerEnter.bind(this);\n this._canvas.addEventListener('pointerenter', this._boundOnPointerEnter);\n }\n\n if (listeners.includes('PointerExit')) {\n this._boundOnPointerLeave = this._onPointerLeave.bind(this);\n this._canvas.addEventListener('pointerleave', this._boundOnPointerLeave);\n }\n }\n }\n\n private _cleanupStateMachineListeners(): void {\n if (IS_BROWSER && this._canvas instanceof HTMLCanvasElement) {\n if (this._boundOnClick) {\n this._canvas.removeEventListener('click', this._boundOnClick);\n this._boundOnClick = null;\n }\n if (this._boundOnPointerUp) {\n this._canvas.removeEventListener('pointerup', this._boundOnPointerUp);\n this._boundOnPointerUp = null;\n }\n if (this._boundOnPointerDown) {\n this._canvas.removeEventListener('pointerdown', this._boundOnPointerDown);\n this._boundOnPointerDown = null;\n }\n if (this._boundOnPointerMove) {\n this._canvas.removeEventListener('pointermove', this._boundOnPointerMove);\n this._boundOnPointerMove = null;\n }\n if (this._boundOnPointerEnter) {\n this._canvas.removeEventListener('pointerenter', this._boundOnPointerEnter);\n this._boundOnPointerEnter = null;\n }\n if (this._boundOnPointerLeave) {\n this._canvas.removeEventListener('pointerleave', this._boundOnPointerLeave);\n this._boundOnPointerLeave = null;\n }\n }\n }\n}\n"],"mappings":"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"}
|