@coppsary/motionly 1.0.0 → 1.0.2
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/README.md +6 -4
- package/dist/assets/index-bTggaIHQ.js +6 -0
- package/dist/assets/index-bTggaIHQ.js.map +1 -0
- package/dist/assets/index-uMHqBndL.js +16 -0
- package/dist/assets/index-uMHqBndL.js.map +1 -0
- package/dist/assets/main-BWhvHbtr.css +1 -0
- package/dist/assets/main-CrcFUwRU.js +2470 -0
- package/dist/assets/main-CrcFUwRU.js.map +1 -0
- package/dist/index.html +2 -2
- package/motionly-skills/AGENTS.md +20 -0
- package/motionly-skills/README.md +28 -0
- package/motionly-skills/llms.txt +16 -0
- package/motionly-skills/skills/animation/SKILL.md +73 -0
- package/motionly-skills/skills/animation/agents/openai.yaml +4 -0
- package/motionly-skills/skills/assets/SKILL.md +45 -0
- package/motionly-skills/skills/assets/agents/openai.yaml +4 -0
- package/motionly-skills/skills/camera/SKILL.md +57 -0
- package/motionly-skills/skills/camera/agents/openai.yaml +4 -0
- package/motionly-skills/skills/composition/SKILL.md +42 -0
- package/motionly-skills/skills/composition/agents/openai.yaml +4 -0
- package/motionly-skills/skills/easing/SKILL.md +44 -0
- package/motionly-skills/skills/easing/agents/openai.yaml +4 -0
- package/motionly-skills/skills/motion-dsl/SKILL.md +93 -0
- package/motionly-skills/skills/motion-dsl/agents/openai.yaml +4 -0
- package/motionly-skills/skills/rendering/SKILL.md +45 -0
- package/motionly-skills/skills/rendering/agents/openai.yaml +4 -0
- package/motionly-skills/skills/svg/SKILL.md +82 -0
- package/motionly-skills/skills/svg/agents/openai.yaml +4 -0
- package/motionly-skills/skills/templates/SKILL.md +51 -0
- package/motionly-skills/skills/templates/agents/openai.yaml +4 -0
- package/motionly-skills/skills/timeline/SKILL.md +57 -0
- package/motionly-skills/skills/timeline/agents/openai.yaml +4 -0
- package/motionly-skills/skills/transitions/SKILL.md +45 -0
- package/motionly-skills/skills/transitions/agents/openai.yaml +4 -0
- package/motionly-skills/skills/typography/SKILL.md +42 -0
- package/motionly-skills/skills/typography/agents/openai.yaml +4 -0
- package/package.json +6 -2
- package/templates/motionly-skill/SKILL.md +10 -1
- package/templates/project/AGENTS.md +2 -0
- package/dist/assets/main-C8oSjoH0.css +0 -1
- package/dist/assets/main-CQ2W0QKo.js +0 -2475
- package/dist/assets/main-CQ2W0QKo.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main-CQ2W0QKo.js","sources":["../../node_modules/@vercel/analytics/dist/index.mjs","../../node_modules/esm-env/false.js","../../node_modules/svelte/src/internal/shared/utils.js","../../node_modules/svelte/src/internal/client/constants.js","../../node_modules/svelte/src/internal/shared/errors.js","../../node_modules/svelte/src/internal/client/errors.js","../../node_modules/svelte/src/constants.js","../../node_modules/svelte/src/internal/client/warnings.js","../../node_modules/svelte/src/internal/client/reactivity/equality.js","../../node_modules/svelte/src/internal/flags/index.js","../../node_modules/svelte/src/internal/client/context.js","../../node_modules/svelte/src/internal/client/dom/task.js","../../node_modules/svelte/src/internal/client/error-handling.js","../../node_modules/svelte/src/internal/client/reactivity/status.js","../../node_modules/svelte/src/internal/client/reactivity/utils.js","../../node_modules/svelte/src/internal/client/reactivity/store.js","../../node_modules/svelte/src/reactivity/create-subscriber.js","../../node_modules/svelte/src/internal/client/dom/blocks/boundary.js","../../node_modules/svelte/src/internal/client/reactivity/async.js","../../node_modules/svelte/src/internal/client/reactivity/deriveds.js","../../node_modules/svelte/src/internal/client/reactivity/batch.js","../../node_modules/svelte/src/internal/client/reactivity/sources.js","../../node_modules/svelte/src/internal/client/proxy.js","../../node_modules/svelte/src/internal/client/dom/operations.js","../../node_modules/svelte/src/internal/client/dom/elements/misc.js","../../node_modules/svelte/src/internal/client/dom/elements/bindings/shared.js","../../node_modules/svelte/src/internal/client/reactivity/effects.js","../../node_modules/svelte/src/internal/client/legacy.js","../../node_modules/svelte/src/internal/client/runtime.js","../../node_modules/svelte/src/utils.js","../../node_modules/svelte/src/internal/client/dom/elements/events.js","../../node_modules/svelte/src/internal/client/dom/reconciler.js","../../node_modules/svelte/src/internal/client/dom/template.js","../../node_modules/svelte/src/internal/client/render.js","../../node_modules/svelte/src/internal/client/dom/blocks/branches.js","../../node_modules/svelte/src/internal/client/dom/blocks/if.js","../../node_modules/svelte/src/internal/client/dom/blocks/key.js","../../node_modules/svelte/src/internal/client/dom/blocks/each.js","../../node_modules/svelte/src/internal/client/dom/blocks/slot.js","../../node_modules/svelte/src/internal/client/dom/blocks/svelte-element.js","../../node_modules/svelte/src/internal/client/dom/elements/attachments.js","../../node_modules/clsx/dist/clsx.mjs","../../node_modules/svelte/src/internal/shared/attributes.js","../../node_modules/svelte/src/internal/client/dom/elements/class.js","../../node_modules/svelte/src/internal/client/dom/elements/style.js","../../node_modules/svelte/src/internal/client/dom/elements/bindings/select.js","../../node_modules/svelte/src/internal/client/dom/elements/attributes.js","../../node_modules/svelte/src/internal/client/dom/elements/bindings/input.js","../../node_modules/svelte/src/internal/client/dom/elements/bindings/props.js","../../node_modules/svelte/src/internal/client/dom/elements/bindings/this.js","../../node_modules/svelte/src/internal/client/dom/legacy/event-modifiers.js","../../node_modules/svelte/src/internal/client/dom/legacy/lifecycle.js","../../node_modules/svelte/src/internal/client/dom/legacy/misc.js","../../node_modules/svelte/src/internal/client/reactivity/props.js","../../node_modules/svelte/src/index-client.js","../../src/app/routing.ts","../../node_modules/svelte/src/version.js","../../node_modules/svelte/src/internal/disclose-version.js","../../node_modules/svelte/src/internal/flags/legacy.js","../../node_modules/lucide-svelte/dist/defaultAttributes.js","../../node_modules/lucide-svelte/dist/utils/hasA11yProp.js","../../node_modules/lucide-svelte/dist/utils/mergeClasses.js","../../node_modules/lucide-svelte/dist/Icon.svelte","../../node_modules/lucide-svelte/dist/icons/align-horizontal-justify-center.svelte","../../node_modules/lucide-svelte/dist/icons/align-horizontal-justify-end.svelte","../../node_modules/lucide-svelte/dist/icons/align-horizontal-justify-start.svelte","../../node_modules/lucide-svelte/dist/icons/align-vertical-justify-center.svelte","../../node_modules/lucide-svelte/dist/icons/align-vertical-justify-end.svelte","../../node_modules/lucide-svelte/dist/icons/align-vertical-justify-start.svelte","../../node_modules/lucide-svelte/dist/icons/arrow-right.svelte","../../node_modules/lucide-svelte/dist/icons/book-open.svelte","../../node_modules/lucide-svelte/dist/icons/bot.svelte","../../node_modules/lucide-svelte/dist/icons/circle-question-mark.svelte","../../node_modules/lucide-svelte/dist/icons/download.svelte","../../node_modules/lucide-svelte/dist/icons/eye-off.svelte","../../node_modules/lucide-svelte/dist/icons/eye.svelte","../../node_modules/lucide-svelte/dist/icons/file-code.svelte","../../node_modules/lucide-svelte/dist/icons/file-image.svelte","../../node_modules/lucide-svelte/dist/icons/file-text.svelte","../../node_modules/lucide-svelte/dist/icons/folder-open.svelte","../../node_modules/lucide-svelte/dist/icons/headphones.svelte","../../node_modules/lucide-svelte/dist/icons/layers.svelte","../../node_modules/lucide-svelte/dist/icons/magnet.svelte","../../node_modules/lucide-svelte/dist/icons/maximize-2.svelte","../../node_modules/lucide-svelte/dist/icons/minus.svelte","../../node_modules/lucide-svelte/dist/icons/music-2.svelte","../../node_modules/lucide-svelte/dist/icons/panel-left-close.svelte","../../node_modules/lucide-svelte/dist/icons/pause.svelte","../../node_modules/lucide-svelte/dist/icons/play.svelte","../../node_modules/lucide-svelte/dist/icons/plus.svelte","../../node_modules/lucide-svelte/dist/icons/redo-2.svelte","../../node_modules/lucide-svelte/dist/icons/save.svelte","../../node_modules/lucide-svelte/dist/icons/scissors.svelte","../../node_modules/lucide-svelte/dist/icons/send.svelte","../../node_modules/lucide-svelte/dist/icons/settings.svelte","../../node_modules/lucide-svelte/dist/icons/skip-back.svelte","../../node_modules/lucide-svelte/dist/icons/sparkles.svelte","../../node_modules/lucide-svelte/dist/icons/square.svelte","../../node_modules/lucide-svelte/dist/icons/star.svelte","../../node_modules/lucide-svelte/dist/icons/trash-2.svelte","../../node_modules/lucide-svelte/dist/icons/type.svelte","../../node_modules/lucide-svelte/dist/icons/undo-2.svelte","../../node_modules/lucide-svelte/dist/icons/upload.svelte","../../node_modules/lucide-svelte/dist/icons/video.svelte","../../node_modules/lucide-svelte/dist/icons/volume-2.svelte","../../node_modules/lucide-svelte/dist/icons/volume-x.svelte","../../node_modules/lucide-svelte/dist/icons/wand-sparkles.svelte","../../node_modules/lucide-svelte/dist/icons/x.svelte","../../src/assets/asset-resolution.ts","../../src/ai/chat.ts","../../src/ui/Onboarding.svelte","../../src/language/ast.ts","../../src/language/tokenizer.ts","../../src/language/parser.ts","../../src/core/color.ts","../../src/core/units.ts","../../src/scene/properties.ts","../../src/animation-library/preset-parser.ts","../../src/animation-library/count-up.ts","../../src/animation-library/presets.ts","../../src/scene/scene-graph.ts","../../node_modules/gsap/gsap-core.js","../../node_modules/gsap/CSSPlugin.js","../../node_modules/gsap/index.js","../../src/core/easing.ts","../../src/core/interpolate.ts","../../src/animation/evaluator.ts","../../src/assets/asset-loader.ts","../../src/render/canvas-renderer.ts","../../src/export/exporter.ts","../../src/language/serializer.ts","../../src/ui/timeline-lanes.ts","../../src/ui/canvas-geometry.ts","../../src/ui/keyframe-editing.ts","../../src/ui/clip-timing.ts","../../src/ui/clip-transitions.ts","../../src/ui/element-clips.ts","../../src/ui/editor-history.ts","../../src/ui/timeline-tracks.ts","../../src/ui/timeline-viewport.ts","../../src/ai/config.ts","../../src/ui/components/AiChatPanel.svelte","../../src/ui/components/AiConfigPanel.svelte","../../src/ui/components/BrandConfigPanel.svelte","../../src/ui/components/MotionEditor.svelte","../../src/ui/MotionlyApp.svelte","../../src/main.ts"],"sourcesContent":["// src/queue.ts\nvar initQueue = () => {\n if (window.va) return;\n window.va = function a(...params) {\n if (!window.vaq) window.vaq = [];\n window.vaq.push(params);\n };\n};\n\n// package.json\nvar name = \"@vercel/analytics\";\nvar version = \"2.0.1\";\n\n// src/utils.ts\nfunction isBrowser() {\n return typeof window !== \"undefined\";\n}\nfunction detectEnvironment() {\n try {\n const env = process.env.NODE_ENV;\n if (env === \"development\" || env === \"test\") {\n return \"development\";\n }\n } catch {\n }\n return \"production\";\n}\nfunction setMode(mode = \"auto\") {\n if (mode === \"auto\") {\n window.vam = detectEnvironment();\n return;\n }\n window.vam = mode;\n}\nfunction getMode() {\n const mode = isBrowser() ? window.vam : detectEnvironment();\n return mode || \"production\";\n}\nfunction isProduction() {\n return getMode() === \"production\";\n}\nfunction isDevelopment() {\n return getMode() === \"development\";\n}\nfunction removeKey(key, { [key]: _, ...rest }) {\n return rest;\n}\nfunction parseProperties(properties, options) {\n if (!properties) return void 0;\n let props = properties;\n const errorProperties = [];\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === \"object\" && value !== null) {\n if (options.strip) {\n props = removeKey(key, props);\n } else {\n errorProperties.push(key);\n }\n }\n }\n if (errorProperties.length > 0 && !options.strip) {\n throw Error(\n `The following properties are not valid: ${errorProperties.join(\n \", \"\n )}. Only strings, numbers, booleans, and null are allowed.`\n );\n }\n return props;\n}\nfunction computeRoute(pathname, pathParams) {\n if (!pathname || !pathParams) {\n return pathname;\n }\n let result = pathname;\n try {\n const entries = Object.entries(pathParams);\n for (const [key, value] of entries) {\n if (!Array.isArray(value)) {\n const matcher = turnValueToRegExp(value);\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[${key}]`);\n }\n }\n }\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n const matcher = turnValueToRegExp(value.join(\"/\"));\n if (matcher.test(result)) {\n result = result.replace(matcher, `/[...${key}]`);\n }\n }\n }\n return result;\n } catch {\n return pathname;\n }\n}\nfunction turnValueToRegExp(value) {\n return new RegExp(`/${escapeRegExp(value)}(?=[/?#]|$)`);\n}\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\nfunction getScriptSrc(props) {\n if (props.scriptSrc) {\n return makeAbsolute(props.scriptSrc);\n }\n if (isDevelopment()) {\n return \"https://va.vercel-scripts.com/v1/script.debug.js\";\n }\n if (props.basePath) {\n return makeAbsolute(`${props.basePath}/insights/script.js`);\n }\n return \"/_vercel/insights/script.js\";\n}\nfunction loadProps(explicitProps, confString) {\n var _a;\n let props = explicitProps;\n if (confString) {\n try {\n props = {\n ...(_a = JSON.parse(confString)) == null ? void 0 : _a.analytics,\n ...explicitProps\n };\n } catch {\n }\n }\n setMode(props.mode);\n const dataset = {\n sdkn: name + (props.framework ? `/${props.framework}` : \"\"),\n sdkv: version\n };\n if (props.disableAutoTrack) {\n dataset.disableAutoTrack = \"1\";\n }\n if (props.viewEndpoint) {\n dataset.viewEndpoint = makeAbsolute(props.viewEndpoint);\n }\n if (props.eventEndpoint) {\n dataset.eventEndpoint = makeAbsolute(props.eventEndpoint);\n }\n if (props.sessionEndpoint) {\n dataset.sessionEndpoint = makeAbsolute(props.sessionEndpoint);\n }\n if (isDevelopment() && props.debug === false) {\n dataset.debug = \"false\";\n }\n if (props.dsn) {\n dataset.dsn = props.dsn;\n }\n if (props.endpoint) {\n dataset.endpoint = props.endpoint;\n } else if (props.basePath) {\n dataset.endpoint = makeAbsolute(`${props.basePath}/insights`);\n }\n return {\n beforeSend: props.beforeSend,\n src: getScriptSrc(props),\n dataset\n };\n}\nfunction makeAbsolute(url) {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"/\") ? url : `/${url}`;\n}\n\n// src/generic.ts\nfunction inject(props = {\n debug: true\n}, confString) {\n var _a;\n if (!isBrowser()) return;\n const { beforeSend, src, dataset } = loadProps(props, confString);\n initQueue();\n if (beforeSend) {\n (_a = window.va) == null ? void 0 : _a.call(window, \"beforeSend\", beforeSend);\n }\n if (document.head.querySelector(`script[src*=\"${src}\"]`)) return;\n const script = document.createElement(\"script\");\n script.src = src;\n for (const [key, value] of Object.entries(dataset)) {\n script.dataset[key] = value;\n }\n script.defer = true;\n script.onerror = () => {\n const errorMessage = isDevelopment() ? \"Please check if any ad blockers are enabled and try again.\" : \"Be sure to enable Web Analytics for your project and deploy again. See https://vercel.com/docs/analytics/quickstart for more information.\";\n console.log(\n `[Vercel Web Analytics] Failed to load script from ${src}. ${errorMessage}`\n );\n };\n document.head.appendChild(script);\n}\nfunction track(name2, properties, options) {\n var _a, _b;\n if (!isBrowser()) {\n const msg = \"[Vercel Web Analytics] Please import `track` from `@vercel/analytics/server` when using this function in a server environment\";\n if (isProduction()) {\n console.warn(msg);\n } else {\n throw new Error(msg);\n }\n return;\n }\n if (!properties) {\n (_a = window.va) == null ? void 0 : _a.call(window, \"event\", { name: name2, options });\n return;\n }\n try {\n const props = parseProperties(properties, {\n strip: isProduction()\n });\n (_b = window.va) == null ? void 0 : _b.call(window, \"event\", {\n name: name2,\n data: props,\n options\n });\n } catch (err) {\n if (err instanceof Error && isDevelopment()) {\n console.error(err);\n }\n }\n}\nfunction pageview({\n route,\n path\n}) {\n var _a;\n (_a = window.va) == null ? void 0 : _a.call(window, \"pageview\", { route, path });\n}\nvar generic_default = {\n inject,\n track,\n computeRoute\n};\nexport {\n computeRoute,\n generic_default as default,\n inject,\n pageview,\n track\n};\n//# sourceMappingURL=index.mjs.map","export default false;\n","// Store the references to globals in case someone tries to monkey patch these, causing the below\n// to de-opt (this occurs often when using popular extensions).\nexport var is_array = Array.isArray;\nexport var index_of = Array.prototype.indexOf;\nexport var includes = Array.prototype.includes;\nexport var array_from = Array.from;\nexport var object_keys = Object.keys;\nexport var define_property = Object.defineProperty;\nexport var get_descriptor = Object.getOwnPropertyDescriptor;\nexport var get_descriptors = Object.getOwnPropertyDescriptors;\nexport var object_prototype = Object.prototype;\nexport var array_prototype = Array.prototype;\nexport var get_prototype_of = Object.getPrototypeOf;\nexport var is_extensible = Object.isExtensible;\nexport var has_own_property = Object.prototype.hasOwnProperty;\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\nexport const noop = () => {};\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n\n/**\n * @template [T=any]\n * @param {any} value\n * @returns {value is PromiseLike<T>}\n */\nexport function is_promise(value) {\n\treturn typeof value?.then === 'function';\n}\n\n/** @param {Function} fn */\nexport function run(fn) {\n\treturn fn();\n}\n\n/** @param {Array<() => void>} arr */\nexport function run_all(arr) {\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tarr[i]();\n\t}\n}\n\n/**\n * TODO replace with Promise.withResolvers once supported widely enough\n * @template [T=void]\n */\nexport function deferred() {\n\t/** @type {(value: T) => void} */\n\tvar resolve;\n\n\t/** @type {(reason: any) => void} */\n\tvar reject;\n\n\t/** @type {Promise<T>} */\n\tvar promise = new Promise((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\n\t// @ts-expect-error\n\treturn { promise, resolve, reject };\n}\n\n/**\n * @template V\n * @param {V} value\n * @param {V | (() => V)} fallback\n * @param {boolean} [lazy]\n * @returns {V}\n */\nexport function fallback(value, fallback, lazy = false) {\n\treturn value === undefined\n\t\t? lazy\n\t\t\t? /** @type {() => V} */ (fallback)()\n\t\t\t: /** @type {V} */ (fallback)\n\t\t: value;\n}\n\n/**\n * When encountering a situation like `let [a, b, c] = $derived(blah())`,\n * we need to stash an intermediate value that `a`, `b`, and `c` derive\n * from, in case it's an iterable\n * @template T\n * @param {ArrayLike<T> | Iterable<T>} value\n * @param {number} [n]\n * @returns {Array<T>}\n */\nexport function to_array(value, n) {\n\t// return arrays unchanged\n\tif (Array.isArray(value)) {\n\t\treturn value;\n\t}\n\n\t// if value is not iterable, or `n` is unspecified (indicates a rest\n\t// element, which means we're not concerned about unbounded iterables)\n\t// convert to an array with `Array.from`\n\tif (n === undefined || !(Symbol.iterator in value)) {\n\t\treturn Array.from(value);\n\t}\n\n\t// otherwise, populate an array with `n` values\n\n\t/** @type {T[]} */\n\tconst array = [];\n\n\tfor (const element of value) {\n\t\tarray.push(element);\n\t\tif (array.length === n) break;\n\t}\n\n\treturn array;\n}\n\n/**\n * @param {Record<string | symbol, unknown>} obj\n * @param {Array<string | symbol>} keys\n * @returns {Record<string | symbol, unknown>}\n */\nexport function exclude_from_object(obj, keys) {\n\t/** @type {Record<string | symbol, unknown>} */\n\tvar result = {};\n\n\tfor (var key in obj) {\n\t\tif (!keys.includes(key)) {\n\t\t\tresult[key] = obj[key];\n\t\t}\n\t}\n\n\tfor (var symbol of Object.getOwnPropertySymbols(obj)) {\n\t\tif (Object.propertyIsEnumerable.call(obj, symbol) && !keys.includes(symbol)) {\n\t\t\tresult[symbol] = obj[symbol];\n\t\t}\n\t}\n\n\treturn result;\n}\n","// General flags\nexport const DERIVED = 1 << 1;\nexport const EFFECT = 1 << 2;\nexport const RENDER_EFFECT = 1 << 3;\n/**\n * An effect that does not destroy its child effects when it reruns.\n * Runs as part of render effects, i.e. not eagerly as part of tree traversal or effect flushing.\n */\nexport const MANAGED_EFFECT = 1 << 24;\n/**\n * An effect that does not destroy its child effects when it reruns (like MANAGED_EFFECT).\n * Runs eagerly as part of tree traversal or effect flushing.\n */\nexport const BLOCK_EFFECT = 1 << 4;\nexport const BRANCH_EFFECT = 1 << 5;\nexport const ROOT_EFFECT = 1 << 6;\nexport const BOUNDARY_EFFECT = 1 << 7;\n/**\n * Indicates that a reaction is connected to an effect root — either it is an effect,\n * or it is a derived that is depended on by at least one effect. If a derived has\n * no dependents, we can disconnect it from the graph, allowing it to either be\n * GC'd or reconnected later if an effect comes to depend on it again\n */\nexport const CONNECTED = 1 << 9;\nexport const CLEAN = 1 << 10;\nexport const DIRTY = 1 << 11;\nexport const MAYBE_DIRTY = 1 << 12;\nexport const INERT = 1 << 13;\nexport const DESTROYED = 1 << 14;\n/** Set once a reaction has run for the first time */\nexport const REACTION_RAN = 1 << 15;\n/** Effect is in the process of getting destroyed. Can be observed in child teardown functions */\nexport const DESTROYING = 1 << 25;\n\n// Flags exclusive to effects\n/**\n * 'Transparent' effects do not create a transition boundary.\n * This is on a block effect 99% of the time but may also be on a branch effect if its parent block effect was pruned\n */\nexport const EFFECT_TRANSPARENT = 1 << 16;\nexport const EAGER_EFFECT = 1 << 17;\nexport const HEAD_EFFECT = 1 << 18;\nexport const EFFECT_PRESERVED = 1 << 19;\nexport const USER_EFFECT = 1 << 20;\nexport const EFFECT_OFFSCREEN = 1 << 25;\n\n// Flags exclusive to deriveds\n/**\n * Tells that we marked this derived and its reactions as visited during the \"mark as (maybe) dirty\"-phase.\n * Will be lifted during execution of the derived and during checking its dirty state (both are necessary\n * because a derived might be checked but not executed). This is a pure performance optimization flag and\n * should not be used for any other purpose!\n */\nexport const WAS_MARKED = 1 << 16;\n\n// Flags used for async\nexport const REACTION_IS_UPDATING = 1 << 21;\nexport const ASYNC = 1 << 22;\n\nexport const ERROR_VALUE = 1 << 23;\n\nexport const STATE_SYMBOL = Symbol('$state');\nexport const LEGACY_PROPS = Symbol('legacy props');\nexport const LOADING_ATTR_SYMBOL = Symbol('');\nexport const PROXY_PATH_SYMBOL = Symbol('proxy path');\nexport const ATTRIBUTES_CACHE = Symbol('attributes');\nexport const CLASS_CACHE = Symbol('class');\nexport const STYLE_CACHE = Symbol('style');\nexport const TEXT_CACHE = Symbol('text');\nexport const FORM_RESET_HANDLER = Symbol('form reset');\n/** An anchor might change, via this symbol on the original anchor we can tell HMR about the updated anchor */\nexport const HMR_ANCHOR = Symbol('hmr anchor');\n\n/** allow users to ignore aborted signal errors if `reason.name === 'StaleReactionError` */\nexport const STALE_REACTION = new (class StaleReactionError extends Error {\n\tname = 'StaleReactionError';\n\tmessage = 'The reaction that called `getAbortSignal()` was re-run or destroyed';\n})();\n\nexport const IS_XHTML =\n\t// We gotta write it like this because after downleveling the pure comment may end up in the wrong location\n\t!!globalThis.document?.contentType &&\n\t/* @__PURE__ */ globalThis.document.contentType.includes('xml');\nexport const ELEMENT_NODE = 1;\nexport const TEXT_NODE = 3;\nexport const COMMENT_NODE = 8;\nexport const DOCUMENT_FRAGMENT_NODE = 11;\n","/* This file is generated by scripts/process-messages/index.js. Do not edit! */\n\nimport { DEV } from 'esm-env';\n\n/**\n * Cannot use `%name%(...)` unless the `experimental.async` compiler option is `true`\n * @param {string} name\n * @returns {never}\n */\nexport function experimental_async_required(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`experimental_async_required\\nCannot use \\`${name}(...)\\` unless the \\`experimental.async\\` compiler option is \\`true\\`\\nhttps://svelte.dev/e/experimental_async_required`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/experimental_async_required`);\n\t}\n}\n\n/**\n * Cannot use `{@render children(...)}` if the parent component uses `let:` directives. Consider using a named snippet instead\n * @returns {never}\n */\nexport function invalid_default_snippet() {\n\tif (DEV) {\n\t\tconst error = new Error(`invalid_default_snippet\\nCannot use \\`{@render children(...)}\\` if the parent component uses \\`let:\\` directives. Consider using a named snippet instead\\nhttps://svelte.dev/e/invalid_default_snippet`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/invalid_default_snippet`);\n\t}\n}\n\n/**\n * A snippet function was passed invalid arguments. Snippets should only be instantiated via `{@render ...}`\n * @returns {never}\n */\nexport function invalid_snippet_arguments() {\n\tif (DEV) {\n\t\tconst error = new Error(`invalid_snippet_arguments\\nA snippet function was passed invalid arguments. Snippets should only be instantiated via \\`{@render ...}\\`\\nhttps://svelte.dev/e/invalid_snippet_arguments`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/invalid_snippet_arguments`);\n\t}\n}\n\n/**\n * An invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app — please open an issue at https://github.com/sveltejs/svelte, citing the following message: \"%message%\"\n * @param {string} message\n * @returns {never}\n */\nexport function invariant_violation(message) {\n\tif (DEV) {\n\t\tconst error = new Error(`invariant_violation\\nAn invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app — please open an issue at https://github.com/sveltejs/svelte, citing the following message: \"${message}\"\\nhttps://svelte.dev/e/invariant_violation`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/invariant_violation`);\n\t}\n}\n\n/**\n * `%name%(...)` can only be used during component initialisation\n * @param {string} name\n * @returns {never}\n */\nexport function lifecycle_outside_component(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`lifecycle_outside_component\\n\\`${name}(...)\\` can only be used during component initialisation\\nhttps://svelte.dev/e/lifecycle_outside_component`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/lifecycle_outside_component`);\n\t}\n}\n\n/**\n * Context was not set in a parent component\n * @returns {never}\n */\nexport function missing_context() {\n\tif (DEV) {\n\t\tconst error = new Error(`missing_context\\nContext was not set in a parent component\\nhttps://svelte.dev/e/missing_context`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/missing_context`);\n\t}\n}\n\n/**\n * Attempted to render a snippet without a `{@render}` block. This would cause the snippet code to be stringified instead of its content being rendered to the DOM. To fix this, change `{snippet}` to `{@render snippet()}`.\n * @returns {never}\n */\nexport function snippet_without_render_tag() {\n\tif (DEV) {\n\t\tconst error = new Error(`snippet_without_render_tag\\nAttempted to render a snippet without a \\`{@render}\\` block. This would cause the snippet code to be stringified instead of its content being rendered to the DOM. To fix this, change \\`{snippet}\\` to \\`{@render snippet()}\\`.\\nhttps://svelte.dev/e/snippet_without_render_tag`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/snippet_without_render_tag`);\n\t}\n}\n\n/**\n * `%name%` is not a store with a `subscribe` method\n * @param {string} name\n * @returns {never}\n */\nexport function store_invalid_shape(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`store_invalid_shape\\n\\`${name}\\` is not a store with a \\`subscribe\\` method\\nhttps://svelte.dev/e/store_invalid_shape`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/store_invalid_shape`);\n\t}\n}\n\n/**\n * The `this` prop on `<svelte:element>` must be a string, if defined\n * @returns {never}\n */\nexport function svelte_element_invalid_this_value() {\n\tif (DEV) {\n\t\tconst error = new Error(`svelte_element_invalid_this_value\\nThe \\`this\\` prop on \\`<svelte:element>\\` must be a string, if defined\\nhttps://svelte.dev/e/svelte_element_invalid_this_value`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/svelte_element_invalid_this_value`);\n\t}\n}","/* This file is generated by scripts/process-messages/index.js. Do not edit! */\n\nimport { DEV } from 'esm-env';\n\nexport * from '../shared/errors.js';\n\n/**\n * Cannot create a `$derived(...)` with an `await` expression outside of an effect tree\n * @returns {never}\n */\nexport function async_derived_orphan() {\n\tif (DEV) {\n\t\tconst error = new Error(`async_derived_orphan\\nCannot create a \\`$derived(...)\\` with an \\`await\\` expression outside of an effect tree\\nhttps://svelte.dev/e/async_derived_orphan`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/async_derived_orphan`);\n\t}\n}\n\n/**\n * Using `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\n * @returns {never}\n */\nexport function bind_invalid_checkbox_value() {\n\tif (DEV) {\n\t\tconst error = new Error(`bind_invalid_checkbox_value\\nUsing \\`bind:value\\` together with a checkbox input is not allowed. Use \\`bind:checked\\` instead\\nhttps://svelte.dev/e/bind_invalid_checkbox_value`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/bind_invalid_checkbox_value`);\n\t}\n}\n\n/**\n * Component %component% has an export named `%key%` that a consumer component is trying to access using `bind:%key%`, which is disallowed. Instead, use `bind:this` (e.g. `<%name% bind:this={component} />`) and then access the property on the bound component instance (e.g. `component.%key%`)\n * @param {string} component\n * @param {string} key\n * @param {string} name\n * @returns {never}\n */\nexport function bind_invalid_export(component, key, name) {\n\tif (DEV) {\n\t\tconst error = new Error(`bind_invalid_export\\nComponent ${component} has an export named \\`${key}\\` that a consumer component is trying to access using \\`bind:${key}\\`, which is disallowed. Instead, use \\`bind:this\\` (e.g. \\`<${name} bind:this={component} />\\`) and then access the property on the bound component instance (e.g. \\`component.${key}\\`)\\nhttps://svelte.dev/e/bind_invalid_export`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/bind_invalid_export`);\n\t}\n}\n\n/**\n * A component is attempting to bind to a non-bindable property `%key%` belonging to %component% (i.e. `<%name% bind:%key%={...}>`). To mark a property as bindable: `let { %key% = $bindable() } = $props()`\n * @param {string} key\n * @param {string} component\n * @param {string} name\n * @returns {never}\n */\nexport function bind_not_bindable(key, component, name) {\n\tif (DEV) {\n\t\tconst error = new Error(`bind_not_bindable\\nA component is attempting to bind to a non-bindable property \\`${key}\\` belonging to ${component} (i.e. \\`<${name} bind:${key}={...}>\\`). To mark a property as bindable: \\`let { ${key} = $bindable() } = $props()\\`\\nhttps://svelte.dev/e/bind_not_bindable`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/bind_not_bindable`);\n\t}\n}\n\n/**\n * Calling `%method%` on a component instance (of %component%) is no longer valid in Svelte 5\n * @param {string} method\n * @param {string} component\n * @returns {never}\n */\nexport function component_api_changed(method, component) {\n\tif (DEV) {\n\t\tconst error = new Error(`component_api_changed\\nCalling \\`${method}\\` on a component instance (of ${component}) is no longer valid in Svelte 5\\nhttps://svelte.dev/e/component_api_changed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/component_api_changed`);\n\t}\n}\n\n/**\n * Attempted to instantiate %component% with `new %name%`, which is no longer valid in Svelte 5. If this component is not under your control, set the `compatibility.componentApi` compiler option to `4` to keep it working.\n * @param {string} component\n * @param {string} name\n * @returns {never}\n */\nexport function component_api_invalid_new(component, name) {\n\tif (DEV) {\n\t\tconst error = new Error(`component_api_invalid_new\\nAttempted to instantiate ${component} with \\`new ${name}\\`, which is no longer valid in Svelte 5. If this component is not under your control, set the \\`compatibility.componentApi\\` compiler option to \\`4\\` to keep it working.\\nhttps://svelte.dev/e/component_api_invalid_new`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/component_api_invalid_new`);\n\t}\n}\n\n/**\n * A derived value cannot reference itself recursively\n * @returns {never}\n */\nexport function derived_references_self() {\n\tif (DEV) {\n\t\tconst error = new Error(`derived_references_self\\nA derived value cannot reference itself recursively\\nhttps://svelte.dev/e/derived_references_self`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/derived_references_self`);\n\t}\n}\n\n/**\n * Keyed each block has duplicate key `%value%` at indexes %a% and %b%\n * @param {string} a\n * @param {string} b\n * @param {string | undefined | null} [value]\n * @returns {never}\n */\nexport function each_key_duplicate(a, b, value) {\n\tif (DEV) {\n\t\tconst error = new Error(`each_key_duplicate\\n${value\n\t\t\t? `Keyed each block has duplicate key \\`${value}\\` at indexes ${a} and ${b}`\n\t\t\t: `Keyed each block has duplicate key at indexes ${a} and ${b}`}\\nhttps://svelte.dev/e/each_key_duplicate`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/each_key_duplicate`);\n\t}\n}\n\n/**\n * Keyed each block has key that is not idempotent — the key for item at index %index% was `%a%` but is now `%b%`. Keys must be the same each time for a given item\n * @param {string} index\n * @param {string} a\n * @param {string} b\n * @returns {never}\n */\nexport function each_key_volatile(index, a, b) {\n\tif (DEV) {\n\t\tconst error = new Error(`each_key_volatile\\nKeyed each block has key that is not idempotent — the key for item at index ${index} was \\`${a}\\` but is now \\`${b}\\`. Keys must be the same each time for a given item\\nhttps://svelte.dev/e/each_key_volatile`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/each_key_volatile`);\n\t}\n}\n\n/**\n * `%rune%` cannot be used inside an effect cleanup function\n * @param {string} rune\n * @returns {never}\n */\nexport function effect_in_teardown(rune) {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_in_teardown\\n\\`${rune}\\` cannot be used inside an effect cleanup function\\nhttps://svelte.dev/e/effect_in_teardown`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_in_teardown`);\n\t}\n}\n\n/**\n * Effect cannot be created inside a `$derived` value that was not itself created inside an effect\n * @returns {never}\n */\nexport function effect_in_unowned_derived() {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_in_unowned_derived\\nEffect cannot be created inside a \\`$derived\\` value that was not itself created inside an effect\\nhttps://svelte.dev/e/effect_in_unowned_derived`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_in_unowned_derived`);\n\t}\n}\n\n/**\n * `%rune%` can only be used inside an effect (e.g. during component initialisation)\n * @param {string} rune\n * @returns {never}\n */\nexport function effect_orphan(rune) {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_orphan\\n\\`${rune}\\` can only be used inside an effect (e.g. during component initialisation)\\nhttps://svelte.dev/e/effect_orphan`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_orphan`);\n\t}\n}\n\n/**\n * `$effect.pending()` can only be called inside an effect or derived\n * @returns {never}\n */\nexport function effect_pending_outside_reaction() {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_pending_outside_reaction\\n\\`$effect.pending()\\` can only be called inside an effect or derived\\nhttps://svelte.dev/e/effect_pending_outside_reaction`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_pending_outside_reaction`);\n\t}\n}\n\n/**\n * Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state\n * @returns {never}\n */\nexport function effect_update_depth_exceeded() {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_update_depth_exceeded\\nMaximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state\\nhttps://svelte.dev/e/effect_update_depth_exceeded`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_update_depth_exceeded`);\n\t}\n}\n\n/**\n * Cannot use `flushSync` inside an effect\n * @returns {never}\n */\nexport function flush_sync_in_effect() {\n\tif (DEV) {\n\t\tconst error = new Error(`flush_sync_in_effect\\nCannot use \\`flushSync\\` inside an effect\\nhttps://svelte.dev/e/flush_sync_in_effect`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/flush_sync_in_effect`);\n\t}\n}\n\n/**\n * Cannot commit a fork that was already discarded\n * @returns {never}\n */\nexport function fork_discarded() {\n\tif (DEV) {\n\t\tconst error = new Error(`fork_discarded\\nCannot commit a fork that was already discarded\\nhttps://svelte.dev/e/fork_discarded`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/fork_discarded`);\n\t}\n}\n\n/**\n * Cannot create a fork inside an effect or when state changes are pending\n * @returns {never}\n */\nexport function fork_timing() {\n\tif (DEV) {\n\t\tconst error = new Error(`fork_timing\\nCannot create a fork inside an effect or when state changes are pending\\nhttps://svelte.dev/e/fork_timing`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/fork_timing`);\n\t}\n}\n\n/**\n * `getAbortSignal()` can only be called inside an effect or derived\n * @returns {never}\n */\nexport function get_abort_signal_outside_reaction() {\n\tif (DEV) {\n\t\tconst error = new Error(`get_abort_signal_outside_reaction\\n\\`getAbortSignal()\\` can only be called inside an effect or derived\\nhttps://svelte.dev/e/get_abort_signal_outside_reaction`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/get_abort_signal_outside_reaction`);\n\t}\n}\n\n/**\n * Expected to find a hydratable with key `%key%` during hydration, but did not.\n * @param {string} key\n * @returns {never}\n */\nexport function hydratable_missing_but_required(key) {\n\tif (DEV) {\n\t\tconst error = new Error(`hydratable_missing_but_required\\nExpected to find a hydratable with key \\`${key}\\` during hydration, but did not.\\nhttps://svelte.dev/e/hydratable_missing_but_required`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/hydratable_missing_but_required`);\n\t}\n}\n\n/**\n * Failed to hydrate the application\n * @returns {never}\n */\nexport function hydration_failed() {\n\tif (DEV) {\n\t\tconst error = new Error(`hydration_failed\\nFailed to hydrate the application\\nhttps://svelte.dev/e/hydration_failed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/hydration_failed`);\n\t}\n}\n\n/**\n * Could not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\n * @returns {never}\n */\nexport function invalid_snippet() {\n\tif (DEV) {\n\t\tconst error = new Error(`invalid_snippet\\nCould not \\`{@render}\\` snippet due to the expression being \\`null\\` or \\`undefined\\`. Consider using optional chaining \\`{@render snippet?.()}\\`\\nhttps://svelte.dev/e/invalid_snippet`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/invalid_snippet`);\n\t}\n}\n\n/**\n * `%name%(...)` cannot be used in runes mode\n * @param {string} name\n * @returns {never}\n */\nexport function lifecycle_legacy_only(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`lifecycle_legacy_only\\n\\`${name}(...)\\` cannot be used in runes mode\\nhttps://svelte.dev/e/lifecycle_legacy_only`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/lifecycle_legacy_only`);\n\t}\n}\n\n/**\n * Cannot do `bind:%key%={undefined}` when `%key%` has a fallback value\n * @param {string} key\n * @returns {never}\n */\nexport function props_invalid_value(key) {\n\tif (DEV) {\n\t\tconst error = new Error(`props_invalid_value\\nCannot do \\`bind:${key}={undefined}\\` when \\`${key}\\` has a fallback value\\nhttps://svelte.dev/e/props_invalid_value`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/props_invalid_value`);\n\t}\n}\n\n/**\n * Rest element properties of `$props()` such as `%property%` are readonly\n * @param {string} property\n * @returns {never}\n */\nexport function props_rest_readonly(property) {\n\tif (DEV) {\n\t\tconst error = new Error(`props_rest_readonly\\nRest element properties of \\`$props()\\` such as \\`${property}\\` are readonly\\nhttps://svelte.dev/e/props_rest_readonly`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/props_rest_readonly`);\n\t}\n}\n\n/**\n * The `%rune%` rune is only available inside `.svelte` and `.svelte.js/ts` files\n * @param {string} rune\n * @returns {never}\n */\nexport function rune_outside_svelte(rune) {\n\tif (DEV) {\n\t\tconst error = new Error(`rune_outside_svelte\\nThe \\`${rune}\\` rune is only available inside \\`.svelte\\` and \\`.svelte.js/ts\\` files\\nhttps://svelte.dev/e/rune_outside_svelte`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/rune_outside_svelte`);\n\t}\n}\n\n/**\n * `setContext` must be called when a component first initializes, not in a subsequent effect or after an `await` expression\n * @returns {never}\n */\nexport function set_context_after_init() {\n\tif (DEV) {\n\t\tconst error = new Error(`set_context_after_init\\n\\`setContext\\` must be called when a component first initializes, not in a subsequent effect or after an \\`await\\` expression\\nhttps://svelte.dev/e/set_context_after_init`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/set_context_after_init`);\n\t}\n}\n\n/**\n * Property descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\n * @returns {never}\n */\nexport function state_descriptors_fixed() {\n\tif (DEV) {\n\t\tconst error = new Error(`state_descriptors_fixed\\nProperty descriptors defined on \\`$state\\` objects must contain \\`value\\` and always be \\`enumerable\\`, \\`configurable\\` and \\`writable\\`.\\nhttps://svelte.dev/e/state_descriptors_fixed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/state_descriptors_fixed`);\n\t}\n}\n\n/**\n * Cannot set prototype of `$state` object\n * @returns {never}\n */\nexport function state_prototype_fixed() {\n\tif (DEV) {\n\t\tconst error = new Error(`state_prototype_fixed\\nCannot set prototype of \\`$state\\` object\\nhttps://svelte.dev/e/state_prototype_fixed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/state_prototype_fixed`);\n\t}\n}\n\n/**\n * Updating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\n * @returns {never}\n */\nexport function state_unsafe_mutation() {\n\tif (DEV) {\n\t\tconst error = new Error(`state_unsafe_mutation\\nUpdating state inside \\`$derived(...)\\`, \\`$inspect(...)\\` or a template expression is forbidden. If the value should not be reactive, declare it without \\`$state\\`\\nhttps://svelte.dev/e/state_unsafe_mutation`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/state_unsafe_mutation`);\n\t}\n}\n\n/**\n * A `<svelte:boundary>` `reset` function cannot be called while an error is still being handled\n * @returns {never}\n */\nexport function svelte_boundary_reset_onerror() {\n\tif (DEV) {\n\t\tconst error = new Error(`svelte_boundary_reset_onerror\\nA \\`<svelte:boundary>\\` \\`reset\\` function cannot be called while an error is still being handled\\nhttps://svelte.dev/e/svelte_boundary_reset_onerror`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`);\n\t}\n}","export const EACH_ITEM_REACTIVE = 1;\nexport const EACH_INDEX_REACTIVE = 1 << 1;\n/** See EachBlock interface metadata.is_controlled for an explanation what this is */\nexport const EACH_IS_CONTROLLED = 1 << 2;\nexport const EACH_IS_ANIMATED = 1 << 3;\nexport const EACH_ITEM_IMMUTABLE = 1 << 4;\n\nexport const PROPS_IS_IMMUTABLE = 1;\nexport const PROPS_IS_RUNES = 1 << 1;\nexport const PROPS_IS_UPDATED = 1 << 2;\nexport const PROPS_IS_BINDABLE = 1 << 3;\nexport const PROPS_IS_LAZY_INITIAL = 1 << 4;\n\nexport const TRANSITION_IN = 1;\nexport const TRANSITION_OUT = 1 << 1;\nexport const TRANSITION_GLOBAL = 1 << 2;\n\nexport const TEMPLATE_FRAGMENT = 1;\nexport const TEMPLATE_USE_IMPORT_NODE = 1 << 1;\nexport const TEMPLATE_USE_SVG = 1 << 2;\nexport const TEMPLATE_USE_MATHML = 1 << 3;\n\nexport const HYDRATION_START = '[';\n/** used to indicate that an `{:else}...` block was rendered */\nexport const HYDRATION_START_ELSE = '[!';\n/** used to indicate that a boundary's `failed` snippet was rendered on the server */\nexport const HYDRATION_START_FAILED = '[?';\nexport const HYDRATION_END = ']';\nexport const HYDRATION_ERROR = {};\n\nexport const ELEMENT_IS_NAMESPACED = 1;\nexport const ELEMENT_PRESERVE_ATTRIBUTE_CASE = 1 << 1;\nexport const ELEMENT_IS_INPUT = 1 << 2;\n\nexport const UNINITIALIZED = Symbol('uninitialized');\n\n// Dev-time component properties\nexport const FILENAME = Symbol('filename');\nexport const HMR = Symbol('hmr');\n\nexport const NAMESPACE_HTML = 'http://www.w3.org/1999/xhtml';\nexport const NAMESPACE_SVG = 'http://www.w3.org/2000/svg';\nexport const NAMESPACE_MATHML = 'http://www.w3.org/1998/Math/MathML';\n\n// we use a list of ignorable runtime warnings because not every runtime warning\n// can be ignored and we want to keep the validation for svelte-ignore in place\nexport const IGNORABLE_RUNTIME_WARNINGS = /** @type {const} */ ([\n\t'await_waterfall',\n\t'await_reactivity_loss',\n\t'state_snapshot_uncloneable',\n\t'binding_property_non_reactive',\n\t'hydration_attribute_changed',\n\t'hydration_html_changed',\n\t'ownership_invalid_binding',\n\t'ownership_invalid_mutation'\n]);\n\n/**\n * Whitespace inside one of these elements will not result in\n * a whitespace node being created in any circumstances. (This\n * list is almost certainly very incomplete)\n * TODO this is currently unused\n */\nexport const ELEMENTS_WITHOUT_TEXT = ['audio', 'datalist', 'dl', 'optgroup', 'select', 'video'];\n\nexport const ATTACHMENT_KEY = '@attach';\n","/* This file is generated by scripts/process-messages/index.js. Do not edit! */\n\nimport { DEV } from 'esm-env';\n\nvar bold = 'font-weight: bold';\nvar normal = 'font-weight: normal';\n\n/**\n * Assignment to `%property%` property (%location%) will evaluate to the right-hand side, not the value of `%property%` following the assignment. This may result in unexpected behaviour.\n * @param {string} property\n * @param {string} location\n */\nexport function assignment_value_stale(property, location) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] assignment_value_stale\\n%cAssignment to \\`${property}\\` property (${location}) will evaluate to the right-hand side, not the value of \\`${property}\\` following the assignment. This may result in unexpected behaviour.\\nhttps://svelte.dev/e/assignment_value_stale`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/assignment_value_stale`);\n\t}\n}\n\n/**\n * Detected reactivity loss when reading `%name%`. This happens when state is read in an async function after an earlier `await`\n * @param {string} name\n */\nexport function await_reactivity_loss(name) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] await_reactivity_loss\\n%cDetected reactivity loss when reading \\`${name}\\`. This happens when state is read in an async function after an earlier \\`await\\`\\nhttps://svelte.dev/e/await_reactivity_loss`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/await_reactivity_loss`);\n\t}\n}\n\n/**\n * An async derived, `%name%` (%location%) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\n * @param {string} name\n * @param {string} location\n */\nexport function await_waterfall(name, location) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] await_waterfall\\n%cAn async derived, \\`${name}\\` (${location}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\\nhttps://svelte.dev/e/await_waterfall`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/await_waterfall`);\n\t}\n}\n\n/**\n * `%binding%` (%location%) is binding to a non-reactive property\n * @param {string} binding\n * @param {string | undefined | null} [location]\n */\nexport function binding_property_non_reactive(binding, location) {\n\tif (DEV) {\n\t\tconsole.warn(\n\t\t\t`%c[svelte] binding_property_non_reactive\\n%c${location\n\t\t\t\t? `\\`${binding}\\` (${location}) is binding to a non-reactive property`\n\t\t\t\t: `\\`${binding}\\` is binding to a non-reactive property`}\\nhttps://svelte.dev/e/binding_property_non_reactive`,\n\t\t\tbold,\n\t\t\tnormal\n\t\t);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/binding_property_non_reactive`);\n\t}\n}\n\n/**\n * Your `console.%method%` contained `$state` proxies. Consider using `$inspect(...)` or `$state.snapshot(...)` instead\n * @param {string} method\n */\nexport function console_log_state(method) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] console_log_state\\n%cYour \\`console.${method}\\` contained \\`$state\\` proxies. Consider using \\`$inspect(...)\\` or \\`$state.snapshot(...)\\` instead\\nhttps://svelte.dev/e/console_log_state`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/console_log_state`);\n\t}\n}\n\n/**\n * Reading a derived belonging to a now-destroyed effect may result in stale values\n */\nexport function derived_inert() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] derived_inert\\n%cReading a derived belonging to a now-destroyed effect may result in stale values\\nhttps://svelte.dev/e/derived_inert`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/derived_inert`);\n\t}\n}\n\n/**\n * %handler% should be a function. Did you mean to %suggestion%?\n * @param {string} handler\n * @param {string} suggestion\n */\nexport function event_handler_invalid(handler, suggestion) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] event_handler_invalid\\n%c${handler} should be a function. Did you mean to ${suggestion}?\\nhttps://svelte.dev/e/event_handler_invalid`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/event_handler_invalid`);\n\t}\n}\n\n/**\n * Expected to find a hydratable with key `%key%` during hydration, but did not.\n * @param {string} key\n */\nexport function hydratable_missing_but_expected(key) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] hydratable_missing_but_expected\\n%cExpected to find a hydratable with key \\`${key}\\` during hydration, but did not.\\nhttps://svelte.dev/e/hydratable_missing_but_expected`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydratable_missing_but_expected`);\n\t}\n}\n\n/**\n * The `%attribute%` attribute on `%html%` changed its value between server and client renders. The client value, `%value%`, will be ignored in favour of the server value\n * @param {string} attribute\n * @param {string} html\n * @param {string} value\n */\nexport function hydration_attribute_changed(attribute, html, value) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] hydration_attribute_changed\\n%cThe \\`${attribute}\\` attribute on \\`${html}\\` changed its value between server and client renders. The client value, \\`${value}\\`, will be ignored in favour of the server value\\nhttps://svelte.dev/e/hydration_attribute_changed`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydration_attribute_changed`);\n\t}\n}\n\n/**\n * The value of an `{@html ...}` block %location% changed between server and client renders. The client value will be ignored in favour of the server value\n * @param {string | undefined | null} [location]\n */\nexport function hydration_html_changed(location) {\n\tif (DEV) {\n\t\tconsole.warn(\n\t\t\t`%c[svelte] hydration_html_changed\\n%c${location\n\t\t\t\t? `The value of an \\`{@html ...}\\` block ${location} changed between server and client renders. The client value will be ignored in favour of the server value`\n\t\t\t\t: 'The value of an `{@html ...}` block changed between server and client renders. The client value will be ignored in favour of the server value'}\\nhttps://svelte.dev/e/hydration_html_changed`,\n\t\t\tbold,\n\t\t\tnormal\n\t\t);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydration_html_changed`);\n\t}\n}\n\n/**\n * Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near %location%\n * @param {string | undefined | null} [location]\n */\nexport function hydration_mismatch(location) {\n\tif (DEV) {\n\t\tconsole.warn(\n\t\t\t`%c[svelte] hydration_mismatch\\n%c${location\n\t\t\t\t? `Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${location}`\n\t\t\t\t: 'Hydration failed because the initial UI does not match what was rendered on the server'}\\nhttps://svelte.dev/e/hydration_mismatch`,\n\t\t\tbold,\n\t\t\tnormal\n\t\t);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydration_mismatch`);\n\t}\n}\n\n/**\n * The `render` function passed to `createRawSnippet` should return HTML for a single element\n */\nexport function invalid_raw_snippet_render() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] invalid_raw_snippet_render\\n%cThe \\`render\\` function passed to \\`createRawSnippet\\` should return HTML for a single element\\nhttps://svelte.dev/e/invalid_raw_snippet_render`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/invalid_raw_snippet_render`);\n\t}\n}\n\n/**\n * Detected a migrated `$:` reactive block in `%filename%` that both accesses and updates the same reactive value. This may cause recursive updates when converted to an `$effect`.\n * @param {string} filename\n */\nexport function legacy_recursive_reactive_block(filename) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] legacy_recursive_reactive_block\\n%cDetected a migrated \\`$:\\` reactive block in \\`${filename}\\` that both accesses and updates the same reactive value. This may cause recursive updates when converted to an \\`$effect\\`.\\nhttps://svelte.dev/e/legacy_recursive_reactive_block`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/legacy_recursive_reactive_block`);\n\t}\n}\n\n/**\n * Tried to unmount a component that was not mounted\n */\nexport function lifecycle_double_unmount() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] lifecycle_double_unmount\\n%cTried to unmount a component that was not mounted\\nhttps://svelte.dev/e/lifecycle_double_unmount`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/lifecycle_double_unmount`);\n\t}\n}\n\n/**\n * %parent% passed property `%prop%` to %child% with `bind:`, but its parent component %owner% did not declare `%prop%` as a binding. Consider creating a binding between %owner% and %parent% (e.g. `bind:%prop%={...}` instead of `%prop%={...}`)\n * @param {string} parent\n * @param {string} prop\n * @param {string} child\n * @param {string} owner\n */\nexport function ownership_invalid_binding(parent, prop, child, owner) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] ownership_invalid_binding\\n%c${parent} passed property \\`${prop}\\` to ${child} with \\`bind:\\`, but its parent component ${owner} did not declare \\`${prop}\\` as a binding. Consider creating a binding between ${owner} and ${parent} (e.g. \\`bind:${prop}={...}\\` instead of \\`${prop}={...}\\`)\\nhttps://svelte.dev/e/ownership_invalid_binding`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/ownership_invalid_binding`);\n\t}\n}\n\n/**\n * Mutating unbound props (`%name%`, at %location%) is strongly discouraged. Consider using `bind:%prop%={...}` in %parent% (or using a callback) instead\n * @param {string} name\n * @param {string} location\n * @param {string} prop\n * @param {string} parent\n */\nexport function ownership_invalid_mutation(name, location, prop, parent) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] ownership_invalid_mutation\\n%cMutating unbound props (\\`${name}\\`, at ${location}) is strongly discouraged. Consider using \\`bind:${prop}={...}\\` in ${parent} (or using a callback) instead\\nhttps://svelte.dev/e/ownership_invalid_mutation`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/ownership_invalid_mutation`);\n\t}\n}\n\n/**\n * The `value` property of a `<select multiple>` element should be an array, but it received a non-array value. The selection will be kept as is.\n */\nexport function select_multiple_invalid_value() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] select_multiple_invalid_value\\n%cThe \\`value\\` property of a \\`<select multiple>\\` element should be an array, but it received a non-array value. The selection will be kept as is.\\nhttps://svelte.dev/e/select_multiple_invalid_value`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/select_multiple_invalid_value`);\n\t}\n}\n\n/**\n * Reactive `$state(...)` proxies and the values they proxy have different identities. Because of this, comparisons with `%operator%` will produce unexpected results\n * @param {string} operator\n */\nexport function state_proxy_equality_mismatch(operator) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] state_proxy_equality_mismatch\\n%cReactive \\`$state(...)\\` proxies and the values they proxy have different identities. Because of this, comparisons with \\`${operator}\\` will produce unexpected results\\nhttps://svelte.dev/e/state_proxy_equality_mismatch`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/state_proxy_equality_mismatch`);\n\t}\n}\n\n/**\n * Tried to unmount a state proxy, rather than a component\n */\nexport function state_proxy_unmount() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] state_proxy_unmount\\n%cTried to unmount a state proxy, rather than a component\\nhttps://svelte.dev/e/state_proxy_unmount`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/state_proxy_unmount`);\n\t}\n}\n\n/**\n * A `<svelte:boundary>` `reset` function only resets the boundary the first time it is called\n */\nexport function svelte_boundary_reset_noop() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] svelte_boundary_reset_noop\\n%cA \\`<svelte:boundary>\\` \\`reset\\` function only resets the boundary the first time it is called\\nhttps://svelte.dev/e/svelte_boundary_reset_noop`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`);\n\t}\n}\n\n/**\n * The `slide` transition does not work correctly for elements with `display: %value%`\n * @param {string} value\n */\nexport function transition_slide_display(value) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] transition_slide_display\\n%cThe \\`slide\\` transition does not work correctly for elements with \\`display: ${value}\\`\\nhttps://svelte.dev/e/transition_slide_display`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/transition_slide_display`);\n\t}\n}","/** @import { Equals } from '#client' */\n\n/** @type {Equals} */\nexport function equals(value) {\n\treturn value === this.v;\n}\n\n/**\n * @param {unknown} a\n * @param {unknown} b\n * @returns {boolean}\n */\nexport function safe_not_equal(a, b) {\n\treturn a != a\n\t\t? b == b\n\t\t: a !== b || (a !== null && typeof a === 'object') || typeof a === 'function';\n}\n\n/**\n * @param {unknown} a\n * @param {unknown} b\n * @returns {boolean}\n */\nexport function not_equal(a, b) {\n\treturn a !== b;\n}\n\n/** @type {Equals} */\nexport function safe_equals(value) {\n\treturn !safe_not_equal(value, this.v);\n}\n","/** True if experimental.async=true */\nexport let async_mode_flag = false;\n/** True if we're not certain that we only have Svelte 5 code in the compilation */\nexport let legacy_mode_flag = false;\n/** True if $inspect.trace is used */\nexport let tracing_mode_flag = false;\n\nexport function enable_async_mode_flag() {\n\tasync_mode_flag = true;\n}\n\n/** ONLY USE THIS DURING TESTING */\nexport function disable_async_mode_flag() {\n\tasync_mode_flag = false;\n}\n\nexport function enable_legacy_mode_flag() {\n\tlegacy_mode_flag = true;\n}\n\nexport function enable_tracing_mode_flag() {\n\ttracing_mode_flag = true;\n}\n","/** @import { ComponentContext, DevStackEntry, Effect } from '#client' */\nimport { DEV } from 'esm-env';\nimport * as e from './errors.js';\nimport { active_effect, active_reaction } from './runtime.js';\nimport { create_user_effect } from './reactivity/effects.js';\nimport { async_mode_flag, legacy_mode_flag } from '../flags/index.js';\nimport { FILENAME } from '../../constants.js';\nimport { BRANCH_EFFECT } from './constants.js';\n\n/** @type {ComponentContext | null} */\nexport let component_context = null;\n\n/** @param {ComponentContext | null} context */\nexport function set_component_context(context) {\n\tcomponent_context = context;\n}\n\n/** @type {DevStackEntry | null} */\nexport let dev_stack = null;\n\n/** @param {DevStackEntry | null} stack */\nexport function set_dev_stack(stack) {\n\tdev_stack = stack;\n}\n\n/**\n * Execute a callback with a new dev stack entry\n * @param {() => any} callback - Function to execute\n * @param {DevStackEntry['type']} type - Type of block/component\n * @param {any} component - Component function\n * @param {number} line - Line number\n * @param {number} column - Column number\n * @param {Record<string, any>} [additional] - Any additional properties to add to the dev stack entry\n * @returns {any}\n */\nexport function add_svelte_meta(callback, type, component, line, column, additional) {\n\tconst parent = dev_stack;\n\n\tdev_stack = {\n\t\ttype,\n\t\tfile: component[FILENAME],\n\t\tline,\n\t\tcolumn,\n\t\tparent,\n\t\t...additional\n\t};\n\n\ttry {\n\t\treturn callback();\n\t} finally {\n\t\tdev_stack = parent;\n\t}\n}\n\n/**\n * The current component function. Different from current component context:\n * ```html\n * <!-- App.svelte -->\n * <Foo>\n * <Bar /> <!-- context == Foo.svelte, function == App.svelte -->\n * </Foo>\n * ```\n * @type {ComponentContext['function']}\n */\nexport let dev_current_component_function = null;\n\n/** @param {ComponentContext['function']} fn */\nexport function set_dev_current_component_function(fn) {\n\tdev_current_component_function = fn;\n}\n\n/**\n * Returns a `[get, set]` pair of functions for working with context in a type-safe way.\n *\n * `get` will throw an error if no parent component called `set`.\n *\n * @template T\n * @returns {[() => T, (context: T) => T]}\n * @since 5.40.0\n */\nexport function createContext() {\n\tconst key = {};\n\n\treturn [\n\t\t() => {\n\t\t\tif (!hasContext(key)) {\n\t\t\t\te.missing_context();\n\t\t\t}\n\n\t\t\treturn getContext(key);\n\t\t},\n\t\t(context) => setContext(key, context)\n\t];\n}\n\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * [`createContext`](https://svelte.dev/docs/svelte/svelte#createContext) is a type-safe alternative.\n *\n * @template T\n * @param {any} key\n * @returns {T}\n */\nexport function getContext(key) {\n\tconst context_map = get_or_init_context_map('getContext');\n\tconst result = /** @type {T} */ (context_map.get(key));\n\treturn result;\n}\n\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * [`createContext`](https://svelte.dev/docs/svelte/svelte#createContext) is a type-safe alternative.\n *\n * @template T\n * @param {any} key\n * @param {T} context\n * @returns {T}\n */\nexport function setContext(key, context) {\n\tconst context_map = get_or_init_context_map('setContext');\n\n\tif (async_mode_flag) {\n\t\tvar flags = /** @type {Effect} */ (active_effect).f;\n\t\tvar valid =\n\t\t\t!active_reaction &&\n\t\t\t(flags & BRANCH_EFFECT) !== 0 &&\n\t\t\t// pop() runs synchronously, so this indicates we're setting context after an await\n\t\t\t!(/** @type {ComponentContext} */ (component_context).i);\n\n\t\tif (!valid) {\n\t\t\te.set_context_after_init();\n\t\t}\n\t}\n\n\tcontext_map.set(key, context);\n\treturn context;\n}\n\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * @param {any} key\n * @returns {boolean}\n */\nexport function hasContext(key) {\n\tconst context_map = get_or_init_context_map('hasContext');\n\treturn context_map.has(key);\n}\n\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * @template {Map<any, any>} [T=Map<any, any>]\n * @returns {T}\n */\nexport function getAllContexts() {\n\tconst context_map = get_or_init_context_map('getAllContexts');\n\treturn /** @type {T} */ (context_map);\n}\n\n/**\n * @param {Record<string, unknown>} props\n * @param {any} runes\n * @param {Function} [fn]\n * @returns {void}\n */\nexport function push(props, runes = false, fn) {\n\tcomponent_context = {\n\t\tp: component_context,\n\t\ti: false,\n\t\tc: null,\n\t\te: null,\n\t\ts: props,\n\t\tx: null,\n\t\tr: /** @type {Effect} */ (active_effect),\n\t\tl: legacy_mode_flag && !runes ? { s: null, u: null, $: [] } : null\n\t};\n\n\tif (DEV) {\n\t\t// component function\n\t\tcomponent_context.function = fn;\n\t\tdev_current_component_function = fn;\n\t}\n}\n\n/**\n * @template {Record<string, any>} T\n * @param {T} [component]\n * @returns {T}\n */\nexport function pop(component) {\n\tvar context = /** @type {ComponentContext} */ (component_context);\n\tvar effects = context.e;\n\n\tif (effects !== null) {\n\t\tcontext.e = null;\n\n\t\tfor (var fn of effects) {\n\t\t\tcreate_user_effect(fn);\n\t\t}\n\t}\n\n\tif (component !== undefined) {\n\t\tcontext.x = component;\n\t}\n\n\tcontext.i = true;\n\n\tcomponent_context = context.p;\n\n\tif (DEV) {\n\t\tdev_current_component_function = component_context?.function ?? null;\n\t}\n\n\treturn component ?? /** @type {T} */ ({});\n}\n\n/** @returns {boolean} */\nexport function is_runes() {\n\treturn !legacy_mode_flag || (component_context !== null && component_context.l === null);\n}\n\n/**\n * @param {string} name\n * @returns {Map<unknown, unknown>}\n */\nfunction get_or_init_context_map(name) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component(name);\n\t}\n\n\treturn (component_context.c ??= new Map(get_parent_context(component_context) || undefined));\n}\n\n/**\n * @param {ComponentContext} component_context\n * @returns {Map<unknown, unknown> | null}\n */\nfunction get_parent_context(component_context) {\n\tlet parent = component_context.p;\n\twhile (parent !== null) {\n\t\tconst context_map = parent.c;\n\t\tif (context_map !== null) {\n\t\t\treturn context_map;\n\t\t}\n\t\tparent = parent.p;\n\t}\n\treturn null;\n}\n","import { run_all } from '../../shared/utils.js';\nimport { is_flushing_sync } from '../reactivity/batch.js';\n\n/** @type {Array<() => void>} */\nlet micro_tasks = [];\n\nfunction run_micro_tasks() {\n\tvar tasks = micro_tasks;\n\tmicro_tasks = [];\n\trun_all(tasks);\n}\n\n/**\n * @param {() => void} fn\n */\nexport function queue_micro_task(fn) {\n\tif (micro_tasks.length === 0 && !is_flushing_sync) {\n\t\tvar tasks = micro_tasks;\n\t\tqueueMicrotask(() => {\n\t\t\t// If this is false, a flushSync happened in the meantime. Do _not_ run new scheduled microtasks in that case\n\t\t\t// as the ordering of microtasks would be broken at that point - consider this case:\n\t\t\t// - queue_micro_task schedules microtask A to flush task X\n\t\t\t// - synchronously after, flushSync runs, processing task X\n\t\t\t// - synchronously after, some other microtask B is scheduled, but not through queue_micro_task but for example a Promise.resolve() in user code\n\t\t\t// - synchronously after, queue_micro_task schedules microtask C to flush task Y\n\t\t\t// - one tick later, microtask A now resolves, flushing task Y before microtask B, which is incorrect\n\t\t\t// This if check prevents that race condition (that realistically will only happen in tests)\n\t\t\tif (tasks === micro_tasks) run_micro_tasks();\n\t\t});\n\t}\n\n\tmicro_tasks.push(fn);\n}\n\n/**\n * Synchronously run any queued tasks.\n */\nexport function flush_tasks() {\n\twhile (micro_tasks.length > 0) {\n\t\trun_micro_tasks();\n\t}\n}\n","/** @import { Derived, Effect } from '#client' */\n/** @import { Boundary } from './dom/blocks/boundary.js' */\nimport { DEV } from 'esm-env';\nimport { FILENAME } from '../../constants.js';\nimport { is_firefox } from './dom/operations.js';\nimport { ERROR_VALUE, BOUNDARY_EFFECT, REACTION_RAN, EFFECT, DESTROYED } from './constants.js';\nimport { define_property, get_descriptor } from '../shared/utils.js';\nimport { active_effect, active_reaction } from './runtime.js';\n\nconst adjustments = new WeakMap();\n\n/**\n * @param {unknown} error\n */\nexport function handle_error(error) {\n\tvar effect = active_effect;\n\n\t// for unowned deriveds, don't throw until we read the value\n\tif (effect === null) {\n\t\t/** @type {Derived} */ (active_reaction).f |= ERROR_VALUE;\n\t\treturn error;\n\t}\n\n\tif (DEV && error instanceof Error && !adjustments.has(error)) {\n\t\tadjustments.set(error, get_adjustments(error, effect));\n\t}\n\n\t// if the error occurred while creating this subtree, we let it\n\t// bubble up until it hits a boundary that can handle it, unless\n\t// it's an $effect in which case it doesn't run immediately\n\tif ((effect.f & REACTION_RAN) === 0 && (effect.f & EFFECT) === 0) {\n\t\tif (DEV && !effect.parent && error instanceof Error) {\n\t\t\tapply_adjustments(error);\n\t\t}\n\n\t\tthrow error;\n\t}\n\n\t// otherwise we bubble up the effect tree ourselves\n\tinvoke_error_boundary(error, effect);\n}\n\n/**\n * @param {unknown} error\n * @param {Effect | null} effect\n */\nexport function invoke_error_boundary(error, effect) {\n\tif (effect !== null && (effect.f & DESTROYED) !== 0) {\n\t\treturn;\n\t}\n\n\twhile (effect !== null) {\n\t\tif ((effect.f & BOUNDARY_EFFECT) !== 0) {\n\t\t\tif ((effect.f & REACTION_RAN) === 0) {\n\t\t\t\t// we are still creating the boundary effect\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t/** @type {Boundary} */ (effect.b).error(error);\n\t\t\t\treturn;\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\n\t\teffect = effect.parent;\n\t}\n\n\tif (DEV && error instanceof Error) {\n\t\tapply_adjustments(error);\n\t}\n\n\tthrow error;\n}\n\n/**\n * Add useful information to the error message/stack in development\n * @param {Error} error\n * @param {Effect} effect\n */\nfunction get_adjustments(error, effect) {\n\tconst message_descriptor = get_descriptor(error, 'message');\n\n\t// if the message was already changed and it's not configurable we can't change it\n\t// or it will throw a different error swallowing the original error\n\tif (message_descriptor && !message_descriptor.configurable) return;\n\n\tvar indent = is_firefox ? ' ' : '\\t';\n\tvar component_stack = `\\n${indent}in ${effect.fn?.name || '<unknown>'}`;\n\tvar context = effect.ctx;\n\n\twhile (context !== null) {\n\t\tcomponent_stack += `\\n${indent}in ${context.function?.[FILENAME].split('/').pop()}`;\n\t\tcontext = context.p;\n\t}\n\n\treturn {\n\t\tmessage: error.message + `\\n${component_stack}\\n`,\n\t\tstack: error.stack\n\t\t\t?.split('\\n')\n\t\t\t.filter((line) => !line.includes('svelte/src/internal'))\n\t\t\t.join('\\n')\n\t};\n}\n\n/**\n * @param {Error} error\n */\nfunction apply_adjustments(error) {\n\tconst adjusted = adjustments.get(error);\n\n\tif (adjusted) {\n\t\tdefine_property(error, 'message', {\n\t\t\tvalue: adjusted.message\n\t\t});\n\n\t\tdefine_property(error, 'stack', {\n\t\t\tvalue: adjusted.stack\n\t\t});\n\t}\n}\n","/** @import { Derived, Signal } from '#client' */\nimport { CLEAN, CONNECTED, DIRTY, MAYBE_DIRTY } from '#client/constants';\n\nconst STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);\n\n/**\n * @param {Signal} signal\n * @param {number} status\n */\nexport function set_signal_status(signal, status) {\n\tsignal.f = (signal.f & STATUS_MASK) | status;\n}\n\n/**\n * Set a derived's status to CLEAN or MAYBE_DIRTY based on its connection state.\n * @param {Derived} derived\n */\nexport function update_derived_status(derived) {\n\t// Only mark as MAYBE_DIRTY if disconnected and has dependencies.\n\tif ((derived.f & CONNECTED) !== 0 || derived.deps === null) {\n\t\tset_signal_status(derived, CLEAN);\n\t} else {\n\t\tset_signal_status(derived, MAYBE_DIRTY);\n\t}\n}\n","/** @import { Derived, Effect, Value } from '#client' */\nimport { CLEAN, DERIVED, DIRTY, MAYBE_DIRTY, WAS_MARKED } from '#client/constants';\nimport { set_signal_status } from './status.js';\n\n/**\n * @param {Value[] | null} deps\n */\nfunction clear_marked(deps) {\n\tif (deps === null) return;\n\n\tfor (const dep of deps) {\n\t\tif ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdep.f ^= WAS_MARKED;\n\n\t\tclear_marked(/** @type {Derived} */ (dep).deps);\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {Set<Effect>} dirty_effects\n * @param {Set<Effect>} maybe_dirty_effects\n */\nexport function defer_effect(effect, dirty_effects, maybe_dirty_effects) {\n\tif ((effect.f & DIRTY) !== 0) {\n\t\tdirty_effects.add(effect);\n\t} else if ((effect.f & MAYBE_DIRTY) !== 0) {\n\t\tmaybe_dirty_effects.add(effect);\n\t}\n\n\t// Since we're not executing these effects now, we need to clear any WAS_MARKED flags\n\t// so that other batches can correctly reach these effects during their own traversal\n\tclear_marked(effect.deps);\n\n\t// mark as clean so they get scheduled if they depend on pending async state\n\tset_signal_status(effect, CLEAN);\n}\n","/** @import { StoreReferencesContainer } from '#client' */\n/** @import { Store } from '#shared' */\nimport { subscribe_to_store } from '../../../store/utils.js';\nimport { get as get_store } from '../../../store/shared/index.js';\nimport { define_property, noop } from '../../shared/utils.js';\nimport { get } from '../runtime.js';\nimport { teardown } from './effects.js';\nimport { mutable_source, set } from './sources.js';\nimport { DEV } from 'esm-env';\n\n/**\n * We set this to `true` when updating a store so that we correctly\n * schedule effects if the update takes place inside a `$:` effect\n */\nexport let legacy_is_updating_store = false;\n\n/**\n * Whether or not the prop currently being read is a store binding, as in\n * `<Child bind:x={$y} />`. If it is, we treat the prop as mutable even in\n * runes mode, and skip `binding_property_non_reactive` validation\n */\nlet is_store_binding = false;\n\nlet IS_UNMOUNTED = Symbol('unmounted');\n\n/**\n * Gets the current value of a store. If the store isn't subscribed to yet, it will create a proxy\n * signal that will be updated when the store is. The store references container is needed to\n * track reassignments to stores and to track the correct component context.\n * @template V\n * @param {Store<V> | null | undefined} store\n * @param {string} store_name\n * @param {StoreReferencesContainer} stores\n * @returns {V}\n */\nexport function store_get(store, store_name, stores) {\n\tconst entry = (stores[store_name] ??= {\n\t\tstore: null,\n\t\tsource: mutable_source(undefined),\n\t\tunsubscribe: noop\n\t});\n\n\tif (DEV) {\n\t\tentry.source.label = store_name;\n\t}\n\n\t// if the component that setup this is already unmounted we don't want to register a subscription\n\tif (entry.store !== store && !(IS_UNMOUNTED in stores)) {\n\t\tentry.unsubscribe();\n\t\tentry.store = store ?? null;\n\n\t\tif (store == null) {\n\t\t\tentry.source.v = undefined; // see synchronous callback comment below\n\t\t\tentry.unsubscribe = noop;\n\t\t} else {\n\t\t\tvar is_synchronous_callback = true;\n\n\t\t\tentry.unsubscribe = subscribe_to_store(store, (v) => {\n\t\t\t\tif (is_synchronous_callback) {\n\t\t\t\t\t// If the first updates to the store value (possibly multiple of them) are synchronously\n\t\t\t\t\t// inside a derived, we will hit the `state_unsafe_mutation` error if we `set` the value\n\t\t\t\t\tentry.source.v = v;\n\t\t\t\t} else {\n\t\t\t\t\tset(entry.source, v);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tis_synchronous_callback = false;\n\t\t}\n\t}\n\n\t// if the component that setup this stores is already unmounted the source will be out of sync\n\t// so we just use the `get` for the stores, less performant but it avoids to create a memory leak\n\t// and it will keep the value consistent\n\tif (store && IS_UNMOUNTED in stores) {\n\t\treturn get_store(store);\n\t}\n\n\treturn get(entry.source);\n}\n\n/**\n * Unsubscribe from a store if it's not the same as the one in the store references container.\n * We need this in addition to `store_get` because someone could unsubscribe from a store but\n * then never subscribe to the new one (if any), causing the subscription to stay open wrongfully.\n * @param {Store<any> | null | undefined} store\n * @param {string} store_name\n * @param {StoreReferencesContainer} stores\n */\nexport function store_unsub(store, store_name, stores) {\n\t/** @type {StoreReferencesContainer[''] | undefined} */\n\tlet entry = stores[store_name];\n\n\tif (entry && entry.store !== store) {\n\t\t// Don't reset store yet, so that store_get above can resubscribe to new store if necessary\n\t\tentry.unsubscribe();\n\t\tentry.unsubscribe = noop;\n\t}\n\n\treturn store;\n}\n\n/**\n * Sets the new value of a store and returns that value.\n * @template V\n * @param {Store<V>} store\n * @param {V} value\n * @returns {V}\n */\nexport function store_set(store, value) {\n\tupdate_with_flag(store, value);\n\treturn value;\n}\n\n/**\n * @param {StoreReferencesContainer} stores\n * @param {string} store_name\n */\nexport function invalidate_store(stores, store_name) {\n\tvar entry = stores[store_name];\n\tif (entry.store !== null) {\n\t\tstore_set(entry.store, entry.source.v);\n\t}\n}\n\n/**\n * Unsubscribes from all auto-subscribed stores on destroy\n * @returns {[StoreReferencesContainer, ()=>void]}\n */\nexport function setup_stores() {\n\t/** @type {StoreReferencesContainer} */\n\tconst stores = {};\n\n\tfunction cleanup() {\n\t\tteardown(() => {\n\t\t\tfor (var store_name in stores) {\n\t\t\t\tconst ref = stores[store_name];\n\t\t\t\tref.unsubscribe();\n\t\t\t}\n\t\t\tdefine_property(stores, IS_UNMOUNTED, {\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: true\n\t\t\t});\n\t\t});\n\t}\n\n\treturn [stores, cleanup];\n}\n\n/**\n * @param {Store<V>} store\n * @param {V} value\n * @template V\n */\nfunction update_with_flag(store, value) {\n\tlegacy_is_updating_store = true;\n\n\ttry {\n\t\tstore.set(value);\n\t} finally {\n\t\tlegacy_is_updating_store = false;\n\t}\n}\n\n/**\n * Updates a store with a new value.\n * @param {Store<V>} store the store to update\n * @param {any} expression the expression that mutates the store\n * @param {V} new_value the new store value\n * @template V\n */\nexport function store_mutate(store, expression, new_value) {\n\tupdate_with_flag(store, new_value);\n\treturn expression;\n}\n\n/**\n * @param {Store<number>} store\n * @param {number} store_value\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_store(store, store_value, d = 1) {\n\tupdate_with_flag(store, store_value + d);\n\treturn store_value;\n}\n\n/**\n * @param {Store<number>} store\n * @param {number} store_value\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_pre_store(store, store_value, d = 1) {\n\tconst value = store_value + d;\n\tupdate_with_flag(store, value);\n\treturn value;\n}\n\n/**\n * Called inside prop getters to communicate that the prop is a store binding\n */\nexport function mark_store_binding() {\n\tis_store_binding = true;\n}\n\n/**\n * Returns a tuple that indicates whether `fn()` reads a prop that is a store binding.\n * Used to prevent `binding_property_non_reactive` validation false positives and\n * ensure that these props are treated as mutable even in runes mode\n * @template T\n * @param {() => T} fn\n * @returns {[T, boolean]}\n */\nexport function capture_store_binding(fn) {\n\tvar previous_is_store_binding = is_store_binding;\n\n\ttry {\n\t\tis_store_binding = false;\n\t\treturn [fn(), is_store_binding];\n\t} finally {\n\t\tis_store_binding = previous_is_store_binding;\n\t}\n}\n","import { get, tick, untrack } from '../internal/client/runtime.js';\nimport { effect_tracking, render_effect } from '../internal/client/reactivity/effects.js';\nimport { source, increment } from '../internal/client/reactivity/sources.js';\nimport { tag } from '../internal/client/dev/tracing.js';\nimport { DEV } from 'esm-env';\nimport { queue_micro_task } from '../internal/client/dom/task.js';\n\n/**\n * Returns a `subscribe` function that integrates external event-based systems with Svelte's reactivity.\n * It's particularly useful for integrating with web APIs like `MediaQuery`, `IntersectionObserver`, or `WebSocket`.\n *\n * If `subscribe` is called inside an effect (including indirectly, for example inside a getter),\n * the `start` callback will be called with an `update` function. Whenever `update` is called, the effect re-runs.\n *\n * If `start` returns a cleanup function, it will be called when the effect is destroyed.\n *\n * If `subscribe` is called in multiple effects, `start` will only be called once as long as the effects\n * are active, and the returned teardown function will only be called when all effects are destroyed.\n *\n * It's best understood with an example. Here's an implementation of [`MediaQuery`](https://svelte.dev/docs/svelte/svelte-reactivity#MediaQuery):\n *\n * ```js\n * import { createSubscriber } from 'svelte/reactivity';\n * import { on } from 'svelte/events';\n *\n * export class MediaQuery {\n * \t#query;\n * \t#subscribe;\n *\n * \tconstructor(query) {\n * \t\tthis.#query = window.matchMedia(`(${query})`);\n *\n * \t\tthis.#subscribe = createSubscriber((update) => {\n * \t\t\t// when the `change` event occurs, re-run any effects that read `this.current`\n * \t\t\tconst off = on(this.#query, 'change', update);\n *\n * \t\t\t// stop listening when all the effects are destroyed\n * \t\t\treturn () => off();\n * \t\t});\n * \t}\n *\n * \tget current() {\n * \t\t// This makes the getter reactive, if read in an effect\n * \t\tthis.#subscribe();\n *\n * \t\t// Return the current state of the query, whether or not we're in an effect\n * \t\treturn this.#query.matches;\n * \t}\n * }\n * ```\n * @param {(update: () => void) => (() => void) | void} start\n * @since 5.7.0\n */\nexport function createSubscriber(start) {\n\tlet subscribers = 0;\n\tlet version = source(0);\n\t/** @type {(() => void) | void} */\n\tlet stop;\n\n\tif (DEV) {\n\t\ttag(version, 'createSubscriber version');\n\t}\n\n\treturn () => {\n\t\tif (effect_tracking()) {\n\t\t\tget(version);\n\n\t\t\trender_effect(() => {\n\t\t\t\tif (subscribers === 0) {\n\t\t\t\t\tstop = untrack(() => start(() => increment(version)));\n\t\t\t\t}\n\n\t\t\t\tsubscribers += 1;\n\n\t\t\t\treturn () => {\n\t\t\t\t\tqueue_micro_task(() => {\n\t\t\t\t\t\t// Only count down after a microtask, else we would reach 0 before our own render effect reruns,\n\t\t\t\t\t\t// but reach 1 again when the tick callback of the prior teardown runs. That would mean we\n\t\t\t\t\t\t// re-subcribe unnecessarily and create a memory leak because the old subscription is never cleaned up.\n\t\t\t\t\t\tsubscribers -= 1;\n\n\t\t\t\t\t\tif (subscribers === 0) {\n\t\t\t\t\t\t\tstop?.();\n\t\t\t\t\t\t\tstop = undefined;\n\t\t\t\t\t\t\t// Increment the version to ensure any dependent deriveds are marked dirty when the subscription is picked up again later.\n\t\t\t\t\t\t\t// If we didn't do this then the comparison of write versions would determine that the derived has a later version than\n\t\t\t\t\t\t\t// the subscriber, and it would not be re-run.\n\t\t\t\t\t\t\tincrement(version);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t};\n}\n","/** @import { Effect, Source, TemplateNode, } from '#client' */\nimport {\n\tBOUNDARY_EFFECT,\n\tDIRTY,\n\tEFFECT_PRESERVED,\n\tEFFECT_TRANSPARENT,\n\tMAYBE_DIRTY\n} from '#client/constants';\nimport { HYDRATION_START_ELSE, HYDRATION_START_FAILED } from '../../../../constants.js';\nimport { component_context, set_component_context } from '../../context.js';\nimport { handle_error, invoke_error_boundary } from '../../error-handling.js';\nimport {\n\tblock,\n\tbranch,\n\tdestroy_effect,\n\tmove_effect,\n\tpause_effect\n} from '../../reactivity/effects.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tget,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../runtime.js';\nimport {\n\thydrate_next,\n\thydrate_node,\n\thydrating,\n\tnext,\n\tskip_nodes,\n\tset_hydrate_node\n} from '../hydration.js';\nimport { queue_micro_task } from '../task.js';\nimport * as e from '../../errors.js';\nimport * as w from '../../warnings.js';\nimport { DEV } from 'esm-env';\nimport { Batch, current_batch } from '../../reactivity/batch.js';\nimport { internal_set, source } from '../../reactivity/sources.js';\nimport { tag } from '../../dev/tracing.js';\nimport { createSubscriber } from '../../../../reactivity/create-subscriber.js';\nimport { create_text } from '../operations.js';\nimport { defer_effect } from '../../reactivity/utils.js';\n\n/**\n * @typedef {{\n * \t onerror?: ((error: unknown, reset: () => void) => void) | null;\n * failed?: ((anchor: Node, error: () => unknown, reset: () => () => void) => void) | null;\n * pending?: ((anchor: Node) => void) | null;\n * }} BoundaryProps\n */\n\nvar flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED;\n\n/**\n * @param {TemplateNode} node\n * @param {BoundaryProps} props\n * @param {((anchor: Node) => void)} children\n * @param {((error: unknown) => unknown) | undefined} [transform_error]\n * @returns {void}\n */\nexport function boundary(node, props, children, transform_error) {\n\tnew Boundary(node, props, children, transform_error);\n}\n\nexport class Boundary {\n\t/** @type {Boundary | null} */\n\tparent;\n\n\tis_pending = false;\n\n\t/**\n\t * API-level transformError transform function. Transforms errors before they reach the `failed` snippet.\n\t * Inherited from parent boundary, or defaults to identity.\n\t * @type {(error: unknown) => unknown}\n\t */\n\ttransform_error;\n\n\t/** @type {TemplateNode} */\n\t#anchor;\n\n\t/** @type {TemplateNode | null} */\n\t#hydrate_open = hydrating ? hydrate_node : null;\n\n\t/** @type {BoundaryProps} */\n\t#props;\n\n\t/** @type {((anchor: Node) => void)} */\n\t#children;\n\n\t/** @type {Effect} */\n\t#effect;\n\n\t/** @type {Effect | null} */\n\t#main_effect = null;\n\n\t/** @type {Effect | null} */\n\t#pending_effect = null;\n\n\t/** @type {Effect | null} */\n\t#failed_effect = null;\n\n\t/** @type {DocumentFragment | null} */\n\t#offscreen_fragment = null;\n\n\t#local_pending_count = 0;\n\t#pending_count = 0;\n\t#pending_count_update_queued = false;\n\n\t/** @type {Set<Effect>} */\n\t#dirty_effects = new Set();\n\n\t/** @type {Set<Effect>} */\n\t#maybe_dirty_effects = new Set();\n\n\t/**\n\t * A source containing the number of pending async deriveds/expressions.\n\t * Only created if `$effect.pending()` is used inside the boundary,\n\t * otherwise updating the source results in needless `Batch.ensure()`\n\t * calls followed by no-op flushes\n\t * @type {Source<number> | null}\n\t */\n\t#effect_pending = null;\n\n\t#effect_pending_subscriber = createSubscriber(() => {\n\t\tthis.#effect_pending = source(this.#local_pending_count);\n\n\t\tif (DEV) {\n\t\t\ttag(this.#effect_pending, '$effect.pending()');\n\t\t}\n\n\t\treturn () => {\n\t\t\tthis.#effect_pending = null;\n\t\t};\n\t});\n\n\t/**\n\t * @param {TemplateNode} node\n\t * @param {BoundaryProps} props\n\t * @param {((anchor: Node) => void)} children\n\t * @param {((error: unknown) => unknown) | undefined} [transform_error]\n\t */\n\tconstructor(node, props, children, transform_error) {\n\t\tthis.#anchor = node;\n\t\tthis.#props = props;\n\n\t\tthis.#children = (anchor) => {\n\t\t\tvar effect = /** @type {Effect} */ (active_effect);\n\n\t\t\teffect.b = this;\n\t\t\teffect.f |= BOUNDARY_EFFECT;\n\n\t\t\tchildren(anchor);\n\t\t};\n\n\t\tthis.parent = /** @type {Effect} */ (active_effect).b;\n\n\t\t// Inherit transform_error from parent boundary, or use the provided one, or default to identity\n\t\tthis.transform_error = transform_error ?? this.parent?.transform_error ?? ((e) => e);\n\n\t\tthis.#effect = block(() => {\n\t\t\tif (hydrating) {\n\t\t\t\tconst comment = /** @type {Comment} */ (this.#hydrate_open);\n\t\t\t\thydrate_next();\n\n\t\t\t\tconst server_rendered_pending = comment.data === HYDRATION_START_ELSE;\n\t\t\t\tconst server_rendered_failed = comment.data.startsWith(HYDRATION_START_FAILED);\n\n\t\t\t\tif (server_rendered_failed) {\n\t\t\t\t\t// Server rendered the failed snippet - hydrate it.\n\t\t\t\t\t// The serialized error is embedded in the comment: <!--[?<json>-->\n\t\t\t\t\tconst serialized_error = JSON.parse(comment.data.slice(HYDRATION_START_FAILED.length));\n\t\t\t\t\tthis.#hydrate_failed_content(serialized_error);\n\t\t\t\t} else if (server_rendered_pending) {\n\t\t\t\t\tthis.#hydrate_pending_content();\n\t\t\t\t} else {\n\t\t\t\t\tthis.#hydrate_resolved_content();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.#render();\n\t\t\t}\n\t\t}, flags);\n\n\t\tif (hydrating) {\n\t\t\tthis.#anchor = hydrate_node;\n\t\t}\n\t}\n\n\t#hydrate_resolved_content() {\n\t\ttry {\n\t\t\tthis.#main_effect = branch(() => this.#children(this.#anchor));\n\t\t} catch (error) {\n\t\t\tthis.error(error);\n\t\t}\n\t}\n\n\t/**\n\t * @param {unknown} error The deserialized error from the server's hydration comment\n\t */\n\t#hydrate_failed_content(error) {\n\t\tconst failed = this.#props.failed;\n\t\tif (!failed) return;\n\n\t\tthis.#failed_effect = branch(() => {\n\t\t\tfailed(\n\t\t\t\tthis.#anchor,\n\t\t\t\t() => error,\n\t\t\t\t() => () => {}\n\t\t\t);\n\t\t});\n\t}\n\n\t#hydrate_pending_content() {\n\t\tconst pending = this.#props.pending;\n\t\tif (!pending) return;\n\n\t\tthis.is_pending = true;\n\t\tthis.#pending_effect = branch(() => pending(this.#anchor));\n\n\t\tqueue_micro_task(() => {\n\t\t\tvar fragment = (this.#offscreen_fragment = document.createDocumentFragment());\n\t\t\tvar anchor = create_text();\n\n\t\t\tfragment.append(anchor);\n\n\t\t\tthis.#main_effect = this.#run(() => {\n\t\t\t\treturn branch(() => this.#children(anchor));\n\t\t\t});\n\n\t\t\tif (this.#pending_count === 0) {\n\t\t\t\tthis.#anchor.before(fragment);\n\t\t\t\tthis.#offscreen_fragment = null;\n\n\t\t\t\tpause_effect(/** @type {Effect} */ (this.#pending_effect), () => {\n\t\t\t\t\tthis.#pending_effect = null;\n\t\t\t\t});\n\n\t\t\t\tthis.#resolve(/** @type {Batch} */ (current_batch));\n\t\t\t}\n\t\t});\n\t}\n\n\t#render() {\n\t\ttry {\n\t\t\tthis.is_pending = this.has_pending_snippet();\n\t\t\tthis.#pending_count = 0;\n\t\t\tthis.#local_pending_count = 0;\n\n\t\t\tthis.#main_effect = branch(() => {\n\t\t\t\tthis.#children(this.#anchor);\n\t\t\t});\n\n\t\t\tif (this.#pending_count > 0) {\n\t\t\t\tvar fragment = (this.#offscreen_fragment = document.createDocumentFragment());\n\t\t\t\tmove_effect(this.#main_effect, fragment);\n\n\t\t\t\tconst pending = /** @type {(anchor: Node) => void} */ (this.#props.pending);\n\t\t\t\tthis.#pending_effect = branch(() => pending(this.#anchor));\n\t\t\t} else {\n\t\t\t\tthis.#resolve(/** @type {Batch} */ (current_batch));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.error(error);\n\t\t}\n\t}\n\n\t/**\n\t * @param {Batch} batch\n\t */\n\t#resolve(batch) {\n\t\tthis.is_pending = false;\n\n\t\t// any effects that were previously deferred should be transferred\n\t\t// to the batch, which will flush in the next microtask\n\t\tbatch.transfer_effects(this.#dirty_effects, this.#maybe_dirty_effects);\n\t}\n\n\t/**\n\t * Defer an effect inside a pending boundary until the boundary resolves\n\t * @param {Effect} effect\n\t */\n\tdefer_effect(effect) {\n\t\tdefer_effect(effect, this.#dirty_effects, this.#maybe_dirty_effects);\n\t}\n\n\t/**\n\t * Returns `false` if the effect exists inside a boundary whose pending snippet is shown\n\t * @returns {boolean}\n\t */\n\tis_rendered() {\n\t\treturn !this.is_pending && (!this.parent || this.parent.is_rendered());\n\t}\n\n\thas_pending_snippet() {\n\t\treturn !!this.#props.pending;\n\t}\n\n\t/**\n\t * @template T\n\t * @param {() => T} fn\n\t */\n\t#run(fn) {\n\t\tvar previous_effect = active_effect;\n\t\tvar previous_reaction = active_reaction;\n\t\tvar previous_ctx = component_context;\n\n\t\tset_active_effect(this.#effect);\n\t\tset_active_reaction(this.#effect);\n\t\tset_component_context(this.#effect.ctx);\n\n\t\ttry {\n\t\t\tBatch.ensure();\n\t\t\treturn fn();\n\t\t} catch (e) {\n\t\t\thandle_error(e);\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tset_active_effect(previous_effect);\n\t\t\tset_active_reaction(previous_reaction);\n\t\t\tset_component_context(previous_ctx);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the pending count associated with the currently visible pending snippet,\n\t * if any, such that we can replace the snippet with content once work is done\n\t * @param {1 | -1} d\n\t * @param {Batch} batch\n\t */\n\t#update_pending_count(d, batch) {\n\t\tif (!this.has_pending_snippet()) {\n\t\t\tif (this.parent) {\n\t\t\t\tthis.parent.#update_pending_count(d, batch);\n\t\t\t}\n\n\t\t\t// if there's no parent, we're in a scope with no pending snippet\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#pending_count += d;\n\n\t\tif (this.#pending_count === 0) {\n\t\t\tthis.#resolve(batch);\n\n\t\t\tif (this.#pending_effect) {\n\t\t\t\tpause_effect(this.#pending_effect, () => {\n\t\t\t\t\tthis.#pending_effect = null;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.#offscreen_fragment) {\n\t\t\t\tthis.#anchor.before(this.#offscreen_fragment);\n\t\t\t\tthis.#offscreen_fragment = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update the source that powers `$effect.pending()` inside this boundary,\n\t * and controls when the current `pending` snippet (if any) is removed.\n\t * Do not call from inside the class\n\t * @param {1 | -1} d\n\t * @param {Batch} batch\n\t */\n\tupdate_pending_count(d, batch) {\n\t\tthis.#update_pending_count(d, batch);\n\n\t\tthis.#local_pending_count += d;\n\n\t\tif (!this.#effect_pending || this.#pending_count_update_queued) return;\n\t\tthis.#pending_count_update_queued = true;\n\n\t\tqueue_micro_task(() => {\n\t\t\tthis.#pending_count_update_queued = false;\n\t\t\tif (this.#effect_pending) {\n\t\t\t\tinternal_set(this.#effect_pending, this.#local_pending_count);\n\t\t\t}\n\t\t});\n\t}\n\n\tget_effect_pending() {\n\t\tthis.#effect_pending_subscriber();\n\t\treturn get(/** @type {Source<number>} */ (this.#effect_pending));\n\t}\n\n\t/** @param {unknown} error */\n\terror(error) {\n\t\t// If we have nothing to capture the error, or if we hit an error while\n\t\t// rendering the fallback, re-throw for another boundary to handle\n\t\tif (!this.#props.onerror && !this.#props.failed) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (current_batch?.is_fork) {\n\t\t\tif (this.#main_effect) current_batch.skip_effect(this.#main_effect);\n\t\t\tif (this.#pending_effect) current_batch.skip_effect(this.#pending_effect);\n\t\t\tif (this.#failed_effect) current_batch.skip_effect(this.#failed_effect);\n\n\t\t\tcurrent_batch.oncommit(() => {\n\t\t\t\tthis.#handle_error(error);\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#handle_error(error);\n\t\t}\n\t}\n\n\t/**\n\t * @param {unknown} error\n\t */\n\t#handle_error(error) {\n\t\tif (this.#main_effect) {\n\t\t\tdestroy_effect(this.#main_effect);\n\t\t\tthis.#main_effect = null;\n\t\t}\n\n\t\tif (this.#pending_effect) {\n\t\t\tdestroy_effect(this.#pending_effect);\n\t\t\tthis.#pending_effect = null;\n\t\t}\n\n\t\tif (this.#failed_effect) {\n\t\t\tdestroy_effect(this.#failed_effect);\n\t\t\tthis.#failed_effect = null;\n\t\t}\n\n\t\tif (hydrating) {\n\t\t\tset_hydrate_node(/** @type {TemplateNode} */ (this.#hydrate_open));\n\t\t\tnext();\n\t\t\tset_hydrate_node(skip_nodes());\n\t\t}\n\n\t\tvar onerror = this.#props.onerror;\n\t\tlet failed = this.#props.failed;\n\t\tvar did_reset = false;\n\t\tvar calling_on_error = false;\n\n\t\tconst reset = () => {\n\t\t\tif (did_reset) {\n\t\t\t\tw.svelte_boundary_reset_noop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdid_reset = true;\n\n\t\t\tif (calling_on_error) {\n\t\t\t\te.svelte_boundary_reset_onerror();\n\t\t\t}\n\n\t\t\tif (this.#failed_effect !== null) {\n\t\t\t\tpause_effect(this.#failed_effect, () => {\n\t\t\t\t\tthis.#failed_effect = null;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.#run(() => {\n\t\t\t\tthis.#render();\n\t\t\t});\n\t\t};\n\n\t\t/** @param {unknown} transformed_error */\n\t\tconst handle_error_result = (transformed_error) => {\n\t\t\ttry {\n\t\t\t\tcalling_on_error = true;\n\t\t\t\tonerror?.(transformed_error, reset);\n\t\t\t\tcalling_on_error = false;\n\t\t\t} catch (error) {\n\t\t\t\tinvoke_error_boundary(error, this.#effect && this.#effect.parent);\n\t\t\t}\n\n\t\t\tif (failed) {\n\t\t\t\tthis.#failed_effect = this.#run(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn branch(() => {\n\t\t\t\t\t\t\t// errors in `failed` snippets cause the boundary to error again\n\t\t\t\t\t\t\t// TODO Svelte 6: revisit this decision, most likely better to go to parent boundary instead\n\t\t\t\t\t\t\tvar effect = /** @type {Effect} */ (active_effect);\n\n\t\t\t\t\t\t\teffect.b = this;\n\t\t\t\t\t\t\teffect.f |= BOUNDARY_EFFECT;\n\n\t\t\t\t\t\t\tfailed(\n\t\t\t\t\t\t\t\tthis.#anchor,\n\t\t\t\t\t\t\t\t() => transformed_error,\n\t\t\t\t\t\t\t\t() => reset\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tinvoke_error_boundary(error, /** @type {Effect} */ (this.#effect.parent));\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tqueue_micro_task(() => {\n\t\t\t// Run the error through the API-level transformError transform (e.g. SvelteKit's handleError)\n\t\t\t/** @type {unknown} */\n\t\t\tvar result;\n\t\t\ttry {\n\t\t\t\tresult = this.transform_error(error);\n\t\t\t} catch (e) {\n\t\t\t\tinvoke_error_boundary(e, this.#effect && this.#effect.parent);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tresult !== null &&\n\t\t\t\ttypeof result === 'object' &&\n\t\t\t\ttypeof (/** @type {any} */ (result).then) === 'function'\n\t\t\t) {\n\t\t\t\t// transformError returned a Promise — wait for it\n\t\t\t\t/** @type {any} */ (result).then(\n\t\t\t\t\thandle_error_result,\n\t\t\t\t\t/** @param {unknown} e */\n\t\t\t\t\t(e) => invoke_error_boundary(e, this.#effect && this.#effect.parent)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Synchronous result — handle immediately\n\t\t\t\thandle_error_result(result);\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport function pending() {\n\tif (active_effect === null) {\n\t\te.effect_pending_outside_reaction();\n\t}\n\n\tvar boundary = active_effect.b;\n\n\tif (boundary === null) {\n\t\treturn 0; // TODO eventually we will need this to be global\n\t}\n\n\treturn boundary.get_effect_pending();\n}\n","/** @import { Blocker, Effect, Source, Value } from '#client' */\nimport { DESTROYED, STALE_REACTION } from '#client/constants';\nimport { DEV } from 'esm-env';\nimport {\n\tcomponent_context,\n\tdev_stack,\n\tis_runes,\n\tset_component_context,\n\tset_dev_stack\n} from '../context.js';\nimport { Boundary } from '../dom/blocks/boundary.js';\nimport { invoke_error_boundary } from '../error-handling.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tset_active_effect,\n\tset_active_reaction\n} from '../runtime.js';\nimport { Batch, current_batch } from './batch.js';\nimport {\n\tasync_derived,\n\treactivity_loss_tracker,\n\tderived,\n\tderived_safe_equal,\n\tset_reactivity_loss_tracker\n} from './deriveds.js';\nimport { aborted } from './effects.js';\nimport { queue_micro_task } from '../dom/task.js';\n\n/**\n * @param {Blocker[]} blockers\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {(values: Value[]) => any} fn\n */\nexport function flatten(blockers, sync, async, fn) {\n\tconst d = is_runes() ? derived : derived_safe_equal;\n\n\t// Filter out already-settled blockers - no need to wait for them\n\tvar pending = blockers.filter((b) => !b.settled);\n\n\tvar deriveds = sync.map(d);\n\n\tif (DEV) {\n\t\tderiveds.forEach((d, i) => {\n\t\t\t// TODO this is kinda useful for debugging but a lousy implementation —\n\t\t\t// maybe the compiler could pass through the template string\n\t\t\td.label = sync[i]\n\t\t\t\t.toString()\n\t\t\t\t.replace('() => ', '')\n\t\t\t\t.replaceAll('$.eager(() => ', '$state.eager(')\n\t\t\t\t.replace(/\\$\\.get\\((.+?)\\)/g, (_, id) => id);\n\t\t});\n\t}\n\n\tif (async.length === 0 && pending.length === 0) {\n\t\tfn(deriveds);\n\t\treturn;\n\t}\n\n\tvar parent = /** @type {Effect} */ (active_effect);\n\n\tvar restore = capture();\n\tvar blocker_promise =\n\t\tpending.length === 1\n\t\t\t? pending[0].promise\n\t\t\t: pending.length > 1\n\t\t\t\t? Promise.all(pending.map((b) => b.promise))\n\t\t\t\t: null;\n\n\t/**\n\t * @param {Source[]} async\n\t */\n\tfunction finish(async) {\n\t\tif ((parent.f & DESTROYED) !== 0) {\n\t\t\treturn;\n\t\t}\n\n\t\trestore();\n\n\t\ttry {\n\t\t\tfn([...deriveds, ...async]);\n\t\t} catch (error) {\n\t\t\tinvoke_error_boundary(error, parent);\n\t\t}\n\n\t\tunset_context();\n\t}\n\n\tvar decrement_pending = increment_pending();\n\n\t// Fast path: blockers but no async expressions\n\tif (async.length === 0) {\n\t\t/** @type {Promise<any>} */ (blocker_promise).then(() => finish([])).finally(decrement_pending);\n\t\treturn;\n\t}\n\n\t// Full path: has async expressions\n\tfunction run() {\n\t\tPromise.all(async.map((expression) => async_derived(expression)))\n\t\t\t.then(finish)\n\t\t\t.catch((error) => invoke_error_boundary(error, parent))\n\t\t\t.finally(decrement_pending);\n\t}\n\n\tif (blocker_promise) {\n\t\tblocker_promise.then(() => {\n\t\t\trestore();\n\t\t\trun();\n\t\t\tunset_context();\n\t\t});\n\t} else {\n\t\trun();\n\t}\n}\n\n/**\n * @param {Blocker[]} blockers\n * @param {(values: Value[]) => any} fn\n */\nexport function run_after_blockers(blockers, fn) {\n\tflatten(blockers, [], [], fn);\n}\n\n/**\n * Captures the current effect context so that we can restore it after\n * some asynchronous work has happened (so that e.g. `await a + b`\n * causes `b` to be registered as a dependency).\n */\nexport function capture() {\n\tvar previous_effect = /** @type {Effect} */ (active_effect);\n\tvar previous_reaction = active_reaction;\n\tvar previous_component_context = component_context;\n\tvar previous_batch = /** @type {Batch} */ (current_batch);\n\n\tif (DEV) {\n\t\tvar previous_dev_stack = dev_stack;\n\t}\n\n\treturn function restore(activate_batch = true) {\n\t\tset_active_effect(previous_effect);\n\t\tset_active_reaction(previous_reaction);\n\t\tset_component_context(previous_component_context);\n\n\t\tif (activate_batch && (previous_effect.f & DESTROYED) === 0) {\n\t\t\t// TODO we only need optional chaining here because `{#await ...}` blocks\n\t\t\t// are anomalous. Once we retire them we can get rid of it\n\t\t\tprevious_batch?.activate();\n\t\t\tprevious_batch?.apply();\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tset_reactivity_loss_tracker(null);\n\t\t\tset_dev_stack(previous_dev_stack);\n\t\t}\n\t};\n}\n\n/**\n * Wraps an `await` expression in such a way that the effect context that was\n * active before the expression evaluated can be reapplied afterwards —\n * `await a + b` becomes `(await $.save(a))() + b`\n * @template T\n * @param {Promise<T>} promise\n * @returns {Promise<() => T>}\n */\nexport async function save(promise) {\n\tvar restore = capture();\n\tvar value = await promise;\n\n\treturn () => {\n\t\trestore();\n\t\tqueue_micro_task(unset_context);\n\t\treturn value;\n\t};\n}\n\n/**\n * Reset `current_async_effect` after the `promise` resolves, so\n * that we can emit `await_reactivity_loss` warnings\n * @template T\n * @param {Promise<T>} promise\n * @returns {Promise<() => T>}\n */\nexport async function track_reactivity_loss(promise) {\n\tvar previous_reactivity_loss_tracker = reactivity_loss_tracker;\n\t// Ensure that unrelated reads after an async operation is kicked off don't cause false positives\n\tqueueMicrotask(() => {\n\t\tif (reactivity_loss_tracker === previous_reactivity_loss_tracker) {\n\t\t\tset_reactivity_loss_tracker(null);\n\t\t}\n\t});\n\n\tvar value = await promise;\n\n\treturn () => {\n\t\tset_reactivity_loss_tracker(previous_reactivity_loss_tracker);\n\t\t// While this can result in false negatives it also guards against the more important\n\t\t// false positives that would occur if this is the last in a chain of async operations,\n\t\t// and the reactivity_loss_tracker would then stay around until the next async operation happens.\n\t\tqueueMicrotask(() => {\n\t\t\tif (reactivity_loss_tracker === previous_reactivity_loss_tracker) {\n\t\t\t\tset_reactivity_loss_tracker(null);\n\t\t\t}\n\t\t});\n\n\t\treturn value;\n\t};\n}\n\n/**\n * Used in `for await` loops in DEV, so\n * that we can emit `await_reactivity_loss` warnings\n * after each `async_iterator` result resolves and\n * after the `async_iterator` return resolves (if it runs)\n * @template T\n * @template TReturn\n * @param {Iterable<T> | AsyncIterable<T>} iterable\n * @returns {AsyncGenerator<T, TReturn | undefined>}\n */\nexport async function* for_await_track_reactivity_loss(iterable) {\n\t// This is based on the algorithms described in ECMA-262:\n\t// ForIn/OfBodyEvaluation\n\t// https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset\n\t// AsyncIteratorClose\n\t// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-asynciteratorclose\n\n\t/** @type {AsyncIterator<T, TReturn>} */\n\t// @ts-ignore\n\tconst iterator = iterable[Symbol.asyncIterator]?.() ?? iterable[Symbol.iterator]?.();\n\n\tif (iterator === undefined) {\n\t\tthrow new TypeError('value is not async iterable');\n\t}\n\n\t// eslint-disable-next-line no-useless-assignment\n\tlet invoke_return = true;\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = (await track_reactivity_loss(iterator.next()))();\n\t\t\tif (done) {\n\t\t\t\tinvoke_return = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar prev = reactivity_loss_tracker;\n\t\t\ttry {\n\t\t\t\tyield value;\n\t\t\t} catch (e) {\n\t\t\t\tset_reactivity_loss_tracker(prev);\n\t\t\t\t// If the yield throws, we need to call `return` but not return its value, instead rethrow\n\t\t\t\tif (iterator.return !== undefined) {\n\t\t\t\t\t(await track_reactivity_loss(iterator.return()))();\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tset_reactivity_loss_tracker(prev);\n\t\t}\n\t} catch (error) {\n\t\tinvoke_return = false;\n\t\tthrow error;\n\t} finally {\n\t\t// If the iterator had an abrupt completion (break) and `return` is defined on the iterator, call it and return the value\n\t\tif (invoke_return && iterator.return !== undefined) {\n\t\t\t// eslint-disable-next-line no-unsafe-finally\n\t\t\treturn /** @type {TReturn} */ ((await track_reactivity_loss(iterator.return()))().value);\n\t\t}\n\t}\n}\n\nexport function unset_context(deactivate_batch = true) {\n\tset_active_effect(null);\n\tset_active_reaction(null);\n\tset_component_context(null);\n\tif (deactivate_batch) current_batch?.deactivate();\n\n\tif (DEV) {\n\t\tset_reactivity_loss_tracker(null);\n\t\tset_dev_stack(null);\n\t}\n}\n\n/**\n * @param {Array<() => void | Promise<void>>} thunks\n */\nexport function run(thunks) {\n\tconst restore = capture();\n\n\tconst decrement_pending = increment_pending();\n\n\tvar active = /** @type {Effect} */ (active_effect);\n\n\t/** @type {null | { error: any }} */\n\tvar errored = null;\n\n\t/** @param {any} error */\n\tconst handle_error = (error) => {\n\t\terrored = { error }; // wrap in object in case a promise rejects with a falsy value\n\n\t\tif (!aborted(active)) {\n\t\t\tinvoke_error_boundary(error, active);\n\t\t}\n\t};\n\n\tvar promise = Promise.resolve(thunks[0]()).catch(handle_error);\n\n\t/** @type {Blocker} */\n\tvar blocker = { promise, settled: false };\n\tvar blockers = [blocker];\n\n\tpromise.finally(() => {\n\t\tblocker.settled = true;\n\t\tunset_context();\n\t});\n\n\tfor (const fn of thunks.slice(1)) {\n\t\tpromise = promise\n\t\t\t.then(() => {\n\t\t\t\trestore();\n\n\t\t\t\ttry {\n\t\t\t\t\tif (errored) {\n\t\t\t\t\t\tthrow errored.error;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (aborted(active)) {\n\t\t\t\t\t\tthrow STALE_REACTION;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn fn();\n\t\t\t\t} finally {\n\t\t\t\t\t// We gotta unset context directly in case the function returns a promise, in which case\n\t\t\t\t\t// unset_context in .finally() would be too late ...\n\t\t\t\t\tunset_context();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(handle_error);\n\n\t\tconst blocker = { promise, settled: false };\n\t\tblockers.push(blocker);\n\n\t\tpromise.finally(() => {\n\t\t\tblocker.settled = true;\n\t\t\t// ... but we also need it after such a promise has resolved in case it restores our context\n\t\t\tunset_context();\n\t\t});\n\t}\n\n\tpromise\n\t\t// wait one more tick, so that template effects are\n\t\t// guaranteed to run before `$effect(...)`\n\t\t.then(() => Promise.resolve())\n\t\t.finally(decrement_pending);\n\n\treturn blockers;\n}\n\n/**\n * @param {Blocker[]} blockers\n */\nexport function wait(blockers) {\n\treturn Promise.all(blockers.map((b) => b.promise));\n}\n\n/**\n * @returns {(skip?: boolean) => void}\n */\nexport function increment_pending() {\n\tvar effect = /** @type {Effect} */ (active_effect);\n\tvar boundary = effect.b; // undefined if called outside the render tree, e.g. a standalone $effect.root\n\tvar batch = /** @type {Batch} */ (current_batch);\n\tvar blocking = !!boundary?.is_rendered();\n\n\tboundary?.update_pending_count(1, batch);\n\tbatch.increment(blocking, effect);\n\n\treturn () => {\n\t\tboundary?.update_pending_count(-1, batch);\n\t\tbatch.decrement(blocking, effect);\n\t};\n}\n","/** @import { Derived, Effect, Reaction, Source, Value } from '#client' */\n/** @import { Batch } from './batch.js'; */\n/** @import { Boundary } from '../dom/blocks/boundary.js'; */\nimport { DEV } from 'esm-env';\nimport {\n\tERROR_VALUE,\n\tDERIVED,\n\tDIRTY,\n\tEFFECT_PRESERVED,\n\tSTALE_REACTION,\n\tASYNC,\n\tWAS_MARKED,\n\tDESTROYED,\n\tCLEAN,\n\tREACTION_RAN,\n\tINERT\n} from '#client/constants';\nimport {\n\tactive_reaction,\n\tactive_effect,\n\tupdate_reaction,\n\tincrement_write_version,\n\tset_active_effect,\n\tpush_reaction_value,\n\tis_destroying_effect,\n\tupdate_effect,\n\tremove_reactions,\n\tskipped_deps,\n\tnew_deps\n} from '../runtime.js';\nimport { equals, safe_equals } from './equality.js';\nimport * as e from '../errors.js';\nimport * as w from '../warnings.js';\nimport {\n\tasync_effect,\n\tdestroy_effect,\n\tdestroy_effect_children,\n\teffect_tracking,\n\tteardown\n} from './effects.js';\nimport { eager_effects, internal_set, set_eager_effects, source } from './sources.js';\nimport { get_error } from '../../shared/dev.js';\nimport { async_mode_flag, tracing_mode_flag } from '../../flags/index.js';\nimport { component_context } from '../context.js';\nimport { UNINITIALIZED } from '../../../constants.js';\nimport { batch_values, current_batch, previous_batch } from './batch.js';\nimport { increment_pending, unset_context } from './async.js';\nimport { deferred, includes, noop } from '../../shared/utils.js';\nimport { set_signal_status, update_derived_status } from './status.js';\n\n/**\n * This allows us to track 'reactivity loss' that occurs when signals\n * are read after a non-context-restoring `await`. Dev-only\n * @type {{ effect: Effect, effect_deps: Set<Value>, warned: boolean } | null}\n */\nexport let reactivity_loss_tracker = null;\n\n/** @param {{ effect: Effect, effect_deps: Set<Value>, warned: boolean } | null} v */\nexport function set_reactivity_loss_tracker(v) {\n\treactivity_loss_tracker = v;\n}\n\nexport const recent_async_deriveds = new Set();\n\n/**\n * @template V\n * @param {() => V} fn\n * @returns {Derived<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function derived(fn) {\n\tvar flags = DERIVED | DIRTY;\n\n\tif (active_effect !== null) {\n\t\t// Since deriveds are evaluated lazily, any effects created inside them are\n\t\t// created too late to ensure that the parent effect is added to the tree\n\t\tactive_effect.f |= EFFECT_PRESERVED;\n\t}\n\n\t/** @type {Derived<V>} */\n\tconst signal = {\n\t\tctx: component_context,\n\t\tdeps: null,\n\t\teffects: null,\n\t\tequals,\n\t\tf: flags,\n\t\tfn,\n\t\treactions: null,\n\t\trv: 0,\n\t\tv: /** @type {V} */ (UNINITIALIZED),\n\t\twv: 0,\n\t\tparent: active_effect,\n\t\tac: null\n\t};\n\n\tif (DEV && tracing_mode_flag) {\n\t\tsignal.created = get_error('created at');\n\t}\n\n\treturn signal;\n}\n\nexport const OBSOLETE = Symbol('obsolete');\n\n/**\n * @template V\n * @param {() => V | Promise<V>} fn\n * @param {string} [label]\n * @param {string} [location] If provided, print a warning if the value is not read immediately after update\n * @returns {Promise<Source<V>>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function async_derived(fn, label, location) {\n\tlet parent = /** @type {Effect | null} */ (active_effect);\n\n\tif (parent === null) {\n\t\te.async_derived_orphan();\n\t}\n\n\tvar promise = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined));\n\tvar signal = source(/** @type {V} */ (UNINITIALIZED));\n\n\tif (DEV) signal.label = label ?? fn.toString();\n\n\t// only suspend in async deriveds created on initialisation\n\tvar should_suspend = !active_reaction;\n\n\t/** @type {Set<ReturnType<typeof deferred<V>>>} */\n\tvar deferreds = new Set();\n\n\tasync_effect(() => {\n\t\tvar effect = /** @type {Effect} */ (active_effect);\n\n\t\tif (DEV) {\n\t\t\treactivity_loss_tracker = { effect, effect_deps: new Set(), warned: false };\n\t\t}\n\n\t\t/** @type {ReturnType<typeof deferred<V>>} */\n\t\tvar d = deferred();\n\t\tpromise = d.promise;\n\n\t\ttry {\n\t\t\t// If this code is changed at some point, make sure to still access the then property\n\t\t\t// of fn() to read any signals it might access, so that we track them as dependencies.\n\t\t\t// We call `unset_context` to undo any `save` calls that happen inside `fn()`\n\t\t\tPromise.resolve(fn())\n\t\t\t\t.then(d.resolve, (e) => {\n\t\t\t\t\t// if the promise was rejected by the user, via `getAbortSignal`, then\n\t\t\t\t\t// wait for a subsequent resolution instead of flushing the batch\n\t\t\t\t\tif (e !== STALE_REACTION) d.reject(e);\n\t\t\t\t})\n\t\t\t\t.finally(unset_context);\n\t\t} catch (error) {\n\t\t\td.reject(error);\n\t\t\tunset_context();\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tif (reactivity_loss_tracker) {\n\t\t\t\t// Reused deps from previous run (indices 0 to skipped_deps-1)\n\t\t\t\t// We deliberately only track direct dependencies of the async expression to encourage\n\t\t\t\t// dependencies being directly visible at the point of the expression\n\t\t\t\tif (effect.deps !== null) {\n\t\t\t\t\tfor (let i = 0; i < skipped_deps; i += 1) {\n\t\t\t\t\t\treactivity_loss_tracker.effect_deps.add(effect.deps[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// New deps discovered this run\n\t\t\t\tif (new_deps !== null) {\n\t\t\t\t\tfor (let i = 0; i < new_deps.length; i += 1) {\n\t\t\t\t\t\treactivity_loss_tracker.effect_deps.add(new_deps[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treactivity_loss_tracker = null;\n\t\t}\n\n\t\tvar batch = /** @type {Batch} */ (current_batch);\n\n\t\tif (should_suspend) {\n\t\t\t// we only increment the batch's pending state for updates, not creation, otherwise\n\t\t\t// we will decrement to zero before the work that depends on this promise (e.g. a\n\t\t\t// template effect) has initialized, causing the batch to resolve prematurely\n\t\t\tif ((effect.f & REACTION_RAN) !== 0) {\n\t\t\t\tvar decrement_pending = increment_pending();\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// boundary can be null if the async derived is inside an $effect.root not connected to the component render tree\n\t\t\t\tparent.b?.is_rendered()\n\t\t\t) {\n\t\t\t\tbatch.async_deriveds.get(effect)?.reject(OBSOLETE);\n\t\t\t} else {\n\t\t\t\t// While the boundary is still showing pending, a new run supersedes all older in-flight runs\n\t\t\t\t// for this async expression. Cancel eagerly so resolution cannot commit stale values.\n\t\t\t\tfor (const d of deferreds.values()) {\n\t\t\t\t\td.reject(OBSOLETE);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdeferreds.add(d);\n\t\t\tbatch.async_deriveds.set(effect, d);\n\t\t}\n\n\t\t/**\n\t\t * @param {any} value\n\t\t * @param {unknown} error\n\t\t */\n\t\tconst handler = (value, error = undefined) => {\n\t\t\tif (DEV) {\n\t\t\t\treactivity_loss_tracker = null;\n\t\t\t}\n\n\t\t\tdecrement_pending?.();\n\t\t\tdeferreds.delete(d);\n\n\t\t\tif (error === OBSOLETE) return;\n\n\t\t\tbatch.activate();\n\n\t\t\tif (error) {\n\t\t\t\tsignal.f |= ERROR_VALUE;\n\n\t\t\t\t// @ts-expect-error the error is the wrong type, but we don't care\n\t\t\t\tinternal_set(signal, error);\n\t\t\t} else {\n\t\t\t\tif ((signal.f & ERROR_VALUE) !== 0) {\n\t\t\t\t\tsignal.f ^= ERROR_VALUE;\n\t\t\t\t}\n\n\t\t\t\tif (DEV && location !== undefined && !signal.equals(value)) {\n\t\t\t\t\trecent_async_deriveds.add(signal);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (recent_async_deriveds.has(signal) && (effect.f & DESTROYED) === 0) {\n\t\t\t\t\t\t\tw.await_waterfall(/** @type {string} */ (signal.label), location);\n\t\t\t\t\t\t\trecent_async_deriveds.delete(signal);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tinternal_set(signal, value);\n\t\t\t}\n\n\t\t\tbatch.deactivate();\n\t\t};\n\n\t\td.promise.then(handler, (e) => handler(null, e || 'unknown'));\n\t});\n\n\tteardown(() => {\n\t\tfor (const d of deferreds) {\n\t\t\td.reject(OBSOLETE);\n\t\t}\n\t});\n\n\tif (DEV) {\n\t\t// add a flag that lets this be printed as a derived\n\t\t// when using `$inspect.trace()`\n\t\tsignal.f |= ASYNC;\n\t}\n\n\treturn new Promise((fulfil) => {\n\t\t/** @param {Promise<V>} p */\n\t\tfunction next(p) {\n\t\t\tfunction go() {\n\t\t\t\tif (p === promise) {\n\t\t\t\t\tfulfil(signal);\n\t\t\t\t} else {\n\t\t\t\t\t// if the effect re-runs before the initial promise\n\t\t\t\t\t// resolves, delay resolution until we have a value\n\t\t\t\t\tnext(promise);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tp.then(go, go);\n\t\t}\n\n\t\tnext(promise);\n\t});\n}\n\n/**\n * @template V\n * @param {() => V} fn\n * @returns {Derived<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function user_derived(fn) {\n\tconst d = derived(fn);\n\n\tif (!async_mode_flag) push_reaction_value(d);\n\n\treturn d;\n}\n\n/**\n * @template V\n * @param {() => V} fn\n * @returns {Derived<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function derived_safe_equal(fn) {\n\tconst signal = derived(fn);\n\tsignal.equals = safe_equals;\n\treturn signal;\n}\n\n/**\n * @param {Derived} derived\n * @returns {void}\n */\nexport function destroy_derived_effects(derived) {\n\tvar effects = derived.effects;\n\n\tif (effects !== null) {\n\t\tderived.effects = null;\n\n\t\tfor (var i = 0; i < effects.length; i += 1) {\n\t\t\tdestroy_effect(/** @type {Effect} */ (effects[i]));\n\t\t}\n\t}\n}\n\n/**\n * The currently updating deriveds, used to detect infinite recursion\n * in dev mode and provide a nicer error than 'too much recursion'\n * @type {Derived[]}\n */\nlet stack = [];\n\n/**\n * @template T\n * @param {Derived} derived\n * @returns {T}\n */\nexport function execute_derived(derived) {\n\tvar value;\n\tvar prev_active_effect = active_effect;\n\tvar parent = derived.parent;\n\n\tif (\n\t\t!is_destroying_effect &&\n\t\tparent !== null &&\n\t\tderived.v !== UNINITIALIZED && // if it was never evaluated before, it's guaranteed to fail downstream, so we try to execute instead\n\t\t(parent.f & (DESTROYED | INERT)) !== 0\n\t) {\n\t\tw.derived_inert();\n\n\t\treturn derived.v;\n\t}\n\n\tset_active_effect(parent);\n\n\tif (DEV) {\n\t\tlet prev_eager_effects = eager_effects;\n\t\tset_eager_effects(new Set());\n\t\ttry {\n\t\t\tif (includes.call(stack, derived)) {\n\t\t\t\te.derived_references_self();\n\t\t\t}\n\n\t\t\tstack.push(derived);\n\n\t\t\tderived.f &= ~WAS_MARKED;\n\t\t\tdestroy_derived_effects(derived);\n\t\t\tvalue = update_reaction(derived);\n\t\t} finally {\n\t\t\tset_active_effect(prev_active_effect);\n\t\t\tset_eager_effects(prev_eager_effects);\n\t\t\tstack.pop();\n\t\t}\n\t} else {\n\t\ttry {\n\t\t\tderived.f &= ~WAS_MARKED;\n\t\t\tdestroy_derived_effects(derived);\n\t\t\tvalue = update_reaction(derived);\n\t\t} finally {\n\t\t\tset_active_effect(prev_active_effect);\n\t\t}\n\t}\n\n\treturn value;\n}\n\n/**\n * @param {Derived} derived\n * @returns {void}\n */\nexport function update_derived(derived) {\n\tvar value = execute_derived(derived);\n\n\tif (!derived.equals(value)) {\n\t\tderived.wv = increment_write_version();\n\n\t\t// in a fork, we don't update the underlying value, just `batch_values`.\n\t\t// the underlying value will be updated when the fork is committed.\n\t\t// otherwise, the next time we get here after a 'real world' state\n\t\t// change, `derived.equals` may incorrectly return `true`\n\t\tif (!current_batch?.is_fork || derived.deps === null) {\n\t\t\tif (current_batch !== null) {\n\t\t\t\t// We also write to previous_batch because if it exists, it is a sign that we're\n\t\t\t\t// currently in the process of flushing effects. These updates to deriveds may belong\n\t\t\t\t// to the previous batch, not the new one (which can already exist if an earlier\n\t\t\t\t// effect wrote to a source). This can cause bugs when running batch.#commit() later,\n\t\t\t\t// but not adding it to current_batch can, too, so we add it to both.\n\t\t\t\t// See https://github.com/sveltejs/svelte/pull/18117 for more details.\n\t\t\t\tcurrent_batch.capture(derived, value, true);\n\t\t\t\tprevious_batch?.capture(derived, value, true);\n\t\t\t} else {\n\t\t\t\tderived.v = value;\n\t\t\t}\n\n\t\t\t// deriveds without dependencies should never be recomputed\n\t\t\tif (derived.deps === null) {\n\t\t\t\tset_signal_status(derived, CLEAN);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// don't mark derived clean if we're reading it inside a\n\t// cleanup function, or it will cache a stale value\n\tif (is_destroying_effect) {\n\t\treturn;\n\t}\n\n\t// During time traveling we don't want to reset the status so that\n\t// traversal of the graph in the other batches still happens\n\tif (batch_values !== null) {\n\t\t// only cache the value if we're in a tracking context, otherwise we won't\n\t\t// clear the cache in `mark_reactions` when dependencies are updated\n\t\tif (effect_tracking() || current_batch?.is_fork) {\n\t\t\tbatch_values.set(derived, value);\n\t\t}\n\t} else {\n\t\tupdate_derived_status(derived);\n\t}\n}\n\n/**\n * @param {Derived} derived\n */\nexport function freeze_derived_effects(derived) {\n\tif (derived.effects === null) return;\n\n\tfor (const e of derived.effects) {\n\t\t// if the effect has a teardown function or abort signal, call it\n\t\tif (e.teardown || e.ac) {\n\t\t\te.teardown?.();\n\t\t\te.ac?.abort(STALE_REACTION);\n\n\t\t\t// make it a noop so it doesn't get called again if the derived\n\t\t\t// is unfrozen. we don't set it to `null`, because the existence\n\t\t\t// of a teardown function is what determines whether the\n\t\t\t// effect runs again during unfreezing (but not for teardown-only effects)\n\t\t\tif (e.fn !== null) e.teardown = noop;\n\t\t\te.ac = null;\n\n\t\t\tremove_reactions(e, 0);\n\t\t\tdestroy_effect_children(e);\n\t\t}\n\t}\n}\n\n/**\n * @param {Derived} derived\n */\nexport function unfreeze_derived_effects(derived) {\n\tif (derived.effects === null) return;\n\n\tfor (const e of derived.effects) {\n\t\t// if the effect was previously frozen — indicated by the presence\n\t\t// of a teardown function — unfreeze it\n\t\tif (e.teardown && e.fn !== null) {\n\t\t\tupdate_effect(e);\n\t\t}\n\t}\n}\n","/** @import { Fork } from 'svelte' */\n/** @import { Derived, Effect, Reaction, Source, Value } from '#client' */\nimport {\n\tBLOCK_EFFECT,\n\tBRANCH_EFFECT,\n\tCLEAN,\n\tDESTROYED,\n\tDIRTY,\n\tEFFECT,\n\tASYNC,\n\tINERT,\n\tRENDER_EFFECT,\n\tROOT_EFFECT,\n\tMAYBE_DIRTY,\n\tDERIVED,\n\tEAGER_EFFECT,\n\tERROR_VALUE,\n\tMANAGED_EFFECT,\n\tREACTION_RAN,\n\tDESTROYING\n} from '#client/constants';\nimport { async_mode_flag } from '../../flags/index.js';\nimport { deferred, define_property, includes } from '../../shared/utils.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tget,\n\tincrement_write_version,\n\tis_dirty,\n\tupdate_effect\n} from '../runtime.js';\nimport * as e from '../errors.js';\nimport { flush_tasks, queue_micro_task } from '../dom/task.js';\nimport { DEV } from 'esm-env';\nimport { invoke_error_boundary } from '../error-handling.js';\nimport { flush_eager_effects, old_values, set_eager_effects, source, update } from './sources.js';\nimport { eager_effect, teardown, unlink_effect } from './effects.js';\nimport { defer_effect } from './utils.js';\nimport { UNINITIALIZED } from '../../../constants.js';\nimport { set_signal_status } from './status.js';\nimport { legacy_is_updating_store } from './store.js';\nimport { invariant } from '../../shared/dev.js';\nimport { log_effect_tree } from '../dev/debug.js';\nimport { OBSOLETE } from './deriveds.js';\n\n/** @type {Batch | null} */\nlet first_batch = null;\n\n/** @type {Batch | null} */\nlet last_batch = null;\n\n/** @type {Batch | null} */\nexport let current_batch = null;\n\n/**\n * This is needed to avoid overwriting inputs\n * @type {Batch | null}\n */\nexport let previous_batch = null;\n\n/**\n * When time travelling (i.e. working in one batch, while other batches\n * still have ongoing work), we ignore the real values of affected\n * signals in favour of their values within the batch\n * @type {Map<Value, any> | null}\n */\nexport let batch_values = null;\n\n/** @type {Effect | null} */\nlet last_scheduled_effect = null;\n\nexport let is_flushing_sync = false;\nlet is_processing = false;\n\n/**\n * During traversal, this is an array. Newly created effects are (if not immediately\n * executed) pushed to this array, rather than going through the scheduling\n * rigamarole that would cause another turn of the flush loop.\n * @type {Effect[] | null}\n */\nexport let collected_effects = null;\n\n/**\n * An array of effects that are marked during traversal as a result of a `set`\n * (not `internal_set`) call. These will be added to the next batch and\n * trigger another `batch.process()`\n * @type {Effect[] | null}\n * @deprecated when we get rid of legacy mode and stores, we can get rid of this\n */\nexport let legacy_updates = null;\n\nvar flush_count = 0;\n\n/** @type {Set<Value>} */\nvar source_stacks = new Set();\n\nlet uid = 1;\n\nexport class Batch {\n\tid = uid++;\n\n\t/** True as soon as `#process` was called */\n\t#started = false;\n\n\tlinked = true;\n\n\t/** @type {Batch | null} */\n\t#prev = null;\n\n\t/** @type {Batch | null} */\n\t#next = null;\n\n\t/** @type {Map<Effect, ReturnType<typeof deferred<any>>>} */\n\tasync_deriveds = new Map();\n\n\t/**\n\t * The current values of any signals that are updated in this batch.\n\t * Tuple format: [value, is_derived] (note: is_derived is false for deriveds, too, if they were overridden via assignment)\n\t * They keys of this map are identical to `this.#previous`\n\t * @type {Map<Value, [any, boolean]>}\n\t */\n\tcurrent = new Map();\n\n\t/**\n\t * The values of any signals (sources and deriveds) that are updated in this batch _before_ those updates took place.\n\t * They keys of this map are identical to `this.#current`\n\t * @type {Map<Value, any>}\n\t */\n\tprevious = new Map();\n\n\t/**\n\t * When the batch is committed (and the DOM is updated), we need to remove old branches\n\t * and append new ones by calling the functions added inside (if/each/key/etc) blocks\n\t * @type {Set<(batch: Batch) => void>}\n\t */\n\t#commit_callbacks = new Set();\n\n\t/**\n\t * If a fork is discarded, we need to destroy any effects that are no longer needed\n\t * @type {Set<(batch: Batch) => void>}\n\t */\n\t#discard_callbacks = new Set();\n\n\t/**\n\t * The number of async effects that are currently in flight\n\t */\n\t#pending = 0;\n\n\t/**\n\t * Async effects that are currently in flight, _not_ inside a pending boundary\n\t * @type {Map<Effect, number>}\n\t */\n\t#blocking_pending = new Map();\n\n\t/**\n\t * A deferred that resolves when the batch is committed, used with `settled()`\n\t * TODO replace with Promise.withResolvers once supported widely enough\n\t * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null}\n\t */\n\t#deferred = null;\n\n\t/**\n\t * The root effects that need to be flushed\n\t * @type {Effect[]}\n\t */\n\t#roots = [];\n\n\t/**\n\t * Effects created while this batch was active.\n\t * @type {Effect[]}\n\t */\n\t#new_effects = [];\n\n\t/**\n\t * Deferred effects (which run after async work has completed) that are DIRTY\n\t * @type {Set<Effect>}\n\t */\n\t#dirty_effects = new Set();\n\n\t/**\n\t * Deferred effects that are MAYBE_DIRTY\n\t * @type {Set<Effect>}\n\t */\n\t#maybe_dirty_effects = new Set();\n\n\t/**\n\t * A map of branches that still exist, but will be destroyed when this batch\n\t * is committed — we skip over these during `process`.\n\t * The value contains child effects that were dirty/maybe_dirty before being reset,\n\t * so they can be rescheduled if the branch survives.\n\t * @type {Map<Effect, { d: Effect[], m: Effect[] }>}\n\t */\n\t#skipped_branches = new Map();\n\n\t/**\n\t * Inverse of #skipped_branches which we need to tell prior batches to unskip them when committing\n\t * @type {Set<Effect>}\n\t */\n\t#unskipped_branches = new Set();\n\n\tis_fork = false;\n\n\t#decrement_queued = false;\n\n\tconstructor() {\n\t\t// link batch\n\t\tif (last_batch === null) {\n\t\t\tfirst_batch = last_batch = this;\n\t\t} else {\n\t\t\tlast_batch.#next = this;\n\t\t\tthis.#prev = last_batch;\n\t\t}\n\n\t\tlast_batch = this;\n\t}\n\n\t#is_deferred() {\n\t\tif (this.is_fork) return true;\n\n\t\tfor (const effect of this.#blocking_pending.keys()) {\n\t\t\tvar e = effect;\n\t\t\tvar skipped = false;\n\n\t\t\twhile (e.parent !== null) {\n\t\t\t\tif (this.#skipped_branches.has(e)) {\n\t\t\t\t\tskipped = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\te = e.parent;\n\t\t\t}\n\n\t\t\tif (!skipped) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Add an effect to the #skipped_branches map and reset its children\n\t * @param {Effect} effect\n\t */\n\tskip_effect(effect) {\n\t\tif (!this.#skipped_branches.has(effect)) {\n\t\t\tthis.#skipped_branches.set(effect, { d: [], m: [] });\n\t\t}\n\t\tthis.#unskipped_branches.delete(effect);\n\t}\n\n\t/**\n\t * Remove an effect from the #skipped_branches map and reschedule\n\t * any tracked dirty/maybe_dirty child effects\n\t * @param {Effect} effect\n\t * @param {(e: Effect) => void} callback\n\t */\n\tunskip_effect(effect, callback = (e) => this.schedule(e)) {\n\t\tvar tracked = this.#skipped_branches.get(effect);\n\t\tif (tracked) {\n\t\t\tthis.#skipped_branches.delete(effect);\n\n\t\t\tfor (var e of tracked.d) {\n\t\t\t\tset_signal_status(e, DIRTY);\n\t\t\t\tcallback(e);\n\t\t\t}\n\n\t\t\tfor (e of tracked.m) {\n\t\t\t\tset_signal_status(e, MAYBE_DIRTY);\n\t\t\t\tcallback(e);\n\t\t\t}\n\t\t}\n\t\tthis.#unskipped_branches.add(effect);\n\t}\n\n\t#process() {\n\t\tthis.#started = true;\n\n\t\tif (flush_count++ > 1000) {\n\t\t\tthis.#unlink();\n\t\t\tinfinite_loop_guard();\n\t\t}\n\n\t\tif (DEV) {\n\t\t\t// track all the values that were updated during this flush,\n\t\t\t// so that they can be reset afterwards\n\t\t\tfor (const value of this.current.keys()) {\n\t\t\t\tsource_stacks.add(value);\n\t\t\t}\n\t\t}\n\n\t\t// We always reschedule previously-deferred effects, not just when\n\t\t// #is_deferred() is true, because traversing the tree could make\n\t\t// an if block that contains the last blocking pending effect falsy,\n\t\t// causing the block to no longer be deferred.\n\t\tfor (const e of this.#dirty_effects) {\n\t\t\tthis.#maybe_dirty_effects.delete(e);\n\t\t\tset_signal_status(e, DIRTY);\n\t\t\tthis.schedule(e);\n\t\t}\n\n\t\tfor (const e of this.#maybe_dirty_effects) {\n\t\t\tset_signal_status(e, MAYBE_DIRTY);\n\t\t\tthis.schedule(e);\n\t\t}\n\n\t\tconst roots = this.#roots;\n\t\tthis.#roots = [];\n\n\t\tthis.apply();\n\n\t\t/** @type {Effect[]} */\n\t\tvar effects = (collected_effects = []);\n\n\t\t/** @type {Effect[]} */\n\t\tvar render_effects = [];\n\n\t\t/**\n\t\t * @type {Effect[]}\n\t\t * @deprecated when we get rid of legacy mode and stores, we can get rid of this\n\t\t */\n\t\tvar updates = (legacy_updates = []);\n\n\t\tfor (const root of roots) {\n\t\t\ttry {\n\t\t\t\tthis.#traverse(root, effects, render_effects);\n\t\t\t} catch (e) {\n\t\t\t\treset_all(root);\n\t\t\t\t// If there's no async work left, this branch is now dead and needs\n\t\t\t\t// to be discarded to not become a zombie that is never cleaned up.\n\t\t\t\t// See https://github.com/sveltejs/svelte/issues/18221#issuecomment-4497918414\n\t\t\t\t// for a (non-minimal) reproduction that demonstrates a case where this is necessary\n\t\t\t\t// to not get follow-up false-positives via \"batch has scheduled roots\" invariant errors.\n\t\t\t\tif (!this.#is_deferred()) this.discard();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\n\t\t// any writes should take effect in a subsequent batch\n\t\tcurrent_batch = null;\n\n\t\tif (updates.length > 0) {\n\t\t\tvar batch = Batch.ensure();\n\t\t\tfor (const e of updates) {\n\t\t\t\tbatch.schedule(e);\n\t\t\t}\n\t\t}\n\n\t\tcollected_effects = null;\n\t\tlegacy_updates = null;\n\n\t\t// if the batch has outstanding pending work, stash effects and bail\n\t\tif (this.#is_deferred()) {\n\t\t\tthis.#defer_effects(render_effects);\n\t\t\tthis.#defer_effects(effects);\n\n\t\t\tfor (const [e, t] of this.#skipped_branches) {\n\t\t\t\treset_branch(e, t);\n\t\t\t}\n\n\t\t\tif (updates.length > 0) {\n\t\t\t\t/** @type {Batch} */ (/** @type {unknown} */ (current_batch)).#process();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst earlier_batch = this.#find_earlier_batch();\n\n\t\tif (earlier_batch) {\n\t\t\t// If this batch collected deferred effects during traversal, they still need\n\t\t\t// to run after being merged into the earlier batch.\n\t\t\tthis.#defer_effects(render_effects);\n\t\t\tthis.#defer_effects(effects);\n\t\t\tearlier_batch.#merge(this);\n\t\t\treturn;\n\t\t}\n\n\t\t// clear effects. Those that are still needed will be rescheduled through unskipping the skipped branches.\n\t\tthis.#dirty_effects.clear();\n\t\tthis.#maybe_dirty_effects.clear();\n\n\t\t// append/remove branches\n\t\tfor (const fn of this.#commit_callbacks) fn(this);\n\t\tthis.#commit_callbacks.clear();\n\n\t\tprevious_batch = this;\n\t\tflush_queued_effects(render_effects);\n\t\tflush_queued_effects(effects);\n\t\tprevious_batch = null;\n\n\t\tthis.#deferred?.resolve();\n\n\t\tvar next_batch = /** @type {Batch | null} */ (/** @type {unknown} */ (current_batch));\n\n\t\tif (this.#pending === 0 && (this.#roots.length === 0 || next_batch !== null)) {\n\t\t\tthis.#unlink();\n\n\t\t\t// Order matters here - we need to commit and THEN continue flushing new batches, not the other way around,\n\t\t\t// else we could start flushing a new batch and then, if it has pending work, rebase it right afterwards, which is wrong.\n\t\t\t// In sync mode flushSync can cause #commit to wrongfully think that there needs to be a rebase, so we only do it in async mode\n\t\t\t// TODO fix the underlying cause, otherwise this will likely regress when non-async mode is removed\n\t\t\tif (async_mode_flag) {\n\t\t\t\tthis.#commit();\n\t\t\t\t// Rebases can activate other batches or null it out, therefore restore the new one here\n\t\t\t\tcurrent_batch = next_batch;\n\t\t\t}\n\t\t}\n\n\t\t// Edge case: During traversal new branches might create effects that run immediately and set state,\n\t\t// causing an effect and therefore a root to be scheduled again. We need to traverse the current batch\n\t\t// once more in that case - most of the time this will just clean up dirty branches.\n\t\tif (this.#roots.length > 0) {\n\t\t\tif (next_batch !== null) {\n\t\t\t\tconst batch = next_batch;\n\t\t\t\tbatch.#roots.push(...this.#roots.filter((r) => !batch.#roots.includes(r)));\n\t\t\t} else {\n\t\t\t\tnext_batch = this;\n\t\t\t}\n\t\t}\n\n\t\tif (next_batch !== null) {\n\t\t\tnext_batch.#process();\n\t\t}\n\t}\n\n\t/**\n\t * Traverse the effect tree, executing effects or stashing\n\t * them for later execution as appropriate\n\t * @param {Effect} root\n\t * @param {Effect[]} effects\n\t * @param {Effect[]} render_effects\n\t */\n\t#traverse(root, effects, render_effects) {\n\t\troot.f ^= CLEAN;\n\n\t\tvar effect = root.first;\n\n\t\twhile (effect !== null) {\n\t\t\tvar flags = effect.f;\n\t\t\tvar is_branch = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0;\n\t\t\tvar is_skippable_branch = is_branch && (flags & CLEAN) !== 0;\n\n\t\t\tvar skip = is_skippable_branch || (flags & INERT) !== 0 || this.#skipped_branches.has(effect);\n\n\t\t\tif (!skip && effect.fn !== null) {\n\t\t\t\tif (is_branch) {\n\t\t\t\t\teffect.f ^= CLEAN;\n\t\t\t\t} else if ((flags & EFFECT) !== 0) {\n\t\t\t\t\teffects.push(effect);\n\t\t\t\t} else if (async_mode_flag && (flags & (RENDER_EFFECT | MANAGED_EFFECT)) !== 0) {\n\t\t\t\t\trender_effects.push(effect);\n\t\t\t\t} else if (is_dirty(effect)) {\n\t\t\t\t\tif ((flags & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect);\n\t\t\t\t\tupdate_effect(effect);\n\t\t\t\t}\n\n\t\t\t\tvar child = effect.first;\n\n\t\t\t\tif (child !== null) {\n\t\t\t\t\teffect = child;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile (effect !== null) {\n\t\t\t\tvar next = effect.next;\n\n\t\t\t\tif (next !== null) {\n\t\t\t\t\teffect = next;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\teffect = effect.parent;\n\t\t\t}\n\t\t}\n\t}\n\n\t#find_earlier_batch() {\n\t\tvar batch = this.#prev;\n\n\t\twhile (batch !== null) {\n\t\t\tif (!batch.is_fork) {\n\t\t\t\t// if the batches are connected, break\n\t\t\t\tfor (const [value, [, is_derived]] of this.current) {\n\t\t\t\t\tif (batch.current.has(value) && !is_derived) {\n\t\t\t\t\t\treturn batch;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbatch = batch.#prev;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * @param {Batch} batch\n\t */\n\t#merge(batch) {\n\t\tfor (const [source, value] of batch.current) {\n\t\t\tif (!this.previous.has(source) && batch.previous.has(source)) {\n\t\t\t\tthis.previous.set(source, batch.previous.get(source));\n\t\t\t}\n\n\t\t\tthis.current.set(source, value);\n\t\t}\n\n\t\tfor (const [effect, deferred] of batch.async_deriveds) {\n\t\t\tconst d = this.async_deriveds.get(effect);\n\t\t\tif (d) deferred.promise.then(d.resolve).catch(d.reject);\n\t\t}\n\n\t\t// Clear them or else those that are still pending might get rejected on discard (after merged-into batch is done).\n\t\t// This can happen when batch Y merged into X and Y has a pending boundary and therefore still-pending async deriveds inside.\n\t\tbatch.async_deriveds.clear();\n\n\t\t// Mark is not guaranteed not touch these, so we transfer them\n\t\tthis.transfer_effects(batch.#dirty_effects, batch.#maybe_dirty_effects);\n\n\t\t/**\n\t\t * mark all effects that depend on `batch.current`, except the\n\t\t * async effects that we just resolved (TODO unless they depend\n\t\t * on values in this batch that are NOT in the later batch?).\n\t\t * Through this we also will populate the correct #skipped_branches,\n\t\t * oncommit callbacks etc, so we don't need to merge them separately.\n\t\t * @param {Value} value\n\t\t */\n\t\tconst mark = (value) => {\n\t\t\tvar reactions = value.reactions;\n\t\t\tif (reactions === null) return;\n\n\t\t\tfor (const reaction of reactions) {\n\t\t\t\tvar flags = reaction.f;\n\n\t\t\t\tif ((flags & DERIVED) !== 0) {\n\t\t\t\t\tmark(/** @type {Derived} */ (reaction));\n\t\t\t\t} else {\n\t\t\t\t\tvar effect = /** @type {Effect} */ (reaction);\n\n\t\t\t\t\tif (flags & (ASYNC | BLOCK_EFFECT) && !this.async_deriveds.has(effect)) {\n\t\t\t\t\t\tthis.#maybe_dirty_effects.delete(effect);\n\t\t\t\t\t\tset_signal_status(effect, DIRTY);\n\t\t\t\t\t\tthis.schedule(effect);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const source of this.current.keys()) {\n\t\t\tmark(source);\n\t\t}\n\n\t\tthis.oncommit(() => batch.discard());\n\t\tbatch.#unlink();\n\n\t\tcurrent_batch = this;\n\t\tthis.#process();\n\t}\n\n\t/**\n\t * @param {Effect[]} effects\n\t */\n\t#defer_effects(effects) {\n\t\tfor (var i = 0; i < effects.length; i += 1) {\n\t\t\tdefer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects);\n\t\t}\n\t}\n\n\t/**\n\t * Associate a change to a given source with the current\n\t * batch, noting its previous and current values\n\t * @param {Value} source\n\t * @param {any} value\n\t * @param {boolean} [is_derived]\n\t */\n\tcapture(source, value, is_derived = false) {\n\t\tif (source.v !== UNINITIALIZED && !this.previous.has(source)) {\n\t\t\tthis.previous.set(source, source.v);\n\t\t}\n\n\t\t// Don't save errors in `batch_values`, or they won't be thrown in `runtime.js#get`\n\t\tif ((source.f & ERROR_VALUE) === 0) {\n\t\t\tthis.current.set(source, [value, is_derived]);\n\t\t\tbatch_values?.set(source, value);\n\t\t}\n\n\t\tif (!this.is_fork) {\n\t\t\tsource.v = value;\n\t\t}\n\t}\n\n\tactivate() {\n\t\tcurrent_batch = this;\n\t}\n\n\tdeactivate() {\n\t\tcurrent_batch = null;\n\t\tbatch_values = null;\n\t}\n\n\tflush() {\n\t\ttry {\n\t\t\tif (DEV) {\n\t\t\t\tsource_stacks.clear();\n\t\t\t}\n\n\t\t\tis_processing = true;\n\t\t\tcurrent_batch = this;\n\n\t\t\tthis.#process();\n\t\t} finally {\n\t\t\tflush_count = 0;\n\t\t\tlast_scheduled_effect = null;\n\t\t\tcollected_effects = null;\n\t\t\tlegacy_updates = null;\n\t\t\tis_processing = false;\n\n\t\t\tcurrent_batch = null;\n\t\t\tbatch_values = null;\n\n\t\t\told_values.clear();\n\n\t\t\tif (DEV) {\n\t\t\t\tfor (const source of source_stacks) {\n\t\t\t\t\tsource.updated = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdiscard() {\n\t\tfor (const fn of this.#discard_callbacks) fn(this);\n\t\tthis.#discard_callbacks.clear();\n\n\t\tfor (const deferred of this.async_deriveds.values()) {\n\t\t\tdeferred.reject(OBSOLETE);\n\t\t}\n\n\t\tthis.#unlink();\n\t\tthis.#deferred?.resolve();\n\t}\n\n\t/**\n\t * @param {Effect} effect\n\t */\n\tregister_created_effect(effect) {\n\t\tthis.#new_effects.push(effect);\n\t}\n\n\t#commit() {\n\t\t// If there are other pending batches, they now need to be 'rebased' —\n\t\t// in other words, we re-run block/async effects with the newly\n\t\t// committed state, unless the batch in question has a more\n\t\t// recent value for a given source\n\t\tfor (let batch = first_batch; batch !== null; batch = batch.#next) {\n\t\t\tvar is_earlier = batch.id < this.id;\n\n\t\t\t/** @type {Source[]} */\n\t\t\tvar sources = [];\n\n\t\t\tfor (const [source, [value, is_derived]] of this.current) {\n\t\t\t\tif (batch.current.has(source)) {\n\t\t\t\t\tvar batch_value = /** @type {[any, boolean]} */ (batch.current.get(source))[0]; // faster than destructuring\n\n\t\t\t\t\tif (is_earlier && value !== batch_value) {\n\t\t\t\t\t\t// bring the value up to date\n\t\t\t\t\t\tbatch.current.set(source, [value, is_derived]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// same value or later batch has more recent value,\n\t\t\t\t\t\t// no need to re-run these effects\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsources.push(source);\n\t\t\t}\n\n\t\t\tif (is_earlier) {\n\t\t\t\t// TODO do we need to restart these in some cases, instead of\n\t\t\t\t// immediately resolving them? Likely not because of how this.apply() works.\n\t\t\t\tfor (const [effect, deferred] of this.async_deriveds) {\n\t\t\t\t\tconst d = batch.async_deriveds.get(effect);\n\t\t\t\t\tif (d) deferred.promise.then(d.resolve).catch(d.reject);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar current = [...batch.current.keys()].filter(\n\t\t\t\t(source) => !(/** @type {[any, boolean]} */ (batch.current.get(source))[1])\n\t\t\t);\n\n\t\t\t// If not started yet or no sources to update (which is e.g. possible for the very first batch) then bail\n\t\t\tif (!batch.#started || current.length === 0) continue;\n\n\t\t\t// Re-run async/block effects that depend on distinct values changed in both batches (ignoring deriveds)\n\t\t\tvar others = current.filter((source) => !this.current.has(source));\n\n\t\t\tif (others.length === 0) {\n\t\t\t\tif (is_earlier) {\n\t\t\t\t\t// this batch is now obsolete and can be discarded\n\t\t\t\t\tbatch.discard();\n\t\t\t\t}\n\t\t\t} else if (sources.length > 0) {\n\t\t\t\t// The microtask queue can contain the batch already scheduled to run right\n\t\t\t\t// after this one is finished, so throwing the invariant would be wrong here.\n\t\t\t\tif (DEV && !batch.#decrement_queued) {\n\t\t\t\t\tinvariant(batch.#roots.length === 0, 'Batch has scheduled roots');\n\t\t\t\t}\n\n\t\t\t\t// A batch was unskipped in a later batch -> tell prior batches to unskip it, too\n\t\t\t\tif (is_earlier) {\n\t\t\t\t\tfor (const unskipped of this.#unskipped_branches) {\n\t\t\t\t\t\tbatch.unskip_effect(unskipped, (e) => {\n\t\t\t\t\t\t\tif ((e.f & (BLOCK_EFFECT | ASYNC)) !== 0) {\n\t\t\t\t\t\t\t\tbatch.schedule(e);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbatch.#defer_effects([e]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbatch.activate();\n\n\t\t\t\t/** @type {Set<Value>} */\n\t\t\t\tvar marked = new Set();\n\n\t\t\t\t/** @type {Map<Reaction, boolean>} */\n\t\t\t\tvar checked = new Map();\n\n\t\t\t\tfor (var source of sources) {\n\t\t\t\t\tmark_effects(source, others, marked, checked);\n\t\t\t\t}\n\n\t\t\t\tchecked = new Map();\n\t\t\t\tvar current_unequal = [...batch.current]\n\t\t\t\t\t.filter(([c, v1]) => {\n\t\t\t\t\t\tconst v2 = this.current.get(c);\n\t\t\t\t\t\tif (!v2) return true;\n\t\t\t\t\t\t// Either their values are different or one is a derived but not the other\n\t\t\t\t\t\treturn v2[0] !== v1[0] || v2[1] !== v1[1];\n\t\t\t\t\t})\n\t\t\t\t\t.map(([c]) => c);\n\n\t\t\t\tif (current_unequal.length > 0) {\n\t\t\t\t\tfor (const effect of this.#new_effects) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(effect.f & (DESTROYED | INERT | EAGER_EFFECT)) === 0 &&\n\t\t\t\t\t\t\tdepends_on(effect, current_unequal, checked)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif ((effect.f & (ASYNC | BLOCK_EFFECT)) !== 0) {\n\t\t\t\t\t\t\t\tset_signal_status(effect, DIRTY);\n\t\t\t\t\t\t\t\tbatch.schedule(effect);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbatch.#dirty_effects.add(effect);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Only apply and traverse when we know we triggered async work with marking the effects\n\t\t\t\t// and know this won't run anyway right afterwards\n\t\t\t\tif (batch.#roots.length > 0 && !batch.#decrement_queued) {\n\t\t\t\t\tbatch.apply();\n\n\t\t\t\t\tfor (var root of batch.#roots) {\n\t\t\t\t\t\tbatch.#traverse(root, [], []);\n\t\t\t\t\t}\n\n\t\t\t\t\tbatch.#roots = [];\n\t\t\t\t}\n\n\t\t\t\tbatch.deactivate();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {boolean} blocking\n\t * @param {Effect} effect\n\t */\n\tincrement(blocking, effect) {\n\t\tthis.#pending += 1;\n\n\t\tif (blocking) {\n\t\t\tlet blocking_pending_count = this.#blocking_pending.get(effect) ?? 0;\n\t\t\tthis.#blocking_pending.set(effect, blocking_pending_count + 1);\n\t\t}\n\t}\n\n\t/**\n\t * @param {boolean} blocking\n\t * @param {Effect} effect\n\t */\n\tdecrement(blocking, effect) {\n\t\tthis.#pending -= 1;\n\n\t\tif (blocking) {\n\t\t\tlet blocking_pending_count = this.#blocking_pending.get(effect) ?? 0;\n\n\t\t\tif (blocking_pending_count === 1) {\n\t\t\t\tthis.#blocking_pending.delete(effect);\n\t\t\t} else {\n\t\t\t\tthis.#blocking_pending.set(effect, blocking_pending_count - 1);\n\t\t\t}\n\t\t}\n\n\t\tif (this.#decrement_queued) return;\n\t\tthis.#decrement_queued = true;\n\n\t\tqueue_micro_task(() => {\n\t\t\tthis.#decrement_queued = false;\n\n\t\t\tif (this.linked) {\n\t\t\t\tthis.flush();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @param {Set<Effect>} dirty_effects\n\t * @param {Set<Effect>} maybe_dirty_effects\n\t */\n\ttransfer_effects(dirty_effects, maybe_dirty_effects) {\n\t\tfor (const e of dirty_effects) {\n\t\t\tthis.#dirty_effects.add(e);\n\t\t}\n\n\t\tfor (const e of maybe_dirty_effects) {\n\t\t\tthis.#maybe_dirty_effects.add(e);\n\t\t}\n\n\t\tdirty_effects.clear();\n\t\tmaybe_dirty_effects.clear();\n\t}\n\n\t/** @param {(batch: Batch) => void} fn */\n\toncommit(fn) {\n\t\tthis.#commit_callbacks.add(fn);\n\t}\n\n\t/** @param {(batch: Batch) => void} fn */\n\tondiscard(fn) {\n\t\tthis.#discard_callbacks.add(fn);\n\t}\n\n\tsettled() {\n\t\treturn (this.#deferred ??= deferred()).promise;\n\t}\n\n\tstatic ensure() {\n\t\tif (current_batch === null) {\n\t\t\tconst batch = (current_batch = new Batch());\n\n\t\t\tif (!is_processing && !is_flushing_sync) {\n\t\t\t\tqueue_micro_task(() => {\n\t\t\t\t\tif (!batch.#started) {\n\t\t\t\t\t\tbatch.flush();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn current_batch;\n\t}\n\n\tapply() {\n\t\tif (!async_mode_flag || (!this.is_fork && this.#prev === null && this.#next === null)) {\n\t\t\tbatch_values = null;\n\t\t\treturn;\n\t\t}\n\n\t\t// if there are multiple batches, we are 'time travelling' —\n\t\t// we need to override values with the ones in this batch...\n\t\tbatch_values = new Map();\n\t\tfor (const [source, [value]] of this.current) {\n\t\t\tbatch_values.set(source, value);\n\t\t}\n\n\t\t// ...and undo changes belonging to other batches unless they intersect\n\t\tfor (let batch = first_batch; batch !== null; batch = batch.#next) {\n\t\t\tif (batch === this || batch.is_fork) continue;\n\n\t\t\t// If two batches intersect, the latter batch will be merged into the earlier batch,\n\t\t\t// and we should treat them as a single set of changes\n\t\t\tvar intersects = false;\n\n\t\t\tif (batch.id < this.id) {\n\t\t\t\tfor (const [source, [, is_derived]] of batch.current) {\n\t\t\t\t\t// Derived values don't partake in the intersection mechanism, because a derived could\n\t\t\t\t\t// be triggered in one batch already but not the other one yet, causing a false-positive\n\t\t\t\t\tif (is_derived) continue;\n\n\t\t\t\t\tif (this.current.has(source)) {\n\t\t\t\t\t\tintersects = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Since the latter batch merges into the earlier (if it resolves before the earlier one),\n\t\t\t// we treat the earlier values as \"already applied\". This way we don't need to rerun async\n\t\t\t// effects of the earlier batch in case they are merged.\n\t\t\t// As a result you can think of batch_values as having the latest values of all intersecting\n\t\t\t// batches up until this batch.\n\t\t\tif (!intersects) {\n\t\t\t\tfor (const [source, previous] of batch.previous) {\n\t\t\t\t\tif (!batch_values.has(source)) {\n\t\t\t\t\t\tbatch_values.set(source, previous);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param {Effect} effect\n\t */\n\tschedule(effect) {\n\t\tlast_scheduled_effect = effect;\n\n\t\t// defer render effects inside a pending boundary\n\t\t// TODO the `REACTION_RAN` check is only necessary because of legacy `$:` effects AFAICT — we can remove later\n\t\tif (\n\t\t\teffect.b?.is_pending &&\n\t\t\t(effect.f & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0 &&\n\t\t\t(effect.f & REACTION_RAN) === 0\n\t\t) {\n\t\t\teffect.b.defer_effect(effect);\n\t\t\treturn;\n\t\t}\n\n\t\tvar e = effect;\n\n\t\twhile (e.parent !== null) {\n\t\t\te = e.parent;\n\t\t\tvar flags = e.f;\n\n\t\t\t// if the effect is being scheduled because a parent (each/await/etc) block\n\t\t\t// updated an internal source, or because a branch is being unskipped,\n\t\t\t// bail out or we'll cause a second flush\n\t\t\tif (collected_effects !== null && e === active_effect) {\n\t\t\t\tif (async_mode_flag) return;\n\n\t\t\t\t// in sync mode, render effects run during traversal. in an extreme edge case\n\t\t\t\t// — namely that we're setting a value inside a derived read during traversal —\n\t\t\t\t// they can be made dirty after they have already been visited, in which\n\t\t\t\t// case we shouldn't bail out. we also shouldn't bail out if we're\n\t\t\t\t// updating a store inside a `$:`, since this might invalidate\n\t\t\t\t// effects that were already visited\n\t\t\t\tif (\n\t\t\t\t\t(active_reaction === null || (active_reaction.f & DERIVED) === 0) &&\n\t\t\t\t\t!legacy_is_updating_store\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) {\n\t\t\t\tif ((flags & CLEAN) === 0) {\n\t\t\t\t\t// branch is already dirty, bail\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\te.f ^= CLEAN;\n\t\t\t}\n\t\t}\n\n\t\tthis.#roots.push(e);\n\t}\n\n\t#unlink() {\n\t\t// #merge calls #unlink, discard later on does it again - prevent\n\t\t// running it multiple times to not corrupt the linked list\n\t\tif (!this.linked) return;\n\n\t\tvar prev = this.#prev;\n\t\tvar next = this.#next;\n\n\t\tif (prev === null) {\n\t\t\tfirst_batch = next;\n\t\t} else {\n\t\t\tprev.#next = next;\n\t\t}\n\n\t\tif (next === null) {\n\t\t\tlast_batch = prev;\n\t\t} else {\n\t\t\tnext.#prev = prev;\n\t\t}\n\n\t\tthis.linked = false;\n\t}\n}\n\n// TODO Svelte@6 think about removing the callback argument.\n/**\n * Synchronously flush any pending updates.\n * Returns void if no callback is provided, otherwise returns the result of calling the callback.\n * @template [T=void]\n * @param {(() => T) | undefined} [fn]\n * @returns {T}\n */\nexport function flushSync(fn) {\n\tvar was_flushing_sync = is_flushing_sync;\n\tis_flushing_sync = true;\n\n\ttry {\n\t\tvar result;\n\n\t\tif (fn) {\n\t\t\tif (current_batch !== null && !current_batch.is_fork) {\n\t\t\t\tcurrent_batch.flush();\n\t\t\t}\n\n\t\t\tresult = fn();\n\t\t}\n\n\t\twhile (true) {\n\t\t\tflush_tasks();\n\n\t\t\tif (current_batch === null) {\n\t\t\t\treturn /** @type {T} */ (result);\n\t\t\t}\n\n\t\t\tcurrent_batch.flush();\n\t\t}\n\t} finally {\n\t\tis_flushing_sync = was_flushing_sync;\n\t}\n}\n\nfunction infinite_loop_guard() {\n\tif (DEV) {\n\t\tvar updates = new Map();\n\n\t\tfor (const source of /** @type {Batch} */ (current_batch).current.keys()) {\n\t\t\tfor (const [stack, update] of source.updated ?? []) {\n\t\t\t\tvar entry = updates.get(stack);\n\n\t\t\t\tif (!entry) {\n\t\t\t\t\tentry = { error: update.error, count: 0 };\n\t\t\t\t\tupdates.set(stack, entry);\n\t\t\t\t}\n\n\t\t\t\tentry.count += update.count;\n\t\t\t}\n\t\t}\n\n\t\tfor (const update of updates.values()) {\n\t\t\tif (update.error) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(update.error);\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\te.effect_update_depth_exceeded();\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\t// stack contains no useful information, replace it\n\t\t\tdefine_property(error, 'stack', { value: '' });\n\t\t}\n\n\t\t// Best effort: invoke the boundary nearest the most recent\n\t\t// effect and hope that it's relevant to the infinite loop\n\t\tinvoke_error_boundary(error, last_scheduled_effect);\n\t}\n}\n\n/** @type {Set<Effect> | null} */\nexport let eager_block_effects = null;\n\n/**\n * @param {Array<Effect>} effects\n * @returns {void}\n */\nfunction flush_queued_effects(effects) {\n\tvar length = effects.length;\n\tif (length === 0) return;\n\n\tvar i = 0;\n\n\twhile (i < length) {\n\t\tvar effect = effects[i++];\n\n\t\tif ((effect.f & (DESTROYED | INERT)) === 0 && is_dirty(effect)) {\n\t\t\teager_block_effects = new Set();\n\n\t\t\tupdate_effect(effect);\n\n\t\t\t// Effects with no dependencies or teardown do not get added to the effect tree.\n\t\t\t// Deferred effects (e.g. `$effect(...)`) _are_ added to the tree because we\n\t\t\t// don't know if we need to keep them until they are executed. Doing the check\n\t\t\t// here (rather than in `update_effect`) allows us to skip the work for\n\t\t\t// immediate effects.\n\t\t\tif (\n\t\t\t\teffect.deps === null &&\n\t\t\t\teffect.first === null &&\n\t\t\t\teffect.nodes === null &&\n\t\t\t\teffect.teardown === null &&\n\t\t\t\teffect.ac === null\n\t\t\t) {\n\t\t\t\t// remove this effect from the graph\n\t\t\t\tunlink_effect(effect);\n\t\t\t}\n\n\t\t\t// If update_effect() has a flushSync() in it, we may have flushed another flush_queued_effects(),\n\t\t\t// which already handled this logic and did set eager_block_effects to null.\n\t\t\tif (eager_block_effects?.size > 0) {\n\t\t\t\told_values.clear();\n\n\t\t\t\tfor (const e of eager_block_effects) {\n\t\t\t\t\t// Skip eager effects that have already been unmounted\n\t\t\t\t\tif ((e.f & (DESTROYED | INERT)) !== 0) continue;\n\n\t\t\t\t\t// Run effects in order from ancestor to descendant, else we could run into nullpointers\n\t\t\t\t\t/** @type {Effect[]} */\n\t\t\t\t\tconst ordered_effects = [e];\n\t\t\t\t\tlet ancestor = e.parent;\n\t\t\t\t\twhile (ancestor !== null) {\n\t\t\t\t\t\tif (eager_block_effects.has(ancestor)) {\n\t\t\t\t\t\t\teager_block_effects.delete(ancestor);\n\t\t\t\t\t\t\tordered_effects.push(ancestor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tancestor = ancestor.parent;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (let j = ordered_effects.length - 1; j >= 0; j--) {\n\t\t\t\t\t\tconst e = ordered_effects[j];\n\t\t\t\t\t\t// Skip eager effects that have already been unmounted\n\t\t\t\t\t\tif ((e.f & (DESTROYED | INERT)) !== 0) continue;\n\t\t\t\t\t\tupdate_effect(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\teager_block_effects.clear();\n\t\t\t}\n\t\t}\n\t}\n\n\teager_block_effects = null;\n}\n\n/**\n * This is similar to `mark_reactions`, but it only marks async/block effects\n * depending on `value` and at least one of the other `sources`, so that\n * these effects can re-run after another batch has been committed\n * @param {Value} value\n * @param {Source[]} sources\n * @param {Set<Value>} marked\n * @param {Map<Reaction, boolean>} checked\n */\nfunction mark_effects(value, sources, marked, checked) {\n\tif (marked.has(value)) return;\n\tmarked.add(value);\n\n\tif (value.reactions !== null) {\n\t\tfor (const reaction of value.reactions) {\n\t\t\tconst flags = reaction.f;\n\n\t\t\tif ((flags & DERIVED) !== 0) {\n\t\t\t\tmark_effects(/** @type {Derived} */ (reaction), sources, marked, checked);\n\t\t\t} else if (\n\t\t\t\t(flags & (ASYNC | BLOCK_EFFECT)) !== 0 &&\n\t\t\t\t(flags & DIRTY) === 0 &&\n\t\t\t\tdepends_on(reaction, sources, checked)\n\t\t\t) {\n\t\t\t\tset_signal_status(reaction, DIRTY);\n\t\t\t\tschedule_effect(/** @type {Effect} */ (reaction));\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * When committing a fork, we need to trigger eager effects so that\n * any `$state.eager(...)` expressions update immediately. This\n * function allows us to discover them\n * @param {Value} value\n * @param {Set<Effect>} effects\n */\nfunction mark_eager_effects(value, effects) {\n\tif (value.reactions === null) return;\n\n\tfor (const reaction of value.reactions) {\n\t\tconst flags = reaction.f;\n\n\t\tif ((flags & DERIVED) !== 0) {\n\t\t\tmark_eager_effects(/** @type {Derived} */ (reaction), effects);\n\t\t} else if ((flags & EAGER_EFFECT) !== 0) {\n\t\t\tset_signal_status(reaction, DIRTY);\n\t\t\teffects.add(/** @type {Effect} */ (reaction));\n\t\t}\n\t}\n}\n\n/**\n * @param {Reaction} reaction\n * @param {Source[]} sources\n * @param {Map<Reaction, boolean>} checked\n */\nfunction depends_on(reaction, sources, checked) {\n\tconst depends = checked.get(reaction);\n\tif (depends !== undefined) return depends;\n\n\tif (reaction.deps !== null) {\n\t\tfor (const dep of reaction.deps) {\n\t\t\tif (includes.call(sources, dep)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ((dep.f & DERIVED) !== 0 && depends_on(/** @type {Derived} */ (dep), sources, checked)) {\n\t\t\t\tchecked.set(/** @type {Derived} */ (dep), true);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\tchecked.set(reaction, false);\n\n\treturn false;\n}\n\n/**\n * @param {Effect} effect\n * @returns {void}\n */\nexport function schedule_effect(effect) {\n\t/** @type {Batch} */ (current_batch).schedule(effect);\n}\n\n/** @type {Source<number>[]} */\nlet eager_versions = [];\n\nfunction eager_flush() {\n\tflushSync(() => {\n\t\tconst eager = eager_versions;\n\t\teager_versions = [];\n\t\tfor (const version of eager) {\n\t\t\tupdate(version);\n\t\t}\n\t});\n}\n\n/** @type {Map<Reaction, Source<number>>} */\nvar version_map = new Map();\n\n/**\n * Implementation of `$state.eager(fn())`\n * @template T\n * @param {() => T} fn\n * @returns {T}\n */\nexport function eager(fn) {\n\tvar initial = true;\n\tvar value = /** @type {T} */ (undefined);\n\n\tif (active_reaction === null) {\n\t\treturn fn();\n\t}\n\n\tlet parent = active_reaction;\n\n\tlet version = version_map.get(parent) ?? source(0);\n\tversion_map.set(parent, version);\n\n\tteardown(() => {\n\t\tif (parent.f & DESTROYING) version_map.delete(parent);\n\t});\n\n\tget(version);\n\n\teager_effect(() => {\n\t\tif (initial) {\n\t\t\t// the first time this runs, we create an eager effect\n\t\t\t// that will run eagerly whenever the expression changes\n\t\t\tvar previous_batch_values = batch_values;\n\n\t\t\ttry {\n\t\t\t\tbatch_values = null;\n\t\t\t\tvalue = fn();\n\t\t\t} finally {\n\t\t\t\tbatch_values = previous_batch_values;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// the second time this effect runs, it's to schedule a\n\t\t// `version` update. since this will recreate the effect,\n\t\t// we don't need to evaluate the expression here\n\t\tif (eager_versions.length === 0) {\n\t\t\tqueue_micro_task(eager_flush);\n\t\t}\n\n\t\teager_versions.push(version);\n\t});\n\n\tinitial = false;\n\n\treturn value;\n}\n\n/**\n * Mark all the effects inside a skipped branch CLEAN, so that\n * they can be correctly rescheduled later. Tracks dirty and maybe_dirty\n * effects so they can be rescheduled if the branch survives.\n * @param {Effect} effect\n * @param {{ d: Effect[], m: Effect[] }} tracked\n */\nfunction reset_branch(effect, tracked) {\n\t// clean branch = nothing dirty inside, no need to traverse further\n\tif ((effect.f & BRANCH_EFFECT) !== 0 && (effect.f & CLEAN) !== 0) {\n\t\treturn;\n\t}\n\n\tif ((effect.f & DIRTY) !== 0) {\n\t\ttracked.d.push(effect);\n\t} else if ((effect.f & MAYBE_DIRTY) !== 0) {\n\t\ttracked.m.push(effect);\n\t}\n\n\tset_signal_status(effect, CLEAN);\n\n\tvar e = effect.first;\n\twhile (e !== null) {\n\t\treset_branch(e, tracked);\n\t\te = e.next;\n\t}\n}\n\n/**\n * Mark an entire effect tree clean following an error\n * @param {Effect} effect\n */\nfunction reset_all(effect) {\n\tset_signal_status(effect, CLEAN);\n\n\tvar e = effect.first;\n\twhile (e !== null) {\n\t\treset_all(e);\n\t\te = e.next;\n\t}\n}\n\n/**\n * Creates a 'fork', in which state changes are evaluated but not applied to the DOM.\n * This is useful for speculatively loading data (for example) when you suspect that\n * the user is about to take some action.\n *\n * Frameworks like SvelteKit can use this to preload data when the user touches or\n * hovers over a link, making any subsequent navigation feel instantaneous.\n *\n * The `fn` parameter is a synchronous function that modifies some state. The\n * state changes will be reverted after the fork is initialised, then reapplied\n * if and when the fork is eventually committed.\n *\n * When it becomes clear that a fork will _not_ be committed (e.g. because the\n * user navigated elsewhere), it must be discarded to avoid leaking memory.\n *\n * @param {() => void} fn\n * @returns {Fork}\n * @since 5.42\n */\nexport function fork(fn) {\n\tif (!async_mode_flag) {\n\t\te.experimental_async_required('fork');\n\t}\n\n\tif (current_batch !== null) {\n\t\te.fork_timing();\n\t}\n\n\tvar batch = Batch.ensure();\n\tbatch.is_fork = true;\n\tbatch_values = new Map();\n\n\tvar committed = false;\n\tvar settled = batch.settled();\n\n\tflushSync(fn);\n\n\treturn {\n\t\tcommit: async () => {\n\t\t\tif (committed) {\n\t\t\t\tawait settled;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!batch.linked) {\n\t\t\t\te.fork_discarded();\n\t\t\t}\n\n\t\t\tcommitted = true;\n\n\t\t\tbatch.is_fork = false;\n\n\t\t\t// apply changes and update write versions so deriveds see the change\n\t\t\tfor (var [source, [value]] of batch.current) {\n\t\t\t\tsource.v = value;\n\t\t\t\tsource.wv = increment_write_version();\n\t\t\t}\n\n\t\t\t// trigger any `$state.eager(...)` expressions with the new state.\n\t\t\t// eager effects don't get scheduled like other effects, so we\n\t\t\t// can't just encounter them during traversal, we need to\n\t\t\t// proactively flush them\n\t\t\t// TODO maybe there's a better implementation?\n\t\t\tflushSync(() => {\n\t\t\t\t/** @type {Set<Effect>} */\n\t\t\t\tvar eager_effects = new Set();\n\n\t\t\t\tfor (var source of batch.current.keys()) {\n\t\t\t\t\tmark_eager_effects(source, eager_effects);\n\t\t\t\t}\n\n\t\t\t\tset_eager_effects(eager_effects);\n\t\t\t\tflush_eager_effects();\n\t\t\t});\n\n\t\t\tbatch.flush();\n\t\t\tawait settled;\n\t\t},\n\t\tdiscard: () => {\n\t\t\t// cause any MAYBE_DIRTY deriveds to update\n\t\t\t// if they depend on things thath changed\n\t\t\t// inside the discarded fork\n\t\t\tfor (var source of batch.current.keys()) {\n\t\t\t\tsource.wv = increment_write_version();\n\t\t\t}\n\n\t\t\tif (!committed && batch.linked) {\n\t\t\t\tbatch.discard();\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * Forcibly remove all current batches, to prevent cross-talk between tests\n */\nexport function clear() {\n\tfirst_batch = last_batch = null;\n}\n","/** @import { Derived, Effect, Source, Value } from '#client' */\nimport { DEV } from 'esm-env';\nimport {\n\tactive_reaction,\n\tactive_effect,\n\tuntracked_writes,\n\tget,\n\tset_untracked_writes,\n\tuntrack,\n\tincrement_write_version,\n\tupdate_effect,\n\tcurrent_sources,\n\tis_dirty,\n\tuntracking,\n\tis_destroying_effect,\n\tpush_reaction_value\n} from '../runtime.js';\nimport { equals, safe_equals } from './equality.js';\nimport {\n\tCLEAN,\n\tDERIVED,\n\tDIRTY,\n\tBRANCH_EFFECT,\n\tEAGER_EFFECT,\n\tMAYBE_DIRTY,\n\tBLOCK_EFFECT,\n\tROOT_EFFECT,\n\tASYNC,\n\tWAS_MARKED,\n\tCONNECTED,\n\tREACTION_IS_UPDATING\n} from '#client/constants';\nimport * as e from '../errors.js';\nimport { legacy_mode_flag, tracing_mode_flag } from '../../flags/index.js';\nimport { tag_proxy } from '../dev/tracing.js';\nimport { get_error } from '../../shared/dev.js';\nimport { component_context, is_runes } from '../context.js';\nimport {\n\tBatch,\n\tbatch_values,\n\teager_block_effects,\n\tschedule_effect,\n\tlegacy_updates\n} from './batch.js';\nimport { proxy } from '../proxy.js';\nimport { execute_derived } from './deriveds.js';\nimport { set_signal_status, update_derived_status } from './status.js';\n\n/** @type {Set<Effect>} */\nexport let eager_effects = new Set();\n\n/** @type {Map<Source, any>} */\nexport const old_values = new Map();\n\n/**\n * @param {Set<any>} v\n */\nexport function set_eager_effects(v) {\n\teager_effects = v;\n}\n\nlet eager_effects_deferred = false;\n\nexport function set_eager_effects_deferred() {\n\teager_effects_deferred = true;\n}\n\n/**\n * @template V\n * @param {V} v\n * @param {Error | null} [stack]\n * @returns {Source<V>}\n */\n// TODO rename this to `state` throughout the codebase\nexport function source(v, stack) {\n\t/** @type {Value} */\n\tvar signal = {\n\t\tf: 0, // TODO ideally we could skip this altogether, but it causes type errors\n\t\tv,\n\t\treactions: null,\n\t\tequals,\n\t\trv: 0,\n\t\twv: 0\n\t};\n\n\tif (DEV && tracing_mode_flag) {\n\t\tsignal.created = stack ?? get_error('created at');\n\t\tsignal.updated = null;\n\t\tsignal.set_during_effect = false;\n\t\tsignal.trace = null;\n\t}\n\n\treturn signal;\n}\n\n/**\n * @template V\n * @param {V} v\n * @param {Error | null} [stack]\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function state(v, stack) {\n\tconst s = source(v, stack);\n\n\tpush_reaction_value(s);\n\n\treturn s;\n}\n\n/**\n * @template V\n * @param {V} initial_value\n * @param {boolean} [immutable]\n * @returns {Source<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function mutable_source(initial_value, immutable = false, trackable = true) {\n\tconst s = source(initial_value);\n\tif (!immutable) {\n\t\ts.equals = safe_equals;\n\t}\n\n\t// bind the signal to the component context, in case we need to\n\t// track updates to trigger beforeUpdate/afterUpdate callbacks\n\tif (legacy_mode_flag && trackable && component_context !== null && component_context.l !== null) {\n\t\t(component_context.l.s ??= []).push(s);\n\t}\n\n\treturn s;\n}\n\n/**\n * @template V\n * @param {Value<V>} source\n * @param {V} value\n */\nexport function mutate(source, value) {\n\tset(\n\t\tsource,\n\t\tuntrack(() => get(source))\n\t);\n\treturn value;\n}\n\n/**\n * @template V\n * @param {Source<V>} source\n * @param {V} value\n * @param {boolean} [should_proxy]\n * @returns {V}\n */\nexport function set(source, value, should_proxy = false) {\n\tif (\n\t\tactive_reaction !== null &&\n\t\t// since we are untracking the function inside `$inspect.with` we need to add this check\n\t\t// to ensure we error if state is set inside an inspect effect\n\t\t(!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) &&\n\t\tis_runes() &&\n\t\t(active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 &&\n\t\t(current_sources === null || !current_sources.has(source))\n\t) {\n\t\te.state_unsafe_mutation();\n\t}\n\n\tlet new_value = should_proxy ? proxy(value) : value;\n\n\tif (DEV) {\n\t\ttag_proxy(new_value, /** @type {string} */ (source.label));\n\t}\n\n\treturn internal_set(source, new_value, legacy_updates);\n}\n\n/**\n * @template V\n * @param {Source<V>} source\n * @param {V} value\n * @param {Effect[] | null} [updated_during_traversal]\n * @returns {V}\n */\nexport function internal_set(source, value, updated_during_traversal = null) {\n\tif (!source.equals(value)) {\n\t\told_values.set(source, is_destroying_effect ? value : source.v);\n\n\t\tvar batch = Batch.ensure();\n\t\tbatch.capture(source, value);\n\n\t\tif (DEV) {\n\t\t\tif (tracing_mode_flag || active_effect !== null) {\n\t\t\t\tsource.updated ??= new Map();\n\n\t\t\t\t// For performance reasons, when not using $inspect.trace, we only start collecting stack traces\n\t\t\t\t// after the same source has been updated more than 5 times in the same flush cycle.\n\t\t\t\tconst count = (source.updated.get('')?.count ?? 0) + 1;\n\t\t\t\tsource.updated.set('', { error: /** @type {any} */ (null), count });\n\n\t\t\t\tif (tracing_mode_flag || count > 5) {\n\t\t\t\t\tconst error = get_error('updated at');\n\n\t\t\t\t\tif (error !== null) {\n\t\t\t\t\t\tlet entry = source.updated.get(error.stack);\n\n\t\t\t\t\t\tif (!entry) {\n\t\t\t\t\t\t\tentry = { error, count: 0 };\n\t\t\t\t\t\t\tsource.updated.set(error.stack, entry);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tentry.count++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (active_effect !== null) {\n\t\t\t\tsource.set_during_effect = true;\n\t\t\t}\n\t\t}\n\n\t\tif ((source.f & DERIVED) !== 0) {\n\t\t\tconst derived = /** @type {Derived} */ (source);\n\n\t\t\t// if we are assigning to a dirty derived we set it to clean/maybe dirty but we also eagerly execute it to track the dependencies\n\t\t\tif ((source.f & DIRTY) !== 0) {\n\t\t\t\texecute_derived(derived);\n\t\t\t}\n\n\t\t\t// During time traveling we don't want to reset the status so that\n\t\t\t// traversal of the graph in the other batches still happens\n\t\t\tif (batch_values === null) {\n\t\t\t\tupdate_derived_status(derived);\n\t\t\t}\n\t\t}\n\n\t\tsource.wv = increment_write_version();\n\n\t\t// For debugging, in case you want to know which reactions are being scheduled:\n\t\t// log_reactions(source);\n\t\tmark_reactions(source, DIRTY, updated_during_traversal);\n\n\t\t// It's possible that the current reaction might not have up-to-date dependencies\n\t\t// whilst it's actively running. So in the case of ensuring it registers the reaction\n\t\t// properly for itself, we need to ensure the current effect actually gets\n\t\t// scheduled. i.e: `$effect(() => x++)`\n\t\tif (\n\t\t\tis_runes() &&\n\t\t\tactive_effect !== null &&\n\t\t\t(active_effect.f & CLEAN) !== 0 &&\n\t\t\t(active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0\n\t\t) {\n\t\t\tif (untracked_writes === null) {\n\t\t\t\tset_untracked_writes([source]);\n\t\t\t} else {\n\t\t\t\tuntracked_writes.push(source);\n\t\t\t}\n\t\t}\n\n\t\tif (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) {\n\t\t\tflush_eager_effects();\n\t\t}\n\t}\n\n\treturn value;\n}\n\nexport function flush_eager_effects() {\n\teager_effects_deferred = false;\n\n\tfor (const effect of eager_effects) {\n\t\t// Mark clean inspect-effects as maybe dirty and then check their dirtiness\n\t\t// instead of just updating the effects - this way we avoid overfiring.\n\t\tif ((effect.f & CLEAN) !== 0) {\n\t\t\tset_signal_status(effect, MAYBE_DIRTY);\n\t\t}\n\n\t\tlet dirty;\n\n\t\ttry {\n\t\t\tdirty = is_dirty(effect);\n\t\t} catch {\n\t\t\t// Dirty-checking can evaluate derived dependencies and throw in cases where\n\t\t\t// parent effects are about to destroy this eager effect. Run the effect so\n\t\t\t// its own error handling can deal with transient failures.\n\t\t\tdirty = true;\n\t\t}\n\n\t\tif (dirty) {\n\t\t\tupdate_effect(effect);\n\t\t}\n\t}\n\n\teager_effects.clear();\n}\n\n/**\n * @template {number | bigint} T\n * @param {Source<T>} source\n * @param {1 | -1} [d]\n * @returns {T}\n */\nexport function update(source, d = 1) {\n\tvar value = get(source);\n\tvar result = d === 1 ? value++ : value--;\n\n\tset(source, value);\n\n\t// @ts-expect-error\n\treturn result;\n}\n\n/**\n * @template {number | bigint} T\n * @param {Source<T>} source\n * @param {1 | -1} [d]\n * @returns {T}\n */\nexport function update_pre(source, d = 1) {\n\tvar value = get(source);\n\n\t// @ts-expect-error\n\t// eslint-disable-next-line no-useless-assignment -- `++`/`--` used for return value, not side effect on `value`\n\treturn set(source, d === 1 ? ++value : --value);\n}\n\n/**\n * Silently (without using `get`) increment a source\n * @param {Source<number>} source\n */\nexport function increment(source) {\n\tset(source, source.v + 1);\n}\n\n/**\n * @param {Value} signal\n * @param {number} status should be DIRTY or MAYBE_DIRTY\n * @param {Effect[] | null} updated_during_traversal\n * @returns {void}\n */\nfunction mark_reactions(signal, status, updated_during_traversal) {\n\tvar reactions = signal.reactions;\n\tif (reactions === null) return;\n\n\tvar runes = is_runes();\n\tvar length = reactions.length;\n\n\tfor (var i = 0; i < length; i++) {\n\t\tvar reaction = reactions[i];\n\t\tvar flags = reaction.f;\n\n\t\t// In legacy mode, skip the current effect to prevent infinite loops\n\t\tif (!runes && reaction === active_effect) continue;\n\n\t\tvar not_dirty = (flags & DIRTY) === 0;\n\n\t\t// don't set a DIRTY reaction to MAYBE_DIRTY\n\t\tif (not_dirty) {\n\t\t\tset_signal_status(reaction, status);\n\t\t}\n\n\t\tif ((flags & EAGER_EFFECT) !== 0) {\n\t\t\t// Eager effects need to run immediately:\n\t\t\t// - for $inspect so that the stack trace makes sense\n\t\t\t// - for $state.eager because they might be without an effect parent\n\t\t\teager_effects.add(/** @type {Effect} */ (reaction));\n\t\t} else if ((flags & DERIVED) !== 0) {\n\t\t\tvar derived = /** @type {Derived} */ (reaction);\n\n\t\t\tbatch_values?.delete(derived);\n\n\t\t\tif ((flags & WAS_MARKED) === 0) {\n\t\t\t\t// Only connected deriveds being executed outside the update cycle can be reliably unmarked right away\n\t\t\t\tif (\n\t\t\t\t\tflags & CONNECTED &&\n\t\t\t\t\t(active_effect === null || (active_effect.f & REACTION_IS_UPDATING) === 0)\n\t\t\t\t) {\n\t\t\t\t\treaction.f |= WAS_MARKED;\n\t\t\t\t}\n\n\t\t\t\tmark_reactions(derived, MAYBE_DIRTY, updated_during_traversal);\n\t\t\t}\n\t\t} else if (not_dirty) {\n\t\t\tvar effect = /** @type {Effect} */ (reaction);\n\n\t\t\tif ((flags & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) {\n\t\t\t\teager_block_effects.add(effect);\n\t\t\t}\n\n\t\t\tif (updated_during_traversal !== null) {\n\t\t\t\tupdated_during_traversal.push(effect);\n\t\t\t} else {\n\t\t\t\tschedule_effect(effect);\n\t\t\t}\n\t\t}\n\t}\n}\n","/** @import { Source } from '#client' */\nimport { DEV } from 'esm-env';\nimport {\n\tget,\n\tactive_effect,\n\tupdate_version,\n\tactive_reaction,\n\tset_update_version,\n\tset_active_reaction\n} from './runtime.js';\nimport {\n\tarray_prototype,\n\tget_descriptor,\n\tget_prototype_of,\n\tis_array,\n\tobject_prototype\n} from '../shared/utils.js';\nimport {\n\tstate as source,\n\tset,\n\tincrement,\n\tflush_eager_effects,\n\tset_eager_effects_deferred\n} from './reactivity/sources.js';\nimport { PROXY_PATH_SYMBOL, STATE_SYMBOL } from '#client/constants';\nimport { UNINITIALIZED } from '../../constants.js';\nimport * as e from './errors.js';\nimport { tag } from './dev/tracing.js';\nimport { get_error } from '../shared/dev.js';\nimport { tracing_mode_flag } from '../flags/index.js';\n\n// TODO move all regexes into shared module?\nconst regex_is_valid_identifier = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n/**\n * @template T\n * @param {T} value\n * @returns {T}\n */\nexport function proxy(value) {\n\t// if non-proxyable, or is already a proxy, return `value`\n\tif (typeof value !== 'object' || value === null || STATE_SYMBOL in value) {\n\t\treturn value;\n\t}\n\n\tconst prototype = get_prototype_of(value);\n\n\tif (prototype !== object_prototype && prototype !== array_prototype) {\n\t\treturn value;\n\t}\n\n\t/** @type {Map<any, Source<any>>} */\n\tvar sources = new Map();\n\tvar is_proxied_array = is_array(value);\n\tvar version = source(0);\n\n\tvar stack = DEV && tracing_mode_flag ? get_error('created at') : null;\n\tvar parent_version = update_version;\n\n\t/**\n\t * Executes the proxy in the context of the reaction it was originally created in, if any\n\t * @template T\n\t * @param {() => T} fn\n\t */\n\tvar with_parent = (fn) => {\n\t\tif (update_version === parent_version) {\n\t\t\treturn fn();\n\t\t}\n\n\t\t// child source is being created after the initial proxy —\n\t\t// prevent it from being associated with the current reaction\n\t\tvar reaction = active_reaction;\n\t\tvar version = update_version;\n\n\t\tset_active_reaction(null);\n\t\tset_update_version(parent_version);\n\n\t\tvar result = fn();\n\n\t\tset_active_reaction(reaction);\n\t\tset_update_version(version);\n\n\t\treturn result;\n\t};\n\n\tif (is_proxied_array) {\n\t\t// We need to create the length source eagerly to ensure that\n\t\t// mutations to the array are properly synced with our proxy\n\t\tsources.set('length', source(/** @type {any[]} */ (value).length, stack));\n\t\tif (DEV) {\n\t\t\tvalue = /** @type {any} */ (inspectable_array(/** @type {any[]} */ (value)));\n\t\t}\n\t}\n\n\t/** Used in dev for $inspect.trace() */\n\tvar path = '';\n\tlet updating = false;\n\t/** @param {string} new_path */\n\tfunction update_path(new_path) {\n\t\tif (updating) return;\n\t\tupdating = true;\n\t\tpath = new_path;\n\n\t\ttag(version, `${path} version`);\n\n\t\t// rename all child sources and child proxies\n\t\tfor (const [prop, source] of sources) {\n\t\t\ttag(source, get_label(path, prop));\n\t\t}\n\t\tupdating = false;\n\t}\n\n\treturn new Proxy(/** @type {any} */ (value), {\n\t\tdefineProperty(_, prop, descriptor) {\n\t\t\tif (\n\t\t\t\t!('value' in descriptor) ||\n\t\t\t\tdescriptor.configurable === false ||\n\t\t\t\tdescriptor.enumerable === false ||\n\t\t\t\tdescriptor.writable === false\n\t\t\t) {\n\t\t\t\t// we disallow non-basic descriptors, because unless they are applied to the\n\t\t\t\t// target object — which we avoid, so that state can be forked — we will run\n\t\t\t\t// afoul of the various invariants\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/getOwnPropertyDescriptor#invariants\n\t\t\t\te.state_descriptors_fixed();\n\t\t\t}\n\t\t\tvar s = sources.get(prop);\n\t\t\tif (s === undefined) {\n\t\t\t\twith_parent(() => {\n\t\t\t\t\tvar s = source(descriptor.value, stack);\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t\tif (DEV && typeof prop === 'string') {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\t\t\t\t\treturn s;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tset(s, descriptor.value, true);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tdeleteProperty(target, prop) {\n\t\t\tvar s = sources.get(prop);\n\n\t\t\tif (s === undefined) {\n\t\t\t\tif (prop in target) {\n\t\t\t\t\tconst s = with_parent(() => source(UNINITIALIZED, stack));\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t\tincrement(version);\n\n\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tset(s, UNINITIALIZED);\n\t\t\t\tincrement(version);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tget(target, prop, receiver) {\n\t\t\tif (prop === STATE_SYMBOL) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tif (DEV && prop === PROXY_PATH_SYMBOL) {\n\t\t\t\treturn update_path;\n\t\t\t}\n\n\t\t\tvar s = sources.get(prop);\n\t\t\tvar exists = prop in target;\n\n\t\t\t// create a source, but only if it's an own property and not a prototype property\n\t\t\tif (s === undefined && (!exists || get_descriptor(target, prop)?.writable)) {\n\t\t\t\ts = with_parent(() => {\n\t\t\t\t\tvar p = proxy(exists ? target[prop] : UNINITIALIZED);\n\t\t\t\t\tvar s = source(p, stack);\n\n\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\n\t\t\t\t\treturn s;\n\t\t\t\t});\n\n\t\t\t\tsources.set(prop, s);\n\t\t\t}\n\n\t\t\tif (s !== undefined) {\n\t\t\t\tvar v = get(s);\n\t\t\t\treturn v === UNINITIALIZED ? undefined : v;\n\t\t\t}\n\n\t\t\treturn Reflect.get(target, prop, receiver);\n\t\t},\n\n\t\tgetOwnPropertyDescriptor(target, prop) {\n\t\t\tvar descriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n\n\t\t\tif (descriptor && 'value' in descriptor) {\n\t\t\t\tvar s = sources.get(prop);\n\t\t\t\tif (s) descriptor.value = get(s);\n\t\t\t} else if (descriptor === undefined) {\n\t\t\t\tvar source = sources.get(prop);\n\t\t\t\tvar value = source?.v;\n\n\t\t\t\tif (source !== undefined && value !== UNINITIALIZED) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tenumerable: true,\n\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\twritable: true\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn descriptor;\n\t\t},\n\n\t\thas(target, prop) {\n\t\t\tif (prop === STATE_SYMBOL) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tvar s = sources.get(prop);\n\t\t\tvar has = (s !== undefined && s.v !== UNINITIALIZED) || Reflect.has(target, prop);\n\n\t\t\tif (\n\t\t\t\ts !== undefined ||\n\t\t\t\t(active_effect !== null && (!has || get_descriptor(target, prop)?.writable))\n\t\t\t) {\n\t\t\t\tif (s === undefined) {\n\t\t\t\t\ts = with_parent(() => {\n\t\t\t\t\t\tvar p = has ? proxy(target[prop]) : UNINITIALIZED;\n\t\t\t\t\t\tvar s = source(p, stack);\n\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn s;\n\t\t\t\t\t});\n\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t}\n\n\t\t\t\tvar value = get(s);\n\t\t\t\tif (value === UNINITIALIZED) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn has;\n\t\t},\n\n\t\tset(target, prop, value, receiver) {\n\t\t\tvar s = sources.get(prop);\n\t\t\tvar has = prop in target;\n\n\t\t\t// variable.length = value -> clear all signals with index >= value\n\t\t\tif (is_proxied_array && prop === 'length') {\n\t\t\t\tfor (var i = value; i < /** @type {Source<number>} */ (s).v; i += 1) {\n\t\t\t\t\tvar other_s = sources.get(i + '');\n\t\t\t\t\tif (other_s !== undefined) {\n\t\t\t\t\t\tset(other_s, UNINITIALIZED);\n\t\t\t\t\t} else if (i in target) {\n\t\t\t\t\t\t// If the item exists in the original, we need to create an uninitialized source,\n\t\t\t\t\t\t// else a later read of the property would result in a source being created with\n\t\t\t\t\t\t// the value of the original item at that index.\n\t\t\t\t\t\tother_s = with_parent(() => source(UNINITIALIZED, stack));\n\t\t\t\t\t\tsources.set(i + '', other_s);\n\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\ttag(other_s, get_label(path, i));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we haven't yet created a source for this property, we need to ensure\n\t\t\t// we do so otherwise if we read it later, then the write won't be tracked and\n\t\t\t// the heuristics of effects will be different vs if we had read the proxied\n\t\t\t// object property before writing to that property.\n\t\t\tif (s === undefined) {\n\t\t\t\tif (!has || get_descriptor(target, prop)?.writable) {\n\t\t\t\t\ts = with_parent(() => source(undefined, stack));\n\n\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\t\t\t\t\tset(s, proxy(value));\n\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thas = s.v !== UNINITIALIZED;\n\n\t\t\t\tvar p = with_parent(() => proxy(value));\n\t\t\t\tset(s, p);\n\t\t\t}\n\n\t\t\tvar descriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n\n\t\t\t// Set the new value before updating any signals so that any listeners get the new value\n\t\t\tif (descriptor?.set) {\n\t\t\t\tdescriptor.set.call(receiver, value);\n\t\t\t}\n\n\t\t\tif (!has) {\n\t\t\t\t// If we have mutated an array directly, we might need to\n\t\t\t\t// signal that length has also changed. Do it before updating metadata\n\t\t\t\t// to ensure that iterating over the array as a result of a metadata update\n\t\t\t\t// will not cause the length to be out of sync.\n\t\t\t\tif (is_proxied_array && typeof prop === 'string') {\n\t\t\t\t\tvar ls = /** @type {Source<number>} */ (sources.get('length'));\n\t\t\t\t\tvar n = Number(prop);\n\n\t\t\t\t\tif (Number.isInteger(n) && n >= ls.v) {\n\t\t\t\t\t\tset(ls, n + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tincrement(version);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\townKeys(target) {\n\t\t\tget(version);\n\n\t\t\tvar own_keys = Reflect.ownKeys(target).filter((key) => {\n\t\t\t\tvar source = sources.get(key);\n\t\t\t\treturn source === undefined || source.v !== UNINITIALIZED;\n\t\t\t});\n\n\t\t\tfor (var [key, source] of sources) {\n\t\t\t\tif (source.v !== UNINITIALIZED && !(key in target)) {\n\t\t\t\t\town_keys.push(key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn own_keys;\n\t\t},\n\n\t\tsetPrototypeOf() {\n\t\t\te.state_prototype_fixed();\n\t\t}\n\t});\n}\n\n/**\n * @param {string} path\n * @param {string | symbol} prop\n */\nfunction get_label(path, prop) {\n\tif (typeof prop === 'symbol') return `${path}[Symbol(${prop.description ?? ''})]`;\n\tif (regex_is_valid_identifier.test(prop)) return `${path}.${prop}`;\n\treturn /^\\d+$/.test(prop) ? `${path}[${prop}]` : `${path}['${prop}']`;\n}\n\n/**\n * @param {any} value\n */\nexport function get_proxied_value(value) {\n\ttry {\n\t\tif (value !== null && typeof value === 'object' && STATE_SYMBOL in value) {\n\t\t\treturn value[STATE_SYMBOL];\n\t\t}\n\t} catch {\n\t\t// the above if check can throw an error if the value in question\n\t\t// is the contentWindow of an iframe on another domain, in which\n\t\t// case we want to just return the value (because it's definitely\n\t\t// not a proxied value) so we don't break any JavaScript interacting\n\t\t// with that iframe (such as various payment companies client side\n\t\t// JavaScript libraries interacting with their iframes on the same\n\t\t// domain)\n\t}\n\n\treturn value;\n}\n\n/**\n * @param {any} a\n * @param {any} b\n */\nexport function is(a, b) {\n\treturn Object.is(get_proxied_value(a), get_proxied_value(b));\n}\n\nconst ARRAY_MUTATING_METHODS = new Set([\n\t'copyWithin',\n\t'fill',\n\t'pop',\n\t'push',\n\t'reverse',\n\t'shift',\n\t'sort',\n\t'splice',\n\t'unshift'\n]);\n\n/**\n * Wrap array mutating methods so $inspect is triggered only once and\n * to prevent logging an array in intermediate state (e.g. with an empty slot)\n * @param {any[]} array\n */\nfunction inspectable_array(array) {\n\treturn new Proxy(array, {\n\t\tget(target, prop, receiver) {\n\t\t\tvar value = Reflect.get(target, prop, receiver);\n\t\t\tif (!ARRAY_MUTATING_METHODS.has(/** @type {string} */ (prop))) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @this {any[]}\n\t\t\t * @param {any[]} args\n\t\t\t */\n\t\t\treturn function (...args) {\n\t\t\t\tset_eager_effects_deferred();\n\t\t\t\tvar result = value.apply(this, args);\n\t\t\t\tflush_eager_effects();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t}\n\t});\n}\n","/** @import { Effect, TemplateNode } from '#client' */\nimport { hydrate_node, hydrating, set_hydrate_node } from './hydration.js';\nimport { DEV } from 'esm-env';\nimport { init_array_prototype_warnings } from '../dev/equality.js';\nimport { get_descriptor, is_extensible } from '../../shared/utils.js';\nimport { active_effect } from '../runtime.js';\nimport { async_mode_flag } from '../../flags/index.js';\nimport {\n\tATTRIBUTES_CACHE,\n\tCLASS_CACHE,\n\tREACTION_RAN,\n\tSTYLE_CACHE,\n\tTEXT_CACHE,\n\tTEXT_NODE\n} from '#client/constants';\nimport { eager_block_effects } from '../reactivity/batch.js';\nimport { NAMESPACE_HTML } from '../../../constants.js';\n\n// export these for reference in the compiled code, making global name deduplication unnecessary\n/** @type {Window} */\nexport var $window;\n\n/** @type {Document} */\nexport var $document;\n\n/** @type {boolean} */\nexport var is_firefox;\n\n/** @type {() => Node | null} */\nvar first_child_getter;\n/** @type {() => Node | null} */\nvar next_sibling_getter;\n\n/**\n * Initialize these lazily to avoid issues when using the runtime in a server context\n * where these globals are not available while avoiding a separate server entry point\n */\nexport function init_operations() {\n\tif ($window !== undefined) {\n\t\treturn;\n\t}\n\n\t$window = window;\n\t$document = document;\n\tis_firefox = /Firefox/.test(navigator.userAgent);\n\n\tvar element_prototype = Element.prototype;\n\tvar node_prototype = Node.prototype;\n\tvar text_prototype = Text.prototype;\n\n\t// @ts-ignore\n\tfirst_child_getter = get_descriptor(node_prototype, 'firstChild').get;\n\t// @ts-ignore\n\tnext_sibling_getter = get_descriptor(node_prototype, 'nextSibling').get;\n\n\tif (is_extensible(element_prototype)) {\n\t\t// the following assignments improve perf of lookups on DOM nodes\n\t\t/** @type {any} */ (element_prototype)[CLASS_CACHE] = undefined;\n\t\t/** @type {any} */ (element_prototype)[ATTRIBUTES_CACHE] = null;\n\t\t/** @type {any} */ (element_prototype)[STYLE_CACHE] = undefined;\n\t\t// @ts-expect-error\n\t\telement_prototype.__e = undefined;\n\t}\n\n\tif (is_extensible(text_prototype)) {\n\t\t/** @type {any} */ (text_prototype)[TEXT_CACHE] = undefined;\n\t}\n\n\tif (DEV) {\n\t\t// @ts-expect-error\n\t\telement_prototype.__svelte_meta = null;\n\n\t\tinit_array_prototype_warnings();\n\t}\n}\n\n/**\n * @param {string} value\n * @returns {Text}\n */\nexport function create_text(value = '') {\n\treturn document.createTextNode(value);\n}\n\n/**\n * @template {Node} N\n * @param {N} node\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function get_first_child(node) {\n\treturn /** @type {TemplateNode | null} */ (first_child_getter.call(node));\n}\n\n/**\n * @template {Node} N\n * @param {N} node\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function get_next_sibling(node) {\n\treturn /** @type {TemplateNode | null} */ (next_sibling_getter.call(node));\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @template {Node} N\n * @param {N} node\n * @param {boolean} is_text\n * @returns {TemplateNode | null}\n */\nexport function child(node, is_text) {\n\tif (!hydrating) {\n\t\treturn get_first_child(node);\n\t}\n\n\tvar child = get_first_child(hydrate_node);\n\n\t// Child can be null if we have an element with a single child, like `<p>{text}</p>`, where `text` is empty\n\tif (child === null) {\n\t\tchild = hydrate_node.appendChild(create_text());\n\t} else if (is_text && child.nodeType !== TEXT_NODE) {\n\t\tvar text = create_text();\n\t\tchild?.before(text);\n\t\tset_hydrate_node(text);\n\t\treturn text;\n\t}\n\n\tif (is_text) {\n\t\tmerge_text_nodes(/** @type {Text} */ (child));\n\t}\n\n\tset_hydrate_node(child);\n\treturn child;\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @param {TemplateNode} node\n * @param {boolean} [is_text]\n * @returns {TemplateNode | null}\n */\nexport function first_child(node, is_text = false) {\n\tif (!hydrating) {\n\t\tvar first = get_first_child(node);\n\n\t\t// TODO prevent user comments with the empty string when preserveComments is true\n\t\tif (first instanceof Comment && first.data === '') return get_next_sibling(first);\n\n\t\treturn first;\n\t}\n\n\tif (is_text) {\n\t\t// if an {expression} is empty during SSR, there might be no\n\t\t// text node to hydrate — we must therefore create one\n\t\tif (hydrate_node?.nodeType !== TEXT_NODE) {\n\t\t\tvar text = create_text();\n\n\t\t\thydrate_node?.before(text);\n\t\t\tset_hydrate_node(text);\n\t\t\treturn text;\n\t\t}\n\n\t\tmerge_text_nodes(/** @type {Text} */ (hydrate_node));\n\t}\n\n\treturn hydrate_node;\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @param {TemplateNode} node\n * @param {number} count\n * @param {boolean} is_text\n * @returns {TemplateNode | null}\n */\nexport function sibling(node, count = 1, is_text = false) {\n\tlet next_sibling = hydrating ? hydrate_node : node;\n\tvar last_sibling;\n\n\twhile (count--) {\n\t\tlast_sibling = next_sibling;\n\t\tnext_sibling = /** @type {TemplateNode} */ (get_next_sibling(next_sibling));\n\t}\n\n\tif (!hydrating) {\n\t\treturn next_sibling;\n\t}\n\n\tif (is_text) {\n\t\t// if a sibling {expression} is empty during SSR, there might be no\n\t\t// text node to hydrate — we must therefore create one\n\t\tif (next_sibling?.nodeType !== TEXT_NODE) {\n\t\t\tvar text = create_text();\n\t\t\t// If the next sibling is `null` and we're handling text then it's because\n\t\t\t// the SSR content was empty for the text, so we need to generate a new text\n\t\t\t// node and insert it after the last sibling\n\t\t\tif (next_sibling === null) {\n\t\t\t\tlast_sibling?.after(text);\n\t\t\t} else {\n\t\t\t\tnext_sibling.before(text);\n\t\t\t}\n\t\t\tset_hydrate_node(text);\n\t\t\treturn text;\n\t\t}\n\n\t\tmerge_text_nodes(/** @type {Text} */ (next_sibling));\n\t}\n\n\tset_hydrate_node(next_sibling);\n\treturn next_sibling;\n}\n\n/**\n * @template {Node} N\n * @param {N} node\n * @returns {void}\n */\nexport function clear_text_content(node) {\n\tnode.textContent = '';\n}\n\n/**\n * Returns `true` if we're updating the current block, for example `condition` in\n * an `{#if condition}` block just changed. In this case, the branch should be\n * appended (or removed) at the same time as other updates within the\n * current `<svelte:boundary>`\n */\nexport function should_defer_append() {\n\tif (!async_mode_flag) return false;\n\tif (eager_block_effects !== null) return false;\n\n\tvar flags = /** @type {Effect} */ (active_effect).f;\n\treturn (flags & REACTION_RAN) !== 0;\n}\n\n/**\n * Branching here is intentional and load-bearing for perf. `createElement(tag)`\n * hits a fast path in Blink that `createElementNS(NAMESPACE_HTML, tag)` doesn't,\n * and passing an explicit `undefined` as the trailing options arg measurably\n * slows both APIs. Funnelling every case through a single `createElementNS(ns,\n * tag, options)` call would be smaller but slower on the HTML path.\n *\n * @template {keyof HTMLElementTagNameMap | string} T\n * @param {T} tag\n * @param {string} [namespace]\n * @param {string} [is]\n * @returns {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element}\n */\nexport function create_element(tag, namespace, is) {\n\tif (namespace == null || namespace === NAMESPACE_HTML) {\n\t\treturn /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ (\n\t\t\tis ? document.createElement(tag, { is }) : document.createElement(tag)\n\t\t);\n\t}\n\treturn /** @type {T extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[T] : Element} */ (\n\t\tis ? document.createElementNS(namespace, tag, { is }) : document.createElementNS(namespace, tag)\n\t);\n}\n\nexport function create_fragment() {\n\treturn document.createDocumentFragment();\n}\n\n/**\n * @param {string} data\n * @returns\n */\nexport function create_comment(data = '') {\n\treturn document.createComment(data);\n}\n\n/**\n * @param {Element} element\n * @param {string} key\n * @param {string} value\n * @returns\n */\nexport function set_attribute(element, key, value = '') {\n\tif (key.startsWith('xlink:')) {\n\t\telement.setAttributeNS('http://www.w3.org/1999/xlink', key, value);\n\t\treturn;\n\t}\n\treturn element.setAttribute(key, value);\n}\n\n/**\n * Browsers split text nodes larger than 65536 bytes when parsing.\n * For hydration to succeed, we need to stitch them back together\n * @param {Text} text\n */\nexport function merge_text_nodes(text) {\n\tif (/** @type {string} */ (text.nodeValue).length < 65536) {\n\t\treturn;\n\t}\n\n\tlet next = text.nextSibling;\n\n\twhile (next !== null && next.nodeType === TEXT_NODE) {\n\t\tnext.remove();\n\n\t\t/** @type {string} */ (text.nodeValue) += /** @type {string} */ (next.nodeValue);\n\n\t\tnext = text.nextSibling;\n\t}\n}\n","import { hydrating } from '../hydration.js';\nimport { clear_text_content, get_first_child } from '../operations.js';\nimport { queue_micro_task } from '../task.js';\nimport { FORM_RESET_HANDLER } from '../../constants.js';\n\n/**\n * @param {HTMLElement} dom\n * @param {boolean} value\n * @returns {void}\n */\nexport function autofocus(dom, value) {\n\tif (value) {\n\t\tconst body = document.body;\n\t\tdom.autofocus = true;\n\n\t\tqueue_micro_task(() => {\n\t\t\tif (document.activeElement === body) {\n\t\t\t\tdom.focus();\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * The child of a textarea actually corresponds to the defaultValue property, so we need\n * to remove it upon hydration to avoid a bug when someone resets the form value.\n * @param {HTMLTextAreaElement} dom\n * @returns {void}\n */\nexport function remove_textarea_child(dom) {\n\tif (hydrating && get_first_child(dom) !== null) {\n\t\tclear_text_content(dom);\n\t}\n}\n\nlet listening_to_form_reset = false;\n\nexport function add_form_reset_listener() {\n\tif (!listening_to_form_reset) {\n\t\tlistening_to_form_reset = true;\n\t\tdocument.addEventListener(\n\t\t\t'reset',\n\t\t\t(evt) => {\n\t\t\t\t// Needs to happen one tick later or else the dom properties of the form\n\t\t\t\t// elements have not updated to their reset values yet\n\t\t\t\tPromise.resolve().then(() => {\n\t\t\t\t\tif (!evt.defaultPrevented) {\n\t\t\t\t\t\tfor (const e of /**@type {HTMLFormElement} */ (evt.target).elements) {\n\t\t\t\t\t\t\t/** @type {any} */ (e)[FORM_RESET_HANDLER]?.();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\t// In the capture phase to guarantee we get noticed of it (no possibility of stopPropagation)\n\t\t\t{ capture: true }\n\t\t);\n\t}\n}\n","import { teardown } from '../../../reactivity/effects.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../../runtime.js';\nimport { FORM_RESET_HANDLER } from '../../../constants.js';\nimport { add_form_reset_listener } from '../misc.js';\n\n/**\n * Fires the handler once immediately (unless corresponding arg is set to `false`),\n * then listens to the given events until the render effect context is destroyed\n * @param {EventTarget} target\n * @param {Array<string>} events\n * @param {(event?: Event) => void} handler\n * @param {any} call_handler_immediately\n */\nexport function listen(target, events, handler, call_handler_immediately = true) {\n\tif (call_handler_immediately) {\n\t\thandler();\n\t}\n\n\tfor (var name of events) {\n\t\ttarget.addEventListener(name, handler);\n\t}\n\n\tteardown(() => {\n\t\tfor (var name of events) {\n\t\t\ttarget.removeEventListener(name, handler);\n\t\t}\n\t});\n}\n\n/**\n * @template T\n * @param {() => T} fn\n */\nexport function without_reactive_context(fn) {\n\tvar previous_reaction = active_reaction;\n\tvar previous_effect = active_effect;\n\tset_active_reaction(null);\n\tset_active_effect(null);\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\tset_active_reaction(previous_reaction);\n\t\tset_active_effect(previous_effect);\n\t}\n}\n\n/**\n * Listen to the given event, and then instantiate a global form reset listener if not already done,\n * to notify all bindings when the form is reset\n * @param {HTMLElement} element\n * @param {string} event\n * @param {(is_reset?: true) => void} handler\n * @param {(is_reset?: true) => void} [on_reset]\n */\nexport function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) {\n\telement.addEventListener(event, () => without_reactive_context(handler));\n\tconst prev = /** @type {any} */ (element)[FORM_RESET_HANDLER];\n\tif (prev) {\n\t\t// special case for checkbox that can have multiple binds (group & checked)\n\t\t/** @type {any} */ (element)[FORM_RESET_HANDLER] = () => {\n\t\t\tprev();\n\t\t\ton_reset(true);\n\t\t};\n\t} else {\n\t\t/** @type {any} */ (element)[FORM_RESET_HANDLER] = () => on_reset(true);\n\t}\n\n\tadd_form_reset_listener();\n}\n","/** @import { Blocker, ComponentContext, ComponentContextLegacy, Derived, Effect, TemplateNode, TransitionManager } from '#client' */\nimport {\n\tis_dirty,\n\tactive_effect,\n\tactive_reaction,\n\tupdate_effect,\n\tget,\n\tis_destroying_effect,\n\tremove_reactions,\n\tset_active_reaction,\n\tset_is_destroying_effect,\n\tuntrack,\n\tuntracking,\n\tset_active_effect\n} from '../runtime.js';\nimport {\n\tDIRTY,\n\tBRANCH_EFFECT,\n\tRENDER_EFFECT,\n\tEFFECT,\n\tDESTROYED,\n\tINERT,\n\tBLOCK_EFFECT,\n\tROOT_EFFECT,\n\tEFFECT_TRANSPARENT,\n\tDERIVED,\n\tCLEAN,\n\tEAGER_EFFECT,\n\tHEAD_EFFECT,\n\tMAYBE_DIRTY,\n\tEFFECT_PRESERVED,\n\tSTALE_REACTION,\n\tUSER_EFFECT,\n\tASYNC,\n\tCONNECTED,\n\tMANAGED_EFFECT,\n\tDESTROYING\n} from '#client/constants';\nimport * as e from '../errors.js';\nimport { DEV } from 'esm-env';\nimport { define_property } from '../../shared/utils.js';\nimport { get_next_sibling } from '../dom/operations.js';\nimport { component_context, dev_current_component_function, dev_stack } from '../context.js';\nimport { Batch, collected_effects, current_batch } from './batch.js';\nimport { flatten } from './async.js';\nimport { without_reactive_context } from '../dom/elements/bindings/shared.js';\nimport { set_signal_status } from './status.js';\n\n/**\n * @param {'$effect' | '$effect.pre' | '$inspect'} rune\n */\nexport function validate_effect(rune) {\n\tif (active_effect === null) {\n\t\tif (active_reaction === null) {\n\t\t\te.effect_orphan(rune);\n\t\t}\n\n\t\te.effect_in_unowned_derived();\n\t}\n\n\tif (is_destroying_effect) {\n\t\te.effect_in_teardown(rune);\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {Effect} parent_effect\n */\nfunction push_effect(effect, parent_effect) {\n\tvar parent_last = parent_effect.last;\n\tif (parent_last === null) {\n\t\tparent_effect.last = parent_effect.first = effect;\n\t} else {\n\t\tparent_last.next = effect;\n\t\teffect.prev = parent_last;\n\t\tparent_effect.last = effect;\n\t}\n}\n\n/**\n * @param {number} type\n * @param {null | (() => void | (() => void))} fn\n * @returns {Effect}\n */\nfunction create_effect(type, fn) {\n\tvar parent = active_effect;\n\n\tif (DEV) {\n\t\t// Ensure the parent is never an inspect effect\n\t\twhile (parent !== null && (parent.f & EAGER_EFFECT) !== 0) {\n\t\t\tparent = parent.parent;\n\t\t}\n\t}\n\n\tif (parent !== null && (parent.f & INERT) !== 0) {\n\t\ttype |= INERT;\n\t}\n\n\t/** @type {Effect} */\n\tvar effect = {\n\t\tctx: component_context,\n\t\tdeps: null,\n\t\tnodes: null,\n\t\tf: type | DIRTY | CONNECTED,\n\t\tfirst: null,\n\t\tfn,\n\t\tlast: null,\n\t\tnext: null,\n\t\tparent,\n\t\tb: parent && parent.b,\n\t\tprev: null,\n\t\tteardown: null,\n\t\twv: 0,\n\t\tac: null\n\t};\n\n\tif (DEV) {\n\t\teffect.component_function = dev_current_component_function;\n\t}\n\n\tcurrent_batch?.register_created_effect(effect);\n\n\t/** @type {Effect | null} */\n\tvar e = effect;\n\n\tif ((type & EFFECT) !== 0) {\n\t\tif (collected_effects !== null) {\n\t\t\t// created during traversal — collect and run afterwards\n\t\t\tcollected_effects.push(effect);\n\t\t} else {\n\t\t\t// schedule for later\n\t\t\tBatch.ensure().schedule(effect);\n\t\t}\n\t} else if (fn !== null) {\n\t\ttry {\n\t\t\tupdate_effect(effect);\n\t\t} catch (e) {\n\t\t\tdestroy_effect(effect);\n\t\t\tthrow e;\n\t\t}\n\n\t\t// if an effect doesn't need to be kept in the tree (because it\n\t\t// won't re-run, has no DOM, and has no teardown etc)\n\t\t// then we skip it and go to its child (if any)\n\t\tif (\n\t\t\te.deps === null &&\n\t\t\te.teardown === null &&\n\t\t\te.nodes === null &&\n\t\t\te.first === e.last && // either `null`, or a singular child\n\t\t\t(e.f & EFFECT_PRESERVED) === 0\n\t\t) {\n\t\t\te = e.first;\n\t\t\tif ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) {\n\t\t\t\te.f |= EFFECT_TRANSPARENT;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (e !== null) {\n\t\te.parent = parent;\n\n\t\tif (parent !== null) {\n\t\t\tpush_effect(e, parent);\n\t\t}\n\n\t\t// if we're in a derived, add the effect there too\n\t\tif (\n\t\t\tactive_reaction !== null &&\n\t\t\t(active_reaction.f & DERIVED) !== 0 &&\n\t\t\t(type & ROOT_EFFECT) === 0\n\t\t) {\n\t\t\tvar derived = /** @type {Derived} */ (active_reaction);\n\t\t\t(derived.effects ??= []).push(e);\n\t\t}\n\t}\n\n\treturn effect;\n}\n\n/**\n * Internal representation of `$effect.tracking()`\n * @returns {boolean}\n */\nexport function effect_tracking() {\n\treturn active_reaction !== null && !untracking;\n}\n\n/**\n * @param {() => void} fn\n */\nexport function teardown(fn) {\n\tconst effect = create_effect(RENDER_EFFECT, null);\n\tset_signal_status(effect, CLEAN);\n\teffect.teardown = fn;\n\treturn effect;\n}\n\n/**\n * Internal representation of `$effect(...)`\n * @param {() => void | (() => void)} fn\n */\nexport function user_effect(fn) {\n\tvalidate_effect('$effect');\n\n\tif (DEV) {\n\t\tdefine_property(fn, 'name', {\n\t\t\tvalue: '$effect'\n\t\t});\n\t}\n\n\t// Non-nested `$effect(...)` in a component should be deferred\n\t// until the component is mounted\n\tvar flags = /** @type {Effect} */ (active_effect).f;\n\tvar defer =\n\t\t!active_reaction &&\n\t\t(flags & BRANCH_EFFECT) !== 0 &&\n\t\tcomponent_context !== null &&\n\t\t!component_context.i;\n\n\tif (defer) {\n\t\t// Top-level `$effect(...)` in an unmounted component — defer until mount\n\t\tvar context = /** @type {ComponentContext} */ (component_context);\n\t\t(context.e ??= []).push(fn);\n\t} else {\n\t\t// Everything else — create immediately\n\t\treturn create_user_effect(fn);\n\t}\n}\n\n/**\n * @param {() => void | (() => void)} fn\n */\nexport function create_user_effect(fn) {\n\treturn create_effect(EFFECT | USER_EFFECT, fn);\n}\n\n/**\n * Internal representation of `$effect.pre(...)`\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function user_pre_effect(fn) {\n\tvalidate_effect('$effect.pre');\n\tif (DEV) {\n\t\tdefine_property(fn, 'name', {\n\t\t\tvalue: '$effect.pre'\n\t\t});\n\t}\n\treturn create_effect(RENDER_EFFECT | USER_EFFECT, fn);\n}\n\n/** @param {() => void | (() => void)} fn */\nexport function eager_effect(fn) {\n\treturn create_effect(EAGER_EFFECT, fn);\n}\n\n/**\n * Internal representation of `$effect.root(...)`\n * @param {() => void | (() => void)} fn\n * @returns {() => void}\n */\nexport function effect_root(fn) {\n\tBatch.ensure();\n\tconst effect = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn);\n\n\treturn () => {\n\t\tdestroy_effect(effect);\n\t};\n}\n\n/**\n * An effect root whose children can transition out\n * @param {() => void} fn\n * @returns {(options?: { outro?: boolean }) => Promise<void>}\n */\nexport function component_root(fn) {\n\tBatch.ensure();\n\tconst effect = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn);\n\n\treturn (options = {}) => {\n\t\treturn new Promise((fulfil) => {\n\t\t\tif (options.outro) {\n\t\t\t\tpause_effect(effect, () => {\n\t\t\t\t\tdestroy_effect(effect);\n\t\t\t\t\tfulfil(undefined);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdestroy_effect(effect);\n\t\t\t\tfulfil(undefined);\n\t\t\t}\n\t\t});\n\t};\n}\n\n/**\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function effect(fn) {\n\treturn create_effect(EFFECT, fn);\n}\n\n/**\n * Internal representation of `$: ..`\n * @param {() => any} deps\n * @param {() => void | (() => void)} fn\n */\nexport function legacy_pre_effect(deps, fn) {\n\tvar context = /** @type {ComponentContextLegacy} */ (component_context);\n\n\t/** @type {{ effect: null | Effect, ran: boolean, deps: () => any }} */\n\tvar token = { effect: null, ran: false, deps };\n\n\tcontext.l.$.push(token);\n\n\ttoken.effect = render_effect(() => {\n\t\tdeps();\n\n\t\t// If this legacy pre effect has already run before the end of the reset, then\n\t\t// bail out to emulate the same behavior.\n\t\tif (token.ran) return;\n\n\t\ttoken.ran = true;\n\n\t\tvar effect = /** @type {Effect} */ (active_effect);\n\n\t\t// here, we lie: by setting `active_effect` to be the parent branch, any writes\n\t\t// that happen inside `fn` will _not_ cause an unnecessary reschedule, because\n\t\t// the affected effects will be children of `active_effect`. this is safe\n\t\t// because these effects are known to run in the correct order\n\t\ttry {\n\t\t\tset_active_effect(effect.parent);\n\t\t\tuntrack(fn);\n\t\t} finally {\n\t\t\tset_active_effect(effect);\n\t\t}\n\t});\n}\n\nexport function legacy_pre_effect_reset() {\n\tvar context = /** @type {ComponentContextLegacy} */ (component_context);\n\n\trender_effect(() => {\n\t\t// Run dirty `$:` statements\n\t\tfor (var token of context.l.$) {\n\t\t\ttoken.deps();\n\n\t\t\tvar effect = token.effect;\n\n\t\t\t// If the effect is CLEAN, then make it MAYBE_DIRTY. This ensures we traverse through\n\t\t\t// the effects dependencies and correctly ensure each dependency is up-to-date.\n\t\t\tif ((effect.f & CLEAN) !== 0 && effect.deps !== null) {\n\t\t\t\tset_signal_status(effect, MAYBE_DIRTY);\n\t\t\t}\n\n\t\t\tif (is_dirty(effect)) {\n\t\t\t\tupdate_effect(effect);\n\t\t\t}\n\n\t\t\ttoken.ran = false;\n\t\t}\n\t});\n}\n\n/**\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function async_effect(fn) {\n\treturn create_effect(ASYNC | EFFECT_PRESERVED, fn);\n}\n\n/**\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function render_effect(fn, flags = 0) {\n\treturn create_effect(RENDER_EFFECT | flags, fn);\n}\n\n/**\n * @param {(...expressions: any) => void | (() => void)} fn\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {Blocker[]} blockers\n */\nexport function template_effect(fn, sync = [], async = [], blockers = []) {\n\tflatten(blockers, sync, async, (values) => {\n\t\tcreate_effect(RENDER_EFFECT, () => {\n\t\t\tfn(...values.map(get));\n\t\t});\n\t});\n}\n\n/**\n * Like `template_effect`, but with an effect which is deferred until the batch commits\n * @param {(...expressions: any) => void | (() => void)} fn\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {Blocker[]} blockers\n */\nexport function deferred_template_effect(fn, sync = [], async = [], blockers = []) {\n\tflatten(blockers, sync, async, (values) => {\n\t\tcreate_effect(EFFECT, () => fn(...values.map(get)));\n\t});\n}\n\n/**\n * @param {(() => void)} fn\n * @param {number} flags\n */\nexport function block(fn, flags = 0) {\n\tvar effect = create_effect(BLOCK_EFFECT | flags, fn);\n\tif (DEV) {\n\t\teffect.dev_stack = dev_stack;\n\t}\n\treturn effect;\n}\n\n/**\n * @param {(() => void)} fn\n * @param {number} flags\n */\nexport function managed(fn, flags = 0) {\n\tvar effect = create_effect(MANAGED_EFFECT | flags, fn);\n\tif (DEV) {\n\t\teffect.dev_stack = dev_stack;\n\t}\n\treturn effect;\n}\n\n/**\n * @param {(() => void)} fn\n */\nexport function branch(fn) {\n\treturn create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn);\n}\n\n/**\n * @param {Effect} effect\n */\nexport function execute_effect_teardown(effect) {\n\tvar teardown = effect.teardown;\n\tif (teardown !== null) {\n\t\tconst previously_destroying_effect = is_destroying_effect;\n\t\tconst previous_reaction = active_reaction;\n\t\tset_is_destroying_effect(true);\n\t\tset_active_reaction(null);\n\t\ttry {\n\t\t\tteardown.call(null);\n\t\t} finally {\n\t\t\tset_is_destroying_effect(previously_destroying_effect);\n\t\t\tset_active_reaction(previous_reaction);\n\t\t}\n\t}\n}\n\n/**\n * @param {Effect} signal\n * @param {boolean} remove_dom\n * @returns {void}\n */\nexport function destroy_effect_children(signal, remove_dom = false) {\n\tvar effect = signal.first;\n\tsignal.first = signal.last = null;\n\n\twhile (effect !== null) {\n\t\tconst controller = effect.ac;\n\n\t\tif (controller !== null) {\n\t\t\twithout_reactive_context(() => {\n\t\t\t\tcontroller.abort(STALE_REACTION);\n\t\t\t});\n\t\t}\n\n\t\tvar next = effect.next;\n\n\t\tif ((effect.f & ROOT_EFFECT) !== 0) {\n\t\t\t// this is now an independent root\n\t\t\teffect.parent = null;\n\t\t} else {\n\t\t\tdestroy_effect(effect, remove_dom);\n\t\t}\n\n\t\teffect = next;\n\t}\n}\n\n/**\n * @param {Effect} signal\n * @returns {void}\n */\nexport function destroy_block_effect_children(signal) {\n\tvar effect = signal.first;\n\n\twhile (effect !== null) {\n\t\tvar next = effect.next;\n\t\tif ((effect.f & BRANCH_EFFECT) === 0) {\n\t\t\tdestroy_effect(effect);\n\t\t}\n\t\teffect = next;\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {boolean} [remove_dom]\n * @returns {void}\n */\nexport function destroy_effect(effect, remove_dom = true) {\n\tvar removed = false;\n\n\tif (\n\t\t(remove_dom || (effect.f & HEAD_EFFECT) !== 0) &&\n\t\teffect.nodes !== null &&\n\t\teffect.nodes.end !== null\n\t) {\n\t\tremove_effect_dom(effect.nodes.start, /** @type {TemplateNode} */ (effect.nodes.end));\n\t\tremoved = true;\n\t}\n\n\teffect.f |= DESTROYING;\n\tdestroy_effect_children(effect, remove_dom && !removed);\n\tremove_reactions(effect, 0);\n\n\tvar transitions = effect.nodes && effect.nodes.t;\n\n\tif (transitions !== null) {\n\t\tfor (const transition of transitions) {\n\t\t\ttransition.stop();\n\t\t}\n\t}\n\n\texecute_effect_teardown(effect);\n\n\teffect.f ^= DESTROYING;\n\teffect.f |= DESTROYED;\n\n\tvar parent = effect.parent;\n\n\t// If the parent doesn't have any children, then skip this work altogether\n\tif (parent !== null && parent.first !== null) {\n\t\tunlink_effect(effect);\n\t}\n\n\tif (DEV) {\n\t\teffect.component_function = null;\n\t}\n\n\t// `first` and `child` are nulled out in destroy_effect_children\n\t// we don't null out `parent` so that error propagation can work correctly\n\teffect.next =\n\t\teffect.prev =\n\t\teffect.teardown =\n\t\teffect.ctx =\n\t\teffect.deps =\n\t\teffect.fn =\n\t\teffect.nodes =\n\t\teffect.ac =\n\t\teffect.b =\n\t\t\tnull;\n}\n\n/**\n *\n * @param {TemplateNode | null} node\n * @param {TemplateNode} end\n */\nexport function remove_effect_dom(node, end) {\n\twhile (node !== null) {\n\t\t/** @type {TemplateNode | null} */\n\t\tvar next = node === end ? null : get_next_sibling(node);\n\n\t\tnode.remove();\n\t\tnode = next;\n\t}\n}\n\n/**\n * Detach an effect from the effect tree, freeing up memory and\n * reducing the amount of work that happens on subsequent traversals\n * @param {Effect} effect\n */\nexport function unlink_effect(effect) {\n\tvar parent = effect.parent;\n\tvar prev = effect.prev;\n\tvar next = effect.next;\n\n\tif (prev !== null) prev.next = next;\n\tif (next !== null) next.prev = prev;\n\n\tif (parent !== null) {\n\t\tif (parent.first === effect) parent.first = next;\n\t\tif (parent.last === effect) parent.last = prev;\n\t}\n}\n\n/**\n * When a block effect is removed, we don't immediately destroy it or yank it\n * out of the DOM, because it might have transitions. Instead, we 'pause' it.\n * It stays around (in memory, and in the DOM) until outro transitions have\n * completed, and if the state change is reversed then we _resume_ it.\n * A paused effect does not update, and the DOM subtree becomes inert.\n * @param {Effect} effect\n * @param {() => void} [callback]\n * @param {boolean} [destroy]\n */\nexport function pause_effect(effect, callback, destroy = true) {\n\t/** @type {TransitionManager[]} */\n\tvar transitions = [];\n\n\tpause_children(effect, transitions, true);\n\n\tvar fn = () => {\n\t\tif (destroy) destroy_effect(effect);\n\t\tif (callback) callback();\n\t};\n\n\tvar remaining = transitions.length;\n\tif (remaining > 0) {\n\t\tvar check = () => --remaining || fn();\n\t\tfor (var transition of transitions) {\n\t\t\ttransition.out(check);\n\t\t}\n\t} else {\n\t\tfn();\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {TransitionManager[]} transitions\n * @param {boolean} local\n */\nfunction pause_children(effect, transitions, local) {\n\tif ((effect.f & INERT) !== 0) return;\n\teffect.f ^= INERT;\n\n\tvar t = effect.nodes && effect.nodes.t;\n\n\tif (t !== null) {\n\t\tfor (const transition of t) {\n\t\t\tif (transition.is_global || local) {\n\t\t\t\ttransitions.push(transition);\n\t\t\t}\n\t\t}\n\t}\n\n\tvar child = effect.first;\n\n\twhile (child !== null) {\n\t\tvar sibling = child.next;\n\n\t\t// If this child is a root effect, then it will become an independent root when its parent\n\t\t// is destroyed, it should therefore not become inert nor partake in transitions.\n\t\tif ((child.f & ROOT_EFFECT) === 0) {\n\t\t\tvar transparent =\n\t\t\t\t(child.f & EFFECT_TRANSPARENT) !== 0 ||\n\t\t\t\t// If this is a branch effect without a block effect parent,\n\t\t\t\t// it means the parent block effect was pruned. In that case,\n\t\t\t\t// transparency information was transferred to the branch effect.\n\t\t\t\t((child.f & BRANCH_EFFECT) !== 0 && (effect.f & BLOCK_EFFECT) !== 0);\n\t\t\t// TODO we don't need to call pause_children recursively with a linked list in place\n\t\t\t// it's slightly more involved though as we have to account for `transparent` changing\n\t\t\t// through the tree.\n\t\t\tpause_children(child, transitions, transparent ? local : false);\n\t\t}\n\n\t\tchild = sibling;\n\t}\n}\n\n/**\n * The opposite of `pause_effect`. We call this if (for example)\n * `x` becomes falsy then truthy: `{#if x}...{/if}`\n * @param {Effect} effect\n */\nexport function resume_effect(effect) {\n\tresume_children(effect, true);\n}\n\n/**\n * @param {Effect} effect\n * @param {boolean} local\n */\nfunction resume_children(effect, local) {\n\tif ((effect.f & INERT) === 0) return;\n\teffect.f ^= INERT;\n\n\t// If a dependency of this effect changed while it was paused,\n\t// schedule the effect to update. we don't use `is_dirty`\n\t// here because we don't want to eagerly recompute a derived like\n\t// `{#if foo}{foo.bar()}{/if}` if `foo` is now `undefined\n\tif ((effect.f & CLEAN) === 0) {\n\t\tset_signal_status(effect, DIRTY);\n\t\tBatch.ensure().schedule(effect); // Assumption: This happens during the commit phase of the batch, causing another flush, but it's safe\n\t}\n\n\tvar child = effect.first;\n\n\twhile (child !== null) {\n\t\tvar sibling = child.next;\n\t\tvar transparent = (child.f & EFFECT_TRANSPARENT) !== 0 || (child.f & BRANCH_EFFECT) !== 0;\n\t\t// TODO we don't need to call resume_children recursively with a linked list in place\n\t\t// it's slightly more involved though as we have to account for `transparent` changing\n\t\t// through the tree.\n\t\tresume_children(child, transparent ? local : false);\n\t\tchild = sibling;\n\t}\n\n\tvar t = effect.nodes && effect.nodes.t;\n\n\tif (t !== null) {\n\t\tfor (const transition of t) {\n\t\t\tif (transition.is_global || local) {\n\t\t\t\ttransition.in();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function aborted(effect = /** @type {Effect} */ (active_effect)) {\n\treturn (effect.f & DESTROYED) !== 0;\n}\n\n/**\n * @param {Effect} effect\n * @param {DocumentFragment} fragment\n */\nexport function move_effect(effect, fragment) {\n\tif (!effect.nodes) return;\n\n\t/** @type {TemplateNode | null} */\n\tvar node = effect.nodes.start;\n\tvar end = effect.nodes.end;\n\n\twhile (node !== null) {\n\t\t/** @type {TemplateNode | null} */\n\t\tvar next = node === end ? null : get_next_sibling(node);\n\n\t\tfragment.append(node);\n\t\tnode = next;\n\t}\n}\n","/** @import { Value } from '#client' */\nimport { internal_set } from './reactivity/sources.js';\nimport { untrack } from './runtime.js';\n\n/**\n * @type {Set<Value> | null}\n * @deprecated\n */\nexport let captured_signals = null;\n\n/**\n * Capture an array of all the signals that are read when `fn` is called\n * @template T\n * @param {() => T} fn\n */\nfunction capture_signals(fn) {\n\tvar previous_captured_signals = captured_signals;\n\n\ttry {\n\t\tcaptured_signals = new Set();\n\n\t\tuntrack(fn);\n\n\t\tif (previous_captured_signals !== null) {\n\t\t\tfor (var signal of captured_signals) {\n\t\t\t\tprevious_captured_signals.add(signal);\n\t\t\t}\n\t\t}\n\n\t\treturn captured_signals;\n\t} finally {\n\t\tcaptured_signals = previous_captured_signals;\n\t}\n}\n\n/**\n * Invokes a function and captures all signals that are read during the invocation,\n * then invalidates them.\n * @param {() => any} fn\n * @deprecated\n */\nexport function invalidate_inner_signals(fn) {\n\tfor (var signal of capture_signals(fn)) {\n\t\tinternal_set(signal, signal.v);\n\t}\n}\n","/** @import { Derived, Effect, Reaction, Source, Value } from '#client' */\nimport { DEV } from 'esm-env';\nimport { get_descriptors, get_prototype_of, includes, index_of } from '../shared/utils.js';\nimport {\n\tdestroy_block_effect_children,\n\tdestroy_effect_children,\n\teffect_tracking,\n\texecute_effect_teardown\n} from './reactivity/effects.js';\nimport {\n\tDIRTY,\n\tMAYBE_DIRTY,\n\tCLEAN,\n\tDERIVED,\n\tDESTROYED,\n\tBRANCH_EFFECT,\n\tSTATE_SYMBOL,\n\tBLOCK_EFFECT,\n\tROOT_EFFECT,\n\tCONNECTED,\n\tREACTION_IS_UPDATING,\n\tSTALE_REACTION,\n\tERROR_VALUE,\n\tWAS_MARKED,\n\tMANAGED_EFFECT,\n\tREACTION_RAN\n} from './constants.js';\nimport { old_values } from './reactivity/sources.js';\nimport {\n\treactivity_loss_tracker,\n\texecute_derived,\n\tfreeze_derived_effects,\n\trecent_async_deriveds,\n\tunfreeze_derived_effects,\n\tupdate_derived\n} from './reactivity/deriveds.js';\nimport { async_mode_flag, tracing_mode_flag } from '../flags/index.js';\nimport { tracing_expressions } from './dev/tracing.js';\nimport { get_error } from '../shared/dev.js';\nimport {\n\tcomponent_context,\n\tdev_current_component_function,\n\tdev_stack,\n\tis_runes,\n\tset_component_context,\n\tset_dev_current_component_function,\n\tset_dev_stack\n} from './context.js';\nimport {\n\tBatch,\n\tbatch_values,\n\tcurrent_batch,\n\tflushSync,\n\tprevious_batch,\n\tschedule_effect\n} from './reactivity/batch.js';\nimport { handle_error } from './error-handling.js';\nimport { UNINITIALIZED } from '../../constants.js';\nimport { captured_signals } from './legacy.js';\nimport { without_reactive_context } from './dom/elements/bindings/shared.js';\nimport { set_signal_status, update_derived_status } from './reactivity/status.js';\nimport * as w from './warnings.js';\n\nlet is_updating_effect = false;\n\nexport let is_destroying_effect = false;\n\n/** @param {boolean} value */\nexport function set_is_destroying_effect(value) {\n\tis_destroying_effect = value;\n}\n\n/** @type {null | Reaction} */\nexport let active_reaction = null;\n\nexport let untracking = false;\n\n/** @param {null | Reaction} reaction */\nexport function set_active_reaction(reaction) {\n\tactive_reaction = reaction;\n}\n\n/** @type {null | Effect} */\nexport let active_effect = null;\n\n/** @param {null | Effect} effect */\nexport function set_active_effect(effect) {\n\tactive_effect = effect;\n}\n\n/**\n * When sources are created within a reaction, reading and writing\n * them within that reaction should not cause a re-run\n * @type {null | Set<Source>}\n */\nexport let current_sources = null;\n\n/** @param {Value} value */\nexport function push_reaction_value(value) {\n\tif (active_reaction !== null && (!async_mode_flag || (active_reaction.f & DERIVED) !== 0)) {\n\t\t(current_sources ??= new Set()).add(value);\n\t}\n}\n\n/**\n * The dependencies of the reaction that is currently being executed. In many cases,\n * the dependencies are unchanged between runs, and so this will be `null` unless\n * and until a new dependency is accessed — we track this via `skipped_deps`\n * @type {null | Value[]}\n */\nexport let new_deps = null;\n\nexport let skipped_deps = 0;\n\n/**\n * Tracks writes that the effect it's executed in doesn't listen to yet,\n * so that the dependency can be added to the effect later on if it then reads it\n * @type {null | Source[]}\n */\nexport let untracked_writes = null;\n\n/** @param {null | Source[]} value */\nexport function set_untracked_writes(value) {\n\tuntracked_writes = value;\n}\n\n/**\n * @type {number} Used by sources and deriveds for handling updates.\n * Version starts from 1 so that unowned deriveds differentiate between a created effect and a run one for tracing\n **/\nexport let write_version = 1;\n\n/** @type {number} Used to version each read of a source of derived to avoid duplicating depedencies inside a reaction */\nlet read_version = 0;\n\nexport let update_version = read_version;\n\n/** @param {number} value */\nexport function set_update_version(value) {\n\tupdate_version = value;\n}\n\nexport function increment_write_version() {\n\treturn ++write_version;\n}\n\n/**\n * Determines whether a derived or effect is dirty.\n * If it is MAYBE_DIRTY, will set the status to CLEAN\n * @param {Reaction} reaction\n * @returns {boolean}\n */\nexport function is_dirty(reaction) {\n\tvar flags = reaction.f;\n\n\tif ((flags & DIRTY) !== 0) {\n\t\treturn true;\n\t}\n\n\tif (flags & DERIVED) {\n\t\treaction.f &= ~WAS_MARKED;\n\t}\n\n\tif ((flags & MAYBE_DIRTY) !== 0) {\n\t\tvar dependencies = /** @type {Value[]} */ (reaction.deps);\n\t\tvar length = dependencies.length;\n\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tvar dependency = dependencies[i];\n\n\t\t\tif (is_dirty(/** @type {Derived} */ (dependency))) {\n\t\t\t\tupdate_derived(/** @type {Derived} */ (dependency));\n\t\t\t}\n\n\t\t\tif (dependency.wv > reaction.wv) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\t(flags & CONNECTED) !== 0 &&\n\t\t\t// During time traveling we don't want to reset the status so that\n\t\t\t// traversal of the graph in the other batches still happens\n\t\t\tbatch_values === null\n\t\t) {\n\t\t\tset_signal_status(reaction, CLEAN);\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * @param {Value} signal\n * @param {Effect} effect\n * @param {boolean} [root]\n */\nfunction schedule_possible_effect_self_invalidation(signal, effect, root = true) {\n\tvar reactions = signal.reactions;\n\tif (reactions === null) return;\n\n\tif (!async_mode_flag && current_sources !== null && current_sources.has(signal)) {\n\t\treturn;\n\t}\n\n\tfor (var i = 0; i < reactions.length; i++) {\n\t\tvar reaction = reactions[i];\n\n\t\tif ((reaction.f & DERIVED) !== 0) {\n\t\t\tschedule_possible_effect_self_invalidation(/** @type {Derived} */ (reaction), effect, false);\n\t\t} else if (effect === reaction) {\n\t\t\tif (root) {\n\t\t\t\tset_signal_status(reaction, DIRTY);\n\t\t\t} else if ((reaction.f & CLEAN) !== 0) {\n\t\t\t\tset_signal_status(reaction, MAYBE_DIRTY);\n\t\t\t}\n\t\t\tschedule_effect(/** @type {Effect} */ (reaction));\n\t\t}\n\t}\n}\n\n/** @param {Reaction} reaction */\nexport function update_reaction(reaction) {\n\tvar previous_deps = new_deps;\n\tvar previous_skipped_deps = skipped_deps;\n\tvar previous_untracked_writes = untracked_writes;\n\tvar previous_reaction = active_reaction;\n\tvar previous_sources = current_sources;\n\tvar previous_component_context = component_context;\n\tvar previous_untracking = untracking;\n\tvar previous_update_version = update_version;\n\n\tvar flags = reaction.f;\n\n\tnew_deps = /** @type {null | Value[]} */ (null);\n\tskipped_deps = 0;\n\tuntracked_writes = null;\n\tactive_reaction = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null;\n\n\tcurrent_sources = null;\n\tset_component_context(reaction.ctx);\n\tuntracking = false;\n\tupdate_version = ++read_version;\n\n\tif (reaction.ac !== null) {\n\t\twithout_reactive_context(() => {\n\t\t\t/** @type {AbortController} */ (reaction.ac).abort(STALE_REACTION);\n\t\t});\n\n\t\treaction.ac = null;\n\t}\n\n\ttry {\n\t\treaction.f |= REACTION_IS_UPDATING;\n\t\tvar fn = /** @type {Function} */ (reaction.fn);\n\t\tvar result = fn();\n\t\treaction.f |= REACTION_RAN;\n\t\tvar deps = reaction.deps;\n\n\t\t// Don't remove reactions during fork;\n\t\t// they must remain for when fork is discarded\n\t\tvar is_fork = current_batch?.is_fork;\n\n\t\tif (new_deps !== null) {\n\t\t\tvar i;\n\n\t\t\tif (!is_fork) {\n\t\t\t\tremove_reactions(reaction, skipped_deps);\n\t\t\t}\n\n\t\t\tif (deps !== null && skipped_deps > 0) {\n\t\t\t\tdeps.length = skipped_deps + new_deps.length;\n\t\t\t\tfor (i = 0; i < new_deps.length; i++) {\n\t\t\t\t\tdeps[skipped_deps + i] = new_deps[i];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treaction.deps = deps = new_deps;\n\t\t\t}\n\n\t\t\tif (effect_tracking() && (reaction.f & CONNECTED) !== 0) {\n\t\t\t\tfor (i = skipped_deps; i < deps.length; i++) {\n\t\t\t\t\t(deps[i].reactions ??= []).push(reaction);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!is_fork && deps !== null && skipped_deps < deps.length) {\n\t\t\tremove_reactions(reaction, skipped_deps);\n\t\t\tdeps.length = skipped_deps;\n\t\t}\n\n\t\t// If we're inside an effect and we have untracked writes, then we need to\n\t\t// ensure that if any of those untracked writes result in re-invalidation\n\t\t// of the current effect, then that happens accordingly\n\t\tif (\n\t\t\tis_runes() &&\n\t\t\tuntracked_writes !== null &&\n\t\t\t!untracking &&\n\t\t\tdeps !== null &&\n\t\t\t(reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0\n\t\t) {\n\t\t\tfor (i = 0; i < /** @type {Source[]} */ (untracked_writes).length; i++) {\n\t\t\t\tschedule_possible_effect_self_invalidation(\n\t\t\t\t\tuntracked_writes[i],\n\t\t\t\t\t/** @type {Effect} */ (reaction)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// If we are returning to an previous reaction then\n\t\t// we need to increment the read version to ensure that\n\t\t// any dependencies in this reaction aren't marked with\n\t\t// the same version\n\t\tif (previous_reaction !== null && previous_reaction !== reaction) {\n\t\t\tread_version++;\n\n\t\t\t// update the `rv` of the previous reaction's deps — both existing and new —\n\t\t\t// so that they are not added again\n\t\t\tif (previous_reaction.deps !== null) {\n\t\t\t\tfor (let i = 0; i < previous_skipped_deps; i += 1) {\n\t\t\t\t\tprevious_reaction.deps[i].rv = read_version;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (previous_deps !== null) {\n\t\t\t\tfor (const dep of previous_deps) {\n\t\t\t\t\tdep.rv = read_version;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (untracked_writes !== null) {\n\t\t\t\tif (previous_untracked_writes === null) {\n\t\t\t\t\tprevious_untracked_writes = untracked_writes;\n\t\t\t\t} else {\n\t\t\t\t\tprevious_untracked_writes.push(.../** @type {Source[]} */ (untracked_writes));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ((reaction.f & ERROR_VALUE) !== 0) {\n\t\t\treaction.f ^= ERROR_VALUE;\n\t\t}\n\n\t\treturn result;\n\t} catch (error) {\n\t\treturn handle_error(error);\n\t} finally {\n\t\treaction.f ^= REACTION_IS_UPDATING;\n\t\tnew_deps = previous_deps;\n\t\tskipped_deps = previous_skipped_deps;\n\t\tuntracked_writes = previous_untracked_writes;\n\t\tactive_reaction = previous_reaction;\n\t\tcurrent_sources = previous_sources;\n\t\tset_component_context(previous_component_context);\n\t\tuntracking = previous_untracking;\n\t\tupdate_version = previous_update_version;\n\t}\n}\n\n/**\n * @template V\n * @param {Reaction} signal\n * @param {Value<V>} dependency\n * @returns {void}\n */\nfunction remove_reaction(signal, dependency) {\n\tlet reactions = dependency.reactions;\n\tif (reactions !== null) {\n\t\tvar index = index_of.call(reactions, signal);\n\t\tif (index !== -1) {\n\t\t\tvar new_length = reactions.length - 1;\n\t\t\tif (new_length === 0) {\n\t\t\t\treactions = dependency.reactions = null;\n\t\t\t} else {\n\t\t\t\t// Swap with last element and then remove.\n\t\t\t\treactions[index] = reactions[new_length];\n\t\t\t\treactions.pop();\n\t\t\t}\n\t\t}\n\t}\n\n\t// If the derived has no reactions, then we can disconnect it from the graph,\n\t// allowing it to either reconnect in the future, or be GC'd by the VM.\n\tif (\n\t\treactions === null &&\n\t\t(dependency.f & DERIVED) !== 0 &&\n\t\t// Destroying a child effect while updating a parent effect can cause a dependency to appear\n\t\t// to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps`\n\t\t// allows us to skip the expensive work of disconnecting and immediately reconnecting it\n\t\t(new_deps === null || !includes.call(new_deps, dependency))\n\t) {\n\t\tvar derived = /** @type {Derived} */ (dependency);\n\n\t\t// If we are working with a derived that is owned by an effect, then mark it as being\n\t\t// disconnected and remove the mark flag, as it cannot be reliably removed otherwise\n\t\tif ((derived.f & CONNECTED) !== 0) {\n\t\t\tderived.f ^= CONNECTED;\n\t\t\tderived.f &= ~WAS_MARKED;\n\t\t}\n\n\t\t// In a fork it's possible that a derived is executed and gets reactions, then commits, but is\n\t\t// never re-executed. This is possible when the derived is only executed once in the context\n\t\t// of a new branch which happens before fork.commit() runs. In this case, the derived still has\n\t\t// UNINITIALIZED as its value, and then when it's loosing its reactions we need to ensure it stays\n\t\t// DIRTY so it is reexecuted once someone wants its value again.\n\t\tif (derived.v !== UNINITIALIZED) {\n\t\t\tupdate_derived_status(derived);\n\t\t}\n\n\t\t// freeze any effects inside this derived\n\t\tfreeze_derived_effects(derived);\n\n\t\t// Disconnect any reactions owned by this reaction\n\t\tremove_reactions(derived, 0);\n\t}\n}\n\n/**\n * @param {Reaction} signal\n * @param {number} start_index\n * @returns {void}\n */\nexport function remove_reactions(signal, start_index) {\n\tvar dependencies = signal.deps;\n\tif (dependencies === null) return;\n\n\tfor (var i = start_index; i < dependencies.length; i++) {\n\t\tremove_reaction(signal, dependencies[i]);\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @returns {void}\n */\nexport function update_effect(effect) {\n\tvar flags = effect.f;\n\n\tif ((flags & DESTROYED) !== 0) {\n\t\treturn;\n\t}\n\n\tset_signal_status(effect, CLEAN);\n\n\tvar previous_effect = active_effect;\n\tvar was_updating_effect = is_updating_effect;\n\n\tactive_effect = effect;\n\tis_updating_effect = true;\n\n\tif (DEV) {\n\t\tvar previous_component_fn = dev_current_component_function;\n\t\tset_dev_current_component_function(effect.component_function);\n\t\tvar previous_stack = /** @type {any} */ (dev_stack);\n\t\t// only block effects have a dev stack, keep the current one otherwise\n\t\tset_dev_stack(effect.dev_stack ?? dev_stack);\n\t}\n\n\ttry {\n\t\tif ((flags & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) {\n\t\t\tdestroy_block_effect_children(effect);\n\t\t} else {\n\t\t\tdestroy_effect_children(effect);\n\t\t}\n\n\t\texecute_effect_teardown(effect);\n\t\tvar teardown = update_reaction(effect);\n\t\teffect.teardown = typeof teardown === 'function' ? teardown : null;\n\t\teffect.wv = write_version;\n\n\t\t// In DEV, increment versions of any sources that were written to during the effect,\n\t\t// so that they are correctly marked as dirty when the effect re-runs\n\t\tif (DEV && tracing_mode_flag && (effect.f & DIRTY) !== 0 && effect.deps !== null) {\n\t\t\tfor (var dep of effect.deps) {\n\t\t\t\tif (dep.set_during_effect) {\n\t\t\t\t\tdep.wv = increment_write_version();\n\t\t\t\t\tdep.set_during_effect = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tis_updating_effect = was_updating_effect;\n\t\tactive_effect = previous_effect;\n\n\t\tif (DEV) {\n\t\t\tset_dev_current_component_function(previous_component_fn);\n\t\t\tset_dev_stack(previous_stack);\n\t\t}\n\t}\n}\n\n/**\n * Returns a promise that resolves once any pending state changes have been applied.\n * @returns {Promise<void>}\n */\nexport async function tick() {\n\tif (async_mode_flag) {\n\t\treturn new Promise((f) => {\n\t\t\t// Race them against each other - in almost all cases requestAnimationFrame will fire first,\n\t\t\t// but e.g. in case the window is not focused or a view transition happens, requestAnimationFrame\n\t\t\t// will be delayed and setTimeout helps us resolve fast enough in that case\n\t\t\trequestAnimationFrame(() => f());\n\t\t\tsetTimeout(() => f());\n\t\t});\n\t}\n\n\tawait Promise.resolve();\n\n\t// By calling flushSync we guarantee that any pending state changes are applied after one tick.\n\t// TODO look into whether we can make flushing subsequent updates synchronously in the future.\n\tflushSync();\n}\n\n/**\n * Returns a promise that resolves once any state changes, and asynchronous work resulting from them,\n * have resolved and the DOM has been updated\n * @returns {Promise<void>}\n * @since 5.36\n */\nexport function settled() {\n\treturn Batch.ensure().settled();\n}\n\n/**\n * @template V\n * @param {Value<V>} signal\n * @returns {V}\n */\nexport function get(signal) {\n\tvar flags = signal.f;\n\tvar is_derived = (flags & DERIVED) !== 0;\n\n\tcaptured_signals?.add(signal);\n\n\t// Register the dependency on the current reaction signal.\n\tif (active_reaction !== null && !untracking) {\n\t\t// if we're in a derived that is being read inside an _async_ derived,\n\t\t// it's possible that the effect was already destroyed. In this case,\n\t\t// we don't add the dependency, because that would create a memory leak\n\t\tvar destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0;\n\n\t\tif (!destroyed && (current_sources === null || !current_sources.has(signal))) {\n\t\t\tvar deps = active_reaction.deps;\n\n\t\t\tif ((active_reaction.f & REACTION_IS_UPDATING) !== 0) {\n\t\t\t\t// we're in the effect init/update cycle\n\t\t\t\tif (signal.rv < read_version) {\n\t\t\t\t\tsignal.rv = read_version;\n\n\t\t\t\t\t// If the signal is accessing the same dependencies in the same\n\t\t\t\t\t// order as it did last time, increment `skipped_deps`\n\t\t\t\t\t// rather than updating `new_deps`, which creates GC cost\n\t\t\t\t\tif (new_deps === null && deps !== null && deps[skipped_deps] === signal) {\n\t\t\t\t\t\tskipped_deps++;\n\t\t\t\t\t} else if (new_deps === null) {\n\t\t\t\t\t\tnew_deps = [signal];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnew_deps.push(signal);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We're adding a dependency outside the init/update cycle (i.e. after an `await`).\n\t\t\t\t// We have to deduplicate deps/reactions in this case or remove_reactions could\n\t\t\t\t// disconnect deps/reactions that are actually still in use (if skip_deps says\n\t\t\t\t// \"disconnect all after this index\" and some of the signals are also present in\n\t\t\t\t// list prior to the cutoff index, i.e. that should be kept).\n\t\t\t\tactive_reaction.deps ??= [];\n\t\t\t\tif (!includes.call(active_reaction.deps, signal)) {\n\t\t\t\t\tactive_reaction.deps.push(signal);\n\t\t\t\t}\n\n\t\t\t\tvar reactions = signal.reactions;\n\n\t\t\t\tif (reactions === null) {\n\t\t\t\t\tsignal.reactions = [active_reaction];\n\t\t\t\t} else if (!includes.call(reactions, active_reaction)) {\n\t\t\t\t\treactions.push(active_reaction);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (DEV) {\n\t\tif (\n\t\t\t!untracking &&\n\t\t\treactivity_loss_tracker &&\n\t\t\t// By checking that current/previous batch are null we filter out false positives.\n\t\t\t// reactivity_loss_tracker is only reset after a microtask, so if a flush happens\n\t\t\t// before that, we get warnings for things we shouldn't warn on.\n\t\t\tcurrent_batch === null &&\n\t\t\tprevious_batch === null &&\n\t\t\t!reactivity_loss_tracker.warned &&\n\t\t\t(reactivity_loss_tracker.effect.f & REACTION_IS_UPDATING) === 0 &&\n\t\t\t!reactivity_loss_tracker.effect_deps.has(signal)\n\t\t) {\n\t\t\treactivity_loss_tracker.warned = true;\n\n\t\t\tw.await_reactivity_loss(/** @type {string} */ (signal.label));\n\n\t\t\tvar trace = get_error('traced at');\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tif (trace) console.warn(trace);\n\t\t}\n\n\t\trecent_async_deriveds.delete(signal);\n\n\t\tif (\n\t\t\ttracing_mode_flag &&\n\t\t\t!untracking &&\n\t\t\ttracing_expressions !== null &&\n\t\t\tactive_reaction !== null &&\n\t\t\ttracing_expressions.reaction === active_reaction\n\t\t) {\n\t\t\t// Used when mapping state between special blocks like `each`\n\t\t\tif (signal.trace) {\n\t\t\t\tsignal.trace();\n\t\t\t} else {\n\t\t\t\ttrace = get_error('traced at');\n\n\t\t\t\tif (trace) {\n\t\t\t\t\tvar entry = tracing_expressions.entries.get(signal);\n\n\t\t\t\t\tif (entry === undefined) {\n\t\t\t\t\t\tentry = { traces: [] };\n\t\t\t\t\t\ttracing_expressions.entries.set(signal, entry);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar last = entry.traces[entry.traces.length - 1];\n\n\t\t\t\t\t// traces can be duplicated, e.g. by `snapshot` invoking both\n\t\t\t\t\t// both `getOwnPropertyDescriptor` and `get` traps at once\n\t\t\t\t\tif (trace.stack !== last?.stack) {\n\t\t\t\t\t\tentry.traces.push(trace);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (is_destroying_effect && old_values.has(signal)) {\n\t\treturn old_values.get(signal);\n\t}\n\n\tif (is_derived) {\n\t\tvar derived = /** @type {Derived} */ (signal);\n\n\t\tif (is_destroying_effect) {\n\t\t\tvar value = derived.v;\n\n\t\t\t// if the derived is dirty and has reactions, or depends on the values that just changed, re-execute\n\t\t\t// (a derived can be maybe_dirty due to the effect destroy removing its last reaction)\n\t\t\tif (\n\t\t\t\t((derived.f & CLEAN) === 0 && derived.reactions !== null) ||\n\t\t\t\tdepends_on_old_values(derived)\n\t\t\t) {\n\t\t\t\tvalue = execute_derived(derived);\n\t\t\t}\n\n\t\t\told_values.set(derived, value);\n\n\t\t\treturn value;\n\t\t}\n\n\t\t// connect disconnected deriveds if we are reading them inside an effect,\n\t\t// or inside another derived that is already connected\n\t\tvar should_connect =\n\t\t\t(derived.f & CONNECTED) === 0 &&\n\t\t\t!untracking &&\n\t\t\tactive_reaction !== null &&\n\t\t\t(is_updating_effect || (active_reaction.f & CONNECTED) !== 0);\n\n\t\tvar is_new = (derived.f & REACTION_RAN) === 0;\n\n\t\tif (is_dirty(derived)) {\n\t\t\tif (should_connect) {\n\t\t\t\t// set the flag before `update_derived`, so that the derived\n\t\t\t\t// is added as a reaction to its dependencies\n\t\t\t\tderived.f |= CONNECTED;\n\t\t\t}\n\n\t\t\tupdate_derived(derived);\n\t\t}\n\n\t\tif (should_connect && !is_new) {\n\t\t\tunfreeze_derived_effects(derived);\n\t\t\treconnect(derived);\n\t\t}\n\t}\n\n\tif (batch_values?.has(signal)) {\n\t\treturn batch_values.get(signal);\n\t}\n\n\tif ((signal.f & ERROR_VALUE) !== 0) {\n\t\tthrow signal.v;\n\t}\n\n\treturn signal.v;\n}\n\n/**\n * (Re)connect a disconnected derived, so that it is notified\n * of changes in `mark_reactions`\n * @param {Derived} derived\n */\nfunction reconnect(derived) {\n\tderived.f |= CONNECTED;\n\n\tif (derived.deps === null) return;\n\n\tfor (const dep of derived.deps) {\n\t\t(dep.reactions ??= []).push(derived);\n\n\t\tif ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) {\n\t\t\tunfreeze_derived_effects(/** @type {Derived} */ (dep));\n\t\t\treconnect(/** @type {Derived} */ (dep));\n\t\t}\n\t}\n}\n\n/** @param {Derived} derived */\nfunction depends_on_old_values(derived) {\n\tif (derived.v === UNINITIALIZED) return true; // we don't know, so assume the worst\n\tif (derived.deps === null) return false;\n\n\tfor (const dep of derived.deps) {\n\t\tif (old_values.has(dep)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((dep.f & DERIVED) !== 0 && depends_on_old_values(/** @type {Derived} */ (dep))) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Like `get`, but checks for `undefined`. Used for `var` declarations because they can be accessed before being declared\n * @template V\n * @param {Value<V> | undefined} signal\n * @returns {V | undefined}\n */\nexport function safe_get(signal) {\n\treturn signal && get(signal);\n}\n\n/**\n * When used inside a [`$derived`](https://svelte.dev/docs/svelte/$derived) or [`$effect`](https://svelte.dev/docs/svelte/$effect),\n * any state read inside `fn` will not be treated as a dependency.\n *\n * ```ts\n * $effect(() => {\n * // this will run when `data` changes, but not when `time` changes\n * save(data, {\n * timestamp: untrack(() => time)\n * });\n * });\n * ```\n * @template T\n * @param {() => T} fn\n * @returns {T}\n */\nexport function untrack(fn) {\n\tvar previous_untracking = untracking;\n\ttry {\n\t\tuntracking = true;\n\t\treturn fn();\n\t} finally {\n\t\tuntracking = previous_untracking;\n\t}\n}\n\n/**\n * Possibly traverse an object and read all its properties so that they're all reactive in case this is `$state`.\n * Does only check first level of an object for performance reasons (heuristic should be good for 99% of all cases).\n * @param {any} value\n * @returns {void}\n */\nexport function deep_read_state(value) {\n\tif (typeof value !== 'object' || !value || value instanceof EventTarget) {\n\t\treturn;\n\t}\n\n\tif (STATE_SYMBOL in value) {\n\t\tdeep_read(value);\n\t} else if (!Array.isArray(value)) {\n\t\tfor (let key in value) {\n\t\t\tconst prop = value[key];\n\t\t\tif (typeof prop === 'object' && prop && STATE_SYMBOL in prop) {\n\t\t\t\tdeep_read(prop);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Deeply traverse an object and read all its properties\n * so that they're all reactive in case this is `$state`\n * @param {any} value\n * @param {Set<any>} visited\n * @returns {void}\n */\nexport function deep_read(value, visited = new Set()) {\n\tif (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t// We don't want to traverse DOM elements\n\t\t!(value instanceof EventTarget) &&\n\t\t!visited.has(value)\n\t) {\n\t\tvisited.add(value);\n\t\t// When working with a possible SvelteDate, this\n\t\t// will ensure we capture changes to it.\n\t\tif (value instanceof Date) {\n\t\t\tvalue.getTime();\n\t\t}\n\t\tfor (let key in value) {\n\t\t\ttry {\n\t\t\t\tdeep_read(value[key], visited);\n\t\t\t} catch (e) {\n\t\t\t\t// continue\n\t\t\t}\n\t\t}\n\t\tconst proto = get_prototype_of(value);\n\t\tif (\n\t\t\tproto !== Object.prototype &&\n\t\t\tproto !== Array.prototype &&\n\t\t\tproto !== Map.prototype &&\n\t\t\tproto !== Set.prototype &&\n\t\t\tproto !== Date.prototype\n\t\t) {\n\t\t\tconst descriptors = get_descriptors(proto);\n\t\t\tfor (let key in descriptors) {\n\t\t\t\tconst get = descriptors[key].get;\n\t\t\t\tif (get) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tget.call(value);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// continue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","const regex_return_characters = /\\r/g;\n\n/**\n * @param {string} str\n * @returns {string}\n */\nexport function hash(str) {\n\tstr = str.replace(regex_return_characters, '');\n\tlet hash = 5381;\n\tlet i = str.length;\n\n\twhile (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n\treturn (hash >>> 0).toString(36);\n}\n\nconst VOID_ELEMENT_NAMES = [\n\t'area',\n\t'base',\n\t'br',\n\t'col',\n\t'command',\n\t'embed',\n\t'hr',\n\t'img',\n\t'input',\n\t'keygen',\n\t'link',\n\t'meta',\n\t'param',\n\t'source',\n\t'track',\n\t'wbr'\n];\n\n/**\n * Returns `true` if `name` is of a void element\n * @param {string} name\n */\nexport function is_void(name) {\n\treturn VOID_ELEMENT_NAMES.includes(name) || name.toLowerCase() === '!doctype';\n}\n\nconst RESERVED_WORDS = [\n\t'arguments',\n\t'await',\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'eval',\n\t'export',\n\t'extends',\n\t'false',\n\t'finally',\n\t'for',\n\t'function',\n\t'if',\n\t'implements',\n\t'import',\n\t'in',\n\t'instanceof',\n\t'interface',\n\t'let',\n\t'new',\n\t'null',\n\t'package',\n\t'private',\n\t'protected',\n\t'public',\n\t'return',\n\t'static',\n\t'super',\n\t'switch',\n\t'this',\n\t'throw',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'yield'\n];\n\n/**\n * Returns `true` if `word` is a reserved JavaScript keyword\n * @param {string} word\n */\nexport function is_reserved(word) {\n\treturn RESERVED_WORDS.includes(word);\n}\n\n/**\n * @param {string} name\n */\nexport function is_capture_event(name) {\n\treturn name.endsWith('capture') && name !== 'gotpointercapture' && name !== 'lostpointercapture';\n}\n\n/** List of Element events that will be delegated */\nconst DELEGATED_EVENTS = [\n\t'beforeinput',\n\t'click',\n\t'change',\n\t'dblclick',\n\t'contextmenu',\n\t'focusin',\n\t'focusout',\n\t'input',\n\t'keydown',\n\t'keyup',\n\t'mousedown',\n\t'mousemove',\n\t'mouseout',\n\t'mouseover',\n\t'mouseup',\n\t'pointerdown',\n\t'pointermove',\n\t'pointerout',\n\t'pointerover',\n\t'pointerup',\n\t'touchend',\n\t'touchmove',\n\t'touchstart'\n];\n\n/**\n * Returns `true` if `event_name` is a delegated event\n * @param {string} event_name\n */\nexport function can_delegate_event(event_name) {\n\treturn DELEGATED_EVENTS.includes(event_name);\n}\n\n/**\n * Attributes that are boolean, i.e. they are present or not present.\n */\nconst DOM_BOOLEAN_ATTRIBUTES = [\n\t'allowfullscreen',\n\t'async',\n\t'autofocus',\n\t'autoplay',\n\t'checked',\n\t'controls',\n\t'default',\n\t'disabled',\n\t'formnovalidate',\n\t'indeterminate',\n\t'inert',\n\t'ismap',\n\t'loop',\n\t'multiple',\n\t'muted',\n\t'nomodule',\n\t'novalidate',\n\t'open',\n\t'playsinline',\n\t'readonly',\n\t'required',\n\t'reversed',\n\t'seamless',\n\t'selected',\n\t'webkitdirectory',\n\t'defer',\n\t'disablepictureinpicture',\n\t'disableremoteplayback'\n];\n\n/**\n * Returns `true` if `name` is a boolean attribute\n * @param {string} name\n */\nexport function is_boolean_attribute(name) {\n\treturn DOM_BOOLEAN_ATTRIBUTES.includes(name);\n}\n\n/**\n * @type {Record<string, string>}\n * List of attribute names that should be aliased to their property names\n * because they behave differently between setting them as an attribute and\n * setting them as a property.\n */\nconst ATTRIBUTE_ALIASES = {\n\t// no `class: 'className'` because we handle that separately\n\tformnovalidate: 'formNoValidate',\n\tismap: 'isMap',\n\tnomodule: 'noModule',\n\tplaysinline: 'playsInline',\n\treadonly: 'readOnly',\n\tdefaultvalue: 'defaultValue',\n\tdefaultchecked: 'defaultChecked',\n\tsrcobject: 'srcObject',\n\tnovalidate: 'noValidate',\n\tallowfullscreen: 'allowFullscreen',\n\tdisablepictureinpicture: 'disablePictureInPicture',\n\tdisableremoteplayback: 'disableRemotePlayback'\n};\n\n/**\n * @param {string} name\n */\nexport function normalize_attribute(name) {\n\tname = name.toLowerCase();\n\treturn ATTRIBUTE_ALIASES[name] ?? name;\n}\n\nconst DOM_PROPERTIES = [\n\t...DOM_BOOLEAN_ATTRIBUTES,\n\t'formNoValidate',\n\t'isMap',\n\t'noModule',\n\t'playsInline',\n\t'readOnly',\n\t'value',\n\t'volume',\n\t'defaultValue',\n\t'defaultChecked',\n\t'srcObject',\n\t'noValidate',\n\t'allowFullscreen',\n\t'disablePictureInPicture',\n\t'disableRemotePlayback'\n];\n\n/**\n * @param {string} name\n */\nexport function is_dom_property(name) {\n\treturn DOM_PROPERTIES.includes(name);\n}\n\nconst NON_STATIC_PROPERTIES = ['autofocus', 'muted', 'defaultValue', 'defaultChecked'];\n\n/**\n * Returns `true` if the given attribute cannot be set through the template\n * string, i.e. needs some kind of JavaScript handling to work.\n * @param {string} name\n */\nexport function cannot_be_set_statically(name) {\n\treturn NON_STATIC_PROPERTIES.includes(name);\n}\n\n/**\n * Subset of delegated events which should be passive by default.\n * These two are already passive via browser defaults on window, document and body.\n * But since\n * - we're delegating them\n * - they happen often\n * - they apply to mobile which is generally less performant\n * we're marking them as passive by default for other elements, too.\n */\nconst PASSIVE_EVENTS = ['touchstart', 'touchmove'];\n\n/**\n * Returns `true` if `name` is a passive event\n * @param {string} name\n */\nexport function is_passive_event(name) {\n\treturn PASSIVE_EVENTS.includes(name);\n}\n\nconst CONTENT_EDITABLE_BINDINGS = ['textContent', 'innerHTML', 'innerText'];\n\n/** @param {string} name */\nexport function is_content_editable_binding(name) {\n\treturn CONTENT_EDITABLE_BINDINGS.includes(name);\n}\n\nconst LOAD_ERROR_ELEMENTS = [\n\t'body',\n\t'embed',\n\t'iframe',\n\t'img',\n\t'link',\n\t'object',\n\t'script',\n\t'style',\n\t'track'\n];\n\n/**\n * Returns `true` if the element emits `load` and `error` events\n * @param {string} name\n */\nexport function is_load_error_element(name) {\n\treturn LOAD_ERROR_ELEMENTS.includes(name);\n}\n\nconst SVG_ELEMENTS = [\n\t'altGlyph',\n\t'altGlyphDef',\n\t'altGlyphItem',\n\t'animate',\n\t'animateColor',\n\t'animateMotion',\n\t'animateTransform',\n\t'circle',\n\t'clipPath',\n\t'color-profile',\n\t'cursor',\n\t'defs',\n\t'desc',\n\t'discard',\n\t'ellipse',\n\t'feBlend',\n\t'feColorMatrix',\n\t'feComponentTransfer',\n\t'feComposite',\n\t'feConvolveMatrix',\n\t'feDiffuseLighting',\n\t'feDisplacementMap',\n\t'feDistantLight',\n\t'feDropShadow',\n\t'feFlood',\n\t'feFuncA',\n\t'feFuncB',\n\t'feFuncG',\n\t'feFuncR',\n\t'feGaussianBlur',\n\t'feImage',\n\t'feMerge',\n\t'feMergeNode',\n\t'feMorphology',\n\t'feOffset',\n\t'fePointLight',\n\t'feSpecularLighting',\n\t'feSpotLight',\n\t'feTile',\n\t'feTurbulence',\n\t'filter',\n\t'font',\n\t'font-face',\n\t'font-face-format',\n\t'font-face-name',\n\t'font-face-src',\n\t'font-face-uri',\n\t'foreignObject',\n\t'g',\n\t'glyph',\n\t'glyphRef',\n\t'hatch',\n\t'hatchpath',\n\t'hkern',\n\t'image',\n\t'line',\n\t'linearGradient',\n\t'marker',\n\t'mask',\n\t'mesh',\n\t'meshgradient',\n\t'meshpatch',\n\t'meshrow',\n\t'metadata',\n\t'missing-glyph',\n\t'mpath',\n\t'path',\n\t'pattern',\n\t'polygon',\n\t'polyline',\n\t'radialGradient',\n\t'rect',\n\t'set',\n\t'solidcolor',\n\t'stop',\n\t'svg',\n\t'switch',\n\t'symbol',\n\t'text',\n\t'textPath',\n\t'tref',\n\t'tspan',\n\t'unknown',\n\t'use',\n\t'view',\n\t'vkern'\n];\n\n/** @param {string} name */\nexport function is_svg(name) {\n\treturn SVG_ELEMENTS.includes(name);\n}\n\nconst MATHML_ELEMENTS = [\n\t'annotation',\n\t'annotation-xml',\n\t'maction',\n\t'math',\n\t'merror',\n\t'mfrac',\n\t'mi',\n\t'mmultiscripts',\n\t'mn',\n\t'mo',\n\t'mover',\n\t'mpadded',\n\t'mphantom',\n\t'mprescripts',\n\t'mroot',\n\t'mrow',\n\t'ms',\n\t'mspace',\n\t'msqrt',\n\t'mstyle',\n\t'msub',\n\t'msubsup',\n\t'msup',\n\t'mtable',\n\t'mtd',\n\t'mtext',\n\t'mtr',\n\t'munder',\n\t'munderover',\n\t'semantics'\n];\n\n/** @param {string} name */\nexport function is_mathml(name) {\n\treturn MATHML_ELEMENTS.includes(name);\n}\n\nconst STATE_CREATION_RUNES = /** @type {const} */ ([\n\t'$state',\n\t'$state.raw',\n\t'$derived',\n\t'$derived.by'\n]);\n\nexport const RUNES = /** @type {const} */ ([\n\t...STATE_CREATION_RUNES,\n\t'$state.eager',\n\t'$state.snapshot',\n\t'$props',\n\t'$props.id',\n\t'$bindable',\n\t'$effect',\n\t'$effect.pre',\n\t'$effect.tracking',\n\t'$effect.root',\n\t'$effect.pending',\n\t'$inspect',\n\t'$inspect().with',\n\t'$inspect.trace',\n\t'$host'\n]);\n\n/** @typedef {typeof RUNES[number]} RuneName */\n\n/**\n * @param {string} name\n * @returns {name is RuneName}\n */\nexport function is_rune(name) {\n\treturn RUNES.includes(/** @type {RuneName} */ (name));\n}\n\n/** @typedef {typeof STATE_CREATION_RUNES[number]} StateCreationRuneName */\n\n/**\n * @param {string} name\n * @returns {name is StateCreationRuneName}\n */\nexport function is_state_creation_rune(name) {\n\treturn STATE_CREATION_RUNES.includes(/** @type {StateCreationRuneName} */ (name));\n}\n\n/** List of elements that require raw contents and should not have SSR comments put in them */\nconst RAW_TEXT_ELEMENTS = /** @type {const} */ (['textarea', 'script', 'style', 'title']);\n\n/** @param {string} name */\nexport function is_raw_text_element(name) {\n\treturn RAW_TEXT_ELEMENTS.includes(/** @type {typeof RAW_TEXT_ELEMENTS[number]} */ (name));\n}\n\n// Matches valid HTML/SVG/MathML element names and custom element names.\n// https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name\n//\n// Standard elements: ASCII alpha start, followed by ASCII alphanumerics.\n// Custom elements: ASCII alpha start, followed by any mix of PCENChar (which\n// includes ASCII alphanumerics, `-`, `.`, `_`, and specified Unicode ranges),\n// with at least one hyphen required somewhere after the first character.\n//\n// Rejects strings containing whitespace, quotes, angle brackets, slashes, equals,\n// or other characters that could break out of a tag-name token and enable markup injection.\nexport const REGEX_VALID_TAG_NAME =\n\t/^[a-zA-Z][a-zA-Z0-9]*(-[a-zA-Z0-9.\\-_\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u{10000}-\\u{EFFFF}]*)?$/u;\n\n/**\n * Prevent devtools trying to make `location` a clickable link by inserting a zero-width space\n * @template {string | undefined} T\n * @param {T} location\n * @returns {T};\n */\nexport function sanitize_location(location) {\n\treturn /** @type {T} */ (location?.replace(/\\//g, '/\\u200b'));\n}\n","import { teardown } from '../../reactivity/effects.js';\nimport { define_property } from '../../../shared/utils.js';\nimport { hydrating } from '../hydration.js';\nimport { queue_micro_task } from '../task.js';\nimport { FILENAME } from '../../../../constants.js';\nimport * as w from '../../warnings.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../runtime.js';\nimport { without_reactive_context } from './bindings/shared.js';\n\n/**\n * Used on elements, as a map of event type -> event handler,\n * and on events themselves to track which element handled an event\n */\nexport const event_symbol = Symbol('events');\n\n/** @type {Set<string>} */\nexport const all_registered_events = new Set();\n\n/** @type {Set<(events: Array<string>) => void>} */\nexport const root_event_handles = new Set();\n\n/**\n * SSR adds onload and onerror attributes to catch those events before the hydration.\n * This function detects those cases, removes the attributes and replays the events.\n * @param {HTMLElement} dom\n */\nexport function replay_events(dom) {\n\tif (!hydrating) return;\n\n\tdom.removeAttribute('onload');\n\tdom.removeAttribute('onerror');\n\t// @ts-expect-error\n\tconst event = dom.__e;\n\tif (event !== undefined) {\n\t\t// @ts-expect-error\n\t\tdom.__e = undefined;\n\t\tqueueMicrotask(() => {\n\t\t\tif (dom.isConnected) {\n\t\t\t\tdom.dispatchEvent(event);\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * @param {string} event_name\n * @param {EventTarget} dom\n * @param {EventListener} [handler]\n * @param {AddEventListenerOptions} [options]\n */\nexport function create_event(event_name, dom, handler, options = {}) {\n\t/**\n\t * @this {EventTarget}\n\t */\n\tfunction target_handler(/** @type {Event} */ event) {\n\t\tif (!options.capture) {\n\t\t\t// Only call in the bubble phase, else delegated events would be called before the capturing events\n\t\t\thandle_event_propagation.call(dom, event);\n\t\t}\n\t\tif (!event.cancelBubble) {\n\t\t\treturn without_reactive_context(() => {\n\t\t\t\treturn handler?.call(this, event);\n\t\t\t});\n\t\t}\n\t}\n\n\t// Chrome has a bug where pointer events don't work when attached to a DOM element that has been cloned\n\t// with cloneNode() and the DOM element is disconnected from the document. To ensure the event works, we\n\t// defer the attachment till after it's been appended to the document. TODO: remove this once Chrome fixes\n\t// this bug. The same applies to wheel events and touch events.\n\tif (\n\t\tevent_name.startsWith('pointer') ||\n\t\tevent_name.startsWith('touch') ||\n\t\tevent_name === 'wheel'\n\t) {\n\t\tqueue_micro_task(() => {\n\t\t\tdom.addEventListener(event_name, target_handler, options);\n\t\t});\n\t} else {\n\t\tdom.addEventListener(event_name, target_handler, options);\n\t}\n\n\treturn target_handler;\n}\n\n/**\n * Attaches an event handler to an element and returns a function that removes the handler. Using this\n * rather than `addEventListener` will preserve the correct order relative to handlers added declaratively\n * (with attributes like `onclick`), which use event delegation for performance reasons\n *\n * @param {EventTarget} element\n * @param {string} type\n * @param {EventListener} handler\n * @param {AddEventListenerOptions} [options]\n */\nexport function on(element, type, handler, options = {}) {\n\tvar target_handler = create_event(type, element, handler, options);\n\n\treturn () => {\n\t\telement.removeEventListener(type, target_handler, options);\n\t};\n}\n\n/**\n * @param {string} event_name\n * @param {Element} dom\n * @param {EventListener} [handler]\n * @param {boolean} [capture]\n * @param {boolean} [passive]\n * @returns {void}\n */\nexport function event(event_name, dom, handler, capture, passive) {\n\tvar options = { capture, passive };\n\tvar target_handler = create_event(event_name, dom, handler, options);\n\n\tif (\n\t\tdom === document.body ||\n\t\t// @ts-ignore\n\t\tdom === window ||\n\t\t// @ts-ignore\n\t\tdom === document ||\n\t\t// Firefox has quirky behavior, it can happen that we still get \"canplay\" events when the element is already removed\n\t\tdom instanceof HTMLMediaElement\n\t) {\n\t\tteardown(() => {\n\t\t\tdom.removeEventListener(event_name, target_handler, options);\n\t\t});\n\t}\n}\n\n/**\n * @param {string} event_name\n * @param {Element} element\n * @param {EventListener} [handler]\n * @returns {void}\n */\nexport function delegated(event_name, element, handler) {\n\t// @ts-expect-error\n\t(element[event_symbol] ??= {})[event_name] = handler;\n}\n\n/**\n * @param {Array<string>} events\n * @returns {void}\n */\nexport function delegate(events) {\n\tfor (var i = 0; i < events.length; i++) {\n\t\tall_registered_events.add(events[i]);\n\t}\n\n\tfor (var fn of root_event_handles) {\n\t\tfn(events);\n\t}\n}\n\n// used to store the reference to the currently propagated event\n// to prevent garbage collection between microtasks in Firefox\n// If the event object is GCed too early, the expando __root property\n// set on the event object is lost, causing the event delegation\n// to process the event twice\nlet last_propagated_event = null;\n\n/**\n * @this {EventTarget}\n * @param {Event} event\n * @returns {void}\n */\nexport function handle_event_propagation(event) {\n\tvar handler_element = this;\n\tvar owner_document = /** @type {Node} */ (handler_element).ownerDocument;\n\tvar event_name = event.type;\n\tvar path = event.composedPath?.() || [];\n\tvar current_target = /** @type {null | Element} */ (path[0] || event.target);\n\n\tlast_propagated_event = event;\n\n\t// composedPath contains list of nodes the event has propagated through.\n\t// We check `event_symbol` to skip all nodes below it in case this is a\n\t// parent of the `event_symbol` node, which indicates that there's nested\n\t// mounted apps. In this case we don't want to trigger events multiple times.\n\tvar path_idx = 0;\n\n\t// the `last_propagated_event === event` check is redundant, but\n\t// without it the variable will be DCE'd and things will\n\t// fail mysteriously in Firefox\n\t// @ts-expect-error is added below\n\tvar handled_at = last_propagated_event === event && event[event_symbol];\n\n\tif (handled_at) {\n\t\tvar at_idx = path.indexOf(handled_at);\n\t\tif (\n\t\t\tat_idx !== -1 &&\n\t\t\t(handler_element === document || handler_element === /** @type {any} */ (window))\n\t\t) {\n\t\t\t// This is the fallback document listener or a window listener, but the event was already handled\n\t\t\t// -> ignore, but set handle_at to document/window so that we're resetting the event\n\t\t\t// chain in case someone manually dispatches the same event object again.\n\t\t\t// @ts-expect-error\n\t\t\tevent[event_symbol] = handler_element;\n\t\t\treturn;\n\t\t}\n\n\t\t// We're deliberately not skipping if the index is higher, because\n\t\t// someone could create an event programmatically and emit it multiple times,\n\t\t// in which case we want to handle the whole propagation chain properly each time.\n\t\t// (this will only be a false negative if the event is dispatched multiple times and\n\t\t// the fallback document listener isn't reached in between, but that's super rare)\n\t\tvar handler_idx = path.indexOf(handler_element);\n\t\tif (handler_idx === -1) {\n\t\t\t// handle_idx can theoretically be -1 (happened in some JSDOM testing scenarios with an event listener on the window object)\n\t\t\t// so guard against that, too, and assume that everything was handled at this point.\n\t\t\treturn;\n\t\t}\n\n\t\tif (at_idx <= handler_idx) {\n\t\t\tpath_idx = at_idx;\n\t\t}\n\t}\n\n\tcurrent_target = /** @type {Element} */ (path[path_idx] || event.target);\n\t// there can only be one delegated event per element, and we either already handled the current target,\n\t// or this is the very first target in the chain which has a non-delegated listener, in which case it's safe\n\t// to handle a possible delegated event on it later (through the root delegation listener for example).\n\tif (current_target === handler_element) return;\n\n\t// Proxy currentTarget to correct target\n\tdefine_property(event, 'currentTarget', {\n\t\tconfigurable: true,\n\t\tget() {\n\t\t\treturn current_target || owner_document;\n\t\t}\n\t});\n\n\t// This started because of Chromium issue https://chromestatus.com/feature/5128696823545856,\n\t// where removal or moving of the DOM can cause sync `blur` events to fire, which can cause logic\n\t// to run inside the current `active_reaction`, which isn't what we want at all. However, on reflection,\n\t// it's probably best that all events handled by Svelte have this behaviour, as we don't really want\n\t// an event handler to run in the context of another reaction or effect.\n\tvar previous_reaction = active_reaction;\n\tvar previous_effect = active_effect;\n\tset_active_reaction(null);\n\tset_active_effect(null);\n\n\ttry {\n\t\t/**\n\t\t * @type {unknown}\n\t\t */\n\t\tvar throw_error;\n\t\t/**\n\t\t * @type {unknown[]}\n\t\t */\n\t\tvar other_errors = [];\n\n\t\twhile (current_target !== null) {\n\t\t\tif (current_target === handler_element) break;\n\n\t\t\ttry {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tvar delegated = current_target[event_symbol]?.[event_name];\n\n\t\t\t\tif (\n\t\t\t\t\tdelegated != null &&\n\t\t\t\t\t(!(/** @type {any} */ (current_target).disabled) ||\n\t\t\t\t\t\t// DOM could've been updated already by the time this is reached, so we check this as well\n\t\t\t\t\t\t// -> the target could not have been disabled because it emits the event in the first place\n\t\t\t\t\t\tevent.target === current_target)\n\t\t\t\t) {\n\t\t\t\t\tdelegated.call(current_target, event);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (throw_error) {\n\t\t\t\t\tother_errors.push(error);\n\t\t\t\t} else {\n\t\t\t\t\tthrow_error = error;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.cancelBubble) break;\n\n\t\t\tpath_idx++;\n\t\t\tcurrent_target = path_idx < path.length ? /** @type {Element} */ (path[path_idx]) : null;\n\t\t}\n\n\t\tif (throw_error) {\n\t\t\tfor (let error of other_errors) {\n\t\t\t\t// Throw the rest of the errors, one-by-one on a microtask\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow throw_error;\n\t\t}\n\t} finally {\n\t\t// @ts-expect-error is used above\n\t\tevent[event_symbol] = handler_element;\n\t\t// @ts-ignore remove proxy on currentTarget\n\t\tdelete event.currentTarget;\n\t\tset_active_reaction(previous_reaction);\n\t\tset_active_effect(previous_effect);\n\t}\n}\n\n/**\n * In dev, warn if an event handler is not a function, as it means the\n * user probably called the handler or forgot to add a `() =>`\n * @param {() => (event: Event, ...args: any) => void} thunk\n * @param {EventTarget} element\n * @param {[Event, ...any]} args\n * @param {any} component\n * @param {[number, number]} [loc]\n * @param {boolean} [remove_parens]\n */\nexport function apply(\n\tthunk,\n\telement,\n\targs,\n\tcomponent,\n\tloc,\n\thas_side_effects = false,\n\tremove_parens = false\n) {\n\tlet handler;\n\tlet error;\n\n\ttry {\n\t\thandler = thunk();\n\t} catch (e) {\n\t\terror = e;\n\t}\n\n\tif (typeof handler !== 'function' && (has_side_effects || handler != null || error)) {\n\t\tconst filename = component?.[FILENAME];\n\t\tconst location = loc ? ` at ${filename}:${loc[0]}:${loc[1]}` : ` in ${filename}`;\n\t\tconst phase = args[0]?.eventPhase < Event.BUBBLING_PHASE ? 'capture' : '';\n\t\tconst event_name = args[0]?.type + phase;\n\t\tconst description = `\\`${event_name}\\` handler${location}`;\n\t\tconst suggestion = remove_parens ? 'remove the trailing `()`' : 'add a leading `() =>`';\n\n\t\tw.event_handler_invalid(description, suggestion);\n\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\thandler?.apply(element, args);\n}\n","import { create_element } from './operations.js';\n\nconst policy =\n\t// We gotta write it like this because after downleveling the pure comment may end up in the wrong location\n\tglobalThis?.window?.trustedTypes &&\n\t/* @__PURE__ */ globalThis.window.trustedTypes.createPolicy('svelte-trusted-html', {\n\t\t/** @param {string} html */\n\t\tcreateHTML: (html) => {\n\t\t\treturn html;\n\t\t}\n\t});\n\n/** @param {string} html */\nexport function create_trusted_html(html) {\n\treturn /** @type {string} */ (policy?.createHTML(html) ?? html);\n}\n\n/**\n * @param {string} html\n */\nexport function create_fragment_from_html(html) {\n\tvar elem = create_element('template');\n\telem.innerHTML = create_trusted_html(html.replaceAll('<!>', '<!---->')); // XHTML compliance\n\treturn elem.content;\n}\n","/** @import { Effect, EffectNodes, TemplateNode } from '#client' */\n/** @import { TemplateStructure } from './types' */\nimport { hydrate_next, hydrate_node, hydrating, set_hydrate_node } from './hydration.js';\nimport {\n\tcreate_text,\n\tget_first_child,\n\tget_next_sibling,\n\tis_firefox,\n\tcreate_element,\n\tcreate_fragment,\n\tcreate_comment,\n\tset_attribute,\n\tmerge_text_nodes\n} from './operations.js';\nimport { create_fragment_from_html } from './reconciler.js';\nimport { active_effect } from '../runtime.js';\nimport {\n\tNAMESPACE_MATHML,\n\tNAMESPACE_SVG,\n\tTEMPLATE_FRAGMENT,\n\tTEMPLATE_USE_IMPORT_NODE,\n\tTEMPLATE_USE_MATHML,\n\tTEMPLATE_USE_SVG\n} from '../../../constants.js';\nimport {\n\tCOMMENT_NODE,\n\tDOCUMENT_FRAGMENT_NODE,\n\tIS_XHTML,\n\tREACTION_RAN,\n\tTEXT_NODE\n} from '#client/constants';\n\nconst TEMPLATE_TAG = IS_XHTML ? 'template' : 'TEMPLATE';\nconst SCRIPT_TAG = IS_XHTML ? 'script' : 'SCRIPT';\n\n/**\n * @param {TemplateNode} start\n * @param {TemplateNode | null} end\n */\nexport function assign_nodes(start, end) {\n\tvar effect = /** @type {Effect} */ (active_effect);\n\tif (effect.nodes === null) {\n\t\teffect.nodes = { start, end, a: null, t: null };\n\t}\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n * @returns {() => Node | Node[]}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_html(content, flags) {\n\tvar is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0;\n\tvar use_import_node = (flags & TEMPLATE_USE_IMPORT_NODE) !== 0;\n\n\t/** @type {Node} */\n\tvar node;\n\n\t/**\n\t * Whether or not the first item is a text/element node. If not, we need to\n\t * create an additional comment node to act as `effect.nodes.start`\n\t */\n\tvar has_start = !content.startsWith('<!>');\n\n\treturn () => {\n\t\tif (hydrating) {\n\t\t\tassign_nodes(hydrate_node, null);\n\t\t\treturn hydrate_node;\n\t\t}\n\n\t\tif (node === undefined) {\n\t\t\tnode = create_fragment_from_html(has_start ? content : '<!>' + content);\n\t\t\tif (!is_fragment) node = /** @type {TemplateNode} */ (get_first_child(node));\n\t\t}\n\n\t\tvar clone = /** @type {TemplateNode} */ (\n\t\t\tuse_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true)\n\t\t);\n\n\t\tif (is_fragment) {\n\t\t\tvar start = /** @type {TemplateNode} */ (get_first_child(clone));\n\t\t\tvar end = /** @type {TemplateNode} */ (clone.lastChild);\n\n\t\t\tassign_nodes(start, end);\n\t\t} else {\n\t\t\tassign_nodes(clone, clone);\n\t\t}\n\n\t\treturn clone;\n\t};\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n * @param {'svg' | 'math'} ns\n * @returns {() => Node | Node[]}\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction from_namespace(content, flags, ns = 'svg') {\n\t/**\n\t * Whether or not the first item is a text/element node. If not, we need to\n\t * create an additional comment node to act as `effect.nodes.start`\n\t */\n\tvar has_start = !content.startsWith('<!>');\n\n\tvar is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0;\n\tvar wrapped = `<${ns}>${has_start ? content : '<!>' + content}</${ns}>`;\n\n\t/** @type {Element | DocumentFragment} */\n\tvar node;\n\n\treturn () => {\n\t\tif (hydrating) {\n\t\t\tassign_nodes(hydrate_node, null);\n\t\t\treturn hydrate_node;\n\t\t}\n\n\t\tif (!node) {\n\t\t\tvar fragment = /** @type {DocumentFragment} */ (create_fragment_from_html(wrapped));\n\t\t\tvar root = /** @type {Element} */ (get_first_child(fragment));\n\n\t\t\tif (is_fragment) {\n\t\t\t\tnode = document.createDocumentFragment();\n\t\t\t\twhile (get_first_child(root)) {\n\t\t\t\t\tnode.appendChild(/** @type {TemplateNode} */ (get_first_child(root)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode = /** @type {Element} */ (get_first_child(root));\n\t\t\t}\n\t\t}\n\n\t\tvar clone = /** @type {TemplateNode} */ (node.cloneNode(true));\n\n\t\tif (is_fragment) {\n\t\t\tvar start = /** @type {TemplateNode} */ (get_first_child(clone));\n\t\t\tvar end = /** @type {TemplateNode} */ (clone.lastChild);\n\n\t\t\tassign_nodes(start, end);\n\t\t} else {\n\t\t\tassign_nodes(clone, clone);\n\t\t}\n\n\t\treturn clone;\n\t};\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_svg(content, flags) {\n\treturn from_namespace(content, flags, 'svg');\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_mathml(content, flags) {\n\treturn from_namespace(content, flags, 'math');\n}\n\n/**\n * @param {TemplateStructure[]} structure\n * @param {typeof NAMESPACE_SVG | typeof NAMESPACE_MATHML | undefined} [ns]\n */\nfunction fragment_from_tree(structure, ns) {\n\tvar fragment = create_fragment();\n\n\tfor (var item of structure) {\n\t\tif (typeof item === 'string') {\n\t\t\tfragment.append(create_text(item));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// if `preserveComments === true`, comments are represented as `['// <data>']`\n\t\tif (item === undefined || item[0][0] === '/') {\n\t\t\tfragment.append(create_comment(item ? item[0].slice(3) : ''));\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [name, attributes, ...children] = item;\n\n\t\tconst namespace = name === 'svg' ? NAMESPACE_SVG : name === 'math' ? NAMESPACE_MATHML : ns;\n\n\t\tvar element = create_element(name, namespace, attributes?.is);\n\n\t\tfor (var key in attributes) {\n\t\t\tset_attribute(element, key, attributes[key]);\n\t\t}\n\n\t\tif (children.length > 0) {\n\t\t\tvar target =\n\t\t\t\telement.nodeName === TEMPLATE_TAG\n\t\t\t\t\t? /** @type {HTMLTemplateElement} */ (element).content\n\t\t\t\t\t: element;\n\n\t\t\ttarget.append(\n\t\t\t\tfragment_from_tree(children, element.nodeName === 'foreignObject' ? undefined : namespace)\n\t\t\t);\n\t\t}\n\n\t\tfragment.append(element);\n\t}\n\n\treturn fragment;\n}\n\n/**\n * @param {TemplateStructure[]} structure\n * @param {number} flags\n * @returns {() => Node | Node[]}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_tree(structure, flags) {\n\tvar is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0;\n\tvar use_import_node = (flags & TEMPLATE_USE_IMPORT_NODE) !== 0;\n\n\t/** @type {Node} */\n\tvar node;\n\n\treturn () => {\n\t\tif (hydrating) {\n\t\t\tassign_nodes(hydrate_node, null);\n\t\t\treturn hydrate_node;\n\t\t}\n\n\t\tif (node === undefined) {\n\t\t\tconst ns =\n\t\t\t\t(flags & TEMPLATE_USE_SVG) !== 0\n\t\t\t\t\t? NAMESPACE_SVG\n\t\t\t\t\t: (flags & TEMPLATE_USE_MATHML) !== 0\n\t\t\t\t\t\t? NAMESPACE_MATHML\n\t\t\t\t\t\t: undefined;\n\n\t\t\tnode = fragment_from_tree(structure, ns);\n\t\t\tif (!is_fragment) node = /** @type {TemplateNode} */ (get_first_child(node));\n\t\t}\n\n\t\tvar clone = /** @type {TemplateNode} */ (\n\t\t\tuse_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true)\n\t\t);\n\n\t\tif (is_fragment) {\n\t\t\tvar start = /** @type {TemplateNode} */ (get_first_child(clone));\n\t\t\tvar end = /** @type {TemplateNode} */ (clone.lastChild);\n\n\t\t\tassign_nodes(start, end);\n\t\t} else {\n\t\t\tassign_nodes(clone, clone);\n\t\t}\n\n\t\treturn clone;\n\t};\n}\n\n/**\n * @param {() => Element | DocumentFragment} fn\n */\nexport function with_script(fn) {\n\treturn () => run_scripts(fn());\n}\n\n/**\n * Creating a document fragment from HTML that contains script tags will not execute\n * the scripts. We need to replace the script tags with new ones so that they are executed.\n * @param {Element | DocumentFragment} node\n * @returns {Node | Node[]}\n */\nfunction run_scripts(node) {\n\t// scripts were SSR'd, in which case they will run\n\tif (hydrating) return node;\n\n\tconst is_fragment = node.nodeType === DOCUMENT_FRAGMENT_NODE;\n\tconst scripts =\n\t\t/** @type {HTMLElement} */ (node).nodeName === SCRIPT_TAG\n\t\t\t? [/** @type {HTMLScriptElement} */ (node)]\n\t\t\t: node.querySelectorAll('script');\n\n\tconst effect = /** @type {Effect & { nodes: EffectNodes }} */ (active_effect);\n\n\tfor (const script of scripts) {\n\t\tconst clone = create_element('script');\n\t\tfor (var attribute of script.attributes) {\n\t\t\tclone.setAttribute(attribute.name, attribute.value);\n\t\t}\n\n\t\tclone.textContent = script.textContent;\n\n\t\t// The script has changed - if it's at the edges, the effect now points at dead nodes\n\t\tif (is_fragment ? node.firstChild === script : node === script) {\n\t\t\teffect.nodes.start = clone;\n\t\t}\n\t\tif (is_fragment ? node.lastChild === script : node === script) {\n\t\t\teffect.nodes.end = clone;\n\t\t}\n\n\t\tscript.replaceWith(clone);\n\t}\n\treturn node;\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @param {any} value\n */\nexport function text(value = '') {\n\tif (!hydrating) {\n\t\tvar t = create_text(value + '');\n\t\tassign_nodes(t, t);\n\t\treturn t;\n\t}\n\n\tvar node = hydrate_node;\n\n\tif (node.nodeType !== TEXT_NODE) {\n\t\t// if an {expression} is empty during SSR, we need to insert an empty text node\n\t\tnode.before((node = create_text()));\n\t\tset_hydrate_node(node);\n\t} else {\n\t\tmerge_text_nodes(/** @type {Text} */ (node));\n\t}\n\n\tassign_nodes(node, node);\n\treturn node;\n}\n\n/**\n * @returns {TemplateNode | DocumentFragment}\n */\nexport function comment() {\n\t// we're not delegating to `template` here for performance reasons\n\tif (hydrating) {\n\t\tassign_nodes(hydrate_node, null);\n\t\treturn hydrate_node;\n\t}\n\n\tvar frag = document.createDocumentFragment();\n\tvar start = document.createComment('');\n\tvar anchor = create_text();\n\tfrag.append(start, anchor);\n\n\tassign_nodes(start, anchor);\n\n\treturn frag;\n}\n\n/**\n * Assign the created (or in hydration mode, traversed) dom elements to the current block\n * and insert the elements into the dom (in client mode).\n * @param {Text | Comment | Element} anchor\n * @param {DocumentFragment | Element} dom\n */\nexport function append(anchor, dom) {\n\tif (hydrating) {\n\t\tvar effect = /** @type {Effect & { nodes: EffectNodes }} */ (active_effect);\n\n\t\t// When hydrating and outer component and an inner component is async, i.e. blocked on a promise,\n\t\t// then by the time the inner resolves we have already advanced to the end of the hydrated nodes\n\t\t// of the parent component. Check for defined for that reason to avoid rewinding the parent's end marker.\n\t\tif ((effect.f & REACTION_RAN) === 0 || effect.nodes.end === null) {\n\t\t\teffect.nodes.end = hydrate_node;\n\t\t}\n\n\t\thydrate_next();\n\t\treturn;\n\t}\n\n\tif (anchor === null) {\n\t\t// edge case — void `<svelte:element>` with content\n\t\treturn;\n\t}\n\n\tanchor.before(/** @type {Node} */ (dom));\n}\n\n/**\n * Create (or hydrate) an unique UID for the component instance.\n */\nexport function props_id() {\n\tif (\n\t\thydrating &&\n\t\thydrate_node &&\n\t\thydrate_node.nodeType === COMMENT_NODE &&\n\t\thydrate_node.textContent?.startsWith(`$`)\n\t) {\n\t\tconst id = hydrate_node.textContent.substring(1);\n\t\thydrate_next();\n\t\treturn id;\n\t}\n\n\t// @ts-expect-error This way we ensure the id is unique even across Svelte runtimes\n\t(window.__svelte ??= {}).uid ??= 1;\n\n\t// @ts-expect-error\n\treturn `c${window.__svelte.uid++}`;\n}\n","/** @import { ComponentContext, Effect, EffectNodes, TemplateNode } from '#client' */\n/** @import { Component, ComponentType, SvelteComponent, MountOptions } from '../../index.js' */\nimport { DEV } from 'esm-env';\nimport {\n\tclear_text_content,\n\tcreate_text,\n\tget_first_child,\n\tget_next_sibling,\n\tinit_operations\n} from './dom/operations.js';\nimport { HYDRATION_END, HYDRATION_ERROR, HYDRATION_START } from '../../constants.js';\nimport { active_effect } from './runtime.js';\nimport { push, pop, component_context } from './context.js';\nimport { component_root } from './reactivity/effects.js';\nimport { hydrate_node, hydrating, set_hydrate_node, set_hydrating } from './dom/hydration.js';\nimport { array_from } from '../shared/utils.js';\nimport {\n\tall_registered_events,\n\thandle_event_propagation,\n\troot_event_handles\n} from './dom/elements/events.js';\nimport * as w from './warnings.js';\nimport * as e from './errors.js';\nimport { assign_nodes } from './dom/template.js';\nimport { is_passive_event } from '../../utils.js';\nimport { COMMENT_NODE, STATE_SYMBOL, TEXT_CACHE } from './constants.js';\nimport { boundary } from './dom/blocks/boundary.js';\n\n/**\n * This is normally true — block effects should run their intro transitions —\n * but is false during hydration (unless `options.intro` is `true`) and\n * when creating the children of a `<svelte:element>` that just changed tag\n */\nexport let should_intro = true;\n\n/** @param {boolean} value */\nexport function set_should_intro(value) {\n\tshould_intro = value;\n}\n\n/**\n * @param {Element} text\n * @param {string} value\n * @returns {void}\n */\nexport function set_text(text, value) {\n\t// For objects, we apply string coercion (which might make things like $state array references in the template reactive) before diffing\n\tvar str = value == null ? '' : typeof value === 'object' ? `${value}` : value;\n\t// prettier-ignore\n\tif (str !== (/** @type {any} */ (text)[TEXT_CACHE] ??= text.nodeValue)) {\n\t\t/** @type {any} */ (text)[TEXT_CACHE] = str;\n\t\ttext.nodeValue = `${str}`;\n\t}\n}\n\n/**\n * Mounts a component to the given target and returns the exports and potentially the props (if compiled with `accessors: true`) of the component.\n * Transitions will play during the initial render unless the `intro` option is set to `false`.\n *\n * @template {Record<string, any>} Props\n * @template {Record<string, any>} Exports\n * @param {ComponentType<SvelteComponent<Props>> | Component<Props, Exports, any>} component\n * @param {MountOptions<Props>} options\n * @returns {Exports}\n */\nexport function mount(component, options) {\n\treturn _mount(component, options);\n}\n\n/**\n * Hydrates a component on the given target and returns the exports and potentially the props (if compiled with `accessors: true`) of the component\n *\n * @template {Record<string, any>} Props\n * @template {Record<string, any>} Exports\n * @param {ComponentType<SvelteComponent<Props>> | Component<Props, Exports, any>} component\n * @param {{} extends Props ? {\n * \t\ttarget: Document | Element | ShadowRoot;\n * \t\tprops?: Props;\n * \t\tevents?: Record<string, (e: any) => any>;\n * \tcontext?: Map<any, any>;\n * \t\tintro?: boolean;\n * \t\trecover?: boolean;\n *\t\ttransformError?: (error: unknown) => unknown;\n * \t} : {\n * \t\ttarget: Document | Element | ShadowRoot;\n * \t\tprops: Props;\n * \t\tevents?: Record<string, (e: any) => any>;\n * \tcontext?: Map<any, any>;\n * \t\tintro?: boolean;\n * \t\trecover?: boolean;\n *\t\ttransformError?: (error: unknown) => unknown;\n * \t}} options\n * @returns {Exports}\n */\nexport function hydrate(component, options) {\n\tinit_operations();\n\toptions.intro = options.intro ?? false;\n\tconst target = options.target;\n\tconst was_hydrating = hydrating;\n\tconst previous_hydrate_node = hydrate_node;\n\n\ttry {\n\t\tvar anchor = get_first_child(target);\n\n\t\twhile (\n\t\t\tanchor &&\n\t\t\t(anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ (anchor).data !== HYDRATION_START)\n\t\t) {\n\t\t\tanchor = get_next_sibling(anchor);\n\t\t}\n\n\t\tif (!anchor) {\n\t\t\tthrow HYDRATION_ERROR;\n\t\t}\n\n\t\tset_hydrating(true);\n\t\tset_hydrate_node(/** @type {Comment} */ (anchor));\n\n\t\tconst instance = _mount(component, { ...options, anchor });\n\n\t\tset_hydrating(false);\n\n\t\treturn /** @type {Exports} */ (instance);\n\t} catch (error) {\n\t\t// re-throw Svelte errors - they are certainly not related to hydration\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\terror.message.split('\\n').some((line) => line.startsWith('https://svelte.dev/e/'))\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\tif (error !== HYDRATION_ERROR) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Failed to hydrate: ', error);\n\t\t}\n\n\t\tif (options.recover === false) {\n\t\t\te.hydration_failed();\n\t\t}\n\n\t\t// If an error occurred above, the operations might not yet have been initialised.\n\t\tinit_operations();\n\t\tclear_text_content(target);\n\n\t\tset_hydrating(false);\n\t\treturn mount(component, options);\n\t} finally {\n\t\tset_hydrating(was_hydrating);\n\t\tset_hydrate_node(previous_hydrate_node);\n\t}\n}\n\n/** @type {Map<EventTarget, Map<string, number>>} */\nconst listeners = new Map();\n\n/**\n * @template {Record<string, any>} Exports\n * @param {ComponentType<SvelteComponent<any>> | Component<any>} Component\n * @param {MountOptions} options\n * @returns {Exports}\n */\nfunction _mount(\n\tComponent,\n\t{ target, anchor, props = {}, events, context, intro = true, transformError }\n) {\n\tinit_operations();\n\n\t/** @type {Exports} */\n\t// @ts-expect-error will be defined because the render effect runs synchronously\n\tvar component = undefined;\n\n\tvar unmount = component_root(() => {\n\t\tvar anchor_node = anchor ?? target.appendChild(create_text());\n\n\t\tboundary(\n\t\t\t/** @type {TemplateNode} */ (anchor_node),\n\t\t\t{\n\t\t\t\tpending: () => {}\n\t\t\t},\n\t\t\t(anchor_node) => {\n\t\t\t\tpush({});\n\t\t\t\tvar ctx = /** @type {ComponentContext} */ (component_context);\n\t\t\t\tif (context) ctx.c = context;\n\n\t\t\t\tif (events) {\n\t\t\t\t\t// We can't spread the object or else we'd lose the state proxy stuff, if it is one\n\t\t\t\t\t/** @type {any} */ (props).$$events = events;\n\t\t\t\t}\n\n\t\t\t\tif (hydrating) {\n\t\t\t\t\tassign_nodes(/** @type {TemplateNode} */ (anchor_node), null);\n\t\t\t\t}\n\n\t\t\t\tshould_intro = intro;\n\t\t\t\t// @ts-expect-error the public typings are not what the actual function looks like\n\t\t\t\tcomponent = Component(anchor_node, props) || {};\n\t\t\t\tshould_intro = true;\n\n\t\t\t\tif (hydrating) {\n\t\t\t\t\t/** @type {Effect & { nodes: EffectNodes }} */ (active_effect).nodes.end = hydrate_node;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\thydrate_node === null ||\n\t\t\t\t\t\thydrate_node.nodeType !== COMMENT_NODE ||\n\t\t\t\t\t\t/** @type {Comment} */ (hydrate_node).data !== HYDRATION_END\n\t\t\t\t\t) {\n\t\t\t\t\t\tw.hydration_mismatch();\n\t\t\t\t\t\tthrow HYDRATION_ERROR;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpop();\n\t\t\t},\n\t\t\ttransformError\n\t\t);\n\n\t\t// Setup event delegation _after_ component is mounted - if an error would happen during mount, it would otherwise not be cleaned up\n\t\t/** @type {Set<string>} */\n\t\tvar registered_events = new Set();\n\n\t\t/** @param {Array<string>} events */\n\t\tvar event_handle = (events) => {\n\t\t\tfor (var i = 0; i < events.length; i++) {\n\t\t\t\tvar event_name = events[i];\n\n\t\t\t\tif (registered_events.has(event_name)) continue;\n\t\t\t\tregistered_events.add(event_name);\n\n\t\t\t\tvar passive = is_passive_event(event_name);\n\n\t\t\t\t// Add the event listener to both the container and the document.\n\t\t\t\t// The container listener ensures we catch events from within in case\n\t\t\t\t// the outer content stops propagation of the event.\n\t\t\t\t//\n\t\t\t\t// The document listener ensures we catch events that originate from elements that were\n\t\t\t\t// manually moved outside of the container (e.g. via manual portals).\n\t\t\t\tfor (const node of [target, document]) {\n\t\t\t\t\tvar counts = listeners.get(node);\n\n\t\t\t\t\tif (counts === undefined) {\n\t\t\t\t\t\tcounts = new Map();\n\t\t\t\t\t\tlisteners.set(node, counts);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar count = counts.get(event_name);\n\n\t\t\t\t\tif (count === undefined) {\n\t\t\t\t\t\tnode.addEventListener(event_name, handle_event_propagation, { passive });\n\t\t\t\t\t\tcounts.set(event_name, 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcounts.set(event_name, count + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tevent_handle(array_from(all_registered_events));\n\t\troot_event_handles.add(event_handle);\n\n\t\treturn () => {\n\t\t\tfor (var event_name of registered_events) {\n\t\t\t\tfor (const node of [target, document]) {\n\t\t\t\t\tvar counts = /** @type {Map<string, number>} */ (listeners.get(node));\n\t\t\t\t\tvar count = /** @type {number} */ (counts.get(event_name));\n\n\t\t\t\t\tif (--count == 0) {\n\t\t\t\t\t\tnode.removeEventListener(event_name, handle_event_propagation);\n\t\t\t\t\t\tcounts.delete(event_name);\n\n\t\t\t\t\t\tif (counts.size === 0) {\n\t\t\t\t\t\t\tlisteners.delete(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcounts.set(event_name, count);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\troot_event_handles.delete(event_handle);\n\n\t\t\tif (anchor_node !== anchor) {\n\t\t\t\tanchor_node.parentNode?.removeChild(anchor_node);\n\t\t\t}\n\t\t};\n\t});\n\n\tmounted_components.set(component, unmount);\n\treturn component;\n}\n\n/**\n * References of the components that were mounted or hydrated.\n * Uses a `WeakMap` to avoid memory leaks.\n */\nlet mounted_components = new WeakMap();\n\n/**\n * Unmounts a component that was previously mounted using `mount` or `hydrate`.\n *\n * Since 5.13.0, if `options.outro` is `true`, [transitions](https://svelte.dev/docs/svelte/transition) will play before the component is removed from the DOM.\n *\n * Returns a `Promise` that resolves after transitions have completed if `options.outro` is true, or immediately otherwise (prior to 5.13.0, returns `void`).\n *\n * ```js\n * import { mount, unmount } from 'svelte';\n * import App from './App.svelte';\n *\n * const app = mount(App, { target: document.body });\n *\n * // later...\n * unmount(app, { outro: true });\n * ```\n * @param {Record<string, any>} component\n * @param {{ outro?: boolean }} [options]\n * @returns {Promise<void>}\n */\nexport function unmount(component, options) {\n\tconst fn = mounted_components.get(component);\n\n\tif (fn) {\n\t\tmounted_components.delete(component);\n\t\treturn fn(options);\n\t}\n\n\tif (DEV) {\n\t\tif (STATE_SYMBOL in component) {\n\t\t\tw.state_proxy_unmount();\n\t\t} else {\n\t\t\tw.lifecycle_double_unmount();\n\t\t}\n\t}\n\n\treturn Promise.resolve();\n}\n","/** @import { Effect, TemplateNode } from '#client' */\nimport { Batch, current_batch } from '../../reactivity/batch.js';\nimport {\n\tbranch,\n\tdestroy_effect,\n\tmove_effect,\n\tpause_effect,\n\tresume_effect\n} from '../../reactivity/effects.js';\nimport { HMR_ANCHOR } from '../../constants.js';\nimport { hydrate_node, hydrating } from '../hydration.js';\nimport { create_text, should_defer_append } from '../operations.js';\nimport { DEV } from 'esm-env';\n\n/**\n * @typedef {{ effect: Effect, fragment: DocumentFragment }} Branch\n */\n\n/**\n * @template Key\n */\nexport class BranchManager {\n\t/** @type {TemplateNode} */\n\tanchor;\n\n\t/** @type {Map<Batch, Key>} */\n\t#batches = new Map();\n\n\t/**\n\t * Map of keys to effects that are currently rendered in the DOM.\n\t * These effects are visible and actively part of the document tree.\n\t * Example:\n\t * ```\n\t * {#if condition}\n\t * \tfoo\n\t * {:else}\n\t * \tbar\n\t * {/if}\n\t * ```\n\t * Can result in the entries `true->Effect` and `false->Effect`\n\t * @type {Map<Key, Effect>}\n\t */\n\t#onscreen = new Map();\n\n\t/**\n\t * Similar to #onscreen with respect to the keys, but contains branches that are not yet\n\t * in the DOM, because their insertion is deferred.\n\t * @type {Map<Key, Branch>}\n\t */\n\t#offscreen = new Map();\n\n\t/**\n\t * Keys of effects that are currently outroing\n\t * @type {Set<Key>}\n\t */\n\t#outroing = new Set();\n\n\t/**\n\t * Whether to pause (i.e. outro) on change, or destroy immediately.\n\t * This is necessary for `<svelte:element>`\n\t */\n\t#transition = true;\n\n\t/**\n\t * @param {TemplateNode} anchor\n\t * @param {boolean} transition\n\t */\n\tconstructor(anchor, transition = true) {\n\t\tthis.anchor = anchor;\n\t\tthis.#transition = transition;\n\t}\n\n\t/**\n\t * @param {Batch} batch\n\t */\n\t#commit = (batch) => {\n\t\t// if this batch was made obsolete, bail\n\t\tif (!this.#batches.has(batch)) return;\n\n\t\tvar key = /** @type {Key} */ (this.#batches.get(batch));\n\n\t\tvar onscreen = this.#onscreen.get(key);\n\n\t\tif (onscreen) {\n\t\t\t// effect is already in the DOM — abort any current outro\n\t\t\tresume_effect(onscreen);\n\t\t\tthis.#outroing.delete(key);\n\t\t} else {\n\t\t\t// effect is currently offscreen. put it in the DOM\n\t\t\tvar offscreen = this.#offscreen.get(key);\n\n\t\t\tif (offscreen) {\n\t\t\t\t// effect could have been outro'ed before through a prior batch — resume if necessary\n\t\t\t\tresume_effect(offscreen.effect);\n\t\t\t\tthis.#onscreen.set(key, offscreen.effect);\n\t\t\t\tthis.#offscreen.delete(key);\n\n\t\t\t\tif (DEV) {\n\t\t\t\t\t// Tell hmr.js about the anchor it should use for updates,\n\t\t\t\t\t// since the initial one will be removed\n\t\t\t\t\t/** @type {any} */ (offscreen.fragment.lastChild)[HMR_ANCHOR] = this.anchor;\n\t\t\t\t}\n\n\t\t\t\t// remove the anchor...\n\t\t\t\t/** @type {TemplateNode} */ (offscreen.fragment.lastChild).remove();\n\n\t\t\t\t// ...and append the fragment\n\t\t\t\tthis.anchor.before(offscreen.fragment);\n\t\t\t\tonscreen = offscreen.effect;\n\t\t\t}\n\t\t}\n\n\t\tfor (const [b, k] of this.#batches) {\n\t\t\tthis.#batches.delete(b);\n\n\t\t\tif (b === batch) {\n\t\t\t\t// keep values for newer batches\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst offscreen = this.#offscreen.get(k);\n\n\t\t\tif (offscreen) {\n\t\t\t\t// for older batches, destroy offscreen effects\n\t\t\t\t// as they will never be committed\n\t\t\t\tdestroy_effect(offscreen.effect);\n\t\t\t\tthis.#offscreen.delete(k);\n\t\t\t}\n\t\t}\n\n\t\t// outro/destroy all onscreen effects...\n\t\tfor (const [k, effect] of this.#onscreen) {\n\t\t\t// ...except the one that was just committed\n\t\t\t// or those that are already outroing (else the transition is aborted and the effect destroyed right away)\n\t\t\tif (k === key || this.#outroing.has(k)) continue;\n\n\t\t\tconst on_destroy = () => {\n\t\t\t\tconst keys = Array.from(this.#batches.values());\n\n\t\t\t\tif (keys.includes(k)) {\n\t\t\t\t\t// keep the effect offscreen, as another batch will need it\n\t\t\t\t\tvar fragment = document.createDocumentFragment();\n\t\t\t\t\tmove_effect(effect, fragment);\n\n\t\t\t\t\tfragment.append(create_text()); // TODO can we avoid this?\n\n\t\t\t\t\tthis.#offscreen.set(k, { effect, fragment });\n\t\t\t\t} else {\n\t\t\t\t\tdestroy_effect(effect);\n\t\t\t\t}\n\n\t\t\t\tthis.#outroing.delete(k);\n\t\t\t\tthis.#onscreen.delete(k);\n\t\t\t};\n\n\t\t\tif (this.#transition || !onscreen) {\n\t\t\t\tthis.#outroing.add(k);\n\t\t\t\tpause_effect(effect, on_destroy, false);\n\t\t\t} else {\n\t\t\t\ton_destroy();\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @param {Batch} batch\n\t */\n\t#discard = (batch) => {\n\t\tthis.#batches.delete(batch);\n\n\t\tconst keys = Array.from(this.#batches.values());\n\n\t\tfor (const [k, branch] of this.#offscreen) {\n\t\t\tif (!keys.includes(k)) {\n\t\t\t\tdestroy_effect(branch.effect);\n\t\t\t\tthis.#offscreen.delete(k);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t *\n\t * @param {any} key\n\t * @param {null | ((target: TemplateNode) => void)} fn\n\t */\n\tensure(key, fn) {\n\t\tvar batch = /** @type {Batch} */ (current_batch);\n\t\tvar defer = should_defer_append();\n\n\t\tif (fn && !this.#onscreen.has(key) && !this.#offscreen.has(key)) {\n\t\t\tif (defer) {\n\t\t\t\tvar fragment = document.createDocumentFragment();\n\t\t\t\tvar target = create_text();\n\n\t\t\t\tfragment.append(target);\n\n\t\t\t\tthis.#offscreen.set(key, {\n\t\t\t\t\teffect: branch(() => fn(target)),\n\t\t\t\t\tfragment\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.#onscreen.set(\n\t\t\t\t\tkey,\n\t\t\t\t\tbranch(() => fn(this.anchor))\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.#batches.set(batch, key);\n\n\t\tif (defer) {\n\t\t\tfor (const [k, effect] of this.#onscreen) {\n\t\t\t\tif (k === key) {\n\t\t\t\t\tbatch.unskip_effect(effect);\n\t\t\t\t} else {\n\t\t\t\t\tbatch.skip_effect(effect);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [k, branch] of this.#offscreen) {\n\t\t\t\tif (k === key) {\n\t\t\t\t\tbatch.unskip_effect(branch.effect);\n\t\t\t\t} else {\n\t\t\t\t\tbatch.skip_effect(branch.effect);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbatch.oncommit(this.#commit);\n\t\t\tbatch.ondiscard(this.#discard);\n\t\t} else {\n\t\t\tif (hydrating) {\n\t\t\t\tthis.anchor = hydrate_node;\n\t\t\t}\n\n\t\t\tthis.#commit(batch);\n\t\t}\n\t}\n}\n","/** @import { TemplateNode } from '#client' */\nimport { EFFECT_TRANSPARENT } from '#client/constants';\nimport {\n\thydrate_next,\n\thydrating,\n\tread_hydration_instruction,\n\tskip_nodes,\n\tset_hydrate_node,\n\tset_hydrating,\n\thydrate_node\n} from '../hydration.js';\nimport { block } from '../../reactivity/effects.js';\nimport { BranchManager } from './branches.js';\n\n/**\n * @param {TemplateNode} node\n * @param {(branch: (fn: (anchor: Node) => void, key?: number | false) => void) => void} fn\n * @param {boolean} [elseif] True if this is an `{:else if ...}` block rather than an `{#if ...}`, as that affects which transitions are considered 'local'\n * @returns {void}\n */\nexport function if_block(node, fn, elseif = false) {\n\t/** @type {TemplateNode | undefined} */\n\tvar marker;\n\tif (hydrating) {\n\t\tmarker = hydrate_node;\n\t\thydrate_next();\n\t}\n\n\tvar branches = new BranchManager(node);\n\tvar flags = elseif ? EFFECT_TRANSPARENT : 0;\n\n\t/**\n\t * @param {number | false} key\n\t * @param {null | ((anchor: Node) => void)} fn\n\t */\n\tfunction update_branch(key, fn) {\n\t\tif (hydrating) {\n\t\t\tvar data = read_hydration_instruction(/** @type {TemplateNode} */ (marker));\n\n\t\t\t// \"[n\" = branch n, \"[-1\" = else\n\t\t\tif (key !== parseInt(data.substring(1))) {\n\t\t\t\t// Hydration mismatch: remove everything inside the anchor and start fresh.\n\t\t\t\t// This could happen with `{#if browser}...{/if}`, for example\n\t\t\t\tvar anchor = skip_nodes();\n\n\t\t\t\tset_hydrate_node(anchor);\n\t\t\t\tbranches.anchor = anchor;\n\n\t\t\t\tset_hydrating(false);\n\t\t\t\tbranches.ensure(key, fn);\n\t\t\t\tset_hydrating(true);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tbranches.ensure(key, fn);\n\t}\n\n\tblock(() => {\n\t\tvar has_branch = false;\n\n\t\tfn((fn, key = 0) => {\n\t\t\thas_branch = true;\n\t\t\tupdate_branch(key, fn);\n\t\t});\n\n\t\tif (!has_branch) {\n\t\t\tupdate_branch(-1, null);\n\t\t}\n\t}, flags);\n}\n","/** @import { TemplateNode } from '#client' */\nimport { is_runes } from '../../context.js';\nimport { block } from '../../reactivity/effects.js';\nimport { hydrate_next, hydrating } from '../hydration.js';\nimport { BranchManager } from './branches.js';\n\nconst NAN = Symbol('NaN');\n\n/**\n * @template V\n * @param {TemplateNode} node\n * @param {() => V} get_key\n * @param {(anchor: Node) => TemplateNode | void} render_fn\n * @returns {void}\n */\nexport function key(node, get_key, render_fn) {\n\tif (hydrating) {\n\t\thydrate_next();\n\t}\n\n\tvar branches = new BranchManager(node);\n\n\tvar legacy = !is_runes();\n\n\tblock(() => {\n\t\tvar key = get_key();\n\n\t\t// NaN !== NaN, hence we do this workaround to not trigger remounts unnecessarily\n\t\tif (key !== key) {\n\t\t\tkey = /** @type {any} */ (NAN);\n\t\t}\n\n\t\t// key blocks in Svelte <5 had stupid semantics\n\t\tif (legacy && key !== null && typeof key === 'object') {\n\t\t\tkey = /** @type {V} */ ({});\n\t\t}\n\n\t\tbranches.ensure(key, render_fn);\n\t});\n}\n","/** @import { EachItem, EachOutroGroup, EachState, Effect, EffectNodes, MaybeSource, Source, TemplateNode, TransitionManager, Value } from '#client' */\n/** @import { Batch } from '../../reactivity/batch.js'; */\nimport {\n\tEACH_INDEX_REACTIVE,\n\tEACH_IS_ANIMATED,\n\tEACH_IS_CONTROLLED,\n\tEACH_ITEM_IMMUTABLE,\n\tEACH_ITEM_REACTIVE,\n\tHYDRATION_END,\n\tHYDRATION_START_ELSE\n} from '../../../../constants.js';\nimport {\n\thydrate_next,\n\thydrate_node,\n\thydrating,\n\tread_hydration_instruction,\n\tskip_nodes,\n\tset_hydrate_node,\n\tset_hydrating\n} from '../hydration.js';\nimport {\n\tclear_text_content,\n\tcreate_text,\n\tget_first_child,\n\tget_next_sibling,\n\tshould_defer_append\n} from '../operations.js';\nimport {\n\tblock,\n\tbranch,\n\tdestroy_effect,\n\tmove_effect,\n\tpause_effect,\n\tresume_effect\n} from '../../reactivity/effects.js';\nimport { source, mutable_source, internal_set } from '../../reactivity/sources.js';\nimport { array_from, is_array } from '../../../shared/utils.js';\nimport { BRANCH_EFFECT, COMMENT_NODE, DESTROYED, EFFECT_OFFSCREEN, INERT } from '#client/constants';\nimport { queue_micro_task } from '../task.js';\nimport { get } from '../../runtime.js';\nimport { DEV } from 'esm-env';\nimport { derived_safe_equal } from '../../reactivity/deriveds.js';\nimport { current_batch } from '../../reactivity/batch.js';\nimport * as e from '../../errors.js';\nimport { tag } from '../../dev/tracing.js';\n\n// When making substantive changes to this file, validate them with the each block stress test:\n// https://svelte.dev/playground/1972b2cf46564476ad8c8c6405b23b7b\n// This test also exists in this repo, as `packages/svelte/tests/manual/each-stress-test`\n\n/**\n * @param {any} _\n * @param {number} i\n */\nexport function index(_, i) {\n\treturn i;\n}\n\n/**\n * Pause multiple effects simultaneously, and coordinate their\n * subsequent destruction. Used in each blocks\n * @param {EachState} state\n * @param {Effect[]} to_destroy\n * @param {null | Node} controlled_anchor\n */\nfunction pause_effects(state, to_destroy, controlled_anchor) {\n\t/** @type {TransitionManager[]} */\n\tvar transitions = [];\n\tvar length = to_destroy.length;\n\n\t/** @type {EachOutroGroup} */\n\tvar group;\n\tvar remaining = to_destroy.length;\n\n\tfor (var i = 0; i < length; i++) {\n\t\tlet effect = to_destroy[i];\n\n\t\tpause_effect(\n\t\t\teffect,\n\t\t\t() => {\n\t\t\t\tif (group) {\n\t\t\t\t\tgroup.pending.delete(effect);\n\t\t\t\t\tgroup.done.add(effect);\n\n\t\t\t\t\tif (group.pending.size === 0) {\n\t\t\t\t\t\tvar groups = /** @type {Set<EachOutroGroup>} */ (state.outrogroups);\n\n\t\t\t\t\t\tdestroy_effects(state, array_from(group.done));\n\t\t\t\t\t\tgroups.delete(group);\n\n\t\t\t\t\t\tif (groups.size === 0) {\n\t\t\t\t\t\t\tstate.outrogroups = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tremaining -= 1;\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\t}\n\n\tif (remaining === 0) {\n\t\t// If we're in a controlled each block (i.e. the block is the only child of an\n\t\t// element), and we are removing all items, _and_ there are no out transitions,\n\t\t// we can use the fast path — emptying the element and replacing the anchor\n\t\tvar fast_path = transitions.length === 0 && controlled_anchor !== null;\n\n\t\tif (fast_path) {\n\t\t\tvar anchor = /** @type {Element} */ (controlled_anchor);\n\t\t\tvar parent_node = /** @type {Element} */ (anchor.parentNode);\n\n\t\t\tclear_text_content(parent_node);\n\t\t\tparent_node.append(anchor);\n\n\t\t\tstate.items.clear();\n\t\t}\n\n\t\tdestroy_effects(state, to_destroy, !fast_path);\n\t} else {\n\t\tgroup = {\n\t\t\tpending: new Set(to_destroy),\n\t\t\tdone: new Set()\n\t\t};\n\n\t\t(state.outrogroups ??= new Set()).add(group);\n\t}\n}\n\n/**\n * @param {EachState} state\n * @param {Effect[]} to_destroy\n * @param {boolean} remove_dom\n */\nfunction destroy_effects(state, to_destroy, remove_dom = true) {\n\t/** @type {Set<Effect> | undefined} */\n\tvar preserved_effects;\n\n\t// The loop-in-a-loop isn't ideal, but we should only hit this in relatively rare cases\n\tif (state.pending.size > 0) {\n\t\tpreserved_effects = new Set();\n\n\t\tfor (const keys of state.pending.values()) {\n\t\t\tfor (const key of keys) {\n\t\t\t\tpreserved_effects.add(/** @type {EachItem} */ (state.items.get(key)).e);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (var i = 0; i < to_destroy.length; i++) {\n\t\tvar e = to_destroy[i];\n\n\t\tif (preserved_effects?.has(e)) {\n\t\t\te.f |= EFFECT_OFFSCREEN;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\t\t\tmove_effect(e, fragment);\n\t\t} else {\n\t\t\tdestroy_effect(to_destroy[i], remove_dom);\n\t\t}\n\t}\n}\n\n/** @type {TemplateNode} */\nvar offscreen_anchor;\n\n/**\n * @template V\n * @param {Element | Comment} node The next sibling node, or the parent node if this is a 'controlled' block\n * @param {number} flags\n * @param {() => V[]} get_collection\n * @param {(value: V, index: number) => any} get_key\n * @param {(anchor: Node, item: MaybeSource<V>, index: MaybeSource<number>) => void} render_fn\n * @param {null | ((anchor: Node) => void)} fallback_fn\n * @returns {void}\n */\nexport function each(node, flags, get_collection, get_key, render_fn, fallback_fn = null) {\n\tvar anchor = node;\n\n\t/** @type {Map<any, EachItem>} */\n\tvar items = new Map();\n\n\tvar is_controlled = (flags & EACH_IS_CONTROLLED) !== 0;\n\n\tif (is_controlled) {\n\t\tvar parent_node = /** @type {Element} */ (node);\n\n\t\tanchor = hydrating\n\t\t\t? set_hydrate_node(get_first_child(parent_node))\n\t\t\t: parent_node.appendChild(create_text());\n\t}\n\n\tif (hydrating) {\n\t\thydrate_next();\n\t}\n\n\t/** @type {Effect | null} */\n\tvar fallback = null;\n\n\t// TODO: ideally we could use derived for runes mode but because of the ability\n\t// to use a store which can be mutated, we can't do that here as mutating a store\n\t// will still result in the collection array being the same from the store\n\tvar each_array = derived_safe_equal(() => {\n\t\tvar collection = get_collection();\n\n\t\treturn /** @type {V[]} */ (\n\t\t\tis_array(collection) ? collection : collection == null ? [] : array_from(collection)\n\t\t);\n\t});\n\n\tif (DEV) {\n\t\ttag(each_array, '{#each ...}');\n\t}\n\n\t/** @type {V[]} */\n\tvar array;\n\n\t/** @type {Map<Batch, Set<any>>} */\n\tvar pending = new Map();\n\n\tvar first_run = true;\n\n\t/**\n\t * @param {Batch} batch\n\t */\n\tfunction commit(batch) {\n\t\tif ((state.effect.f & DESTROYED) !== 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tstate.pending.delete(batch);\n\n\t\tstate.fallback = fallback;\n\t\treconcile(state, array, anchor, flags, get_key);\n\n\t\tif (fallback !== null) {\n\t\t\tif (array.length === 0) {\n\t\t\t\tif ((fallback.f & EFFECT_OFFSCREEN) === 0) {\n\t\t\t\t\tresume_effect(fallback);\n\t\t\t\t} else {\n\t\t\t\t\tfallback.f ^= EFFECT_OFFSCREEN;\n\t\t\t\t\tmove(fallback, null, anchor);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpause_effect(fallback, () => {\n\t\t\t\t\t// TODO only null out if no pending batch needs it,\n\t\t\t\t\t// otherwise re-add `fallback.fragment` and move the\n\t\t\t\t\t// effect into it\n\t\t\t\t\tfallback = null;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {Batch} batch\n\t */\n\tfunction discard(batch) {\n\t\tstate.pending.delete(batch);\n\t}\n\n\tvar effect = block(() => {\n\t\tarray = /** @type {V[]} */ (get(each_array));\n\t\tvar length = array.length;\n\n\t\t/** `true` if there was a hydration mismatch. Needs to be a `let` or else it isn't treeshaken out */\n\t\tlet mismatch = false;\n\n\t\tif (hydrating) {\n\t\t\tvar is_else = read_hydration_instruction(anchor) === HYDRATION_START_ELSE;\n\n\t\t\tif (is_else !== (length === 0)) {\n\t\t\t\t// hydration mismatch — remove the server-rendered DOM and start over\n\t\t\t\tanchor = skip_nodes();\n\n\t\t\t\tset_hydrate_node(anchor);\n\t\t\t\tset_hydrating(false);\n\t\t\t\tmismatch = true;\n\t\t\t}\n\t\t}\n\n\t\tvar keys = new Set();\n\t\tvar batch = /** @type {Batch} */ (current_batch);\n\t\tvar defer = should_defer_append();\n\n\t\tfor (var index = 0; index < length; index += 1) {\n\t\t\tif (\n\t\t\t\thydrating &&\n\t\t\t\thydrate_node.nodeType === COMMENT_NODE &&\n\t\t\t\t/** @type {Comment} */ (hydrate_node).data === HYDRATION_END\n\t\t\t) {\n\t\t\t\t// The server rendered fewer items than expected,\n\t\t\t\t// so break out and continue appending non-hydrated items\n\t\t\t\tanchor = /** @type {Comment} */ (hydrate_node);\n\t\t\t\tmismatch = true;\n\t\t\t\tset_hydrating(false);\n\t\t\t}\n\n\t\t\tvar value = array[index];\n\t\t\tvar key = get_key(value, index);\n\n\t\t\tif (DEV) {\n\t\t\t\t// Check that the key function is idempotent (returns the same value when called twice)\n\t\t\t\tvar key_again = get_key(value, index);\n\t\t\t\tif (key !== key_again) {\n\t\t\t\t\te.each_key_volatile(String(index), String(key), String(key_again));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar item = first_run ? null : items.get(key);\n\n\t\t\tif (item) {\n\t\t\t\t// update before reconciliation, to trigger any async updates\n\t\t\t\tif (item.v) internal_set(item.v, value);\n\t\t\t\tif (item.i) internal_set(item.i, index);\n\n\t\t\t\tif (defer) {\n\t\t\t\t\tbatch.unskip_effect(item.e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titem = create_item(\n\t\t\t\t\titems,\n\t\t\t\t\tfirst_run ? anchor : (offscreen_anchor ??= create_text()),\n\t\t\t\t\tvalue,\n\t\t\t\t\tkey,\n\t\t\t\t\tindex,\n\t\t\t\t\trender_fn,\n\t\t\t\t\tflags,\n\t\t\t\t\tget_collection\n\t\t\t\t);\n\n\t\t\t\tif (!first_run) {\n\t\t\t\t\titem.e.f |= EFFECT_OFFSCREEN;\n\t\t\t\t}\n\n\t\t\t\titems.set(key, item);\n\t\t\t}\n\n\t\t\tkeys.add(key);\n\t\t}\n\n\t\tif (length === 0 && fallback_fn && !fallback) {\n\t\t\tif (first_run) {\n\t\t\t\tfallback = branch(() => fallback_fn(anchor));\n\t\t\t} else {\n\t\t\t\tfallback = branch(() => fallback_fn((offscreen_anchor ??= create_text())));\n\t\t\t\tfallback.f |= EFFECT_OFFSCREEN;\n\t\t\t}\n\t\t}\n\n\t\tif (length > keys.size) {\n\t\t\tif (DEV) {\n\t\t\t\tvalidate_each_keys(array, get_key);\n\t\t\t} else {\n\t\t\t\t// in prod, the additional information isn't printed, so don't bother computing it\n\t\t\t\te.each_key_duplicate('', '', '');\n\t\t\t}\n\t\t}\n\n\t\t// remove excess nodes\n\t\tif (hydrating && length > 0) {\n\t\t\tset_hydrate_node(skip_nodes());\n\t\t}\n\n\t\tif (!first_run) {\n\t\t\tpending.set(batch, keys);\n\n\t\t\tif (defer) {\n\t\t\t\tfor (const [key, item] of items) {\n\t\t\t\t\tif (!keys.has(key)) {\n\t\t\t\t\t\tbatch.skip_effect(item.e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbatch.oncommit(commit);\n\t\t\t\tbatch.ondiscard(discard);\n\t\t\t} else {\n\t\t\t\tcommit(batch);\n\t\t\t}\n\t\t}\n\n\t\tif (mismatch) {\n\t\t\t// continue in hydration mode\n\t\t\tset_hydrating(true);\n\t\t}\n\n\t\t// When we mount the each block for the first time, the collection won't be\n\t\t// connected to this effect as the effect hasn't finished running yet and its deps\n\t\t// won't be assigned. However, it's possible that when reconciling the each block\n\t\t// that a mutation occurred and it's made the collection MAYBE_DIRTY, so reading the\n\t\t// collection again can provide consistency to the reactive graph again as the deriveds\n\t\t// will now be `CLEAN`.\n\t\tget(each_array);\n\t});\n\n\t/** @type {EachState} */\n\tvar state = { effect, flags, items, pending, outrogroups: null, fallback };\n\n\tfirst_run = false;\n\n\tif (hydrating) {\n\t\tanchor = hydrate_node;\n\t}\n}\n\n/**\n * Skip past any non-branch effects (which could be created with `createSubscriber`, for example) to find the next branch effect\n * @param {Effect | null} effect\n * @returns {Effect | null}\n */\nfunction skip_to_branch(effect) {\n\twhile (effect !== null && (effect.f & BRANCH_EFFECT) === 0) {\n\t\teffect = effect.next;\n\t}\n\treturn effect;\n}\n\n/**\n * Add, remove, or reorder items output by an each block as its input changes\n * @template V\n * @param {EachState} state\n * @param {Array<V>} array\n * @param {Element | Comment | Text} anchor\n * @param {number} flags\n * @param {(value: V, index: number) => any} get_key\n * @returns {void}\n */\nfunction reconcile(state, array, anchor, flags, get_key) {\n\tvar is_animated = (flags & EACH_IS_ANIMATED) !== 0;\n\n\tvar length = array.length;\n\tvar items = state.items;\n\tvar current = skip_to_branch(state.effect.first);\n\n\t/** @type {undefined | Set<Effect>} */\n\tvar seen;\n\n\t/** @type {Effect | null} */\n\tvar prev = null;\n\n\t/** @type {undefined | Set<Effect>} */\n\tvar to_animate;\n\n\t/** @type {Effect[]} */\n\tvar matched = [];\n\n\t/** @type {Effect[]} */\n\tvar stashed = [];\n\n\t/** @type {V} */\n\tvar value;\n\n\t/** @type {any} */\n\tvar key;\n\n\t/** @type {Effect | undefined} */\n\tvar effect;\n\n\t/** @type {number} */\n\tvar i;\n\n\tif (is_animated) {\n\t\tfor (i = 0; i < length; i += 1) {\n\t\t\tvalue = array[i];\n\t\t\tkey = get_key(value, i);\n\t\t\teffect = /** @type {EachItem} */ (items.get(key)).e;\n\n\t\t\t// offscreen == coming in now, no animation in that case,\n\t\t\t// else this would happen https://github.com/sveltejs/svelte/issues/17181\n\t\t\tif ((effect.f & EFFECT_OFFSCREEN) === 0) {\n\t\t\t\teffect.nodes?.a?.measure();\n\t\t\t\t(to_animate ??= new Set()).add(effect);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (i = 0; i < length; i += 1) {\n\t\tvalue = array[i];\n\t\tkey = get_key(value, i);\n\n\t\teffect = /** @type {EachItem} */ (items.get(key)).e;\n\n\t\tif (state.outrogroups !== null) {\n\t\t\tfor (const group of state.outrogroups) {\n\t\t\t\tgroup.pending.delete(effect);\n\t\t\t\tgroup.done.delete(effect);\n\t\t\t}\n\t\t}\n\n\t\tif ((effect.f & INERT) !== 0) {\n\t\t\tresume_effect(effect);\n\t\t\tif (is_animated) {\n\t\t\t\teffect.nodes?.a?.unfix();\n\t\t\t\t(to_animate ??= new Set()).delete(effect);\n\t\t\t}\n\t\t}\n\n\t\tif ((effect.f & EFFECT_OFFSCREEN) !== 0) {\n\t\t\teffect.f ^= EFFECT_OFFSCREEN;\n\n\t\t\tif (effect === current) {\n\t\t\t\tmove(effect, null, anchor);\n\t\t\t} else {\n\t\t\t\tvar next = prev ? prev.next : current;\n\n\t\t\t\tif (effect === state.effect.last) {\n\t\t\t\t\tstate.effect.last = effect.prev;\n\t\t\t\t}\n\n\t\t\t\tif (effect.prev) effect.prev.next = effect.next;\n\t\t\t\tif (effect.next) effect.next.prev = effect.prev;\n\t\t\t\tlink(state, prev, effect);\n\t\t\t\tlink(state, effect, next);\n\n\t\t\t\tmove(effect, next, anchor);\n\t\t\t\tprev = effect;\n\n\t\t\t\tmatched = [];\n\t\t\t\tstashed = [];\n\n\t\t\t\tcurrent = skip_to_branch(prev.next);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (effect !== current) {\n\t\t\tif (seen !== undefined && seen.has(effect)) {\n\t\t\t\tif (matched.length < stashed.length) {\n\t\t\t\t\t// more efficient to move later items to the front\n\t\t\t\t\tvar start = stashed[0];\n\t\t\t\t\tvar j;\n\n\t\t\t\t\tprev = start.prev;\n\n\t\t\t\t\tvar a = matched[0];\n\t\t\t\t\tvar b = matched[matched.length - 1];\n\n\t\t\t\t\tfor (j = 0; j < matched.length; j += 1) {\n\t\t\t\t\t\tmove(matched[j], start, anchor);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (j = 0; j < stashed.length; j += 1) {\n\t\t\t\t\t\tseen.delete(stashed[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\tlink(state, a.prev, b.next);\n\t\t\t\t\tlink(state, prev, a);\n\t\t\t\t\tlink(state, b, start);\n\n\t\t\t\t\tcurrent = start;\n\t\t\t\t\tprev = b;\n\t\t\t\t\ti -= 1;\n\n\t\t\t\t\tmatched = [];\n\t\t\t\t\tstashed = [];\n\t\t\t\t} else {\n\t\t\t\t\t// more efficient to move earlier items to the back\n\t\t\t\t\tseen.delete(effect);\n\t\t\t\t\tmove(effect, current, anchor);\n\n\t\t\t\t\tlink(state, effect.prev, effect.next);\n\t\t\t\t\tlink(state, effect, prev === null ? state.effect.first : prev.next);\n\t\t\t\t\tlink(state, prev, effect);\n\n\t\t\t\t\tprev = effect;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmatched = [];\n\t\t\tstashed = [];\n\n\t\t\twhile (current !== null && current !== effect) {\n\t\t\t\t(seen ??= new Set()).add(current);\n\t\t\t\tstashed.push(current);\n\t\t\t\tcurrent = skip_to_branch(current.next);\n\t\t\t}\n\n\t\t\tif (current === null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif ((effect.f & EFFECT_OFFSCREEN) === 0) {\n\t\t\tmatched.push(effect);\n\t\t}\n\n\t\tprev = effect;\n\t\tcurrent = skip_to_branch(effect.next);\n\t}\n\n\tif (state.outrogroups !== null) {\n\t\tfor (const group of state.outrogroups) {\n\t\t\tif (group.pending.size === 0) {\n\t\t\t\tdestroy_effects(state, array_from(group.done));\n\t\t\t\tstate.outrogroups?.delete(group);\n\t\t\t}\n\t\t}\n\n\t\tif (state.outrogroups.size === 0) {\n\t\t\tstate.outrogroups = null;\n\t\t}\n\t}\n\n\tif (current !== null || seen !== undefined) {\n\t\t/** @type {Effect[]} */\n\t\tvar to_destroy = [];\n\n\t\tif (seen !== undefined) {\n\t\t\tfor (effect of seen) {\n\t\t\t\tif ((effect.f & INERT) === 0) {\n\t\t\t\t\tto_destroy.push(effect);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twhile (current !== null) {\n\t\t\t// If the each block isn't inert, then inert effects are currently outroing and will be removed once the transition is finished\n\t\t\tif ((current.f & INERT) === 0 && current !== state.fallback) {\n\t\t\t\tto_destroy.push(current);\n\t\t\t}\n\n\t\t\tcurrent = skip_to_branch(current.next);\n\t\t}\n\n\t\tvar destroy_length = to_destroy.length;\n\n\t\tif (destroy_length > 0) {\n\t\t\tvar controlled_anchor = (flags & EACH_IS_CONTROLLED) !== 0 && length === 0 ? anchor : null;\n\n\t\t\tif (is_animated) {\n\t\t\t\tfor (i = 0; i < destroy_length; i += 1) {\n\t\t\t\t\tto_destroy[i].nodes?.a?.measure();\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0; i < destroy_length; i += 1) {\n\t\t\t\t\tto_destroy[i].nodes?.a?.fix();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpause_effects(state, to_destroy, controlled_anchor);\n\t\t}\n\t}\n\n\tif (is_animated) {\n\t\tqueue_micro_task(() => {\n\t\t\tif (to_animate === undefined) return;\n\t\t\tfor (effect of to_animate) {\n\t\t\t\teffect.nodes?.a?.apply();\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * @template V\n * @param {Map<any, EachItem>} items\n * @param {Node} anchor\n * @param {V} value\n * @param {unknown} key\n * @param {number} index\n * @param {(anchor: Node, item: V | Source<V>, index: number | Value<number>, collection: () => V[]) => void} render_fn\n * @param {number} flags\n * @param {() => V[]} get_collection\n * @returns {EachItem}\n */\nfunction create_item(items, anchor, value, key, index, render_fn, flags, get_collection) {\n\tvar v =\n\t\t(flags & EACH_ITEM_REACTIVE) !== 0\n\t\t\t? (flags & EACH_ITEM_IMMUTABLE) === 0\n\t\t\t\t? mutable_source(value, false, false)\n\t\t\t\t: source(value)\n\t\t\t: null;\n\n\tvar i = (flags & EACH_INDEX_REACTIVE) !== 0 ? source(index) : null;\n\n\tif (DEV && v) {\n\t\t// For tracing purposes, we need to link the source signal we create with the\n\t\t// collection + index so that tracing works as intended\n\t\tv.trace = () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-expressions\n\t\t\tget_collection()[i?.v ?? index];\n\t\t};\n\t}\n\n\treturn {\n\t\tv,\n\t\ti,\n\t\te: branch(() => {\n\t\t\trender_fn(anchor, v ?? value, i ?? index, get_collection);\n\n\t\t\treturn () => {\n\t\t\t\titems.delete(key);\n\t\t\t};\n\t\t})\n\t};\n}\n\n/**\n * @param {Effect} effect\n * @param {Effect | null} next\n * @param {Text | Element | Comment} anchor\n */\nfunction move(effect, next, anchor) {\n\tif (!effect.nodes) return;\n\n\tvar node = effect.nodes.start;\n\tvar end = effect.nodes.end;\n\n\tvar dest =\n\t\tnext && (next.f & EFFECT_OFFSCREEN) === 0\n\t\t\t? /** @type {EffectNodes} */ (next.nodes).start\n\t\t\t: anchor;\n\n\twhile (node !== null) {\n\t\tvar next_node = /** @type {TemplateNode} */ (get_next_sibling(node));\n\t\tdest.before(node);\n\n\t\tif (node === end) {\n\t\t\treturn;\n\t\t}\n\n\t\tnode = next_node;\n\t}\n}\n\n/**\n * @param {EachState} state\n * @param {Effect | null} prev\n * @param {Effect | null} next\n */\nfunction link(state, prev, next) {\n\tif (prev === null) {\n\t\tstate.effect.first = next;\n\t} else {\n\t\tprev.next = next;\n\t}\n\n\tif (next === null) {\n\t\tstate.effect.last = prev;\n\t} else {\n\t\tnext.prev = prev;\n\t}\n}\n\n/**\n * @param {Array<any>} array\n * @param {(item: any, index: number) => string} key_fn\n * @returns {void}\n */\nfunction validate_each_keys(array, key_fn) {\n\tconst keys = new Map();\n\tconst length = array.length;\n\n\tfor (let i = 0; i < length; i++) {\n\t\tconst key = key_fn(array[i], i);\n\n\t\tif (keys.has(key)) {\n\t\t\tconst a = String(keys.get(key));\n\t\t\tconst b = String(i);\n\n\t\t\t/** @type {string | null} */\n\t\t\tlet k = String(key);\n\t\t\tif (k.startsWith('[object ')) k = null;\n\n\t\t\te.each_key_duplicate(a, b, k);\n\t\t}\n\n\t\tkeys.set(key, i);\n\t}\n}\n","import { hydrate_next, hydrating } from '../hydration.js';\n\n/**\n * @param {Comment} anchor\n * @param {Record<string, any>} $$props\n * @param {string} name\n * @param {Record<string, unknown>} slot_props\n * @param {null | ((anchor: Comment) => void)} fallback_fn\n */\nexport function slot(anchor, $$props, name, slot_props, fallback_fn) {\n\tif (hydrating) {\n\t\thydrate_next();\n\t}\n\n\tvar slot_fn = $$props.$$slots?.[name];\n\t// Interop: Can use snippets to fill slots\n\tvar is_interop = false;\n\tif (slot_fn === true) {\n\t\tslot_fn = $$props[name === 'default' ? 'children' : name];\n\t\tis_interop = true;\n\t}\n\n\tif (slot_fn === undefined) {\n\t\tif (fallback_fn !== null) {\n\t\t\tfallback_fn(anchor);\n\t\t}\n\t} else {\n\t\tslot_fn(anchor, is_interop ? () => slot_props : slot_props);\n\t}\n}\n\n/**\n * @param {Record<string, any>} props\n * @returns {Record<string, boolean>}\n */\nexport function sanitize_slots(props) {\n\t/** @type {Record<string, boolean>} */\n\tconst sanitized = {};\n\tif (props.children) sanitized.default = true;\n\tfor (const key in props.$$slots) {\n\t\tsanitized[key] = true;\n\t}\n\treturn sanitized;\n}\n","/** @import { Effect, EffectNodes, TemplateNode } from '#client' */\nimport { FILENAME, NAMESPACE_SVG } from '../../../../constants.js';\nimport {\n\thydrate_next,\n\thydrate_node,\n\thydrating,\n\tset_hydrate_node,\n\tset_hydrating\n} from '../hydration.js';\nimport { create_element, create_text, get_first_child } from '../operations.js';\nimport { block, teardown } from '../../reactivity/effects.js';\nimport { set_should_intro } from '../../render.js';\nimport { active_effect } from '../../runtime.js';\nimport { component_context, dev_stack } from '../../context.js';\nimport { DEV } from 'esm-env';\nimport { EFFECT_TRANSPARENT, ELEMENT_NODE } from '#client/constants';\nimport { assign_nodes } from '../template.js';\nimport { is_raw_text_element } from '../../../../utils.js';\nimport { BranchManager } from './branches.js';\nimport { set_animation_effect_override } from '../elements/transitions.js';\n\n/**\n * @param {Comment | Element} node\n * @param {() => string} get_tag\n * @param {boolean} is_svg\n * @param {undefined | ((element: Element, anchor: Node | null) => void)} render_fn,\n * @param {undefined | (() => string)} get_namespace\n * @param {undefined | [number, number]} location\n * @returns {void}\n */\nexport function element(node, get_tag, is_svg, render_fn, get_namespace, location) {\n\tlet was_hydrating = hydrating;\n\n\tif (hydrating) {\n\t\thydrate_next();\n\t}\n\n\tvar filename = DEV && location && component_context?.function[FILENAME];\n\n\t/** @type {null | Element} */\n\tvar element = null;\n\n\tif (hydrating && hydrate_node.nodeType === ELEMENT_NODE) {\n\t\telement = /** @type {Element} */ (hydrate_node);\n\t\thydrate_next();\n\t}\n\n\tvar anchor = /** @type {TemplateNode} */ (hydrating ? hydrate_node : node);\n\n\t/**\n\t * We track this so we can set it when changing the element, allowing any\n\t * `animate:` directive to bind itself to the correct block\n\t */\n\tvar parent_effect = /** @type {Effect} */ (active_effect);\n\n\tvar branches = new BranchManager(anchor, false);\n\n\tblock(() => {\n\t\tconst next_tag = get_tag() || null;\n\t\tvar ns = get_namespace\n\t\t\t? get_namespace()\n\t\t\t: is_svg || next_tag === 'svg'\n\t\t\t\t? NAMESPACE_SVG\n\t\t\t\t: undefined;\n\n\t\tif (next_tag === null) {\n\t\t\tbranches.ensure(null, null);\n\t\t\tset_should_intro(true);\n\t\t\treturn;\n\t\t}\n\n\t\tbranches.ensure(next_tag, (anchor) => {\n\t\t\tif (next_tag) {\n\t\t\t\telement = hydrating ? /** @type {Element} */ (element) : create_element(next_tag, ns);\n\n\t\t\t\tif (DEV && location) {\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\telement.__svelte_meta = {\n\t\t\t\t\t\tparent: dev_stack,\n\t\t\t\t\t\tloc: {\n\t\t\t\t\t\t\tfile: filename,\n\t\t\t\t\t\t\tline: location[0],\n\t\t\t\t\t\t\tcolumn: location[1]\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tassign_nodes(element, element);\n\n\t\t\t\tif (render_fn) {\n\t\t\t\t\tvar tmp_comment = null;\n\n\t\t\t\t\tif (hydrating && is_raw_text_element(next_tag)) {\n\t\t\t\t\t\t// prevent hydration glitches (code just below expects an anchor)\n\t\t\t\t\t\telement.append((tmp_comment = document.createComment('')));\n\t\t\t\t\t}\n\n\t\t\t\t\t// If hydrating, use the existing ssr comment as the anchor so that the\n\t\t\t\t\t// inner open and close methods can pick up the existing nodes correctly\n\t\t\t\t\tvar child_anchor = hydrating\n\t\t\t\t\t\t? get_first_child(element)\n\t\t\t\t\t\t: element.appendChild(create_text());\n\n\t\t\t\t\tif (hydrating) {\n\t\t\t\t\t\tif (child_anchor === null) {\n\t\t\t\t\t\t\tset_hydrating(false);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tset_hydrate_node(child_anchor);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tset_animation_effect_override(parent_effect);\n\n\t\t\t\t\t// `child_anchor` is undefined if this is a void element, but we still\n\t\t\t\t\t// need to call `render_fn` in order to run actions etc. If the element\n\t\t\t\t\t// contains children, it's a user error (which is warned on elsewhere)\n\t\t\t\t\t// and the DOM will be silently discarded\n\t\t\t\t\trender_fn(element, child_anchor);\n\t\t\t\t\ttmp_comment?.remove();\n\t\t\t\t\tset_animation_effect_override(null);\n\t\t\t\t}\n\n\t\t\t\t// we do this after calling `render_fn` so that child effects don't override `nodes.end`\n\t\t\t\t/** @type {Effect & { nodes: EffectNodes }} */ (active_effect).nodes.end = element;\n\n\t\t\t\tanchor.before(element);\n\t\t\t}\n\n\t\t\tif (hydrating) {\n\t\t\t\tset_hydrate_node(anchor);\n\t\t\t}\n\t\t});\n\n\t\t// revert to the default state after the effect has been created\n\t\tset_should_intro(true);\n\n\t\treturn () => {\n\t\t\tif (next_tag) {\n\t\t\t\t// if we're in this callback because we're re-running the effect,\n\t\t\t\t// disable intros (unless no element is currently displayed)\n\t\t\t\tset_should_intro(false);\n\t\t\t}\n\t\t};\n\t}, EFFECT_TRANSPARENT);\n\n\tteardown(() => {\n\t\tset_should_intro(true);\n\t});\n\n\tif (was_hydrating) {\n\t\tset_hydrating(true);\n\t\tset_hydrate_node(anchor);\n\t}\n}\n","/** @import { Effect } from '#client' */\nimport { branch, effect, destroy_effect, managed } from '../../reactivity/effects.js';\n\n// TODO in 6.0 or 7.0, when we remove legacy mode, we can simplify this by\n// getting rid of the block/branch stuff and just letting the effect rip.\n// see https://github.com/sveltejs/svelte/pull/15962\n\n/**\n * @param {Element} node\n * @param {() => (node: Element) => void} get_fn\n */\nexport function attach(node, get_fn) {\n\t/** @type {false | undefined | ((node: Element) => void)} */\n\tvar fn = undefined;\n\n\t/** @type {Effect | null} */\n\tvar e;\n\n\tmanaged(() => {\n\t\tif (fn !== (fn = get_fn())) {\n\t\t\tif (e) {\n\t\t\t\tdestroy_effect(e);\n\t\t\t\te = null;\n\t\t\t}\n\n\t\t\tif (fn) {\n\t\t\t\te = branch(() => {\n\t\t\t\t\teffect(() => /** @type {(node: Element) => void} */ (fn)(node));\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { escape_html } from '../../escaping.js';\nimport { clsx as _clsx } from 'clsx';\nimport { has_own_property } from './utils.js';\n\n/**\n * `<div translate={false}>` should be rendered as `<div translate=\"no\">` and _not_\n * `<div translate=\"false\">`, which is equivalent to `<div translate=\"yes\">`. There\n * may be other odd cases that need to be added to this list in future\n * @type {Record<string, Map<any, string>>}\n */\nconst replacements = {\n\ttranslate: new Map([\n\t\t[true, 'yes'],\n\t\t[false, 'no']\n\t])\n};\n\n/**\n * @template V\n * @param {string} name\n * @param {V} value\n * @param {boolean} [is_boolean]\n * @returns {string}\n */\nexport function attr(name, value, is_boolean = false) {\n\t// attribute hidden for values other than \"until-found\" behaves like a boolean attribute\n\tif (name === 'hidden' && value !== 'until-found') {\n\t\tis_boolean = true;\n\t}\n\tif (value == null || (!value && is_boolean)) return '';\n\tconst normalized =\n\t\t(has_own_property.call(replacements, name) && replacements[name].get(value)) || value;\n\tconst assignment = is_boolean ? `=\"\"` : `=\"${escape_html(normalized, true)}\"`;\n\treturn ` ${name}${assignment}`;\n}\n\n/**\n * Small wrapper around clsx to preserve Svelte's (weird) handling of falsy values.\n * TODO Svelte 6 revisit this, and likely turn all falsy values into the empty string (what clsx also does)\n * @param {any} value\n */\nexport function clsx(value) {\n\tif (typeof value === 'object') {\n\t\treturn _clsx(value);\n\t} else {\n\t\treturn value ?? '';\n\t}\n}\n\nconst whitespace = [...' \\t\\n\\r\\f\\u00a0\\u000b\\ufeff'];\n\n/**\n * @param {any} value\n * @param {string | null} [hash]\n * @param {Record<string, boolean>} [directives]\n * @returns {string | null}\n */\nexport function to_class(value, hash, directives) {\n\tvar classname = value == null ? '' : '' + value;\n\n\tif (hash) {\n\t\tclassname = classname ? classname + ' ' + hash : hash;\n\t}\n\n\tif (directives) {\n\t\tfor (var key of Object.keys(directives)) {\n\t\t\tif (directives[key]) {\n\t\t\t\tclassname = classname ? classname + ' ' + key : key;\n\t\t\t} else if (classname.length) {\n\t\t\t\tvar len = key.length;\n\t\t\t\tvar a = 0;\n\n\t\t\t\twhile ((a = classname.indexOf(key, a)) >= 0) {\n\t\t\t\t\tvar b = a + len;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t(a === 0 || whitespace.includes(classname[a - 1])) &&\n\t\t\t\t\t\t(b === classname.length || whitespace.includes(classname[b]))\n\t\t\t\t\t) {\n\t\t\t\t\t\tclassname = (a === 0 ? '' : classname.substring(0, a)) + classname.substring(b + 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ta = b;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn classname === '' ? null : classname;\n}\n\n/**\n *\n * @param {Record<string,any>} styles\n * @param {boolean} important\n */\nfunction append_styles(styles, important = false) {\n\tvar separator = important ? ' !important;' : ';';\n\tvar css = '';\n\n\tfor (var key of Object.keys(styles)) {\n\t\tvar value = styles[key];\n\t\tif (value != null && value !== '') {\n\t\t\tcss += ' ' + key + ': ' + value + separator;\n\t\t}\n\t}\n\n\treturn css;\n}\n\n/**\n * @param {string} name\n * @returns {string}\n */\nfunction to_css_name(name) {\n\tif (name[0] !== '-' || name[1] !== '-') {\n\t\treturn name.toLowerCase();\n\t}\n\treturn name;\n}\n\n/**\n * @param {any} value\n * @param {Record<string, any> | [Record<string, any>, Record<string, any>]} [styles]\n * @returns {string | null}\n */\nexport function to_style(value, styles) {\n\tif (styles) {\n\t\tvar new_style = '';\n\n\t\t/** @type {Record<string,any> | undefined} */\n\t\tvar normal_styles;\n\n\t\t/** @type {Record<string,any> | undefined} */\n\t\tvar important_styles;\n\n\t\tif (Array.isArray(styles)) {\n\t\t\tnormal_styles = styles[0];\n\t\t\timportant_styles = styles[1];\n\t\t} else {\n\t\t\tnormal_styles = styles;\n\t\t}\n\n\t\tif (value) {\n\t\t\tvalue = String(value)\n\t\t\t\t.replaceAll(/\\s*\\/\\*.*?\\*\\/\\s*/g, '')\n\t\t\t\t.trim();\n\n\t\t\t/** @type {boolean | '\"' | \"'\"} */\n\t\t\tvar in_str = false;\n\t\t\tvar in_apo = 0;\n\t\t\tvar in_comment = false;\n\n\t\t\tvar reserved_names = [];\n\n\t\t\tif (normal_styles) {\n\t\t\t\treserved_names.push(...Object.keys(normal_styles).map(to_css_name));\n\t\t\t}\n\t\t\tif (important_styles) {\n\t\t\t\treserved_names.push(...Object.keys(important_styles).map(to_css_name));\n\t\t\t}\n\n\t\t\tvar start_index = 0;\n\t\t\tvar name_index = -1;\n\n\t\t\tconst len = value.length;\n\t\t\tfor (var i = 0; i < len; i++) {\n\t\t\t\tvar c = value[i];\n\n\t\t\t\tif (in_comment) {\n\t\t\t\t\tif (c === '/' && value[i - 1] === '*') {\n\t\t\t\t\t\tin_comment = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (in_str) {\n\t\t\t\t\tif (in_str === c) {\n\t\t\t\t\t\tin_str = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (c === '/' && value[i + 1] === '*') {\n\t\t\t\t\tin_comment = true;\n\t\t\t\t} else if (c === '\"' || c === \"'\") {\n\t\t\t\t\tin_str = c;\n\t\t\t\t} else if (c === '(') {\n\t\t\t\t\tin_apo++;\n\t\t\t\t} else if (c === ')') {\n\t\t\t\t\tin_apo--;\n\t\t\t\t}\n\n\t\t\t\tif (!in_comment && in_str === false && in_apo === 0) {\n\t\t\t\t\tif (c === ':' && name_index === -1) {\n\t\t\t\t\t\tname_index = i;\n\t\t\t\t\t} else if (c === ';' || i === len - 1) {\n\t\t\t\t\t\tif (name_index !== -1) {\n\t\t\t\t\t\t\tvar name = to_css_name(value.substring(start_index, name_index).trim());\n\n\t\t\t\t\t\t\tif (!reserved_names.includes(name)) {\n\t\t\t\t\t\t\t\tif (c !== ';') {\n\t\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar property = value.substring(start_index, i).trim();\n\t\t\t\t\t\t\t\tnew_style += ' ' + property + ';';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart_index = i + 1;\n\t\t\t\t\t\tname_index = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (normal_styles) {\n\t\t\tnew_style += append_styles(normal_styles);\n\t\t}\n\n\t\tif (important_styles) {\n\t\t\tnew_style += append_styles(important_styles, true);\n\t\t}\n\n\t\tnew_style = new_style.trim();\n\t\treturn new_style === '' ? null : new_style;\n\t}\n\n\treturn value == null ? null : String(value);\n}\n","import { to_class } from '../../../shared/attributes.js';\nimport { CLASS_CACHE } from '../../constants.js';\nimport { hydrating } from '../hydration.js';\n\n/**\n * @param {Element} dom\n * @param {boolean | number} is_html\n * @param {string | null} value\n * @param {string} [hash]\n * @param {Record<string, any>} [prev_classes]\n * @param {Record<string, any>} [next_classes]\n * @returns {Record<string, boolean> | undefined}\n */\nexport function set_class(dom, is_html, value, hash, prev_classes, next_classes) {\n\tvar prev = /** @type {any} */ (dom)[CLASS_CACHE];\n\n\tif (\n\t\thydrating ||\n\t\tprev !== value ||\n\t\tprev === undefined // for edge case of `class={undefined}`\n\t) {\n\t\tvar next_class_name = to_class(value, hash, next_classes);\n\n\t\tif (!hydrating || next_class_name !== dom.getAttribute('class')) {\n\t\t\t// Removing the attribute when the value is only an empty string causes\n\t\t\t// performance issues vs simply making the className an empty string. So\n\t\t\t// we should only remove the class if the value is nullish\n\t\t\t// and there no hash/directives :\n\t\t\tif (next_class_name == null) {\n\t\t\t\tdom.removeAttribute('class');\n\t\t\t} else if (is_html) {\n\t\t\t\tdom.className = next_class_name;\n\t\t\t} else {\n\t\t\t\tdom.setAttribute('class', next_class_name);\n\t\t\t}\n\t\t}\n\n\t\t/** @type {any} */ (dom)[CLASS_CACHE] = value;\n\t} else if (next_classes && prev_classes !== next_classes) {\n\t\tfor (var key in next_classes) {\n\t\t\tvar is_present = !!next_classes[key];\n\n\t\t\tif (prev_classes == null || is_present !== !!prev_classes[key]) {\n\t\t\t\tdom.classList.toggle(key, is_present);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn next_classes;\n}\n","import { to_style } from '../../../shared/attributes.js';\nimport { STYLE_CACHE } from '../../constants.js';\nimport { hydrating } from '../hydration.js';\n\n/**\n * @param {Element & ElementCSSInlineStyle} dom\n * @param {Record<string, any>} prev\n * @param {Record<string, any>} next\n * @param {string} [priority]\n */\nfunction update_styles(dom, prev = {}, next, priority) {\n\tfor (var key in next) {\n\t\tvar value = next[key];\n\n\t\tif (prev[key] !== value) {\n\t\t\tif (next[key] == null) {\n\t\t\t\tdom.style.removeProperty(key);\n\t\t\t} else {\n\t\t\t\tdom.style.setProperty(key, value, priority);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} dom\n * @param {string | null} value\n * @param {Record<string, any> | [Record<string, any>, Record<string, any>]} [prev_styles]\n * @param {Record<string, any> | [Record<string, any>, Record<string, any>]} [next_styles]\n */\nexport function set_style(dom, value, prev_styles, next_styles) {\n\tvar prev = /** @type {any} */ (dom)[STYLE_CACHE];\n\n\tif (hydrating || prev !== value) {\n\t\tvar next_style_attr = to_style(value, next_styles);\n\n\t\tif (!hydrating || next_style_attr !== dom.getAttribute('style')) {\n\t\t\tif (next_style_attr == null) {\n\t\t\t\tdom.removeAttribute('style');\n\t\t\t} else {\n\t\t\t\tdom.style.cssText = next_style_attr;\n\t\t\t}\n\t\t}\n\n\t\t/** @type {any} */ (dom)[STYLE_CACHE] = value;\n\t} else if (next_styles) {\n\t\tif (Array.isArray(next_styles)) {\n\t\t\tupdate_styles(dom, prev_styles?.[0], next_styles[0]);\n\t\t\tupdate_styles(dom, prev_styles?.[1], next_styles[1], 'important');\n\t\t} else {\n\t\t\tupdate_styles(dom, prev_styles, next_styles);\n\t\t}\n\t}\n\n\treturn next_styles;\n}\n","import { effect, teardown } from '../../../reactivity/effects.js';\nimport { listen_to_event_and_reset_event } from './shared.js';\nimport { is } from '../../../proxy.js';\nimport { is_array } from '../../../../shared/utils.js';\nimport * as w from '../../../warnings.js';\nimport { Batch, current_batch, previous_batch } from '../../../reactivity/batch.js';\nimport { async_mode_flag } from '../../../../flags/index.js';\n\n/**\n * Selects the correct option(s) (depending on whether this is a multiple select)\n * @template V\n * @param {HTMLSelectElement} select\n * @param {V} value\n * @param {boolean} mounting\n */\nexport function select_option(select, value, mounting = false) {\n\tif (select.multiple) {\n\t\t// If value is null or undefined, keep the selection as is\n\t\tif (value == undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If not an array, warn and keep the selection as is\n\t\tif (!is_array(value)) {\n\t\t\treturn w.select_multiple_invalid_value();\n\t\t}\n\n\t\t// Otherwise, update the selection\n\t\tfor (var option of select.options) {\n\t\t\toption.selected = value.includes(get_option_value(option));\n\t\t}\n\n\t\treturn;\n\t}\n\n\tfor (option of select.options) {\n\t\tvar option_value = get_option_value(option);\n\t\tif (is(option_value, value)) {\n\t\t\toption.selected = true;\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (!mounting || value !== undefined) {\n\t\tselect.selectedIndex = -1; // no option should be selected\n\t}\n}\n\n/**\n * Selects the correct option(s) if `value` is given,\n * and then sets up a mutation observer to sync the\n * current selection to the dom when it changes. Such\n * changes could for example occur when options are\n * inside an `#each` block.\n * @param {HTMLSelectElement} select\n */\nexport function init_select(select) {\n\tvar observer = new MutationObserver(() => {\n\t\t// @ts-ignore\n\t\tselect_option(select, select.__value);\n\t\t// Deliberately don't update the potential binding value,\n\t\t// the model should be preserved unless explicitly changed\n\t});\n\n\tobserver.observe(select, {\n\t\t// Listen to option element changes\n\t\tchildList: true,\n\t\tsubtree: true, // because of <optgroup>\n\t\t// Listen to option element value attribute changes\n\t\t// (doesn't get notified of select value changes,\n\t\t// because that property is not reflected as an attribute)\n\t\tattributes: true,\n\t\tattributeFilter: ['value']\n\t});\n\n\tteardown(() => {\n\t\tobserver.disconnect();\n\t});\n}\n\n/**\n * @param {HTMLSelectElement} select\n * @param {() => unknown} get\n * @param {(value: unknown) => void} set\n * @returns {void}\n */\nexport function bind_select_value(select, get, set = get) {\n\tvar batches = new WeakSet();\n\tvar mounting = true;\n\n\tlisten_to_event_and_reset_event(select, 'change', (is_reset) => {\n\t\tvar query = is_reset ? '[selected]' : ':checked';\n\t\t/** @type {unknown} */\n\t\tvar value;\n\n\t\tif (select.multiple) {\n\t\t\tvalue = [].map.call(select.querySelectorAll(query), get_option_value);\n\t\t} else {\n\t\t\t/** @type {HTMLOptionElement | null} */\n\t\t\tvar selected_option =\n\t\t\t\tselect.querySelector(query) ??\n\t\t\t\t// will fall back to first non-disabled option if no option is selected\n\t\t\t\tselect.querySelector('option:not([disabled])');\n\t\t\tvalue = selected_option && get_option_value(selected_option);\n\t\t}\n\n\t\tset(value);\n\n\t\t// @ts-ignore\n\t\tselect.__value = value;\n\n\t\tif (current_batch !== null) {\n\t\t\tbatches.add(current_batch);\n\t\t}\n\t});\n\n\t// Needs to be an effect, not a render_effect, so that in case of each loops the logic runs after the each block has updated\n\teffect(() => {\n\t\tvar value = get();\n\n\t\tif (select === document.activeElement) {\n\t\t\t// In sync mode render effects are executed during tree traversal -> needs current_batch\n\t\t\t// In async mode render effects are flushed once batch resolved, at which point current_batch is null -> needs previous_batch\n\t\t\tvar batch = /** @type {Batch} */ (async_mode_flag ? previous_batch : current_batch);\n\n\t\t\t// Don't update the <select> if it is focused. We can get here if, for example,\n\t\t\t// an update is deferred because of async work depending on the select:\n\t\t\t//\n\t\t\t// <select bind:value={selected}>...</select>\n\t\t\t// <p>{await find(selected)}</p>\n\t\t\tif (batches.has(batch)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tselect_option(select, value, mounting);\n\n\t\t// Mounting and value undefined -> take selection from dom\n\t\tif (mounting && value === undefined) {\n\t\t\t/** @type {HTMLOptionElement | null} */\n\t\t\tvar selected_option = select.querySelector(':checked');\n\t\t\tif (selected_option !== null) {\n\t\t\t\tvalue = get_option_value(selected_option);\n\t\t\t\tset(value);\n\t\t\t}\n\t\t}\n\n\t\t// @ts-ignore\n\t\tselect.__value = value;\n\t\tmounting = false;\n\t});\n\n\tinit_select(select);\n}\n\n/** @param {HTMLOptionElement} option */\nfunction get_option_value(option) {\n\t// __value only exists if the <option> has a value attribute\n\tif ('__value' in option) {\n\t\treturn option.__value;\n\t} else {\n\t\treturn option.value;\n\t}\n}\n","/** @import { Blocker, Effect } from '#client' */\nimport { DEV } from 'esm-env';\nimport { hydrating, set_hydrating } from '../hydration.js';\nimport { get_descriptors, get_prototype_of } from '../../../shared/utils.js';\nimport { create_event, delegate, delegated, event, event_symbol } from './events.js';\nimport { add_form_reset_listener, autofocus } from './misc.js';\nimport * as w from '../../warnings.js';\nimport {\n\tATTRIBUTES_CACHE,\n\tFORM_RESET_HANDLER,\n\tIS_XHTML,\n\tLOADING_ATTR_SYMBOL\n} from '#client/constants';\nimport { queue_micro_task } from '../task.js';\nimport { is_capture_event, can_delegate_event, normalize_attribute } from '../../../../utils.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tget,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../runtime.js';\nimport { attach } from './attachments.js';\nimport { clsx } from '../../../shared/attributes.js';\nimport { set_class } from './class.js';\nimport { set_style } from './style.js';\nimport { ATTACHMENT_KEY, NAMESPACE_HTML, UNINITIALIZED } from '../../../../constants.js';\nimport { branch, destroy_effect, effect, managed } from '../../reactivity/effects.js';\nimport { init_select, select_option } from './bindings/select.js';\nimport { flatten } from '../../reactivity/async.js';\n\nexport const CLASS = Symbol('class');\nexport const STYLE = Symbol('style');\n\nconst IS_CUSTOM_ELEMENT = Symbol('is custom element');\nconst IS_HTML = Symbol('is html');\n\nconst LINK_TAG = IS_XHTML ? 'link' : 'LINK';\nconst INPUT_TAG = IS_XHTML ? 'input' : 'INPUT';\nconst OPTION_TAG = IS_XHTML ? 'option' : 'OPTION';\nconst SELECT_TAG = IS_XHTML ? 'select' : 'SELECT';\nconst PROGRESS_TAG = IS_XHTML ? 'progress' : 'PROGRESS';\n\n/**\n * The value/checked attribute in the template actually corresponds to the defaultValue property, so we need\n * to remove it upon hydration to avoid a bug when someone resets the form value.\n * @param {HTMLInputElement} input\n * @returns {void}\n */\nexport function remove_input_defaults(input) {\n\tif (!hydrating) return;\n\n\tvar already_removed = false;\n\n\t// We try and remove the default attributes later, rather than sync during hydration.\n\t// Doing it sync during hydration has a negative impact on performance, but deferring the\n\t// work in an idle task alleviates this greatly. If a form reset event comes in before\n\t// the idle callback, then we ensure the input defaults are cleared just before.\n\tvar remove_defaults = () => {\n\t\tif (already_removed) return;\n\t\talready_removed = true;\n\n\t\t// Remove the attributes but preserve the values\n\t\tif (input.hasAttribute('value')) {\n\t\t\tvar value = input.value;\n\t\t\tset_attribute(input, 'value', null);\n\t\t\tinput.value = value;\n\t\t}\n\n\t\tif (input.hasAttribute('checked')) {\n\t\t\tvar checked = input.checked;\n\t\t\tset_attribute(input, 'checked', null);\n\t\t\tinput.checked = checked;\n\t\t}\n\t};\n\n\t/** @type {any} */ (input)[FORM_RESET_HANDLER] = remove_defaults;\n\tqueue_micro_task(remove_defaults);\n\tadd_form_reset_listener();\n}\n\n/**\n * @param {Element} element\n * @param {any} value\n */\nexport function set_value(element, value) {\n\tvar attributes = get_attributes(element);\n\n\tif (\n\t\tattributes.value ===\n\t\t\t(attributes.value =\n\t\t\t\t// treat null and undefined the same for the initial value\n\t\t\t\tvalue ?? undefined) ||\n\t\t// @ts-expect-error\n\t\t// `progress` elements always need their value set when it's `0`\n\t\t(element.value === value && (value !== 0 || element.nodeName !== PROGRESS_TAG))\n\t) {\n\t\treturn;\n\t}\n\n\t// @ts-expect-error\n\telement.value = value ?? '';\n}\n\n/**\n * @param {Element} element\n * @param {boolean} checked\n */\nexport function set_checked(element, checked) {\n\tvar attributes = get_attributes(element);\n\n\tif (\n\t\tattributes.checked ===\n\t\t(attributes.checked =\n\t\t\t// treat null and undefined the same for the initial value\n\t\t\tchecked ?? undefined)\n\t) {\n\t\treturn;\n\t}\n\n\t// @ts-expect-error\n\telement.checked = checked;\n}\n\n/**\n * Sets the `selected` attribute on an `option` element.\n * Not set through the property because that doesn't reflect to the DOM,\n * which means it wouldn't be taken into account when a form is reset.\n * @param {HTMLOptionElement} element\n * @param {boolean} selected\n */\nexport function set_selected(element, selected) {\n\tif (selected) {\n\t\t// The selected option could've changed via user selection, and\n\t\t// setting the value without this check would set it back.\n\t\tif (!element.hasAttribute('selected')) {\n\t\t\telement.setAttribute('selected', '');\n\t\t}\n\t} else {\n\t\telement.removeAttribute('selected');\n\t}\n}\n\n/**\n * Applies the default checked property without influencing the current checked property.\n * @param {HTMLInputElement} element\n * @param {boolean} checked\n */\nexport function set_default_checked(element, checked) {\n\tconst existing_value = element.checked;\n\telement.defaultChecked = checked;\n\telement.checked = existing_value;\n}\n\n/**\n * Applies the default value property without influencing the current value property.\n * @param {HTMLInputElement | HTMLTextAreaElement} element\n * @param {string} value\n */\nexport function set_default_value(element, value) {\n\tconst existing_value = element.value;\n\telement.defaultValue = value;\n\telement.value = existing_value;\n}\n\n/**\n * @param {Element} element\n * @param {string} attribute\n * @param {string | null} value\n * @param {boolean} [skip_warning]\n */\nexport function set_attribute(element, attribute, value, skip_warning) {\n\tvar attributes = get_attributes(element);\n\n\tif (hydrating) {\n\t\tattributes[attribute] = element.getAttribute(attribute);\n\n\t\tif (\n\t\t\tattribute === 'src' ||\n\t\t\tattribute === 'srcset' ||\n\t\t\t(attribute === 'href' && element.nodeName === LINK_TAG)\n\t\t) {\n\t\t\tif (!skip_warning) {\n\t\t\t\tcheck_src_in_dev_hydration(element, attribute, value ?? '');\n\t\t\t}\n\n\t\t\t// If we reset these attributes, they would result in another network request, which we want to avoid.\n\t\t\t// We assume they are the same between client and server as checking if they are equal is expensive\n\t\t\t// (we can't just compare the strings as they can be different between client and server but result in the\n\t\t\t// same url, so we would need to create hidden anchor elements to compare them)\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (attributes[attribute] === (attributes[attribute] = value)) return;\n\n\tif (attribute === 'loading') {\n\t\t// @ts-expect-error\n\t\telement[LOADING_ATTR_SYMBOL] = value;\n\t}\n\n\tif (value == null) {\n\t\telement.removeAttribute(attribute);\n\t} else if (typeof value !== 'string' && get_setters(element).includes(attribute)) {\n\t\t// @ts-ignore\n\t\telement[attribute] = value;\n\t} else {\n\t\telement.setAttribute(attribute, value);\n\t}\n}\n\n/**\n * @param {Element} dom\n * @param {string} attribute\n * @param {string} value\n */\nexport function set_xlink_attribute(dom, attribute, value) {\n\tdom.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\n\n/**\n * @param {HTMLElement} node\n * @param {string} prop\n * @param {any} value\n */\nexport function set_custom_element_data(node, prop, value) {\n\t// We need to ensure that setting custom element props, which can\n\t// invoke lifecycle methods on other custom elements, does not also\n\t// associate those lifecycle methods with the current active reaction\n\t// or effect\n\tvar previous_reaction = active_reaction;\n\tvar previous_effect = active_effect;\n\n\t// If we're hydrating but the custom element is from Svelte, and it already scaffolded,\n\t// then it might run block logic in hydration mode, which we have to prevent.\n\tlet was_hydrating = hydrating;\n\tif (hydrating) {\n\t\tset_hydrating(false);\n\t}\n\n\tset_active_reaction(null);\n\tset_active_effect(null);\n\n\ttry {\n\t\tif (\n\t\t\t// `style` should use `set_attribute` rather than the setter\n\t\t\tprop !== 'style' &&\n\t\t\t// Don't compute setters for custom elements while they aren't registered yet,\n\t\t\t// because during their upgrade/instantiation they might add more setters.\n\t\t\t// Instead, fall back to a simple \"an object, then set as property\" heuristic.\n\t\t\t(setters_cache.has(node.getAttribute('is') || node.nodeName) ||\n\t\t\t// customElements may not be available in browser extension contexts\n\t\t\t!customElements ||\n\t\t\tcustomElements.get(node.getAttribute('is') || node.nodeName.toLowerCase())\n\t\t\t\t? get_setters(node).includes(prop)\n\t\t\t\t: value && typeof value === 'object')\n\t\t) {\n\t\t\t// @ts-expect-error\n\t\t\tnode[prop] = value;\n\t\t} else {\n\t\t\t// We did getters etc checks already, stringify before passing to set_attribute\n\t\t\t// to ensure it doesn't invoke the same logic again, and potentially populating\n\t\t\t// the setters cache too early.\n\t\t\tset_attribute(node, prop, value == null ? value : String(value));\n\t\t}\n\t} finally {\n\t\tset_active_reaction(previous_reaction);\n\t\tset_active_effect(previous_effect);\n\t\tif (was_hydrating) {\n\t\t\tset_hydrating(true);\n\t\t}\n\t}\n}\n\n/**\n * Spreads attributes onto a DOM element, taking into account the currently set attributes\n * @param {Element & ElementCSSInlineStyle} element\n * @param {Record<string | symbol, any> | undefined} prev\n * @param {Record<string | symbol, any>} next New attributes - this function mutates this object\n * @param {string} [css_hash]\n * @param {boolean} [should_remove_defaults]\n * @param {boolean} [skip_warning]\n * @returns {Record<string, any>}\n */\nfunction set_attributes(\n\telement,\n\tprev,\n\tnext,\n\tcss_hash,\n\tshould_remove_defaults = false,\n\tskip_warning = false\n) {\n\tif (hydrating && should_remove_defaults && element.nodeName === INPUT_TAG) {\n\t\tvar input = /** @type {HTMLInputElement} */ (element);\n\t\tvar attribute = input.type === 'checkbox' ? 'defaultChecked' : 'defaultValue';\n\n\t\tif (!(attribute in next)) {\n\t\t\tremove_input_defaults(input);\n\t\t}\n\t}\n\n\tvar attributes = get_attributes(element);\n\n\tvar is_custom_element = attributes[IS_CUSTOM_ELEMENT];\n\tvar preserve_attribute_case = !attributes[IS_HTML];\n\n\t// If we're hydrating but the custom element is from Svelte, and it already scaffolded,\n\t// then it might run block logic in hydration mode, which we have to prevent.\n\tlet is_hydrating_custom_element = hydrating && is_custom_element;\n\tif (is_hydrating_custom_element) {\n\t\tset_hydrating(false);\n\t}\n\n\tvar current = prev || {};\n\tvar is_option_element = element.nodeName === OPTION_TAG;\n\n\tfor (var key in prev) {\n\t\tif (!(key in next)) {\n\t\t\tnext[key] = null;\n\t\t}\n\t}\n\n\tif (next.class) {\n\t\tnext.class = clsx(next.class);\n\t} else if (css_hash || next[CLASS]) {\n\t\tnext.class = null; /* force call to set_class() */\n\t}\n\n\tif (next[STYLE]) {\n\t\tnext.style ??= null; /* force call to set_style() */\n\t}\n\n\tvar setters = get_setters(element);\n\n\tif (element.nodeName === INPUT_TAG && 'type' in next && ('value' in next || '__value' in next)) {\n\t\tvar type = next.type;\n\n\t\tif (type !== current.type || (type === undefined && element.hasAttribute('type'))) {\n\t\t\tcurrent.type = type;\n\t\t\tset_attribute(element, 'type', type, skip_warning);\n\t\t}\n\t}\n\n\t// since key is captured we use const\n\tfor (const key in next) {\n\t\t// let instead of var because referenced in a closure\n\t\tlet value = next[key];\n\n\t\t// Up here because we want to do this for the initial value, too, even if it's undefined,\n\t\t// and this wouldn't be reached in case of undefined because of the equality check below\n\t\tif (is_option_element && key === 'value' && value == null) {\n\t\t\t// The <option> element is a special case because removing the value attribute means\n\t\t\t// the value is set to the text content of the option element, and setting the value\n\t\t\t// to null or undefined means the value is set to the string \"null\" or \"undefined\".\n\t\t\t// To align with how we handle this case in non-spread-scenarios, this logic is needed.\n\t\t\t// There's a super-edge-case bug here that is left in in favor of smaller code size:\n\t\t\t// Because of the \"set missing props to null\" logic above, we can't differentiate\n\t\t\t// between a missing value and an explicitly set value of null or undefined. That means\n\t\t\t// that once set, the value attribute of an <option> element can't be removed. This is\n\t\t\t// a very rare edge case, and removing the attribute altogether isn't possible either\n\t\t\t// for the <option value={undefined}> case, so we're not losing any functionality here.\n\t\t\t// @ts-ignore\n\t\t\telement.value = element.__value = '';\n\t\t\tcurrent[key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === 'class') {\n\t\t\tvar is_html = element.namespaceURI === 'http://www.w3.org/1999/xhtml';\n\t\t\tset_class(element, is_html, value, css_hash, prev?.[CLASS], next[CLASS]);\n\t\t\tcurrent[key] = value;\n\t\t\tcurrent[CLASS] = next[CLASS];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === 'style') {\n\t\t\tset_style(element, value, prev?.[STYLE], next[STYLE]);\n\t\t\tcurrent[key] = value;\n\t\t\tcurrent[STYLE] = next[STYLE];\n\t\t\tcontinue;\n\t\t}\n\n\t\tvar prev_value = current[key];\n\n\t\t// Skip if value is unchanged, unless it's `undefined` and the element still has the attribute\n\t\tif (value === prev_value && !(value === undefined && element.hasAttribute(key))) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent[key] = value;\n\n\t\tvar prefix = key[0] + key[1]; // this is faster than key.slice(0, 2)\n\t\tif (prefix === '$$') continue;\n\n\t\tif (prefix === 'on') {\n\t\t\t/** @type {{ capture?: true }} */\n\t\t\tconst opts = {};\n\t\t\tconst event_handle_key = '$$' + key;\n\t\t\tlet event_name = key.slice(2);\n\t\t\tvar is_delegated = can_delegate_event(event_name);\n\n\t\t\tif (is_capture_event(event_name)) {\n\t\t\t\tevent_name = event_name.slice(0, -7);\n\t\t\t\topts.capture = true;\n\t\t\t}\n\n\t\t\tif (!is_delegated && prev_value) {\n\t\t\t\t// Listening to same event but different handler -> our handle function below takes care of this\n\t\t\t\t// If we were to remove and add listeners in this case, it could happen that the event is \"swallowed\"\n\t\t\t\t// (the browser seems to not know yet that a new one exists now) and doesn't reach the handler\n\t\t\t\t// https://github.com/sveltejs/svelte/issues/11903\n\t\t\t\tif (value != null) continue;\n\n\t\t\t\telement.removeEventListener(event_name, current[event_handle_key], opts);\n\t\t\t\tcurrent[event_handle_key] = null;\n\t\t\t}\n\n\t\t\tif (is_delegated) {\n\t\t\t\tdelegated(event_name, element, value);\n\t\t\t\tdelegate([event_name]);\n\t\t\t} else if (value != null) {\n\t\t\t\t/**\n\t\t\t\t * @this {any}\n\t\t\t\t * @param {Event} evt\n\t\t\t\t */\n\t\t\t\tfunction handle(evt) {\n\t\t\t\t\tcurrent[key].call(this, evt);\n\t\t\t\t}\n\n\t\t\t\tcurrent[event_handle_key] = create_event(event_name, element, handle, opts);\n\t\t\t}\n\t\t} else if (key === 'style') {\n\t\t\t// avoid using the setter\n\t\t\tset_attribute(element, key, value);\n\t\t} else if (key === 'autofocus') {\n\t\t\tautofocus(/** @type {HTMLElement} */ (element), Boolean(value));\n\t\t} else if (!is_custom_element && (key === '__value' || (key === 'value' && value != null))) {\n\t\t\t// @ts-ignore We're not running this for custom elements because __value is actually\n\t\t\t// how Lit stores the current value on the element, and messing with that would break things.\n\t\t\telement.value = element.__value = value;\n\t\t} else if (key === 'selected' && is_option_element) {\n\t\t\tset_selected(/** @type {HTMLOptionElement} */ (element), value);\n\t\t} else {\n\t\t\tvar name = key;\n\t\t\tif (!preserve_attribute_case) {\n\t\t\t\tname = normalize_attribute(name);\n\t\t\t}\n\n\t\t\tvar is_default = name === 'defaultValue' || name === 'defaultChecked';\n\n\t\t\tif (value == null && !is_custom_element && !is_default) {\n\t\t\t\tattributes[key] = null;\n\n\t\t\t\tif (name === 'value' || name === 'checked') {\n\t\t\t\t\t// removing value/checked also removes defaultValue/defaultChecked — preserve\n\t\t\t\t\tlet input = /** @type {HTMLInputElement} */ (element);\n\t\t\t\t\tconst use_default = prev === undefined;\n\t\t\t\t\tif (name === 'value') {\n\t\t\t\t\t\tlet previous = input.defaultValue;\n\t\t\t\t\t\tinput.removeAttribute(name);\n\t\t\t\t\t\tinput.defaultValue = previous;\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tinput.value = input.__value = use_default ? previous : null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet previous = input.defaultChecked;\n\t\t\t\t\t\tinput.removeAttribute(name);\n\t\t\t\t\t\tinput.defaultChecked = previous;\n\t\t\t\t\t\tinput.checked = use_default ? previous : false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\telement.removeAttribute(key);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tis_default ||\n\t\t\t\t(setters.includes(name) && (is_custom_element || typeof value !== 'string'))\n\t\t\t) {\n\t\t\t\t// @ts-ignore\n\t\t\t\telement[name] = value;\n\t\t\t\t// remove it from attributes's cache\n\t\t\t\tif (name in attributes) attributes[name] = UNINITIALIZED;\n\t\t\t} else if (typeof value !== 'function') {\n\t\t\t\tset_attribute(element, name, value, skip_warning);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (is_hydrating_custom_element) {\n\t\tset_hydrating(true);\n\t}\n\n\treturn current;\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} element\n * @param {(...expressions: any) => Record<string | symbol, any>} fn\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {Blocker[]} blockers\n * @param {string} [css_hash]\n * @param {boolean} [should_remove_defaults]\n * @param {boolean} [skip_warning]\n */\nexport function attribute_effect(\n\telement,\n\tfn,\n\tsync = [],\n\tasync = [],\n\tblockers = [],\n\tcss_hash,\n\tshould_remove_defaults = false,\n\tskip_warning = false\n) {\n\tflatten(blockers, sync, async, (values) => {\n\t\t/** @type {Record<string | symbol, any> | undefined} */\n\t\tvar prev = undefined;\n\n\t\t/** @type {Record<symbol, Effect>} */\n\t\tvar effects = {};\n\n\t\tvar is_select = element.nodeName === SELECT_TAG;\n\t\tvar inited = false;\n\n\t\tmanaged(() => {\n\t\t\tvar next = fn(...values.map(get));\n\t\t\t/** @type {Record<string | symbol, any>} */\n\t\t\tvar current = set_attributes(\n\t\t\t\telement,\n\t\t\t\tprev,\n\t\t\t\tnext,\n\t\t\t\tcss_hash,\n\t\t\t\tshould_remove_defaults,\n\t\t\t\tskip_warning\n\t\t\t);\n\n\t\t\tif (inited && is_select && 'value' in next) {\n\t\t\t\tselect_option(/** @type {HTMLSelectElement} */ (element), next.value);\n\t\t\t}\n\n\t\t\tfor (let symbol of Object.getOwnPropertySymbols(effects)) {\n\t\t\t\tif (!next[symbol]) destroy_effect(effects[symbol]);\n\t\t\t}\n\n\t\t\tfor (let symbol of Object.getOwnPropertySymbols(next)) {\n\t\t\t\tvar n = next[symbol];\n\n\t\t\t\tif (symbol.description === ATTACHMENT_KEY && (!prev || n !== prev[symbol])) {\n\t\t\t\t\tif (effects[symbol]) destroy_effect(effects[symbol]);\n\t\t\t\t\teffects[symbol] = branch(() => attach(element, () => n));\n\t\t\t\t}\n\n\t\t\t\tcurrent[symbol] = n;\n\t\t\t}\n\n\t\t\tprev = current;\n\t\t});\n\n\t\tif (is_select) {\n\t\t\tvar select = /** @type {HTMLSelectElement} */ (element);\n\n\t\t\teffect(() => {\n\t\t\t\tselect_option(select, /** @type {Record<string | symbol, any>} */ (prev).value, true);\n\t\t\t\tinit_select(select);\n\t\t\t});\n\t\t}\n\n\t\tinited = true;\n\t});\n}\n\n/**\n *\n * @param {Element} element\n */\nfunction get_attributes(element) {\n\treturn /** @type {Record<string | symbol, unknown>} **/ (\n\t\t/** @type {any} */ (element)[ATTRIBUTES_CACHE] ??= {\n\t\t\t[IS_CUSTOM_ELEMENT]: element.nodeName.includes('-'),\n\t\t\t[IS_HTML]: element.namespaceURI === NAMESPACE_HTML\n\t\t}\n\t);\n}\n\n/** @type {Map<string, string[]>} */\nvar setters_cache = new Map();\n\n/** @param {Element} element */\nfunction get_setters(element) {\n\tvar cache_key = element.getAttribute('is') || element.nodeName;\n\tvar setters = setters_cache.get(cache_key);\n\tif (setters) return setters;\n\tsetters_cache.set(cache_key, (setters = []));\n\n\tvar descriptors;\n\tvar proto = element; // In the case of custom elements there might be setters on the instance\n\tvar element_proto = Element.prototype;\n\n\t// Stop at Element, from there on there's only unnecessary (and dangerous, like innerHTML) setters we're not interested in\n\t// Do not use constructor.name here as that's unreliable in some browser environments\n\twhile (element_proto !== proto) {\n\t\tdescriptors = get_descriptors(proto);\n\n\t\tfor (var key in descriptors) {\n\t\t\tif (\n\t\t\t\tdescriptors[key].set &&\n\t\t\t\t// better safe than sorry, we don't want spread attributes to mess with HTML content\n\t\t\t\tkey !== 'innerHTML' &&\n\t\t\t\tkey !== 'textContent' &&\n\t\t\t\tkey !== 'innerText'\n\t\t\t) {\n\t\t\t\tsetters.push(key);\n\t\t\t}\n\t\t}\n\n\t\tproto = get_prototype_of(proto);\n\t}\n\n\treturn setters;\n}\n\n/**\n * @param {any} element\n * @param {string} attribute\n * @param {string} value\n */\nfunction check_src_in_dev_hydration(element, attribute, value) {\n\tif (!DEV) return;\n\tif (attribute === 'srcset' && srcset_url_equal(element, value)) return;\n\tif (src_url_equal(element.getAttribute(attribute) ?? '', value)) return;\n\n\tw.hydration_attribute_changed(\n\t\tattribute,\n\t\telement.outerHTML.replace(element.innerHTML, element.innerHTML && '...'),\n\t\tString(value)\n\t);\n}\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nfunction src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\treturn new URL(element_src, document.baseURI).href === new URL(url, document.baseURI).href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element\n * @param {string} srcset\n * @returns {boolean}\n */\nfunction srcset_url_equal(element, srcset) {\n\tvar element_urls = split_srcset(element.srcset);\n\tvar urls = split_srcset(srcset);\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n","/** @import { Batch } from '../../../reactivity/batch.js' */\nimport { DEV } from 'esm-env';\nimport { render_effect, teardown } from '../../../reactivity/effects.js';\nimport { listen_to_event_and_reset_event } from './shared.js';\nimport * as e from '../../../errors.js';\nimport { is } from '../../../proxy.js';\nimport { queue_micro_task } from '../../task.js';\nimport { hydrating } from '../../hydration.js';\nimport { tick, untrack } from '../../../runtime.js';\nimport { current_batch, previous_batch } from '../../../reactivity/batch.js';\nimport { async_mode_flag } from '../../../../flags/index.js';\n\n/**\n * @param {HTMLInputElement} input\n * @param {() => unknown} get\n * @param {(value: unknown) => void} set\n * @returns {void}\n */\nexport function bind_value(input, get, set = get) {\n\tvar batches = new WeakSet();\n\n\tlisten_to_event_and_reset_event(input, 'input', async (is_reset) => {\n\t\tif (DEV && input.type === 'checkbox') {\n\t\t\t// TODO should this happen in prod too?\n\t\t\te.bind_invalid_checkbox_value();\n\t\t}\n\n\t\t/** @type {any} */\n\t\tvar value = is_reset ? input.defaultValue : input.value;\n\t\tvalue = is_numberlike_input(input) ? to_number(value) : value;\n\t\tset(value);\n\n\t\tif (current_batch !== null) {\n\t\t\tbatches.add(current_batch);\n\t\t}\n\n\t\t// Because `{#each ...}` blocks work by updating sources inside the flush,\n\t\t// we need to wait a tick before checking to see if we should forcibly\n\t\t// update the input and reset the selection state\n\t\tawait tick();\n\n\t\t// Respect any validation in accessors\n\t\tif (value !== (value = get())) {\n\t\t\tvar start = input.selectionStart;\n\t\t\tvar end = input.selectionEnd;\n\t\t\tvar length = input.value.length;\n\n\t\t\t// the value is coerced on assignment\n\t\t\tinput.value = value ?? '';\n\n\t\t\t// Restore selection\n\t\t\tif (end !== null) {\n\t\t\t\tvar new_length = input.value.length;\n\t\t\t\t// If cursor was at end and new input is longer, move cursor to new end\n\t\t\t\tif (start === end && end === length && new_length > length) {\n\t\t\t\t\tinput.selectionStart = new_length;\n\t\t\t\t\tinput.selectionEnd = new_length;\n\t\t\t\t} else {\n\t\t\t\t\tinput.selectionStart = start;\n\t\t\t\t\tinput.selectionEnd = Math.min(end, new_length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tif (\n\t\t// If we are hydrating and the value has since changed,\n\t\t// then use the updated value from the input instead.\n\t\t(hydrating && input.defaultValue !== input.value) ||\n\t\t// If defaultValue is set, then value == defaultValue\n\t\t// TODO Svelte 6: remove input.value check and set to empty string?\n\t\t(untrack(get) == null && input.value)\n\t) {\n\t\tset(is_numberlike_input(input) ? to_number(input.value) : input.value);\n\n\t\tif (current_batch !== null) {\n\t\t\tbatches.add(current_batch);\n\t\t}\n\t}\n\n\trender_effect(() => {\n\t\tif (DEV && input.type === 'checkbox') {\n\t\t\t// TODO should this happen in prod too?\n\t\t\te.bind_invalid_checkbox_value();\n\t\t}\n\n\t\tvar value = get();\n\n\t\tif (input === document.activeElement) {\n\t\t\t// In sync mode render effects are executed during tree traversal -> needs current_batch\n\t\t\t// In async mode render effects are flushed once batch resolved, at which point current_batch is null -> needs previous_batch\n\t\t\tvar batch = /** @type {Batch} */ (async_mode_flag ? previous_batch : current_batch);\n\n\t\t\t// Never rewrite the contents of a focused input. We can get here if, for example,\n\t\t\t// an update is deferred because of async work depending on the input:\n\t\t\t//\n\t\t\t// <input bind:value={query}>\n\t\t\t// <p>{await find(query)}</p>\n\t\t\tif (batches.has(batch)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (is_numberlike_input(input) && value === to_number(input.value)) {\n\t\t\t// handles 0 vs 00 case (see https://github.com/sveltejs/svelte/issues/9959)\n\t\t\treturn;\n\t\t}\n\n\t\tif (input.type === 'date' && !value && !input.value) {\n\t\t\t// Handles the case where a temporarily invalid date is set (while typing, for example with a leading 0 for the day)\n\t\t\t// and prevents this state from clearing the other parts of the date input (see https://github.com/sveltejs/svelte/issues/7897)\n\t\t\treturn;\n\t\t}\n\n\t\t// don't set the value of the input if it's the same to allow\n\t\t// minlength to work properly\n\t\tif (value !== input.value) {\n\t\t\t// @ts-expect-error the value is coerced on assignment\n\t\t\tinput.value = value ?? '';\n\t\t}\n\t});\n}\n\n/** @type {Set<HTMLInputElement[]>} */\nconst pending = new Set();\n\n/**\n * @param {HTMLInputElement[]} inputs\n * @param {null | [number]} group_index\n * @param {HTMLInputElement} input\n * @param {() => unknown} get\n * @param {(value: unknown) => void} set\n * @returns {void}\n */\nexport function bind_group(inputs, group_index, input, get, set = get) {\n\tvar is_checkbox = input.getAttribute('type') === 'checkbox';\n\tvar binding_group = inputs;\n\n\t// needs to be let or related code isn't treeshaken out if it's always false\n\tlet hydration_mismatch = false;\n\n\tif (group_index !== null) {\n\t\tfor (var index of group_index) {\n\t\t\t// @ts-expect-error\n\t\t\tbinding_group = binding_group[index] ??= [];\n\t\t}\n\t}\n\n\tbinding_group.push(input);\n\n\tlisten_to_event_and_reset_event(\n\t\tinput,\n\t\t'change',\n\t\t() => {\n\t\t\t// @ts-ignore\n\t\t\tvar value = input.__value;\n\n\t\t\tif (is_checkbox) {\n\t\t\t\tvalue = get_binding_group_value(binding_group, value, input.checked);\n\t\t\t}\n\n\t\t\tset(value);\n\t\t},\n\t\t// TODO better default value handling\n\t\t() => set(is_checkbox ? [] : null)\n\t);\n\n\trender_effect(() => {\n\t\tvar value = get();\n\n\t\t// If we are hydrating and the value has since changed, then use the update value\n\t\t// from the input instead.\n\t\tif (hydrating && input.defaultChecked !== input.checked) {\n\t\t\thydration_mismatch = true;\n\t\t\treturn;\n\t\t}\n\n\t\tif (is_checkbox) {\n\t\t\tvalue = value || [];\n\t\t\t// @ts-ignore\n\t\t\tinput.checked = value.includes(input.__value);\n\t\t} else {\n\t\t\t// @ts-ignore\n\t\t\tinput.checked = is(input.__value, value);\n\t\t}\n\t});\n\n\tteardown(() => {\n\t\tvar index = binding_group.indexOf(input);\n\n\t\tif (index !== -1) {\n\t\t\tbinding_group.splice(index, 1);\n\t\t}\n\t});\n\n\tif (!pending.has(binding_group)) {\n\t\tpending.add(binding_group);\n\n\t\tqueue_micro_task(() => {\n\t\t\t// necessary to maintain binding group order in all insertion scenarios\n\t\t\tbinding_group.sort((a, b) => (a.compareDocumentPosition(b) === 4 ? -1 : 1));\n\t\t\tpending.delete(binding_group);\n\t\t});\n\t}\n\n\tqueue_micro_task(() => {\n\t\tif (hydration_mismatch) {\n\t\t\tvar value;\n\n\t\t\tif (is_checkbox) {\n\t\t\t\tvalue = get_binding_group_value(binding_group, value, input.checked);\n\t\t\t} else {\n\t\t\t\tvar hydration_input = binding_group.find((input) => input.checked);\n\t\t\t\t// @ts-ignore\n\t\t\t\tvalue = hydration_input?.__value;\n\t\t\t}\n\n\t\t\tset(value);\n\t\t}\n\t});\n}\n\n/**\n * @param {HTMLInputElement} input\n * @param {() => unknown} get\n * @param {(value: unknown) => void} set\n * @returns {void}\n */\nexport function bind_checked(input, get, set = get) {\n\tlisten_to_event_and_reset_event(input, 'change', (is_reset) => {\n\t\tvar value = is_reset ? input.defaultChecked : input.checked;\n\t\tset(value);\n\t});\n\n\tif (\n\t\t// If we are hydrating and the value has since changed,\n\t\t// then use the update value from the input instead.\n\t\t(hydrating && input.defaultChecked !== input.checked) ||\n\t\t// If defaultChecked is set, then checked == defaultChecked\n\t\tuntrack(get) == null\n\t) {\n\t\tset(input.checked);\n\t}\n\n\trender_effect(() => {\n\t\tvar value = get();\n\t\tinput.checked = Boolean(value);\n\t});\n}\n\n/**\n * @template V\n * @param {Array<HTMLInputElement>} group\n * @param {V} __value\n * @param {boolean} checked\n * @returns {V[]}\n */\nfunction get_binding_group_value(group, __value, checked) {\n\t/** @type {Set<V>} */\n\tvar value = new Set();\n\n\tfor (var i = 0; i < group.length; i += 1) {\n\t\tif (group[i].checked) {\n\t\t\t// @ts-ignore\n\t\t\tvalue.add(group[i].__value);\n\t\t}\n\t}\n\n\tif (!checked) {\n\t\tvalue.delete(__value);\n\t}\n\n\treturn Array.from(value);\n}\n\n/**\n * @param {HTMLInputElement} input\n */\nfunction is_numberlike_input(input) {\n\tvar type = input.type;\n\treturn type === 'number' || type === 'range';\n}\n\n/**\n * @param {string} value\n */\nfunction to_number(value) {\n\treturn value === '' ? null : +value;\n}\n\n/**\n * @param {HTMLInputElement} input\n * @param {() => FileList | null} get\n * @param {(value: FileList | null) => void} set\n */\nexport function bind_files(input, get, set = get) {\n\tlisten_to_event_and_reset_event(input, 'change', () => {\n\t\tset(input.files);\n\t});\n\n\tif (\n\t\t// If we are hydrating and the value has since changed,\n\t\t// then use the updated value from the input instead.\n\t\thydrating &&\n\t\tinput.files\n\t) {\n\t\tset(input.files);\n\t}\n\n\trender_effect(() => {\n\t\tinput.files = get();\n\t});\n}\n","import { teardown } from '../../../reactivity/effects.js';\nimport { get_descriptor } from '../../../../shared/utils.js';\n\n/**\n * Makes an `export`ed (non-prop) variable available on the `$$props` object\n * so that consumers can do `bind:x` on the component.\n * @template V\n * @param {Record<string, unknown>} props\n * @param {string} prop\n * @param {V} value\n * @returns {void}\n */\nexport function bind_prop(props, prop, value) {\n\tvar desc = get_descriptor(props, prop);\n\n\tif (desc && desc.set) {\n\t\tprops[prop] = value;\n\t\tteardown(() => {\n\t\t\tprops[prop] = null;\n\t\t});\n\t}\n}\n","/** @import { ComponentContext, Effect } from '#client' */\nimport { DESTROYING, STATE_SYMBOL } from '#client/constants';\nimport { component_context } from '../../../context.js';\nimport { effect, render_effect } from '../../../reactivity/effects.js';\nimport { active_effect, untrack } from '../../../runtime.js';\n\n/**\n * @param {any} bound_value\n * @param {Element} element_or_component\n * @returns {boolean}\n */\nfunction is_bound_this(bound_value, element_or_component) {\n\treturn (\n\t\tbound_value === element_or_component || bound_value?.[STATE_SYMBOL] === element_or_component\n\t);\n}\n\n/**\n * @param {any} element_or_component\n * @param {(value: unknown, ...parts: unknown[]) => void} update\n * @param {(...parts: unknown[]) => unknown} get_value\n * @param {() => unknown[]} [get_parts] Set if the this binding is used inside an each block,\n * \t\t\t\t\t\t\t\t\t\treturns all the parts of the each block context that are used in the expression\n * @returns {void}\n */\nexport function bind_this(element_or_component = {}, update, get_value, get_parts) {\n\tvar component_effect = /** @type {ComponentContext} */ (component_context).r;\n\tvar parent = /** @type {Effect} */ (active_effect);\n\n\teffect(() => {\n\t\t/** @type {unknown[]} */\n\t\tvar old_parts;\n\n\t\t/** @type {unknown[]} */\n\t\tvar parts;\n\n\t\trender_effect(() => {\n\t\t\told_parts = parts;\n\t\t\t// We only track changes to the parts, not the value itself to avoid unnecessary reruns.\n\t\t\tparts = get_parts?.() || [];\n\n\t\t\tuntrack(() => {\n\t\t\t\tif (!is_bound_this(get_value(...parts), element_or_component)) {\n\t\t\t\t\tupdate(element_or_component, ...parts);\n\t\t\t\t\t// If this is an effect rerun (cause: each block context changes), then nullify the binding at\n\t\t\t\t\t// the previous position if it isn't already taken over by a different effect.\n\t\t\t\t\tif (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) {\n\t\t\t\t\t\tupdate(null, ...old_parts);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\t// When the bind:this effect is destroyed, we go up the effect parent chain until we find the last parent effect that is destroyed,\n\t\t\t// or the effect containing the component bind:this is in (whichever comes first). That way we can time the nulling of the binding\n\t\t\t// as close to user/developer expectation as possible.\n\t\t\t// TODO Svelte 6: Decide if we want to keep this logic or just always null the binding in the component effect's teardown\n\t\t\t// (which would be simpler, but less intuitive in some cases, and breaks the `ondestroy-before-cleanup` test)\n\t\t\tlet p = parent;\n\t\t\twhile (p !== component_effect && p.parent !== null && p.parent.f & DESTROYING) {\n\t\t\t\tp = p.parent;\n\t\t\t}\n\t\t\tconst teardown = () => {\n\t\t\t\tif (parts && is_bound_this(get_value(...parts), element_or_component)) {\n\t\t\t\t\tupdate(null, ...parts);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst original_teardown = p.teardown;\n\t\t\tp.teardown = () => {\n\t\t\t\tteardown();\n\t\t\t\toriginal_teardown?.();\n\t\t\t};\n\t\t};\n\t});\n\n\treturn element_or_component;\n}\n","import { noop } from '../../../shared/utils.js';\nimport { user_pre_effect } from '../../reactivity/effects.js';\nimport { on } from '../elements/events.js';\n\n/**\n * Substitute for the `trusted` event modifier\n * @deprecated\n * @param {(event: Event, ...args: Array<unknown>) => void} fn\n * @returns {(event: Event, ...args: unknown[]) => void}\n */\nexport function trusted(fn) {\n\treturn function (...args) {\n\t\tvar event = /** @type {Event} */ (args[0]);\n\t\tif (event.isTrusted) {\n\t\t\t// @ts-ignore\n\t\t\tfn?.apply(this, args);\n\t\t}\n\t};\n}\n\n/**\n * Substitute for the `self` event modifier\n * @deprecated\n * @param {(event: Event, ...args: Array<unknown>) => void} fn\n * @returns {(event: Event, ...args: unknown[]) => void}\n */\nexport function self(fn) {\n\treturn function (...args) {\n\t\tvar event = /** @type {Event} */ (args[0]);\n\t\t// @ts-ignore\n\t\tif (event.target === this) {\n\t\t\t// @ts-ignore\n\t\t\tfn?.apply(this, args);\n\t\t}\n\t};\n}\n\n/**\n * Substitute for the `stopPropagation` event modifier\n * @deprecated\n * @param {(event: Event, ...args: Array<unknown>) => void} fn\n * @returns {(event: Event, ...args: unknown[]) => void}\n */\nexport function stopPropagation(fn) {\n\treturn function (...args) {\n\t\tvar event = /** @type {Event} */ (args[0]);\n\t\tevent.stopPropagation();\n\t\t// @ts-ignore\n\t\treturn fn?.apply(this, args);\n\t};\n}\n\n/**\n * Substitute for the `once` event modifier\n * @deprecated\n * @param {(event: Event, ...args: Array<unknown>) => void} fn\n * @returns {(event: Event, ...args: unknown[]) => void}\n */\nexport function once(fn) {\n\tvar ran = false;\n\n\treturn function (...args) {\n\t\tif (ran) return;\n\t\tran = true;\n\n\t\t// @ts-ignore\n\t\treturn fn?.apply(this, args);\n\t};\n}\n\n/**\n * Substitute for the `stopImmediatePropagation` event modifier\n * @deprecated\n * @param {(event: Event, ...args: Array<unknown>) => void} fn\n * @returns {(event: Event, ...args: unknown[]) => void}\n */\nexport function stopImmediatePropagation(fn) {\n\treturn function (...args) {\n\t\tvar event = /** @type {Event} */ (args[0]);\n\t\tevent.stopImmediatePropagation();\n\t\t// @ts-ignore\n\t\treturn fn?.apply(this, args);\n\t};\n}\n\n/**\n * Substitute for the `preventDefault` event modifier\n * @deprecated\n * @param {(event: Event, ...args: Array<unknown>) => void} fn\n * @returns {(event: Event, ...args: unknown[]) => void}\n */\nexport function preventDefault(fn) {\n\treturn function (...args) {\n\t\tvar event = /** @type {Event} */ (args[0]);\n\t\tevent.preventDefault();\n\t\t// @ts-ignore\n\t\treturn fn?.apply(this, args);\n\t};\n}\n\n/**\n * Substitute for the `passive` event modifier, implemented as an action\n * @deprecated\n * @param {HTMLElement} node\n * @param {[event: string, handler: () => EventListener]} options\n */\nexport function passive(node, [event, handler]) {\n\tuser_pre_effect(() => {\n\t\treturn on(node, event, handler() ?? noop, {\n\t\t\tpassive: true\n\t\t});\n\t});\n}\n\n/**\n * Substitute for the `nonpassive` event modifier, implemented as an action\n * @deprecated\n * @param {HTMLElement} node\n * @param {[event: string, handler: () => EventListener]} options\n */\nexport function nonpassive(node, [event, handler]) {\n\tuser_pre_effect(() => {\n\t\treturn on(node, event, handler() ?? noop, {\n\t\t\tpassive: false\n\t\t});\n\t});\n}\n","/** @import { ComponentContextLegacy } from '#client' */\nimport { run, run_all } from '../../../shared/utils.js';\nimport { component_context } from '../../context.js';\nimport { derived } from '../../reactivity/deriveds.js';\nimport { user_pre_effect, user_effect } from '../../reactivity/effects.js';\nimport { deep_read_state, get, untrack } from '../../runtime.js';\n\n/**\n * Legacy-mode only: Call `onMount` callbacks and set up `beforeUpdate`/`afterUpdate` effects\n * @param {boolean} [immutable]\n */\nexport function init(immutable = false) {\n\tconst context = /** @type {ComponentContextLegacy} */ (component_context);\n\n\tconst callbacks = context.l.u;\n\tif (!callbacks) return;\n\n\tlet props = () => deep_read_state(context.s);\n\n\tif (immutable) {\n\t\tlet version = 0;\n\t\tlet prev = /** @type {Record<string, any>} */ ({});\n\n\t\t// In legacy immutable mode, before/afterUpdate only fire if the object identity of a prop changes\n\t\tconst d = derived(() => {\n\t\t\tlet changed = false;\n\t\t\tconst props = context.s;\n\t\t\tfor (const key in props) {\n\t\t\t\tif (props[key] !== prev[key]) {\n\t\t\t\t\tprev[key] = props[key];\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changed) version++;\n\t\t\treturn version;\n\t\t});\n\n\t\tprops = () => get(d);\n\t}\n\n\t// beforeUpdate\n\tif (callbacks.b.length) {\n\t\tuser_pre_effect(() => {\n\t\t\tobserve_all(context, props);\n\t\t\trun_all(callbacks.b);\n\t\t});\n\t}\n\n\t// onMount (must run before afterUpdate)\n\tuser_effect(() => {\n\t\tconst fns = untrack(() => callbacks.m.map(run));\n\t\treturn () => {\n\t\t\tfor (const fn of fns) {\n\t\t\t\tif (typeof fn === 'function') {\n\t\t\t\t\tfn();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n\n\t// afterUpdate\n\tif (callbacks.a.length) {\n\t\tuser_effect(() => {\n\t\t\tobserve_all(context, props);\n\t\t\trun_all(callbacks.a);\n\t\t});\n\t}\n}\n\n/**\n * Invoke the getter of all signals associated with a component\n * so they can be registered to the effect this function is called in.\n * @param {ComponentContextLegacy} context\n * @param {(() => void)} props\n */\nfunction observe_all(context, props) {\n\tif (context.l.s) {\n\t\tfor (const signal of context.l.s) get(signal);\n\t}\n\n\tprops();\n}\n","import { set, source } from '../../reactivity/sources.js';\nimport { get } from '../../runtime.js';\nimport { is_array } from '../../../shared/utils.js';\n\n/**\n * Under some circumstances, imports may be reactive in legacy mode. In that case,\n * they should be using `reactive_import` as part of the transformation\n * @param {() => any} fn\n */\nexport function reactive_import(fn) {\n\tvar s = source(0);\n\n\treturn function () {\n\t\tif (arguments.length === 1) {\n\t\t\tset(s, get(s) + 1);\n\t\t\treturn arguments[0];\n\t\t} else {\n\t\t\tget(s);\n\t\t\treturn fn();\n\t\t}\n\t};\n}\n\n/**\n * @this {any}\n * @param {Record<string, unknown>} $$props\n * @param {Event} event\n * @returns {void}\n */\nexport function bubble_event($$props, event) {\n\tvar events = /** @type {Record<string, Function[] | Function>} */ ($$props.$$events)?.[\n\t\tevent.type\n\t];\n\n\tvar callbacks = is_array(events) ? events.slice() : events == null ? [] : [events];\n\n\tfor (var fn of callbacks) {\n\t\t// Preserve \"this\" context\n\t\tfn.call(this, event);\n\t}\n}\n\n/**\n * Used to simulate `$on` on a component instance when `compatibility.componentApi === 4`\n * @param {Record<string, any>} $$props\n * @param {string} event_name\n * @param {Function} event_callback\n */\nexport function add_legacy_event_listener($$props, event_name, event_callback) {\n\t$$props.$$events ||= {};\n\t$$props.$$events[event_name] ||= [];\n\t$$props.$$events[event_name].push(event_callback);\n}\n\n/**\n * Used to simulate `$set` on a component instance when `compatibility.componentApi === 4`.\n * Needs component accessors so that it can call the setter of the prop. Therefore doesn't\n * work for updating props in `$$props` or `$$restProps`.\n * @this {Record<string, any>}\n * @param {Record<string, any>} $$new_props\n */\nexport function update_legacy_props($$new_props) {\n\tfor (var key in $$new_props) {\n\t\tif (key in this) {\n\t\t\tthis[key] = $$new_props[key];\n\t\t}\n\t}\n}\n","/** @import { Derived, Effect, Source } from './types.js' */\nimport { DEV } from 'esm-env';\nimport {\n\tPROPS_IS_BINDABLE,\n\tPROPS_IS_IMMUTABLE,\n\tPROPS_IS_LAZY_INITIAL,\n\tPROPS_IS_RUNES,\n\tPROPS_IS_UPDATED\n} from '../../../constants.js';\nimport { get_descriptor, is_function } from '../../shared/utils.js';\nimport { set, source, update } from './sources.js';\nimport { derived, derived_safe_equal } from './deriveds.js';\nimport {\n\tactive_effect,\n\tget,\n\tis_destroying_effect,\n\tset_active_effect,\n\tuntrack\n} from '../runtime.js';\nimport * as e from '../errors.js';\nimport { DESTROYED, LEGACY_PROPS, STATE_SYMBOL } from '#client/constants';\nimport { proxy } from '../proxy.js';\nimport { capture_store_binding } from './store.js';\nimport { legacy_mode_flag } from '../../flags/index.js';\nimport { effect, render_effect } from './effects.js';\n\n/**\n * @param {((value?: number) => number)} fn\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_prop(fn, d = 1) {\n\tconst value = fn();\n\tfn(value + d);\n\treturn value;\n}\n\n/**\n * @param {((value?: number) => number)} fn\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_pre_prop(fn, d = 1) {\n\tconst value = fn() + d;\n\tfn(value);\n\treturn value;\n}\n\n/**\n * The proxy handler for rest props (i.e. `const { x, ...rest } = $props()`).\n * Is passed the full `$$props` object and excludes the named props.\n * @type {ProxyHandler<{ props: Record<string | symbol, unknown>, exclude: Set<string | symbol>, name?: string }>}}\n */\nconst rest_props_handler = {\n\tget(target, key) {\n\t\tif (target.exclude.has(key)) return;\n\t\treturn target.props[key];\n\t},\n\tset(target, key) {\n\t\tif (DEV) {\n\t\t\t// TODO should this happen in prod too?\n\t\t\te.props_rest_readonly(`${target.name}.${String(key)}`);\n\t\t}\n\n\t\treturn false;\n\t},\n\tgetOwnPropertyDescriptor(target, key) {\n\t\tif (target.exclude.has(key)) return;\n\t\tif (key in target.props) {\n\t\t\treturn {\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: target.props[key]\n\t\t\t};\n\t\t}\n\t},\n\thas(target, key) {\n\t\tif (target.exclude.has(key)) return false;\n\t\treturn key in target.props;\n\t},\n\townKeys(target) {\n\t\treturn Reflect.ownKeys(target.props).filter((key) => !target.exclude.has(key));\n\t}\n};\n\n/**\n * @param {Record<string, unknown>} props\n * @param {Set<string>} exclude\n * @param {string} [name]\n * @returns {Record<string, unknown>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function rest_props(props, exclude, name) {\n\treturn new Proxy(\n\t\tDEV ? { props, exclude, name, other: {}, to_proxy: [] } : { props, exclude },\n\t\trest_props_handler\n\t);\n}\n\n/**\n * The proxy handler for legacy $$restProps and $$props\n * @type {ProxyHandler<{ props: Record<string | symbol, unknown>, exclude: Array<string | symbol>, special: Record<string | symbol, (v?: unknown) => unknown>, version: Source<number>, parent_effect: Effect }>}}\n */\nconst legacy_rest_props_handler = {\n\tget(target, key) {\n\t\tif (target.exclude.includes(key)) return;\n\t\tget(target.version);\n\t\treturn key in target.special ? target.special[key]() : target.props[key];\n\t},\n\tset(target, key, value) {\n\t\tif (!(key in target.special)) {\n\t\t\tvar previous_effect = active_effect;\n\n\t\t\ttry {\n\t\t\t\tset_active_effect(target.parent_effect);\n\n\t\t\t\t// Handle props that can temporarily get out of sync with the parent\n\t\t\t\t/** @type {Record<string, (v?: unknown) => unknown>} */\n\t\t\t\ttarget.special[key] = prop(\n\t\t\t\t\t{\n\t\t\t\t\t\tget [key]() {\n\t\t\t\t\t\t\treturn target.props[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t/** @type {string} */ (key),\n\t\t\t\t\tPROPS_IS_UPDATED\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tset_active_effect(previous_effect);\n\t\t\t}\n\t\t}\n\n\t\ttarget.special[key](value);\n\t\tupdate(target.version); // $$props is coarse-grained: when $$props.x is updated, usages of $$props.y etc are also rerun\n\t\treturn true;\n\t},\n\tgetOwnPropertyDescriptor(target, key) {\n\t\tif (target.exclude.includes(key)) return;\n\t\tif (key in target.props) {\n\t\t\treturn {\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: target.props[key]\n\t\t\t};\n\t\t}\n\t},\n\tdeleteProperty(target, key) {\n\t\t// Svelte 4 allowed for deletions on $$restProps\n\t\tif (target.exclude.includes(key)) return true;\n\t\ttarget.exclude.push(key);\n\t\tupdate(target.version);\n\t\treturn true;\n\t},\n\thas(target, key) {\n\t\tif (target.exclude.includes(key)) return false;\n\t\treturn key in target.props;\n\t},\n\townKeys(target) {\n\t\treturn Reflect.ownKeys(target.props).filter((key) => !target.exclude.includes(key));\n\t}\n};\n\n/**\n * @param {Record<string, unknown>} props\n * @param {string[]} exclude\n * @returns {Record<string, unknown>}\n */\nexport function legacy_rest_props(props, exclude) {\n\treturn new Proxy(\n\t\t{\n\t\t\tprops,\n\t\t\texclude,\n\t\t\tspecial: {},\n\t\t\tversion: source(0),\n\t\t\t// TODO this is only necessary because we need to track component\n\t\t\t// destruction inside `prop`, because of `bind:this`, but it\n\t\t\t// seems likely that we can simplify `bind:this` instead\n\t\t\tparent_effect: /** @type {Effect} */ (active_effect)\n\t\t},\n\t\tlegacy_rest_props_handler\n\t);\n}\n\n/**\n * The proxy handler for spread props. Handles the incoming array of props\n * that looks like `() => { dynamic: props }, { static: prop }, ..` and wraps\n * them so that the whole thing is passed to the component as the `$$props` argument.\n * @type {ProxyHandler<{ props: Array<Record<string | symbol, unknown> | (() => Record<string | symbol, unknown>)> }>}}\n */\nconst spread_props_handler = {\n\tget(target, key) {\n\t\tlet i = target.props.length;\n\t\twhile (i--) {\n\t\t\tlet p = target.props[i];\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (typeof p === 'object' && p !== null && key in p) return p[key];\n\t\t}\n\t},\n\tset(target, key, value) {\n\t\tlet i = target.props.length;\n\t\twhile (i--) {\n\t\t\tlet p = target.props[i];\n\t\t\tif (is_function(p)) p = p();\n\t\t\tconst desc = get_descriptor(p, key);\n\t\t\tif (desc && desc.set) {\n\t\t\t\tdesc.set(value);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\tgetOwnPropertyDescriptor(target, key) {\n\t\tlet i = target.props.length;\n\t\twhile (i--) {\n\t\t\tlet p = target.props[i];\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (typeof p === 'object' && p !== null && key in p) {\n\t\t\t\tconst descriptor = get_descriptor(p, key);\n\t\t\t\tif (descriptor && !descriptor.configurable) {\n\t\t\t\t\t// Prevent a \"Non-configurability Report Error\": The target is an array, it does\n\t\t\t\t\t// not actually contain this property. If it is now described as non-configurable,\n\t\t\t\t\t// the proxy throws a validation error. Setting it to true avoids that.\n\t\t\t\t\tdescriptor.configurable = true;\n\t\t\t\t}\n\t\t\t\treturn descriptor;\n\t\t\t}\n\t\t}\n\t},\n\thas(target, key) {\n\t\t// To prevent a false positive `is_entry_props` in the `prop` function\n\t\tif (key === STATE_SYMBOL || key === LEGACY_PROPS) return false;\n\n\t\tfor (let p of target.props) {\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (p != null && key in p) return true;\n\t\t}\n\n\t\treturn false;\n\t},\n\townKeys(target) {\n\t\t/** @type {Array<string | symbol>} */\n\t\tconst keys = [];\n\n\t\tfor (let p of target.props) {\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (!p) continue;\n\n\t\t\tfor (const key in p) {\n\t\t\t\tif (!keys.includes(key)) keys.push(key);\n\t\t\t}\n\n\t\t\tfor (const key of Object.getOwnPropertySymbols(p)) {\n\t\t\t\tif (!keys.includes(key)) keys.push(key);\n\t\t\t}\n\t\t}\n\n\t\treturn keys;\n\t}\n};\n\n/**\n * @param {Array<Record<string, unknown> | (() => Record<string, unknown>)>} props\n * @returns {any}\n */\nexport function spread_props(...props) {\n\treturn new Proxy({ props }, spread_props_handler);\n}\n\n/**\n * This function is responsible for synchronizing a possibly bound prop with the inner component state.\n * It is used whenever the compiler sees that the component writes to the prop, or when it has a default prop_value.\n * @template V\n * @param {Record<string, unknown>} props\n * @param {string} key\n * @param {number} flags\n * @param {V | (() => V)} [fallback]\n * @returns {(() => V | ((arg: V) => V) | ((arg: V, mutation: boolean) => V))}\n */\nexport function prop(props, key, flags, fallback) {\n\tvar runes = !legacy_mode_flag || (flags & PROPS_IS_RUNES) !== 0;\n\tvar bindable = (flags & PROPS_IS_BINDABLE) !== 0;\n\tvar lazy = (flags & PROPS_IS_LAZY_INITIAL) !== 0;\n\n\tvar fallback_value = /** @type {V} */ (fallback);\n\tvar fallback_dirty = true;\n\tvar fallback_signal = /** @type {Derived<V> | undefined} */ (undefined);\n\n\tvar get_fallback = () => {\n\t\tif (lazy && runes) {\n\t\t\tfallback_signal ??= derived(/** @type {() => V} */ (fallback));\n\t\t\treturn get(fallback_signal);\n\t\t}\n\n\t\tif (fallback_dirty) {\n\t\t\tfallback_dirty = false;\n\n\t\t\tfallback_value = lazy\n\t\t\t\t? untrack(/** @type {() => V} */ (fallback))\n\t\t\t\t: /** @type {V} */ (fallback);\n\t\t}\n\n\t\treturn fallback_value;\n\t};\n\n\t/** @type {((v: V) => void) | undefined} */\n\tlet setter;\n\n\tif (bindable) {\n\t\t// Can be the case when someone does `mount(Component, props)` with `let props = $state({...})`\n\t\t// or `createClassComponent(Component, props)`\n\t\tvar is_entry_props = STATE_SYMBOL in props || LEGACY_PROPS in props;\n\n\t\tsetter =\n\t\t\tget_descriptor(props, key)?.set ??\n\t\t\t(is_entry_props && key in props ? (v) => (props[key] = v) : undefined);\n\t}\n\n\t/** @type {V} */\n\tvar initial_value;\n\tvar is_store_sub = false;\n\n\tif (bindable) {\n\t\t[initial_value, is_store_sub] = capture_store_binding(() => /** @type {V} */ (props[key]));\n\t} else {\n\t\tinitial_value = /** @type {V} */ (props[key]);\n\t}\n\n\tif (initial_value === undefined && fallback !== undefined) {\n\t\tinitial_value = get_fallback();\n\n\t\tif (setter) {\n\t\t\tif (runes) e.props_invalid_value(key);\n\t\t\tsetter(initial_value);\n\t\t}\n\t}\n\n\t/** @type {() => V} */\n\tvar getter;\n\n\tif (runes) {\n\t\tgetter = () => {\n\t\t\tvar value = /** @type {V} */ (props[key]);\n\t\t\tif (value === undefined) return get_fallback();\n\t\t\tfallback_dirty = true;\n\t\t\treturn value;\n\t\t};\n\t} else {\n\t\tgetter = () => {\n\t\t\tvar value = /** @type {V} */ (props[key]);\n\n\t\t\tif (value !== undefined) {\n\t\t\t\t// in legacy mode, we don't revert to the fallback value\n\t\t\t\t// if the prop goes from defined to undefined. The easiest\n\t\t\t\t// way to model this is to make the fallback undefined\n\t\t\t\t// as soon as the prop has a value\n\t\t\t\tfallback_value = /** @type {V} */ (undefined);\n\t\t\t}\n\n\t\t\treturn value === undefined ? fallback_value : value;\n\t\t};\n\t}\n\n\t// prop is never written to — we only need a getter\n\tif (runes && (flags & PROPS_IS_UPDATED) === 0) {\n\t\treturn getter;\n\t}\n\n\t// prop is written to, but the parent component had `bind:foo` which\n\t// means we can just call `$$props.foo = value` directly\n\tif (setter) {\n\t\tvar legacy_parent = props.$$legacy;\n\t\treturn /** @type {() => V} */ (\n\t\t\tfunction (/** @type {V} */ value, /** @type {boolean} */ mutation) {\n\t\t\t\tif (arguments.length > 0) {\n\t\t\t\t\t// We don't want to notify if the value was mutated and the parent is in runes mode.\n\t\t\t\t\t// In that case the state proxy (if it exists) should take care of the notification.\n\t\t\t\t\t// If the parent is not in runes mode, we need to notify on mutation, too, that the prop\n\t\t\t\t\t// has changed because the parent will not be able to detect the change otherwise.\n\t\t\t\t\tif (!runes || !mutation || legacy_parent || is_store_sub) {\n\t\t\t\t\t\t/** @type {Function} */ (setter)(mutation ? getter() : value);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\n\t\t\t\treturn getter();\n\t\t\t}\n\t\t);\n\t}\n\n\t// Either prop is written to, but there's no binding, which means we\n\t// create a derived that we can write to locally.\n\t// Or we are in legacy mode where we always create a derived to replicate that\n\t// Svelte 4 did not trigger updates when a primitive value was updated to the same value.\n\tvar overridden = false;\n\n\tvar d = ((flags & PROPS_IS_IMMUTABLE) !== 0 ? derived : derived_safe_equal)(() => {\n\t\toverridden = false;\n\t\treturn getter();\n\t});\n\n\tif (DEV) {\n\t\td.label = key;\n\t}\n\n\t// Capture the initial value if it's bindable\n\tif (bindable) get(d);\n\n\tvar parent_effect = /** @type {Effect} */ (active_effect);\n\n\treturn /** @type {() => V} */ (\n\t\tfunction (/** @type {any} */ value, /** @type {boolean} */ mutation) {\n\t\t\tif (arguments.length > 0) {\n\t\t\t\tconst new_value = mutation ? get(d) : runes && bindable ? proxy(value) : value;\n\n\t\t\t\tset(d, new_value);\n\t\t\t\toverridden = true;\n\n\t\t\t\tif (fallback_value !== undefined) {\n\t\t\t\t\tfallback_value = new_value;\n\t\t\t\t}\n\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t// special case — avoid recalculating the derived if we're in a\n\t\t\t// teardown function and the prop was overridden locally, or the\n\t\t\t// component was already destroyed (people could access props in a timeout)\n\t\t\tif ((is_destroying_effect && overridden) || (parent_effect.f & DESTROYED) !== 0) {\n\t\t\t\treturn d.v;\n\t\t\t}\n\n\t\t\treturn get(d);\n\t\t}\n\t);\n}\n","/** @import { ComponentContext, ComponentContextLegacy } from '#client' */\n/** @import { EventDispatcher } from './index.js' */\n/** @import { NotFunction } from './internal/types.js' */\nimport { active_reaction, untrack } from './internal/client/runtime.js';\nimport { is_array } from './internal/shared/utils.js';\nimport { user_effect } from './internal/client/index.js';\nimport * as e from './internal/client/errors.js';\nimport { legacy_mode_flag } from './internal/flags/index.js';\nimport { component_context } from './internal/client/context.js';\nimport { DEV } from 'esm-env';\n\nif (DEV) {\n\t/**\n\t * @param {string} rune\n\t */\n\tfunction throw_rune_error(rune) {\n\t\tif (!(rune in globalThis)) {\n\t\t\t// TODO if people start adjusting the \"this can contain runes\" config through v-p-s more, adjust this message\n\t\t\t/** @type {any} */\n\t\t\tlet value; // let's hope noone modifies this global, but belts and braces\n\t\t\tObject.defineProperty(globalThis, rune, {\n\t\t\t\tconfigurable: true,\n\t\t\t\t// eslint-disable-next-line getter-return\n\t\t\t\tget: () => {\n\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\n\t\t\t\t\te.rune_outside_svelte(rune);\n\t\t\t\t},\n\t\t\t\tset: (v) => {\n\t\t\t\t\tvalue = v;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tthrow_rune_error('$state');\n\tthrow_rune_error('$effect');\n\tthrow_rune_error('$derived');\n\tthrow_rune_error('$inspect');\n\tthrow_rune_error('$props');\n\tthrow_rune_error('$bindable');\n}\n\n/**\n * Returns an [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) that aborts when the current [derived](https://svelte.dev/docs/svelte/$derived) or [effect](https://svelte.dev/docs/svelte/$effect) re-runs or is destroyed.\n *\n * Must be called while a derived or effect is running.\n *\n * ```svelte\n * <script>\n * \timport { getAbortSignal } from 'svelte';\n *\n * \tlet { id } = $props();\n *\n * \tasync function getData(id) {\n * \t\tconst response = await fetch(`/items/${id}`, {\n * \t\t\tsignal: getAbortSignal()\n * \t\t});\n *\n * \t\treturn await response.json();\n * \t}\n *\n * \tconst data = $derived(await getData(id));\n * </script>\n * ```\n */\nexport function getAbortSignal() {\n\tif (active_reaction === null) {\n\t\te.get_abort_signal_outside_reaction();\n\t}\n\n\treturn (active_reaction.ac ??= new AbortController()).signal;\n}\n\n/**\n * `onMount`, like [`$effect`](https://svelte.dev/docs/svelte/$effect), schedules a function to run as soon as the component has been mounted to the DOM.\n * Unlike `$effect`, the provided function only runs once.\n *\n * It must be called during the component's initialisation (but doesn't need to live _inside_ the component;\n * it can be called from an external module). If a function is returned _synchronously_ from `onMount`,\n * it will be called when the component is unmounted.\n *\n * `onMount` functions do not run during [server-side rendering](https://svelte.dev/docs/svelte/svelte-server#render).\n *\n * @template T\n * @param {() => NotFunction<T> | Promise<NotFunction<T>> | (() => any)} fn\n * @returns {void}\n */\nexport function onMount(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('onMount');\n\t}\n\n\tif (legacy_mode_flag && component_context.l !== null) {\n\t\tinit_update_callbacks(component_context).m.push(fn);\n\t} else {\n\t\tuser_effect(() => {\n\t\t\tconst cleanup = untrack(fn);\n\t\t\tif (typeof cleanup === 'function') return /** @type {() => void} */ (cleanup);\n\t\t});\n\t}\n}\n\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * @param {() => any} fn\n * @returns {void}\n */\nexport function onDestroy(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('onDestroy');\n\t}\n\n\tonMount(() => () => untrack(fn));\n}\n\n/**\n * @template [T=any]\n * @param {string} type\n * @param {T} [detail]\n * @param {any}params_0\n * @returns {CustomEvent<T>}\n */\nfunction create_custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n\treturn new CustomEvent(type, { detail, bubbles, cancelable });\n}\n\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](https://svelte.dev/docs/svelte/legacy-on#Component-events).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * The event dispatcher can be typed to narrow the allowed event names and the type of the `detail` argument:\n * ```ts\n * const dispatch = createEventDispatcher<{\n * loaded: null; // does not take a detail argument\n * change: string; // takes a detail argument of type string, which is required\n * optional: number | null; // takes an optional detail argument of type number\n * }>();\n * ```\n *\n * @deprecated Use callback props and/or the `$host()` rune instead — see [migration guide](https://svelte.dev/docs/svelte/v5-migration-guide#Event-changes-Component-events)\n * @template {Record<string, any>} [EventMap = any]\n * @returns {EventDispatcher<EventMap>}\n */\nexport function createEventDispatcher() {\n\tconst active_component_context = component_context;\n\tif (active_component_context === null) {\n\t\te.lifecycle_outside_component('createEventDispatcher');\n\t}\n\n\t/**\n\t * @param [detail]\n\t * @param [options]\n\t */\n\treturn (type, detail, options) => {\n\t\tconst events = /** @type {Record<string, Function | Function[]>} */ (\n\t\t\tactive_component_context.s.$$events\n\t\t)?.[/** @type {string} */ (type)];\n\n\t\tif (events) {\n\t\t\tconst callbacks = is_array(events) ? events.slice() : [events];\n\t\t\t// TODO are there situations where events could be dispatched\n\t\t\t// in a server (non-DOM) environment?\n\t\t\tconst event = create_custom_event(/** @type {string} */ (type), detail, options);\n\t\t\tfor (const fn of callbacks) {\n\t\t\t\tfn.call(active_component_context.x, event);\n\t\t\t}\n\t\t\treturn !event.defaultPrevented;\n\t\t}\n\n\t\treturn true;\n\t};\n}\n\n// TODO mark beforeUpdate and afterUpdate as deprecated in Svelte 6\n\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`.\n *\n * In runes mode use `$effect.pre` instead.\n *\n * @deprecated Use [`$effect.pre`](https://svelte.dev/docs/svelte/$effect#$effect.pre) instead\n * @param {() => void} fn\n * @returns {void}\n */\nexport function beforeUpdate(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('beforeUpdate');\n\t}\n\n\tif (component_context.l === null) {\n\t\te.lifecycle_legacy_only('beforeUpdate');\n\t}\n\n\tinit_update_callbacks(component_context).b.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`.\n *\n * In runes mode use `$effect` instead.\n *\n * @deprecated Use [`$effect`](https://svelte.dev/docs/svelte/$effect) instead\n * @param {() => void} fn\n * @returns {void}\n */\nexport function afterUpdate(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('afterUpdate');\n\t}\n\n\tif (component_context.l === null) {\n\t\te.lifecycle_legacy_only('afterUpdate');\n\t}\n\n\tinit_update_callbacks(component_context).a.push(fn);\n}\n\n/**\n * Legacy-mode: Init callbacks object for onMount/beforeUpdate/afterUpdate\n * @param {ComponentContext} context\n */\nfunction init_update_callbacks(context) {\n\tvar l = /** @type {ComponentContextLegacy} */ (context).l;\n\treturn (l.u ??= { a: [], b: [], m: [] });\n}\n\nexport { flushSync, fork } from './internal/client/reactivity/batch.js';\nexport {\n\tcreateContext,\n\tgetContext,\n\tgetAllContexts,\n\thasContext,\n\tsetContext\n} from './internal/client/context.js';\nexport { hydratable } from './internal/client/hydratable.js';\nexport { hydrate, mount, unmount } from './internal/client/render.js';\nexport { tick, untrack, settled } from './internal/client/runtime.js';\nexport { createRawSnippet } from './internal/client/dom/blocks/snippet.js';\n","export const ONBOARDING_COMPLETE_KEY = 'motionly.onboarding.complete.v1';\n\nexport function initialRoute(\n pathname: string,\n forceWelcome: boolean,\n completed: boolean,\n base = '/'\n): 'editor' | 'onboarding' {\n if (relativeAppPath(pathname, base).replace(/\\/$/, '') === '/editor') return 'editor';\n return completed && !forceWelcome ? 'editor' : 'onboarding';\n}\n\nexport function appUrl(path = '', base = import.meta.env.BASE_URL): string {\n return `${base.endsWith('/') ? base : `${base}/`}${path.replace(/^\\/+/, '')}`;\n}\n\nexport function relativeAppPath(pathname: string, base = import.meta.env.BASE_URL): string {\n const prefix = base === '/' ? '' : base.replace(/\\/$/, '');\n return pathname.startsWith(prefix) ? pathname.slice(prefix.length) || '/' : pathname;\n}\n","// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n * @type {string}\n */\nexport const VERSION = '5.56.4';\nexport const PUBLIC_VERSION = '5';\n","import { PUBLIC_VERSION } from '../version.js';\n\nif (typeof window !== 'undefined') {\n\t// @ts-expect-error\n\t((window.__svelte ??= {}).v ??= new Set()).add(PUBLIC_VERSION);\n}\n","import { enable_legacy_mode_flag } from './index.js';\n\nenable_legacy_mode_flag();\n","/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n * \n * Copyright (c) 2026 Lucide Icons and Contributors\n * \n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n * \n * ---\n * \n * The following Lucide icons are derived from the Feather project:\n * \n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n * \n * The MIT License (MIT) (for the icons listed above)\n * \n * Copyright (c) 2013-present Cole Bemis\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n */\nconst defaultAttributes = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n};\nexport default defaultAttributes;\n","/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n * \n * Copyright (c) 2026 Lucide Icons and Contributors\n * \n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n * \n * ---\n * \n * The following Lucide icons are derived from the Feather project:\n * \n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n * \n * The MIT License (MIT) (for the icons listed above)\n * \n * Copyright (c) 2013-present Cole Bemis\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n */\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n return false;\n};\n","/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n * \n * Copyright (c) 2026 Lucide Icons and Contributors\n * \n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n * \n * ---\n * \n * The following Lucide icons are derived from the Feather project:\n * \n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n * \n * The MIT License (MIT) (for the icons listed above)\n * \n * Copyright (c) 2013-present Cole Bemis\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n */\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = (...classes) => classes\n .filter((className, index, array) => {\n return (Boolean(className) &&\n className.trim() !== '' &&\n array.indexOf(className) === index);\n})\n .join(' ')\n .trim();\n","<script>import defaultAttributes from './defaultAttributes';\nimport { hasA11yProp } from './utils/hasA11yProp';\nimport { mergeClasses } from './utils/mergeClasses';\nexport let name = undefined;\nexport let color = 'currentColor';\nexport let size = 24;\nexport let strokeWidth = 2;\nexport let absoluteStrokeWidth = false;\nexport let iconNode = [];\n</script>\n\n<svg\n {...defaultAttributes}\n {...(!hasA11yProp($$restProps) ? {'aria-hidden': 'true'} : undefined)}\n {...$$restProps}\n width={size}\n height={size}\n stroke={color}\n stroke-width={\n absoluteStrokeWidth\n ? Number(strokeWidth) * 24 / Number(size)\n : strokeWidth\n }\n class={\n mergeClasses(\n 'lucide-icon',\n 'lucide',\n name ? `lucide-${name}`: '',\n $$props.class\n )\n }\n>\n {#each iconNode as [tag, attrs]}\n <svelte:element this={tag} {...attrs}/>\n {/each}\n <slot />\n</svg>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"6\", \"height\": \"14\", \"x\": \"2\", \"y\": \"5\", \"rx\": \"2\" }], [\"rect\", { \"width\": \"6\", \"height\": \"10\", \"x\": \"16\", \"y\": \"7\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M12 2v20\" }]];\n/**\n * @component @name AlignHorizontalJustifyCenter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-horizontal-justify-center\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"align-horizontal-justify-center\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"6\", \"height\": \"14\", \"x\": \"2\", \"y\": \"5\", \"rx\": \"2\" }], [\"rect\", { \"width\": \"6\", \"height\": \"10\", \"x\": \"12\", \"y\": \"7\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M22 2v20\" }]];\n/**\n * @component @name AlignHorizontalJustifyEnd\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-horizontal-justify-end\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"align-horizontal-justify-end\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"6\", \"height\": \"14\", \"x\": \"6\", \"y\": \"5\", \"rx\": \"2\" }], [\"rect\", { \"width\": \"6\", \"height\": \"10\", \"x\": \"16\", \"y\": \"7\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M2 2v20\" }]];\n/**\n * @component @name AlignHorizontalJustifyStart\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-horizontal-justify-start\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"align-horizontal-justify-start\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"14\", \"height\": \"6\", \"x\": \"5\", \"y\": \"16\", \"rx\": \"2\" }], [\"rect\", { \"width\": \"10\", \"height\": \"6\", \"x\": \"7\", \"y\": \"2\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M2 12h20\" }]];\n/**\n * @component @name AlignVerticalJustifyCenter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-vertical-justify-center\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"align-vertical-justify-center\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"14\", \"height\": \"6\", \"x\": \"5\", \"y\": \"12\", \"rx\": \"2\" }], [\"rect\", { \"width\": \"10\", \"height\": \"6\", \"x\": \"7\", \"y\": \"2\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M2 22h20\" }]];\n/**\n * @component @name AlignVerticalJustifyEnd\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-vertical-justify-end\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"align-vertical-justify-end\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"14\", \"height\": \"6\", \"x\": \"5\", \"y\": \"16\", \"rx\": \"2\" }], [\"rect\", { \"width\": \"10\", \"height\": \"6\", \"x\": \"7\", \"y\": \"6\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M2 2h20\" }]];\n/**\n * @component @name AlignVerticalJustifyStart\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-vertical-justify-start\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"align-vertical-justify-start\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M5 12h14\" }], [\"path\", { \"d\": \"m12 5 7 7-7 7\" }]];\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"arrow-right\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M12 7v14\" }], [\"path\", { \"d\": \"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\" }]];\n/**\n * @component @name BookOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/book-open\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"book-open\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M12 8V4H8\" }], [\"rect\", { \"width\": \"16\", \"height\": \"12\", \"x\": \"4\", \"y\": \"8\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M2 14h2\" }], [\"path\", { \"d\": \"M20 14h2\" }], [\"path\", { \"d\": \"M15 13v2\" }], [\"path\", { \"d\": \"M9 13v2\" }]];\n/**\n * @component @name Bot\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/bot\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"bot\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"circle\", { \"cx\": \"12\", \"cy\": \"12\", \"r\": \"10\" }], [\"path\", { \"d\": \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" }], [\"path\", { \"d\": \"M12 17h.01\" }]];\n/**\n * @component @name CircleQuestionMark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/circle-question-mark\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"circle-question-mark\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M12 15V3\" }], [\"path\", { \"d\": \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }], [\"path\", { \"d\": \"m7 10 5 5 5-5\" }]];\n/**\n * @component @name Download\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/download\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"download\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" }], [\"path\", { \"d\": \"M14.084 14.158a3 3 0 0 1-4.242-4.242\" }], [\"path\", { \"d\": \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" }], [\"path\", { \"d\": \"m2 2 20 20\" }]];\n/**\n * @component @name EyeOff\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/eye-off\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"eye-off\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" }], [\"circle\", { \"cx\": \"12\", \"cy\": \"12\", \"r\": \"3\" }]];\n/**\n * @component @name Eye\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"eye\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\" }], [\"path\", { \"d\": \"M14 2v5a1 1 0 0 0 1 1h5\" }], [\"path\", { \"d\": \"M10 12.5 8 15l2 2.5\" }], [\"path\", { \"d\": \"m14 12.5 2 2.5-2 2.5\" }]];\n/**\n * @component @name FileCode\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-code\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"file-code\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\" }], [\"path\", { \"d\": \"M14 2v5a1 1 0 0 0 1 1h5\" }], [\"circle\", { \"cx\": \"10\", \"cy\": \"12\", \"r\": \"2\" }], [\"path\", { \"d\": \"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22\" }]];\n/**\n * @component @name FileImage\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-image\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"file-image\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\" }], [\"path\", { \"d\": \"M14 2v5a1 1 0 0 0 1 1h5\" }], [\"path\", { \"d\": \"M10 9H8\" }], [\"path\", { \"d\": \"M16 13H8\" }], [\"path\", { \"d\": \"M16 17H8\" }]];\n/**\n * @component @name FileText\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/file-text\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"file-text\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\" }]];\n/**\n * @component @name FolderOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/folder-open\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"folder-open\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M3 14h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a9 9 0 0 1 18 0v7a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3\" }]];\n/**\n * @component @name Headphones\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/headphones\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"headphones\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\" }], [\"path\", { \"d\": \"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\" }], [\"path\", { \"d\": \"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\" }]];\n/**\n * @component @name Layers\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/layers\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"layers\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"m12 15 4 4\" }], [\"path\", { \"d\": \"M2.352 10.648a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.029-6.029a1 1 0 1 1 3 3l-6.029 6.029a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.365-6.367A1 1 0 0 0 8.716 4.282z\" }], [\"path\", { \"d\": \"m5 8 4 4\" }]];\n/**\n * @component @name Magnet\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/magnet\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"magnet\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M15 3h6v6\" }], [\"path\", { \"d\": \"m21 3-7 7\" }], [\"path\", { \"d\": \"m3 21 7-7\" }], [\"path\", { \"d\": \"M9 21H3v-6\" }]];\n/**\n * @component @name Maximize2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/maximize-2\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"maximize-2\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M5 12h14\" }]];\n/**\n * @component @name Minus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/minus\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"minus\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"circle\", { \"cx\": \"8\", \"cy\": \"18\", \"r\": \"4\" }], [\"path\", { \"d\": \"M12 18V2l7 4\" }]];\n/**\n * @component @name Music2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/music-2\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"music-2\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"18\", \"height\": \"18\", \"x\": \"3\", \"y\": \"3\", \"rx\": \"2\" }], [\"path\", { \"d\": \"M9 3v18\" }], [\"path\", { \"d\": \"m16 15-3-3 3-3\" }]];\n/**\n * @component @name PanelLeftClose\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/panel-left-close\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"panel-left-close\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"x\": \"14\", \"y\": \"3\", \"width\": \"5\", \"height\": \"18\", \"rx\": \"1\" }], [\"rect\", { \"x\": \"5\", \"y\": \"3\", \"width\": \"5\", \"height\": \"18\", \"rx\": \"1\" }]];\n/**\n * @component @name Pause\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/pause\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"pause\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\" }]];\n/**\n * @component @name Play\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/play\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"play\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M5 12h14\" }], [\"path\", { \"d\": \"M12 5v14\" }]];\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/plus\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"plus\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"m15 14 5-5-5-5\" }], [\"path\", { \"d\": \"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\" }]];\n/**\n * @component @name Redo2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/redo-2\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"redo-2\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\" }], [\"path\", { \"d\": \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\" }], [\"path\", { \"d\": \"M7 3v4a1 1 0 0 0 1 1h7\" }]];\n/**\n * @component @name Save\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/save\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"save\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"circle\", { \"cx\": \"6\", \"cy\": \"6\", \"r\": \"3\" }], [\"path\", { \"d\": \"M8.12 8.12 12 12\" }], [\"path\", { \"d\": \"M20 4 8.12 15.88\" }], [\"circle\", { \"cx\": \"6\", \"cy\": \"18\", \"r\": \"3\" }], [\"path\", { \"d\": \"M14.8 14.8 20 20\" }]];\n/**\n * @component @name Scissors\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/scissors\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"scissors\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\" }], [\"path\", { \"d\": \"m21.854 2.147-10.94 10.939\" }]];\n/**\n * @component @name Send\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/send\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"send\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\" }], [\"circle\", { \"cx\": \"12\", \"cy\": \"12\", \"r\": \"3\" }]];\n/**\n * @component @name Settings\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/settings\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"settings\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z\" }], [\"path\", { \"d\": \"M3 20V4\" }]];\n/**\n * @component @name SkipBack\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/skip-back\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"skip-back\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\" }], [\"path\", { \"d\": \"M20 2v4\" }], [\"path\", { \"d\": \"M22 4h-4\" }], [\"circle\", { \"cx\": \"4\", \"cy\": \"20\", \"r\": \"2\" }]];\n/**\n * @component @name Sparkles\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/sparkles\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"sparkles\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"rect\", { \"width\": \"18\", \"height\": \"18\", \"x\": \"3\", \"y\": \"3\", \"rx\": \"2\" }]];\n/**\n * @component @name Square\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"square\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" }]];\n/**\n * @component @name Star\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/star\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"star\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M10 11v6\" }], [\"path\", { \"d\": \"M14 11v6\" }], [\"path\", { \"d\": \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" }], [\"path\", { \"d\": \"M3 6h18\" }], [\"path\", { \"d\": \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" }]];\n/**\n * @component @name Trash2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/trash-2\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"trash-2\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M12 4v16\" }], [\"path\", { \"d\": \"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\" }], [\"path\", { \"d\": \"M9 20h6\" }]];\n/**\n * @component @name Type\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/type\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"type\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M9 14 4 9l5-5\" }], [\"path\", { \"d\": \"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\" }]];\n/**\n * @component @name Undo2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/undo-2\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"undo-2\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M12 3v12\" }], [\"path\", { \"d\": \"m17 8-5-5-5 5\" }], [\"path\", { \"d\": \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" }]];\n/**\n * @component @name Upload\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"upload\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\" }], [\"rect\", { \"x\": \"2\", \"y\": \"6\", \"width\": \"14\", \"height\": \"12\", \"rx\": \"2\" }]];\n/**\n * @component @name Video\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/video\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"video\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\" }], [\"path\", { \"d\": \"M16 9a5 5 0 0 1 0 6\" }], [\"path\", { \"d\": \"M19.364 18.364a9 9 0 0 0 0-12.728\" }]];\n/**\n * @component @name Volume2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/volume-2\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"volume-2\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\" }], [\"line\", { \"x1\": \"22\", \"x2\": \"16\", \"y1\": \"9\", \"y2\": \"15\" }], [\"line\", { \"x1\": \"16\", \"x2\": \"22\", \"y1\": \"9\", \"y2\": \"15\" }]];\n/**\n * @component @name VolumeX\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/volume-x\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"volume-x\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72\" }], [\"path\", { \"d\": \"m14 7 3 3\" }], [\"path\", { \"d\": \"M5 6v4\" }], [\"path\", { \"d\": \"M19 14v4\" }], [\"path\", { \"d\": \"M10 2v2\" }], [\"path\", { \"d\": \"M7 8H3\" }], [\"path\", { \"d\": \"M21 16h-4\" }], [\"path\", { \"d\": \"M11 3H9\" }]];\n/**\n * @component @name WandSparkles\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/wand-sparkles\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"wand-sparkles\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","<script>/**\n * @license lucide-svelte v1.0.1 - ISC\n *\n * ISC License\n *\n * Copyright (c) 2026 Lucide Icons and Contributors\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * ---\n *\n * The following Lucide icons are derived from the Feather project:\n *\n * airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out\n *\n * The MIT License (MIT) (for the icons listed above)\n *\n * Copyright (c) 2013-present Cole Bemis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\nimport Icon from '../Icon.svelte';\nconst iconNode = [[\"path\", { \"d\": \"M18 6 6 18\" }], [\"path\", { \"d\": \"m6 6 12 12\" }]];\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-svelte - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {FunctionalComponent} Svelte component\n *\n */\n</script>\n\n<Icon name=\"x\" {...$$props} iconNode={iconNode}>\n <slot/>\n</Icon>\n","export interface AssetIdentity {\n width: number;\n height: number;\n size?: number;\n}\n\n/** Filename is the stable identity shared by local paths and browser uploads. */\nexport function assetFilename(path: string): string {\n const embeddedMarker = '#motionly-filename=';\n const embeddedIndex = path.lastIndexOf(embeddedMarker);\n if (embeddedIndex >= 0)\n return decode(path.slice(embeddedIndex + embeddedMarker.length));\n if (path.startsWith('data:')) return '';\n if (path.startsWith('motionly-local:')) {\n return decode(path.slice('motionly-local:'.length).split(/[?#]/, 1)[0] ?? '');\n }\n const clean = path.split(/[?#]/, 1)[0] ?? path;\n const filename = clean.split(/[\\\\/]/).pop() ?? '';\n return decode(filename);\n}\n\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nexport function tagEmbeddedAssetPath(dataUrl: string, filename: string): string {\n return `${dataUrl.split('#', 1)[0]}#motionly-filename=${encodeURIComponent(filename)}`;\n}\n\nexport function significantlyDifferentAsset(\n existing: AssetIdentity,\n replacement: AssetIdentity\n): boolean {\n const ratio = (a: number, b: number) => Math.max(a, b) / Math.max(1, Math.min(a, b));\n return (\n ratio(existing.width, replacement.width) > 1.5 ||\n ratio(existing.height, replacement.height) > 1.5 ||\n (!!existing.size && !!replacement.size && ratio(existing.size, replacement.size) > 2)\n );\n}\n","import type { Asset } from '../types/scene';\nimport { assetFilename } from '../assets/asset-resolution';\n\nexport const AI_SETTINGS_KEY = 'motionly.ai.settings.v1';\nexport const AI_HISTORY_KEY = 'motionly.ai.history.v1';\n\nexport type AiProvider =\n 'openai' | 'anthropic' | 'openrouter' | 'gemini' | 'huggingface' | 'custom';\n\nexport interface AiSettings {\n apiKey: string;\n provider: AiProvider;\n baseUrl: string;\n model: string;\n}\n\nexport interface AiMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n motion?: string;\n}\n\nconst SYSTEM_PROMPT = `Context:\nYou are Motionly Assistant inside a browser-based motion graphics editor. You cannot open repository files or links. The syntax contract below is the authoritative subset of AGENTS.md and the write-motionly skill. Motionly saves editable projects as plain .motion source.\n\nObjective:\nGiven the request, conversation, current project, and available assets, plan distinct shots and return one complete valid .motion project. When refining, update the full current project instead of returning a fragment. Use one focal subject per shot, deliberate exits, and restrained motion. Avoid accidental overlap, repeated fade-only scenes, and constant camera drift.\n\nMandatory syntax contract:\n- A project has one canvas block: canvas { ... }. Optional camera uses camera { ... }.\n- Import assets exactly as: import \"path\" as alias\n- Render an imported asset with its alias directly: alias { ... }\n- Text is: text name { ... }. Other built-in elements are only: overlay name { ... } and effect name { ... }.\n- NEVER write image name { ... }, asset name { ... }, video name { ... }, scene name { ... }, group name { ... }, rect name { ... }, or layer name { ... }. Those block types do not exist.\n- Explicit animations use a top-level animate TARGET block with nested from and to blocks, followed by duration, delay, and easing properties.\n- Put every block body on multiple lines and every property on its own line. Do not use JSON, CSS syntax, colons, semicolons, commas, arrays, or equals signs.\n- Quote text values and import paths. Names and aliases are single words without spaces.\n- Use size, never fontSize. Explicit animate blocks use easing. Preset option lists use ease.\n- Valid common properties: value, center, cover, x, y, width, height, scale, rotation, opacity, blur, brightness, contrast, saturation, hue, grayscale, sepia, invert, mask, maskInvert, maskVisible, shadow, size, weight, tracking, color, fill, layer, animation, textAnimation, backgroundEffect.\n- Valid layers: background, hero, supporting, content, details, text, effects.\n- Preserve asset aspect ratio by setting width OR height, not both.\n- Use only paths listed under Available local assets. Do not invent imports or placeholder paths.\n- Paths beginning motionly-local: are uploaded browser assets. Copy those paths and aliases exactly; Motionly restores their encoded bytes when loading.\n- Presets are string property values, for example: animation \"maskReveal(delay 1s duration 800ms direction down exitAt 5s exitDuration 450ms ease power3.out)\"\n- Text presets: keynoteText, wordReveal, charReveal, splitReveal, blurReveal, fadeUp, slideIn, scaleText, typewriter, maskReveal, gradientReveal.\n- Object and transition presets: softReveal, maskReveal, dynamicSlide, shapeWipe, irisWipe, drawSVG, sceneExit, scaleReveal. Use drawSVG only for simple stroked SVG artwork.\n- Camera presets go inside camera as cameraAnimation. Prefer slowPush, pan, pull, or one speedZoom at a meaningful transition.\n- Keyframes must be percentage blocks nested inside a keyframes block, which is nested inside animate TARGET.\n- Project audio is audio \"path\" { start 0s }. Keep it on the bottom audio track and preserve its start offset.\n- Persistent timeline rows use track NAME { ... }; imported media clips use clip ALIAS { track NAME start 0s duration 5s trimIn 0s trimOut 0s }.\n- Every visual track behaves as a simple layer: content types do not restrict placement, gaps/overlaps are allowed, and edits do not ripple neighboring clips.\n- Preserve existing track, start, duration, mask, and keyframe data unless the requested change requires editing it.\n\nMinimal valid example:\ncanvas {\n size 1920x1080\n fps 60\n duration 5s\n background #050608\n}\n\nimport \"/assets/logo.svg\" as logo\n\nlogo {\n center\n layer hero\n width 240\n opacity 0\n}\n\ntext title {\n value \"Make it move.\"\n center\n layer text\n y 180\n size 72\n color #ffffff\n opacity 1\n textAnimation \"keynoteText(split words stagger 80ms duration 750ms delay 1s ease power3.out)\"\n}\n\nanimate logo {\n from {\n opacity 0\n y 80\n }\n to {\n opacity 1\n y 0\n }\n duration 800ms\n delay 0s\n easing power3.out\n}\n\nBefore answering, silently verify balanced braces, one property per line, every imported visual uses alias { ... }, every animate target exists, no forbidden block keyword appears, required copy is exact, timing covers the complete canvas, and tracks/keyframes survive as editable source.\n\nStyle and tone:\nConcise, clean, helpful, and collaborative for users who may not know .motion syntax. Prefer power3.out and entrances around 650ms to 1s.\n\nResponse format:\nGive one short explanation, then exactly one fenced \\`\\`\\`motion code block containing the complete project. Do not emit any other fenced blocks.`;\n\nexport function detectProvider(key: string): Exclude<AiProvider, 'custom'> | null {\n const value = key.trim();\n if (value.startsWith('sk-ant-')) return 'anthropic';\n if (value.startsWith('sk-or-')) return 'openrouter';\n if (value.startsWith('AIza') || value.startsWith('AQ.')) return 'gemini';\n if (value.startsWith('hf_')) return 'huggingface';\n if (value.startsWith('sk-proj-') || value.startsWith('sk-')) return 'openai';\n return null;\n}\n\nexport function providerLabel(provider: AiProvider): string {\n return {\n openai: 'OpenAI',\n anthropic: 'Anthropic',\n openrouter: 'OpenRouter',\n gemini: 'Google Gemini',\n huggingface: 'Hugging Face',\n custom: 'Custom endpoint',\n }[provider];\n}\n\nexport function extractMotion(source: string): string | undefined {\n return /```motion\\s*([\\s\\S]*?)```/i.exec(source)?.[1]?.trim() || undefined;\n}\n\nexport function maskEmbeddedAssetPaths(source: string, assets: Asset[]): string {\n return replaceEmbeddedAssetPaths(\n source,\n assets,\n (asset) => `motionly-local:${encodeURIComponent(assetFilename(asset.path) || asset.name)}`\n );\n}\n\nexport function restoreEmbeddedAssetPaths(source: string, assets: Asset[]): string {\n for (const asset of assets.filter((item) => item.path.startsWith('data:'))) {\n const references = new Set([\n asset.name,\n encodeURIComponent(assetFilename(asset.path) || asset.name),\n ]);\n for (const reference of references) {\n source = source.replaceAll(`\"motionly-local:${reference}\"`, `\"${asset.path}\"`);\n }\n }\n return replaceEmbeddedAssetPaths(source, assets, (asset) => asset.path);\n}\n\nfunction replaceEmbeddedAssetPaths(\n source: string,\n assets: Asset[],\n pathFor: (asset: Asset) => string\n): string {\n for (const asset of assets.filter((item) => item.path.startsWith('data:'))) {\n const name = asset.name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n source = source.replace(\n new RegExp(`(import\\\\s+)\"[^\"\\\\n]*\"(\\\\s+as\\\\s+${name}(?=\\\\s|$))`, 'g'),\n (_, start: string, end: string) => `${start}\"${pathFor(asset)}\"${end}`\n );\n }\n return source;\n}\n\nexport function resolveChatEndpoint(baseUrl: string): string {\n const url = new URL(baseUrl);\n if (url.protocol !== 'https:' && url.protocol !== 'http:')\n throw new Error('Base URL must use http or https.');\n return /\\/chat\\/completions\\/?$/.test(url.pathname)\n ? url.href.replace(/\\/$/, '')\n : `${url.href.replace(/\\/$/, '')}/chat/completions`;\n}\n\nexport async function requestAssistant(\n settings: AiSettings,\n messages: AiMessage[],\n project: string,\n assets: Asset[],\n knowledge = ''\n): Promise<string> {\n const context = `${SYSTEM_PROMPT}\\n\\nCurrent project:\\n\\`\\`\\`motion\\n${maskEmbeddedAssetPaths(project, assets)}\\n\\`\\`\\`\\n\\nAvailable local assets:\\n${\n assets.length\n ? assets\n .map(\n (asset) =>\n `- ${asset.name}: ${asset.path.startsWith('data:') ? `motionly-local:${asset.name}` : asset.path} (${asset.type})`\n )\n .join('\\n')\n : '- None'\n }${knowledge.trim() ? `\\n\\n${knowledge.trim()}` : ''}`;\n return settings.provider === 'anthropic'\n ? requestAnthropic(settings, messages, context)\n : requestOpenAiCompatible(settings, messages, context);\n}\n\nasync function requestOpenAiCompatible(\n settings: AiSettings,\n messages: AiMessage[],\n system: string\n): Promise<string> {\n const endpoints: Record<Exclude<AiProvider, 'anthropic' | 'custom'>, string> = {\n openai: 'https://api.openai.com/v1/chat/completions',\n openrouter: 'https://openrouter.ai/api/v1/chat/completions',\n gemini: 'https://generativelanguage.googleapis.com/v1beta/openai/chat/completions',\n huggingface: 'https://router.huggingface.co/v1/chat/completions',\n };\n const models: Record<Exclude<AiProvider, 'anthropic' | 'custom'>, string> = {\n openai: 'gpt-5.4-mini',\n openrouter: 'openrouter/auto',\n gemini: 'gemini-2.5-flash',\n huggingface: 'openai/gpt-oss-120b:fastest',\n };\n const provider =\n settings.provider === 'openai' ||\n settings.provider === 'openrouter' ||\n settings.provider === 'gemini' ||\n settings.provider === 'huggingface'\n ? settings.provider\n : null;\n const endpoint = provider ? endpoints[provider] : resolveChatEndpoint(settings.baseUrl);\n const model = settings.model.trim() || (provider ? models[provider] : '');\n const request: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${settings.apiKey}`,\n 'Content-Type': 'application/json',\n ...(settings.provider === 'openrouter' ? { 'X-OpenRouter-Title': 'Motionly' } : {}),\n },\n body: JSON.stringify({\n ...(model ? { model } : {}),\n messages: [\n { role: 'system', content: system },\n ...messages.map(({ role, content }) => ({ role, content })),\n ],\n }),\n };\n let response = await fetch(endpoint, request);\n if (settings.provider === 'gemini' && response.status === 503) {\n await new Promise((resolve) => setTimeout(resolve, 800));\n response = await fetch(endpoint, request);\n }\n const raw = await response.text();\n let body: {\n error?: { message?: string } | string;\n message?: string;\n choices?: Array<{ message?: { content?: string } }>;\n } = {};\n try {\n body = JSON.parse(raw) as typeof body;\n } catch {\n body.message = raw;\n }\n if (!response.ok) {\n const fallback =\n settings.provider === 'gemini' && response.status === 503\n ? 'Google Gemini is temporarily unavailable (503). Try again shortly or switch providers.'\n : `Provider request failed (${response.status}).`;\n const detail = typeof body.error === 'string' ? body.error : body.error?.message;\n throw new Error(detail || body.message || fallback);\n }\n const content = body.choices?.[0]?.message?.content?.trim();\n if (!content) throw new Error('The provider returned an empty response.');\n return content;\n}\n\nasync function requestAnthropic(\n settings: AiSettings,\n messages: AiMessage[],\n system: string\n): Promise<string> {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'x-api-key': settings.apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-dangerous-direct-browser-access': 'true',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: settings.model.trim() || 'claude-sonnet-4-6',\n max_tokens: 8192,\n system,\n messages: messages.map(({ role, content }) => ({ role, content })),\n }),\n });\n const body = (await response.json()) as {\n error?: { message?: string };\n content?: Array<{ type?: string; text?: string }>;\n };\n if (!response.ok)\n throw new Error(body.error?.message || `Anthropic request failed (${response.status}).`);\n const content = body.content\n ?.filter((part) => part.type === 'text')\n .map((part) => part.text ?? '')\n .join('\\n')\n .trim();\n if (!content) throw new Error('Anthropic returned an empty response.');\n return content;\n}\n","<script lang=\"ts\">\n import { onMount } from 'svelte';\n import { ArrowRight, Eye, EyeOff } from 'lucide-svelte';\n import {\n AI_SETTINGS_KEY,\n detectProvider,\n resolveChatEndpoint,\n type AiProvider,\n type AiSettings,\n } from '../ai/chat';\n import { appUrl, ONBOARDING_COMPLETE_KEY } from '../app/routing';\n\n const logoUrl = appUrl('logo.svg');\n const githubIconUrl = appUrl('github.svg');\n const presetPreviewUrl = appUrl('preset/motionly/motionly-preset.gif');\n\n let step = 1;\n let apiKey = '';\n let provider: AiProvider = 'openai';\n let baseUrl = '';\n let model = '';\n let customEnabled = false;\n let showKey = false;\n let error = '';\n\n $: detectedProvider = detectProvider(apiKey);\n $: isKiroKey = apiKey.trim().startsWith('ksk_');\n\n onMount(() => {\n try {\n const stored = localStorage.getItem(AI_SETTINGS_KEY);\n if (!stored) return;\n const saved = JSON.parse(stored) as AiSettings;\n apiKey = saved.apiKey ?? '';\n provider = detectProvider(apiKey) ?? saved.provider ?? 'openai';\n baseUrl = saved.baseUrl ?? '';\n model = saved.model ?? '';\n customEnabled = provider === 'custom';\n } catch {\n error = 'Saved provider settings could not be read.';\n }\n });\n\n function handleKeyInput() {\n const detected = detectProvider(apiKey);\n if (!detected) return;\n if (provider !== detected) model = '';\n provider = detected;\n customEnabled = false;\n }\n\n function handleProviderChange(event: Event) {\n const next = (event.currentTarget as HTMLSelectElement).value as AiProvider;\n if (next !== provider) model = '';\n provider = next;\n customEnabled = provider === 'custom';\n }\n\n function toggleCustom(event: Event) {\n customEnabled = (event.currentTarget as HTMLInputElement).checked;\n provider = customEnabled ? 'custom' : detectedProvider ?? 'openai';\n }\n\n function continueWithKey() {\n error = '';\n if (!apiKey.trim()) {\n error = 'Paste an API key or skip this step for now.';\n return;\n }\n if (!detectedProvider && provider !== 'custom') {\n error = isKiroKey\n ? 'Kiro keys authenticate Kiro CLI, not a documented browser chat endpoint.'\n : 'Choose Custom endpoint for this key format.';\n return;\n }\n if (provider === 'custom') {\n try {\n resolveChatEndpoint(baseUrl);\n } catch (cause) {\n error = cause instanceof Error ? cause.message : 'Enter a valid Base URL.';\n return;\n }\n }\n localStorage.setItem(\n AI_SETTINGS_KEY,\n JSON.stringify({ apiKey: apiKey.trim(), provider, baseUrl: baseUrl.trim(), model: model.trim() } satisfies AiSettings)\n );\n step = 3;\n }\n\n function finish() {\n localStorage.setItem(ONBOARDING_COMPLETE_KEY, 'true');\n window.location.assign(appUrl('editor'));\n }\n</script>\n\n<main class=\"onboarding\">\n <div class=\"brand\"><img src={logoUrl} alt=\"\" /><span>Motionly</span></div>\n\n <section class=\"step-card\" aria-live=\"polite\">\n <div class=\"progress\" aria-label={`Step ${step} of 5`}>\n <span>Step {step} of 5</span>\n <div class=\"dots\">\n {#each [1, 2, 3, 4, 5] as item}\n <i class:active={item === step} class:complete={item < step}></i>\n {/each}\n </div>\n </div>\n\n {#key step}\n <div class=\"step-content\">\n {#if step === 1}\n <div class=\"title-row\"><h1>Welcome to Motionly</h1><span class=\"beta\">Beta</span></div>\n <p class=\"notice\">We're early in beta—you may run into bugs or rough edges. Thanks for being here while we sort them out.</p>\n <p>Motionly is an AI-native motion graphics editor where AI-assisted workflows create editable animation projects that you can refine visually. Edit timing, assets, animations, and layouts through a timeline and canvas editor before exporting the final result.</p>\n <p>Underneath, every project is a plain, readable <code>.motion</code> file. What AI makes is a starting point you can actually direct.</p>\n <div class=\"actions end\"><button class=\"primary\" type=\"button\" on:click={() => step = 2}>Continue <ArrowRight size={15} /></button></div>\n {:else if step === 2}\n <h1>Connect your AI provider</h1>\n <p>AI features are Bring Your Own Key (BYOK). Motionly does not host or proxy AI requests; your browser sends prompts directly to your chosen provider.</p>\n\n <div class=\"field\">\n <label for=\"welcome-api-key\">API key</label>\n <div class=\"key-field\">\n <input id=\"welcome-api-key\" type={showKey ? 'text' : 'password'} bind:value={apiKey} on:input={handleKeyInput} placeholder=\"Paste API key\" autocomplete=\"off\" />\n <button type=\"button\" on:click={() => showKey = !showKey} title={showKey ? 'Hide key' : 'Show key'}>{#if showKey}<EyeOff size={15} />{:else}<Eye size={15} />{/if}</button>\n </div>\n </div>\n\n {#if apiKey.trim()}\n {#if detectedProvider || customEnabled}\n <select class=\"provider-chip\" value={provider} on:change={handleProviderChange} aria-label=\"AI provider\">\n <option value=\"openai\">OpenAI</option>\n <option value=\"anthropic\">Anthropic</option>\n <option value=\"openrouter\">OpenRouter</option>\n <option value=\"gemini\">Google Gemini</option>\n <option value=\"huggingface\">Hugging Face</option>\n <option value=\"custom\">Custom endpoint</option>\n </select>\n {:else}\n <label class=\"custom-toggle\"><input type=\"checkbox\" checked={customEnabled} on:change={toggleCustom} /> Custom endpoint</label>\n {/if}\n {/if}\n\n {#if isKiroKey}<p class=\"warning\">Kiro keys work with Kiro CLI, not a documented browser chat endpoint. Use another provider or a compatible custom gateway.</p>{/if}\n\n {#if customEnabled}\n <div class=\"field\"><label for=\"welcome-base-url\">Base URL</label><input id=\"welcome-base-url\" bind:value={baseUrl} placeholder=\"http://localhost:11434/v1\" /></div>\n {/if}\n {#if apiKey.trim() && (detectedProvider || customEnabled)}\n <div class=\"field\"><label for=\"welcome-model\">Model <span>(optional)</span></label><input id=\"welcome-model\" bind:value={model} placeholder=\"Exact model ID\" /><small>Leave blank to use Motionly's default for this provider.</small></div>\n {/if}\n\n <p class=\"privacy\">Your key is stored locally in your browser and never sent to our servers.</p>\n {#if error}<p class=\"error\">{error}</p>{/if}\n <div class=\"actions split\"><button class=\"text-button\" type=\"button\" on:click={() => step = 1}>Back</button><button class=\"primary\" type=\"button\" on:click={continueWithKey}>Continue <ArrowRight size={15} /></button></div>\n <button class=\"skip\" type=\"button\" on:click={() => step = 3}>Skip for now</button>\n <small class=\"skip-note\">You can always add this later from the AI Assistant panel in the editor.</small>\n {:else if step === 3}\n <h1>Start with one solid preset</h1>\n <p>Motionly currently ships with one preset to explore while the editor is in beta. More purposeful presets are coming.</p>\n <div class=\"preset\"><img src={presetPreviewUrl} alt=\"Motionly preset preview\" /><div><strong>Motionly</strong><span>A complete editable project to inspect, remix, and learn from.</span></div></div>\n <div class=\"loop\"><span>Describe or choose a preset</span><ArrowRight size={14} /><span>Get editable `.motion`</span><ArrowRight size={14} /><span>Refine visually</span><ArrowRight size={14} /><span>Export</span></div>\n <div class=\"actions split\"><button class=\"text-button\" type=\"button\" on:click={() => step = 2}>Back</button><button class=\"primary\" type=\"button\" on:click={() => step = 4}>Continue <ArrowRight size={15} /></button></div>\n {:else if step === 4}\n <img class=\"hero-icon\" src={githubIconUrl} alt=\"\" />\n <h1>Build Motionly with us</h1>\n <p>Motionly is open source. Follow progress, report rough edges, contribute directly on GitHub, or support the launch on Product Hunt.</p>\n <div class=\"community-links\">\n <a class=\"community-link\" href=\"https://github.com/COPPSARY/Motionly\" target=\"_blank\" rel=\"noreferrer\"><img src={githubIconUrl} alt=\"\" /> Contribute on GitHub</a>\n <a\n class=\"product-hunt-badge\"\n href=\"https://www.producthunt.com/products/motionly?embed=true&utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-motionly\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"View Motionly on Product Hunt\"\n >\n <img\n alt=\"Motionly - Motionly is an AI-native motion graphics editor. | Product Hunt\"\n width=\"250\"\n height=\"54\"\n src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1197499&theme=dark&t=1784188075155\"\n />\n </a>\n </div>\n <div class=\"actions split\"><button class=\"text-button\" type=\"button\" on:click={() => step = 3}>Back</button><button class=\"primary\" type=\"button\" on:click={() => step = 5}>Continue <ArrowRight size={15} /></button></div>\n {:else}\n <img class=\"final-logo\" src={logoUrl} alt=\"\" />\n <h1>Ready when you are.</h1>\n <p>Start from the preset, describe an idea to the Assistant, or build visually from scratch.</p>\n <button class=\"primary final\" type=\"button\" on:click={finish}>Let's create something together <ArrowRight size={15} /></button>\n {/if}\n </div>\n {/key}\n </section>\n</main>\n\n<style>\n :global(html), :global(body) { width: 100%; height: 100%; margin: 0; overflow: hidden; background: #0b0c0e; }\n :global(body) { font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; }\n * { box-sizing: border-box; }\n .onboarding { width: 100%; height: 100dvh; overflow: auto; display: grid; place-items: center; padding: 72px 24px 32px; color: #e4e6ea; background: linear-gradient(90deg, rgba(255,255,255,.026) 1px, transparent 1px), linear-gradient(rgba(255,255,255,.026) 1px, transparent 1px), #0b0c0e; background-size: 32px 32px; }\n .brand { position: fixed; top: 20px; left: 24px; display: flex; align-items: center; gap: 9px; color: #f2f3f5; font-size: 14px; font-weight: 650; }\n .brand img { width: 28px; height: 28px; border-radius: 7px; }\n .step-card { width: min(640px, 100%); min-height: 520px; display: flex; flex-direction: column; padding: 22px 26px 26px; border: 1px solid #292c31; border-radius: 14px; background: rgba(15,16,18,.96); box-shadow: 0 24px 70px rgba(0,0,0,.42); }\n .progress { display: flex; align-items: center; justify-content: space-between; padding-bottom: 18px; border-bottom: 1px solid #22252a; color: #686e77; font-size: 10px; text-transform: uppercase; letter-spacing: .08em; }\n .dots { display: flex; gap: 6px; }\n .dots i { width: 6px; height: 6px; border-radius: 999px; background: #33373d; }\n .dots i.active { width: 18px; background: #7cf7c5; }\n .dots i.complete { background: #477565; }\n .step-content { flex: 1; display: flex; flex-direction: column; justify-content: center; gap: 14px; padding: 26px 16px 4px; animation: enter .2s ease-out; }\n @keyframes enter { from { opacity: 0; transform: translateY(5px); } }\n h1 { margin: 0; color: #f3f4f6; font-size: clamp(24px, 4vw, 34px); line-height: 1.12; letter-spacing: -.025em; }\n p { margin: 0; color: #9ca1aa; font-size: 14px; line-height: 1.65; }\n code { color: #b8e9d7; font: 12px ui-monospace, SFMono-Regular, Menlo, monospace; }\n .title-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }\n .beta { padding: 4px 8px; border: 1px solid #426e5e; border-radius: 999px; background: #17251f; color: #8ff0ca; font-size: 10px; font-weight: 700; text-transform: uppercase; }\n .notice { padding: 10px 12px; border-left: 2px solid #6bc9a8; background: #151a18; color: #aeb5b0; font-size: 12px; }\n .field { display: flex; flex-direction: column; gap: 7px; }\n .field label { color: #c5c9cf; font-size: 11px; font-weight: 600; }\n .field label span, .field small { color: #686e77; font-weight: 400; font-size: 10px; }\n input, select { width: 100%; height: 38px; padding: 0 11px; border: 1px solid #2d3137; border-radius: 7px; outline: none; background: #17191c; color: #e4e6ea; font: inherit; font-size: 12px; }\n input:focus, select:focus { border-color: #477565; }\n .key-field { position: relative; }\n .key-field input { padding-right: 42px; }\n .key-field button { position: absolute; top: 4px; right: 4px; width: 30px; height: 30px; display: grid; place-items: center; padding: 0; border: 0; background: transparent; color: #8e939b; cursor: pointer; }\n .provider-chip { width: auto; max-width: 220px; border-color: #355e4f; border-radius: 999px; color: #9af8d1; }\n .custom-toggle { display: flex; align-items: center; gap: 8px; color: #b6bac1; font-size: 12px; }\n .custom-toggle input { width: 14px; height: 14px; accent-color: #7cf7c5; }\n .privacy, .skip-note { color: #6e747d; font-size: 11px; }\n .warning, .error { padding: 9px 10px; border-radius: 7px; font-size: 11px; line-height: 1.45; }\n .warning { border: 1px solid #55452b; background: #241f17; color: #d9bd85; }\n .error { border: 1px solid #5c3030; background: #251919; color: #eea2a2; }\n .actions { display: flex; align-items: center; margin-top: auto; padding-top: 16px; }\n .actions.end { justify-content: flex-end; }\n .actions.split { justify-content: space-between; }\n button, .community-link { font: inherit; }\n button.primary, .community-link { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 38px; padding: 0 15px; border: 1px solid #4d8c75; border-radius: 7px; background: #1a3b30; color: #a4f8d5; font-size: 12px; font-weight: 650; cursor: pointer; text-decoration: none; }\n button.primary:hover, .community-link:hover { background: #214a3d; }\n .text-button, .skip { border: 0; background: transparent; color: #8e939b; font-size: 12px; cursor: pointer; }\n .skip { align-self: center; margin-top: 4px; text-decoration: underline; text-underline-offset: 3px; }\n .skip-note { align-self: center; text-align: center; }\n .preset { display: grid; grid-template-columns: 180px 1fr; gap: 16px; align-items: center; padding: 12px; border: 1px solid #292d32; border-radius: 10px; background: #131518; }\n .preset img { width: 100%; aspect-ratio: 16/9; object-fit: cover; border-radius: 6px; background: #070809; }\n .preset div { display: flex; flex-direction: column; gap: 6px; }\n .preset strong { font-size: 13px; }\n .preset span { color: #858b94; font-size: 11px; line-height: 1.45; }\n .loop { display: flex; align-items: center; justify-content: center; gap: 8px; flex-wrap: wrap; padding: 12px; color: #727982; font-size: 10px; text-align: center; }\n .loop span { color: #aeb3ba; }\n .hero-icon { width: 30px; height: 30px; }\n .community-links { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; align-self: flex-start; }\n .community-link img { width: 17px; height: 17px; }\n .product-hunt-badge { display: inline-flex; flex: 0 0 auto; overflow: hidden; border-radius: 7px; line-height: 0; }\n .product-hunt-badge img { display: block; width: 250px; height: 54px; }\n .final-logo { width: 56px; height: 56px; align-self: center; border-radius: 13px; }\n .final-logo + h1, .final-logo + h1 + p { text-align: center; }\n button.final { align-self: center; margin-top: 14px; }\n @media (max-width: 600px) { .onboarding { padding: 64px 12px 12px; } .brand { left: 16px; top: 16px; } .step-card { min-height: calc(100dvh - 76px); padding: 18px 14px; } .step-content { padding: 22px 4px 2px; } .preset { grid-template-columns: 1fr; } }\n</style>\n","/**\n * AST node factory functions for .motion language\n */\n\nimport type {\n ProgramNode,\n CanvasNode,\n ImportNode,\n CameraNode,\n ElementNode,\n AnimationNode,\n SequenceNode,\n TrackNode,\n ASTNode,\n KeyframeNode,\n} from '../types/parser';\n\n/**\n * Create program root node\n */\nexport function createProgram(body: ASTNode[]): ProgramNode {\n return { type: 'Program', body };\n}\n\n/**\n * Create canvas configuration node\n */\nexport function createCanvas(properties: Record<string, unknown>): CanvasNode {\n return { type: 'Canvas', properties };\n}\n\n/**\n * Create import statement node\n */\nexport function createImport(path: string, name: string): ImportNode {\n return { type: 'Import', path, name };\n}\n\n/**\n * Create camera configuration node\n */\nexport function createCamera(properties: Record<string, unknown>): CameraNode {\n return { type: 'Camera', properties };\n}\n\n/**\n * Create element declaration node\n */\nexport function createElement(\n kind: string,\n name: string,\n properties: Record<string, unknown>\n): ElementNode {\n return { type: 'Element', kind, name, properties };\n}\n\n/**\n * Create animation definition node\n */\nexport function createAnimation(\n target: string,\n body: {\n from?: Record<string, unknown>;\n to?: Record<string, unknown>;\n keyframes?: KeyframeNode[];\n delay?: number | string;\n duration?: number | string;\n easing?: string;\n sequence?: string;\n }\n): AnimationNode {\n return { type: 'Animation', target, ...body };\n}\n\n/**\n * Create sequence definition node\n */\nexport function createSequence(name: string, properties: Record<string, unknown>): SequenceNode {\n return { type: 'Sequence', name, properties };\n}\n\nexport function createTrack(name: string, properties: Record<string, unknown>): TrackNode {\n return { type: 'Track', name, properties };\n}\n","/**\n * Tokenizer for .motion language\n * Converts source code into a stream of tokens\n */\n\nimport type { Token, TokenType } from '../types/parser';\n\n/**\n * Tokenize .motion source code\n */\nexport function tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n let line = 1;\n let column = 1;\n\n while (index < source.length) {\n const char = source[index];\n\n // Newlines\n if (char === '\\n') {\n tokens.push(createToken('Newline', '\\n', line, column));\n index += 1;\n line += 1;\n column = 1;\n continue;\n }\n\n // Whitespace\n if (/\\s/.test(char!)) {\n index += 1;\n column += 1;\n continue;\n }\n\n // Comments\n if (char === '/' && source[index + 1] === '/') {\n while (index < source.length && source[index] !== '\\n') {\n index += 1;\n column += 1;\n }\n continue;\n }\n\n // Braces\n if (char === '{' || char === '}') {\n const type: TokenType = char === '{' ? 'LeftBrace' : 'RightBrace';\n tokens.push(createToken(type, char, line, column));\n index += 1;\n column += 1;\n continue;\n }\n\n // Strings\n if (char === '\"') {\n const startColumn = column;\n let value = '';\n index += 1;\n column += 1;\n\n while (index < source.length && source[index] !== '\"') {\n if (source[index] === '\\\\' && index + 1 < source.length) {\n const escaped = source[index + 1];\n value += escaped === 'n' ? '\\n' : escaped;\n index += 2;\n column += 2;\n continue;\n }\n value += source[index];\n index += 1;\n column += 1;\n }\n\n if (source[index] !== '\"') {\n throw new Error(`Unterminated string at ${line}:${startColumn}`);\n }\n\n index += 1;\n column += 1;\n tokens.push(createToken('String', value, line, startColumn));\n continue;\n }\n\n // Words and numbers\n const startColumn = column;\n let value = '';\n\n while (\n index < source.length &&\n !/\\s/.test(source[index]!) &&\n source[index] !== '{' &&\n source[index] !== '}'\n ) {\n value += source[index];\n index += 1;\n column += 1;\n }\n\n tokens.push(createToken('Word', value, line, startColumn));\n }\n\n tokens.push(createToken('EOF', '', line, column));\n return tokens;\n}\n\n/**\n * Create a token\n */\nfunction createToken(type: TokenType, value: string, line: number, column: number): Token {\n return { type, value, line, column };\n}\n","/**\n * Parser for .motion language\n * Converts tokens into an Abstract Syntax Tree (AST)\n */\n\nimport {\n createAnimation,\n createCamera,\n createCanvas,\n createElement,\n createImport,\n createProgram,\n createSequence,\n createTrack,\n} from './ast';\nimport { tokenize } from './tokenizer';\nimport type {\n Token,\n ProgramNode,\n ASTNode,\n ParseError,\n KeyframeNode,\n AnimationNode,\n} from '../types/parser';\n\nconst ELEMENT_KINDS = new Set(['image', 'text', 'overlay', 'effect']);\nconst PROPERTY_NAMES = new Set([\n 'background',\n 'backgroundEffect',\n 'blur',\n 'brightness',\n 'contrast',\n 'saturation',\n 'hue',\n 'grayscale',\n 'sepia',\n 'invert',\n 'mask',\n 'maskInvert',\n 'maskVisible',\n 'center',\n 'clip',\n 'color',\n 'cover',\n 'fill',\n 'effect',\n 'font',\n 'fps',\n 'height',\n 'gridSize',\n 'gridThickness',\n 'layer',\n 'animation',\n 'cameraAnimation',\n 'textAnimation',\n 'opacity',\n 'parent',\n 'path',\n 'pathProgress',\n 'revealProgress',\n 'offset',\n 'intensity',\n 'rotation',\n 'radius',\n 'radiusX',\n 'radiusY',\n 'scale',\n 'skewX',\n 'skewY',\n 'shadow',\n 'size',\n 'shape',\n 'source',\n 'stroke',\n 'strokeWidth',\n 'tracking',\n 'track',\n 'role',\n 'content',\n 'label',\n 'hidden',\n 'muted',\n 'order',\n 'start',\n 'duration',\n 'trimIn',\n 'trimOut',\n 'volume',\n 'mute',\n 'transitionIn',\n 'transitionInDuration',\n 'transitionOut',\n 'transitionOutDuration',\n 'value',\n 'weight',\n 'width',\n 'x',\n 'x2',\n 'y',\n 'y2',\n 'zoom',\n]);\n\n/**\n * Parse .motion source code into AST\n */\nexport function parseMotion(source: string): ProgramNode {\n return new Parser(tokenize(source)).parseProgram();\n}\n\n/**\n * Parser class that maintains parsing state\n */\nclass Parser {\n private tokens: Token[];\n private index: number;\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n this.index = 0;\n }\n\n /**\n * Parse the root program node\n */\n parseProgram(): ProgramNode {\n const body: ASTNode[] = [];\n\n while (!this.check('EOF')) {\n this.skipNewlines();\n if (this.check('EOF')) break;\n body.push(this.parseStatement());\n }\n\n return createProgram(body);\n }\n\n /**\n * Parse a top-level statement\n */\n parseStatement(): ASTNode {\n const current = this.peek();\n\n if (this.matchWord('canvas')) {\n return createCanvas(this.parseBlockProperties());\n }\n\n if (this.matchWord('camera')) {\n return createCamera(this.parseBlockProperties());\n }\n\n if (this.matchWord('audio')) {\n const path = this.consume('String', 'Expected audio path').value;\n this.skipNewlines();\n const properties = this.check('LeftBrace') ? this.parseBlockProperties() : {};\n return { type: 'Audio', path, properties } as import('../types/parser').AudioNode;\n }\n\n if (\n current.type === 'Word' &&\n current.value === 'track' &&\n this.tokens[this.index + 1]?.type === 'Word'\n ) {\n this.advance();\n const name = this.consume('Word', 'Expected track name').value;\n return createTrack(name, this.parseBlockProperties());\n }\n\n if (this.matchWord('clip')) {\n const assetName = this.consume('Word', 'Expected clip asset name').value;\n return {\n type: 'Clip',\n assetName,\n properties: this.parseBlockProperties(),\n } as import('../types/parser').ClipNode;\n }\n\n if (this.matchWord('sequence')) {\n const name = this.consume('Word', 'Expected sequence name').value;\n return createSequence(name, this.parseBlockProperties());\n }\n\n if (this.matchWord('import')) {\n const path = this.consume('String', 'Expected import path').value;\n this.consumeWord('as', 'Expected \"as\" in import');\n const name = this.consume('Word', 'Expected import alias').value;\n this.skipNewlines();\n return createImport(path, name);\n }\n\n if (this.matchWord('animate')) {\n const target = this.consume('Word', 'Expected animation target').value;\n return createAnimation(target, this.parseAnimationBody());\n }\n\n if (current.type === 'Word') {\n const first = this.advance().value;\n\n if (ELEMENT_KINDS.has(first) && this.check('Word')) {\n const name = this.consume('Word', `Expected ${first} name`).value;\n return createElement(first, name, this.parseBlockProperties());\n }\n\n return createElement('asset', first, this.parseBlockProperties());\n }\n\n throw this.error(current, `Unexpected token \"${current.value}\"`);\n }\n\n /**\n * Parse animation body with from, to, keyframes, etc.\n */\n parseAnimationBody(): Omit<AnimationNode, 'type' | 'target'> {\n this.consume('LeftBrace', 'Expected animation block');\n\n const body: Omit<AnimationNode, 'type' | 'target'> = {\n from: {},\n to: {},\n keyframes: [],\n delay: 0,\n duration: 1,\n easing: 'soft',\n };\n\n while (!this.check('RightBrace') && !this.check('EOF')) {\n this.skipNewlines();\n if (this.check('RightBrace')) break;\n\n if (this.matchWord('from')) {\n body.from = this.parseBlockProperties();\n continue;\n }\n\n if (this.matchWord('to')) {\n body.to = this.parseBlockProperties();\n continue;\n }\n\n if (this.matchWord('keyframes')) {\n body.keyframes = this.parseKeyframes();\n continue;\n }\n\n const key = this.consume('Word', 'Expected animation property').value;\n const values = this.collectLineValues();\n (body as Record<string, unknown>)[key] = values.join(' ');\n }\n\n this.consume('RightBrace', 'Expected end of animation block');\n this.skipNewlines();\n\n return body;\n }\n\n /**\n * Parse keyframes block\n */\n parseKeyframes(): KeyframeNode[] {\n this.consume('LeftBrace', 'Expected keyframes block');\n const frames: KeyframeNode[] = [];\n\n while (!this.check('RightBrace') && !this.check('EOF')) {\n this.skipNewlines();\n if (this.check('RightBrace')) break;\n\n const offsetToken = this.consume('Word', 'Expected keyframe offset');\n const offset = offsetToken.value.endsWith('%')\n ? Number.parseFloat(offsetToken.value) / 100\n : Number.parseFloat(offsetToken.value);\n\n const properties = this.parseBlockProperties();\n // A per-keyframe `ease`/`easing` controls the transition into this frame.\n const easingValue =\n typeof properties['ease'] === 'string'\n ? (properties['ease'] as string)\n : typeof properties['easing'] === 'string'\n ? (properties['easing'] as string)\n : undefined;\n delete properties['ease'];\n delete properties['easing'];\n\n frames.push({\n offset,\n properties,\n ...(easingValue ? { easing: easingValue } : {}),\n });\n }\n\n this.consume('RightBrace', 'Expected end of keyframes block');\n return frames.sort((a, b) => a.offset - b.offset);\n }\n\n /**\n * Parse block properties inside braces\n */\n parseBlockProperties(): Record<string, unknown> {\n this.consume('LeftBrace', 'Expected block');\n const properties: Record<string, unknown> = {};\n\n while (!this.check('RightBrace') && !this.check('EOF')) {\n this.skipNewlines();\n if (this.check('RightBrace')) break;\n\n const key = this.consume('Word', 'Expected property name').value;\n\n // Bare boolean properties serialize without an explicit `true` value.\n if (\n [\n 'center',\n 'cover',\n 'clip',\n 'maskInvert',\n 'maskVisible',\n 'mute',\n 'hidden',\n 'muted',\n ].includes(key) &&\n (this.check('Newline') || this.check('RightBrace'))\n ) {\n properties[key] = true;\n this.skipNewlines();\n continue;\n }\n\n // Check if we should stop at property names\n const compactValues = ![\n 'animation',\n 'textAnimation',\n 'cameraAnimation',\n 'backgroundEffect',\n ].includes(key);\n properties[key] = this.collectLineValues({ stopAtPropertyName: compactValues }).join(' ');\n }\n\n this.consume('RightBrace', 'Expected end of block');\n this.skipNewlines();\n\n return properties;\n }\n\n /**\n * Collect values on a single line\n */\n collectLineValues(options: { stopAtPropertyName?: boolean } = {}): string[] {\n const values: string[] = [];\n\n while (!this.check('Newline') && !this.check('RightBrace') && !this.check('EOF')) {\n if (\n options.stopAtPropertyName &&\n values.length > 0 &&\n this.check('Word') &&\n PROPERTY_NAMES.has(this.peek().value)\n ) {\n break;\n }\n values.push(this.advance().value);\n }\n\n this.skipNewlines();\n return values;\n }\n\n /**\n * Skip newline tokens\n */\n skipNewlines(): void {\n while (this.check('Newline')) {\n this.advance();\n }\n }\n\n /**\n * Try to match and consume a token type\n */\n match(type: string): boolean {\n if (!this.check(type)) return false;\n this.advance();\n return true;\n }\n\n /**\n * Try to match and consume a specific word\n */\n matchWord(value: string): boolean {\n if (!this.check('Word') || this.peek().value !== value) return false;\n this.advance();\n return true;\n }\n\n /**\n * Consume a token of a specific type or throw error\n */\n consume(type: string, message: string): Token {\n if (this.check(type)) return this.advance();\n throw this.error(this.peek(), message);\n }\n\n /**\n * Consume a specific word or throw error\n */\n consumeWord(value: string, message: string): Token {\n if (this.check('Word') && this.peek().value === value) {\n return this.advance();\n }\n throw this.error(this.peek(), message);\n }\n\n /**\n * Check if current token is of a specific type\n */\n check(type: string): boolean {\n return this.peek().type === type;\n }\n\n /**\n * Advance to next token and return current\n */\n advance(): Token {\n const token = this.tokens[this.index];\n if (token) {\n this.index++;\n return token;\n }\n // Return EOF token if we're at the end\n return this.tokens[this.tokens.length - 1]!;\n }\n\n /**\n * Peek at current token without advancing\n */\n peek(): Token {\n const token = this.tokens[this.index];\n if (!token) {\n // Return EOF token if we're at the end\n return this.tokens[this.tokens.length - 1]!;\n }\n return token;\n }\n\n /**\n * Create parse error with location info\n */\n error(token: Token, message: string): ParseError {\n const error = new Error(`${message} at ${token.line}:${token.column}`) as ParseError;\n error.line = token.line;\n error.column = token.column;\n error.token = token;\n return error;\n }\n}\n","/**\n * Color parsing and normalization utilities\n */\n\n/**\n * Normalize color parts into a single string\n */\nexport function normalizeColor(parts: string[]): string {\n return parts.join(' ');\n}\n\n/**\n * Parse color value to normalized string\n * Supports: hex (#fff, #ffffff), rgb(), rgba()\n */\nexport function parseColor(value: string | number): string {\n return String(value).trim();\n}\n","/**\n * Unit parsing and conversion utilities\n */\n\nimport type { Size } from '../types/utils';\n\n/**\n * Parse time value from string to seconds\n * Supports: \"1s\", \"500ms\", or raw numbers\n */\nexport function parseTime(value: string | number): number {\n const text = String(value).trim();\n if (text.endsWith('ms')) return Number.parseFloat(text) / 1000;\n if (text.endsWith('s')) return Number.parseFloat(text);\n return Number.parseFloat(text);\n}\n\n/**\n * Parse size string into width and height\n * Format: \"1920x1080\"\n */\nexport function parseSize(value: string): Size {\n const match = String(value)\n .trim()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*x\\s*(\\d+(?:\\.\\d+)?)$/);\n if (!match) throw new Error(`Invalid size \"${value}\"`);\n return { width: Number(match[1]), height: Number(match[2]) };\n}\n\n/**\n * Parse scalar value (number, boolean, or string)\n */\nexport function parseScalar(value: unknown): string | number | boolean {\n if (typeof value === 'number') return value;\n const text = String(value).trim();\n if (text === 'true') return true;\n if (text === 'false') return false;\n const numeric = Number(text);\n return Number.isNaN(numeric) ? text : numeric;\n}\n\n/**\n * Clamp value between min and max\n */\nexport function clamp(value: number, min = 0, max = 1): number {\n return Math.min(max, Math.max(min, value));\n}\n","/**\n * Property normalization utilities for scene elements\n */\n\nimport { parseColor } from '../core/color';\nimport { parseScalar, parseSize, parseTime } from '../core/units';\nimport type {\n Canvas,\n Camera,\n ElementProperties,\n PropertyMap,\n ElementKind,\n BaseElementProperties,\n TextProperties,\n ImageProperties,\n OverlayProperties,\n EffectProperties,\n} from '../types/scene';\n\nconst TIME_PROPERTIES = new Set([\n 'duration',\n 'delay',\n 'start',\n 'trimIn',\n 'trimOut',\n 'transitionInDuration',\n 'transitionOutDuration',\n]);\nconst NUMBER_PROPERTIES = new Set([\n 'x',\n 'y',\n 'width',\n 'height',\n 'scale',\n 'skewX',\n 'skewY',\n 'rotation',\n 'opacity',\n 'pathProgress',\n 'revealProgress',\n 'blur',\n 'brightness',\n 'contrast',\n 'saturation',\n 'hue',\n 'grayscale',\n 'sepia',\n 'invert',\n 'shadow',\n 'size',\n 'intensity',\n 'offset',\n 'overscan',\n 'radius',\n 'radiusX',\n 'radiusY',\n 'weight',\n 'tracking',\n 'strokeWidth',\n 'x2',\n 'y2',\n 'zoom',\n]);\nconst COLOR_PROPERTIES = new Set(['background', 'color', 'fill', 'stroke']);\n\n/**\n * Normalize canvas configuration from AST properties\n */\nexport function normalizeCanvas(properties: Record<string, unknown>): Canvas {\n const size = properties['size']\n ? parseSize(String(properties['size']))\n : { width: 1920, height: 1080 };\n return {\n width: size.width,\n height: size.height,\n fps: Number(properties['fps'] ?? 60),\n duration: properties['duration'] ? parseTime(properties['duration'] as string | number) : 5,\n background: properties['background']\n ? parseColor(properties['background'] as string | number)\n : '#000',\n };\n}\n\n/**\n * Normalize camera properties from AST\n */\nexport function normalizeCamera(properties: Record<string, unknown> = {}): Camera {\n return {\n x: Number.parseFloat(String(properties['x'] ?? 0)),\n y: Number.parseFloat(String(properties['y'] ?? 0)),\n zoom: Number.parseFloat(String(properties['zoom'] ?? 1)),\n rotation: Number.parseFloat(String(properties['rotation'] ?? 0)),\n };\n}\n\n/**\n * Normalize all properties in an object\n */\nexport function normalizeProperties(properties: Record<string, unknown>): PropertyMap {\n const normalized: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(properties)) {\n normalized[key] = normalizeProperty(key, value);\n }\n return normalized as unknown as PropertyMap;\n}\n\n/**\n * Normalize a single property value based on its key\n */\nexport function normalizeProperty(key: string, value: unknown): string | number | boolean {\n if (TIME_PROPERTIES.has(key)) return parseTime(value as string | number);\n if (NUMBER_PROPERTIES.has(key)) return Number.parseFloat(String(value));\n if (COLOR_PROPERTIES.has(key)) return parseColor(value as string | number);\n return parseScalar(value);\n}\n\n/**\n * Get default properties for an element kind\n */\nexport function defaultElementProperties(kind: ElementKind): ElementProperties {\n const common: BaseElementProperties = {\n x: 0,\n y: 0,\n width: null,\n height: null,\n scale: 1,\n rotation: 0,\n opacity: 1,\n blur: 0,\n brightness: 1,\n contrast: 1,\n saturation: 1,\n hue: 0,\n grayscale: 0,\n sepia: 0,\n invert: 0,\n shadow: 0,\n layer: 'content',\n center: false,\n cover: false,\n };\n\n if (kind === 'text') {\n return {\n ...common,\n value: '',\n font: 'Inter, SF Pro Display, Segoe UI, Arial, sans-serif',\n size: 64,\n weight: 600,\n color: '#fff',\n tracking: 0,\n } as TextProperties;\n }\n\n if (kind === 'image') {\n return {\n ...common,\n source: '',\n } as ImageProperties;\n }\n\n if (kind === 'overlay') {\n return {\n ...common,\n parent: '',\n shape: 'rect',\n fill: '#000',\n stroke: 'none',\n strokeWidth: 4,\n radius: 48,\n radiusX: 48,\n radiusY: 48,\n x2: 0,\n y2: 0,\n path: '',\n value: '',\n font: 'Inter, SF Pro Display, Segoe UI, Arial, sans-serif',\n size: 48,\n weight: 700,\n clip: false,\n opacity: 0,\n layer: 'effects',\n } as OverlayProperties;\n }\n\n if (kind === 'effect') {\n return {\n ...common,\n effect: 'gradientMotion',\n opacity: 0,\n offset: 0,\n intensity: 1,\n layer: 'background',\n } as EffectProperties;\n }\n\n return common;\n}\n","/**\n * Animation preset parser\n * Parses preset calls from .motion syntax like \"heroLogo(delay 1s duration 2s)\"\n */\n\nimport { parseTime } from '../core/units';\nimport type { PresetCall, PresetOptions } from '../types/presets';\n\n/**\n * Parse preset call from string value\n * Format: \"presetName(option1 value1, option2 value2)\"\n */\nexport function parsePresetCall(value: string | number | unknown): PresetCall {\n const text = String(value ?? '').trim();\n const match = text.match(/^([A-Za-z][\\w-]*)(?:\\((.*)\\))?$/);\n\n if (!match) {\n return { name: text, options: {} };\n }\n\n return {\n name: match[1]!,\n options: parseOptions(match[2] ?? ''),\n };\n}\n\n/**\n * Parse options from preset call arguments\n */\nfunction parseOptions(source: string): PresetOptions {\n const options: PresetOptions = {};\n const tokens = source\n .replace(/[,:]/g, ' ')\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean);\n\n for (let index = 0; index < tokens.length; index += 2) {\n const key = tokens[index];\n const value = tokens[index + 1];\n\n if (!key || value == null) break;\n\n options[key] = normalizeOption(key, value);\n }\n\n return options;\n}\n\n/**\n * Normalize option value based on key\n */\nfunction normalizeOption(key: string, value: string): number | string {\n if (['delay', 'duration', 'stagger', 'exitAt', 'exitDuration'].includes(key)) {\n return parseTime(value);\n }\n\n const numeric = Number(value);\n return Number.isNaN(numeric) ? value : numeric;\n}\n","const SEPARATOR_ALIASES: Record<string, string> = {\n comma: ',',\n none: '',\n space: ' ',\n};\n\nexport function countDecimalPlaces(value: number): number {\n if (!Number.isFinite(value) || Number.isInteger(value)) return 0;\n\n const text = String(value).toLowerCase();\n if (text.includes('e-')) {\n const [coefficient, exponent] = text.split('e-');\n const coefficientDecimals = coefficient?.split('.')[1]?.length ?? 0;\n return coefficientDecimals + Number(exponent ?? 0);\n }\n\n return text.split('.')[1]?.length ?? 0;\n}\n\nexport function resolveCountSeparator(value: unknown): string {\n const separator = String(value ?? '').trim();\n return SEPARATOR_ALIASES[separator.toLowerCase()] ?? separator;\n}\n\nexport function formatCountValue(value: unknown, separator = '', decimals = 0): string {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) return String(value ?? '');\n\n const fractionDigits = Math.max(0, Math.min(20, Math.floor(decimals)));\n const formatted = new Intl.NumberFormat('en-US', {\n useGrouping: Boolean(separator),\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n }).format(numeric);\n\n return separator ? formatted.replace(/,/g, separator) : formatted;\n}\n","/**\n * Animation preset library\n * Provides reusable animation presets for text, objects, cameras, and effects\n */\n\nimport { parsePresetCall } from './preset-parser';\nimport { countDecimalPlaces, resolveCountSeparator } from './count-up';\nimport type { Scene, Element, Animation, PropertyMap, ElementProperties } from '../types/scene';\n\nconst TEXT_PRESETS = new Set([\n 'splitReveal',\n 'blurReveal',\n 'fadeUp',\n 'slideIn',\n 'scaleText',\n 'typewriter',\n 'maskReveal',\n 'charReveal',\n 'wordReveal',\n 'gradientReveal',\n 'keynoteText',\n 'countUp',\n]);\n\nconst OBJECT_PRESETS = new Set([\n 'heroLogo',\n 'productPanel',\n 'softReveal',\n 'sceneExit',\n 'springIn',\n 'bounceIn',\n 'float',\n 'pulse',\n 'drawSVG',\n 'shapeWipe',\n 'irisWipe',\n 'maskReveal',\n 'dynamicSlide',\n 'scaleReveal',\n 'morph',\n 'rotateReveal',\n 'productReveal',\n 'appleHero',\n 'startupLaunch',\n 'highlight-circle-reveal',\n 'animated-arrow-point',\n 'callout-text-pop',\n 'spotlight-mask',\n]);\n\n/**\n * Apply animation presets to scene, generating elements and animations\n */\nexport function applyAnimationPresets(scene: Scene): Scene {\n const generatedElements: Element[] = [];\n const generatedAnimations: Animation[] = [];\n const sourceElements: Element[] = [];\n\n for (const element of scene.elements) {\n const props = element.properties as unknown as Record<string, unknown>;\n const animationPreset = props['animation'];\n const textAnimationPreset = props['textAnimation'];\n const textPreset =\n parsePresetCall(animationPreset).name === 'countUp'\n ? animationPreset\n : (textAnimationPreset ?? animationPreset);\n\n if (element.kind === 'text' && textPreset && isTextPreset(textPreset as string)) {\n if (parsePresetCall(textPreset).name === 'countUp') {\n const generated = expandCountUpPreset(element, textPreset as string);\n sourceElements.push(generated.element);\n generatedAnimations.push(generated.animation);\n continue;\n }\n\n const generated = expandTextPreset(element, textPreset as string);\n sourceElements.push(hideElement(element));\n generatedElements.push(...generated.elements);\n generatedAnimations.push(...generated.animations);\n continue;\n }\n\n const bgEffect = props['backgroundEffect'];\n if (bgEffect) {\n const generated = backgroundEffect(element);\n generatedElements.push(...generated.elements);\n generatedAnimations.push(...generated.animations);\n }\n\n const animation = props['animation'];\n if (animation && isObjectPreset(animation as string)) {\n const preset = parsePresetCall(animation).name;\n sourceElements.push({\n ...element,\n properties: {\n ...element.properties,\n ...(preset === 'drawSVG' ? { pathProgress: 0 } : {}),\n ...(['highlight-circle-reveal', 'animated-arrow-point'].includes(preset)\n ? { pathProgress: 0 }\n : {}),\n ...(preset === 'spotlight-mask' ? { revealProgress: 0 } : {}),\n ...(['shapeWipe', 'irisWipe', 'maskReveal'].includes(preset)\n ? { revealProgress: 0, revealStyle: preset === 'irisWipe' ? 'iris' : 'linear' }\n : {}),\n ...(['shapeWipe', 'maskReveal'].includes(preset)\n ? {\n revealDirection: String(parsePresetCall(animation).options['direction'] ?? 'right'),\n }\n : {}),\n },\n });\n generatedAnimations.push(...objectPresetAnimations(element));\n } else {\n sourceElements.push(element);\n }\n }\n\n return {\n ...scene,\n elements: [...sourceElements, ...generatedElements],\n animations: [...generatedAnimations, ...scene.animations],\n };\n}\n\nfunction expandCountUpPreset(\n element: Element,\n value: string\n): { element: Element; animation: Animation } {\n const { options } = parsePresetCall(value);\n const props = element.properties as unknown as Record<string, unknown>;\n const from = finiteNumber(options['from'], 0);\n const to = finiteNumber(options['to'], finiteNumber(props['value'], 0));\n const direction = String(options['direction'] ?? 'up').toLowerCase();\n const start = direction === 'down' ? to : from;\n const end = direction === 'down' ? from : to;\n\n return {\n element: {\n ...element,\n properties: {\n ...element.properties,\n value: start,\n countSeparator: resolveCountSeparator(options['separator']),\n countDecimals: Math.max(countDecimalPlaces(from), countDecimalPlaces(to)),\n countTo: to,\n } as unknown as ElementProperties,\n },\n animation: {\n target: element.id,\n from: { value: start },\n to: { value: end },\n keyframes: [],\n delay: finiteNumber(options['delay'], 0),\n duration: Math.max(0.001, finiteNumber(options['duration'], 2)),\n easing: String(options['ease'] ?? options['easing'] ?? 'power3.out'),\n },\n };\n}\n\nfunction finiteNumber(value: unknown, fallback: number): number {\n const numeric = Number(value);\n return Number.isFinite(numeric) ? numeric : fallback;\n}\n\n/**\n * Generate camera animations from preset\n */\nexport function cameraPresetAnimations(value: string): Animation[] {\n const { name, options } = parsePresetCall(value);\n const delay = (options['delay'] as number) ?? 0;\n const duration = (options['duration'] as number) ?? 5;\n const easing = (options['ease'] as string) ?? 'smooth';\n\n if (name === 'slowPush' || name === 'push' || name === 'productReveal' || name === 'appleHero') {\n return [\n {\n target: 'camera',\n from: {\n zoom: (options['from'] as number) ?? 1,\n x: (options['xFrom'] as number) ?? 0,\n y: (options['yFrom'] as number) ?? 0,\n rotation: 0,\n },\n to: {\n zoom: (options['to'] as number) ?? 1.05,\n x: (options['xTo'] as number) ?? 0,\n y: (options['yTo'] as number) ?? -10,\n rotation: 0,\n },\n keyframes: [],\n delay,\n duration,\n easing,\n },\n ];\n }\n\n if (name === 'pan') {\n return [\n {\n target: 'camera',\n from: { x: (options['from'] as number) ?? -80, y: 0 },\n to: { x: (options['to'] as number) ?? 80, y: 0 },\n keyframes: [],\n delay,\n duration,\n easing,\n },\n ];\n }\n\n if (name === 'pull') {\n return [\n {\n target: 'camera',\n from: { zoom: (options['from'] as number) ?? 1.06 },\n to: { zoom: (options['to'] as number) ?? 1 },\n keyframes: [],\n delay,\n duration,\n easing,\n },\n ];\n }\n\n if (name === 'speedZoom') {\n return [\n {\n target: 'camera',\n from: {},\n to: {},\n keyframes: [\n {\n offset: 0,\n properties: {\n zoom: (options['from'] as number) ?? 1,\n x: (options['xFrom'] as number) ?? 0,\n y: (options['yFrom'] as number) ?? 0,\n },\n },\n {\n offset: 0.55,\n properties: {\n zoom: (options['peak'] as number) ?? 1.12,\n x: (options['xPeak'] as number) ?? 0,\n y: (options['yPeak'] as number) ?? 0,\n },\n },\n {\n offset: 1,\n properties: {\n zoom: (options['to'] as number) ?? 1.02,\n x: (options['xTo'] as number) ?? 0,\n y: (options['yTo'] as number) ?? 0,\n },\n },\n ],\n delay,\n duration,\n easing: (options['ease'] as string) ?? 'power3.out',\n },\n ];\n }\n\n return [];\n}\n\n/**\n * Check if value is a text preset name\n */\nfunction isTextPreset(value: string): boolean {\n return TEXT_PRESETS.has(parsePresetCall(value).name);\n}\n\n/**\n * Check if value is an object preset name\n */\nfunction isObjectPreset(value: string): boolean {\n return OBJECT_PRESETS.has(parsePresetCall(value).name);\n}\n\n/**\n * Hide element by setting opacity to 0\n */\nfunction hideElement(element: Element): Element {\n return {\n ...element,\n properties: { ...element.properties, opacity: 0 },\n };\n}\n\n/**\n * Expand text preset into character/word elements with animations\n */\nfunction expandTextPreset(\n element: Element,\n value: string\n): { elements: Element[]; animations: Animation[] } {\n const { name, options } = parsePresetCall(value);\n const split = (options['split'] as string) ?? defaultSplitFor(name);\n const props = element.properties as unknown as Record<string, unknown>;\n const parts = splitText(String(props['value'] ?? ''), split);\n const stagger = (options['stagger'] as number) ?? (split === 'chars' ? 0.035 : 0.09);\n const delay = (options['delay'] as number) ?? 0;\n const duration = (options['duration'] as number) ?? 1.2;\n const easing = normalizeEase((options['ease'] as string) ?? 'power3.out');\n const metrics = layoutParts(parts, props, split);\n\n const elements: Element[] = metrics.map((part, index) => ({\n ...element,\n id: `${element.id}__${split}_${index}`,\n properties: {\n ...element.properties,\n value: part.value,\n x: (props['x'] as number) + part.x,\n textGroup: element.id,\n textGroupX: (props['x'] as number) ?? 0,\n textSplit: split,\n y: props['y'] as number,\n center: true,\n opacity: 0,\n blur: presetBlurFrom(name),\n scale: name === 'scaleText' ? 0.94 : (props['scale'] as number),\n tracking: 0,\n } as unknown as ElementProperties,\n }));\n\n const animations: Animation[] = elements.map((part, index) => {\n const partProps = part.properties as unknown as Record<string, unknown>;\n return {\n target: part.id,\n from: textPresetFrom(name, partProps),\n to: textPresetTo(name, partProps),\n keyframes: [],\n delay: delay + index * stagger,\n duration,\n easing,\n };\n });\n\n if (options['exitAt'] != null) {\n animations.push(\n ...elements.map((part, index) => {\n const partProps = part.properties as unknown as Record<string, unknown>;\n return {\n target: part.id,\n from: textPresetTo(name, partProps),\n to: {\n opacity: 0,\n y: (partProps['y'] as number) - 30,\n blur: name === 'blurReveal' ? 6 : 0,\n },\n keyframes: [],\n delay: (options['exitAt'] as number) + index * Math.min(stagger, 0.018),\n duration: (options['exitDuration'] as number) ?? 0.9,\n easing: 'ease-out',\n };\n })\n );\n }\n\n return { elements, animations };\n}\n\n/**\n * Generate object preset animations\n */\nfunction objectPresetAnimations(element: Element): Animation[] {\n const target = element.id;\n const props = element.properties as unknown as Record<string, unknown>;\n const { name, options } = parsePresetCall(props['animation'] as string);\n const delay = (options['delay'] as number) ?? 0;\n const duration = (options['duration'] as number) ?? (name === 'float' ? 4 : 1.2);\n const easing = normalizeEase(\n (options['ease'] as string) ??\n (name === 'springIn' || name === 'bounceIn' ? 'spring' : 'ease-out')\n );\n\n if (name === 'highlight-circle-reveal' || name === 'animated-arrow-point') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'power3.out',\n { opacity: 1, pathProgress: 0 },\n { opacity: (props['opacity'] as number) || 1, pathProgress: 1 }\n ),\n ];\n }\n\n if (name === 'callout-text-pop') {\n const x = (props['x'] as number) ?? 0;\n const y = (props['y'] as number) ?? 0;\n const scale = (props['scale'] as number) ?? 1;\n return [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'power3.out',\n { opacity: 0, x, y: y + ((options['yFrom'] as number) ?? 18), scale: scale * 0.84 },\n { opacity: (props['opacity'] as number) || 1, x, y, scale }\n ),\n ];\n }\n\n if (name === 'spotlight-mask') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'power3.out',\n { opacity: 1, revealProgress: 0 },\n { opacity: (props['opacity'] as number) || 1, revealProgress: 1 }\n ),\n ];\n }\n\n if (name === 'heroLogo') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'soft-spring',\n {\n opacity: 0,\n scale: (options['from'] as number) ?? 0.82,\n y: (options['yFrom'] as number) ?? (props['y'] as number) + 34,\n rotation: (options['rotationFrom'] as number) ?? -1.5,\n },\n {\n opacity: 1,\n scale: (options['to'] as number) ?? (props['scale'] as number),\n y: (options['yTo'] as number) ?? (props['y'] as number),\n rotation: props['rotation'] as number,\n }\n ),\n ];\n }\n\n if (name === 'productPanel') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'ease-out',\n {\n opacity: 0,\n scale: (options['from'] as number) ?? 0.965,\n x: (options['xFrom'] as number) ?? (props['x'] as number),\n y: (options['yFrom'] as number) ?? (props['y'] as number) + 34,\n },\n {\n opacity: (props['opacity'] as number) || 1,\n scale: (options['to'] as number) ?? (props['scale'] as number),\n x: props['x'] as number,\n y: props['y'] as number,\n }\n ),\n ];\n }\n\n if (name === 'softReveal') {\n const opacity = (options['opacity'] as number) ?? ((props['opacity'] as number) || 1);\n const x = (props['x'] as number) ?? 0;\n const y = (props['y'] as number) ?? 0;\n const scale = (props['scale'] as number) ?? 1;\n const animations = [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'power3.out',\n {\n opacity: 0,\n x: x + ((options['xFrom'] as number) ?? 0),\n y: y + ((options['yFrom'] as number) ?? 24),\n scale: (options['from'] as number) ?? scale * 0.98,\n blur: (options['blur'] as number) ?? 0,\n },\n { opacity, x, y, scale, blur: 0 }\n ),\n ];\n\n if (options['exitAt'] != null) {\n animations.push(\n basicAnimation(\n target,\n options['exitAt'] as number,\n (options['exitDuration'] as number) ?? 0.55,\n (options['exitEase'] as string) ?? 'power2.in',\n { opacity, x, y, scale, blur: 0 },\n {\n opacity: 0,\n x: x + ((options['xExit'] as number) ?? 0),\n y: y + ((options['yExit'] as number) ?? 0),\n scale: (options['exitScale'] as number) ?? scale,\n blur: (options['exitBlur'] as number) ?? 0,\n }\n )\n );\n }\n\n return animations;\n }\n\n if (name === 'sceneExit') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'ease-out',\n {\n opacity: (props['opacity'] as number) || 1,\n scale: props['scale'] as number,\n x: props['x'] as number,\n y: props['y'] as number,\n },\n {\n opacity: 0,\n scale: (options['to'] as number) ?? 0.98,\n x: (options['xTo'] as number) ?? (props['x'] as number),\n y: (options['yTo'] as number) ?? (props['y'] as number) - 28,\n }\n ),\n ];\n }\n\n if (name === 'float') {\n return [\n {\n target,\n from: {},\n to: {},\n keyframes: [\n { offset: 0, properties: { y: (options['y'] as number) ?? 0 } },\n { offset: 0.5, properties: { y: (options['yTo'] as number) ?? -14 } },\n { offset: 1, properties: { y: (options['y'] as number) ?? 0 } },\n ],\n delay,\n duration,\n easing: 'smooth',\n },\n ];\n }\n\n if (name === 'pulse') {\n return [\n {\n target,\n from: {},\n to: {},\n keyframes: [\n { offset: 0, properties: { scale: 1 } },\n { offset: 0.5, properties: { scale: (options['to'] as number) ?? 1.035 } },\n { offset: 1, properties: { scale: 1 } },\n ],\n delay,\n duration,\n easing: 'smooth',\n },\n ];\n }\n\n if (name === 'rotateReveal') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n easing,\n {\n opacity: 0,\n scale: 0.94,\n rotation: (props['rotation'] as number) - 4,\n },\n {\n opacity: 1,\n scale: props['scale'] as number,\n rotation: props['rotation'] as number,\n }\n ),\n ];\n }\n\n if (name === 'drawSVG') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n easing,\n { opacity: 1, pathProgress: 0, scale: (props['scale'] as number) * 0.98 },\n {\n opacity: (props['opacity'] as number) || 1,\n pathProgress: 1,\n scale: props['scale'] as number,\n }\n ),\n ];\n }\n\n if (name === 'shapeWipe' || name === 'irisWipe') {\n return [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'power3.out',\n { opacity: 1, revealProgress: 0 },\n { opacity: 1, revealProgress: 1 }\n ),\n ];\n }\n\n if (name === 'maskReveal') {\n const opacity = (props['opacity'] as number) || 1;\n const animations = [\n basicAnimation(\n target,\n delay,\n duration,\n (options['ease'] as string) ?? 'power3.out',\n { opacity: 1, revealProgress: 0 },\n { opacity, revealProgress: 1 }\n ),\n ];\n if (options['exitAt'] != null) {\n animations.push(\n basicAnimation(\n target,\n options['exitAt'] as number,\n (options['exitDuration'] as number) ?? 0.6,\n (options['exitEase'] as string) ?? 'power2.in',\n { opacity, revealProgress: 1 },\n { opacity: 0, revealProgress: 0 }\n )\n );\n }\n return animations;\n }\n\n if (name === 'dynamicSlide') {\n const x = (props['x'] as number) ?? 0;\n const y = (props['y'] as number) ?? 0;\n const scale = (props['scale'] as number) ?? 1;\n const opacity = (props['opacity'] as number) || 1;\n const direction = String(options['direction'] ?? 'left');\n const distance = (options['distance'] as number) ?? 180;\n const dx = direction === 'left' ? distance : direction === 'right' ? -distance : 0;\n const dy = direction === 'up' ? distance : direction === 'down' ? -distance : 0;\n const skewX = dx ? Math.sign(dx) * 4 : 0;\n const animations: Animation[] = [\n {\n target,\n from: {},\n to: {},\n keyframes: [\n {\n offset: 0,\n properties: { opacity: 0, x: x + dx, y: y + dy, scale: scale * 0.94, skewX },\n },\n {\n offset: 0.82,\n properties: {\n opacity,\n x: x - dx * 0.04,\n y: y - dy * 0.04,\n scale: scale * 1.01,\n skewX: -skewX * 0.12,\n },\n },\n { offset: 1, properties: { opacity, x, y, scale, skewX: 0 } },\n ],\n delay,\n duration,\n easing: (options['ease'] as string) ?? 'power3.out',\n },\n ];\n if (options['exitAt'] != null) {\n animations.push(\n basicAnimation(\n target,\n options['exitAt'] as number,\n (options['exitDuration'] as number) ?? 0.55,\n (options['exitEase'] as string) ?? 'power2.in',\n { opacity, x, y, scale, skewX: 0 },\n { opacity: 0, x: x - dx * 0.7, y: y - dy * 0.7, scale: scale * 0.97, skewX: -skewX * 0.5 }\n )\n );\n }\n return animations;\n }\n\n return [\n basicAnimation(\n target,\n delay,\n duration,\n easing,\n {\n opacity: 0,\n scale: (options['from'] as number) ?? 0.8,\n y: (options['yFrom'] as number) ?? (props['y'] as number) + 36,\n },\n {\n opacity: 1,\n scale: (options['to'] as number) ?? (props['scale'] as number),\n y: (options['yTo'] as number) ?? (props['y'] as number),\n }\n ),\n ];\n}\n\n/**\n * Generate background effect element and animation\n */\nfunction backgroundEffect(element: Element): { elements: Element[]; animations: Animation[] } {\n const props = element.properties as unknown as Record<string, unknown>;\n const { name, options } = parsePresetCall(props['backgroundEffect'] as string);\n const duration = (options['duration'] as number) ?? 12;\n const opacity = (options['opacity'] as number) ?? (name === 'noise' ? 0.035 : 0.2);\n\n const effect: Element = {\n ...element,\n id: `${element.id}__${name}`,\n kind: 'effect',\n assetName: null,\n asset: null,\n properties: {\n ...element.properties,\n ...options,\n layer: 'background',\n effect: name,\n opacity,\n offset: 0,\n intensity: (options['intensity'] as number) ?? 1,\n } as unknown as ElementProperties,\n };\n\n return {\n elements: [effect],\n animations: [\n {\n target: effect.id,\n from: { offset: 0 },\n to: { offset: 1 },\n keyframes: [],\n delay: (options['delay'] as number) ?? 0,\n duration,\n easing: 'linear',\n },\n ],\n };\n}\n\n/**\n * Create basic animation\n */\nfunction basicAnimation(\n target: string,\n delay: number,\n duration: number,\n easing: string,\n from: PropertyMap,\n to: PropertyMap\n): Animation {\n return { target, from, to, keyframes: [], delay, duration, easing };\n}\n\n/**\n * Split text into parts (words or characters)\n */\nfunction splitText(text: string, split: string): string[] {\n if (split === 'words') {\n return text\n .trim()\n .split(/\\s+/)\n .filter((part) => part.length > 0);\n }\n return Array.from(text);\n}\n\n/**\n * Layout text parts with positions\n */\nfunction layoutParts(\n parts: string[],\n props: Record<string, unknown>,\n split: string\n): Array<{ value: string; x: number }> {\n if (split === 'words') {\n const approx = parts.map((part) => part.length * (props['size'] as number) * 0.52);\n const space = (props['size'] as number) * 0.34;\n const total = approx.reduce((sum, width) => sum + width, 0) + space * (parts.length - 1);\n let cursor = -total / 2;\n\n return parts.map((value, index) => {\n const width = approx[index]!;\n const x = cursor + width / 2;\n cursor += width + space;\n return { value, x };\n });\n }\n\n const widths = parts.map((part) => partWidth(part, props, split));\n const total = widths.reduce((sum, width) => sum + width, 0);\n let cursor = -total / 2;\n\n return parts.map((value, index) => {\n const width = widths[index]!;\n const x = cursor + width / 2;\n cursor += width;\n return { value, x };\n });\n}\n\n/**\n * Calculate width of text part\n */\nfunction partWidth(part: string, props: Record<string, unknown>, split: string): number {\n if (split === 'words') {\n return part.length * (props['size'] as number) * 0.52 + (props['size'] as number) * 0.34;\n }\n return (props['size'] as number) * 0.54 + ((props['tracking'] as number) ?? 0);\n}\n\n/**\n * Get default split mode for preset\n */\nfunction defaultSplitFor(name: string): string {\n if (name === 'keynoteText') return 'words';\n if (name === 'wordReveal' || name === 'blurReveal') return 'words';\n return 'chars';\n}\n\n/**\n * Get default blur value for preset\n */\nfunction presetBlurFrom(name: string): number {\n if (name === 'keynoteText') return 0;\n return name === 'blurReveal' || name === 'gradientReveal' ? 10 : 0;\n}\n\n/**\n * Get from properties for text preset\n */\nfunction textPresetFrom(name: string, props: Record<string, unknown>): PropertyMap {\n if (name === 'keynoteText') {\n return {\n opacity: 0,\n y: (props['y'] as number) + 26,\n scale: 0.99,\n };\n }\n if (name === 'scaleText') {\n return {\n opacity: 0,\n scale: 0.92,\n y: (props['y'] as number) + 8,\n };\n }\n if (name === 'slideIn') {\n return {\n opacity: 1,\n x: (props['x'] as number) - 36,\n };\n }\n if (name === 'maskReveal') {\n return {\n opacity: 0,\n y: (props['y'] as number) + 24,\n };\n }\n return {\n opacity: 0,\n y: (props['y'] as number) + 38,\n blur: presetBlurFrom(name),\n };\n}\n\n/**\n * Get to properties for text preset\n */\nfunction textPresetTo(name: string, props: Record<string, unknown>): PropertyMap {\n if (name === 'slideIn') {\n return {\n opacity: (props['opacity'] as number) || 1,\n x: props['x'] as number,\n };\n }\n return {\n opacity: (props['opacity'] as number) || 1,\n y: props['y'] as number,\n blur: 0,\n scale: (props['scale'] as number) || 1,\n };\n}\n\n/**\n * Normalize easing name\n */\nfunction normalizeEase(value: string): string {\n if (value === 'power3.out') return 'ease-out';\n if (value === 'power2.out') return 'ease-out';\n return value;\n}\n","/**\n * Scene graph builder\n * Converts AST into normalized scene structure\n */\n\nimport {\n normalizeCamera,\n normalizeCanvas,\n normalizeProperties,\n normalizeProperty,\n defaultElementProperties,\n} from './properties';\nimport { applyAnimationPresets, cameraPresetAnimations } from '../animation-library/presets.js';\nimport type {\n Scene,\n Animation,\n Sequence,\n Asset,\n Element,\n AssetType,\n Layer,\n Keyframe,\n ElementKind,\n Track,\n TrackContent,\n TrackRole,\n} from '../types/scene';\nimport type { ProgramNode, AnimationNode } from '../types/parser';\n\nconst LAYER_ORDER: Record<Layer, number> = {\n background: 0,\n hero: 10,\n supporting: 20,\n content: 30,\n details: 40,\n text: 50,\n effects: 60,\n};\n\n/**\n * Build scene graph from parsed AST\n */\nexport function buildSceneGraph(ast: ProgramNode): Scene {\n const canvasNode = ast.body.find((node) => node.type === 'Canvas');\n const cameraNode = ast.body.find((node) => node.type === 'Camera');\n const audioNode = ast.body.find((node) => node.type === 'Audio');\n\n const canvas = normalizeCanvas(\n canvasNode && 'properties' in canvasNode ? canvasNode.properties : {}\n );\n const camera = normalizeCamera(\n cameraNode && 'properties' in cameraNode ? cameraNode.properties : {}\n );\n const sequences = buildSequences(ast);\n\n const imports = new Map<string, Asset>();\n const elements: Element[] = [];\n const animations: Animation[] = [];\n const clips: import('../types/scene').Clip[] = [];\n\n for (const node of ast.body) {\n if (node.type === 'Import') {\n imports.set(node.name, {\n name: node.name,\n path: node.path,\n type: assetType(node.path),\n });\n }\n\n if (node.type === 'Element') {\n const assetName =\n node.kind === 'asset'\n ? node.name\n : node.kind === 'image'\n ? String(node.properties['source'] ?? '')\n : null;\n const asset = assetName ? (imports.get(assetName) ?? null) : null;\n const normalized = normalizeProperties(node.properties);\n elements.push({\n id: node.name,\n kind: node.kind as ElementKind,\n assetName: asset ? assetName : null,\n asset,\n properties: {\n ...defaultElementProperties(node.kind as ElementKind),\n ...normalized,\n ...(node.kind === 'overlay' && normalized['parent'] && !node.properties['layer']\n ? { layer: 'details' }\n : {}),\n },\n });\n }\n\n if (node.type === 'Animation') {\n animations.push(normalizeAnimation(node, sequences));\n }\n\n if (node.type === 'Clip') {\n const asset = imports.get(node.assetName) ?? null;\n const props = normalizeProperties(node.properties);\n clips.push({\n id: `clip_${node.assetName}_${clips.length}`,\n assetName: node.assetName,\n asset,\n track: props['track'] ?? 1,\n start: normalizeProperty('start', props['start'] ?? 0) as number,\n duration: normalizeProperty('duration', props['duration'] ?? 5) as number,\n trimIn: normalizeProperty('trimIn', props['trimIn'] ?? 0) as number,\n trimOut: normalizeProperty('trimOut', props['trimOut'] ?? 0) as number,\n transitionIn: props['transitionIn'] === 'crossfade' ? 'crossfade' : undefined,\n transitionInDuration: normalizeProperty(\n 'transitionInDuration',\n props['transitionInDuration'] ?? 0\n ) as number,\n transitionOut: props['transitionOut'] === 'crossfade' ? 'crossfade' : undefined,\n transitionOutDuration: normalizeProperty(\n 'transitionOutDuration',\n props['transitionOutDuration'] ?? 0\n ) as number,\n volume: props['volume'] !== undefined ? Number(props['volume']) : 1.0,\n mute: Boolean(props['mute'] ?? false),\n sourceOrder: clips.length,\n });\n }\n }\n\n // Add camera animations from camera node\n if (cameraNode && 'properties' in cameraNode && cameraNode.properties['cameraAnimation']) {\n animations.push(...cameraPresetAnimations(cameraNode.properties['cameraAnimation'] as string));\n }\n\n const tracks = buildTracks(ast, clips, elements, Boolean(audioNode));\n\n const scene = applyAnimationPresets({\n canvas,\n camera,\n sequences: Array.from(sequences.values()),\n imports: Array.from(imports.values()),\n elements,\n animations,\n tracks,\n clips,\n audio: audioNode && 'path' in audioNode ? audioNode.path : undefined,\n audioStart: audioNode\n ? (normalizeProperty('start', audioNode.properties['start'] ?? 0) as number)\n : 0,\n });\n\n validateElementMasks(scene.elements);\n\n // Sort elements by layer\n scene.elements.sort(\n (a: Element, b: Element) =>\n layerRank(a.properties.layer as Layer) - layerRank(b.properties.layer as Layer)\n );\n\n return scene;\n}\n\nconst TRACK_ROLES = new Set<TrackRole>(['main', 'overlay', 'audio']);\nconst TRACK_CONTENT = new Set<TrackContent>([\n 'primary',\n 'video',\n 'image',\n 'text',\n 'effect',\n 'audio',\n 'mixed',\n]);\n\nfunction buildTracks(\n ast: ProgramNode,\n clips: import('../types/scene').Clip[],\n elements: Element[],\n hasLegacyAudio: boolean\n): Track[] {\n const tracks: Track[] = [];\n const ids = new Set<string>();\n let declaredMain = '';\n\n for (const node of ast.body.filter((item) => item.type === 'Track')) {\n if (node.type !== 'Track') continue;\n if (ids.has(node.name)) throw new Error(`Duplicate track declaration \"${node.name}\".`);\n const role = String(node.properties['role'] ?? 'overlay') as TrackRole;\n if (!TRACK_ROLES.has(role)) {\n throw new Error(`Track \"${node.name}\" has unsupported role \"${role}\".`);\n }\n if (role === 'main' && declaredMain) {\n throw new Error(`Only one main track is allowed (\"${declaredMain}\" and \"${node.name}\").`);\n }\n if (role === 'main') declaredMain = node.name;\n const fallbackContent: TrackContent =\n role === 'main' ? 'primary' : role === 'audio' ? 'audio' : 'mixed';\n const content = String(node.properties['content'] ?? fallbackContent) as TrackContent;\n if (!TRACK_CONTENT.has(content)) {\n throw new Error(`Track \"${node.name}\" has unsupported content \"${content}\".`);\n }\n if (role === 'audio' && content !== 'audio') {\n throw new Error(`Audio track \"${node.name}\" must use content audio.`);\n }\n ids.add(node.name);\n tracks.push({\n id: node.name,\n label: String(node.properties['label'] ?? defaultTrackLabel(role, tracks.length)),\n role,\n content,\n hidden: Boolean(normalizeProperty('hidden', node.properties['hidden'] ?? false)),\n muted: Boolean(normalizeProperty('muted', node.properties['muted'] ?? false)),\n order: Number(node.properties['order'] ?? tracks.length),\n declared: true,\n });\n }\n\n const ensureSynthetic = (id: string, role: TrackRole, content: TrackContent, label: string) => {\n const existing = tracks.find((track) => track.id === id);\n if (existing) return existing;\n const track: Track = {\n id,\n label,\n role,\n content,\n hidden: false,\n muted: false,\n order: tracks.length,\n declared: false,\n };\n tracks.push(track);\n ids.add(id);\n return track;\n };\n\n for (const clip of clips) {\n const id = String(clip.track);\n const content: TrackContent = clip.asset?.type === 'video' ? 'video' : 'image';\n const hasMain = tracks.some((track) => track.role === 'main');\n const role: TrackRole = !hasMain && (id === '1' || id === 'main') ? 'main' : 'overlay';\n ensureSynthetic(\n id,\n role,\n role === 'main' ? 'primary' : content,\n role === 'main' ? 'Main Track' : `${content === 'video' ? 'Video' : 'Image'} Overlay`\n );\n }\n\n for (const element of elements) {\n const trackId = (element.properties as unknown as Record<string, unknown>)['track'];\n if (trackId === undefined || trackId === null || trackId === '') continue;\n const content: TrackContent =\n element.kind === 'text'\n ? 'text'\n : element.kind === 'effect' || element.kind === 'overlay'\n ? 'effect'\n : element.asset?.type === 'video'\n ? 'video'\n : 'image';\n ensureSynthetic(String(trackId), 'overlay', content, defaultContentLabel(content));\n }\n\n if (!tracks.some((track) => track.role === 'main')) {\n tracks.unshift({\n id: 'main',\n label: 'Main Track',\n role: 'main',\n content: 'primary',\n hidden: false,\n muted: false,\n order: -1,\n declared: false,\n });\n }\n if (hasLegacyAudio && !tracks.some((track) => track.role === 'audio')) {\n ensureSynthetic('legacy-audio', 'audio', 'audio', 'Audio');\n }\n\n return tracks.sort((left, right) => left.order - right.order);\n}\n\nfunction defaultTrackLabel(role: TrackRole, index: number): string {\n if (role === 'main') return 'Main Track';\n if (role === 'audio') return index > 0 ? `Audio ${index + 1}` : 'Audio';\n return `Overlay ${index + 1}`;\n}\n\nfunction defaultContentLabel(content: TrackContent): string {\n if (content === 'text') return 'Text Overlay';\n if (content === 'video') return 'Video Overlay';\n if (content === 'image') return 'Image Overlay';\n if (content === 'effect') return 'Effects Overlay';\n if (content === 'audio') return 'Audio';\n return 'Overlay';\n}\n\n/**\n * Normalize animation node from AST\n */\nfunction normalizeAnimation(node: AnimationNode, sequences: Map<string, Sequence>): Animation {\n const sequenceDelay = sequenceOffset(node, sequences);\n\n return {\n target: node.target,\n from: normalizeProperties(node.from ?? {}),\n to: normalizeProperties(node.to ?? {}),\n keyframes: (node.keyframes ?? []).map((frame): Keyframe => ({\n offset: frame.offset,\n properties: normalizeProperties(frame.properties),\n ...(frame.easing ? { easing: String(frame.easing) } : {}),\n })),\n delay: (normalizeProperty('delay', node.delay ?? 0) as number) + sequenceDelay,\n duration: normalizeProperty('duration', node.duration ?? 1) as number,\n easing: String(node.easing ?? 'soft'),\n sequence: node.sequence,\n };\n}\n\n/**\n * Build sequence definitions from AST\n */\nfunction buildSequences(ast: ProgramNode): Map<string, Sequence> {\n const sequences = new Map<string, Sequence>();\n\n for (const node of ast.body.filter((item) => item.type === 'Sequence')) {\n if (node.type !== 'Sequence') continue;\n\n const delay = normalizeProperty('delay', node.properties['delay'] ?? 0) as number;\n const gap = normalizeProperty('delay', node.properties['gap'] ?? 0) as number;\n const items = String(node.properties['items'] ?? '')\n .split(/\\s+/)\n .filter(Boolean);\n\n sequences.set(node.name, { name: node.name, delay, gap, items });\n }\n\n return sequences;\n}\n\n/**\n * Calculate sequence offset for an animation\n */\nfunction sequenceOffset(node: AnimationNode, sequences: Map<string, Sequence>): number {\n if (!node.sequence) return 0;\n\n const sequence = sequences.get(String(node.sequence));\n if (!sequence) return 0;\n\n const index = sequence.items.indexOf(node.target);\n return sequence.delay + Math.max(0, index) * sequence.gap;\n}\n\n/**\n * Get numeric rank for a layer (for sorting)\n */\nfunction layerRank(layer: Layer): number {\n return LAYER_ORDER[layer] ?? LAYER_ORDER.content;\n}\n\n/**\n * Determine asset type from file path\n */\nexport function assetType(path: string): AssetType {\n const lower = path.toLowerCase();\n if (lower.startsWith('data:video/')) return 'video';\n if (lower.startsWith('data:image/svg+xml')) return 'svg';\n const pathname = lower.split(/[?#]/, 1)[0] ?? lower;\n if (/\\.(mp4|webm|m4v)$/.test(pathname)) return 'video';\n if (pathname.endsWith('.svg')) return 'svg';\n return 'image';\n}\n\n/** Validate serializable layer-mask references before rendering. */\nexport function validateElementMasks(elements: Element[]): void {\n const byId = new Map(elements.map((element) => [element.id, element]));\n for (const element of elements) {\n const mask = String((element.properties as unknown as Record<string, unknown>)['mask'] ?? '');\n if (!mask || mask === 'none') continue;\n if (mask === element.id) throw new Error(`Layer \"${element.id}\" cannot mask itself`);\n const source = byId.get(mask);\n if (!source)\n throw new Error(`Mask layer \"${mask}\" referenced by \"${element.id}\" does not exist`);\n const sourceMask = String(\n (source.properties as unknown as Record<string, unknown>)['mask'] ?? ''\n );\n if (sourceMask && sourceMask !== 'none') {\n throw new Error(`Nested layer masks are not supported: \"${element.id}\" -> \"${mask}\"`);\n }\n }\n}\n","function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n/*!\n * GSAP 3.15.0\n * https://gsap.com\n *\n * @license Copyright 2008-2026, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar _config = {\n autoSleep: 120,\n force3D: \"auto\",\n nullTargetWarn: 1,\n units: {\n lineHeight: \"\"\n }\n},\n _defaults = {\n duration: .5,\n overwrite: false,\n delay: 0\n},\n _suppressOverwrites,\n _reverting,\n _context,\n _bigNum = 1e8,\n _tinyNum = 1 / _bigNum,\n _2PI = Math.PI * 2,\n _HALF_PI = _2PI / 4,\n _gsID = 0,\n _sqrt = Math.sqrt,\n _cos = Math.cos,\n _sin = Math.sin,\n _isString = function _isString(value) {\n return typeof value === \"string\";\n},\n _isFunction = function _isFunction(value) {\n return typeof value === \"function\";\n},\n _isNumber = function _isNumber(value) {\n return typeof value === \"number\";\n},\n _isUndefined = function _isUndefined(value) {\n return typeof value === \"undefined\";\n},\n _isObject = function _isObject(value) {\n return typeof value === \"object\";\n},\n _isNotFalse = function _isNotFalse(value) {\n return value !== false;\n},\n _windowExists = function _windowExists() {\n return typeof window !== \"undefined\";\n},\n _isFuncOrString = function _isFuncOrString(value) {\n return _isFunction(value) || _isString(value);\n},\n _isTypedArray = typeof ArrayBuffer === \"function\" && ArrayBuffer.isView || function () {},\n // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().\n_isArray = Array.isArray,\n _randomExp = /random\\([^)]+\\)/g,\n _commaDelimExp = /,\\s*/g,\n _strictNumExp = /(?:-?\\.?\\d|\\.)+/gi,\n //only numbers (including negatives and decimals) but NOT relative values.\n_numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g,\n //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.\n_numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g,\n _complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi,\n //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.\n_relExp = /[+-]=-?[.\\d]+/,\n _delimitedValueExp = /[^,'\"\\[\\]\\s]+/gi,\n // previously /[#\\-+.]*\\b[a-z\\d\\-=+%.]+/gi but didn't catch special characters.\n_unitExp = /^[+\\-=e\\s\\d]*\\d+[.\\d]*([a-z]*|%)\\s*$/i,\n _globalTimeline,\n _win,\n _coreInitted,\n _doc,\n _globals = {},\n _installScope = {},\n _coreReady,\n _install = function _install(scope) {\n return (_installScope = _merge(scope, _globals)) && gsap;\n},\n _missingPlugin = function _missingPlugin(property, value) {\n return console.warn(\"Invalid property\", property, \"set to\", value, \"Missing plugin? gsap.registerPlugin()\");\n},\n _warn = function _warn(message, suppress) {\n return !suppress && console.warn(message);\n},\n _addGlobal = function _addGlobal(name, obj) {\n return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;\n},\n _emptyFunc = function _emptyFunc() {\n return 0;\n},\n _startAtRevertConfig = {\n suppressEvents: true,\n isStart: true,\n kill: false\n},\n _revertConfigNoKill = {\n suppressEvents: true,\n kill: false\n},\n _revertConfig = {\n suppressEvents: true\n},\n _reservedProps = {},\n _lazyTweens = [],\n _lazyLookup = {},\n _lastRenderedFrame,\n _plugins = {},\n _effects = {},\n _nextGCFrame = 30,\n _harnessPlugins = [],\n _callbackNames = \"\",\n _harness = function _harness(targets) {\n var target = targets[0],\n harnessPlugin,\n i;\n _isObject(target) || _isFunction(target) || (targets = [targets]);\n\n if (!(harnessPlugin = (target._gsap || {}).harness)) {\n // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)\n i = _harnessPlugins.length;\n\n while (i-- && !_harnessPlugins[i].targetTest(target)) {}\n\n harnessPlugin = _harnessPlugins[i];\n }\n\n i = targets.length;\n\n while (i--) {\n targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);\n }\n\n return targets;\n},\n _getCache = function _getCache(target) {\n return target._gsap || _harness(toArray(target))[0]._gsap;\n},\n _getProperty = function _getProperty(target, property, v) {\n return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;\n},\n _forEachName = function _forEachName(names, func) {\n return (names = names.split(\",\")).forEach(func) || names;\n},\n //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).\n_round = function _round(value) {\n return Math.round(value * 100000) / 100000 || 0;\n},\n _roundPrecise = function _roundPrecise(value) {\n return Math.round(value * 10000000) / 10000000 || 0;\n},\n // increased precision mostly for timing values.\n_parseRelative = function _parseRelative(start, value) {\n var operator = value.charAt(0),\n end = parseFloat(value.substr(2));\n start = parseFloat(start);\n return operator === \"+\" ? start + end : operator === \"-\" ? start - end : operator === \"*\" ? start * end : start / end;\n},\n _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {\n //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.\n var l = toFind.length,\n i = 0;\n\n for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}\n\n return i < l;\n},\n _lazyRender = function _lazyRender() {\n var l = _lazyTweens.length,\n a = _lazyTweens.slice(0),\n i,\n tween;\n\n _lazyLookup = {};\n _lazyTweens.length = 0;\n\n for (i = 0; i < l; i++) {\n tween = a[i];\n tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);\n }\n},\n _isRevertWorthy = function _isRevertWorthy(animation) {\n return !!(animation._initted || animation._startAt || animation.add);\n},\n _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {\n _lazyTweens.length && !_reverting && _lazyRender();\n animation.render(time, suppressEvents, force || !!(_reverting && time < 0 && _isRevertWorthy(animation)));\n _lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.\n},\n _numericIfPossible = function _numericIfPossible(value) {\n var n = parseFloat(value);\n return (n || n === 0) && (value + \"\").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;\n},\n _passThrough = function _passThrough(p) {\n return p;\n},\n _setDefaults = function _setDefaults(obj, defaults) {\n for (var p in defaults) {\n p in obj || (obj[p] = defaults[p]);\n }\n\n return obj;\n},\n _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) {\n return function (obj, defaults) {\n for (var p in defaults) {\n p in obj || p === \"duration\" && excludeDuration || p === \"ease\" || (obj[p] = defaults[p]);\n }\n };\n},\n _merge = function _merge(base, toMerge) {\n for (var p in toMerge) {\n base[p] = toMerge[p];\n }\n\n return base;\n},\n _mergeDeep = function _mergeDeep(base, toMerge) {\n for (var p in toMerge) {\n p !== \"__proto__\" && p !== \"constructor\" && p !== \"prototype\" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);\n }\n\n return base;\n},\n _copyExcluding = function _copyExcluding(obj, excluding) {\n var copy = {},\n p;\n\n for (p in obj) {\n p in excluding || (copy[p] = obj[p]);\n }\n\n return copy;\n},\n _inheritDefaults = function _inheritDefaults(vars) {\n var parent = vars.parent || _globalTimeline,\n func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;\n\n if (_isNotFalse(vars.inherit)) {\n while (parent) {\n func(vars, parent.vars.defaults);\n parent = parent.parent || parent._dp;\n }\n }\n\n return vars;\n},\n _arraysMatch = function _arraysMatch(a1, a2) {\n var i = a1.length,\n match = i === a2.length;\n\n while (match && i-- && a1[i] === a2[i]) {}\n\n return i < 0;\n},\n _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {\n if (firstProp === void 0) {\n firstProp = \"_first\";\n }\n\n if (lastProp === void 0) {\n lastProp = \"_last\";\n }\n\n var prev = parent[lastProp],\n t;\n\n if (sortBy) {\n t = child[sortBy];\n\n while (prev && prev[sortBy] > t) {\n prev = prev._prev;\n }\n }\n\n if (prev) {\n child._next = prev._next;\n prev._next = child;\n } else {\n child._next = parent[firstProp];\n parent[firstProp] = child;\n }\n\n if (child._next) {\n child._next._prev = child;\n } else {\n parent[lastProp] = child;\n }\n\n child._prev = prev;\n child.parent = child._dp = parent;\n return child;\n},\n _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {\n if (firstProp === void 0) {\n firstProp = \"_first\";\n }\n\n if (lastProp === void 0) {\n lastProp = \"_last\";\n }\n\n var prev = child._prev,\n next = child._next;\n\n if (prev) {\n prev._next = next;\n } else if (parent[firstProp] === child) {\n parent[firstProp] = next;\n }\n\n if (next) {\n next._prev = prev;\n } else if (parent[lastProp] === child) {\n parent[lastProp] = prev;\n }\n\n child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.\n},\n _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {\n child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child);\n child._act = 0;\n},\n _uncache = function _uncache(animation, child) {\n if (animation && (!child || child._end > animation._dur || child._start < 0)) {\n // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)\n var a = animation;\n\n while (a) {\n a._dirty = 1;\n a = a.parent;\n }\n }\n\n return animation;\n},\n _recacheAncestors = function _recacheAncestors(animation) {\n var parent = animation.parent;\n\n while (parent && parent.parent) {\n //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.\n parent._dirty = 1;\n parent.totalDuration();\n parent = parent.parent;\n }\n\n return animation;\n},\n _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) {\n return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force));\n},\n _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {\n return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);\n},\n _elapsedCycleDuration = function _elapsedCycleDuration(animation) {\n return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;\n},\n // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.\n_animationCycle = function _animationCycle(tTime, cycleDuration) {\n var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration));\n return tTime && whole === tTime ? whole - 1 : whole;\n},\n _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {\n return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);\n},\n _setEnd = function _setEnd(animation) {\n return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));\n},\n _alignPlayhead = function _alignPlayhead(animation, totalTime) {\n // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.\n var parent = animation._dp;\n\n if (parent && parent.smoothChildTiming && animation._ts) {\n animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));\n\n _setEnd(animation);\n\n parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.\n }\n\n return animation;\n},\n\n/*\n_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {\n\tlet cycleDuration = duration + repeatDelay,\n\t\ttime = _round(clampedTotalTime % cycleDuration);\n\tif (time > duration) {\n\t\ttime = duration;\n\t}\n\treturn (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;\n},\n*/\n_postAddChecks = function _postAddChecks(timeline, child) {\n var t;\n\n if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) {\n // in case, for example, the _start is moved on a tween that has already rendered, or if it's being inserted into a timeline BEFORE where the playhead is currently. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. Special case: if it's a timeline (has .add() method) and no duration, we can skip rendering because the user may be populating it AFTER adding it to a parent timeline (unconventional, but possible, and we wouldn't want it to get removed if the parent's autoRemoveChildren is true).\n t = _parentToChildTotalTime(timeline.rawTime(), child);\n\n if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {\n child.render(t, true);\n }\n } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.\n\n\n if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {\n //in case any of the ancestors had completed but should now be enabled...\n if (timeline._dur < timeline.duration()) {\n t = timeline;\n\n while (t._dp) {\n t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.\n\n t = t._dp;\n }\n }\n\n timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.\n }\n},\n _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {\n child.parent && _removeFromParent(child);\n child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);\n child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));\n\n _addLinkedListItem(timeline, child, \"_first\", \"_last\", timeline._sort ? \"_start\" : 0);\n\n _isFromOrFromStart(child) || (timeline._recent = child);\n skipChecks || _postAddChecks(timeline, child);\n timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back)\n\n return timeline;\n},\n _scrollTrigger = function _scrollTrigger(animation, trigger) {\n return (_globals.ScrollTrigger || _missingPlugin(\"scrollTrigger\", trigger)) && _globals.ScrollTrigger.create(trigger, animation);\n},\n _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) {\n _initTween(tween, time, tTime);\n\n if (!tween._initted) {\n return 1;\n }\n\n if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {\n _lazyTweens.push(tween);\n\n tween._lazy = [tTime, suppressEvents];\n return 1;\n }\n},\n _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {\n var parent = _ref.parent;\n return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));\n},\n // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0\n_isFromOrFromStart = function _isFromOrFromStart(_ref2) {\n var data = _ref2.data;\n return data === \"isFromStart\" || data === \"isStart\";\n},\n _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {\n var prevRatio = tween.ratio,\n ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1,\n // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the \"startAt\" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any \"from\" and \"fromTo\" startAt tweens are rendered the first time at a ratio of 1.\n repeatDelay = tween._rDelay,\n tTime = 0,\n pt,\n iteration,\n prevIteration;\n\n if (repeatDelay && tween._repeat) {\n // in case there's a zero-duration tween that has a repeat with a repeatDelay\n tTime = _clamp(0, tween._tDur, totalTime);\n iteration = _animationCycle(tTime, repeatDelay);\n tween._yoyo && iteration & 1 && (ratio = 1 - ratio);\n\n if (iteration !== _animationCycle(tween._tTime, repeatDelay)) {\n // if iteration changed\n prevRatio = 1 - ratio;\n tween.vars.repeatRefresh && tween._initted && tween.invalidate();\n }\n }\n\n if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {\n if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) {\n // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.\n return;\n }\n\n prevIteration = tween._zTime;\n tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.\n\n tween.ratio = ratio;\n tween._from && (ratio = 1 - ratio);\n tween._time = 0;\n tween._tTime = tTime;\n pt = tween._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n\n totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true);\n tween._onUpdate && !suppressEvents && _callback(tween, \"onUpdate\");\n tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, \"onRepeat\");\n\n if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {\n ratio && _removeFromParent(tween, 1);\n\n if (!suppressEvents && !_reverting) {\n _callback(tween, ratio ? \"onComplete\" : \"onReverseComplete\", true);\n\n tween._prom && tween._prom();\n }\n }\n } else if (!tween._zTime) {\n tween._zTime = totalTime;\n }\n},\n _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {\n var child;\n\n if (time > prevTime) {\n child = animation._first;\n\n while (child && child._start <= time) {\n if (child.data === \"isPause\" && child._start > prevTime) {\n return child;\n }\n\n child = child._next;\n }\n } else {\n child = animation._last;\n\n while (child && child._start >= time) {\n if (child.data === \"isPause\" && child._start < prevTime) {\n return child;\n }\n\n child = child._prev;\n }\n }\n},\n _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {\n var repeat = animation._repeat,\n dur = _roundPrecise(duration) || 0,\n totalProgress = animation._tTime / animation._tDur;\n totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);\n animation._dur = dur;\n animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat);\n totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress);\n animation.parent && _setEnd(animation);\n skipUncache || _uncache(animation.parent, animation);\n return animation;\n},\n _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {\n return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);\n},\n _zeroPosition = {\n _start: 0,\n endTime: _emptyFunc,\n totalDuration: _emptyFunc\n},\n _parsePosition = function _parsePosition(animation, position, percentAnimation) {\n var labels = animation.labels,\n recent = animation._recent || _zeroPosition,\n clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,\n //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.\n i,\n offset,\n isPercent;\n\n if (_isString(position) && (isNaN(position) || position in labels)) {\n //if the string is a number like \"1\", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).\n offset = position.charAt(0);\n isPercent = position.substr(-1) === \"%\";\n i = position.indexOf(\"=\");\n\n if (offset === \"<\" || offset === \">\") {\n i >= 0 && (position = position.replace(/=/, \"\"));\n return (offset === \"<\" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);\n }\n\n if (i < 0) {\n position in labels || (labels[position] = clippedDuration);\n return labels[position];\n }\n\n offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1));\n\n if (isPercent && percentAnimation) {\n offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();\n }\n\n return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset;\n }\n\n return position == null ? clippedDuration : +position;\n},\n _createTweenType = function _createTweenType(type, params, timeline) {\n var isLegacy = _isNumber(params[1]),\n varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),\n vars = params[varsIndex],\n irVars,\n parent;\n\n isLegacy && (vars.duration = params[1]);\n vars.parent = timeline;\n\n if (type) {\n irVars = vars;\n parent = timeline;\n\n while (parent && !(\"immediateRender\" in irVars)) {\n // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.\n irVars = parent.vars.defaults || {};\n parent = _isNotFalse(parent.vars.inherit) && parent.parent;\n }\n\n vars.immediateRender = _isNotFalse(irVars.immediateRender);\n type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // \"from\" vars\n }\n\n return new Tween(params[0], vars, params[varsIndex + 1]);\n},\n _conditionalReturn = function _conditionalReturn(value, func) {\n return value || value === 0 ? func(value) : func;\n},\n _clamp = function _clamp(min, max, value) {\n return value < min ? min : value > max ? max : value;\n},\n getUnit = function getUnit(value, v) {\n return !_isString(value) || !(v = _unitExp.exec(value)) ? \"\" : v[1];\n},\n // note: protect against padded numbers as strings, like \"100.100\". That shouldn't return \"00\" as the unit. If it's numeric, return no unit.\nclamp = function clamp(min, max, value) {\n return _conditionalReturn(value, function (v) {\n return _clamp(min, max, v);\n });\n},\n _slice = [].slice,\n _isArrayLike = function _isArrayLike(value, nonEmpty) {\n return value && _isObject(value) && \"length\" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;\n},\n _flatten = function _flatten(ar, leaveStrings, accumulator) {\n if (accumulator === void 0) {\n accumulator = [];\n }\n\n return ar.forEach(function (value) {\n var _accumulator;\n\n return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);\n }) || accumulator;\n},\n // takes any value and returns an Array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.\ntoArray = function toArray(value, scope, leaveStrings) {\n return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];\n},\n selector = function selector(value) {\n value = toArray(value)[0] || _warn(\"Invalid scope\") || {};\n return function (v) {\n var el = value.current || value.nativeElement || value;\n return toArray(v, el.querySelectorAll ? el : el === value ? _warn(\"Invalid scope\") || _doc.createElement(\"div\") : value);\n };\n},\n shuffle = function shuffle(a) {\n return a.sort(function () {\n return .5 - Math.random();\n });\n},\n // alternative that's a bit faster and more reliably diverse but bigger: for (let j, v, i = a.length; i; j = (Math.random() * i) | 0, v = a[--i], a[i] = a[j], a[j] = v); return a;\n// for distributing values across an Array. Can accept a number, a function or (most commonly) an object which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array.\ndistribute = function distribute(v) {\n if (_isFunction(v)) {\n return v;\n }\n\n var vars = _isObject(v) ? v : {\n each: v\n },\n //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total \"amount\" that's chunked out among them all.\n ease = _parseEase(vars.ease),\n from = vars.from || 0,\n base = parseFloat(vars.base) || 0,\n cache = {},\n isDecimal = from > 0 && from < 1,\n ratios = isNaN(from) || isDecimal,\n axis = vars.axis,\n ratioX = from,\n ratioY = from;\n\n if (_isString(from)) {\n ratioX = ratioY = {\n center: .5,\n edges: .5,\n end: 1\n }[from] || 0;\n } else if (!isDecimal && ratios) {\n ratioX = from[0];\n ratioY = from[1];\n }\n\n return function (i, target, a) {\n var l = (a || vars).length,\n distances = cache[l],\n originX,\n originY,\n x,\n y,\n d,\n j,\n max,\n min,\n wrapAt;\n\n if (!distances) {\n wrapAt = vars.grid === \"auto\" ? 0 : (vars.grid || [1, _bigNum])[1];\n\n if (!wrapAt) {\n max = -_bigNum;\n\n while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}\n\n wrapAt < l && wrapAt--;\n }\n\n distances = cache[l] = [];\n originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;\n originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;\n max = 0;\n min = _bigNum;\n\n for (j = 0; j < l; j++) {\n x = j % wrapAt - originX;\n y = originY - (j / wrapAt | 0);\n distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === \"y\" ? y : x);\n d > max && (max = d);\n d < min && (min = d);\n }\n\n from === \"random\" && shuffle(distances);\n distances.max = max - min;\n distances.min = min;\n distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === \"y\" ? l / wrapAt : wrapAt) || 0) * (from === \"edges\" ? -1 : 1);\n distances.b = l < 0 ? base - l : base;\n distances.u = getUnit(vars.amount || vars.each) || 0; //unit\n\n ease = ease && l < 0 ? _invertEase(ease) : ease;\n }\n\n l = (distances[i] - distances.min) / distances.max || 0;\n return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors\n };\n},\n _roundModifier = function _roundModifier(v) {\n //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.\n var p = Math.pow(10, ((v + \"\").split(\".\")[1] || \"\").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed())\n\n return function (raw) {\n var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p);\n\n return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!\n };\n},\n snap = function snap(snapTo, value) {\n var isArray = _isArray(snapTo),\n radius,\n is2D;\n\n if (!isArray && _isObject(snapTo)) {\n radius = isArray = snapTo.radius || _bigNum;\n\n if (snapTo.values) {\n snapTo = toArray(snapTo.values);\n\n if (is2D = !_isNumber(snapTo[0])) {\n radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.\n }\n } else {\n snapTo = _roundModifier(snapTo.increment);\n }\n }\n\n return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {\n is2D = snapTo(raw);\n return Math.abs(is2D - raw) <= radius ? is2D : raw;\n } : function (raw) {\n var x = parseFloat(is2D ? raw.x : raw),\n y = parseFloat(is2D ? raw.y : 0),\n min = _bigNum,\n closest = 0,\n i = snapTo.length,\n dx,\n dy;\n\n while (i--) {\n if (is2D) {\n dx = snapTo[i].x - x;\n dy = snapTo[i].y - y;\n dx = dx * dx + dy * dy;\n } else {\n dx = Math.abs(snapTo[i] - x);\n }\n\n if (dx < min) {\n min = dx;\n closest = i;\n }\n }\n\n closest = !radius || min <= radius ? snapTo[closest] : raw;\n return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);\n });\n},\n random = function random(min, max, roundingIncrement, returnFunction) {\n return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {\n return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + \"\").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;\n });\n},\n pipe = function pipe() {\n for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {\n functions[_key] = arguments[_key];\n }\n\n return function (value) {\n return functions.reduce(function (v, f) {\n return f(v);\n }, value);\n };\n},\n unitize = function unitize(func, unit) {\n return function (value) {\n return func(parseFloat(value)) + (unit || getUnit(value));\n };\n},\n normalize = function normalize(min, max, value) {\n return mapRange(min, max, 0, 1, value);\n},\n _wrapArray = function _wrapArray(a, wrapper, value) {\n return _conditionalReturn(value, function (index) {\n return a[~~wrapper(index)];\n });\n},\n wrap = function wrap(min, max, value) {\n // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).\n var range = max - min;\n return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {\n return (range + (value - min) % range) % range + min;\n });\n},\n wrapYoyo = function wrapYoyo(min, max, value) {\n var range = max - min,\n total = range * 2;\n return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {\n value = (total + (value - min) % total) % total || 0;\n return min + (value > range ? total - value : value);\n });\n},\n _replaceRandom = function _replaceRandom(s) {\n return s.replace(_randomExp, function (match) {\n //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])\n var arIndex = match.indexOf(\"[\") + 1,\n values = match.substring(arIndex || 7, arIndex ? match.indexOf(\"]\") : match.length - 1).split(_commaDelimExp);\n return random(arIndex ? values : +values[0], arIndex ? 0 : +values[1], +values[2] || 1e-5);\n });\n},\n mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {\n var inRange = inMax - inMin,\n outRange = outMax - outMin;\n return _conditionalReturn(value, function (value) {\n return outMin + ((value - inMin) / inRange * outRange || 0);\n });\n},\n interpolate = function interpolate(start, end, progress, mutate) {\n var func = isNaN(start + end) ? 0 : function (p) {\n return (1 - p) * start + p * end;\n };\n\n if (!func) {\n var isString = _isString(start),\n master = {},\n p,\n i,\n interpolators,\n l,\n il;\n\n progress === true && (mutate = 1) && (progress = null);\n\n if (isString) {\n start = {\n p: start\n };\n end = {\n p: end\n };\n } else if (_isArray(start) && !_isArray(end)) {\n interpolators = [];\n l = start.length;\n il = l - 2;\n\n for (i = 1; i < l; i++) {\n interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.\n }\n\n l--;\n\n func = function func(p) {\n p *= l;\n var i = Math.min(il, ~~p);\n return interpolators[i](p - i);\n };\n\n progress = end;\n } else if (!mutate) {\n start = _merge(_isArray(start) ? [] : {}, start);\n }\n\n if (!interpolators) {\n for (p in end) {\n _addPropTween.call(master, start, p, \"get\", end[p]);\n }\n\n func = function func(p) {\n return _renderPropTweens(p, master) || (isString ? start.p : start);\n };\n }\n }\n\n return _conditionalReturn(progress, func);\n},\n _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {\n //used for nextLabel() and previousLabel()\n var labels = timeline.labels,\n min = _bigNum,\n p,\n distance,\n label;\n\n for (p in labels) {\n distance = labels[p] - fromTime;\n\n if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {\n label = p;\n min = distance;\n }\n }\n\n return label;\n},\n _callback = function _callback(animation, type, executeLazyFirst) {\n var v = animation.vars,\n callback = v[type],\n prevContext = _context,\n context = animation._ctx,\n params,\n scope,\n result;\n\n if (!callback) {\n return;\n }\n\n params = v[type + \"Params\"];\n scope = v.callbackScope || animation;\n executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.\n\n context && (_context = context);\n result = params ? callback.apply(scope, params) : callback.call(scope);\n _context = prevContext;\n return result;\n},\n _interrupt = function _interrupt(animation) {\n _removeFromParent(animation);\n\n animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting);\n animation.progress() < 1 && _callback(animation, \"onInterrupt\");\n return animation;\n},\n _quickTween,\n _registerPluginQueue = [],\n _createPlugin = function _createPlugin(config) {\n if (!config) return;\n config = !config.name && config[\"default\"] || config; // UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.\n\n if (_windowExists() || config.headless) {\n // edge case: some build tools may pass in a null/undefined value\n var name = config.name,\n isFunc = _isFunction(config),\n Plugin = name && !isFunc && config.init ? function () {\n this._props = [];\n } : config,\n //in case someone passes in an object that's not a plugin, like CustomEase\n instanceDefaults = {\n init: _emptyFunc,\n render: _renderPropTweens,\n add: _addPropTween,\n kill: _killPropTweensOf,\n modifier: _addPluginModifier,\n rawVars: 0\n },\n statics = {\n targetTest: 0,\n get: 0,\n getSetter: _getSetter,\n aliases: {},\n register: 0\n };\n\n _wake();\n\n if (config !== Plugin) {\n if (_plugins[name]) {\n return;\n }\n\n _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods\n\n\n _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods\n\n\n _plugins[Plugin.prop = name] = Plugin;\n\n if (config.targetTest) {\n _harnessPlugins.push(Plugin);\n\n _reservedProps[name] = 1;\n }\n\n name = (name === \"css\" ? \"CSS\" : name.charAt(0).toUpperCase() + name.substr(1)) + \"Plugin\"; //for the global name. \"motionPath\" should become MotionPathPlugin\n }\n\n _addGlobal(name, Plugin);\n\n config.register && config.register(gsap, Plugin, PropTween);\n } else {\n _registerPluginQueue.push(config);\n }\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * COLORS\n * --------------------------------------------------------------------------------------\n */\n_255 = 255,\n _colorLookup = {\n aqua: [0, _255, _255],\n lime: [0, _255, 0],\n silver: [192, 192, 192],\n black: [0, 0, 0],\n maroon: [128, 0, 0],\n teal: [0, 128, 128],\n blue: [0, 0, _255],\n navy: [0, 0, 128],\n white: [_255, _255, _255],\n olive: [128, 128, 0],\n yellow: [_255, _255, 0],\n orange: [_255, 165, 0],\n gray: [128, 128, 128],\n purple: [128, 0, 128],\n green: [0, 128, 0],\n red: [_255, 0, 0],\n pink: [_255, 192, 203],\n cyan: [0, _255, _255],\n transparent: [_255, _255, _255, 0]\n},\n // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc:\n// let ctx = _doc.createElement(\"canvas\").getContext(\"2d\");\n// _forEachName(\"aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan\", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)});\n_hue = function _hue(h, m1, m2) {\n h += h < 0 ? 1 : h > 1 ? -1 : 0;\n return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;\n},\n splitColor = function splitColor(v, toHSL, forceAlpha) {\n var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,\n r,\n g,\n b,\n h,\n s,\n l,\n max,\n min,\n d,\n wasHSL;\n\n if (!a) {\n if (v.substr(-1) === \",\") {\n //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:\"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)\" - in this example \"blue,\" has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.\n v = v.substr(0, v.length - 1);\n }\n\n if (_colorLookup[v]) {\n a = _colorLookup[v];\n } else if (v.charAt(0) === \"#\") {\n if (v.length < 6) {\n //for shorthand like #9F0 or #9F0F (could have alpha)\n r = v.charAt(1);\n g = v.charAt(2);\n b = v.charAt(3);\n v = \"#\" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : \"\");\n }\n\n if (v.length === 9) {\n // hex with alpha, like #fd5e53ff\n a = parseInt(v.substr(1, 6), 16);\n return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];\n }\n\n v = parseInt(v.substr(1), 16);\n a = [v >> 16, v >> 8 & _255, v & _255];\n } else if (v.substr(0, 3) === \"hsl\") {\n a = wasHSL = v.match(_strictNumExp);\n\n if (!toHSL) {\n h = +a[0] % 360 / 360;\n s = +a[1] / 100;\n l = +a[2] / 100;\n g = l <= .5 ? l * (s + 1) : l + s - l * s;\n r = l * 2 - g;\n a.length > 3 && (a[3] *= 1); //cast as number\n\n a[0] = _hue(h + 1 / 3, r, g);\n a[1] = _hue(h, r, g);\n a[2] = _hue(h - 1 / 3, r, g);\n } else if (~v.indexOf(\"=\")) {\n //if relative values are found, just return the raw strings with the relative prefixes in place.\n a = v.match(_numExp);\n forceAlpha && a.length < 4 && (a[3] = 1);\n return a;\n }\n } else {\n a = v.match(_strictNumExp) || _colorLookup.transparent;\n }\n\n a = a.map(Number);\n }\n\n if (toHSL && !wasHSL) {\n r = a[0] / _255;\n g = a[1] / _255;\n b = a[2] / _255;\n max = Math.max(r, g, b);\n min = Math.min(r, g, b);\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0;\n } else {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;\n h *= 60;\n }\n\n a[0] = ~~(h + .5);\n a[1] = ~~(s * 100 + .5);\n a[2] = ~~(l * 100 + .5);\n }\n\n forceAlpha && a.length < 4 && (a[3] = 1);\n return a;\n},\n _colorOrderData = function _colorOrderData(v) {\n // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a \"c\" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()\n var values = [],\n c = [],\n i = -1;\n v.split(_colorExp).forEach(function (v) {\n var a = v.match(_numWithUnitExp) || [];\n values.push.apply(values, a);\n c.push(i += a.length + 1);\n });\n values.c = c;\n return values;\n},\n _formatColors = function _formatColors(s, toHSL, orderMatchData) {\n var result = \"\",\n colors = (s + result).match(_colorExp),\n type = toHSL ? \"hsla(\" : \"rgba(\",\n i = 0,\n c,\n shell,\n d,\n l;\n\n if (!colors) {\n return s;\n }\n\n colors = colors.map(function (color) {\n return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + \",\" + color[1] + \"%,\" + color[2] + \"%,\" + color[3] : color.join(\",\")) + \")\";\n });\n\n if (orderMatchData) {\n d = _colorOrderData(s);\n c = orderMatchData.c;\n\n if (c.join(result) !== d.c.join(result)) {\n shell = s.replace(_colorExp, \"1\").split(_numWithUnitExp);\n l = shell.length - 1;\n\n for (; i < l; i++) {\n result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + \"0,0,0,0)\" : (d.length ? d : colors.length ? colors : orderMatchData).shift());\n }\n }\n }\n\n if (!shell) {\n shell = s.split(_colorExp);\n l = shell.length - 1;\n\n for (; i < l; i++) {\n result += shell[i] + colors[i];\n }\n }\n\n return result + shell[l];\n},\n _colorExp = function () {\n var s = \"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b\",\n //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,\n p;\n\n for (p in _colorLookup) {\n s += \"|\" + p + \"\\\\b\";\n }\n\n return new RegExp(s + \")\", \"gi\");\n}(),\n _hslExp = /hsl[a]?\\(/,\n _colorStringFilter = function _colorStringFilter(a) {\n var combined = a.join(\" \"),\n toHSL;\n _colorExp.lastIndex = 0;\n\n if (_colorExp.test(combined)) {\n toHSL = _hslExp.test(combined);\n a[1] = _formatColors(a[1], toHSL);\n a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.\n\n return true;\n }\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TICKER\n * --------------------------------------------------------------------------------------\n */\n_tickerActive,\n _ticker = function () {\n var _getTime = Date.now,\n _lagThreshold = 500,\n _adjustedLag = 33,\n _startTime = _getTime(),\n _lastUpdate = _startTime,\n _gap = 1000 / 240,\n _nextTime = _gap,\n _listeners = [],\n _id,\n _req,\n _raf,\n _self,\n _delta,\n _i,\n _tick = function _tick(v) {\n var elapsed = _getTime() - _lastUpdate,\n manual = v === true,\n overlap,\n dispatch,\n time,\n frame;\n\n (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag);\n _lastUpdate += elapsed;\n time = _lastUpdate - _startTime;\n overlap = time - _nextTime;\n\n if (overlap > 0 || manual) {\n frame = ++_self.frame;\n _delta = time - _self.time * 1000;\n _self.time = time = time / 1000;\n _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);\n dispatch = 1;\n }\n\n manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the \"tick\" event so that timing is maintained. Otherwise, if processing the \"tick\" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.\n\n if (dispatch) {\n for (_i = 0; _i < _listeners.length; _i++) {\n // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.\n _listeners[_i](time, _delta, frame, v);\n }\n }\n };\n\n _self = {\n time: 0,\n frame: 0,\n tick: function tick() {\n _tick(true);\n },\n deltaRatio: function deltaRatio(fps) {\n return _delta / (1000 / (fps || 60));\n },\n wake: function wake() {\n if (_coreReady) {\n if (!_coreInitted && _windowExists()) {\n _win = _coreInitted = window;\n _doc = _win.document || {};\n _globals.gsap = gsap;\n (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);\n\n _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});\n\n _registerPluginQueue.forEach(_createPlugin);\n }\n\n _raf = typeof requestAnimationFrame !== \"undefined\" && requestAnimationFrame;\n _id && _self.sleep();\n\n _req = _raf || function (f) {\n return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);\n };\n\n _tickerActive = 1;\n\n _tick(2);\n }\n },\n sleep: function sleep() {\n (_raf ? cancelAnimationFrame : clearTimeout)(_id);\n _tickerActive = 0;\n _req = _emptyFunc;\n },\n lagSmoothing: function lagSmoothing(threshold, adjustedLag) {\n _lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited\n\n _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold);\n },\n fps: function fps(_fps) {\n _gap = 1000 / (_fps || 240);\n _nextTime = _self.time * 1000 + _gap;\n },\n add: function add(callback, once, prioritize) {\n var func = once ? function (t, d, f, v) {\n callback(t, d, f, v);\n\n _self.remove(func);\n } : callback;\n\n _self.remove(callback);\n\n _listeners[prioritize ? \"unshift\" : \"push\"](func);\n\n _wake();\n\n return func;\n },\n remove: function remove(callback, i) {\n ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;\n },\n _listeners: _listeners\n };\n return _self;\n}(),\n _wake = function _wake() {\n return !_tickerActive && _ticker.wake();\n},\n //also ensures the core classes are initialized.\n\n/*\n* -------------------------------------------------\n* EASING\n* -------------------------------------------------\n*/\n_easeMap = {},\n _customEaseExp = /^[\\d.\\-M][\\d.\\-,\\s]/,\n _quotesExp = /[\"']/g,\n _parseObjectInString = function _parseObjectInString(value) {\n //takes a string like \"{wiggles:10, type:anticipate})\" and turns it into a real object. Notice it ends in \")\" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.\n var obj = {},\n split = value.substr(1, value.length - 3).split(\":\"),\n key = split[0],\n i = 1,\n l = split.length,\n index,\n val,\n parsedVal;\n\n for (; i < l; i++) {\n val = split[i];\n index = i !== l - 1 ? val.lastIndexOf(\",\") : val.length;\n parsedVal = val.substr(0, index);\n obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, \"\").trim() : +parsedVal;\n key = val.substr(index + 1).trim();\n }\n\n return obj;\n},\n _valueInParentheses = function _valueInParentheses(value) {\n var open = value.indexOf(\"(\") + 1,\n close = value.indexOf(\")\"),\n nested = value.indexOf(\"(\", open);\n return value.substring(open, ~nested && nested < close ? value.indexOf(\")\", close + 1) : close);\n},\n _configEaseFromString = function _configEaseFromString(name) {\n //name can be a string like \"elastic.out(1,0.5)\", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).\n var split = (name + \"\").split(\"(\"),\n ease = _easeMap[split[0]];\n return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf(\"{\") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(\",\").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE(\"\", name) : ease;\n},\n _invertEase = function _invertEase(ease) {\n return function (p) {\n return 1 - ease(1 - p);\n };\n},\n _parseEase = function _parseEase(ease, defaultEase) {\n return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;\n},\n _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {\n if (easeOut === void 0) {\n easeOut = function easeOut(p) {\n return 1 - easeIn(1 - p);\n };\n }\n\n if (easeInOut === void 0) {\n easeInOut = function easeInOut(p) {\n return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;\n };\n }\n\n var ease = {\n easeIn: easeIn,\n easeOut: easeOut,\n easeInOut: easeInOut\n },\n lowercaseName;\n\n _forEachName(names, function (name) {\n _easeMap[name] = _globals[name] = ease;\n _easeMap[lowercaseName = name.toLowerCase()] = easeOut;\n\n for (var p in ease) {\n _easeMap[lowercaseName + (p === \"easeIn\" ? \".in\" : p === \"easeOut\" ? \".out\" : \".inOut\")] = _easeMap[name + \".\" + p] = ease[p];\n }\n });\n\n return ease;\n},\n _easeInOutFromOut = function _easeInOutFromOut(easeOut) {\n return function (p) {\n return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;\n };\n},\n _configElastic = function _configElastic(type, amplitude, period) {\n var p1 = amplitude >= 1 ? amplitude : 1,\n //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.\n p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),\n p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),\n easeOut = function easeOut(p) {\n return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;\n },\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n return 1 - easeOut(1 - p);\n } : _easeInOutFromOut(easeOut);\n\n p2 = _2PI / p2; //precalculate to optimize\n\n ease.config = function (amplitude, period) {\n return _configElastic(type, amplitude, period);\n };\n\n return ease;\n},\n _configBack = function _configBack(type, overshoot) {\n if (overshoot === void 0) {\n overshoot = 1.70158;\n }\n\n var easeOut = function easeOut(p) {\n return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;\n },\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n return 1 - easeOut(1 - p);\n } : _easeInOutFromOut(easeOut);\n\n ease.config = function (overshoot) {\n return _configBack(type, overshoot);\n };\n\n return ease;\n}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEase = ratio => {\n// \tlet y = 0.5 + ratio / 2;\n// \treturn p => (2 * (1 - p) * p * y + p * p);\n// },\n// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEaseStrong = ratio => {\n// \tratio = .5 + ratio / 2;\n// \tlet o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),\n// \t\tb = ratio - o,\n// \t\tc = ratio + o;\n// \treturn p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;\n// };\n\n\n_forEachName(\"Linear,Quad,Cubic,Quart,Quint,Strong\", function (name, i) {\n var power = i < 5 ? i + 1 : i;\n\n _insertEase(name + \",Power\" + (power - 1), i ? function (p) {\n return Math.pow(p, power);\n } : function (p) {\n return p;\n }, function (p) {\n return 1 - Math.pow(1 - p, power);\n }, function (p) {\n return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;\n });\n});\n\n_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;\n\n_insertEase(\"Elastic\", _configElastic(\"in\"), _configElastic(\"out\"), _configElastic());\n\n(function (n, c) {\n var n1 = 1 / c,\n n2 = 2 * n1,\n n3 = 2.5 * n1,\n easeOut = function easeOut(p) {\n return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;\n };\n\n _insertEase(\"Bounce\", function (p) {\n return 1 - easeOut(1 - p);\n }, easeOut);\n})(7.5625, 2.75);\n\n_insertEase(\"Expo\", function (p) {\n return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p);\n}); // previously 2 ** (10 * (p - 1)) but that doesn't end up with the value quite at the right spot so we do a blended ease to ensure it lands where it should perfectly.\n\n\n_insertEase(\"Circ\", function (p) {\n return -(_sqrt(1 - p * p) - 1);\n});\n\n_insertEase(\"Sine\", function (p) {\n return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;\n});\n\n_insertEase(\"Back\", _configBack(\"in\"), _configBack(\"out\"), _configBack());\n\n_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {\n config: function config(steps, immediateStart) {\n if (steps === void 0) {\n steps = 1;\n }\n\n var p1 = 1 / steps,\n p2 = steps + (immediateStart ? 0 : 1),\n p3 = immediateStart ? 1 : 0,\n max = 1 - _tinyNum;\n return function (p) {\n return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;\n };\n }\n};\n_defaults.ease = _easeMap[\"quad.out\"];\n\n_forEachName(\"onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt\", function (name) {\n return _callbackNames += name + \",\" + name + \"Params,\";\n});\n/*\n * --------------------------------------------------------------------------------------\n * CACHE\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var GSCache = function GSCache(target, harness) {\n this.id = _gsID++;\n target._gsap = this;\n this.target = target;\n this.harness = harness;\n this.get = harness ? harness.get : _getProperty;\n this.set = harness ? harness.getSetter : _getSetter;\n};\n/*\n * --------------------------------------------------------------------------------------\n * ANIMATION\n * --------------------------------------------------------------------------------------\n */\n\nexport var Animation = /*#__PURE__*/function () {\n function Animation(vars) {\n this.vars = vars;\n this._delay = +vars.delay || 0;\n\n if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {\n // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.\n this._rDelay = vars.repeatDelay || 0;\n this._yoyo = !!vars.yoyo || !!vars.yoyoEase;\n }\n\n this._ts = 1;\n\n _setDuration(this, +vars.duration, 1, 1);\n\n this.data = vars.data;\n\n if (_context) {\n this._ctx = _context;\n\n _context.data.push(this);\n }\n\n _tickerActive || _ticker.wake();\n }\n\n var _proto = Animation.prototype;\n\n _proto.delay = function delay(value) {\n if (value || value === 0) {\n this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);\n this._delay = value;\n return this;\n }\n\n return this._delay;\n };\n\n _proto.duration = function duration(value) {\n return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;\n };\n\n _proto.totalDuration = function totalDuration(value) {\n if (!arguments.length) {\n return this._tDur;\n }\n\n this._dirty = 0;\n return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));\n };\n\n _proto.totalTime = function totalTime(_totalTime, suppressEvents) {\n _wake();\n\n if (!arguments.length) {\n return this._tTime;\n }\n\n var parent = this._dp;\n\n if (parent && parent.smoothChildTiming && this._ts) {\n _alignPlayhead(this, _totalTime);\n\n !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.\n //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.\n\n while (parent && parent.parent) {\n if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {\n parent.totalTime(parent._tTime, true);\n }\n\n parent = parent.parent;\n }\n\n if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {\n //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.\n _addToTimeline(this._dp, this, this._start - this._delay);\n }\n }\n\n if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !this._initted && this._dur && _totalTime || !_totalTime && !this._initted && (this.add || this._ptLookup)) {\n // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)\n this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause\n //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)\n // this._lock = 1;\n\n _lazySafeRender(this, _totalTime, suppressEvents); // this._lock = 0;\n //}\n\n }\n\n return this;\n };\n\n _proto.time = function time(value, suppressEvents) {\n return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!\n };\n\n _proto.totalProgress = function totalProgress(value, suppressEvents) {\n return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0;\n };\n\n _proto.progress = function progress(value, suppressEvents) {\n return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0;\n };\n\n _proto.iteration = function iteration(value, suppressEvents) {\n var cycleDuration = this.duration() + this._rDelay;\n\n return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;\n } // potential future addition:\n // isPlayingBackwards() {\n // \tlet animation = this,\n // \t\torientation = 1; // 1 = forward, -1 = backward\n // \twhile (animation) {\n // \t\torientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;\n // \t\tanimation = animation.parent;\n // \t}\n // \treturn orientation < 0;\n // }\n ;\n\n _proto.timeScale = function timeScale(value, suppressEvents) {\n if (!arguments.length) {\n return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.\n }\n\n if (this._rts === value) {\n return this;\n }\n\n var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.\n // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called.\n //(+value < 0 && this._rts >= 0) && _callback(this, \"onReverse\", true);\n // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.\n\n this._rts = +value || 0;\n this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.\n\n this.totalTime(_clamp(-Math.abs(this._delay), this.totalDuration(), tTime), suppressEvents !== false);\n\n _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here.\n\n\n return _recacheAncestors(this);\n };\n\n _proto.paused = function paused(value) {\n if (!arguments.length) {\n return this._ps;\n } // possible future addition - if an animation is removed from its parent and then .restart() or .play() or .resume() is called, perhaps we should force it back into the globalTimeline but be careful because what if it's already at its end? We don't want it to just persist forever and not get released for GC.\n // !this.parent && !value && this._tTime < this._tDur && this !== _globalTimeline && _globalTimeline.add(this);\n\n\n if (this._ps !== value) {\n this._ps = value;\n\n if (value) {\n this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.\n\n this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the \"real\" timeScale as _rts (recorded time scale)\n } else {\n _wake();\n\n this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.\n\n this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.\n }\n }\n\n return this;\n };\n\n _proto.startTime = function startTime(value) {\n if (arguments.length) {\n this._start = _roundPrecise(value);\n var parent = this.parent || this._dp;\n parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, this._start - this._delay);\n return this;\n }\n\n return this._start;\n };\n\n _proto.endTime = function endTime(includeRepeats) {\n return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);\n };\n\n _proto.rawTime = function rawTime(wrapRepeats) {\n var parent = this.parent || this._dp; // _dp = detached parent\n\n return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);\n };\n\n _proto.revert = function revert(config) {\n if (config === void 0) {\n config = _revertConfig;\n }\n\n var prevIsReverting = _reverting;\n _reverting = config;\n\n if (_isRevertWorthy(this)) {\n this.timeline && this.timeline.revert(config);\n this.totalTime(-0.01, config.suppressEvents);\n }\n\n this.data !== \"nested\" && config.kill !== false && this.kill();\n _reverting = prevIsReverting;\n return this;\n };\n\n _proto.globalTime = function globalTime(rawTime) {\n var animation = this,\n time = arguments.length ? rawTime : animation.rawTime();\n\n while (animation) {\n time = animation._start + time / (Math.abs(animation._ts) || 1);\n animation = animation._dp;\n }\n\n return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). \"_sat\" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert().\n };\n\n _proto.repeat = function repeat(value) {\n if (arguments.length) {\n this._repeat = value === Infinity ? -2 : value;\n return _onUpdateTotalDuration(this);\n }\n\n return this._repeat === -2 ? Infinity : this._repeat;\n };\n\n _proto.repeatDelay = function repeatDelay(value) {\n if (arguments.length) {\n var time = this._time;\n this._rDelay = value;\n\n _onUpdateTotalDuration(this);\n\n return time ? this.time(time) : this;\n }\n\n return this._rDelay;\n };\n\n _proto.yoyo = function yoyo(value) {\n if (arguments.length) {\n this._yoyo = value;\n return this;\n }\n\n return this._yoyo;\n };\n\n _proto.seek = function seek(position, suppressEvents) {\n return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));\n };\n\n _proto.restart = function restart(includeDelay, suppressEvents) {\n this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));\n this._dur || (this._zTime = -_tinyNum); // ensures onComplete fires on a zero-duration animation that gets restarted.\n\n return this;\n };\n\n _proto.play = function play(from, suppressEvents) {\n from != null && this.seek(from, suppressEvents);\n return this.reversed(false).paused(false);\n };\n\n _proto.reverse = function reverse(from, suppressEvents) {\n from != null && this.seek(from || this.totalDuration(), suppressEvents);\n return this.reversed(true).paused(false);\n };\n\n _proto.pause = function pause(atTime, suppressEvents) {\n atTime != null && this.seek(atTime, suppressEvents);\n return this.paused(true);\n };\n\n _proto.resume = function resume() {\n return this.paused(false);\n };\n\n _proto.reversed = function reversed(value) {\n if (arguments.length) {\n !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.\n\n return this;\n }\n\n return this._rts < 0;\n };\n\n _proto.invalidate = function invalidate() {\n this._initted = this._act = 0;\n this._zTime = -_tinyNum;\n return this;\n };\n\n _proto.isActive = function isActive() {\n var parent = this.parent || this._dp,\n start = this._start,\n rawTime;\n return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);\n };\n\n _proto.eventCallback = function eventCallback(type, callback, params) {\n var vars = this.vars;\n\n if (arguments.length > 1) {\n if (!callback) {\n delete vars[type];\n } else {\n vars[type] = callback;\n params && (vars[type + \"Params\"] = params);\n type === \"onUpdate\" && (this._onUpdate = callback);\n }\n\n return this;\n }\n\n return vars[type];\n };\n\n _proto.then = function then(onFulfilled) {\n var self = this,\n prevProm = self._prom;\n return new Promise(function (resolve) {\n var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,\n _resolve = function _resolve() {\n var _then = self.then;\n self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)\n\n prevProm && prevProm();\n _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);\n resolve(f);\n self.then = _then;\n };\n\n if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {\n _resolve();\n } else {\n self._prom = _resolve;\n }\n });\n };\n\n _proto.kill = function kill() {\n _interrupt(this);\n };\n\n return Animation;\n}();\n\n_setDefaults(Animation.prototype, {\n _time: 0,\n _start: 0,\n _end: 0,\n _tTime: 0,\n _tDur: 0,\n _dirty: 0,\n _repeat: 0,\n _yoyo: false,\n parent: null,\n _initted: false,\n _rDelay: 0,\n _ts: 1,\n _dp: 0,\n ratio: 0,\n _zTime: -_tinyNum,\n _prom: 0,\n _ps: false,\n _rts: 1\n});\n/*\n * -------------------------------------------------\n * TIMELINE\n * -------------------------------------------------\n */\n\n\nexport var Timeline = /*#__PURE__*/function (_Animation) {\n _inheritsLoose(Timeline, _Animation);\n\n function Timeline(vars, position) {\n var _this;\n\n if (vars === void 0) {\n vars = {};\n }\n\n _this = _Animation.call(this, vars) || this;\n _this.labels = {};\n _this.smoothChildTiming = !!vars.smoothChildTiming;\n _this.autoRemoveChildren = !!vars.autoRemoveChildren;\n _this._sort = _isNotFalse(vars.sortChildren);\n _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position);\n vars.reversed && _this.reverse();\n vars.paused && _this.paused(true);\n vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);\n return _this;\n }\n\n var _proto2 = Timeline.prototype;\n\n _proto2.to = function to(targets, vars, position) {\n _createTweenType(0, arguments, this);\n\n return this;\n };\n\n _proto2.from = function from(targets, vars, position) {\n _createTweenType(1, arguments, this);\n\n return this;\n };\n\n _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {\n _createTweenType(2, arguments, this);\n\n return this;\n };\n\n _proto2.set = function set(targets, vars, position) {\n vars.duration = 0;\n vars.parent = this;\n _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);\n vars.immediateRender = !!vars.immediateRender;\n new Tween(targets, vars, _parsePosition(this, position), 1);\n return this;\n };\n\n _proto2.call = function call(callback, params, position) {\n return _addToTimeline(this, Tween.delayedCall(0, callback, params), position);\n } //ONLY for backward compatibility! Maybe delete?\n ;\n\n _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n vars.duration = duration;\n vars.stagger = vars.stagger || stagger;\n vars.onComplete = onCompleteAll;\n vars.onCompleteParams = onCompleteAllParams;\n vars.parent = this;\n new Tween(targets, vars, _parsePosition(this, position));\n return this;\n };\n\n _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n vars.runBackwards = 1;\n _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);\n return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);\n };\n\n _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {\n toVars.startAt = fromVars;\n _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);\n return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);\n };\n\n _proto2.render = function render(totalTime, suppressEvents, force) {\n var prevTime = this._time,\n tDur = this._dirty ? this.totalDuration() : this._tDur,\n dur = this._dur,\n tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime),\n // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example.\n crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),\n time,\n child,\n next,\n iteration,\n cycleDuration,\n prevPaused,\n pauseTween,\n timeScale,\n prevStart,\n prevIteration,\n yoyo,\n isYoyo;\n this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);\n\n if (tTime !== this._tTime || force || crossingStart) {\n if (prevTime !== this._time && dur) {\n //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).\n tTime += this._time - prevTime;\n totalTime += this._time - prevTime;\n }\n\n time = tTime;\n prevStart = this._start;\n timeScale = this._ts;\n prevPaused = !timeScale;\n\n if (crossingStart) {\n dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n (totalTime || !suppressEvents) && (this._zTime = totalTime);\n }\n\n if (this._repeat) {\n //adjust the time for repeats and yoyos\n yoyo = this._yoyo;\n cycleDuration = dur + this._rDelay;\n\n if (this._repeat < -1 && totalTime < 0) {\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n }\n\n time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n if (tTime === tDur) {\n // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n iteration = this._repeat;\n time = dur;\n } else {\n prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)\n\n iteration = ~~prevIteration;\n\n if (iteration && iteration === prevIteration) {\n time = dur;\n iteration--;\n }\n\n time > dur && (time = dur);\n }\n\n prevIteration = _animationCycle(this._tTime, cycleDuration);\n !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://gsap.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the \"repeatDelay\" portion\n\n if (yoyo && iteration & 1) {\n time = dur - time;\n isYoyo = 1;\n }\n /*\n make sure children at the end/beginning of the timeline are rendered properly. If, for example,\n a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which\n would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there\n could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So\n we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must\n ensure that zero-duration tweens at the very beginning or end of the Timeline work.\n */\n\n\n if (iteration !== prevIteration && !this._lock) {\n var rewinding = yoyo && prevIteration & 1,\n doesWrap = rewinding === (yoyo && iteration & 1);\n iteration < prevIteration && (rewinding = !rewinding);\n prevTime = rewinding ? 0 : tTime % dur ? dur : tTime; // if the playhead is landing exactly at the end of an iteration, use that totalTime rather than only the duration, otherwise it'll skip the 2nd render since it's effectively at the same time.\n\n this._lock = 1;\n this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;\n this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate.\n\n !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n if (this.vars.repeatRefresh && !isYoyo) {\n this.invalidate()._lock = 1;\n prevIteration = iteration; // otherwise, the onStart() may fire on the 2nd iteration.\n }\n\n if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {\n // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.\n return this;\n }\n\n dur = this._dur; // in case the duration changed in the onRepeat\n\n tDur = this._tDur;\n\n if (doesWrap) {\n this._lock = 2;\n prevTime = rewinding ? dur : -0.0001;\n this.render(prevTime, true);\n this.vars.repeatRefresh && !isYoyo && this.invalidate();\n }\n\n this._lock = 0;\n\n if (!this._ts && !prevPaused) {\n return this;\n }\n }\n }\n\n if (this._hasPause && !this._forcing && this._lock < 2) {\n pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));\n\n if (pauseTween) {\n tTime -= time - (time = pauseTween._start);\n }\n }\n\n this._tTime = tTime;\n this._time = time;\n this._act = !!timeScale; // as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n if (!this._initted) {\n this._onUpdate = this.vars.onUpdate;\n this._initted = 1;\n this._zTime = totalTime;\n prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).\n }\n\n if (!prevTime && tTime && dur && !suppressEvents && !prevIteration) {\n _callback(this, \"onStart\");\n\n if (this._tTime !== tTime) {\n // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n return this;\n }\n }\n\n if (time >= prevTime && totalTime >= 0) {\n child = this._first;\n\n while (child) {\n next = child._next;\n\n if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {\n if (child.parent !== this) {\n // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n return this.render(totalTime, suppressEvents, force);\n }\n\n child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);\n\n if (time !== this._time || !this._ts && !prevPaused) {\n //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n pauseTween = 0;\n next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that the next time render() is called it'll be forced (to render any remaining children)\n\n break;\n }\n }\n\n child = next;\n }\n } else {\n child = this._last;\n var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.\n\n while (child) {\n next = child._prev;\n\n if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {\n if (child.parent !== this) {\n // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n return this.render(totalTime, suppressEvents, force);\n }\n\n child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && _isRevertWorthy(child)); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert.\n\n if (time !== this._time || !this._ts && !prevPaused) {\n //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n pauseTween = 0;\n next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)\n\n break;\n }\n }\n\n child = next;\n }\n }\n\n if (pauseTween && !suppressEvents) {\n this.pause();\n pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;\n\n if (this._ts) {\n //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).\n this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.\n\n _setEnd(this);\n\n return this.render(totalTime, suppressEvents, force);\n }\n }\n\n this._onUpdate && !suppressEvents && _callback(this, \"onUpdate\", true);\n if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {\n // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks.\n (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {\n _callback(this, tTime === tDur && totalTime >= 0 ? \"onComplete\" : \"onReverseComplete\", true);\n\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n }\n }\n }\n\n return this;\n };\n\n _proto2.add = function add(child, position) {\n var _this2 = this;\n\n _isNumber(position) || (position = _parsePosition(this, position, child));\n\n if (!(child instanceof Animation)) {\n if (_isArray(child)) {\n child.forEach(function (obj) {\n return _this2.add(obj, position);\n });\n return this;\n }\n\n if (_isString(child)) {\n return this.addLabel(child, position);\n }\n\n if (_isFunction(child)) {\n child = Tween.delayedCall(0, child);\n } else {\n return this;\n }\n }\n\n return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!\n };\n\n _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {\n if (nested === void 0) {\n nested = true;\n }\n\n if (tweens === void 0) {\n tweens = true;\n }\n\n if (timelines === void 0) {\n timelines = true;\n }\n\n if (ignoreBeforeTime === void 0) {\n ignoreBeforeTime = -_bigNum;\n }\n\n var a = [],\n child = this._first;\n\n while (child) {\n if (child._start >= ignoreBeforeTime) {\n if (child instanceof Tween) {\n tweens && a.push(child);\n } else {\n timelines && a.push(child);\n nested && a.push.apply(a, child.getChildren(true, tweens, timelines));\n }\n }\n\n child = child._next;\n }\n\n return a;\n };\n\n _proto2.getById = function getById(id) {\n var animations = this.getChildren(1, 1, 1),\n i = animations.length;\n\n while (i--) {\n if (animations[i].vars.id === id) {\n return animations[i];\n }\n }\n };\n\n _proto2.remove = function remove(child) {\n if (_isString(child)) {\n return this.removeLabel(child);\n }\n\n if (_isFunction(child)) {\n return this.killTweensOf(child);\n }\n\n child.parent === this && _removeLinkedListItem(this, child);\n\n if (child === this._recent) {\n this._recent = this._last;\n }\n\n return _uncache(this);\n };\n\n _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {\n if (!arguments.length) {\n return this._tTime;\n }\n\n this._forcing = 1;\n\n if (!this._dp && this._ts) {\n //special case for the global timeline (or any other that has no parent or detached parent).\n this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));\n }\n\n _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);\n\n this._forcing = 0;\n return this;\n };\n\n _proto2.addLabel = function addLabel(label, position) {\n this.labels[label] = _parsePosition(this, position);\n return this;\n };\n\n _proto2.removeLabel = function removeLabel(label) {\n delete this.labels[label];\n return this;\n };\n\n _proto2.addPause = function addPause(position, callback, params) {\n var t = Tween.delayedCall(0, callback || _emptyFunc, params);\n t.data = \"isPause\";\n this._hasPause = 1;\n return _addToTimeline(this, t, _parsePosition(this, position));\n };\n\n _proto2.removePause = function removePause(position) {\n var child = this._first;\n position = _parsePosition(this, position);\n\n while (child) {\n if (child._start === position && child.data === \"isPause\") {\n _removeFromParent(child);\n }\n\n child = child._next;\n }\n };\n\n _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n var tweens = this.getTweensOf(targets, onlyActive),\n i = tweens.length;\n\n while (i--) {\n _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);\n }\n\n return this;\n };\n\n _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {\n var a = [],\n parsedTargets = toArray(targets),\n child = this._first,\n isGlobalTime = _isNumber(onlyActive),\n // a number is interpreted as a global time. If the animation spans\n children;\n\n while (child) {\n if (child instanceof Tween) {\n if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {\n // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.\n a.push(child);\n }\n } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {\n a.push.apply(a, children);\n }\n\n child = child._next;\n }\n\n return a;\n } // potential future feature - targets() on timelines\n // targets() {\n // \tlet result = [];\n // \tthis.getChildren(true, true, false).forEach(t => result.push(...t.targets()));\n // \treturn result.filter((v, i) => result.indexOf(v) === i);\n // }\n ;\n\n _proto2.tweenTo = function tweenTo(position, vars) {\n vars = vars || {};\n\n var tl = this,\n endTime = _parsePosition(tl, position),\n _vars = vars,\n startAt = _vars.startAt,\n _onStart = _vars.onStart,\n onStartParams = _vars.onStartParams,\n immediateRender = _vars.immediateRender,\n initted,\n tween = Tween.to(tl, _setDefaults({\n ease: vars.ease || \"none\",\n lazy: false,\n immediateRender: false,\n time: endTime,\n overwrite: \"auto\",\n duration: vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,\n onStart: function onStart() {\n tl.pause();\n\n if (!initted) {\n var duration = vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale());\n tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);\n initted = 1;\n }\n\n _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.\n }\n }, vars));\n\n return immediateRender ? tween.render(0) : tween;\n };\n\n _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {\n return this.tweenTo(toPosition, _setDefaults({\n startAt: {\n time: _parsePosition(this, fromPosition)\n }\n }, vars));\n };\n\n _proto2.recent = function recent() {\n return this._recent;\n };\n\n _proto2.nextLabel = function nextLabel(afterTime) {\n if (afterTime === void 0) {\n afterTime = this._time;\n }\n\n return _getLabelInDirection(this, _parsePosition(this, afterTime));\n };\n\n _proto2.previousLabel = function previousLabel(beforeTime) {\n if (beforeTime === void 0) {\n beforeTime = this._time;\n }\n\n return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);\n };\n\n _proto2.currentLabel = function currentLabel(value) {\n return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);\n };\n\n _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {\n if (ignoreBeforeTime === void 0) {\n ignoreBeforeTime = 0;\n }\n\n var child = this._first,\n labels = this.labels,\n p;\n amount = _roundPrecise(amount);\n\n while (child) {\n if (child._start >= ignoreBeforeTime) {\n child._start += amount;\n child._end += amount;\n }\n\n child = child._next;\n }\n\n if (adjustLabels) {\n for (p in labels) {\n if (labels[p] >= ignoreBeforeTime) {\n labels[p] += amount;\n }\n }\n }\n\n return _uncache(this);\n };\n\n _proto2.invalidate = function invalidate(soft) {\n var child = this._first;\n this._lock = 0;\n\n while (child) {\n child.invalidate(soft);\n child = child._next;\n }\n\n return _Animation.prototype.invalidate.call(this, soft);\n };\n\n _proto2.clear = function clear(includeLabels) {\n if (includeLabels === void 0) {\n includeLabels = true;\n }\n\n var child = this._first,\n next;\n\n while (child) {\n next = child._next;\n this.remove(child);\n child = next;\n }\n\n this._dp && (this._time = this._tTime = this._pTime = 0);\n includeLabels && (this.labels = {});\n return _uncache(this);\n };\n\n _proto2.totalDuration = function totalDuration(value) {\n var max = 0,\n self = this,\n child = self._last,\n prevStart = _bigNum,\n prev,\n start,\n parent;\n\n if (arguments.length) {\n return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));\n }\n\n if (self._dirty) {\n parent = self.parent;\n\n while (child) {\n prev = child._prev; //record it here in case the tween changes position in the sequence...\n\n child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.\n\n start = child._start;\n\n if (start > prevStart && self._sort && child._ts && !self._lock) {\n //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence\n self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().\n\n _addToTimeline(self, child, start - child._delay, 1)._lock = 0;\n } else {\n prevStart = start;\n }\n\n if (start < 0 && child._ts) {\n //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.\n max -= start;\n\n if (!parent && !self._dp || parent && parent.smoothChildTiming) {\n self._start += _roundPrecise(start / self._ts);\n self._time -= start;\n self._tTime -= start;\n }\n\n self.shiftChildren(-start, false, -1e999);\n prevStart = 0;\n }\n\n child._end > max && child._ts && (max = child._end);\n child = prev;\n }\n\n _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);\n\n self._dirty = 0;\n }\n\n return self._tDur;\n };\n\n Timeline.updateRoot = function updateRoot(time) {\n if (_globalTimeline._ts) {\n _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));\n\n _lastRenderedFrame = _ticker.frame;\n }\n\n if (_ticker.frame >= _nextGCFrame) {\n _nextGCFrame += _config.autoSleep || 120;\n var child = _globalTimeline._first;\n if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {\n while (child && !child._ts) {\n child = child._next;\n }\n\n child || _ticker.sleep();\n }\n }\n };\n\n return Timeline;\n}(Animation);\n\n_setDefaults(Timeline.prototype, {\n _lock: 0,\n _hasPause: 0,\n _forcing: 0\n});\n\nvar _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {\n //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),\n index = 0,\n matchIndex = 0,\n result,\n startNums,\n color,\n endNum,\n chunk,\n startNum,\n hasRandom,\n a;\n pt.b = start;\n pt.e = end;\n start += \"\"; //ensure values are strings\n\n end += \"\";\n\n if (hasRandom = ~end.indexOf(\"random(\")) {\n end = _replaceRandom(end);\n }\n\n if (stringFilter) {\n a = [start, end];\n stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.\n\n start = a[0];\n end = a[1];\n }\n\n startNums = start.match(_complexStringNumExp) || [];\n\n while (result = _complexStringNumExp.exec(end)) {\n endNum = result[0];\n chunk = end.substring(index, result.index);\n\n if (color) {\n color = (color + 1) % 5;\n } else if (chunk.substr(-5) === \"rgba(\") {\n color = 1;\n }\n\n if (endNum !== startNums[matchIndex++]) {\n startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n pt._pt = {\n _next: pt._pt,\n p: chunk || matchIndex === 1 ? chunk : \",\",\n //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n s: startNum,\n c: endNum.charAt(1) === \"=\" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum,\n m: color && color < 4 ? Math.round : 0\n };\n index = _complexStringNumExp.lastIndex;\n }\n }\n\n pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n\n pt.fp = funcParam;\n\n if (_relExp.test(end) || hasRandom) {\n pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n }\n\n this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n\n return pt;\n},\n _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) {\n _isFunction(end) && (end = end(index || 0, target, targets));\n var currentValue = target[prop],\n parsedStart = start !== \"get\" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf(\"set\") || !_isFunction(target[\"get\" + prop.substr(3)]) ? prop : \"get\" + prop.substr(3)](funcParam) : target[prop](),\n setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,\n pt;\n\n if (_isString(end)) {\n if (~end.indexOf(\"random(\")) {\n end = _replaceRandom(end);\n }\n\n if (end.charAt(1) === \"=\") {\n pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0);\n\n if (pt || pt === 0) {\n // to avoid isNaN, like if someone passes in a value like \"!= whatever\"\n end = pt;\n }\n }\n }\n\n if (!optional || parsedStart !== end || _forceAllPropTweens) {\n if (!isNaN(parsedStart * end) && end !== \"\") {\n // fun fact: any number multiplied by \"\" is evaluated as the number 0!\n pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === \"boolean\" ? _renderBoolean : _renderPlain, 0, setter);\n funcParam && (pt.fp = funcParam);\n modifier && pt.modifier(modifier, this, target);\n return this._pt = pt;\n }\n\n !currentValue && !(prop in target) && _missingPlugin(prop, end);\n return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);\n }\n},\n //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with \"random()\" in them. It does NOT process relative values.\n_processVars = function _processVars(vars, index, target, targets, tween) {\n _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));\n\n if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {\n return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;\n }\n\n var copy = {},\n p;\n\n for (p in vars) {\n copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);\n }\n\n return copy;\n},\n _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {\n var plugin, pt, ptLookup, i;\n\n if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {\n tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n if (tween !== _quickTween) {\n ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.\n\n i = plugin._props.length;\n\n while (i--) {\n ptLookup[plugin._props[i]] = pt;\n }\n }\n }\n\n return plugin;\n},\n _overwritingTween,\n //store a reference temporarily so we can avoid overwriting itself.\n_forceAllPropTweens,\n _initTween = function _initTween(tween, time, tTime) {\n var vars = tween.vars,\n ease = vars.ease,\n startAt = vars.startAt,\n immediateRender = vars.immediateRender,\n lazy = vars.lazy,\n onUpdate = vars.onUpdate,\n runBackwards = vars.runBackwards,\n yoyoEase = vars.yoyoEase,\n keyframes = vars.keyframes,\n autoRevert = vars.autoRevert,\n dur = tween._dur,\n prevStartAt = tween._startAt,\n targets = tween._targets,\n parent = tween.parent,\n fullTargets = parent && parent.data === \"nested\" ? parent.vars.targets : targets,\n autoOverwrite = tween._overwrite === \"auto\" && !_suppressOverwrites,\n tl = tween.timeline,\n reverseEase = vars.easeReverse || yoyoEase,\n cleanVars,\n i,\n p,\n pt,\n target,\n hasPriority,\n gsData,\n harness,\n plugin,\n ptLookup,\n index,\n harnessVars,\n overwritten;\n tl && (!keyframes || !ease) && (ease = \"none\");\n tween._ease = _parseEase(ease, _defaults.ease);\n tween._rEase = reverseEase && (_parseEase(reverseEase) || tween._ease);\n tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.\n\n if (tween._from) tween.ratio = 1;\n\n if (!tl || keyframes && !vars.stagger) {\n //if there's an internal timeline, skip all the parsing because we passed that task down the chain.\n harness = targets[0] ? _getCache(targets[0]).harness : 0;\n harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an \"x\" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.\n\n cleanVars = _copyExcluding(vars, _reservedProps);\n\n if (prevStartAt) {\n prevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet.\n\n time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a \"startAt\" (not \"from()\" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin)\n // don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for \"startAt\" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded.\n\n prevStartAt._lazy = 0;\n }\n\n if (startAt) {\n _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({\n data: \"isStart\",\n overwrite: false,\n parent: parent,\n immediateRender: true,\n lazy: !prevStartAt && _isNotFalse(lazy),\n startAt: null,\n delay: 0,\n onUpdate: onUpdate && function () {\n return _callback(tween, \"onUpdate\");\n },\n stagger: 0\n }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);\n\n\n tween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set.\n\n tween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween\n\n time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween.\n\n if (immediateRender) {\n if (dur && time <= 0 && tTime <= 0) {\n // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly.\n time && (tween._zTime = time);\n return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.\n }\n }\n } else if (runBackwards && dur) {\n // from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)\n if (!prevStartAt) {\n time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0\n\n p = _setDefaults({\n overwrite: false,\n data: \"isFromStart\",\n //we tag the tween with as \"isFromStart\" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a \"from()\" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:\"height\", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.\n lazy: immediateRender && !prevStartAt && _isNotFalse(lazy),\n immediateRender: immediateRender,\n //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)\n stagger: 0,\n parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(\".class\", {y: gsap.utils.wrap([-100,100]), stagger: 0.5})\n\n }, cleanVars);\n harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})\n\n _removeFromParent(tween._startAt = Tween.set(targets, p));\n\n tween._startAt._dp = 0; // don't allow it to get put back into root timeline!\n\n tween._startAt._sat = tween; // used in globalTime()\n\n time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true));\n tween._zTime = time;\n\n if (!immediateRender) {\n _initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded\n\n } else if (!time) {\n return;\n }\n }\n }\n\n tween._pt = tween._ptCache = 0;\n lazy = dur && _isNotFalse(lazy) || lazy && !dur;\n\n for (i = 0; i < targets.length; i++) {\n target = targets[i];\n gsData = target._gsap || _harness(targets)[i]._gsap;\n tween._ptLookup[i] = ptLookup = {};\n _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)\n\n index = fullTargets === targets ? i : fullTargets.indexOf(target);\n\n if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {\n tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n plugin._props.forEach(function (name) {\n ptLookup[name] = pt;\n });\n\n plugin.priority && (hasPriority = 1);\n }\n\n if (!harness || harnessVars) {\n for (p in cleanVars) {\n if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {\n plugin.priority && (hasPriority = 1);\n } else {\n ptLookup[p] = pt = _addPropTween.call(tween, target, p, \"get\", cleanVars[p], index, fullTargets, 0, vars.stringFilter);\n }\n }\n }\n\n tween._op && tween._op[i] && tween.kill(target, tween._op[i]);\n\n if (autoOverwrite && tween._pt) {\n _overwritingTween = tween;\n\n _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!!\n\n\n overwritten = !tween.parent;\n _overwritingTween = 0;\n }\n\n tween._pt && lazy && (_lazyLookup[gsData.id] = 1);\n }\n\n hasPriority && _sortPropTweensByPriority(tween);\n tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.\n }\n\n tween._onUpdate = onUpdate;\n tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.\n\n keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the \"before\" state for any staggered/delayed animations thus when the following tween initializes, it'll use the \"before\" state instead of the \"after\" state as the initial values.\n},\n _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) {\n var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property],\n pt,\n rootPT,\n lookup,\n i;\n\n if (!ptCache) {\n ptCache = tween._ptCache[property] = [];\n lookup = tween._ptLookup;\n i = tween._targets.length;\n\n while (i--) {\n pt = lookup[i][property];\n\n if (pt && pt.d && pt.d._pt) {\n // it's a plugin, so find the nested PropTween\n pt = pt.d._pt;\n\n while (pt && pt.p !== property && pt.fp !== property) {\n // \"fp\" is functionParam for things like setting CSS variables which require .setProperty(\"--var-name\", value)\n pt = pt._next;\n }\n }\n\n if (!pt) {\n // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this\n // if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo(\"x\", 200) for example.\n _forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it.\n\n tween.vars[property] = \"+=0\";\n\n _initTween(tween, time);\n\n _forceAllPropTweens = 0;\n return skipRecursion ? _warn(property + \" not eligible for reset. Try splitting into individual properties\") : 1; // if someone tries to do a quickTo() on a special property like borderRadius which must get split into 4 different properties, that's not eligible for .resetTo().\n }\n\n ptCache.push(pt);\n }\n }\n\n i = ptCache.length;\n\n while (i--) {\n rootPT = ptCache[i];\n pt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value.\n\n pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c;\n pt.c = value - pt.s;\n rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value)\n\n rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value)\n }\n},\n _addAliasesToVars = function _addAliasesToVars(targets, vars) {\n var harness = targets[0] ? _getCache(targets[0]).harness : 0,\n propertyAliases = harness && harness.aliases,\n copy,\n p,\n i,\n aliases;\n\n if (!propertyAliases) {\n return vars;\n }\n\n copy = _merge({}, vars);\n\n for (p in propertyAliases) {\n if (p in copy) {\n aliases = propertyAliases[p].split(\",\");\n i = aliases.length;\n\n while (i--) {\n copy[aliases[i]] = copy[p];\n }\n }\n }\n\n return copy;\n},\n // parses multiple formats, like {\"0%\": {x: 100}, {\"50%\": {x: -20}} and { x: {\"0%\": 100, \"50%\": -20} }, and an \"ease\" can be set on any object. We populate an \"allProps\" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a \"t\" (time), \"v\", (value), and \"e\" (ease) property. This allows us to piece together a timeline later.\n_parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) {\n var ease = obj.ease || easeEach || \"power1.inOut\",\n p,\n a;\n\n if (_isArray(obj)) {\n a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease\n\n obj.forEach(function (value, i) {\n return a.push({\n t: i / (obj.length - 1) * 100,\n v: value,\n e: ease\n });\n });\n } else {\n for (p in obj) {\n a = allProps[p] || (allProps[p] = []);\n p === \"ease\" || a.push({\n t: parseFloat(prop),\n v: obj[p],\n e: ease\n });\n }\n }\n},\n _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {\n return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf(\"random(\") ? _replaceRandom(value) : value;\n},\n _staggerTweenProps = _callbackNames + \"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,easeReverse,autoRevert\",\n _staggerPropsToSkip = {};\n\n_forEachName(_staggerTweenProps + \",id,stagger,delay,duration,paused,scrollTrigger\", function (name) {\n return _staggerPropsToSkip[name] = 1;\n});\n/*\n * --------------------------------------------------------------------------------------\n * TWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var Tween = /*#__PURE__*/function (_Animation2) {\n _inheritsLoose(Tween, _Animation2);\n\n function Tween(targets, vars, position, skipInherit) {\n var _this3;\n\n if (typeof vars === \"number\") {\n position.duration = vars;\n vars = position;\n position = null;\n }\n\n _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this;\n var _this3$vars = _this3.vars,\n duration = _this3$vars.duration,\n delay = _this3$vars.delay,\n immediateRender = _this3$vars.immediateRender,\n stagger = _this3$vars.stagger,\n overwrite = _this3$vars.overwrite,\n keyframes = _this3$vars.keyframes,\n defaults = _this3$vars.defaults,\n scrollTrigger = _this3$vars.scrollTrigger,\n parent = vars.parent || _globalTimeline,\n parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : \"length\" in vars) ? [targets] : toArray(targets),\n tl,\n i,\n copy,\n l,\n p,\n curTarget,\n staggerFunc,\n staggerVarsToMerge;\n _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn(\"GSAP target \" + targets + \" not found. https://gsap.com\", !_config.nullTargetWarn) || [];\n _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property\n\n _this3._overwrite = overwrite;\n\n if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n vars = _this3.vars;\n var easeReverse = vars.easeReverse || vars.yoyoEase;\n tl = _this3.timeline = new Timeline({\n data: \"nested\",\n defaults: defaults || {},\n targets: parent && parent.data === \"nested\" ? parent.vars.targets : parsedTargets\n }); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets.\n\n tl.kill();\n tl.parent = tl._dp = _assertThisInitialized(_this3);\n tl._start = 0;\n\n if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n l = parsedTargets.length;\n staggerFunc = stagger && distribute(stagger);\n\n if (_isObject(stagger)) {\n //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.\n for (p in stagger) {\n if (~_staggerTweenProps.indexOf(p)) {\n staggerVarsToMerge || (staggerVarsToMerge = {});\n staggerVarsToMerge[p] = stagger[p];\n }\n }\n }\n\n for (i = 0; i < l; i++) {\n copy = _copyExcluding(vars, _staggerPropsToSkip);\n copy.stagger = 0;\n easeReverse && (copy.easeReverse = easeReverse);\n staggerVarsToMerge && _merge(copy, staggerVarsToMerge);\n curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.\n\n copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);\n copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;\n\n if (!stagger && l === 1 && copy.delay) {\n // if someone does delay:\"random(1, 5)\", repeat:-1, for example, the delay shouldn't be inside the repeat.\n _this3._delay = delay = copy.delay;\n _this3._start += delay;\n copy.delay = 0;\n }\n\n tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);\n tl._ease = _easeMap.none;\n }\n\n tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally!\n } else if (keyframes) {\n _inheritDefaults(_setDefaults(tl.vars.defaults, {\n ease: \"none\"\n }));\n\n tl._ease = _parseEase(keyframes.ease || vars.ease || \"none\");\n var time = 0,\n a,\n kf,\n v;\n\n if (_isArray(keyframes)) {\n keyframes.forEach(function (frame) {\n return tl.to(parsedTargets, frame, \">\");\n });\n tl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method.\n } else {\n copy = {};\n\n for (p in keyframes) {\n p === \"ease\" || p === \"easeEach\" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);\n }\n\n for (p in copy) {\n a = copy[p].sort(function (a, b) {\n return a.t - b.t;\n });\n time = 0;\n\n for (i = 0; i < a.length; i++) {\n kf = a[i];\n v = {\n ease: kf.e,\n duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration\n };\n v[p] = kf.v;\n tl.to(parsedTargets, v, time);\n time += v.duration;\n }\n }\n\n tl.duration() < duration && tl.to({}, {\n duration: duration - tl.duration()\n }); // in case keyframes didn't go to 100%\n }\n }\n\n duration || _this3.duration(duration = tl.duration());\n } else {\n _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)\n }\n\n if (overwrite === true && !_suppressOverwrites) {\n _overwritingTween = _assertThisInitialized(_this3);\n\n _globalTimeline.killTweensOf(parsedTargets);\n\n _overwritingTween = 0;\n }\n\n _addToTimeline(parent, _assertThisInitialized(_this3), position);\n\n vars.reversed && _this3.reverse();\n vars.paused && _this3.paused(true);\n\n if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== \"nested\") {\n _this3._tTime = -_tinyNum; //forces a render without having to set the render() \"force\" parameter to true because we want to allow lazying by default (using the \"force\" parameter always forces an immediate full render)\n\n _this3.render(Math.max(0, -delay) || 0); //in case delay is negative\n\n }\n\n scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);\n return _this3;\n }\n\n var _proto3 = Tween.prototype;\n\n _proto3.render = function render(totalTime, suppressEvents, force) {\n var prevTime = this._time,\n tDur = this._tDur,\n dur = this._dur,\n isNegative = totalTime < 0,\n tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime,\n time,\n pt,\n iteration,\n cycleDuration,\n prevIteration,\n isYoyo,\n ratio,\n timeline;\n\n if (!dur) {\n _renderZeroDurationTween(this, totalTime, suppressEvents, force);\n } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) {\n // this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)\n time = tTime;\n timeline = this.timeline;\n\n if (this._repeat) {\n //adjust the time for repeats and yoyos\n cycleDuration = dur + this._rDelay;\n\n if (this._repeat < -1 && isNegative) {\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n }\n\n time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n if (tTime === tDur) {\n // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n iteration = this._repeat;\n time = dur;\n } else {\n prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency)\n\n iteration = ~~prevIteration;\n\n if (iteration && iteration === prevIteration) {\n time = dur;\n iteration--;\n } else if (time > dur) {\n time = dur;\n }\n }\n\n isYoyo = this._yoyo && iteration & 1;\n if (isYoyo) time = dur - time;\n prevIteration = _animationCycle(this._tTime, cycleDuration);\n\n if (time === prevTime && !force && this._initted && iteration === prevIteration) {\n //could be during the repeatDelay part. No need to render and fire callbacks.\n this._tTime = tTime;\n return this;\n }\n\n if (iteration !== prevIteration) {\n //repeatRefresh functionality\n if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) {\n // this._time will === cycleDuration when we render at EXACTLY the end of an iteration. Without this condition, it'd often do the repeatRefresh render TWICE (again on the very next tick).\n this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.\n\n this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;\n }\n }\n }\n\n if (!this._initted) {\n if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) {\n this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.\n\n return this;\n }\n\n if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) {\n // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values. But we also don't want to dump if we're doing a repeatRefresh render!\n return this;\n }\n\n if (dur !== this._dur) {\n // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.\n return this.render(totalTime, suppressEvents, force);\n }\n }\n\n if (this._rEase) {\n var inv = time < prevTime;\n\n if (inv !== this._inv) {\n var segDur = inv ? prevTime : dur - prevTime;\n this._inv = inv;\n if (this._from) this.ratio = 1 - this.ratio;\n this._invRatio = this.ratio;\n this._invTime = prevTime;\n this._invRecip = segDur ? (inv ? -1 : 1) / segDur : 0;\n this._invScale = inv ? -this.ratio : 1 - this.ratio;\n this._invEase = inv ? this._rEase : this._ease;\n }\n\n this.ratio = ratio = this._invRatio + this._invScale * this._invEase((time - this._invTime) * this._invRecip);\n } else {\n this.ratio = ratio = this._ease(time / dur);\n }\n\n if (this._from) this.ratio = ratio = 1 - ratio;\n this._tTime = tTime;\n this._time = time;\n\n if (!this._act && this._ts) {\n this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n this._lazy = 0;\n }\n\n if (!prevTime && tTime && !suppressEvents && !prevIteration) {\n _callback(this, \"onStart\");\n\n if (this._tTime !== tTime) {\n // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n return this;\n }\n }\n\n pt = this._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n\n timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime);\n\n if (this._onUpdate && !suppressEvents) {\n isNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.\n\n _callback(this, \"onUpdate\");\n }\n\n this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {\n isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true);\n (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) {\n // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();\n _callback(this, tTime === tDur ? \"onComplete\" : \"onReverseComplete\", true);\n\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n }\n }\n }\n\n return this;\n };\n\n _proto3.targets = function targets() {\n return this._targets;\n };\n\n _proto3.invalidate = function invalidate(soft) {\n // \"soft\" gives us a way to clear out everything EXCEPT the recorded pre-\"from\" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the \"from\" values would persist and then on the next render, the from() tweens would initialize and the current value would match the \"from\" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page.\n (!soft || !this.vars.runBackwards) && (this._startAt = 0);\n this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0;\n this._ptLookup = [];\n this.timeline && this.timeline.invalidate(soft);\n return _Animation2.prototype.invalidate.call(this, soft);\n };\n\n _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) {\n _tickerActive || _ticker.wake();\n this._ts || this.play();\n var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts),\n ratio;\n this._initted || _initTween(this, time);\n ratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet.\n // possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method.\n // if (_isObject(property)) { // performance optimization\n // \tfor (p in property) {\n // \t\tif (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) {\n // \t\t\treturn this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n // \t\t}\n // \t}\n // } else {\n\n if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) {\n return this.resetTo(property, value, start, startIsRelative, 1); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n } //}\n\n\n _alignPlayhead(this, 0);\n\n this.parent || _addLinkedListItem(this._dp, this, \"_first\", \"_last\", this._dp._sort ? \"_start\" : 0);\n return this.render(0);\n };\n\n _proto3.kill = function kill(targets, vars) {\n if (vars === void 0) {\n vars = \"all\";\n }\n\n if (!targets && (!vars || vars === \"all\")) {\n this._lazy = this._pt = 0;\n this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting);\n return this;\n }\n\n if (this.timeline) {\n var tDur = this.timeline.totalDuration();\n this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.\n\n this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.\n\n return this;\n }\n\n var parsedTargets = this._targets,\n killingTargets = targets ? toArray(targets) : parsedTargets,\n propTweenLookup = this._ptLookup,\n firstPT = this._pt,\n overwrittenProps,\n curLookup,\n curOverwriteProps,\n props,\n p,\n pt,\n i;\n\n if ((!vars || vars === \"all\") && _arraysMatch(parsedTargets, killingTargets)) {\n vars === \"all\" && (this._pt = 0);\n return _interrupt(this);\n }\n\n overwrittenProps = this._op = this._op || [];\n\n if (vars !== \"all\") {\n //so people can pass in a comma-delimited list of property names\n if (_isString(vars)) {\n p = {};\n\n _forEachName(vars, function (name) {\n return p[name] = 1;\n });\n\n vars = p;\n }\n\n vars = _addAliasesToVars(parsedTargets, vars);\n }\n\n i = parsedTargets.length;\n\n while (i--) {\n if (~killingTargets.indexOf(parsedTargets[i])) {\n curLookup = propTweenLookup[i];\n\n if (vars === \"all\") {\n overwrittenProps[i] = vars;\n props = curLookup;\n curOverwriteProps = {};\n } else {\n curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};\n props = vars;\n }\n\n for (p in props) {\n pt = curLookup && curLookup[p];\n\n if (pt) {\n if (!(\"kill\" in pt.d) || pt.d.kill(p) === true) {\n _removeLinkedListItem(this, pt, \"_pt\");\n }\n\n delete curLookup[p];\n }\n\n if (curOverwriteProps !== \"all\") {\n curOverwriteProps[p] = 1;\n }\n }\n }\n }\n\n this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.\n\n return this;\n };\n\n Tween.to = function to(targets, vars) {\n return new Tween(targets, vars, arguments[2]);\n };\n\n Tween.from = function from(targets, vars) {\n return _createTweenType(1, arguments);\n };\n\n Tween.delayedCall = function delayedCall(delay, callback, params, scope) {\n return new Tween(callback, 0, {\n immediateRender: false,\n lazy: false,\n overwrite: false,\n delay: delay,\n onComplete: callback,\n onReverseComplete: callback,\n onCompleteParams: params,\n onReverseCompleteParams: params,\n callbackScope: scope\n }); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse)\n };\n\n Tween.fromTo = function fromTo(targets, fromVars, toVars) {\n return _createTweenType(2, arguments);\n };\n\n Tween.set = function set(targets, vars) {\n vars.duration = 0;\n vars.repeatDelay || (vars.repeat = 0);\n return new Tween(targets, vars);\n };\n\n Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n return _globalTimeline.killTweensOf(targets, props, onlyActive);\n };\n\n return Tween;\n}(Animation);\n\n_setDefaults(Tween.prototype, {\n _targets: [],\n _lazy: 0,\n _startAt: 0,\n _op: 0,\n _onInit: 0\n}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)\n// _forEachName(\"to,from,fromTo,set,call,add,addLabel,addPause\", name => {\n// \tTween.prototype[name] = function() {\n// \t\tlet tl = new Timeline();\n// \t\treturn _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));\n// \t}\n// });\n//for backward compatibility. Leverage the timeline calls.\n\n\n_forEachName(\"staggerTo,staggerFrom,staggerFromTo\", function (name) {\n Tween[name] = function () {\n var tl = new Timeline(),\n params = _slice.call(arguments, 0);\n\n params.splice(name === \"staggerFromTo\" ? 5 : 4, 0, 0);\n return tl[name].apply(tl, params);\n };\n});\n/*\n * --------------------------------------------------------------------------------------\n * PROPTWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nvar _setterPlain = function _setterPlain(target, property, value) {\n return target[property] = value;\n},\n _setterFunc = function _setterFunc(target, property, value) {\n return target[property](value);\n},\n _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {\n return target[property](data.fp, value);\n},\n _setterAttribute = function _setterAttribute(target, property, value) {\n return target.setAttribute(property, value);\n},\n _getSetter = function _getSetter(target, property) {\n return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;\n},\n _renderPlain = function _renderPlain(ratio, data) {\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data);\n},\n _renderBoolean = function _renderBoolean(ratio, data) {\n return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);\n},\n _renderComplexString = function _renderComplexString(ratio, data) {\n var pt = data._pt,\n s = \"\";\n\n if (!ratio && data.b) {\n //b = beginning string\n s = data.b;\n } else if (ratio === 1 && data.e) {\n //e = ending string\n s = data.e;\n } else {\n while (pt) {\n s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the \"p\" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.\n\n pt = pt._next;\n }\n\n s += data.c; //we use the \"c\" of the PropTween to store the final chunk of non-numeric text.\n }\n\n data.set(data.t, data.p, s, data);\n},\n _renderPropTweens = function _renderPropTweens(ratio, data) {\n var pt = data._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n},\n _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {\n var pt = this._pt,\n next;\n\n while (pt) {\n next = pt._next;\n pt.p === property && pt.modifier(modifier, tween, target);\n pt = next;\n }\n},\n _killPropTweensOf = function _killPropTweensOf(property) {\n var pt = this._pt,\n hasNonDependentRemaining,\n next;\n\n while (pt) {\n next = pt._next;\n\n if (pt.p === property && !pt.op || pt.op === property) {\n _removeLinkedListItem(this, pt, \"_pt\");\n } else if (!pt.dep) {\n hasNonDependentRemaining = 1;\n }\n\n pt = next;\n }\n\n return !hasNonDependentRemaining;\n},\n _setterWithModifier = function _setterWithModifier(target, property, value, data) {\n data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);\n},\n _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {\n var pt = parent._pt,\n next,\n pt2,\n first,\n last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)\n\n while (pt) {\n next = pt._next;\n pt2 = first;\n\n while (pt2 && pt2.pr > pt.pr) {\n pt2 = pt2._next;\n }\n\n if (pt._prev = pt2 ? pt2._prev : last) {\n pt._prev._next = pt;\n } else {\n first = pt;\n }\n\n if (pt._next = pt2) {\n pt2._prev = pt;\n } else {\n last = pt;\n }\n\n pt = next;\n }\n\n parent._pt = first;\n}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)\n\n\nexport var PropTween = /*#__PURE__*/function () {\n function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {\n this.t = target;\n this.s = start;\n this.c = change;\n this.p = prop;\n this.r = renderer || _renderPlain;\n this.d = data || this;\n this.set = setter || _setterPlain;\n this.pr = priority || 0;\n this._next = next;\n\n if (next) {\n next._prev = this;\n }\n }\n\n var _proto4 = PropTween.prototype;\n\n _proto4.modifier = function modifier(func, tween, target) {\n this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)\n\n this.set = _setterWithModifier;\n this.m = func;\n this.mt = target; //modifier target\n\n this.tween = tween;\n };\n\n return PropTween;\n}(); //Initialization tasks\n\n_forEachName(_callbackNames + \"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger,easeReverse\", function (name) {\n return _reservedProps[name] = 1;\n});\n\n_globals.TweenMax = _globals.TweenLite = Tween;\n_globals.TimelineLite = _globals.TimelineMax = Timeline;\n_globalTimeline = new Timeline({\n sortChildren: false,\n defaults: _defaults,\n autoRemoveChildren: true,\n id: \"root\",\n smoothChildTiming: true\n});\n_config.stringFilter = _colorStringFilter;\n\nvar _media = [],\n _listeners = {},\n _emptyArray = [],\n _lastMediaTime = 0,\n _contextID = 0,\n _dispatch = function _dispatch(type) {\n return (_listeners[type] || _emptyArray).map(function (f) {\n return f();\n });\n},\n _onMediaChange = function _onMediaChange() {\n var time = Date.now(),\n matches = [];\n\n if (time - _lastMediaTime > 2) {\n _dispatch(\"matchMediaInit\");\n\n _media.forEach(function (c) {\n var queries = c.queries,\n conditions = c.conditions,\n match,\n p,\n anyMatch,\n toggled;\n\n for (p in queries) {\n match = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the \"matches\" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate.\n\n match && (anyMatch = 1);\n\n if (match !== conditions[p]) {\n conditions[p] = match;\n toggled = 1;\n }\n }\n\n if (toggled) {\n c.revert();\n anyMatch && matches.push(c);\n }\n });\n\n _dispatch(\"matchMediaRevert\");\n\n matches.forEach(function (c) {\n return c.onMatch(c, function (func) {\n return c.add(null, func);\n });\n });\n _lastMediaTime = time;\n\n _dispatch(\"matchMedia\");\n }\n};\n\nvar Context = /*#__PURE__*/function () {\n function Context(func, scope) {\n this.selector = scope && selector(scope);\n this.data = [];\n this._r = []; // returned/cleanup functions\n\n this.isReverted = false;\n this.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because \"this\" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely\n\n func && this.add(func);\n }\n\n var _proto5 = Context.prototype;\n\n _proto5.add = function add(name, func, scope) {\n // possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function.\n // if (name && _isFunction(name.revert)) {\n // \tthis.data.push(name);\n // \treturn (name._ctx = this);\n // }\n if (_isFunction(name)) {\n scope = func;\n func = name;\n name = _isFunction;\n }\n\n var self = this,\n f = function f() {\n var prev = _context,\n prevSelector = self.selector,\n result;\n prev && prev !== self && prev.data.push(self);\n scope && (self.selector = selector(scope));\n _context = self;\n result = func.apply(self, arguments);\n _isFunction(result) && self._r.push(result);\n _context = prev;\n self.selector = prevSelector;\n self.isReverted = false;\n return result;\n };\n\n self.last = f;\n return name === _isFunction ? f(self, function (func) {\n return self.add(null, func);\n }) : name ? self[name] = f : f;\n };\n\n _proto5.ignore = function ignore(func) {\n var prev = _context;\n _context = null;\n func(this);\n _context = prev;\n };\n\n _proto5.getTweens = function getTweens() {\n var a = [];\n this.data.forEach(function (e) {\n return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === \"nested\") && a.push(e);\n });\n return a;\n };\n\n _proto5.clear = function clear() {\n this._r.length = this.data.length = 0;\n };\n\n _proto5.kill = function kill(revert, matchMedia) {\n var _this4 = this;\n\n if (revert) {\n (function () {\n var tweens = _this4.getTweens(),\n i = _this4.data.length,\n t;\n\n while (i--) {\n // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted.\n t = _this4.data[i];\n\n if (t.data === \"isFlip\") {\n t.revert();\n t.getChildren(true, true, false).forEach(function (tween) {\n return tweens.splice(tweens.indexOf(tween), 1);\n });\n }\n } // save as an object so that we can cache the globalTime for each tween to optimize performance during the sort\n\n\n tweens.map(function (t) {\n return {\n g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity,\n t: t\n };\n }).sort(function (a, b) {\n return b.g - a.g || -Infinity;\n }).forEach(function (o) {\n return o.t.revert(revert);\n }); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the \" || -1\" in the sort keeps the order properly.\n\n i = _this4.data.length;\n\n while (i--) {\n // make sure we loop backwards so that, for example, SplitTexts that were created later on the same element get reverted first\n t = _this4.data[i];\n\n if (t instanceof Timeline) {\n if (t.data !== \"nested\") {\n t.scrollTrigger && t.scrollTrigger.revert();\n t.kill(); // don't revert() the timeline because that's duplicating efforts since we already reverted all the tweens\n }\n } else {\n !(t instanceof Tween) && t.revert && t.revert(revert);\n }\n }\n\n _this4._r.forEach(function (f) {\n return f(revert, _this4);\n });\n\n _this4.isReverted = true;\n })();\n } else {\n this.data.forEach(function (e) {\n return e.kill && e.kill();\n });\n }\n\n this.clear();\n\n if (matchMedia) {\n var i = _media.length;\n\n while (i--) {\n // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead.\n _media[i].id === this.id && _media.splice(i, 1);\n }\n }\n } // killWithCleanup() {\n // \tthis.kill();\n // \tthis._r.forEach(f => f(false, this));\n // }\n ;\n\n _proto5.revert = function revert(config) {\n this.kill(config || {});\n };\n\n return Context;\n}();\n\nvar MatchMedia = /*#__PURE__*/function () {\n function MatchMedia(scope) {\n this.contexts = [];\n this.scope = scope;\n _context && _context.data.push(this);\n }\n\n var _proto6 = MatchMedia.prototype;\n\n _proto6.add = function add(conditions, func, scope) {\n _isObject(conditions) || (conditions = {\n matches: conditions\n });\n var context = new Context(0, scope || this.scope),\n cond = context.conditions = {},\n mq,\n p,\n active;\n _context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context()\n\n this.contexts.push(context);\n func = context.add(\"onMatch\", func);\n context.queries = conditions;\n\n for (p in conditions) {\n if (p === \"all\") {\n active = 1;\n } else {\n mq = _win.matchMedia(conditions[p]);\n\n if (mq) {\n _media.indexOf(context) < 0 && _media.push(context);\n (cond[p] = mq.matches) && (active = 1);\n mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener(\"change\", _onMediaChange);\n }\n }\n }\n\n active && func(context, function (f) {\n return context.add(null, f);\n });\n return this;\n } // refresh() {\n // \tlet time = _lastMediaTime,\n // \t\tmedia = _media;\n // \t_lastMediaTime = -1;\n // \t_media = this.contexts;\n // \t_onMediaChange();\n // \t_lastMediaTime = time;\n // \t_media = media;\n // }\n ;\n\n _proto6.revert = function revert(config) {\n this.kill(config || {});\n };\n\n _proto6.kill = function kill(revert) {\n this.contexts.forEach(function (c) {\n return c.kill(revert, true);\n });\n };\n\n return MatchMedia;\n}();\n/*\n * --------------------------------------------------------------------------------------\n * GSAP\n * --------------------------------------------------------------------------------------\n */\n\n\nvar _gsap = {\n registerPlugin: function registerPlugin() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n args.forEach(function (config) {\n return _createPlugin(config);\n });\n },\n timeline: function timeline(vars) {\n return new Timeline(vars);\n },\n getTweensOf: function getTweensOf(targets, onlyActive) {\n return _globalTimeline.getTweensOf(targets, onlyActive);\n },\n getProperty: function getProperty(target, property, unit, uncache) {\n _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in\n\n var getter = _getCache(target || {}).get,\n format = unit ? _passThrough : _numericIfPossible;\n\n unit === \"native\" && (unit = \"\");\n return !target ? target : !property ? function (property, unit, uncache) {\n return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n },\n quickSetter: function quickSetter(target, property, unit) {\n target = toArray(target);\n\n if (target.length > 1) {\n var setters = target.map(function (t) {\n return gsap.quickSetter(t, property, unit);\n }),\n l = setters.length;\n return function (value) {\n var i = l;\n\n while (i--) {\n setters[i](value);\n }\n };\n }\n\n target = target[0] || {};\n\n var Plugin = _plugins[property],\n cache = _getCache(target),\n p = cache.harness && (cache.harness.aliases || {})[property] || property,\n // in case it's an alias, like \"rotate\" for \"rotation\".\n setter = Plugin ? function (value) {\n var p = new Plugin();\n _quickTween._pt = 0;\n p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);\n p.render(1, p);\n _quickTween._pt && _renderPropTweens(1, _quickTween);\n } : cache.set(target, p);\n\n return Plugin ? setter : function (value) {\n return setter(target, p, unit ? value + unit : value, cache, 1);\n };\n },\n quickTo: function quickTo(target, property, vars) {\n var _setDefaults2;\n\n var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = \"+=0.1\", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})),\n func = function func(value, start, startIsRelative) {\n return tween.resetTo(property, value, start, startIsRelative);\n };\n\n func.tween = tween;\n return func;\n },\n isTweening: function isTweening(targets) {\n return _globalTimeline.getTweensOf(targets, true).length > 0;\n },\n defaults: function defaults(value) {\n value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));\n return _mergeDeep(_defaults, value || {});\n },\n config: function config(value) {\n return _mergeDeep(_config, value || {});\n },\n registerEffect: function registerEffect(_ref3) {\n var name = _ref3.name,\n effect = _ref3.effect,\n plugins = _ref3.plugins,\n defaults = _ref3.defaults,\n extendTimeline = _ref3.extendTimeline;\n (plugins || \"\").split(\",\").forEach(function (pluginName) {\n return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + \" effect requires \" + pluginName + \" plugin.\");\n });\n\n _effects[name] = function (targets, vars, tl) {\n return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);\n };\n\n if (extendTimeline) {\n Timeline.prototype[name] = function (targets, vars, position) {\n return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);\n };\n }\n },\n registerEase: function registerEase(name, ease) {\n _easeMap[name] = _parseEase(ease);\n },\n parseEase: function parseEase(ease, defaultEase) {\n return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;\n },\n getById: function getById(id) {\n return _globalTimeline.getById(id);\n },\n exportRoot: function exportRoot(vars, includeDelayedCalls) {\n if (vars === void 0) {\n vars = {};\n }\n\n var tl = new Timeline(vars),\n child,\n next;\n tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);\n\n _globalTimeline.remove(tl);\n\n tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).\n\n tl._time = tl._tTime = _globalTimeline._time;\n child = _globalTimeline._first;\n\n while (child) {\n next = child._next;\n\n if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {\n _addToTimeline(tl, child, child._start - child._delay);\n }\n\n child = next;\n }\n\n _addToTimeline(_globalTimeline, tl, 0);\n\n return tl;\n },\n context: function context(func, scope) {\n return func ? new Context(func, scope) : _context;\n },\n matchMedia: function matchMedia(scope) {\n return new MatchMedia(scope);\n },\n matchMediaRefresh: function matchMediaRefresh() {\n return _media.forEach(function (c) {\n var cond = c.conditions,\n found,\n p;\n\n for (p in cond) {\n if (cond[p]) {\n cond[p] = false;\n found = 1;\n }\n }\n\n found && c.revert();\n }) || _onMediaChange();\n },\n addEventListener: function addEventListener(type, callback) {\n var a = _listeners[type] || (_listeners[type] = []);\n ~a.indexOf(callback) || a.push(callback);\n },\n removeEventListener: function removeEventListener(type, callback) {\n var a = _listeners[type],\n i = a && a.indexOf(callback);\n i >= 0 && a.splice(i, 1);\n },\n utils: {\n wrap: wrap,\n wrapYoyo: wrapYoyo,\n distribute: distribute,\n random: random,\n snap: snap,\n normalize: normalize,\n getUnit: getUnit,\n clamp: clamp,\n splitColor: splitColor,\n toArray: toArray,\n selector: selector,\n mapRange: mapRange,\n pipe: pipe,\n unitize: unitize,\n interpolate: interpolate,\n shuffle: shuffle\n },\n install: _install,\n effects: _effects,\n ticker: _ticker,\n updateRoot: Timeline.updateRoot,\n plugins: _plugins,\n globalTimeline: _globalTimeline,\n core: {\n PropTween: PropTween,\n globals: _addGlobal,\n Tween: Tween,\n Timeline: Timeline,\n Animation: Animation,\n getCache: _getCache,\n _removeLinkedListItem: _removeLinkedListItem,\n reverting: function reverting() {\n return _reverting;\n },\n context: function context(toAdd) {\n if (toAdd && _context) {\n _context.data.push(toAdd);\n\n toAdd._ctx = _context;\n }\n\n return _context;\n },\n suppressOverwrites: function suppressOverwrites(value) {\n return _suppressOverwrites = value;\n }\n }\n};\n\n_forEachName(\"to,from,fromTo,delayedCall,set,killTweensOf\", function (name) {\n return _gsap[name] = Tween[name];\n});\n\n_ticker.add(Timeline.updateRoot);\n\n_quickTween = _gsap.to({}, {\n duration: 0\n}); // ---- EXTRA PLUGINS --------------------------------------------------------\n\nvar _getPluginPropTween = function _getPluginPropTween(plugin, prop) {\n var pt = plugin._pt;\n\n while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {\n pt = pt._next;\n }\n\n return pt;\n},\n _addModifiers = function _addModifiers(tween, modifiers) {\n var targets = tween._targets,\n p,\n i,\n pt;\n\n for (p in modifiers) {\n i = targets.length;\n\n while (i--) {\n pt = tween._ptLookup[i][p];\n\n if (pt && (pt = pt.d)) {\n if (pt._pt) {\n // is a plugin\n pt = _getPluginPropTween(pt, p);\n }\n\n pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);\n }\n }\n }\n},\n _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {\n return {\n name: name,\n headless: 1,\n rawVars: 1,\n //don't pre-process function-based values or \"random()\" strings.\n init: function init(target, vars, tween) {\n tween._onInit = function (tween) {\n var temp, p;\n\n if (_isString(vars)) {\n temp = {};\n\n _forEachName(vars, function (name) {\n return temp[name] = 1;\n }); //if the user passes in a comma-delimited list of property names to roundProps, like \"x,y\", we round to whole numbers.\n\n\n vars = temp;\n }\n\n if (modifier) {\n temp = {};\n\n for (p in vars) {\n temp[p] = modifier(vars[p]);\n }\n\n vars = temp;\n }\n\n _addModifiers(tween, vars);\n };\n }\n };\n}; //register core plugins\n\n\nexport var gsap = _gsap.registerPlugin({\n name: \"attr\",\n init: function init(target, vars, tween, index, targets) {\n var p, pt, v;\n this.tween = tween;\n\n for (p in vars) {\n v = target.getAttribute(p) || \"\";\n pt = this.add(target, \"setAttribute\", (v || 0) + \"\", vars[p], index, targets, 0, 0, p);\n pt.op = p;\n pt.b = v; // record the beginning value so we can revert()\n\n this._props.push(p);\n }\n },\n render: function render(ratio, data) {\n var pt = data._pt;\n\n while (pt) {\n _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b)\n\n pt = pt._next;\n }\n }\n}, {\n name: \"endArray\",\n headless: 1,\n init: function init(target, value) {\n var i = value.length;\n\n while (i--) {\n this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1);\n }\n }\n}, _buildModifierPlugin(\"roundProps\", _roundModifier), _buildModifierPlugin(\"modifiers\"), _buildModifierPlugin(\"snap\", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.\n\nTween.version = Timeline.version = gsap.version = \"3.15.0\";\n_coreReady = 1;\n_windowExists() && _wake();\nvar Power0 = _easeMap.Power0,\n Power1 = _easeMap.Power1,\n Power2 = _easeMap.Power2,\n Power3 = _easeMap.Power3,\n Power4 = _easeMap.Power4,\n Linear = _easeMap.Linear,\n Quad = _easeMap.Quad,\n Cubic = _easeMap.Cubic,\n Quart = _easeMap.Quart,\n Quint = _easeMap.Quint,\n Strong = _easeMap.Strong,\n Elastic = _easeMap.Elastic,\n Back = _easeMap.Back,\n SteppedEase = _easeMap.SteppedEase,\n Bounce = _easeMap.Bounce,\n Sine = _easeMap.Sine,\n Expo = _easeMap.Expo,\n Circ = _easeMap.Circ;\nexport { Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };\nexport { Tween as TweenMax, Tween as TweenLite, Timeline as TimelineMax, Timeline as TimelineLite, gsap as default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle }; //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.\n\nexport { _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative };","/*!\n * CSSPlugin 3.15.0\n * https://gsap.com\n *\n * Copyright 2008-2026, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nimport { gsap, _getProperty, _numExp, _numWithUnitExp, getUnit, _isString, _isUndefined, _renderComplexString, _relExp, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _checkPlugin, _replaceRandom, _plugins, GSCache, PropTween, _config, _ticker, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative, _setDefaults, _removeLinkedListItem //for the commented-out className feature.\n} from \"./gsap-core.js\";\n\nvar _win,\n _doc,\n _docElement,\n _pluginInitted,\n _tempDiv,\n _tempDivStyler,\n _recentSetterPlugin,\n _reverting,\n _windowExists = function _windowExists() {\n return typeof window !== \"undefined\";\n},\n _transformProps = {},\n _RAD2DEG = 180 / Math.PI,\n _DEG2RAD = Math.PI / 180,\n _atan2 = Math.atan2,\n _bigNum = 1e8,\n _capsExp = /([A-Z])/g,\n _horizontalExp = /(left|right|width|margin|padding|x)/i,\n _complexExp = /[\\s,\\(]\\S/,\n _propertyAliases = {\n autoAlpha: \"opacity,visibility\",\n scale: \"scaleX,scaleY\",\n alpha: \"opacity\"\n},\n _renderCSSProp = function _renderCSSProp(ratio, data) {\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {\n return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {\n return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\n},\n //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n_renderCSSPropWithBeginningAndEnd = function _renderCSSPropWithBeginningAndEnd(ratio, data) {\n return data.set(data.t, data.p, ratio === 1 ? data.e : ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\n},\n //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {\n var value = data.s + data.c * ratio;\n data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);\n},\n _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {\n return data.set(data.t, data.p, ratio ? data.e : data.b, data);\n},\n _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {\n return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);\n},\n _setterCSSStyle = function _setterCSSStyle(target, property, value) {\n return target.style[property] = value;\n},\n _setterCSSProp = function _setterCSSProp(target, property, value) {\n return target.style.setProperty(property, value);\n},\n _setterTransform = function _setterTransform(target, property, value) {\n return target._gsap[property] = value;\n},\n _setterScale = function _setterScale(target, property, value) {\n return target._gsap.scaleX = target._gsap.scaleY = value;\n},\n _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {\n var cache = target._gsap;\n cache.scaleX = cache.scaleY = value;\n cache.renderTransform(ratio, cache);\n},\n _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {\n var cache = target._gsap;\n cache[property] = value;\n cache.renderTransform(ratio, cache);\n},\n _transformProp = \"transform\",\n _transformOriginProp = _transformProp + \"Origin\",\n _saveStyle = function _saveStyle(property, isNotCSS) {\n var _this = this;\n\n var target = this.target,\n style = target.style,\n cache = target._gsap;\n\n if (property in _transformProps && style) {\n this.tfm = this.tfm || {};\n\n if (property !== \"transform\") {\n property = _propertyAliases[property] || property;\n ~property.indexOf(\",\") ? property.split(\",\").forEach(function (a) {\n return _this.tfm[a] = _get(target, a);\n }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property); // note: scale would map to \"scaleX,scaleY\", thus we loop and apply them both.\n\n property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin);\n } else {\n return _propertyAliases.transform.split(\",\").forEach(function (p) {\n return _saveStyle.call(_this, p, isNotCSS);\n });\n }\n\n if (this.props.indexOf(_transformProp) >= 0) {\n return;\n }\n\n if (cache.svg) {\n this.svgo = target.getAttribute(\"data-svg-origin\");\n this.props.push(_transformOriginProp, isNotCSS, \"\");\n }\n\n property = _transformProp;\n }\n\n (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]);\n},\n _removeIndependentTransforms = function _removeIndependentTransforms(style) {\n if (style.translate) {\n style.removeProperty(\"translate\");\n style.removeProperty(\"scale\");\n style.removeProperty(\"rotate\");\n }\n},\n _revertStyle = function _revertStyle() {\n var props = this.props,\n target = this.target,\n style = target.style,\n cache = target._gsap,\n i,\n p;\n\n for (i = 0; i < props.length; i += 3) {\n // stored like this: property, isNotCSS, value\n if (!props[i + 1]) {\n props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === \"--\" ? props[i] : props[i].replace(_capsExp, \"-$1\").toLowerCase());\n } else if (props[i + 1] === 2) {\n // non-CSS value (function-based)\n target[props[i]](props[i + 2]);\n } else {\n // non-CSS value (not function-based)\n target[props[i]] = props[i + 2];\n }\n }\n\n if (this.tfm) {\n for (p in this.tfm) {\n cache[p] = this.tfm[p];\n }\n\n if (cache.svg) {\n cache.renderTransform();\n target.setAttribute(\"data-svg-origin\", this.svgo || \"\");\n }\n\n i = _reverting();\n\n if ((!i || !i.isStart) && !style[_transformProp]) {\n _removeIndependentTransforms(style);\n\n if (cache.zOrigin && style[_transformOriginProp]) {\n style[_transformOriginProp] += \" \" + cache.zOrigin + \"px\"; // since we're uncaching, we must put the zOrigin back into the transformOrigin so that we can pull it out accurately when we parse again. Otherwise, we'd lose the z portion of the origin since we extract it to protect from Safari bugs.\n\n cache.zOrigin = 0;\n cache.renderTransform();\n }\n\n cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization.\n }\n }\n},\n _getStyleSaver = function _getStyleSaver(target, properties) {\n var saver = {\n target: target,\n props: [],\n revert: _revertStyle,\n save: _saveStyle\n };\n target._gsap || gsap.core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once.\n\n properties && target.style && target.nodeType && properties.split(\",\").forEach(function (p) {\n return saver.save(p);\n }); // make sure it's a DOM node too.\n\n return saver;\n},\n _supports3D,\n _createElement = function _createElement(type, ns) {\n var e = _doc.createElementNS ? _doc.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making \"style\" inaccessible.\n\n return e && e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://gsap.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).\n},\n _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {\n var cs = getComputedStyle(target);\n return cs[property] || cs.getPropertyValue(property.replace(_capsExp, \"-$1\").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || \"\"; //css variables may not need caps swapped out for dashes and lowercase.\n},\n _prefixes = \"O,Moz,ms,Ms,Webkit\".split(\",\"),\n _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {\n var e = element || _tempDiv,\n s = e.style,\n i = 5;\n\n if (property in s && !preferPrefix) {\n return property;\n }\n\n property = property.charAt(0).toUpperCase() + property.substr(1);\n\n while (i-- && !(_prefixes[i] + property in s)) {}\n\n return i < 0 ? null : (i === 3 ? \"ms\" : i >= 0 ? _prefixes[i] : \"\") + property;\n},\n _initCore = function _initCore() {\n if (_windowExists() && window.document) {\n _win = window;\n _doc = _win.document;\n _docElement = _doc.documentElement;\n _tempDiv = _createElement(\"div\") || {\n style: {}\n };\n _tempDivStyler = _createElement(\"div\");\n _transformProp = _checkPropPrefix(_transformProp);\n _transformOriginProp = _transformProp + \"Origin\";\n _tempDiv.style.cssText = \"border-width:0;line-height:0;position:absolute;padding:0\"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.\n\n _supports3D = !!_checkPropPrefix(\"perspective\");\n _reverting = gsap.core.reverting;\n _pluginInitted = 1;\n }\n},\n _getReparentedCloneBBox = function _getReparentedCloneBBox(target) {\n //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).\n var owner = target.ownerSVGElement,\n svg = _createElement(\"svg\", owner && owner.getAttribute(\"xmlns\") || \"http://www.w3.org/2000/svg\"),\n clone = target.cloneNode(true),\n bbox;\n\n clone.style.display = \"block\";\n svg.appendChild(clone);\n\n _docElement.appendChild(svg);\n\n try {\n bbox = clone.getBBox();\n } catch (e) {}\n\n svg.removeChild(clone);\n\n _docElement.removeChild(svg);\n\n return bbox;\n},\n _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {\n var i = attributesArray.length;\n\n while (i--) {\n if (target.hasAttribute(attributesArray[i])) {\n return target.getAttribute(attributesArray[i]);\n }\n }\n},\n _getBBox = function _getBBox(target) {\n var bounds, cloned;\n\n try {\n bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118\n } catch (error) {\n bounds = _getReparentedCloneBBox(target);\n cloned = 1;\n }\n\n bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.\n\n return bounds && !bounds.width && !bounds.x && !bounds.y ? {\n x: +_getAttributeFallbacks(target, [\"x\", \"cx\", \"x1\"]) || 0,\n y: +_getAttributeFallbacks(target, [\"y\", \"cy\", \"y1\"]) || 0,\n width: 0,\n height: 0\n } : bounds;\n},\n _isSVG = function _isSVG(e) {\n return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));\n},\n //reports if the element is an SVG on which getBBox() actually works\n_removeProperty = function _removeProperty(target, property) {\n if (property) {\n var style = target.style,\n first2Chars;\n\n if (property in _transformProps && property !== _transformOriginProp) {\n property = _transformProp;\n }\n\n if (style.removeProperty) {\n first2Chars = property.substr(0, 2);\n\n if (first2Chars === \"ms\" || property.substr(0, 6) === \"webkit\") {\n //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be \"ms-transform\" instead of \"-ms-transform\" for IE9, for example)\n property = \"-\" + property;\n }\n\n style.removeProperty(first2Chars === \"--\" ? property : property.replace(_capsExp, \"-$1\").toLowerCase());\n } else {\n //note: old versions of IE use \"removeAttribute()\" instead of \"removeProperty()\"\n style.removeAttribute(property);\n }\n }\n},\n _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {\n var pt = new PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);\n plugin._pt = pt;\n pt.b = beginning;\n pt.e = end;\n\n plugin._props.push(property);\n\n return pt;\n},\n _nonConvertibleUnits = {\n deg: 1,\n rad: 1,\n turn: 1\n},\n _nonStandardLayouts = {\n grid: 1,\n flex: 1\n},\n //takes a single value like 20px and converts it to the unit specified, like \"%\", returning only the numeric amount.\n_convertToUnit = function _convertToUnit(target, property, value, unit) {\n var curValue = parseFloat(value) || 0,\n curUnit = (value + \"\").trim().substr((curValue + \"\").length) || \"px\",\n // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()\n style = _tempDiv.style,\n horizontal = _horizontalExp.test(property),\n isRootSVG = target.tagName.toLowerCase() === \"svg\",\n measureProperty = (isRootSVG ? \"client\" : \"offset\") + (horizontal ? \"Width\" : \"Height\"),\n amount = 100,\n toPixels = unit === \"px\",\n toPercent = unit === \"%\",\n px,\n parent,\n cache,\n isSVG;\n\n if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {\n return curValue;\n }\n\n curUnit !== \"px\" && !toPixels && (curValue = _convertToUnit(target, property, value, \"px\"));\n isSVG = target.getCTM && _isSVG(target);\n\n if ((toPercent || curUnit === \"%\") && (_transformProps[property] || ~property.indexOf(\"adius\"))) {\n px = isSVG ? target.getBBox()[horizontal ? \"width\" : \"height\"] : target[measureProperty];\n return _round(toPercent ? curValue / px * amount : curValue / 100 * px);\n }\n\n style[horizontal ? \"width\" : \"height\"] = amount + (toPixels ? curUnit : unit);\n parent = unit !== \"rem\" && ~property.indexOf(\"adius\") || unit === \"em\" && target.appendChild && !isRootSVG ? target : target.parentNode;\n\n if (isSVG) {\n parent = (target.ownerSVGElement || {}).parentNode;\n }\n\n if (!parent || parent === _doc || !parent.appendChild) {\n parent = _doc.body;\n }\n\n cache = parent._gsap;\n\n if (cache && toPercent && cache.width && horizontal && cache.time === _ticker.time && !cache.uncache) {\n return _round(curValue / cache.width * amount);\n } else {\n if (toPercent && (property === \"height\" || property === \"width\")) {\n // if we're dealing with width/height that's inside a container with padding and/or it's a flexbox/grid container, we must apply it to the target itself rather than the _tempDiv in order to ensure complete accuracy, factoring in the parent's padding.\n var v = target.style[property];\n target.style[property] = amount + unit;\n px = target[measureProperty];\n v ? target.style[property] = v : _removeProperty(target, property);\n } else {\n (toPercent || curUnit === \"%\") && !_nonStandardLayouts[_getComputedProperty(parent, \"display\")] && (style.position = _getComputedProperty(target, \"position\"));\n parent === target && (style.position = \"static\"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.\n\n parent.appendChild(_tempDiv);\n px = _tempDiv[measureProperty];\n parent.removeChild(_tempDiv);\n style.position = \"absolute\";\n }\n\n if (horizontal && toPercent) {\n cache = _getCache(parent);\n cache.time = _ticker.time;\n cache.width = parent[measureProperty];\n }\n }\n\n return _round(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);\n},\n _get = function _get(target, property, unit, uncache) {\n var value;\n _pluginInitted || _initCore();\n\n if (property in _propertyAliases && property !== \"transform\") {\n property = _propertyAliases[property];\n\n if (~property.indexOf(\",\")) {\n property = property.split(\",\")[0];\n }\n }\n\n if (_transformProps[property] && property !== \"transform\") {\n value = _parseTransform(target, uncache);\n value = property !== \"transformOrigin\" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + \" \" + value.zOrigin + \"px\";\n } else {\n value = target.style[property];\n\n if (!value || value === \"auto\" || uncache || ~(value + \"\").indexOf(\"calc(\")) {\n value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || _getProperty(target, property) || (property === \"opacity\" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius\n }\n }\n\n return unit && !~(value + \"\").trim().indexOf(\" \") ? _convertToUnit(target, property, value, unit) + unit : value;\n},\n _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {\n // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n if (!start || start === \"none\") {\n // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style (\"clipPath\" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as \"none\" whereas WebkitClipPath reports accurately like \"ellipse(100% 0% at 50% 0%)\", so in this case we must SWITCH to using the prefixed property instead. See https://gsap.com/forums/topic/18310-clippath-doesnt-work-on-ios/\n var p = _checkPropPrefix(prop, target, 1),\n s = p && _getComputedProperty(target, p, 1);\n\n if (s && s !== start) {\n prop = p;\n start = s;\n } else if (prop === \"borderColor\") {\n start = _getComputedProperty(target, \"borderTopColor\"); // Firefox bug: always reports \"borderColor\" as \"\", so we must fall back to borderTopColor. See https://gsap.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/\n }\n }\n\n var pt = new PropTween(this._pt, target.style, prop, 0, 1, _renderComplexString),\n index = 0,\n matchIndex = 0,\n a,\n result,\n startValues,\n startNum,\n color,\n startValue,\n endValue,\n endNum,\n chunk,\n endUnit,\n startUnit,\n endValues;\n pt.b = start;\n pt.e = end;\n start += \"\"; // ensure values are strings\n\n end += \"\";\n\n if (end.substring(0, 6) === \"var(--\") {\n end = _getComputedProperty(target, end.substring(4, end.indexOf(\")\")));\n }\n\n if (end === \"auto\") {\n startValue = target.style[prop];\n target.style[prop] = end;\n end = _getComputedProperty(target, prop) || end;\n startValue ? target.style[prop] = startValue : _removeProperty(target, prop);\n }\n\n a = [start, end];\n\n _colorStringFilter(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().\n\n\n start = a[0];\n end = a[1];\n startValues = start.match(_numWithUnitExp) || [];\n endValues = end.match(_numWithUnitExp) || [];\n\n if (endValues.length) {\n while (result = _numWithUnitExp.exec(end)) {\n endValue = result[0];\n chunk = end.substring(index, result.index);\n\n if (color) {\n color = (color + 1) % 5;\n } else if (chunk.substr(-5) === \"rgba(\" || chunk.substr(-5) === \"hsla(\") {\n color = 1;\n }\n\n if (endValue !== (startValue = startValues[matchIndex++] || \"\")) {\n startNum = parseFloat(startValue) || 0;\n startUnit = startValue.substr((startNum + \"\").length);\n endValue.charAt(1) === \"=\" && (endValue = _parseRelative(startNum, endValue) + startUnit);\n endNum = parseFloat(endValue);\n endUnit = endValue.substr((endNum + \"\").length);\n index = _numWithUnitExp.lastIndex - endUnit.length;\n\n if (!endUnit) {\n //if something like \"perspective:300\" is passed in and we must add a unit to the end\n endUnit = endUnit || _config.units[prop] || startUnit;\n\n if (index === end.length) {\n end += endUnit;\n pt.e += endUnit;\n }\n }\n\n if (startUnit !== endUnit) {\n startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;\n } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n\n pt._pt = {\n _next: pt._pt,\n p: chunk || matchIndex === 1 ? chunk : \",\",\n //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n s: startNum,\n c: endNum - startNum,\n m: color && color < 4 || prop === \"zIndex\" ? Math.round : 0\n };\n }\n }\n\n pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n } else {\n pt.r = prop === \"display\" && end === \"none\" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;\n }\n\n _relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n\n this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus \"this\" would refer to the plugin.\n\n return pt;\n},\n _keywordToPercent = {\n top: \"0%\",\n bottom: \"100%\",\n left: \"0%\",\n right: \"100%\",\n center: \"50%\"\n},\n _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {\n var split = value.split(\" \"),\n x = split[0],\n y = split[1] || \"50%\";\n\n if (x === \"top\" || x === \"bottom\" || y === \"left\" || y === \"right\") {\n //the user provided them in the wrong order, so flip them\n value = x;\n x = y;\n y = value;\n }\n\n split[0] = _keywordToPercent[x] || x;\n split[1] = _keywordToPercent[y] || y;\n return split.join(\" \");\n},\n _renderClearProps = function _renderClearProps(ratio, data) {\n if (data.tween && data.tween._time === data.tween._dur) {\n var target = data.t,\n style = target.style,\n props = data.u,\n cache = target._gsap,\n prop,\n clearTransforms,\n i;\n\n if (props === \"all\" || props === true) {\n style.cssText = \"\";\n clearTransforms = 1;\n } else {\n props = props.split(\",\");\n i = props.length;\n\n while (--i > -1) {\n prop = props[i];\n\n if (_transformProps[prop]) {\n clearTransforms = 1;\n prop = prop === \"transformOrigin\" ? _transformOriginProp : _transformProp;\n }\n\n _removeProperty(target, prop);\n }\n }\n\n if (clearTransforms) {\n _removeProperty(target, _transformProp);\n\n if (cache) {\n cache.svg && target.removeAttribute(\"transform\");\n style.scale = style.rotate = style.translate = \"none\";\n\n _parseTransform(target, 1); // force all the cached values back to \"normal\"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.\n\n\n cache.uncache = 1;\n\n _removeIndependentTransforms(style);\n }\n }\n }\n},\n // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.\n_specialProps = {\n clearProps: function clearProps(plugin, target, property, endValue, tween) {\n if (tween.data !== \"isFromStart\") {\n var pt = plugin._pt = new PropTween(plugin._pt, target, property, 0, 0, _renderClearProps);\n pt.u = endValue;\n pt.pr = -10;\n pt.tween = tween;\n\n plugin._props.push(property);\n\n return 1;\n }\n }\n /* className feature (about 0.4kb gzipped).\n , className(plugin, target, property, endValue, tween) {\n \tlet _renderClassName = (ratio, data) => {\n \t\t\tdata.css.render(ratio, data.css);\n \t\t\tif (!ratio || ratio === 1) {\n \t\t\t\tlet inline = data.rmv,\n \t\t\t\t\ttarget = data.t,\n \t\t\t\t\tp;\n \t\t\t\ttarget.setAttribute(\"class\", ratio ? data.e : data.b);\n \t\t\t\tfor (p in inline) {\n \t\t\t\t\t_removeProperty(target, p);\n \t\t\t\t}\n \t\t\t}\n \t\t},\n \t\t_getAllStyles = (target) => {\n \t\t\tlet styles = {},\n \t\t\t\tcomputed = getComputedStyle(target),\n \t\t\t\tp;\n \t\t\tfor (p in computed) {\n \t\t\t\tif (isNaN(p) && p !== \"cssText\" && p !== \"length\") {\n \t\t\t\t\tstyles[p] = computed[p];\n \t\t\t\t}\n \t\t\t}\n \t\t\t_setDefaults(styles, _parseTransform(target, 1));\n \t\t\treturn styles;\n \t\t},\n \t\tstartClassList = target.getAttribute(\"class\"),\n \t\tstyle = target.style,\n \t\tcssText = style.cssText,\n \t\tcache = target._gsap,\n \t\tclassPT = cache.classPT,\n \t\tinlineToRemoveAtEnd = {},\n \t\tdata = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== \"=\") ? endValue : startClassList.replace(new RegExp(\"(?:\\\\s|^)\" + endValue.substr(2) + \"(?![\\\\w-])\"), \"\") + ((endValue.charAt(0) === \"+\") ? \" \" + endValue.substr(2) : \"\")},\n \t\tchangingVars = {},\n \t\tstartVars = _getAllStyles(target),\n \t\ttransformRelated = /(transform|perspective)/i,\n \t\tendVars, p;\n \tif (classPT) {\n \t\tclassPT.r(1, classPT.d);\n \t\t_removeLinkedListItem(classPT.d.plugin, classPT, \"_pt\");\n \t}\n \ttarget.setAttribute(\"class\", data.e);\n \tendVars = _getAllStyles(target, true);\n \ttarget.setAttribute(\"class\", startClassList);\n \tfor (p in endVars) {\n \t\tif (endVars[p] !== startVars[p] && !transformRelated.test(p)) {\n \t\t\tchangingVars[p] = endVars[p];\n \t\t\tif (!style[p] && style[p] !== \"0\") {\n \t\t\t\tinlineToRemoveAtEnd[p] = 1;\n \t\t\t}\n \t\t}\n \t}\n \tcache.classPT = plugin._pt = new PropTween(plugin._pt, target, \"className\", 0, 0, _renderClassName, data, 0, -11);\n \tif (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.\n \t\tstyle.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).\n \t}\n \t_parseTransform(target, true); //to clear the caching of transforms\n \tdata.css = new gsap.plugins.css();\n \tdata.css.init(target, changingVars, tween);\n \tplugin._props.push(...data.css._props);\n \treturn 1;\n }\n */\n\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TRANSFORMS\n * --------------------------------------------------------------------------------------\n */\n_identity2DMatrix = [1, 0, 0, 1, 0, 0],\n _rotationalProperties = {},\n _isNullTransform = function _isNullTransform(value) {\n return value === \"matrix(1, 0, 0, 1, 0, 0)\" || value === \"none\" || !value;\n},\n _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {\n var matrixString = _getComputedProperty(target, _transformProp);\n\n return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_numExp).map(_round);\n},\n _getMatrix = function _getMatrix(target, force2D) {\n var cache = target._gsap || _getCache(target),\n style = target.style,\n matrix = _getComputedTransformMatrixAsArray(target),\n parent,\n nextSibling,\n temp,\n addedToDOM;\n\n if (cache.svg && target.getAttribute(\"transform\")) {\n temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like \"translate(50,60) rotate(135,0,0)\" are parsed because it mashes it into a matrix.\n\n matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];\n return matrix.join(\",\") === \"1,0,0,1,0,0\" ? _identity2DMatrix : matrix;\n } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {\n //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not \"none\". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).\n temp = style.display;\n style.display = \"block\";\n parent = target.parentNode;\n\n if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) {\n // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375. Note: position: fixed elements report a null offsetParent but they could also be invisible because they're in an ancestor with display: none, so we check getBoundingClientRect(). We only want to alter the DOM if we absolutely have to because it can cause iframe content to reload, like a Vimeo video.\n addedToDOM = 1; //flag\n\n nextSibling = target.nextElementSibling;\n\n _docElement.appendChild(target); //we must add it to the DOM in order to get values properly\n\n }\n\n matrix = _getComputedTransformMatrixAsArray(target);\n temp ? style.display = temp : _removeProperty(target, \"display\");\n\n if (addedToDOM) {\n nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);\n }\n }\n\n return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;\n},\n _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {\n var cache = target._gsap,\n matrix = matrixArray || _getMatrix(target, true),\n xOriginOld = cache.xOrigin || 0,\n yOriginOld = cache.yOrigin || 0,\n xOffsetOld = cache.xOffset || 0,\n yOffsetOld = cache.yOffset || 0,\n a = matrix[0],\n b = matrix[1],\n c = matrix[2],\n d = matrix[3],\n tx = matrix[4],\n ty = matrix[5],\n originSplit = origin.split(\" \"),\n xOrigin = parseFloat(originSplit[0]) || 0,\n yOrigin = parseFloat(originSplit[1]) || 0,\n bounds,\n determinant,\n x,\n y;\n\n if (!originIsAbsolute) {\n bounds = _getBBox(target);\n xOrigin = bounds.x + (~originSplit[0].indexOf(\"%\") ? xOrigin / 100 * bounds.width : xOrigin);\n yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf(\"%\") ? yOrigin / 100 * bounds.height : yOrigin); // if (!(\"xOrigin\" in cache) && (xOrigin || yOrigin)) { // added in 3.12.3, reverted in 3.12.4; requires more exploration\n // \txOrigin -= bounds.x;\n // \tyOrigin -= bounds.y;\n // }\n } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {\n //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.\n x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;\n y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;\n xOrigin = x;\n yOrigin = y; // theory: we only had to do this for smoothing and it assumes that the previous one was not originIsAbsolute.\n }\n\n if (smooth || smooth !== false && cache.smooth) {\n tx = xOrigin - xOriginOld;\n ty = yOrigin - yOriginOld;\n cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;\n cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;\n } else {\n cache.xOffset = cache.yOffset = 0;\n }\n\n cache.xOrigin = xOrigin;\n cache.yOrigin = yOrigin;\n cache.smooth = !!smooth;\n cache.origin = origin;\n cache.originIsAbsolute = !!originIsAbsolute;\n target.style[_transformOriginProp] = \"0px 0px\"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).\n\n if (pluginToAddPropTweensTo) {\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOrigin\", xOriginOld, xOrigin);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOrigin\", yOriginOld, yOrigin);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOffset\", xOffsetOld, cache.xOffset);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOffset\", yOffsetOld, cache.yOffset);\n }\n\n target.setAttribute(\"data-svg-origin\", xOrigin + \" \" + yOrigin);\n},\n _parseTransform = function _parseTransform(target, uncache) {\n var cache = target._gsap || new GSCache(target);\n\n if (\"x\" in cache && !uncache && !cache.uncache) {\n return cache;\n }\n\n var style = target.style,\n invertedScaleX = cache.scaleX < 0,\n px = \"px\",\n deg = \"deg\",\n cs = getComputedStyle(target),\n origin = _getComputedProperty(target, _transformOriginProp) || \"0\",\n x,\n y,\n z,\n scaleX,\n scaleY,\n rotation,\n rotationX,\n rotationY,\n skewX,\n skewY,\n perspective,\n xOrigin,\n yOrigin,\n matrix,\n angle,\n cos,\n sin,\n a,\n b,\n c,\n d,\n a12,\n a22,\n t1,\n t2,\n t3,\n a13,\n a23,\n a33,\n a42,\n a43,\n a32;\n x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;\n scaleX = scaleY = 1;\n cache.svg = !!(target.getCTM && _isSVG(target));\n\n if (cs.translate) {\n // accommodate independent transforms by combining them into normal ones.\n if (cs.translate !== \"none\" || cs.scale !== \"none\" || cs.rotate !== \"none\") {\n style[_transformProp] = (cs.translate !== \"none\" ? \"translate3d(\" + (cs.translate + \" 0 0\").split(\" \").slice(0, 3).join(\", \") + \") \" : \"\") + (cs.rotate !== \"none\" ? \"rotate(\" + cs.rotate + \") \" : \"\") + (cs.scale !== \"none\" ? \"scale(\" + cs.scale.split(\" \").join(\",\") + \") \" : \"\") + (cs[_transformProp] !== \"none\" ? cs[_transformProp] : \"\");\n }\n\n style.scale = style.rotate = style.translate = \"none\";\n }\n\n matrix = _getMatrix(target, cache.svg);\n\n if (cache.svg) {\n if (cache.uncache) {\n // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + \"px \" + (cache.yOrigin - bbox.y) + \"px\". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things.\n t2 = target.getBBox();\n origin = cache.xOrigin - t2.x + \"px \" + (cache.yOrigin - t2.y) + \"px\";\n t1 = \"\";\n } else {\n t1 = !uncache && target.getAttribute(\"data-svg-origin\"); // Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly.\n }\n\n _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);\n }\n\n xOrigin = cache.xOrigin || 0;\n yOrigin = cache.yOrigin || 0;\n\n if (matrix !== _identity2DMatrix) {\n a = matrix[0]; //a11\n\n b = matrix[1]; //a21\n\n c = matrix[2]; //a31\n\n d = matrix[3]; //a41\n\n x = a12 = matrix[4];\n y = a22 = matrix[5]; //2D matrix\n\n if (matrix.length === 6) {\n scaleX = Math.sqrt(a * a + b * b);\n scaleY = Math.sqrt(d * d + c * c);\n rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).\n\n skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;\n skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));\n\n if (cache.svg) {\n x -= xOrigin - (xOrigin * a + yOrigin * c);\n y -= yOrigin - (xOrigin * b + yOrigin * d);\n } //3D matrix\n\n } else {\n a32 = matrix[6];\n a42 = matrix[7];\n a13 = matrix[8];\n a23 = matrix[9];\n a33 = matrix[10];\n a43 = matrix[11];\n x = matrix[12];\n y = matrix[13];\n z = matrix[14];\n angle = _atan2(a32, a33);\n rotationX = angle * _RAD2DEG; //rotationX\n\n if (angle) {\n cos = Math.cos(-angle);\n sin = Math.sin(-angle);\n t1 = a12 * cos + a13 * sin;\n t2 = a22 * cos + a23 * sin;\n t3 = a32 * cos + a33 * sin;\n a13 = a12 * -sin + a13 * cos;\n a23 = a22 * -sin + a23 * cos;\n a33 = a32 * -sin + a33 * cos;\n a43 = a42 * -sin + a43 * cos;\n a12 = t1;\n a22 = t2;\n a32 = t3;\n } //rotationY\n\n\n angle = _atan2(-c, a33);\n rotationY = angle * _RAD2DEG;\n\n if (angle) {\n cos = Math.cos(-angle);\n sin = Math.sin(-angle);\n t1 = a * cos - a13 * sin;\n t2 = b * cos - a23 * sin;\n t3 = c * cos - a33 * sin;\n a43 = d * sin + a43 * cos;\n a = t1;\n b = t2;\n c = t3;\n } //rotationZ\n\n\n angle = _atan2(b, a);\n rotation = angle * _RAD2DEG;\n\n if (angle) {\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n t1 = a * cos + b * sin;\n t2 = a12 * cos + a22 * sin;\n b = b * cos - a * sin;\n a22 = a22 * cos - a12 * sin;\n a = t1;\n a12 = t2;\n }\n\n if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {\n //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.\n rotationX = rotation = 0;\n rotationY = 180 - rotationY;\n }\n\n scaleX = _round(Math.sqrt(a * a + b * b + c * c));\n scaleY = _round(Math.sqrt(a22 * a22 + a32 * a32));\n angle = _atan2(a12, a22);\n skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;\n perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;\n }\n\n if (cache.svg) {\n //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).\n t1 = target.getAttribute(\"transform\");\n cache.forceCSS = target.setAttribute(\"transform\", \"\") || !_isNullTransform(_getComputedProperty(target, _transformProp));\n t1 && target.setAttribute(\"transform\", t1);\n }\n }\n\n if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {\n if (invertedScaleX) {\n scaleX *= -1;\n skewX += rotation <= 0 ? 180 : -180;\n rotation += rotation <= 0 ? 180 : -180;\n } else {\n scaleY *= -1;\n skewX += skewX <= 0 ? 180 : -180;\n }\n }\n\n uncache = uncache || cache.uncache;\n cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;\n cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;\n cache.z = z + px;\n cache.scaleX = _round(scaleX);\n cache.scaleY = _round(scaleY);\n cache.rotation = _round(rotation) + deg;\n cache.rotationX = _round(rotationX) + deg;\n cache.rotationY = _round(rotationY) + deg;\n cache.skewX = skewX + deg;\n cache.skewY = skewY + deg;\n cache.transformPerspective = perspective + px;\n\n if (cache.zOrigin = parseFloat(origin.split(\" \")[2]) || !uncache && cache.zOrigin || 0) {\n style[_transformOriginProp] = _firstTwoOnly(origin);\n }\n\n cache.xOffset = cache.yOffset = 0;\n cache.force3D = _config.force3D;\n cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;\n cache.uncache = 0;\n return cache;\n},\n _firstTwoOnly = function _firstTwoOnly(value) {\n return (value = value.split(\" \"))[0] + \" \" + value[1];\n},\n //for handling transformOrigin values, stripping out the 3rd dimension\n_addPxTranslate = function _addPxTranslate(target, start, value) {\n var unit = getUnit(start);\n return _round(parseFloat(start) + parseFloat(_convertToUnit(target, \"x\", value + \"px\", unit))) + unit;\n},\n _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {\n cache.z = \"0px\";\n cache.rotationY = cache.rotationX = \"0deg\";\n cache.force3D = 0;\n\n _renderCSSTransforms(ratio, cache);\n},\n _zeroDeg = \"0deg\",\n _zeroPx = \"0px\",\n _endParenthesis = \") \",\n _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {\n var _ref = cache || this,\n xPercent = _ref.xPercent,\n yPercent = _ref.yPercent,\n x = _ref.x,\n y = _ref.y,\n z = _ref.z,\n rotation = _ref.rotation,\n rotationY = _ref.rotationY,\n rotationX = _ref.rotationX,\n skewX = _ref.skewX,\n skewY = _ref.skewY,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n transformPerspective = _ref.transformPerspective,\n force3D = _ref.force3D,\n target = _ref.target,\n zOrigin = _ref.zOrigin,\n transforms = \"\",\n use3D = force3D === \"auto\" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)\n\n\n if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {\n var angle = parseFloat(rotationY) * _DEG2RAD,\n a13 = Math.sin(angle),\n a33 = Math.cos(angle),\n cos;\n\n angle = parseFloat(rotationX) * _DEG2RAD;\n cos = Math.cos(angle);\n x = _addPxTranslate(target, x, a13 * cos * -zOrigin);\n y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);\n z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);\n }\n\n if (transformPerspective !== _zeroPx) {\n transforms += \"perspective(\" + transformPerspective + _endParenthesis;\n }\n\n if (xPercent || yPercent) {\n transforms += \"translate(\" + xPercent + \"%, \" + yPercent + \"%) \";\n }\n\n if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {\n transforms += z !== _zeroPx || use3D ? \"translate3d(\" + x + \", \" + y + \", \" + z + \") \" : \"translate(\" + x + \", \" + y + _endParenthesis;\n }\n\n if (rotation !== _zeroDeg) {\n transforms += \"rotate(\" + rotation + _endParenthesis;\n }\n\n if (rotationY !== _zeroDeg) {\n transforms += \"rotateY(\" + rotationY + _endParenthesis;\n }\n\n if (rotationX !== _zeroDeg) {\n transforms += \"rotateX(\" + rotationX + _endParenthesis;\n }\n\n if (skewX !== _zeroDeg || skewY !== _zeroDeg) {\n transforms += \"skew(\" + skewX + \", \" + skewY + _endParenthesis;\n }\n\n if (scaleX !== 1 || scaleY !== 1) {\n transforms += \"scale(\" + scaleX + \", \" + scaleY + _endParenthesis;\n }\n\n target.style[_transformProp] = transforms || \"translate(0, 0)\";\n},\n _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {\n var _ref2 = cache || this,\n xPercent = _ref2.xPercent,\n yPercent = _ref2.yPercent,\n x = _ref2.x,\n y = _ref2.y,\n rotation = _ref2.rotation,\n skewX = _ref2.skewX,\n skewY = _ref2.skewY,\n scaleX = _ref2.scaleX,\n scaleY = _ref2.scaleY,\n target = _ref2.target,\n xOrigin = _ref2.xOrigin,\n yOrigin = _ref2.yOrigin,\n xOffset = _ref2.xOffset,\n yOffset = _ref2.yOffset,\n forceCSS = _ref2.forceCSS,\n tx = parseFloat(x),\n ty = parseFloat(y),\n a11,\n a21,\n a12,\n a22,\n temp;\n\n rotation = parseFloat(rotation);\n skewX = parseFloat(skewX);\n skewY = parseFloat(skewY);\n\n if (skewY) {\n //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.\n skewY = parseFloat(skewY);\n skewX += skewY;\n rotation += skewY;\n }\n\n if (rotation || skewX) {\n rotation *= _DEG2RAD;\n skewX *= _DEG2RAD;\n a11 = Math.cos(rotation) * scaleX;\n a21 = Math.sin(rotation) * scaleX;\n a12 = Math.sin(rotation - skewX) * -scaleY;\n a22 = Math.cos(rotation - skewX) * scaleY;\n\n if (skewX) {\n skewY *= _DEG2RAD;\n temp = Math.tan(skewX - skewY);\n temp = Math.sqrt(1 + temp * temp);\n a12 *= temp;\n a22 *= temp;\n\n if (skewY) {\n temp = Math.tan(skewY);\n temp = Math.sqrt(1 + temp * temp);\n a11 *= temp;\n a21 *= temp;\n }\n }\n\n a11 = _round(a11);\n a21 = _round(a21);\n a12 = _round(a12);\n a22 = _round(a22);\n } else {\n a11 = scaleX;\n a22 = scaleY;\n a21 = a12 = 0;\n }\n\n if (tx && !~(x + \"\").indexOf(\"px\") || ty && !~(y + \"\").indexOf(\"px\")) {\n tx = _convertToUnit(target, \"x\", x, \"px\");\n ty = _convertToUnit(target, \"y\", y, \"px\");\n }\n\n if (xOrigin || yOrigin || xOffset || yOffset) {\n tx = _round(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);\n ty = _round(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);\n }\n\n if (xPercent || yPercent) {\n //The SVG spec doesn't support percentage-based translation in the \"transform\" attribute, so we merge it into the translation to simulate it.\n temp = target.getBBox();\n tx = _round(tx + xPercent / 100 * temp.width);\n ty = _round(ty + yPercent / 100 * temp.height);\n }\n\n temp = \"matrix(\" + a11 + \",\" + a21 + \",\" + a12 + \",\" + a22 + \",\" + tx + \",\" + ty + \")\";\n target.setAttribute(\"transform\", temp);\n forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!)\n},\n _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) {\n var cap = 360,\n isString = _isString(endValue),\n endNum = parseFloat(endValue) * (isString && ~endValue.indexOf(\"rad\") ? _RAD2DEG : 1),\n change = endNum - startNum,\n finalValue = startNum + change + \"deg\",\n direction,\n pt;\n\n if (isString) {\n direction = endValue.split(\"_\")[1];\n\n if (direction === \"short\") {\n change %= cap;\n\n if (change !== change % (cap / 2)) {\n change += change < 0 ? cap : -cap;\n }\n }\n\n if (direction === \"cw\" && change < 0) {\n change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap;\n } else if (direction === \"ccw\" && change > 0) {\n change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap;\n }\n }\n\n plugin._pt = pt = new PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd);\n pt.e = finalValue;\n pt.u = \"deg\";\n\n plugin._props.push(property);\n\n return pt;\n},\n _assign = function _assign(target, source) {\n // Internet Explorer doesn't have Object.assign(), so we recreate it here.\n for (var p in source) {\n target[p] = source[p];\n }\n\n return target;\n},\n _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {\n //for handling cases where someone passes in a whole transform string, like transform: \"scale(2, 3) rotate(20deg) translateY(30em)\"\n var startCache = _assign({}, target._gsap),\n exclude = \"perspective,force3D,transformOrigin,svgOrigin\",\n style = target.style,\n endCache,\n p,\n startValue,\n endValue,\n startNum,\n endNum,\n startUnit,\n endUnit;\n\n if (startCache.svg) {\n startValue = target.getAttribute(\"transform\");\n target.setAttribute(\"transform\", \"\");\n style[_transformProp] = transforms;\n endCache = _parseTransform(target, 1);\n\n _removeProperty(target, _transformProp);\n\n target.setAttribute(\"transform\", startValue);\n } else {\n startValue = getComputedStyle(target)[_transformProp];\n style[_transformProp] = transforms;\n endCache = _parseTransform(target, 1);\n style[_transformProp] = startValue;\n }\n\n for (p in _transformProps) {\n startValue = startCache[p];\n endValue = endCache[p];\n\n if (startValue !== endValue && exclude.indexOf(p) < 0) {\n //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.\n startUnit = getUnit(startValue);\n endUnit = getUnit(endValue);\n startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);\n endNum = parseFloat(endValue);\n plugin._pt = new PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);\n plugin._pt.u = endUnit || 0;\n\n plugin._props.push(p);\n }\n }\n\n _assign(endCache, startCache);\n}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.\n\n\n_forEachName(\"padding,margin,Width,Radius\", function (name, index) {\n var t = \"Top\",\n r = \"Right\",\n b = \"Bottom\",\n l = \"Left\",\n props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {\n return index < 2 ? name + side : \"border\" + side + name;\n });\n\n _specialProps[index > 1 ? \"border\" + name : name] = function (plugin, target, property, endValue, tween) {\n var a, vars;\n\n if (arguments.length < 4) {\n // getter, passed target, property, and unit (from _get())\n a = props.map(function (prop) {\n return _get(plugin, prop, property);\n });\n vars = a.join(\" \");\n return vars.split(a[0]).length === 5 ? a[0] : vars;\n }\n\n a = (endValue + \"\").split(\" \");\n vars = {};\n props.forEach(function (prop, i) {\n return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];\n });\n plugin.init(target, vars, tween);\n };\n});\n\nexport var CSSPlugin = {\n name: \"css\",\n register: _initCore,\n targetTest: function targetTest(target) {\n return target.style && target.nodeType;\n },\n init: function init(target, vars, tween, index, targets) {\n var props = this._props,\n style = target.style,\n startAt = tween.vars.startAt,\n startValue,\n endValue,\n endNum,\n startNum,\n type,\n specialProp,\n p,\n startUnit,\n endUnit,\n relative,\n isTransformRelated,\n transformPropTween,\n cache,\n smooth,\n hasPriority,\n inlineProps,\n finalTransformValue;\n _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps\n\n this.styles = this.styles || _getStyleSaver(target);\n inlineProps = this.styles.props;\n this.tween = tween;\n\n for (p in vars) {\n if (p === \"autoRound\") {\n continue;\n }\n\n endValue = vars[p];\n\n if (_plugins[p] && _checkPlugin(p, vars, tween, index, target, targets)) {\n // plugins\n continue;\n }\n\n type = typeof endValue;\n specialProp = _specialProps[p];\n\n if (type === \"function\") {\n endValue = endValue.call(tween, index, target, targets);\n type = typeof endValue;\n }\n\n if (type === \"string\" && ~endValue.indexOf(\"random(\")) {\n endValue = _replaceRandom(endValue);\n }\n\n if (specialProp) {\n specialProp(this, target, p, endValue, tween) && (hasPriority = 1);\n } else if (p.substr(0, 2) === \"--\") {\n //CSS variable\n startValue = (getComputedStyle(target).getPropertyValue(p) + \"\").trim();\n endValue += \"\";\n _colorExp.lastIndex = 0;\n\n if (!_colorExp.test(startValue)) {\n // colors don't have units\n startUnit = getUnit(startValue);\n endUnit = getUnit(endValue);\n endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);\n }\n\n this.add(style, \"setProperty\", startValue, endValue, index, targets, 0, 0, p);\n props.push(p);\n inlineProps.push(p, 0, style[p]);\n } else if (type !== \"undefined\") {\n if (startAt && p in startAt) {\n // in case someone hard-codes a complex value as the start, like top: \"calc(2vh / 2)\". Without this, it'd use the computed value (always in px)\n startValue = typeof startAt[p] === \"function\" ? startAt[p].call(tween, index, target, targets) : startAt[p];\n _isString(startValue) && ~startValue.indexOf(\"random(\") && (startValue = _replaceRandom(startValue));\n getUnit(startValue + \"\") || startValue === \"auto\" || (startValue += _config.units[p] || getUnit(_get(target, p)) || \"\"); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.\n\n (startValue + \"\").charAt(1) === \"=\" && (startValue = _get(target, p)); // can't work with relative values\n } else {\n startValue = _get(target, p);\n }\n\n startNum = parseFloat(startValue);\n relative = type === \"string\" && endValue.charAt(1) === \"=\" && endValue.substr(0, 2);\n relative && (endValue = endValue.substr(2));\n endNum = parseFloat(endValue);\n\n if (p in _propertyAliases) {\n if (p === \"autoAlpha\") {\n //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.\n if (startNum === 1 && _get(target, \"visibility\") === \"hidden\" && endNum) {\n //if visibility is initially set to \"hidden\", we should interpret that as intent to make opacity 0 (a convenience)\n startNum = 0;\n }\n\n inlineProps.push(\"visibility\", 0, style.visibility);\n\n _addNonTweeningPT(this, style, \"visibility\", startNum ? \"inherit\" : \"hidden\", endNum ? \"inherit\" : \"hidden\", !endNum);\n }\n\n if (p !== \"scale\" && p !== \"transform\") {\n p = _propertyAliases[p];\n ~p.indexOf(\",\") && (p = p.split(\",\")[0]);\n }\n }\n\n isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED ---\n\n if (isTransformRelated) {\n this.styles.save(p);\n finalTransformValue = endValue; // this is always the same as endValue except when it's a var(--) value, in which case we need to calculate the end value.\n\n if (type === \"string\" && endValue.substring(0, 6) === \"var(--\") {\n endValue = _getComputedProperty(target, endValue.substring(4, endValue.indexOf(\")\")));\n\n if (endValue.substring(0, 5) === \"calc(\") {\n var origPerspective = target.style.perspective;\n target.style.perspective = endValue;\n endValue = _getComputedProperty(target, \"perspective\");\n origPerspective ? target.style.perspective = origPerspective : _removeProperty(target, \"perspective\");\n }\n\n endNum = parseFloat(endValue);\n }\n\n if (!transformPropTween) {\n cache = target._gsap;\n cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:\"translateX(50vw)\"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.\n\n smooth = vars.smoothOrigin !== false && cache.smooth;\n transformPropTween = this._pt = new PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)\n\n transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.\n }\n\n if (p === \"scale\") {\n this._pt = new PropTween(this._pt, cache, \"scaleY\", cache.scaleY, (relative ? _parseRelative(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp);\n this._pt.u = 0;\n props.push(\"scaleY\", p);\n p += \"X\";\n } else if (p === \"transformOrigin\") {\n inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]);\n endValue = _convertKeywordsToPercentages(endValue); //in case something like \"left top\" or \"bottom right\" is passed in. Convert to percentages.\n\n if (cache.svg) {\n _applySVGOrigin(target, endValue, 0, smooth, 0, this);\n } else {\n endUnit = parseFloat(endValue.split(\" \")[2]) || 0; //handle the zOrigin separately!\n\n endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, \"zOrigin\", cache.zOrigin, endUnit);\n\n _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));\n }\n\n continue;\n } else if (p === \"svgOrigin\") {\n _applySVGOrigin(target, endValue, 1, smooth, 0, this);\n\n continue;\n } else if (p in _rotationalProperties) {\n _addRotationalPropTween(this, cache, p, startNum, relative ? _parseRelative(startNum, relative + endValue) : endValue);\n\n continue;\n } else if (p === \"smoothOrigin\") {\n _addNonTweeningPT(this, cache, \"smooth\", cache.smooth, endValue);\n\n continue;\n } else if (p === \"force3D\") {\n cache[p] = endValue;\n continue;\n } else if (p === \"transform\") {\n _addRawTransformPTs(this, endValue, target);\n\n continue;\n }\n } else if (!(p in style)) {\n p = _checkPropPrefix(p) || p;\n }\n\n if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {\n startUnit = (startValue + \"\").substr((startNum + \"\").length);\n endNum || (endNum = 0); // protect against NaN\n\n endUnit = getUnit(endValue) || (p in _config.units ? _config.units[p] : startUnit);\n startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));\n this._pt = new PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? _parseRelative(startNum, relative + endNum) : endNum) - startNum, !isTransformRelated && (endUnit === \"px\" || p === \"zIndex\") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);\n this._pt.u = endUnit || 0;\n\n if (isTransformRelated && finalTransformValue !== endValue) {\n this._pt.b = startValue;\n this._pt.e = finalTransformValue;\n this._pt.r = _renderCSSPropWithBeginningAndEnd;\n } else if (startUnit !== endUnit && endUnit !== \"%\") {\n //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a \"b\" (beginning) property and point to a render method that handles that. (performance optimization)\n this._pt.b = startValue;\n this._pt.r = _renderCSSPropWithBeginning;\n }\n } else if (!(p in style)) {\n if (p in target) {\n //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.\n this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets);\n } else if (p !== \"parseTransform\") {\n _missingPlugin(p, endValue);\n\n continue;\n }\n } else {\n _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue);\n }\n\n isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === \"function\" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p]));\n props.push(p);\n }\n }\n\n hasPriority && _sortPropTweensByPriority(this);\n },\n render: function render(ratio, data) {\n if (data.tween._time || !_reverting()) {\n var pt = data._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n } else {\n data.styles.revert();\n }\n },\n get: _get,\n aliases: _propertyAliases,\n getSetter: function getSetter(target, property, plugin) {\n //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like \"x\" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.\n var p = _propertyAliases[property];\n p && p.indexOf(\",\") < 0 && (property = p);\n return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, \"x\")) ? plugin && _recentSetterPlugin === plugin ? property === \"scale\" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === \"scale\" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !_isUndefined(target.style[property]) ? _setterCSSStyle : ~property.indexOf(\"-\") ? _setterCSSProp : _getSetter(target, property);\n },\n core: {\n _removeProperty: _removeProperty,\n _getMatrix: _getMatrix\n }\n};\ngsap.utils.checkPrefix = _checkPropPrefix;\ngsap.core.getStyleSaver = _getStyleSaver;\n\n(function (positionAndScale, rotation, others, aliases) {\n var all = _forEachName(positionAndScale + \",\" + rotation + \",\" + others, function (name) {\n _transformProps[name] = 1;\n });\n\n _forEachName(rotation, function (name) {\n _config.units[name] = \"deg\";\n _rotationalProperties[name] = 1;\n });\n\n _propertyAliases[all[13]] = positionAndScale + \",\" + rotation;\n\n _forEachName(aliases, function (name) {\n var split = name.split(\":\");\n _propertyAliases[split[1]] = all[split[0]];\n });\n})(\"x,y,z,scale,scaleX,scaleY,xPercent,yPercent\", \"rotation,rotationX,rotationY,skewX,skewY\", \"transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective\", \"0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY\");\n\n_forEachName(\"x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective\", function (name) {\n _config.units[name] = \"px\";\n});\n\ngsap.registerPlugin(CSSPlugin);\nexport { CSSPlugin as default, _getBBox, _createElement, _checkPropPrefix as checkPrefix };","import { gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenLite, TimelineLite, TimelineMax } from \"./gsap-core.js\";\nimport { CSSPlugin } from \"./CSSPlugin.js\";\nvar gsapWithCSS = gsap.registerPlugin(CSSPlugin) || gsap,\n // to protect from tree shaking\nTweenMaxWithCSS = gsapWithCSS.core.Tween;\nexport { gsapWithCSS as gsap, gsapWithCSS as default, CSSPlugin, TweenMaxWithCSS as TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };","/**\n * Easing functions for smooth animations.\n */\n\nimport { gsap } from 'gsap';\nimport { clamp } from './units';\nimport type { EasingName } from '../types/scene';\n\nconst EASE_ALIASES: Record<string, string> = {\n ease: 'power3.out',\n smooth: 'power3.out',\n 'ease-out': 'power3.out',\n easeOut: 'power3.out',\n expo: 'expo.out',\n expoOut: 'expo.out',\n softSpring: 'back.out(1.05)',\n 'soft-spring': 'back.out(1.05)',\n spring: 'elastic.out(0.55, 0.42)',\n bounceOut: 'bounce.out',\n};\n\n/**\n * Apply easing function to progress value (0-1)\n */\nexport function ease(progress: number, name?: EasingName): number {\n const t = clamp(progress, 0, 1);\n if (t === 0 || t === 1) return t;\n\n const easing = EASE_ALIASES[String(name ?? 'power3.out')] ?? String(name ?? 'power3.out');\n if (easing.startsWith('cubic-bezier(')) return cubicBezier(easing, t);\n\n const parsed = gsap.parseEase(easing) ?? gsap.parseEase('power3.out');\n return clamp(parsed(t), 0, 1.04);\n}\n\n// ============================================================================\n// CUSTOM CUBIC BEZIER\n// ============================================================================\n\n/**\n * Cubic bezier easing with custom control points\n * Format: \"cubic-bezier(x1, y1, x2, y2)\"\n *\n * Common presets:\n * - cubic-bezier(0, 0, 0.2, 1) - Material Design standard\n * - cubic-bezier(0.4, 0, 0.2, 1) - Material accelerate-decelerate\n * - cubic-bezier(0, 0, 0.3, 1) - iOS standard\n */\nfunction cubicBezier(name: string, progress: number): number {\n const values = name\n .match(/^cubic-bezier\\(([^)]+)\\)$/)?.[1]\n ?.split(',')\n .map((value) => Number(value.trim()));\n\n if (!values || values.length !== 4 || values.some((value) => !Number.isFinite(value))) {\n return ease(progress, 'power3.out');\n }\n\n const [x1, y1, x2, y2] = values as [number, number, number, number];\n // CSS timing functions require x control points in [0, 1] so x(t) is monotonic.\n if (x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1) return ease(progress, 'power3.out');\n\n const sample = (a: number, b: number, t: number): number => {\n const inverse = 1 - t;\n return 3 * inverse * inverse * t * a + 3 * inverse * t * t * b + t * t * t;\n };\n const slope = (a: number, b: number, t: number): number =>\n 3 * (1 - t) * (1 - t) * a + 6 * (1 - t) * t * (b - a) + 3 * t * t * (1 - b);\n\n // Invert x(t) to find the curve parameter for the requested timeline progress.\n let parameter = progress;\n for (let index = 0; index < 8; index += 1) {\n const error = sample(x1, x2, parameter) - progress;\n if (Math.abs(error) < 1e-7) return sample(y1, y2, parameter);\n const derivative = slope(x1, x2, parameter);\n if (Math.abs(derivative) < 1e-7) break;\n const next = parameter - error / derivative;\n if (next < 0 || next > 1) break;\n parameter = next;\n }\n\n // Newton iteration can become unstable for flat curves; bisection is bounded and deterministic.\n let lower = 0;\n let upper = 1;\n parameter = progress;\n for (let index = 0; index < 24; index += 1) {\n const x = sample(x1, x2, parameter);\n if (Math.abs(x - progress) < 1e-7) break;\n if (x < progress) lower = parameter;\n else upper = parameter;\n parameter = (lower + upper) / 2;\n }\n return sample(y1, y2, parameter);\n}\n","/**\n * Value interpolation utilities for animations\n */\n\nimport { parseColor } from './color';\nimport type { RGBA } from '../types/utils';\nimport type { AnimatableValue } from '../types/scene';\n\n/**\n * Interpolate between two values based on progress (0-1)\n * Supports: numbers, colors (hex, rgb, rgba)\n */\nexport function interpolateValue(\n from: AnimatableValue,\n to: AnimatableValue,\n progress: number\n): AnimatableValue {\n if (progress <= 0) return from;\n if (progress >= 1) return to;\n\n if (typeof from === 'number' && typeof to === 'number') {\n return from + (to - from) * progress;\n }\n\n if (isColor(from) && isColor(to)) {\n return interpolateColor(from, to, progress);\n }\n\n return progress < 1 ? from : to;\n}\n\n/**\n * Check if value is a color string\n */\nfunction isColor(value: AnimatableValue): value is string {\n return typeof value === 'string' && (value.startsWith('#') || value.startsWith('rgb'));\n}\n\n/**\n * Interpolate between two color values\n */\nfunction interpolateColor(from: string, to: string, progress: number): string {\n const a = colorToRgb(from);\n const b = colorToRgb(to);\n\n if (!a || !b) {\n return progress < 1 ? parseColor(from) : parseColor(to);\n }\n\n const r = Math.round(a.r + (b.r - a.r) * progress);\n const g = Math.round(a.g + (b.g - a.g) * progress);\n const bl = Math.round(a.b + (b.b - a.b) * progress);\n const alpha = a.a + (b.a - a.a) * progress;\n\n return `rgba(${r}, ${g}, ${bl}, ${alpha.toFixed(3)})`;\n}\n\n/**\n * Convert color string to RGBA components\n */\nfunction colorToRgb(value: string): RGBA | null {\n const text = String(value).trim();\n\n // Parse hex colors\n if (text.startsWith('#')) {\n const hex = text.slice(1);\n\n // Short hex (#fff)\n if (hex.length === 3) {\n return {\n r: Number.parseInt(hex[0]! + hex[0]!, 16),\n g: Number.parseInt(hex[1]! + hex[1]!, 16),\n b: Number.parseInt(hex[2]! + hex[2]!, 16),\n a: 1,\n };\n }\n\n // Full hex (#ffffff)\n if (hex.length === 6) {\n return {\n r: Number.parseInt(hex.slice(0, 2), 16),\n g: Number.parseInt(hex.slice(2, 4), 16),\n b: Number.parseInt(hex.slice(4, 6), 16),\n a: 1,\n };\n }\n }\n\n // Parse rgb/rgba colors\n const rgba = text.match(/^rgba?\\(([^)]+)\\)$/);\n if (!rgba) return null;\n\n const values = rgba[1]!.split(',').map((part) => Number.parseFloat(part.trim()));\n return {\n r: values[0] ?? 0,\n g: values[1] ?? 0,\n b: values[2] ?? 0,\n a: values[3] ?? 1,\n };\n}\n\n/**\n * Export colorToRgb for testing/external use\n */\nexport { colorToRgb };\n","/**\n * Animation evaluator\n * Evaluates scene state at a specific time by applying animations\n */\n\nimport { ease } from '../core/easing';\nimport { interpolateValue } from '../core/interpolate';\nimport { clamp } from '../core/units';\nimport type {\n Scene,\n EvaluatedScene,\n Element,\n Animation,\n Keyframe,\n PropertyMap,\n ElementProperties,\n} from '../types/scene';\n\n/**\n * Evaluate scene at a specific time\n * Returns the scene with all animations applied\n */\nexport function evaluateScene(scene: Scene, time: number): EvaluatedScene {\n const camera = evaluateCamera(scene, time);\n const clippedAssets = new Set(scene.clips.map((clip) => clip.assetName));\n\n // Evaluate regular elements\n const elements = scene.elements\n .filter(\n (element) =>\n (element.kind !== 'asset' || !element.assetName || !clippedAssets.has(element.assetName)) &&\n elementTrackVisible(scene, element) &&\n elementWindowActive(element, time)\n )\n .map((element) => {\n const render = evaluateElement(element, scene.animations, time);\n if (element.asset?.type === 'video') render.mediaTime = Math.max(0, time);\n return { ...element, render };\n });\n\n // Visual tracks stack bottom-to-top: higher track numbers render last.\n // Authored source order is the explicit same-track tie-breaker.\n const activeClips = scene.clips\n .filter((clip) => {\n const track = scene.tracks.find((candidate) => candidate.id === String(clip.track));\n if (track?.role === 'audio' || track?.hidden) return false;\n const transitionTail = clip.transitionOut === 'crossfade' ? clip.transitionOutDuration : 0;\n return time >= clip.start && time < clip.start + clip.duration + transitionTail;\n })\n .sort(\n (a, b) =>\n clipTrackRank(scene, a.track) - clipTrackRank(scene, b.track) ||\n a.sourceOrder - b.sourceOrder\n );\n\n for (const clip of activeClips) {\n if (!clip.asset) continue;\n const sourceElement = scene.elements.find(\n (element) => element.kind === 'asset' && element.assetName === clip.assetName\n );\n const sourceRender = sourceElement\n ? evaluateElement(sourceElement, scene.animations, time)\n : ({\n x: 0,\n y: 0,\n scale: 1,\n rotation: 0,\n opacity: 1,\n center: true,\n cover: true,\n layer: 'content',\n } as ElementProperties);\n\n const clipEnd = clip.start + clip.duration;\n let transitionOpacity = 1;\n if (clip.transitionIn === 'crossfade' && clip.transitionInDuration > 0) {\n transitionOpacity *= clamp((time - clip.start) / clip.transitionInDuration);\n }\n if (clip.transitionOut === 'crossfade' && clip.transitionOutDuration > 0 && time >= clipEnd) {\n transitionOpacity *= 1 - clamp((time - clipEnd) / clip.transitionOutDuration);\n }\n const sourceOpacity = Number(sourceRender.opacity ?? 1);\n\n const clipElement: import('../types/scene').EvaluatedElement = {\n id: clip.id,\n kind: 'asset',\n assetName: clip.assetName,\n asset: clip.asset,\n properties: sourceElement?.properties ?? ({} as ElementProperties),\n render: {\n ...sourceRender,\n opacity: sourceOpacity * transitionOpacity,\n mediaTime: Math.max(0, clip.trimIn + time - clip.start),\n mediaTrimOut: clip.trimOut,\n mediaVolume: clip.volume ?? 1,\n mediaMuted:\n (scene.tracks.find((track) => track.id === String(clip.track))?.muted ?? false) ||\n (clip.mute ?? false),\n } as ElementProperties,\n };\n\n elements.push(clipElement);\n }\n\n elements.sort((left, right) => elementTrackRank(scene, left) - elementTrackRank(scene, right));\n return { canvas: scene.canvas, camera, elements };\n}\n\nfunction clipTrackRank(scene: Scene, trackId: number | string): number {\n const track = scene.tracks.find((candidate) => candidate.id === String(trackId));\n if (track) return track.role === 'main' ? 0 : 100 + track.order;\n return trackRank(trackId);\n}\n\nfunction elementWindowActive(element: Element, time: number): boolean {\n const properties = element.properties as unknown as Record<string, unknown>;\n if (properties['start'] === undefined || properties['duration'] === undefined) return true;\n const start = Number(properties['start']);\n const duration = Number(properties['duration']);\n if (!Number.isFinite(start) || !Number.isFinite(duration)) return true;\n return time >= start && time < start + Math.max(0, duration);\n}\n\nfunction elementTrackVisible(scene: Scene, element: Element): boolean {\n const trackId = (element.properties as unknown as Record<string, unknown>)['track'];\n if (trackId === undefined) return true;\n const track = scene.tracks.find((candidate) => candidate.id === String(trackId));\n return track?.role !== 'audio' && !track?.hidden;\n}\n\nfunction elementTrackRank(\n scene: Scene,\n element: import('../types/scene').EvaluatedElement\n): number {\n const clip = scene.clips.find((candidate) => candidate.id === element.id);\n if (clip) return clipTrackRank(scene, clip.track);\n const trackId = (element.render as unknown as Record<string, unknown>)['track'];\n if (trackId !== undefined) return clipTrackRank(scene, String(trackId));\n return 1000;\n}\n\nfunction trackRank(track: number | string): number {\n const rank = Number(track);\n return Number.isFinite(rank) ? rank : 0;\n}\n\n/**\n * Evaluate camera state at a specific time\n */\nfunction evaluateCamera(scene: Scene, time: number): ElementProperties {\n const cameraElement: Element = {\n id: 'camera',\n kind: 'asset',\n assetName: null,\n asset: null,\n properties: (scene.camera ?? {\n x: 0,\n y: 0,\n zoom: 1,\n rotation: 0,\n }) as unknown as ElementProperties,\n };\n return evaluateElement(cameraElement, scene.animations, time);\n}\n\n/**\n * Evaluate element state at a specific time by applying all animations\n */\nfunction evaluateElement(\n element: Element,\n animations: Animation[],\n time: number\n): ElementProperties {\n let state: Record<string, unknown> = { ...element.properties } as unknown as Record<\n string,\n unknown\n >;\n\n for (const animation of animations.filter((item) => item.target === element.id)) {\n state = applyAnimation(state as PropertyMap, animation, time) as unknown as Record<\n string,\n unknown\n >;\n }\n\n return state as unknown as ElementProperties;\n}\n\n/**\n * Apply a single animation to element state\n */\nfunction applyAnimation(state: PropertyMap, animation: Animation, time: number): PropertyMap {\n const localTime = time - animation.delay;\n\n if (localTime < 0) return state;\n\n const rawProgress = clamp(localTime / animation.duration);\n\n if (animation.keyframes.length > 0) {\n return applyKeyframes(state, animation.keyframes, rawProgress, animation.easing);\n }\n\n if (localTime === 0) return { ...state, ...animation.from };\n\n const progress = ease(rawProgress, animation.easing);\n const next: PropertyMap = { ...state };\n const keys = new Set([...Object.keys(animation.from), ...Object.keys(animation.to)]);\n\n for (const key of keys) {\n const from = animation.from[key] ?? state[key] ?? 0;\n const to = animation.to[key] ?? state[key] ?? 0;\n next[key] = interpolateValue(from, to, progress);\n }\n\n return next;\n}\n\n/**\n * Apply keyframe-based animation\n */\nfunction applyKeyframes(\n state: PropertyMap,\n keyframes: Keyframe[],\n progress: number,\n easing: string\n): PropertyMap {\n if (keyframes.length === 0) return state;\n\n const firstFrame = keyframes[0];\n const lastFrame = keyframes[keyframes.length - 1];\n\n if (!firstFrame || !lastFrame) return state;\n\n if (progress <= firstFrame.offset) {\n return { ...state, ...firstFrame.properties };\n }\n\n if (progress >= lastFrame.offset) {\n return { ...state, ...lastFrame.properties };\n }\n\n const next: PropertyMap = { ...state };\n let left = firstFrame;\n let right = lastFrame;\n\n for (let index = 0; index < keyframes.length - 1; index += 1) {\n const current = keyframes[index];\n const nextFrame = keyframes[index + 1];\n\n if (!current || !nextFrame) continue;\n\n if (progress >= current.offset && progress <= nextFrame.offset) {\n left = current;\n right = nextFrame;\n break;\n }\n }\n\n const span = right.offset - left.offset || 1;\n const segmentEasing = right.easing ?? easing;\n const local = ease((progress - left.offset) / span, segmentEasing);\n const keys = new Set([...Object.keys(left.properties), ...Object.keys(right.properties)]);\n\n for (const key of keys) {\n const from = left.properties[key] ?? state[key] ?? 0;\n const to = right.properties[key] ?? state[key] ?? 0;\n next[key] = interpolateValue(from, to, local);\n }\n\n return next;\n}\n","/**\n * Typed visual asset loading for images, SVGs, and browser-decodable video.\n */\n\nimport type { AssetType, EvaluatedScene, Scene } from '../types/scene';\nimport { assetFilename } from './asset-resolution';\n\nexport interface MotionlySvgData {\n width: number;\n height: number;\n paths: Array<{\n d: string;\n stroke: string;\n strokeWidth: number;\n opacity: number;\n lineCap: CanvasLineCap;\n lineJoin: CanvasLineJoin;\n length: number;\n }>;\n}\n\ninterface LoadedAssetMetadata {\n motionlySvg?: MotionlySvgData;\n motionlyDuration?: number;\n motionlySize?: number;\n}\n\nexport type LoadedImageAsset = HTMLImageElement &\n LoadedAssetMetadata & {\n motionlyType: 'image';\n };\nexport type LoadedVideoAsset = HTMLVideoElement &\n LoadedAssetMetadata & {\n motionlyType: 'video';\n motionlyDuration: number;\n };\nexport type LoadedAsset = LoadedImageAsset | LoadedVideoAsset;\n\nexport function isLoadedVideo(asset: LoadedAsset | undefined): asset is LoadedVideoAsset {\n return asset?.motionlyType === 'video';\n}\n\n/** Load all imported visual assets without failing the whole project on one bad file. */\nexport async function loadAssets(\n scene: Scene,\n baseUrl: string = document.baseURI\n): Promise<Map<string, LoadedAsset>> {\n const uploadedByFilename = new Map<string, string>();\n for (const asset of scene.imports) {\n const filename = assetFilename(asset.path);\n if (asset.path.startsWith('data:') && filename) uploadedByFilename.set(filename, asset.path);\n }\n const entries = await Promise.all(\n scene.imports.map(async (asset): Promise<[string, LoadedAsset] | null> => {\n try {\n const path = uploadedByFilename.get(assetFilename(asset.path)) ?? asset.path;\n return [asset.name, await loadAsset(path, baseUrl, asset.type)];\n } catch (error) {\n console.warn(`Could not load asset ${asset.path}:`, error);\n return null;\n }\n })\n );\n return new Map(entries.filter((entry): entry is [string, LoadedAsset] => entry !== null));\n}\n\n/** Load one image/SVG or video using the browser's native decoder. */\nexport async function loadAsset(\n path: string,\n baseUrl: string,\n type: AssetType\n): Promise<LoadedAsset> {\n const url = new URL(\n path.startsWith('/') ? `${import.meta.env.BASE_URL}${path.slice(1)}` : path,\n baseUrl\n ).href;\n const [asset, size] = await Promise.all([\n type === 'video' ? loadVideo(url) : loadImage(url, type === 'svg'),\n loadAssetSize(url),\n ]);\n if (size) asset.motionlySize = size;\n return asset;\n}\n\nasync function loadAssetSize(url: string): Promise<number | undefined> {\n if (!/^https?:/i.test(url)) return undefined;\n try {\n const response = await fetch(url, { method: 'HEAD' });\n const size = Number(response.headers.get('content-length'));\n return response.ok && Number.isFinite(size) && size > 0 ? size : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function loadImage(url: string, isSvg: boolean): Promise<LoadedAsset> {\n const image = new Image() as LoadedImageAsset;\n image.motionlyType = 'image';\n image.decoding = 'async';\n image.src = url;\n const svgSource = isSvg\n ? fetch(url).then((response) => {\n if (!response.ok) throw new Error(`Asset request failed (${response.status})`);\n return response.text();\n })\n : null;\n await Promise.all([image.decode(), svgSource]);\n if (svgSource) image.motionlySvg = parseSvg(await svgSource);\n return image;\n}\n\nasync function loadVideo(url: string): Promise<LoadedVideoAsset> {\n const video = document.createElement('video') as LoadedVideoAsset;\n video.motionlyType = 'video';\n video.preload = 'auto';\n video.muted = true;\n video.defaultMuted = true;\n video.playsInline = true;\n video.src = url;\n video.load();\n if (video.readyState < HTMLMediaElement.HAVE_METADATA) await mediaEvent(video, 'loadedmetadata');\n if (video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) await mediaEvent(video, 'loadeddata');\n video.width = Math.max(1, video.videoWidth);\n video.height = Math.max(1, video.videoHeight);\n video.motionlyDuration = Number.isFinite(video.duration) ? video.duration : 0;\n return video;\n}\n\nfunction mediaEvent(\n video: HTMLVideoElement,\n event: 'loadedmetadata' | 'loadeddata' | 'seeked'\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n video.removeEventListener(event, complete);\n video.removeEventListener('error', fail);\n };\n const complete = () => {\n cleanup();\n resolve();\n };\n const fail = () => {\n cleanup();\n reject(video.error ?? new Error(`Video failed during ${event}`));\n };\n video.addEventListener(event, complete, { once: true });\n video.addEventListener('error', fail, { once: true });\n });\n}\n\nexport interface VideoSyncOptions {\n playing: boolean;\n exact?: boolean;\n}\n\nexport function videoSourceTime(sourceTime: number, duration: number, trimOut = 0): number {\n const maximum = Math.max(0, duration - Math.max(0, trimOut) - 0.001);\n return Math.max(0, Math.min(maximum, Number.isFinite(sourceTime) ? sourceTime : 0));\n}\n\n/**\n * Synchronize native video decoders to evaluated clip source times.\n * Exact mode awaits seek completion for scrubbing and export; playback mode lets\n * muted videos run natively and only corrects meaningful drift.\n */\nexport async function synchronizeVideoAssets(\n frame: EvaluatedScene,\n assets: Map<string, LoadedAsset>,\n options: VideoSyncOptions\n): Promise<void> {\n const active = new Map<string, Record<string, unknown>>();\n for (const element of frame.elements) {\n if (!element.assetName) continue;\n const asset = assets.get(element.assetName);\n if (!isLoadedVideo(asset)) continue;\n active.set(element.assetName, element.render as unknown as Record<string, unknown>);\n }\n\n const operations: Promise<void>[] = [];\n for (const [name, asset] of assets) {\n if (!isLoadedVideo(asset)) continue;\n const render = active.get(name);\n if (!render) {\n asset.pause();\n continue;\n }\n const sourceTime = Number(render['mediaTime'] ?? 0);\n const trimOut = Math.max(0, Number(render['mediaTrimOut'] ?? 0));\n const desired = videoSourceTime(sourceTime, asset.motionlyDuration, trimOut);\n const tolerance = options.exact ? 1 / 1000 : 0.15;\n if (Math.abs(asset.currentTime - desired) > tolerance) {\n operations.push(seekVideo(asset, desired));\n }\n if (options.playing && asset.paused) {\n operations.push(asset.play().catch(() => undefined));\n } else if (!options.playing) {\n asset.pause();\n }\n }\n await Promise.all(operations);\n}\n\nexport function pauseVideoAssets(assets: Map<string, LoadedAsset>): void {\n for (const asset of assets.values()) if (isLoadedVideo(asset)) asset.pause();\n}\n\nasync function seekVideo(video: LoadedVideoAsset, time: number): Promise<void> {\n if (Math.abs(video.currentTime - time) <= 1 / 1000) return;\n const done = mediaEvent(video, 'seeked');\n video.currentTime = time;\n await done;\n}\n\nfunction parseSvg(source: string): MotionlySvgData {\n const svg = new DOMParser().parseFromString(source, 'image/svg+xml').documentElement;\n const viewBox = svg.getAttribute('viewBox')?.split(/\\s+/).map(Number);\n const width = viewBox?.[2] ?? Number.parseFloat(svg.getAttribute('width') ?? '1');\n const height = viewBox?.[3] ?? Number.parseFloat(svg.getAttribute('height') ?? '1');\n const paths = Array.from(svg.querySelectorAll('path[d]')).flatMap((path, index) => {\n const stroke = path.getAttribute('stroke');\n if (!stroke || stroke === 'none') return [];\n let length = width + height;\n try {\n length = (path as SVGPathElement).getTotalLength();\n } catch {\n // Detached SVG geometry is unavailable in a few browsers; the reveal still works.\n }\n return [\n {\n d: path.getAttribute('d')!,\n stroke: stroke.startsWith('url(') ? (index ? '#ffffff' : '#8ab4ff') : stroke,\n strokeWidth: Number.parseFloat(path.getAttribute('stroke-width') ?? '1'),\n opacity: Number.parseFloat(path.getAttribute('stroke-opacity') ?? '1'),\n lineCap: (path.getAttribute('stroke-linecap') as CanvasLineCap) || 'butt',\n lineJoin: (path.getAttribute('stroke-linejoin') as CanvasLineJoin) || 'miter',\n length: Math.max(1, length),\n },\n ];\n });\n return { width, height, paths };\n}\n","/**\n * Canvas renderer for Motionly scenes\n * Renders evaluated scenes to HTML5 Canvas\n */\n\nimport type { EvaluatedScene, EvaluatedElement, Canvas, ElementProperties } from '../types/scene';\nimport type { BoundingBox } from '../types/export';\nimport { isLoadedVideo, type LoadedAsset } from '../assets/asset-loader';\nimport { formatCountValue } from '../animation-library/count-up';\n\n/**\n * Canvas renderer class\n */\nexport class CanvasRenderer {\n private canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private maskCanvas: HTMLCanvasElement;\n private maskContext: CanvasRenderingContext2D;\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas = canvas;\n const ctx = canvas.getContext('2d', { alpha: false });\n if (!ctx) {\n throw new Error('Failed to get 2D rendering context');\n }\n this.context = ctx;\n this.maskCanvas = canvas.ownerDocument.createElement('canvas');\n const maskContext = this.maskCanvas.getContext('2d');\n if (!maskContext) throw new Error('Failed to create mask rendering context');\n this.maskContext = maskContext;\n }\n\n /**\n * Resize canvas\n */\n resize(width: number, height: number): void {\n if (this.canvas.width !== width) this.canvas.width = width;\n if (this.canvas.height !== height) this.canvas.height = height;\n if (this.maskCanvas.width !== width) this.maskCanvas.width = width;\n if (this.maskCanvas.height !== height) this.maskCanvas.height = height;\n }\n\n /**\n * Render frame to canvas\n */\n render(frame: EvaluatedScene, assets: Map<string, LoadedAsset> = new Map()): void {\n const { canvas, camera, elements } = frame;\n this.resize(canvas.width, canvas.height);\n const ctx = this.context;\n\n ctx.save();\n ctx.globalAlpha = 1;\n ctx.filter = 'none';\n ctx.fillStyle = canvas.background;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const laidOut = layoutGeneratedText(elements);\n const hiddenMaskSources = hiddenMaskSourceIds(laidOut);\n const elementsById = new Map(laidOut.map((element) => [element.id, element]));\n\n ctx.save();\n applyCamera(ctx, canvas, camera);\n for (const element of laidOut) {\n const props = element.render as unknown as Record<string, unknown>;\n if (props['layer'] !== 'effects' && !hiddenMaskSources.has(element.id)) {\n drawElementWithMask(\n ctx,\n canvas,\n element,\n laidOut,\n assets,\n elementsById,\n this.maskCanvas,\n this.maskContext\n );\n }\n }\n ctx.restore();\n\n for (const element of laidOut) {\n const props = element.render as unknown as Record<string, unknown>;\n if (props['layer'] === 'effects' && !hiddenMaskSources.has(element.id)) {\n drawElementWithMask(\n ctx,\n canvas,\n element,\n laidOut,\n assets,\n elementsById,\n this.maskCanvas,\n this.maskContext\n );\n }\n }\n\n ctx.restore();\n }\n\n /**\n * Measure text width\n */\n measureText(text: string, font: string, size: number, weight: number): TextMetrics {\n this.context.font = `${weight} ${size}px ${font}`;\n return this.context.measureText(text);\n }\n}\n\n/**\n * Layout generated text elements (word grouping)\n */\nfunction layoutGeneratedText(elements: EvaluatedElement[]): EvaluatedElement[] {\n const groups = new Map<string, EvaluatedElement[]>();\n const output: EvaluatedElement[] = [];\n\n for (const element of elements) {\n const props = element.properties as unknown as Record<string, unknown>;\n const group = props['textGroup'] as string | undefined;\n\n if (!group || props['textSplit'] !== 'words') {\n output.push(element);\n continue;\n }\n\n if (!groups.has(group)) {\n groups.set(group, []);\n }\n groups.get(group)!.push(element);\n }\n\n for (const group of groups.values()) {\n output.push(...layoutWordGroup(group));\n }\n\n return output;\n}\n\n/**\n * Layout word group for proper spacing\n */\nfunction layoutWordGroup(group: EvaluatedElement[]): EvaluatedElement[] {\n if (group.length === 0) return group;\n\n const ctx = layoutContext();\n const first = group[0]!.render as unknown as Record<string, unknown>;\n const groupX = (first['textGroupX'] as number) ?? 0;\n ctx.font = `${first['weight']} ${first['size']}px ${first['font']}`;\n\n const widths = group.map((element) => {\n const render = element.render as unknown as Record<string, unknown>;\n return ctx.measureText(String(render['value'])).width;\n });\n\n const space = ctx.measureText(' ').width;\n const total = widths.reduce((sum, width) => sum + width, 0) + space * (group.length - 1);\n let cursor = -total / 2;\n\n return group.map((element, index) => {\n const width = widths[index]!;\n const finalX = cursor + width / 2;\n cursor += width + space;\n\n const props = element.properties as unknown as Record<string, unknown>;\n const render = element.render as unknown as Record<string, unknown>;\n const baseX = props['x'] as number;\n const renderX = render['x'] as number | undefined;\n const drift = typeof renderX === 'number' && typeof baseX === 'number' ? renderX - baseX : 0;\n\n return {\n ...element,\n render: {\n ...element.render,\n x: groupX + finalX + drift,\n } as unknown as ElementProperties,\n };\n });\n}\n\nlet textMeasureCanvas: HTMLCanvasElement | undefined;\n\n/**\n * Get layout context for text measurement\n */\nfunction layoutContext(): CanvasRenderingContext2D | typeof fallbackMeasureContext {\n if (typeof document === 'undefined') return fallbackMeasureContext;\n if (!textMeasureCanvas) {\n textMeasureCanvas = document.createElement('canvas');\n }\n const ctx = textMeasureCanvas.getContext('2d');\n return ctx ?? fallbackMeasureContext;\n}\n\n/**\n * Fallback context for server-side rendering\n */\nconst fallbackMeasureContext = {\n font: '',\n measureText(text: string): TextMetrics {\n const size = Number.parseFloat(this.font.match(/(\\d+(?:\\.\\d+)?)px/)?.[1] ?? '16');\n return { width: String(text).length * size * 0.52 } as TextMetrics;\n },\n};\n\n/**\n * Apply camera transformation\n */\nfunction applyCamera(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n camera: ElementProperties\n): void {\n const cameraProps = camera as unknown as Record<string, unknown>;\n const zoom = (cameraProps['zoom'] as number) ?? 1;\n const rotation = (cameraProps['rotation'] as number) ?? 0;\n const x = (cameraProps['x'] as number) ?? 0;\n const y = (cameraProps['y'] as number) ?? 0;\n\n ctx.translate(canvas.width / 2, canvas.height / 2);\n ctx.scale(zoom, zoom);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.translate(-(canvas.width / 2) - x, -(canvas.height / 2) - y);\n}\n\n/** Mask layers are hidden unless their target opts into showing them as normal artwork. */\nexport function hiddenMaskSourceIds(elements: EvaluatedElement[]): Set<string> {\n const hidden = new Set<string>();\n for (const element of elements) {\n const props = element.render as unknown as Record<string, unknown>;\n const mask = String(props['mask'] ?? '');\n if (mask && mask !== 'none' && props['maskVisible'] !== true) hidden.add(mask);\n }\n return hidden;\n}\n\nfunction drawElementWithMask(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n element: EvaluatedElement,\n elements: EvaluatedElement[],\n assets: Map<string, LoadedAsset>,\n elementsById: Map<string, EvaluatedElement>,\n maskCanvas: HTMLCanvasElement,\n maskContext: CanvasRenderingContext2D\n): void {\n const props = element.render as unknown as Record<string, unknown>;\n const maskId = String(props['mask'] ?? '');\n const maskElement =\n maskId && maskId !== 'none' ? elements.find((candidate) => candidate.id === maskId) : undefined;\n if (!maskElement) {\n drawElement(ctx, canvas, element, assets, elementsById);\n return;\n }\n\n maskContext.save();\n maskContext.setTransform(1, 0, 0, 1, 0, 0);\n maskContext.clearRect(0, 0, maskCanvas.width, maskCanvas.height);\n maskContext.restore();\n\n maskContext.save();\n maskContext.setTransform(ctx.getTransform());\n maskContext.globalAlpha = 1;\n maskContext.filter = 'none';\n maskContext.globalCompositeOperation = 'source-over';\n drawElement(maskContext, canvas, element, assets, elementsById);\n maskContext.globalCompositeOperation =\n props['maskInvert'] === true ? 'destination-out' : 'destination-in';\n drawElement(maskContext, canvas, maskElement, assets, elementsById);\n maskContext.restore();\n\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.globalAlpha = 1;\n ctx.filter = 'none';\n ctx.drawImage(maskCanvas, 0, 0);\n ctx.restore();\n}\n\n/**\n * Draw element to canvas\n */\nfunction drawElement(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n element: EvaluatedElement,\n assets: Map<string, LoadedAsset>,\n elementsById: Map<string, EvaluatedElement>\n): void {\n const props = element.render as unknown as Record<string, unknown>;\n const opacity = props['opacity'] as number;\n\n if (opacity <= 0) return;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n\n const filter = buildCanvasFilter(props);\n if (filter !== 'none') {\n ctx.filter = filter;\n }\n\n if (element.kind === 'text') {\n drawText(ctx, canvas, props);\n } else if (element.kind === 'overlay') {\n drawOverlay(ctx, canvas, props, assets, elementsById);\n } else if (element.kind === 'effect') {\n drawEffect(ctx, canvas, props);\n } else {\n drawAsset(ctx, canvas, element, props, assets);\n }\n\n ctx.restore();\n}\n\n/**\n * Draw asset (image or SVG)\n */\nfunction drawAsset(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n element: EvaluatedElement,\n props: Record<string, unknown>,\n assets: Map<string, LoadedAsset>\n): void {\n const assetName = element.assetName;\n if (!assetName) return;\n\n const asset = assets.get(assetName);\n if (!asset) return;\n if (isLoadedVideo(asset) && asset.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) return;\n\n const box = resolveBox(canvas, asset, props);\n drawShadow(ctx, props);\n\n const rotation = (props['rotation'] as number) ?? 0;\n const scale = (props['scale'] as number) ?? 1;\n\n ctx.translate(box.x + box.width / 2, box.y + box.height / 2);\n ctx.rotate((rotation * Math.PI) / 180);\n applySkew(ctx, props);\n ctx.scale(scale, scale);\n clipReveal(ctx, box.width, box.height, props);\n const progress = props['pathProgress'];\n if (typeof progress === 'number' && asset.motionlySvg?.paths.length) {\n drawSvgReveal(ctx, asset, box, progress);\n } else {\n ctx.drawImage(asset, -box.width / 2, -box.height / 2, box.width, box.height);\n }\n}\n\nfunction drawSvgReveal(\n ctx: CanvasRenderingContext2D,\n asset: LoadedAsset,\n box: BoundingBox,\n value: number\n): void {\n const svg = asset.motionlySvg!;\n const progress = Math.max(0, Math.min(1, value));\n const artworkOpacity = Math.max(0, Math.min(1, (progress - 0.72) / 0.28));\n\n if (artworkOpacity > 0) {\n ctx.save();\n ctx.globalAlpha *= artworkOpacity;\n ctx.drawImage(asset, -box.width / 2, -box.height / 2, box.width, box.height);\n ctx.restore();\n }\n\n if (progress >= 1) return;\n ctx.save();\n ctx.translate(-box.width / 2, -box.height / 2);\n ctx.scale(box.width / svg.width, box.height / svg.height);\n const alpha = ctx.globalAlpha;\n for (const path of svg.paths) {\n ctx.strokeStyle = path.stroke;\n ctx.globalAlpha = alpha * path.opacity;\n ctx.lineWidth = path.strokeWidth;\n ctx.lineCap = path.lineCap;\n ctx.lineJoin = path.lineJoin;\n ctx.setLineDash([path.length, path.length]);\n ctx.lineDashOffset = path.length * (1 - progress);\n ctx.stroke(new Path2D(path.d));\n }\n ctx.restore();\n}\n\n/**\n * Draw text element\n */\nfunction drawText(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>\n): void {\n drawShadow(ctx, props);\n\n ctx.fillStyle = (props['color'] as string) ?? '#fff';\n ctx.font = `${props['weight']} ${props['size']}px ${props['font']}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const center = props['center'] as boolean;\n const x = center\n ? canvas.width / 2 + ((props['x'] as number) ?? 0)\n : ((props['x'] as number) ?? 0);\n const y = center\n ? canvas.height / 2 + ((props['y'] as number) ?? 0)\n : ((props['y'] as number) ?? 0);\n const rotation = (props['rotation'] as number) ?? 0;\n const scale = (props['scale'] as number) ?? 1;\n const value =\n typeof props['countDecimals'] === 'number'\n ? formatCountValue(\n props['value'],\n String(props['countSeparator'] ?? ''),\n props['countDecimals']\n )\n : String(props['value'] ?? '');\n const tracking = (props['tracking'] as number) ?? 0;\n\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n applySkew(ctx, props);\n ctx.scale(scale, scale);\n drawTrackedText(ctx, value, 0, 0, tracking);\n}\n\n/**\n * Draw text with custom tracking\n */\nfunction drawTrackedText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n tracking: number\n): void {\n if (!tracking) {\n ctx.fillText(text, x, y);\n return;\n }\n\n const chars = Array.from(text);\n const widths = chars.map((char) => ctx.measureText(char).width);\n const total = widths.reduce((sum, width) => sum + width, 0) + tracking * (chars.length - 1);\n let cursor = x - total / 2;\n ctx.textAlign = 'left';\n\n for (let index = 0; index < chars.length; index += 1) {\n const char = chars[index];\n const width = widths[index];\n if (char && width !== undefined) {\n ctx.fillText(char, cursor, y);\n cursor += width + tracking;\n }\n }\n}\n\n/**\n * Draw overlay element\n */\nfunction drawOverlay(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>,\n assets: Map<string, LoadedAsset>,\n elementsById: Map<string, EvaluatedElement>\n): void {\n const parentId = String(props['parent'] ?? '');\n if (parentId) {\n drawImageOverlay(ctx, canvas, props, parentId, assets, elementsById);\n return;\n }\n\n ctx.fillStyle = (props['fill'] as string) ?? '#000';\n const progress = props['revealProgress'];\n if (typeof progress === 'number') {\n const value = Math.max(0, Math.min(1, progress));\n if (props['revealStyle'] === 'iris') {\n ctx.beginPath();\n ctx.arc(\n canvas.width / 2,\n canvas.height / 2,\n (Math.hypot(canvas.width, canvas.height) * value) / 2,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n return;\n }\n const direction = String(props['revealDirection'] ?? 'right');\n if (direction === 'left')\n ctx.fillRect(canvas.width * (1 - value), 0, canvas.width * value, canvas.height);\n else if (direction === 'up')\n ctx.fillRect(0, canvas.height * (1 - value), canvas.width, canvas.height * value);\n else if (direction === 'down') ctx.fillRect(0, 0, canvas.width, canvas.height * value);\n else ctx.fillRect(0, 0, canvas.width * value, canvas.height);\n return;\n }\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n}\n\n/**\n * Draw SVG-compatible primitives in the source image's pixel coordinate system.\n * The evaluator drives these properties, so preview and frame export share the\n * exact same timing instead of relying on browser-only SMIL/CSS animation.\n */\nfunction drawImageOverlay(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>,\n parentId: string,\n assets: Map<string, LoadedAsset>,\n elementsById: Map<string, EvaluatedElement>\n): void {\n const parent = elementsById.get(parentId);\n if (!parent || (parent.kind !== 'image' && parent.kind !== 'asset')) return;\n const parentProps = parent.render as unknown as Record<string, unknown>;\n const parentOpacity = Number(parentProps['opacity'] ?? 1);\n if (parentOpacity <= 0) return;\n const assetName = parent.assetName;\n const asset = assetName ? assets.get(assetName) : undefined;\n if (!asset) return;\n\n const box = resolveBox(canvas, asset, parentProps);\n const referenceWidth = asset.width || box.width;\n const referenceHeight = asset.height || box.height;\n const parentRotation = Number(parentProps['rotation'] ?? 0);\n const parentScale = Number(parentProps['scale'] ?? 1);\n\n ctx.save();\n ctx.globalAlpha *= parentOpacity;\n ctx.translate(box.x + box.width / 2, box.y + box.height / 2);\n ctx.rotate((parentRotation * Math.PI) / 180);\n applySkew(ctx, parentProps);\n ctx.scale(parentScale, parentScale);\n ctx.translate(-box.width / 2, -box.height / 2);\n ctx.scale(box.width / referenceWidth, box.height / referenceHeight);\n\n if (props['clip']) {\n ctx.beginPath();\n ctx.rect(0, 0, referenceWidth, referenceHeight);\n ctx.clip();\n }\n\n const x = Number(props['x'] ?? 0);\n const y = Number(props['y'] ?? 0);\n const scale = Number(props['scale'] ?? 1);\n const rotation = Number(props['rotation'] ?? 0);\n const shape = String(props['shape'] ?? 'rect');\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n applySkew(ctx, props);\n ctx.scale(scale, scale);\n drawVectorPrimitive(ctx, shape, props, referenceWidth, referenceHeight, x, y);\n ctx.restore();\n}\n\nfunction drawVectorPrimitive(\n ctx: CanvasRenderingContext2D,\n shape: string,\n props: Record<string, unknown>,\n referenceWidth: number,\n referenceHeight: number,\n originX: number,\n originY: number\n): void {\n const fill = String(props['fill'] ?? 'none');\n const stroke = String(props['stroke'] ?? 'none');\n const strokeWidth = Number(props['strokeWidth'] ?? 4);\n const width = Number(props['width'] ?? 120);\n const height = Number(props['height'] ?? 80);\n const radius = Number(props['radius'] ?? 48);\n const radiusX = Number(props['radiusX'] ?? radius);\n const radiusY = Number(props['radiusY'] ?? radius);\n const progress = Math.max(0, Math.min(1, Number(props['pathProgress'] ?? 1)));\n\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n if (fill !== 'none') ctx.fillStyle = fill;\n if (stroke !== 'none') ctx.strokeStyle = stroke;\n\n if (shape === 'text') {\n ctx.fillStyle = fill === 'none' ? String(props['color'] ?? '#fff') : fill;\n ctx.font = `${Number(props['weight'] ?? 700)} ${Number(props['size'] ?? 48)}px ${String(props['font'] ?? 'sans-serif')}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(props['value'] ?? ''), 0, 0);\n return;\n }\n\n if (shape === 'arrow' || shape === 'line') {\n drawOverlayLine(ctx, props, progress, shape === 'arrow');\n return;\n }\n\n if (shape === 'spotlight') {\n const reveal = Math.max(0, Math.min(1, Number(props['revealProgress'] ?? 1)));\n const mask = new Path2D();\n mask.rect(-originX, -originY, referenceWidth, referenceHeight);\n mask.ellipse(0, 0, radiusX * reveal, radiusY * reveal, 0, 0, Math.PI * 2);\n ctx.fillStyle = fill === 'none' ? 'rgba(0, 0, 0, 0.58)' : fill;\n ctx.fill(mask, 'evenodd');\n return;\n }\n\n const path = new Path2D();\n if (shape === 'circle') {\n path.arc(0, 0, radius, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2 * progress);\n } else if (shape === 'ellipse') {\n path.ellipse(0, 0, radiusX, radiusY, 0, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2 * progress);\n } else if (shape === 'path') {\n const d = String(props['path'] ?? '');\n if (!d) return;\n const svgPath = new Path2D(d);\n if (fill !== 'none') ctx.fill(svgPath);\n if (stroke !== 'none') ctx.stroke(svgPath);\n return;\n } else {\n path.rect(-width / 2, -height / 2, width, height);\n }\n\n if (fill !== 'none' && progress >= 1) ctx.fill(path);\n if (stroke !== 'none') ctx.stroke(path);\n}\n\nfunction drawOverlayLine(\n ctx: CanvasRenderingContext2D,\n props: Record<string, unknown>,\n progress: number,\n arrow: boolean\n): void {\n const x2 = Number(props['x2'] ?? 0);\n const y2 = Number(props['y2'] ?? 0);\n const endX = x2 * progress;\n const endY = y2 * progress;\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n if (!arrow || progress < 0.92) return;\n\n const angle = Math.atan2(y2, x2);\n const head = Math.max(10, Number(props['strokeWidth'] ?? 4) * 3.5);\n ctx.beginPath();\n ctx.moveTo(endX, endY);\n ctx.lineTo(\n endX - head * Math.cos(angle - Math.PI / 6),\n endY - head * Math.sin(angle - Math.PI / 6)\n );\n ctx.moveTo(endX, endY);\n ctx.lineTo(\n endX - head * Math.cos(angle + Math.PI / 6),\n endY - head * Math.sin(angle + Math.PI / 6)\n );\n ctx.stroke();\n}\n\nfunction applySkew(ctx: CanvasRenderingContext2D, props: Record<string, unknown>): void {\n const x = Math.tan((((props['skewX'] as number) ?? 0) * Math.PI) / 180);\n const y = Math.tan((((props['skewY'] as number) ?? 0) * Math.PI) / 180);\n if (x || y) ctx.transform(1, y, x, 1, 0, 0);\n}\n\nfunction clipReveal(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n props: Record<string, unknown>\n): void {\n const progress = props['revealProgress'];\n if (typeof progress !== 'number') return;\n const value = Math.max(0, Math.min(1, progress));\n const direction = String(props['revealDirection'] ?? 'right');\n ctx.beginPath();\n if (direction === 'left') ctx.rect(width / 2 - width * value, -height / 2, width * value, height);\n else if (direction === 'up')\n ctx.rect(-width / 2, height / 2 - height * value, width, height * value);\n else if (direction === 'down') ctx.rect(-width / 2, -height / 2, width, height * value);\n else ctx.rect(-width / 2, -height / 2, width * value, height);\n ctx.clip();\n}\n\n/**\n * Draw effect element\n */\nfunction drawEffect(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>\n): void {\n const effect = props['effect'] as string;\n\n if (effect === 'noise') {\n drawNoise(ctx, canvas, props);\n return;\n }\n\n if (effect === 'grid' || effect === 'mesh') {\n drawGrid(ctx, canvas, props);\n return;\n }\n\n if (effect === 'rippleGrid' || effect === 'ripple-grid') {\n drawRippleGrid(ctx, canvas, props);\n return;\n }\n\n if (effect === 'prism') {\n drawPrism(ctx, canvas, props);\n return;\n }\n\n drawGradientMotion(ctx, canvas, props);\n}\n\n/**\n * Draw gradient motion effect\n */\nfunction drawGradientMotion(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>\n): void {\n const offset = (props['offset'] as number) ?? 0;\n const effect = (props['effect'] as string) ?? 'gradientMotion';\n\n const x = canvas.width * (0.18 + 0.68 * offset);\n const y = canvas.height * (0.32 + 0.2 * Math.sin(offset * Math.PI * 2));\n const gradient = ctx.createRadialGradient(x, y, 0, x, y, canvas.width * 0.62);\n const palette = gradientPalette(effect);\n\n gradient.addColorStop(0, palette[0]!);\n gradient.addColorStop(0.42, palette[1]!);\n gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n}\n\n/**\n * Get gradient color palette\n */\nfunction gradientPalette(effect: string): [string, string] {\n if (effect === 'aurora') return ['rgba(124, 247, 197, 0.32)', 'rgba(138, 180, 255, 0.2)'];\n if (effect === 'codeGlow') return ['rgba(88, 101, 242, 0.3)', 'rgba(124, 247, 197, 0.14)'];\n if (effect === 'heroGlow') return ['rgba(255, 255, 255, 0.18)', 'rgba(138, 180, 255, 0.18)'];\n return ['rgba(124, 247, 197, 0.34)', 'rgba(138, 180, 255, 0.2)'];\n}\n\n/**\n * Draw grid effect\n */\nfunction drawGrid(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>\n): void {\n const offset = ((props['offset'] as number) ?? 0) * 48;\n\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.055)';\n ctx.lineWidth = 1;\n\n for (let x = -48 + offset; x < canvas.width + 48; x += 48) {\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, canvas.height);\n ctx.stroke();\n }\n\n for (let y = -48 + offset; y < canvas.height + 48; y += 48) {\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(canvas.width, y);\n ctx.stroke();\n }\n}\n\n/**\n * Draw prism-style luminous pyramid background.\n */\nfunction drawPrism(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>\n): void {\n const offset = (props['offset'] as number) ?? 0;\n const intensity = (props['intensity'] as number) ?? 1;\n const cx =\n canvas.width * (0.5 + Math.sin(offset * Math.PI * 2) * 0.08) + ((props['x'] as number) ?? 0);\n const cy =\n canvas.height * (0.54 + Math.cos(offset * Math.PI * 2) * 0.04) + ((props['y'] as number) ?? 0);\n const height = canvas.height * 0.82;\n const half = canvas.width * 0.32;\n const phase = offset * Math.PI * 2;\n\n const bg = ctx.createRadialGradient(cx, cy, 0, cx, cy, canvas.width * 0.72);\n bg.addColorStop(0, `rgba(138, 180, 255, ${0.16 * intensity})`);\n bg.addColorStop(0.42, `rgba(124, 247, 197, ${0.08 * intensity})`);\n bg.addColorStop(1, 'rgba(0, 0, 0, 0)');\n ctx.fillStyle = bg;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n ctx.save();\n ctx.translate(cx, cy);\n ctx.rotate(Math.sin(phase) * 0.12);\n\n for (let index = 0; index < 7; index += 1) {\n const t = index / 6;\n const y = -height * 0.42 + t * height * 0.82;\n const w = half * (1 - Math.abs(t - 0.5) * 1.35);\n const hue = 170 + Math.sin(phase * 1.8 + index * 0.8) * 80;\n const alpha = (0.17 - index * 0.013) * intensity;\n\n ctx.beginPath();\n ctx.moveTo(0, -height * 0.5);\n ctx.lineTo(-w, y);\n ctx.lineTo(0, height * 0.46);\n ctx.lineTo(w, y);\n ctx.closePath();\n ctx.strokeStyle = `hsla(${hue}, 92%, 72%, ${alpha})`;\n ctx.lineWidth = 3 + index * 3.5;\n ctx.stroke();\n }\n\n const core = ctx.createLinearGradient(0, -height * 0.5, 0, height * 0.5);\n core.addColorStop(0, `rgba(255, 255, 255, ${0.18 * intensity})`);\n core.addColorStop(0.45, `rgba(138, 180, 255, ${0.08 * intensity})`);\n core.addColorStop(1, 'rgba(124, 247, 197, 0)');\n ctx.fillStyle = core;\n ctx.beginPath();\n ctx.moveTo(0, -height * 0.48);\n ctx.lineTo(-half * 0.45, height * 0.28);\n ctx.lineTo(0, height * 0.48);\n ctx.lineTo(half * 0.45, height * 0.28);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\n/**\n * Draw animated ripple grid background.\n */\nfunction drawRippleGrid(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>\n): void {\n const offset = (props['offset'] as number) ?? 0;\n const intensity = (props['intensity'] as number) ?? 1;\n const spacing = (props['gridSize'] as number) ?? 56;\n const amplitude = 34 * intensity;\n const cx = canvas.width / 2;\n const cy = canvas.height / 2;\n const maxDistance = Math.hypot(cx, cy);\n\n ctx.lineWidth = (props['gridThickness'] as number) ?? 1;\n ctx.strokeStyle = (props['color'] as string) ?? 'rgba(255, 255, 255, 0.22)';\n\n for (let x = -spacing; x <= canvas.width + spacing; x += spacing) {\n ctx.beginPath();\n for (let y = 0; y <= canvas.height; y += 18) {\n const d = Math.hypot(x - cx, y - cy) / maxDistance;\n const wave = Math.sin(d * 28 - offset * Math.PI * 6) * amplitude * (1 - d);\n if (y === 0) ctx.moveTo(x + wave, y);\n else ctx.lineTo(x + wave, y);\n }\n ctx.stroke();\n }\n\n for (let y = -spacing; y <= canvas.height + spacing; y += spacing) {\n ctx.beginPath();\n for (let x = 0; x <= canvas.width; x += 18) {\n const d = Math.hypot(x - cx, y - cy) / maxDistance;\n const wave = Math.sin(d * 28 - offset * Math.PI * 6) * amplitude * (1 - d);\n if (x === 0) ctx.moveTo(x, y + wave);\n else ctx.lineTo(x, y + wave);\n }\n ctx.stroke();\n }\n\n const fade = ctx.createRadialGradient(cx, cy, canvas.width * 0.18, cx, cy, canvas.width * 0.7);\n fade.addColorStop(0, 'rgba(0, 0, 0, 0)');\n fade.addColorStop(1, 'rgba(0, 0, 0, 0.72)');\n ctx.fillStyle = fade;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n}\n\n/**\n * Draw noise effect\n */\nfunction drawNoise(\n ctx: CanvasRenderingContext2D,\n canvas: Canvas,\n props: Record<string, unknown>\n): void {\n const step = 6;\n const seed = Math.floor(((props['offset'] as number) ?? 0) * 60);\n\n ctx.fillStyle = 'rgba(255, 255, 255, 0.32)';\n\n for (let y = 0; y < canvas.height; y += step) {\n for (let x = 0; x < canvas.width; x += step) {\n if (hash(x, y, seed) > 0.92) {\n ctx.fillRect(x, y, 1, 1);\n }\n }\n }\n}\n\n/**\n * Hash function for noise generation\n */\nfunction hash(x: number, y: number, seed: number): number {\n const value = Math.sin(x * 12.9898 + y * 78.233 + seed * 37.719) * 43758.5453;\n return value - Math.floor(value);\n}\n\n/**\n * Resolve bounding box for asset\n */\nfunction resolveBox(\n canvas: Canvas,\n asset: LoadedAsset,\n props: Record<string, unknown>\n): BoundingBox {\n const assetWidth = asset.width;\n const assetHeight = asset.height;\n\n const cover = props['cover'] as boolean;\n const center = props['center'] as boolean;\n const propX = (props['x'] as number) ?? 0;\n const propY = (props['y'] as number) ?? 0;\n const propWidth = props['width'] as number | null;\n const propHeight = props['height'] as number | null;\n\n if (cover) {\n const overscan = (props['overscan'] as number) ?? 1.18;\n const scale = Math.max(canvas.width / assetWidth, canvas.height / assetHeight) * overscan;\n const width = assetWidth * scale;\n const height = assetHeight * scale;\n\n return {\n x: (canvas.width - width) / 2 + propX,\n y: (canvas.height - height) / 2 + propY,\n width,\n height,\n };\n }\n\n const width = propWidth ?? (propHeight ? assetWidth * (propHeight / assetHeight) : assetWidth);\n const height = propHeight ?? assetHeight * (width / assetWidth);\n const x = center ? (canvas.width - width) / 2 + propX : propX;\n const y = center ? (canvas.height - height) / 2 + propY : propY;\n\n return { x, y, width, height };\n}\n\n/**\n * Build CSS filter string\n */\nfunction finiteNumber(value: unknown, fallback: number): number {\n const number = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(number) ? number : fallback;\n}\n\nfunction bounded(value: unknown, fallback: number, minimum: number, maximum: number): number {\n return Math.min(maximum, Math.max(minimum, finiteNumber(value, fallback)));\n}\n\n/** Build the deterministic Canvas 2D filter string for an evaluated element. */\nexport function buildCanvasFilter(props: Record<string, unknown>): string {\n const filters: string[] = [];\n const blur = bounded(props['blur'], 0, 0, 100);\n const brightness = bounded(props['brightness'], 1, 0, 10);\n const contrast = bounded(props['contrast'], 1, 0, 10);\n const saturation = bounded(props['saturation'], 1, 0, 10);\n const hue = finiteNumber(props['hue'], 0);\n const grayscale = bounded(props['grayscale'], 0, 0, 1);\n const sepia = bounded(props['sepia'], 0, 0, 1);\n const invert = bounded(props['invert'], 0, 0, 1);\n\n if (blur !== 0) filters.push(`blur(${blur}px)`);\n if (brightness !== 1) filters.push(`brightness(${brightness})`);\n if (contrast !== 1) filters.push(`contrast(${contrast})`);\n if (saturation !== 1) filters.push(`saturate(${saturation})`);\n if (hue !== 0) filters.push(`hue-rotate(${hue}deg)`);\n if (grayscale !== 0) filters.push(`grayscale(${grayscale})`);\n if (sepia !== 0) filters.push(`sepia(${sepia})`);\n if (invert !== 0) filters.push(`invert(${invert})`);\n\n return filters.length ? filters.join(' ') : 'none';\n}\n\n/**\n * Apply shadow to context\n */\nfunction drawShadow(ctx: CanvasRenderingContext2D, props: Record<string, unknown>): void {\n const shadow = props['shadow'] as number | undefined;\n\n if (!shadow) {\n ctx.shadowBlur = 0;\n return;\n }\n\n ctx.shadowColor = 'rgba(0, 0, 0, 0.28)';\n ctx.shadowBlur = shadow;\n ctx.shadowOffsetY = shadow / 3;\n}\n","/**\n * Deterministic video and GIF export.\n *\n * MP4 frames are rendered in the browser, then encoded by the local Motionly\n * server. Keeping ffmpeg on the Node side avoids a large wasm download and\n * gives us dependable H.264/AAC support, at the cost of requiring the local\n * Vite server for MP4 export rather than a static-only deployment.\n */\n\nimport { evaluateScene } from '../animation/evaluator';\nimport { GifEncoder } from './gif-encoder';\nimport { CanvasRenderer } from '../render/canvas-renderer';\nimport { pauseVideoAssets, synchronizeVideoAssets, type LoadedAsset } from '../assets/asset-loader';\nimport type { Scene, Animation, Element, Keyframe } from '../types/scene';\nimport type { ExportFormat, ExportSupport } from '../types/export';\n\nconst EXPORT_API = '/api/exports';\nconst WEBM_TYPES = ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm'];\n\n/** Check whether this runtime has the browser primitives needed for a format. */\nexport function canExport(format: ExportFormat): boolean {\n if (format === 'gif' || format === 'mp4') return typeof document !== 'undefined';\n if (typeof MediaRecorder === 'undefined') return false;\n return Boolean(selectWebmMimeType());\n}\n\nexport function exportSupport(): ExportSupport {\n return {\n webm: canExport('webm'),\n mp4: canExport('mp4'),\n gif: canExport('gif'),\n };\n}\n\nexport async function exportVideo(options: {\n scene: Scene;\n assets: Map<string, LoadedAsset>;\n format: ExportFormat;\n height: number;\n fps: number;\n audioUrl?: string;\n onProgress?: (progress: number) => void;\n}): Promise<Blob> {\n const { scene, assets, format, height, fps, audioUrl, onProgress } = options;\n\n if (format === 'gif') {\n return exportGif({ scene, assets, height, fps, onProgress });\n }\n if (format === 'mp4') {\n return exportMp4Frames({ scene, assets, height, fps, audioUrl, onProgress });\n }\n\n return exportWebmRealtime({ scene, assets, height, fps, audioUrl, onProgress });\n}\n\nasync function exportMp4Frames(options: {\n scene: Scene;\n assets: Map<string, LoadedAsset>;\n height: number;\n fps: number;\n audioUrl?: string;\n onProgress?: (progress: number) => void;\n}): Promise<Blob> {\n const { scene, assets, height, fps, audioUrl, onProgress } = options;\n const width = Math.round((height * scene.canvas.width) / scene.canvas.height);\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const renderer = new CanvasRenderer(canvas);\n const scaledScene = scaleScene(scene, width, height);\n const totalFrames = frameCount(scaledScene.canvas.duration, fps);\n\n const job = await requestJson<{ id: string }>(EXPORT_API, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n width,\n height,\n fps,\n duration: scaledScene.canvas.duration,\n totalFrames,\n hasAudio: Boolean(audioUrl),\n audioStart: scaledScene.audioStart,\n }),\n });\n\n try {\n let uploads: Promise<void>[] = [];\n let uploadedFrames = 0;\n for (let frame = 0; frame < totalFrames; frame += 1) {\n const evaluated = evaluateScene(scaledScene, frame / fps);\n await synchronizeVideoAssets(evaluated, assets, { playing: false, exact: true });\n renderer.render(evaluated, assets);\n const image = await canvasToJpeg(canvas);\n uploads.push(\n request(`${EXPORT_API}/${job.id}/frames/${frame}`, {\n method: 'PUT',\n headers: { 'content-type': 'image/jpeg' },\n body: image,\n }).then(() => {\n uploadedFrames += 1;\n onProgress?.((uploadedFrames / totalFrames) * 0.8);\n })\n );\n if (uploads.length === 4) {\n await Promise.all(uploads);\n uploads = [];\n }\n if (frame % 4 === 0) await wait(0);\n }\n await Promise.all(uploads);\n\n if (audioUrl) {\n const audioResponse = await fetch(audioUrl);\n if (!audioResponse.ok) {\n throw new Error(`Could not load audio (${audioResponse.status})`);\n }\n await request(`${EXPORT_API}/${job.id}/audio`, {\n method: 'PUT',\n headers: {\n 'content-type': audioResponse.headers.get('content-type') ?? 'application/octet-stream',\n },\n body: await audioResponse.blob(),\n });\n }\n\n onProgress?.(0.85);\n const response = await request(`${EXPORT_API}/${job.id}/finish`, { method: 'POST' });\n const video = await response.blob();\n onProgress?.(1);\n return video;\n } catch (error) {\n await fetch(`${EXPORT_API}/${job.id}`, { method: 'DELETE' }).catch(() => undefined);\n throw error;\n }\n}\n\nasync function exportWebmRealtime(options: {\n scene: Scene;\n assets: Map<string, LoadedAsset>;\n height: number;\n fps: number;\n audioUrl?: string;\n onProgress?: (progress: number) => void;\n}): Promise<Blob> {\n const { scene, assets, height, fps, audioUrl, onProgress } = options;\n const captureFps = Math.min(fps, 30);\n const mimeType = selectWebmMimeType();\n if (!mimeType) throw new Error('WEBM export is not supported by this browser');\n\n const width = Math.round((height * scene.canvas.width) / scene.canvas.height);\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const renderer = new CanvasRenderer(canvas);\n const scaledScene = scaleScene(scene, width, height);\n const stream = canvas.captureStream(captureFps);\n const audio = audioUrl ? await attachAudio(stream, audioUrl, scaledScene.audioStart) : null;\n const recorder = new MediaRecorder(stream, {\n mimeType,\n videoBitsPerSecond: bitrateFor(height, captureFps),\n });\n const chunks: Blob[] = [];\n recorder.ondataavailable = (event: BlobEvent) => {\n if (event.data.size > 0) chunks.push(event.data);\n };\n const finished = new Promise<Blob>((resolve, reject) => {\n recorder.onstop = () => resolve(new Blob(chunks, { type: mimeType }));\n recorder.onerror = (event) =>\n reject((event as ErrorEvent).error ?? new Error('WebM recording failed'));\n });\n\n const firstFrame = evaluateScene(scaledScene, 0);\n await synchronizeVideoAssets(firstFrame, assets, { playing: false, exact: true });\n renderer.render(firstFrame, assets);\n recorder.start();\n audio?.start();\n try {\n await renderTimelineRealtime({\n renderer,\n scene: scaledScene,\n assets,\n fps: captureFps,\n onProgress,\n });\n recorder.stop();\n return await finished;\n } finally {\n if (recorder.state !== 'inactive') recorder.stop();\n audio?.stop();\n pauseVideoAssets(assets);\n stream.getTracks().forEach((track) => track.stop());\n }\n}\n\nasync function attachAudio(stream: MediaStream, url: string, start: number) {\n const context = new AudioContext();\n try {\n await context.resume();\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Could not load audio (${response.status})`);\n const source = context.createBufferSource();\n source.buffer = await context.decodeAudioData(await response.arrayBuffer());\n const destination = context.createMediaStreamDestination();\n source.connect(destination);\n const track = destination.stream.getAudioTracks()[0];\n if (!track) throw new Error('Could not prepare the audio track');\n stream.addTrack(track);\n return {\n start: () => source.start(context.currentTime + Math.max(0, start)),\n stop: () => {\n try {\n source.stop();\n } catch {\n // Already stopped.\n }\n void context.close();\n },\n };\n } catch (error) {\n await context.close();\n throw error;\n }\n}\n\nasync function exportGif(options: {\n scene: Scene;\n assets: Map<string, LoadedAsset>;\n height: number;\n fps: number;\n onProgress?: (progress: number) => void;\n}): Promise<Blob> {\n const { scene, assets, height, fps, onProgress } = options;\n const width = Math.round((height * scene.canvas.width) / scene.canvas.height);\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const renderer = new CanvasRenderer(canvas);\n const scaledScene = scaleScene(scene, width, height);\n const encoder = new GifEncoder(width, height, 1000 / fps);\n const totalFrames = frameCount(scaledScene.canvas.duration, fps);\n\n for (let frame = 0; frame < totalFrames; frame += 1) {\n const time = frame / fps;\n const evaluated = evaluateScene(scaledScene, time);\n await synchronizeVideoAssets(evaluated, assets, { playing: false, exact: true });\n renderer.render(evaluated, assets);\n const ctx = (renderer as unknown as { context: CanvasRenderingContext2D }).context;\n encoder.addFrame(ctx.getImageData(0, 0, width, height));\n onProgress?.((frame + 1) / totalFrames);\n if (frame % 4 === 0) await wait(0);\n }\n\n return encoder.finish();\n}\n\nfunction selectWebmMimeType(): string | undefined {\n if (typeof MediaRecorder === 'undefined') return undefined;\n return WEBM_TYPES.find((type) => MediaRecorder.isTypeSupported(type));\n}\n\nasync function renderTimelineRealtime(options: {\n renderer: CanvasRenderer;\n scene: Scene;\n assets: Map<string, LoadedAsset>;\n fps: number;\n onProgress?: (progress: number) => void;\n}): Promise<void> {\n const { renderer, scene, assets, fps, onProgress } = options;\n const startedAt = performance.now();\n let previousFrame = -1;\n\n while (true) {\n await nextAnimationFrame();\n const elapsed = Math.min(scene.canvas.duration, (performance.now() - startedAt) / 1000);\n const frame = Math.min(frameCount(scene.canvas.duration, fps) - 1, Math.floor(elapsed * fps));\n if (frame === previousFrame && elapsed < scene.canvas.duration) continue;\n previousFrame = frame;\n const time = Math.min(scene.canvas.duration, elapsed);\n const evaluated = evaluateScene(scene, time);\n await synchronizeVideoAssets(evaluated, assets, { playing: true });\n renderer.render(evaluated, assets);\n onProgress?.(elapsed / scene.canvas.duration);\n if (elapsed >= scene.canvas.duration) break;\n }\n await nextAnimationFrame();\n}\n\nfunction frameCount(duration: number, fps: number): number {\n return Math.max(1, Math.ceil(duration * fps));\n}\n\nfunction canvasToJpeg(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error('Could not capture an export frame'));\n },\n 'image/jpeg',\n 0.95\n );\n });\n}\n\nasync function request(url: string, init: RequestInit): Promise<Response> {\n let response: Response;\n try {\n response = await fetch(url, init);\n } catch {\n throw new Error('MP4 export requires the local Motionly server with ffmpeg installed');\n }\n if (!response.ok) {\n const message = (await response.text()).trim();\n throw new Error(message || `MP4 export failed (${response.status})`);\n }\n return response;\n}\n\nasync function requestJson<T>(url: string, init: RequestInit): Promise<T> {\n const response = await request(url, init);\n return (await response.json()) as T;\n}\n\nfunction scaleScene(scene: Scene, width: number, height: number): Scene {\n const scale = width / scene.canvas.width;\n\n return {\n ...scene,\n canvas: { ...scene.canvas, width, height },\n camera: scaleProperties(\n scene.camera as unknown as Record<string, unknown>,\n scale\n ) as unknown as typeof scene.camera,\n elements: scene.elements.map((element): Element => ({\n ...element,\n properties: scaleProperties(\n element.properties as unknown as Record<string, unknown>,\n scale\n ) as unknown as typeof element.properties,\n })),\n animations: scene.animations.map((animation): Animation => ({\n ...animation,\n from: scaleProperties(animation.from, scale),\n to: scaleProperties(animation.to, scale),\n keyframes: animation.keyframes.map((frame): Keyframe => ({\n ...frame,\n properties: scaleProperties(frame.properties, scale),\n })),\n })),\n };\n}\n\nfunction scaleProperties<T extends Record<string, unknown>>(properties: T, scale: number): T {\n const scaled = { ...properties };\n\n for (const key of ['x', 'y', 'width', 'height', 'blur', 'shadow', 'size', 'tracking']) {\n const value = scaled[key];\n if (typeof value === 'number') {\n (scaled as Record<string, unknown>)[key] = value * scale;\n }\n }\n\n return scaled;\n}\n\nfunction bitrateFor(height: number, fps: number): number {\n const base =\n height >= 2160\n ? 28_000_000\n : height >= 1440\n ? 18_000_000\n : height >= 1080\n ? 10_000_000\n : 5_000_000;\n return Math.round(base * (fps / 60));\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction nextAnimationFrame(): Promise<void> {\n return new Promise((resolve) => requestAnimationFrame(() => resolve()));\n}\n","import type { ASTNode, ProgramNode } from '../types/parser';\n\nexport function serializeProgram(program: ProgramNode): string {\n return program.body.map(serializeNode).join('\\n\\n');\n}\n\nfunction serializeNode(node: ASTNode): string {\n if (node.type === 'Canvas') return block('canvas', node.properties);\n if (node.type === 'Camera') return block('camera', node.properties);\n if (node.type === 'Audio') {\n const name = `audio \"${escapeString(node.path)}\"`;\n return Object.keys(node.properties).length ? block(name, node.properties) : name;\n }\n if (node.type === 'Clip') return block(`clip ${node.assetName}`, node.properties);\n if (node.type === 'Track') return block(`track ${node.name}`, node.properties);\n if (node.type === 'Import') return `import \"${escapeString(node.path)}\" as ${node.name}`;\n if (node.type === 'Sequence') return block(`sequence ${node.name}`, node.properties);\n if (node.type === 'Element')\n return block(\n `${node.kind === 'asset' ? '' : `${node.kind} `}${node.name}`.trim(),\n node.properties\n );\n if (node.type !== 'Animation') return '';\n\n const lines = [`animate ${node.target} {`];\n if (node.from && Object.keys(node.from).length) lines.push(indent(block('from', node.from)));\n if (node.to && Object.keys(node.to).length) lines.push(indent(block('to', node.to)));\n if (node.keyframes?.length) {\n lines.push(' keyframes {');\n for (const frame of node.keyframes) {\n const offset = Number((frame.offset * 100).toFixed(3));\n const body = frame.easing ? { ...frame.properties, ease: frame.easing } : frame.properties;\n lines.push(indent(indent(block(`${offset}%`, body))));\n }\n lines.push(' }');\n }\n if (node.delay !== undefined) lines.push(` delay ${formatDuration(node.delay)}`);\n if (node.duration !== undefined) lines.push(` duration ${formatDuration(node.duration)}`);\n if (node.easing) lines.push(` easing ${node.easing}`);\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction block(name: string, properties: Record<string, unknown>): string {\n const lines = [`${name} {`];\n for (const [key, value] of Object.entries(properties)) {\n lines.push(value === true ? ` ${key}` : ` ${key} ${formatValue(value)}`);\n }\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction indent(value: string): string {\n return value\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'number')\n return Number.isInteger(value) ? String(value) : String(Number(value.toFixed(3)));\n const text = String(value);\n return /\\s|\"/.test(text) ? `\"${escapeString(text)}\"` : text;\n}\n\nfunction formatDuration(value: unknown): string {\n return typeof value === 'number' ? `${Number(value.toFixed(3))}s` : String(value);\n}\n\nfunction escapeString(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n');\n}\n","import type { Element, ElementKind } from '../types/scene';\n\nexport interface TimelineItem {\n element: Element;\n range: { start: number; end: number };\n lane: number;\n}\n\nexport interface TimelineLane {\n kind: ElementKind;\n trackId: string;\n items: [TimelineItem, ...TimelineItem[]];\n start: number;\n end: number;\n laneCount: number;\n}\n\n/** Keep one stable layer per element unless the source explicitly assigns a shared track. */\nexport function packTimelineLanes(\n elements: Element[],\n rangeOf: (id: string) => TimelineItem['range']\n): TimelineLane[] {\n const lanes: TimelineLane[] = [];\n for (const element of elements) {\n const item = { element, range: rangeOf(element.id) };\n const authoredTrack = String(\n ((item.element.properties ?? {}) as unknown as Record<string, unknown>)['track'] ?? ''\n );\n const lane = authoredTrack\n ? lanes.find((candidate) => candidate.trackId === authoredTrack)\n : undefined;\n if (lane) {\n lane.items.push({ ...item, lane: 0 });\n lane.start = Math.min(lane.start, item.range.start);\n lane.end = Math.max(lane.end, item.range.end);\n continue;\n }\n lanes.push({\n kind: item.element.kind,\n trackId: authoredTrack || `legacy-${item.element.id}`,\n items: [{ ...item, lane: 0 }],\n start: item.range.start,\n end: item.range.end,\n laneCount: 1,\n });\n }\n\n return lanes;\n}\n\nexport interface PackedClip {\n clip: import('../types/scene').Clip;\n lane: number;\n}\n\nexport interface PackedElement {\n item: TimelineItem;\n lane: number;\n}\n\nexport interface PackedClipTrack {\n track: number | string;\n metadata: import('../types/scene').Track | null;\n clips: PackedClip[];\n elements: PackedElement[];\n laneCount: number;\n}\n\n/** Stack overlaps inside persistent role tracks, including declared empty tracks. */\nexport function packClipTrackLanes(\n clips: import('../types/scene').Clip[],\n declaredTracks: import('../types/scene').Track[] = []\n): PackedClipTrack[] {\n const tracks = new Map<number | string, import('../types/scene').Clip[]>();\n for (const track of declaredTracks) tracks.set(track.id, []);\n for (const clip of clips) tracks.set(clip.track, [...(tracks.get(clip.track) ?? []), clip]);\n\n return Array.from(tracks, ([track, trackClips]) => {\n const laneEnds: number[] = [];\n const packed = trackClips\n .map((clip, sourceOrder) => ({ clip, sourceOrder }))\n .sort((a, b) => a.clip.start - b.clip.start || a.sourceOrder - b.sourceOrder)\n .map(({ clip }) => {\n let lane = laneEnds.findIndex((end) => end <= clip.start);\n if (lane < 0) lane = laneEnds.length;\n laneEnds[lane] = clip.start + clip.duration;\n return { clip, lane };\n });\n const metadata = declaredTracks.find((candidate) => candidate.id === String(track)) ?? null;\n return {\n track,\n metadata,\n clips: packed,\n elements: [],\n laneCount: Math.max(1, laneEnds.length),\n };\n }).sort((left, right) => {\n if (!left.metadata && !right.metadata) {\n return Number(right.track) - Number(left.track);\n }\n return trackVisualOrder(left.metadata) - trackVisualOrder(right.metadata);\n });\n}\n\nexport interface CombinedTrackRows {\n clipTracks: PackedClipTrack[];\n elementLanes: TimelineLane[];\n}\n\n/** Merge authored element items into their persistent media row without dropping either item type. */\nexport function combinePersistentTrackRows(\n clipTracks: PackedClipTrack[],\n elementLanes: TimelineLane[]\n): CombinedTrackRows {\n const persistentIds = new Set(clipTracks.map((track) => String(track.track)));\n const remainingElementLanes = elementLanes.filter((lane) => !persistentIds.has(lane.trackId));\n const combined = clipTracks.map((track) => {\n const matchingElements = elementLanes\n .filter((lane) => lane.trackId === String(track.track))\n .flatMap((lane) => lane.items);\n if (matchingElements.length === 0) return track;\n\n const entries = [\n ...track.clips.map(({ clip }) => ({\n type: 'clip' as const,\n id: clip.id,\n start: clip.start,\n end: clip.start + clip.duration,\n })),\n ...matchingElements.map((item) => ({\n type: 'element' as const,\n id: item.element.id,\n start: item.range.start,\n end: item.range.end,\n })),\n ].sort((left, right) => left.start - right.start || left.end - right.end);\n const laneEnds: number[] = [];\n const assignments = new Map<string, number>();\n for (const entry of entries) {\n let lane = laneEnds.findIndex((end) => end <= entry.start);\n if (lane < 0) lane = laneEnds.length;\n laneEnds[lane] = entry.end;\n assignments.set(`${entry.type}:${entry.id}`, lane);\n }\n return {\n ...track,\n clips: track.clips.map(({ clip }) => ({\n clip,\n lane: assignments.get(`clip:${clip.id}`) ?? 0,\n })),\n elements: matchingElements.map((item) => ({\n item,\n lane: assignments.get(`element:${item.element.id}`) ?? 0,\n })),\n laneCount: Math.max(1, laneEnds.length),\n };\n });\n return { clipTracks: combined, elementLanes: remainingElementLanes };\n}\n\nfunction trackVisualOrder(track: import('../types/scene').Track | null): number {\n if (!track) return 9000;\n if (track.role === 'audio') return 1_000_000;\n return track.order;\n}\n","export interface CanvasRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type Alignment = 'left' | 'center-x' | 'right' | 'top' | 'center-y' | 'bottom';\n\nexport interface SnapGuides {\n vertical: number | null;\n horizontal: number | null;\n}\n\nexport interface SnapResult {\n rect: CanvasRect;\n guides: SnapGuides;\n}\n\nfunction axisPoints(start: number, size: number): [number, number, number] {\n return [start, start + size / 2, start + size];\n}\n\nfunction bestAxisSnap(\n moving: [number, number, number],\n targets: number[],\n threshold: number\n): { delta: number; guide: number } | null {\n let best: { delta: number; guide: number } | null = null;\n for (const source of moving) {\n for (const target of targets) {\n const delta = target - source;\n if (Math.abs(delta) > threshold) continue;\n if (!best || Math.abs(delta) < Math.abs(best.delta)) best = { delta, guide: target };\n }\n }\n return best;\n}\n\n/** Motionity-style snapping: compare each moving left/center/right and top/center/bottom. */\nexport function snapRect(\n moving: CanvasRect,\n others: CanvasRect[],\n canvas: { width: number; height: number },\n threshold: number\n): SnapResult {\n const xTargets = [0, canvas.width / 2, canvas.width];\n const yTargets = [0, canvas.height / 2, canvas.height];\n for (const rect of others) {\n xTargets.push(...axisPoints(rect.x, rect.width));\n yTargets.push(...axisPoints(rect.y, rect.height));\n }\n\n const xSnap = bestAxisSnap(axisPoints(moving.x, moving.width), xTargets, threshold);\n const ySnap = bestAxisSnap(axisPoints(moving.y, moving.height), yTargets, threshold);\n return {\n rect: {\n ...moving,\n x: moving.x + (xSnap?.delta ?? 0),\n y: moving.y + (ySnap?.delta ?? 0),\n },\n guides: {\n vertical: xSnap?.guide ?? null,\n horizontal: ySnap?.guide ?? null,\n },\n };\n}\n\n/** Align one bounds rectangle to an artboard edge or center. */\nexport function alignRect(\n rect: CanvasRect,\n canvas: { width: number; height: number },\n alignment: Alignment\n): CanvasRect {\n if (alignment === 'left') return { ...rect, x: 0 };\n if (alignment === 'center-x') return { ...rect, x: (canvas.width - rect.width) / 2 };\n if (alignment === 'right') return { ...rect, x: canvas.width - rect.width };\n if (alignment === 'top') return { ...rect, y: 0 };\n if (alignment === 'center-y') return { ...rect, y: (canvas.height - rect.height) / 2 };\n return { ...rect, y: canvas.height - rect.height };\n}\n","import type { KeyframeNode } from '../types/parser';\n\nfunction clampOffset(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction sorted(frames: KeyframeNode[]): KeyframeNode[] {\n return [...frames].sort((a, b) => a.offset - b.offset);\n}\n\nexport function seedKeyframes(\n frames: KeyframeNode[] | undefined,\n from: Record<string, unknown> = {},\n to: Record<string, unknown> = {}\n): KeyframeNode[] {\n if (frames?.length)\n return frames.map((frame) => ({ ...frame, properties: { ...frame.properties } }));\n return [\n { offset: 0, properties: { ...from } },\n { offset: 1, properties: { ...to } },\n ];\n}\n\nexport function upsertKeyframe(\n frames: KeyframeNode[],\n offset: number,\n properties: Record<string, unknown>,\n tolerance = 1e-6\n): KeyframeNode[] {\n const nextOffset = clampOffset(offset);\n const existing = frames.find((frame) => Math.abs(frame.offset - nextOffset) <= tolerance);\n if (existing) {\n return sorted(\n frames.map((frame) =>\n frame === existing\n ? { ...frame, offset: nextOffset, properties: { ...frame.properties, ...properties } }\n : { ...frame, properties: { ...frame.properties } }\n )\n );\n }\n return sorted([...frames, { offset: nextOffset, properties: { ...properties } }]);\n}\n\n/** Set the easing that governs the transition into the keyframe at `offset`. */\nexport function setKeyframeEasing(\n frames: KeyframeNode[],\n offset: number,\n easing: string,\n tolerance = 1e-6\n): KeyframeNode[] {\n return frames.map((frame) =>\n Math.abs(frame.offset - offset) <= tolerance\n ? { ...frame, properties: { ...frame.properties }, easing: easing || undefined }\n : { ...frame, properties: { ...frame.properties } }\n );\n}\n\nexport function moveKeyframe(\n frames: KeyframeNode[],\n previousOffset: number,\n nextOffset: number,\n tolerance = 1e-6\n): KeyframeNode[] {\n const index = frames.findIndex((frame) => Math.abs(frame.offset - previousOffset) <= tolerance);\n if (index < 0) return frames;\n const moved = frames.map((frame, frameIndex) =>\n frameIndex === index\n ? { ...frame, offset: clampOffset(nextOffset), properties: { ...frame.properties } }\n : { ...frame, properties: { ...frame.properties } }\n );\n return sorted(moved);\n}\n\nexport function removeKeyframe(\n frames: KeyframeNode[],\n offset: number,\n tolerance = 1e-6\n): KeyframeNode[] {\n return frames\n .filter((frame) => Math.abs(frame.offset - offset) > tolerance)\n .map((frame) => ({ ...frame, properties: { ...frame.properties } }));\n}\n","import type { Clip } from '../types/scene';\n\nexport type ClipTiming = Pick<Clip, 'start' | 'duration' | 'trimIn' | 'trimOut'>;\n\nconst DEFAULT_MINIMUM_DURATION = 1 / 60;\n\nfunction finite(value: number, fallback: number): number {\n return Number.isFinite(value) ? value : fallback;\n}\n\nfunction minimumDuration(value?: number): number {\n return Math.max(\n Number.EPSILON,\n finite(value ?? DEFAULT_MINIMUM_DURATION, DEFAULT_MINIMUM_DURATION)\n );\n}\n\nfunction normalized(clip: ClipTiming): ClipTiming {\n return {\n start: Math.max(0, finite(clip.start, 0)),\n duration: Math.max(0, finite(clip.duration, 0)),\n trimIn: Math.max(0, finite(clip.trimIn, 0)),\n trimOut: Math.max(0, finite(clip.trimOut, 0)),\n };\n}\n\n/** Move a clip on the project timeline without changing its source window. */\nexport function moveClip(\n input: ClipTiming,\n requestedStart: number,\n timelineDuration = Number.POSITIVE_INFINITY\n): ClipTiming {\n const clip = normalized(input);\n const latest = Math.max(0, finite(timelineDuration, Number.POSITIVE_INFINITY));\n const start = Math.min(latest, Math.max(0, finite(requestedStart, clip.start)));\n return { ...clip, start };\n}\n\n/**\n * Move the left timeline edge. Positive deltas consume source at the beginning;\n * negative deltas restore available trimIn. trimIn + duration remains constant.\n */\nexport function trimClipStart(\n input: ClipTiming,\n requestedStart: number,\n minimum = DEFAULT_MINIMUM_DURATION\n): ClipTiming {\n const clip = normalized(input);\n const min = Math.min(clip.duration, minimumDuration(minimum));\n const requestedDelta = finite(requestedStart, clip.start) - clip.start;\n const delta = Math.min(clip.duration - min, Math.max(-clip.trimIn, requestedDelta));\n return {\n ...clip,\n start: clip.start + delta,\n duration: clip.duration - delta,\n trimIn: clip.trimIn + delta,\n };\n}\n\n/**\n * Move the right timeline edge. Extending consumes trimOut; shortening adds it.\n * duration + trimOut remains constant.\n */\nexport function trimClipEnd(\n input: ClipTiming,\n requestedEnd: number,\n minimum = DEFAULT_MINIMUM_DURATION\n): ClipTiming {\n const clip = normalized(input);\n const min = Math.min(clip.duration, minimumDuration(minimum));\n const currentEnd = clip.start + clip.duration;\n const requestedDelta = finite(requestedEnd, currentEnd) - currentEnd;\n const delta = Math.min(clip.trimOut, Math.max(min - clip.duration, requestedDelta));\n return {\n ...clip,\n duration: clip.duration + delta,\n trimOut: clip.trimOut - delta,\n };\n}\n\n/** Split one source window into two adjacent, non-overlapping source windows. */\nexport function splitClip(\n input: ClipTiming,\n playhead: number,\n minimum = DEFAULT_MINIMUM_DURATION\n): [ClipTiming, ClipTiming] | null {\n const clip = normalized(input);\n const min = minimumDuration(minimum);\n const offset = finite(playhead, clip.start) - clip.start;\n if (offset < min || clip.duration - offset < min) return null;\n\n return [\n {\n ...clip,\n duration: offset,\n trimOut: clip.trimOut + clip.duration - offset,\n },\n {\n ...clip,\n start: clip.start + offset,\n duration: clip.duration - offset,\n trimIn: clip.trimIn + offset,\n },\n ];\n}\n","import type { Clip, ClipTransitionType } from '../types/scene';\n\nexport interface ClipTransitionBoundary {\n outgoing: Clip;\n incoming: Clip;\n at: number;\n type: ClipTransitionType | null;\n duration: number;\n}\n\nexport interface PairedClipTransition {\n type: ClipTransitionType;\n duration: number;\n outgoing: {\n transitionOut: ClipTransitionType;\n transitionOutDuration: number;\n };\n incoming: {\n transitionIn: ClipTransitionType;\n transitionInDuration: number;\n };\n}\n\nconst sameTrack = (left: Clip, right: Clip) => String(left.track) === String(right.track);\n\n/** Return same-track cuts whose clip edges touch within one frame (or a supplied tolerance). */\nexport function adjacentClipBoundaries(\n clips: Clip[],\n tolerance = 1 / 60\n): ClipTransitionBoundary[] {\n const boundaries: ClipTransitionBoundary[] = [];\n const byTrack = new Map<string, Clip[]>();\n for (const clip of clips) {\n const key = String(clip.track);\n byTrack.set(key, [...(byTrack.get(key) ?? []), clip]);\n }\n\n for (const trackClips of byTrack.values()) {\n const sorted = [...trackClips].sort(\n (left, right) => left.start - right.start || left.sourceOrder - right.sourceOrder\n );\n for (const outgoing of sorted) {\n const at = outgoing.start + outgoing.duration;\n const incoming = sorted.find(\n (candidate) => candidate.id !== outgoing.id && Math.abs(candidate.start - at) <= tolerance\n );\n if (!incoming || !sameTrack(outgoing, incoming)) continue;\n const paired =\n outgoing.transitionOut === 'crossfade' && incoming.transitionIn === 'crossfade';\n boundaries.push({\n outgoing,\n incoming,\n at,\n type: paired ? 'crossfade' : null,\n duration: paired\n ? Math.min(outgoing.transitionOutDuration, incoming.transitionInDuration)\n : 0,\n });\n }\n }\n\n return boundaries.sort(\n (left, right) =>\n Number(left.outgoing.track) - Number(right.outgoing.track) || left.at - right.at\n );\n}\n\n/** Build matching metadata for both sides of an adjacent cut. */\nexport function applyClipTransition(\n outgoing: Clip,\n incoming: Clip,\n requestedDuration: number,\n tolerance = 1 / 60\n): PairedClipTransition | null {\n const cut = outgoing.start + outgoing.duration;\n if (!sameTrack(outgoing, incoming) || Math.abs(incoming.start - cut) > tolerance) {\n return null;\n }\n const finiteDuration = Number.isFinite(requestedDuration) ? requestedDuration : 0.5;\n const maximumDuration = Math.min(outgoing.duration, incoming.duration);\n if (maximumDuration <= 0) return null;\n const duration = Math.min(\n maximumDuration,\n Math.max(Math.min(1 / 120, maximumDuration), finiteDuration)\n );\n return {\n type: 'crossfade',\n duration,\n outgoing: { transitionOut: 'crossfade', transitionOutDuration: duration },\n incoming: { transitionIn: 'crossfade', transitionInDuration: duration },\n };\n}\n\n/** Transition properties removed from each side of a paired cut. */\nexport function removedClipTransitionProperties(): {\n outgoing: readonly ['transitionOut', 'transitionOutDuration'];\n incoming: readonly ['transitionIn', 'transitionInDuration'];\n} {\n return {\n outgoing: ['transitionOut', 'transitionOutDuration'],\n incoming: ['transitionIn', 'transitionInDuration'],\n };\n}\n\n/** Extra active time needed for the outgoing side of a crossfade. */\nexport function clipTransitionTail(clip: Clip): number {\n return clip.transitionOut === 'crossfade' ? Math.max(0, clip.transitionOutDuration) : 0;\n}\n\n/** Multiplicative opacity envelope contributed by a clip transition. */\nexport function clipTransitionOpacity(clip: Clip, time: number): number {\n let opacity = 1;\n if (clip.transitionIn === 'crossfade' && clip.transitionInDuration > 0) {\n opacity *= clamp01((time - clip.start) / clip.transitionInDuration);\n }\n const end = clip.start + clip.duration;\n if (clip.transitionOut === 'crossfade' && clip.transitionOutDuration > 0 && time >= end) {\n opacity *= 1 - clamp01((time - end) / clip.transitionOutDuration);\n }\n return opacity;\n}\n\nfunction clamp01(value: number): number {\n return Math.min(1, Math.max(0, value));\n}\n","import { parseTime } from '../core/units';\nimport type { AnimationNode, ElementNode, ImportNode, ProgramNode } from '../types/parser';\n\nexport interface ElementClipWindow {\n start: number;\n end: number;\n}\n\nexport function elementClipWindow(\n properties: Record<string, unknown>,\n timelineDuration: number,\n fallback: ElementClipWindow = { start: 0, end: timelineDuration }\n): ElementClipWindow {\n if (properties['start'] === undefined || properties['duration'] === undefined) {\n return fallback;\n }\n const start = Math.max(0, parseTime(properties['start'] as string | number));\n const duration = Math.max(0, parseTime(properties['duration'] as string | number));\n return {\n start: Math.min(timelineDuration, start),\n end: Math.min(timelineDuration, start + duration),\n };\n}\n\nexport function elementWindowProperties(\n properties: Record<string, unknown>,\n start: number,\n end: number,\n minimum = 1 / 60\n): Record<string, unknown> {\n const safeStart = Math.max(0, start);\n const safeEnd = Math.max(safeStart + minimum, end);\n return {\n ...properties,\n start: `${safeStart.toFixed(3)}s`,\n duration: `${(safeEnd - safeStart).toFixed(3)}s`,\n };\n}\n\n/** Move an element window and every animation targeting it by the same timeline delta. */\nexport function moveElementClip(\n program: ProgramNode,\n elementId: string,\n start: number,\n end: number,\n previousStart: number,\n minimum = 1 / 60\n): boolean {\n const element = program.body.find(\n (node): node is ElementNode => node.type === 'Element' && node.name === elementId\n );\n if (!element) return false;\n const delta = start - previousStart;\n element.properties = elementWindowProperties(element.properties, start, end, minimum);\n for (const animation of program.body) {\n if (animation.type !== 'Animation' || animation.target !== elementId) continue;\n animation.delay = `${(parseTime(animation.delay ?? 0) + delta).toFixed(3)}s`;\n }\n return true;\n}\n\nexport interface ElementSplitResult {\n program: ProgramNode;\n leftId: string;\n rightId: string;\n}\n\n/** Split a regular element and all authored animations into adjacent visibility windows. */\nexport function splitElementClip(\n program: ProgramNode,\n elementId: string,\n splitTime: number,\n range: ElementClipWindow,\n rightId: string,\n minimum = 1 / 60\n): ElementSplitResult | null {\n if (splitTime - range.start < minimum || range.end - splitTime < minimum) return null;\n const source = program.body.find(\n (node): node is ElementNode => node.type === 'Element' && node.name === elementId\n );\n if (!source || program.body.some((node) => 'name' in node && node.name === rightId)) return null;\n\n const sourceImport = program.body.find(\n (node): node is ImportNode => node.type === 'Import' && node.name === elementId\n );\n const left: ElementNode = {\n ...source,\n properties: elementWindowProperties(source.properties, range.start, splitTime, minimum),\n };\n const right: ElementNode = {\n ...source,\n name: rightId,\n properties: elementWindowProperties(source.properties, splitTime, range.end, minimum),\n };\n const rightImport: ImportNode | null = sourceImport ? { ...sourceImport, name: rightId } : null;\n\n const body = [] as ProgramNode['body'];\n for (const node of program.body) {\n if (node === source) {\n body.push(left);\n if (rightImport) body.push(rightImport);\n body.push(right);\n continue;\n }\n body.push(node);\n if (node.type === 'Animation' && node.target === elementId) {\n body.push(cloneAnimation(node, rightId));\n }\n }\n return { program: { ...program, body }, leftId: elementId, rightId };\n}\n\nfunction cloneAnimation(animation: AnimationNode, target: string): AnimationNode {\n return {\n ...animation,\n target,\n from: animation.from ? { ...animation.from } : undefined,\n to: animation.to ? { ...animation.to } : undefined,\n keyframes: animation.keyframes?.map((frame) => ({\n ...frame,\n properties: { ...frame.properties },\n })),\n };\n}\n","export interface EditorHistory {\n past: string[];\n present: string;\n future: string[];\n}\n\nexport function createEditorHistory(source: string): EditorHistory {\n return { past: [], present: source, future: [] };\n}\n\nexport function recordEditorSource(\n history: EditorHistory,\n source: string,\n limit = 100\n): EditorHistory {\n if (source === history.present) return history;\n return {\n past: [...history.past, history.present].slice(-Math.max(1, limit)),\n present: source,\n future: [],\n };\n}\n\nexport function undoEditorSource(history: EditorHistory): EditorHistory {\n const previous = history.past.at(-1);\n if (previous === undefined) return history;\n return {\n past: history.past.slice(0, -1),\n present: previous,\n future: [history.present, ...history.future],\n };\n}\n\nexport function redoEditorSource(history: EditorHistory): EditorHistory {\n const next = history.future[0];\n if (next === undefined) return history;\n return {\n past: [...history.past, history.present],\n present: next,\n future: history.future.slice(1),\n };\n}\n","import type { Clip, Track } from '../types/scene';\nimport { moveClip, trimClipEnd, trimClipStart, type ClipTiming } from './clip-timing';\n\n/** Move a clip freely. Track metadata never changes editing behavior. */\nexport function moveClipToTrack(\n clips: Clip[],\n clipId: string,\n targetTrack: Track,\n requestedStart: number,\n timelineDuration: number\n): Clip[] | null {\n const moving = clips.find((clip) => clip.id === clipId);\n if (!moving) return null;\n const moved = { ...moving, track: targetTrack.id };\n const timing = moveClip(moved, requestedStart, timelineDuration);\n return clips.map((clip) => (clip.id === clipId ? { ...moved, ...timing } : clip));\n}\n\nexport function removeClipFromTracks(clips: Clip[], clipId: string): Clip[] {\n return clips.filter((clip) => clip.id !== clipId);\n}\n\nexport function trimClipOnTrack(\n clips: Clip[],\n clipId: string,\n edge: 'start' | 'end',\n requestedTime: number,\n minimum: number\n): Clip[] {\n return clips.map((clip) => {\n if (clip.id !== clipId) return clip;\n const timing =\n edge === 'start'\n ? trimClipStart(clip as ClipTiming, requestedTime, minimum)\n : trimClipEnd(clip as ClipTiming, requestedTime, minimum);\n return { ...clip, ...timing };\n });\n}\n","export const MIN_TIMELINE_ZOOM = 0.25;\nexport const MAX_TIMELINE_ZOOM = 8;\nexport const BASE_PIXELS_PER_SECOND = 100;\n\nexport function clampTimelineZoom(zoom: number): number {\n const finite = Number.isFinite(zoom) ? zoom : 1;\n return Math.min(MAX_TIMELINE_ZOOM, Math.max(MIN_TIMELINE_ZOOM, finite));\n}\n\nexport function timelinePixelsPerSecond(zoom: number): number {\n return BASE_PIXELS_PER_SECOND * clampTimelineZoom(zoom);\n}\n\nexport function quantizeTimelineTime(time: number, duration: number, fps: number): number {\n const safeDuration = Math.max(0, duration);\n const safeFps = Number.isFinite(fps) && fps > 0 ? fps : 60;\n const clamped = Math.max(0, Math.min(safeDuration, time));\n return Math.min(safeDuration, Math.round(clamped * safeFps) / safeFps);\n}\n\nexport function timelineContentWidth(\n duration: number,\n zoom: number,\n viewportWidth: number\n): number {\n return Math.max(\n Math.max(1, viewportWidth),\n Math.max(0, duration) * timelinePixelsPerSecond(zoom)\n );\n}\n\nexport function timelineTimeAtX(contentX: number, duration: number, contentWidth: number): number {\n if (contentWidth <= 0) return 0;\n return Math.min(Math.max(0, duration), Math.max(0, (contentX / contentWidth) * duration));\n}\n\nexport function timelineXAtTime(time: number, duration: number, contentWidth: number): number {\n if (duration <= 0) return 0;\n return (Math.min(duration, Math.max(0, time)) / duration) * contentWidth;\n}\n\n/** Preserve the time below an anchor point while changing timeline zoom. */\nexport function anchoredTimelineScroll(\n oldScrollLeft: number,\n anchorViewportX: number,\n oldContentWidth: number,\n newContentWidth: number,\n viewportWidth: number\n): number {\n const anchorContentX = oldScrollLeft + Math.max(0, anchorViewportX);\n const ratio = oldContentWidth > 0 ? anchorContentX / oldContentWidth : 0;\n const requested = ratio * newContentWidth - anchorViewportX;\n return Math.min(Math.max(0, newContentWidth - viewportWidth), Math.max(0, requested));\n}\n","import type { Asset } from '../types/scene';\n\n/**\n * AI Config is the browser-persisted \"AI knowledge\" layer that sits beside the\n * asset system. It manages a brand profile (BRAND.md) and which skills are\n * enabled. Enabled skills carry the authoring rules that used to live in a\n * per-project AGENTS.md, so the assistant is guided by skills instead.\n *\n * Storage mirrors the existing BYOK pattern: everything lives in localStorage,\n * never on a Motionly server.\n */\n\nexport const AI_BRAND_KEY = 'motionly.ai.brand.v1';\nexport const AI_SKILLS_KEY = 'motionly.ai.skills.v1';\n\nexport const MOTIONLY_PROMPT_TEMPLATE = `Read AGENTS.md, .agents/skills/write-motionly/SKILL.md, and .agents/skills/write-motionly/references/motion-syntax.md before editing.\n\nCreate or update an editable Motionly project.\n\nProject:\n- Output file: [path/to/project.motion]\n- Audience and goal: [who it is for and what it should communicate]\n- Format: [aspect ratio or canvas size]\n- Duration and FPS: [exact duration and frame rate]\n\nStory:\n[Describe the sequence of shots and the single focal subject in each shot.]\n\nAssets:\n- Folder: [path/to/assets]\n- Required assets: [files that must appear]\n- Optional assets: [files the agent may use]\n\nScript and timing:\n[Paste narration, exact on-screen copy, timestamps, or an audio path. Mark text that must remain verbatim.]\n\nBrand direction:\n[Colors, typography, visual style, motion style, and anything to avoid.]\n\nRequirements:\n- Inspect the existing project and every relevant asset before editing.\n- Probe media duration and dimensions; do not guess or stretch assets.\n- Storyboard shot purpose, time range, focal subject, entrance, hold, and exit before writing source.\n- Use only syntax and presets supported by Motionly's current parser and renderer.\n- Keep visual tracks as predictable layers; keep audio on the bottom audio track.\n- Preserve supplied copy exactly when requested and synchronize it to supplied timestamps.\n- Use restrained professional motion, deliberate exits, and one strong transition per real scene change.\n- Avoid accidental overlap, clipped text, stale layers, repeated fade-only scenes, and constant camera drift.\n- Keep all output editable in Motionly; do not replace the project with a black-box rendered video.\n- Run inspect:motion, review reported empty ranges, inspect representative frames, and verify parse/serialize/parse stability.\n\nReturn the completed .motion file and briefly report validation performed.`;\n\n/** Structured brand identity edited visually and serialized to BRAND.md. */\nexport interface BrandProfile {\n name: string;\n logo: string;\n colors: string[];\n typography: string;\n visualStyle: string[];\n motionStyle: string[];\n avoid: string[];\n /** Optional advanced override; when set it replaces generated markdown. */\n markdownOverride?: string;\n}\n\n/** A skill the assistant can be told to follow. */\nexport interface SkillInfo {\n id: string;\n name: string;\n description: string;\n /** Actionable guidance loaded into the assistant context when enabled. */\n instructions: string;\n /** Repository file that backs this skill, when one exists. */\n path?: string;\n reference?: string;\n}\n\nexport type SkillState = Record<string, boolean>;\n\nexport interface AiContextInput {\n brand: BrandProfile | null;\n skillState: SkillState;\n assets: Asset[];\n project?: {\n width: number;\n height: number;\n fps: number;\n duration: number;\n elementCount: number;\n } | null;\n}\n\nexport interface AiContextSummary {\n brandLoaded: boolean;\n enabledSkillCount: number;\n assetCount: number;\n lines: string[];\n}\n\n/**\n * Built-in skills. `write-motionly` mirrors the real `.agents/skills` entry;\n * the others carry the product rules and motion-design knowledge that used to\n * be duplicated in a per-project AGENTS.md. Enabling a skill loads its\n * instructions into the assistant context.\n */\nexport const AVAILABLE_SKILLS: SkillInfo[] = [\n {\n id: 'write-motionly',\n name: 'write-motionly',\n description:\n 'Author, retime, review, and repair Motionly .motion projects: storyboard shots, choose transitions and presets, sync visuals to narration, and validate composition.',\n instructions: `Inspect the request, current project, brand constraints, script, audio, and every relevant asset before editing. Probe media duration and dimensions instead of guessing.\nStoryboard distinct shots first. For each shot define purpose, time range, focal subject, supporting elements, entrance, readable hold, exit, and transition.\nWrite the smallest valid .motion project that realizes the storyboard. Use predictable visual layers, keep audio on the bottom audio track, preserve aspect ratios, and keep supplied copy verbatim when requested.\nSynchronize entrances and exits to supplied narration timestamps. Prefer power3.out, restrained 650ms–1s entrances, deliberate exits, and one strong transition for a real scene change.\nDo not invent syntax, presets, block types, or renderer features. Generated output must remain editable through Motionly's parser and visual controls.\nRun inspect:motion with the expected duration, review every empty-frame range, inspect representative scene/transition frames, and confirm parse/serialize/parse preserves timing, tracks, masks, and keyframes.`,\n path: '.agents/skills/write-motionly/SKILL.md',\n reference: '.agents/skills/write-motionly/references/motion-syntax.md',\n },\n {\n id: 'motion-graphics',\n name: 'motion-graphics',\n description:\n 'Motion design principles for polished, professional animation: composition, timing, easing, and restrained transitions.',\n instructions: `Build each scene around one clear focal subject; keep supporting elements subordinate and spatially separated.\nDefault to power3.out easing and entrances around 650ms–1s. Prefer subtle motion over flashy effects.\nUse staggered word reveals for important copy only, not every label.\nMark story progression with scene/background changes and purposeful movement — avoid constant camera drift and repeated fade-only scenes.\nGive every element a deliberate exit; do not leave unrelated layers stacked indefinitely.\nVary shot composition (full-frame type, editorial left/right, centered hero) rather than randomizing motion.`,\n },\n {\n id: 'motionly-rules',\n name: 'motionly-rules',\n description:\n 'Core Motionly product rules and .motion syntax: keep projects simple, visual, and valid. (Replaces per-project AGENTS.md.)',\n instructions: `Motionly is a visual motion graphics editor around .motion; .motion is the saved source format, not something users hand-write for normal work.\nUse only supported syntax and presets. Prefer properties: x, y, scale, rotation, opacity, blur, size, color, center, duration, delay, easing.\nUse size (not fontSize) and easing (not ease) in explicit animate blocks. Valid layers: background, hero, supporting, content, details, text, effects.\nImport assets as: import \"path\" as alias, and render them with alias { ... }. Never invent block types like image/asset/video/scene/group/rect/layer.\nPreserve imported asset aspect ratios (set width OR height). Avoid node graphs, plugin systems, and speculative complexity.`,\n },\n];\n\nexport function emptyBrandProfile(): BrandProfile {\n return {\n name: '',\n logo: '',\n colors: [],\n typography: '',\n visualStyle: [],\n motionStyle: [],\n avoid: [],\n };\n}\n\nfunction section(title: string, values: string[]): string {\n const items = values.map((value) => value.trim()).filter(Boolean);\n if (!items.length) return '';\n return `${title}:\\n${items.join('\\n')}\\n`;\n}\n\n/** Serialize a brand profile into BRAND.md markdown. */\nexport function generateBrandMarkdown(profile: BrandProfile): string {\n if (profile.markdownOverride && profile.markdownOverride.trim()) {\n return profile.markdownOverride.trim() + '\\n';\n }\n const blocks: string[] = ['# Brand Profile', ''];\n const name = profile.name.trim();\n if (name) blocks.push(`Brand:\\n${name}\\n`);\n if (profile.logo.trim()) blocks.push(`Logo:\\n${profile.logo.trim()}\\n`);\n const colors = section('Colors', profile.colors);\n if (colors) blocks.push(colors);\n if (profile.typography.trim()) blocks.push(`Typography:\\n${profile.typography.trim()}\\n`);\n const style = section('Style', profile.visualStyle);\n if (style) blocks.push(style);\n const motion = section('Motion', profile.motionStyle);\n if (motion) blocks.push(motion);\n const avoid = section('Avoid', profile.avoid);\n if (avoid) blocks.push(avoid);\n return (\n blocks\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trimEnd() + '\\n'\n );\n}\n\n/** True when the brand profile carries any usable identity. */\nexport function brandHasContent(profile: BrandProfile | null): boolean {\n if (!profile) return false;\n if (profile.markdownOverride && profile.markdownOverride.trim()) return true;\n return Boolean(\n profile.name.trim() ||\n profile.logo.trim() ||\n profile.typography.trim() ||\n profile.colors.length ||\n profile.visualStyle.length ||\n profile.motionStyle.length ||\n profile.avoid.length\n );\n}\n\n/** By default every known skill is enabled. */\nexport function defaultSkillState(): SkillState {\n return Object.fromEntries(AVAILABLE_SKILLS.map((skill) => [skill.id, true]));\n}\n\n/** Merge stored state with the registry so new skills default to enabled. */\nexport function resolveSkillState(stored: SkillState | null): SkillState {\n const base = defaultSkillState();\n if (!stored) return base;\n for (const skill of AVAILABLE_SKILLS) {\n const value = stored[skill.id];\n if (typeof value === 'boolean') base[skill.id] = value;\n }\n return base;\n}\n\n/** Resolve enabled skills against the known registry. */\nexport function enabledSkills(state: SkillState): SkillInfo[] {\n const resolved = resolveSkillState(state);\n return AVAILABLE_SKILLS.filter((skill) => resolved[skill.id]);\n}\n\n/**\n * Assemble the extra system-context block passed to the assistant so generated\n * `.motion` respects brand identity and the enabled skills' instructions.\n */\nexport function buildAiKnowledge(input: AiContextInput): string {\n const parts: string[] = [];\n if (brandHasContent(input.brand)) {\n parts.push(\n `Brand profile (BRAND.md):\\n${generateBrandMarkdown(input.brand as BrandProfile).trim()}`\n );\n }\n for (const skill of enabledSkills(input.skillState)) {\n parts.push(`Skill: ${skill.name}\\n${skill.description}\\n${skill.instructions.trim()}`);\n }\n if (!parts.length) return '';\n return `Additional project knowledge. Honor this brand identity and these enabled skills when generating .motion:\\n\\n${parts.join(\n '\\n\\n'\n )}`;\n}\n\n/** Summarize what the assistant currently knows, for the Context preview. */\nexport function describeAiContext(input: AiContextInput): AiContextSummary {\n const brandLoaded = brandHasContent(input.brand);\n const enabledSkillCount = enabledSkills(input.skillState).length;\n const assetCount = input.assets.length;\n const lines = [\n `${enabledSkillCount > 0 ? '✓' : '✗'} ${enabledSkillCount} skill${enabledSkillCount === 1 ? '' : 's'} enabled`,\n `${brandLoaded ? '✓' : '✗'} Brand profile ${brandLoaded ? 'loaded' : 'not set'}`,\n `${assetCount > 0 ? '✓' : '✗'} ${assetCount} asset${assetCount === 1 ? '' : 's'} available`,\n ];\n if (input.project) {\n lines.push(\n `✓ Project ${input.project.width}x${input.project.height} · ${input.project.fps}fps · ${input.project.duration.toFixed(\n 2\n )}s · ${input.project.elementCount} element${input.project.elementCount === 1 ? '' : 's'}`\n );\n }\n return { brandLoaded, enabledSkillCount, assetCount, lines };\n}\n\n/* ---------------------------------------------------------------------------\n * localStorage helpers (thin, browser-only wrappers around the pure logic).\n * ------------------------------------------------------------------------- */\n\nfunction safeGet(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSet(key: string, value: string): void {\n try {\n localStorage.setItem(key, value);\n } catch {\n /* storage unavailable; keep working in-memory */\n }\n}\n\nexport function loadBrand(): BrandProfile | null {\n const raw = safeGet(AI_BRAND_KEY);\n if (!raw) return null;\n try {\n return { ...emptyBrandProfile(), ...(JSON.parse(raw) as BrandProfile) };\n } catch {\n return null;\n }\n}\n\nexport function saveBrand(profile: BrandProfile): void {\n safeSet(AI_BRAND_KEY, JSON.stringify(profile));\n}\n\nexport function loadSkillState(): SkillState {\n const raw = safeGet(AI_SKILLS_KEY);\n if (!raw) return defaultSkillState();\n try {\n return resolveSkillState(JSON.parse(raw) as SkillState);\n } catch {\n return defaultSkillState();\n }\n}\n\nexport function saveSkillState(state: SkillState): void {\n safeSet(AI_SKILLS_KEY, JSON.stringify(state));\n}\n","<script lang=\"ts\">\n import { onMount } from 'svelte';\n import { Bot, Eye, EyeOff, PanelLeftClose, Send, Settings, Trash2 } from 'lucide-svelte';\n import {\n detectProvider,\n AI_HISTORY_KEY,\n AI_SETTINGS_KEY,\n extractMotion,\n restoreEmbeddedAssetPaths,\n requestAssistant,\n resolveChatEndpoint,\n type AiMessage,\n type AiProvider,\n type AiSettings,\n } from '../../ai/chat';\n import type { Asset } from '../../types/scene';\n import { buildAiKnowledge, loadBrand, loadSkillState, MOTIONLY_PROMPT_TEMPLATE } from '../../ai/config';\n\n export let project = '';\n export let assetList: Asset[] = [];\n export let onLoadMotion: (source: string) => string | null = () => null;\n export let onCollapse: () => void = () => undefined;\n\n let apiKey = '';\n let provider: AiProvider = 'openai';\n let baseUrl = '';\n let model = '';\n let customEnabled = false;\n let showKey = false;\n let showSettings = true;\n let messages: AiMessage[] = [];\n let draft = '';\n let sending = false;\n let error = '';\n let loadedMessageId = '';\n let invalidMessageId = '';\n let invalidMotionError = '';\n let hasSavedSettings = false;\n let promptCopied = false;\n let composerInput: HTMLTextAreaElement;\n let messageList: HTMLDivElement;\n\n $: detectedProvider = detectProvider(apiKey);\n $: isKiroKey = apiKey.trim().startsWith('ksk_');\n $: isHuggingFaceKey = apiKey.trim().startsWith('hf_');\n\n onMount(() => {\n try {\n const storedSettings = localStorage.getItem(AI_SETTINGS_KEY);\n if (storedSettings) {\n const saved = JSON.parse(storedSettings) as AiSettings;\n apiKey = saved.apiKey ?? '';\n provider = detectProvider(apiKey) ?? saved.provider ?? 'openai';\n baseUrl = saved.baseUrl ?? '';\n model = saved.model ?? '';\n customEnabled = provider === 'custom';\n showSettings = !apiKey || (saved.provider !== 'custom' && !detectProvider(apiKey));\n hasSavedSettings = Boolean(apiKey);\n if (apiKey && saved.provider !== 'custom' && !detectProvider(apiKey)) {\n error = apiKey.startsWith('ksk_')\n ? 'Kiro API keys work with Kiro CLI, not a documented browser chat endpoint.'\n : 'Choose Custom endpoint for this unrecognized key format.';\n }\n }\n const storedHistory = localStorage.getItem(AI_HISTORY_KEY);\n if (storedHistory) messages = JSON.parse(storedHistory) as AiMessage[];\n } catch {\n error = 'Saved assistant settings could not be read.';\n }\n });\n\n function handleKeyInput() {\n const detected = detectProvider(apiKey);\n if (detected) {\n if (provider !== detected) model = '';\n provider = detected;\n customEnabled = false;\n }\n }\n\n function handleProviderChange(event: Event) {\n const next = (event.currentTarget as HTMLSelectElement).value as AiProvider;\n if (provider !== next) model = '';\n provider = next;\n customEnabled = provider === 'custom';\n }\n\n function toggleCustom(event: Event) {\n customEnabled = (event.currentTarget as HTMLInputElement).checked;\n provider = customEnabled ? 'custom' : detectedProvider ?? 'openai';\n }\n\n async function copyPromptTemplate() {\n try {\n await navigator.clipboard.writeText(MOTIONLY_PROMPT_TEMPLATE);\n promptCopied = true;\n setTimeout(() => (promptCopied = false), 1800);\n } catch {\n error = 'Your browser blocked clipboard access. Open the prompt guide and copy the template there.';\n }\n }\n\n function saveSettings() {\n error = '';\n if (!apiKey.trim()) {\n error = 'Enter an API key to continue.';\n return;\n }\n if (!detectedProvider && provider !== 'custom') {\n error = isKiroKey\n ? 'Kiro API keys work with Kiro CLI. Use a supported provider key or configure a compatible gateway under Custom endpoint.'\n : 'Choose Custom endpoint and enter a compatible Base URL for this key format.';\n return;\n }\n if (provider === 'custom') {\n if (!baseUrl.trim()) {\n error = 'Enter the custom endpoint base URL.';\n return;\n }\n try {\n resolveChatEndpoint(baseUrl);\n } catch (cause) {\n error = cause instanceof Error ? cause.message : 'Enter a valid base URL.';\n return;\n }\n }\n localStorage.setItem(AI_SETTINGS_KEY, JSON.stringify(currentSettings()));\n hasSavedSettings = true;\n showSettings = false;\n }\n\n function removeKey() {\n localStorage.removeItem(AI_SETTINGS_KEY);\n apiKey = '';\n baseUrl = '';\n model = '';\n provider = 'openai';\n customEnabled = false;\n hasSavedSettings = false;\n showSettings = true;\n error = '';\n }\n\n function clearHistory() {\n messages = [];\n loadedMessageId = '';\n localStorage.removeItem(AI_HISTORY_KEY);\n }\n\n function currentSettings(): AiSettings {\n return { apiKey: apiKey.trim(), provider, baseUrl: baseUrl.trim(), model: model.trim() };\n }\n\n async function sendMessage() {\n const content = draft.trim();\n if (!content || sending) return;\n error = '';\n const userMessage: AiMessage = { id: crypto.randomUUID(), role: 'user', content };\n messages = [...messages, userMessage];\n draft = '';\n resizeComposer();\n scrollToLatest();\n persistHistory();\n sending = true;\n try {\n const knowledge = buildAiKnowledge({\n brand: loadBrand(),\n skillState: loadSkillState(),\n assets: assetList,\n });\n const response = await requestAssistant(currentSettings(), messages, project, assetList, knowledge);\n messages = [...messages, {\n id: crypto.randomUUID(),\n role: 'assistant',\n content: response,\n motion: extractMotion(response),\n }];\n scrollToLatest();\n persistHistory();\n } catch (cause) {\n error = cause instanceof Error ? cause.message : 'The assistant request failed.';\n } finally {\n sending = false;\n }\n }\n\n function resizeComposer() {\n requestAnimationFrame(() => {\n if (!composerInput) return;\n composerInput.style.height = 'auto';\n const height = Math.min(120, Math.max(38, composerInput.scrollHeight));\n composerInput.style.height = `${height}px`;\n composerInput.style.overflowY = composerInput.scrollHeight > 120 ? 'auto' : 'hidden';\n });\n }\n\n function scrollToLatest() {\n requestAnimationFrame(() => {\n if (messageList) messageList.scrollTop = messageList.scrollHeight;\n });\n }\n\n function handleComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n void sendMessage();\n }\n }\n\n function loadMotion(message: AiMessage) {\n if (!message.motion) return;\n const issue = onLoadMotion(restoreEmbeddedAssetPaths(message.motion, assetList));\n error = issue ?? '';\n invalidMessageId = issue ? message.id : '';\n invalidMotionError = issue ?? '';\n if (!issue) loadedMessageId = message.id;\n }\n\n function repairMotion() {\n draft = `Repair your last generated .motion project. Motionly's parser reported: ${invalidMotionError}. Return the corrected complete project using only the system prompt syntax.`;\n invalidMessageId = '';\n void sendMessage();\n }\n\n function persistHistory() {\n localStorage.setItem(AI_HISTORY_KEY, JSON.stringify(messages));\n }\n\n function explanation(content: string): string {\n return content.replace(/```motion\\s*[\\s\\S]*?```/gi, '').trim();\n }\n</script>\n\n<section class=\"ai-chat-panel\" aria-label=\"Motionly Assistant\">\n <header class=\"chat-header\">\n <div class=\"chat-title\"><Bot size={16} /><span>Motionly Assistant</span></div>\n <div class=\"header-actions\">\n {#if messages.length && !showSettings}\n <button type=\"button\" class=\"icon-button\" on:click={clearHistory} title=\"Clear chat\"><Trash2 size={14} /></button>\n {/if}\n <button type=\"button\" class=\"icon-button\" class:active={showSettings} on:click={() => showSettings = !showSettings} title=\"Assistant settings\"><Settings size={15} /></button>\n <button type=\"button\" class=\"icon-button\" on:click={onCollapse} title=\"Collapse assistant\"><PanelLeftClose size={15} /></button>\n </div>\n </header>\n\n {#if showSettings}\n <div class=\"settings-view\">\n <div>\n <h3>Connect AI to Motionly</h3>\n <p>Motionly does not host or proxy AI requests. Your key lets this browser contact your provider directly and turn prompts into editable <code>.motion</code> projects. Any usage is billed by your provider.</p>\n </div>\n\n <div class=\"field\">\n <label for=\"motionly-ai-key\">API key</label>\n <div class=\"key-input\">\n <input id=\"motionly-ai-key\" type={showKey ? 'text' : 'password'} bind:value={apiKey} on:input={handleKeyInput} placeholder=\"Paste API key\" autocomplete=\"off\" />\n <button type=\"button\" on:click={() => showKey = !showKey} title={showKey ? 'Hide key' : 'Show key'}>\n {#if showKey}<EyeOff size={15} />{:else}<Eye size={15} />{/if}\n </button>\n </div>\n </div>\n\n {#if apiKey.trim()}\n {#if detectedProvider || customEnabled}\n <select class=\"provider-chip\" value={provider} on:change={handleProviderChange} aria-label=\"AI provider\">\n <option value=\"openai\">Detected: OpenAI</option>\n <option value=\"anthropic\">Detected: Anthropic</option>\n <option value=\"openrouter\">Detected: OpenRouter</option>\n <option value=\"gemini\">Detected: Google Gemini</option>\n <option value=\"huggingface\">Detected: Hugging Face</option>\n <option value=\"custom\">Custom endpoint</option>\n </select>\n {:else}\n <label class=\"custom-toggle\">\n <input type=\"checkbox\" checked={customEnabled} on:change={toggleCustom} />\n <span>Custom endpoint</span>\n </label>\n {/if}\n {/if}\n\n {#if isKiroKey}\n <p class=\"provider-warning\">\n Detected: Kiro CLI key. Kiro does not document a direct browser/OpenAI-compatible chat endpoint, so this key cannot be sent directly. Use another provider key, or enable Custom endpoint if you have a compatible gateway.\n </p>\n {/if}\n\n {#if isHuggingFaceKey}\n <p class=\"provider-note\">Hugging Face tokens need “Make calls to Inference Providers” permission. Enter any compatible chat model ID below.</p>\n {/if}\n\n {#if customEnabled}\n <div class=\"field\">\n <label for=\"motionly-ai-url\">Base URL</label>\n <input id=\"motionly-ai-url\" bind:value={baseUrl} placeholder=\"http://localhost:11434/v1\" />\n </div>\n {/if}\n\n {#if apiKey.trim() && (detectedProvider || customEnabled)}\n <div class=\"field\">\n <label for=\"motionly-ai-model\">Model <span>(optional)</span></label>\n <input id=\"motionly-ai-model\" bind:value={model} placeholder=\"Exact model ID\" />\n <small>Leave blank to use Motionly's provider default.</small>\n </div>\n {/if}\n\n <p class=\"privacy-note\">Your key is stored locally in your browser and never sent to our servers.</p>\n <p class=\"guide-note\">\n See the <a href=\"https://motionly.mintlify.app/agents/ai-authoring\" target=\"_blank\" rel=\"noreferrer\">prompt guide</a>\n for templates and an introduction to the <code>write-motionly</code> skill.\n </p>\n <button type=\"button\" class=\"copy-prompt-button\" on:click={copyPromptTemplate}>\n {promptCopied ? 'Prompt Template Copied' : 'Copy Prompt Template'}\n </button>\n {#if error}<p class=\"error-message\">{error}</p>{/if}\n <div class=\"settings-actions\">\n {#if hasSavedSettings}\n <button type=\"button\" class=\"secondary-button danger\" on:click={removeKey}>Remove key</button>\n {/if}\n <button type=\"button\" class=\"primary-button\" on:click={saveSettings}>Save & continue</button>\n </div>\n </div>\n {:else}\n <div bind:this={messageList} class=\"message-list\" aria-live=\"polite\">\n {#if messages.length === 0}\n <div class=\"empty-state\">\n <strong>What are we making today?</strong>\n <span>\n See the <a href=\"https://motionly.mintlify.app/agents/ai-authoring\" target=\"_blank\" rel=\"noreferrer\">prompt guide</a>\n for templates and an introduction to the <code>write-motionly</code> skill.\n </span>\n <button type=\"button\" class=\"copy-prompt-button\" on:click={copyPromptTemplate}>\n {promptCopied ? 'Prompt Template Copied' : 'Copy Prompt Template'}\n </button>\n </div>\n {:else}\n {#each messages as message (message.id)}\n <article class=\"message\" class:user={message.role === 'user'}>\n <div class=\"message-role\">{message.role === 'user' ? 'You' : 'Assistant'}</div>\n {#if explanation(message.content)}<p>{explanation(message.content)}</p>{/if}\n {#if message.motion}\n <pre><code>{message.motion}</code></pre>\n <button type=\"button\" class=\"load-button\" on:click={() => loadMotion(message)}>\n {loadedMessageId === message.id ? 'Loaded' : 'Load into Editor'}\n </button>\n {#if invalidMessageId === message.id}\n <button type=\"button\" class=\"repair-button\" on:click={repairMotion}>Ask Assistant to Fix</button>\n {/if}\n {/if}\n </article>\n {/each}\n {#if sending}<div class=\"thinking\">Drafting your project…</div>{/if}\n {/if}\n </div>\n\n <div class=\"composer-wrap\">\n {#if error}<p class=\"error-message\">{error}</p>{/if}\n <div class=\"composer\">\n <textarea bind:this={composerInput} rows=\"1\" bind:value={draft} on:input={resizeComposer} on:keydown={handleComposerKeydown} placeholder=\"Describe the animation you want...\" aria-label=\"Message Motionly Assistant\"></textarea>\n <button type=\"button\" on:click={sendMessage} disabled={!draft.trim() || sending} title=\"Send message\"><Send size={15} /></button>\n </div>\n </div>\n {/if}\n</section>\n\n<style>\n .ai-chat-panel { height: 100%; min-height: 0; display: flex; flex-direction: column; background: #111214; color: #e4e6ea; }\n .chat-header { min-height: 57px; padding: 0 14px 0 16px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #1c1d20; background: #0d0e10; }\n .chat-title, .header-actions { display: flex; align-items: center; gap: 8px; }\n .chat-title { font-size: 13px; font-weight: 600; }\n .chat-title :global(svg) { color: #7cf7c5; }\n button { font: inherit; }\n .icon-button { width: 28px; height: 28px; padding: 0; display: grid; place-items: center; border: 1px solid #2a2d33; border-radius: 6px; color: #8e939b; background: #17191c; cursor: pointer; }\n .icon-button:hover, .icon-button.active { color: #7cf7c5; border-color: #355e4f; }\n .settings-view { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; scrollbar-width: thin; scrollbar-color: #34383e transparent; padding: 20px 16px; display: flex; flex-direction: column; gap: 16px; }\n h3 { margin: 0 0 6px; font-size: 14px; }\n .settings-view > div > p { margin: 0; color: #8e939b; font-size: 12px; line-height: 1.5; }\n .settings-view > div > p code { color: #a9b0b9; font-size: 11px; }\n .field { display: flex; flex-direction: column; gap: 7px; }\n .field label { color: #b6bac1; font-size: 11px; font-weight: 600; }\n .field label span { color: #6b7280; font-weight: 400; }\n .field small { color: #6b7280; font-size: 10px; line-height: 1.35; }\n input, select, textarea { box-sizing: border-box; width: 100%; border: 1px solid #2a2d33; border-radius: 7px; outline: none; background: #17191c; color: #e4e6ea; }\n input { height: 36px; padding: 0 10px; font-size: 12px; }\n input:focus, select:focus, textarea:focus { border-color: #437263; }\n .key-input { position: relative; }\n .key-input input { padding-right: 38px; }\n .key-input button { position: absolute; top: 4px; right: 4px; width: 28px; height: 28px; display: grid; place-items: center; padding: 0; border: 0; background: transparent; color: #8e939b; cursor: pointer; }\n .provider-chip { width: auto; height: 28px; padding: 0 26px 0 9px; border-color: #355e4f; border-radius: 999px; color: #9af8d1; font-size: 11px; }\n .custom-toggle { display: flex; align-items: center; gap: 8px; color: #b6bac1; font-size: 12px; }\n .custom-toggle input { width: 14px; height: 14px; accent-color: #7cf7c5; }\n .privacy-note { margin: 0; color: #777d86; font-size: 11px; line-height: 1.45; }\n .provider-warning { margin: 0; padding: 9px; border: 1px solid #55452b; border-radius: 6px; background: #241f17; color: #d9bd85; font-size: 11px; line-height: 1.45; }\n .provider-note { margin: 0; padding: 9px; border: 1px solid #29483d; border-radius: 6px; background: #17231f; color: #9bcbb9; font-size: 11px; line-height: 1.45; }\n .guide-note { margin: 0; color: #777d86; font-size: 11px; line-height: 1.45; }\n .guide-note a { color: #7cf7c5; text-decoration: none; }\n .guide-note a:hover { text-decoration: underline; }\n .guide-note code { color: #a9b0b9; font-size: 10px; }\n .copy-prompt-button { align-self: flex-start; padding: 7px 10px; border: 1px solid #355e4f; border-radius: 6px; background: #17231f; color: #9af8d1; cursor: pointer; font-size: 11px; font-weight: 600; }\n .copy-prompt-button:hover { border-color: #4d8c75; background: #1a3028; }\n .empty-state .copy-prompt-button { align-self: center; }\n .error-message { margin: 0; color: #f09b9b; font-size: 11px; line-height: 1.4; }\n .settings-actions { margin-top: auto; display: flex; justify-content: flex-end; gap: 8px; }\n .primary-button, .secondary-button, .load-button, .repair-button { padding: 7px 10px; border-radius: 6px; cursor: pointer; font-size: 11px; font-weight: 600; }\n .primary-button, .load-button { border: 1px solid #4d8c75; background: #1a3b30; color: #9af8d1; }\n .secondary-button { border: 1px solid #2a2d33; background: #17191c; color: #a5aab2; }\n .repair-button { margin-left: 6px; border: 1px solid #59472c; background: #251f17; color: #d9bd85; }\n .secondary-button.danger { margin-right: auto; color: #dc9494; }\n .message-list { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; scrollbar-width: none; padding: 16px; display: flex; flex-direction: column; gap: 12px; }\n .message-list::-webkit-scrollbar { display: none; width: 0; height: 0; }\n .settings-view::-webkit-scrollbar, .message-list::-webkit-scrollbar, textarea::-webkit-scrollbar { width: 6px; height: 6px; }\n .settings-view::-webkit-scrollbar-track, .message-list::-webkit-scrollbar-track, textarea::-webkit-scrollbar-track { background: transparent; }\n .settings-view::-webkit-scrollbar-thumb, .message-list::-webkit-scrollbar-thumb, textarea::-webkit-scrollbar-thumb { border-radius: 999px; background: #34383e; }\n .settings-view::-webkit-scrollbar-thumb:hover, .message-list::-webkit-scrollbar-thumb:hover, textarea::-webkit-scrollbar-thumb:hover { background: #484d55; }\n .empty-state { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; color: #6f747c; font-size: 11px; line-height: 1.5; text-align: center; }\n .empty-state strong { color: #8e939b; font-size: 12px; font-weight: 500; }\n .empty-state span { max-width: 230px; }\n .empty-state a { color: #7cf7c5; text-decoration: none; }\n .empty-state a:hover { text-decoration: underline; }\n .empty-state code { color: #a9b0b9; font-size: 10px; }\n .message { align-self: stretch; padding: 11px; border: 1px solid #24262a; border-radius: 9px; background: #151619; }\n .message.user { align-self: flex-end; max-width: 86%; background: #19221f; border-color: #293d36; }\n .message-role { margin-bottom: 6px; color: #7cf7c5; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; }\n .message.user .message-role { color: #9ca3af; }\n .message p { margin: 0; color: #c8cbd0; font-size: 12px; line-height: 1.5; white-space: pre-wrap; }\n pre { margin: 9px 0; padding: 10px; overflow: visible; border: 1px solid #25282d; border-radius: 6px; background: #0d0e10; color: #b9e8d7; font: 10px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; }\n .thinking { color: #777d86; font-size: 11px; }\n .composer-wrap { padding: 10px 12px 12px; border-top: 1px solid #1c1d20; background: #0d0e10; }\n .composer-wrap .error-message { margin-bottom: 8px; }\n .composer { display: flex; align-items: flex-end; gap: 7px; padding: 7px; border: 1px solid #2a2d33; border-radius: 10px; background: #17191c; }\n textarea { min-height: 38px; max-height: 120px; padding: 4px; resize: none; overflow-y: hidden; scrollbar-width: thin; scrollbar-color: #34383e transparent; border: 0; background: transparent; font-size: 12px; line-height: 1.4; }\n .composer button { flex: 0 0 auto; width: 30px; height: 30px; display: grid; place-items: center; padding: 0; border: 0; border-radius: 50%; background: transparent; color: #9af8d1; cursor: pointer; transition: color .15s ease, background .15s ease, transform .15s ease; }\n .composer button:hover:not(:disabled) { background: rgba(124, 247, 197, .1); color: #c4ffe7; transform: translateY(-1px); }\n .composer button:focus-visible { outline: 2px solid #437263; outline-offset: 1px; }\n .composer button:disabled { border: 0; background: transparent; color: #4c5158; cursor: default; }\n</style>\n","<script lang=\"ts\">\n import { Sparkles, Eye, BookOpen } from 'lucide-svelte';\n import type { Asset } from '../../types/scene';\n import {\n AVAILABLE_SKILLS,\n describeAiContext,\n loadBrand,\n loadSkillState,\n saveSkillState,\n type SkillState,\n } from '../../ai/config';\n\n export let assetList: Asset[] = [];\n export let projectInfo: {\n width: number;\n height: number;\n fps: number;\n duration: number;\n elementCount: number;\n } | null = null;\n\n type ConfigView = 'skills' | 'context';\n let view: ConfigView = 'skills';\n\n let skillState: SkillState = loadSkillState();\n let openSkillId = '';\n\n // Brand lives under Settings; the AI context preview still reflects it.\n $: contextSummary = describeAiContext({\n brand: loadBrand(),\n skillState,\n assets: assetList,\n project: projectInfo,\n });\n\n function toggleSkill(id: string) {\n skillState = { ...skillState, [id]: !skillState[id] };\n saveSkillState(skillState);\n }\n</script>\n\n<div class=\"ai-config\">\n <nav class=\"config-nav\" aria-label=\"AI configuration sections\">\n <button type=\"button\" class:active={view === 'skills'} on:click={() => (view = 'skills')}>\n <Sparkles size={14} /> Skills\n </button>\n <button type=\"button\" class:active={view === 'context'} on:click={() => (view = 'context')}>\n <Eye size={14} /> Context\n </button>\n </nav>\n\n <div class=\"config-body\">\n {#if view === 'skills'}\n <div class=\"config-section\">\n <h4 class=\"config-title\">Skills</h4>\n <p class=\"config-desc\">Enable the skills the assistant should follow. Enabled skills load their instructions into the assistant, replacing per-project AGENTS.md.</p>\n {#each AVAILABLE_SKILLS as skill}\n <div class=\"skill-row\">\n <div class=\"skill-main\">\n <label class=\"skill-toggle\">\n <input type=\"checkbox\" checked={skillState[skill.id]} on:change={() => toggleSkill(skill.id)} />\n <span class=\"skill-name\">{skill.name}</span>\n </label>\n <button type=\"button\" class=\"config-link\" on:click={() => (openSkillId = openSkillId === skill.id ? '' : skill.id)}>\n <BookOpen size={13} /> {openSkillId === skill.id ? 'Hide' : 'Open instructions'}\n </button>\n </div>\n <p class=\"skill-desc\">{skill.description}</p>\n {#if openSkillId === skill.id}\n <div class=\"skill-detail\">\n <pre>{skill.instructions}</pre>\n {#if skill.path}<div><strong>File:</strong> <code>{skill.path}</code></div>{/if}\n {#if skill.reference}<div><strong>Reference:</strong> <code>{skill.reference}</code></div>{/if}\n </div>\n {/if}\n </div>\n {/each}\n </div>\n {:else if view === 'context'}\n <div class=\"config-section\">\n <h4 class=\"config-title\">AI Context Preview</h4>\n <p class=\"config-desc\">What the assistant currently knows about this project.</p>\n <div class=\"context-card\">\n <div class=\"context-heading\">AI knows:</div>\n {#each contextSummary.lines as line}\n <div class=\"context-line\" class:ok={line.startsWith('✓')} class:missing={line.startsWith('✗')}>{line}</div>\n {/each}\n </div>\n </div>\n {/if}\n </div>\n</div>\n\n<style>\n .ai-config { display: flex; flex-direction: column; flex: 1; min-height: 0; }\n .config-nav {\n display: flex;\n gap: 2px;\n padding: 8px 10px 0;\n border-bottom: 1px solid #1d1f22;\n flex-wrap: wrap;\n }\n .config-nav button {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 7px 10px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: #8e939b;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n }\n .config-nav button.active { color: #f1f2f4; border-bottom-color: #7cf7c5; }\n .config-nav button:hover { color: #dce1e6; }\n\n .config-body { flex: 1; min-height: 0; overflow-y: auto; padding: 14px; }\n .config-section { display: flex; flex-direction: column; gap: 12px; }\n .config-title { margin: 0; font-size: 13px; font-weight: 700; color: #f1f2f4; }\n .config-desc { margin: 0; font-size: 11px; line-height: 1.5; color: #8e939b; }\n\n .config-link {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n align-self: flex-start;\n padding: 0;\n border: 0;\n background: transparent;\n color: #7cf7c5;\n font-size: 11px;\n cursor: pointer;\n }\n .config-link:hover { text-decoration: underline; }\n\n .skill-row { display: flex; flex-direction: column; gap: 6px; padding: 10px 0; border-bottom: 1px solid #1a1c1f; }\n .skill-main { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n .skill-toggle { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }\n .skill-name { font-size: 12px; font-weight: 600; color: #f1f2f4; }\n .skill-desc { margin: 0; font-size: 11px; line-height: 1.5; color: #8e939b; }\n .skill-detail { display: flex; flex-direction: column; gap: 6px; font-size: 11px; color: #b8bec6; }\n .skill-detail code { color: #7cf7c5; word-break: break-all; }\n .skill-detail pre {\n margin: 0;\n padding: 10px;\n border: 1px solid #2c3138;\n border-radius: 6px;\n background: #0d0e10;\n color: #b8bec6;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10.5px;\n line-height: 1.5;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .context-card {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 14px;\n border: 1px solid #2c3138;\n border-radius: 8px;\n background: #0d0e10;\n }\n .context-heading { font-size: 12px; font-weight: 700; color: #f1f2f4; margin-bottom: 2px; }\n .context-line { font-size: 12px; color: #b8bec6; }\n .context-line.ok { color: #b8ffe4; }\n .context-line.missing { color: #f0b26d; }\n</style>\n","<script lang=\"ts\">\n import { Plus, X, FileCode } from 'lucide-svelte';\n import type { Asset } from '../../types/scene';\n import {\n emptyBrandProfile,\n generateBrandMarkdown,\n loadBrand,\n saveBrand,\n type BrandProfile,\n } from '../../ai/config';\n\n export let assetList: Asset[] = [];\n\n let brand: BrandProfile = loadBrand() ?? emptyBrandProfile();\n let brandMarkdownMode = false;\n let brandSaved = false;\n let styleDraft = '';\n let motionDraft = '';\n let avoidDraft = '';\n let colorDraft = '#4F8CFF';\n\n $: brandMarkdown = generateBrandMarkdown(brand);\n\n function persistBrand() {\n brand = { ...brand };\n saveBrand(brand);\n brandSaved = true;\n setTimeout(() => (brandSaved = false), 1600);\n }\n\n function addColor() {\n const value = colorDraft.trim();\n if (!value || brand.colors.includes(value)) return;\n brand.colors = [...brand.colors, value];\n persistBrand();\n }\n\n function removeColor(color: string) {\n brand.colors = brand.colors.filter((item) => item !== color);\n persistBrand();\n }\n\n function addTag(list: 'visualStyle' | 'motionStyle' | 'avoid', value: string) {\n const tag = value.trim();\n if (!tag || brand[list].includes(tag)) return;\n brand[list] = [...brand[list], tag];\n persistBrand();\n }\n\n function removeTag(list: 'visualStyle' | 'motionStyle' | 'avoid', tag: string) {\n brand[list] = brand[list].filter((item) => item !== tag);\n persistBrand();\n }\n\n function handleTagKey(\n event: KeyboardEvent,\n list: 'visualStyle' | 'motionStyle' | 'avoid',\n reset: () => void\n ) {\n if (event.key !== 'Enter') return;\n event.preventDefault();\n addTag(list, (event.currentTarget as HTMLInputElement).value);\n reset();\n }\n\n function toggleMarkdownMode() {\n if (!brandMarkdownMode) {\n brand.markdownOverride = generateBrandMarkdown({ ...brand, markdownOverride: '' });\n }\n brandMarkdownMode = !brandMarkdownMode;\n persistBrand();\n }\n\n function clearMarkdownOverride() {\n brand.markdownOverride = '';\n brandMarkdownMode = false;\n persistBrand();\n }\n</script>\n\n<div class=\"panel-content\">\n <div class=\"config-section\">\n <div class=\"config-title-row\">\n <h4 class=\"config-title\">Brand Profile</h4>\n <button type=\"button\" class=\"config-link\" on:click={toggleMarkdownMode}>\n <FileCode size={13} /> {brandMarkdownMode ? 'Visual editor' : 'Edit Markdown'}\n </button>\n </div>\n <p class=\"config-desc\">Define brand identity for AI-generated animations. Saved as BRAND.md and loaded into the assistant context.</p>\n\n {#if brandMarkdownMode}\n <textarea class=\"config-textarea\" rows=\"16\" bind:value={brand.markdownOverride} on:input={persistBrand} spellcheck=\"false\"></textarea>\n <button type=\"button\" class=\"config-link danger\" on:click={clearMarkdownOverride}>Discard override & return to visual editor</button>\n {:else}\n <label class=\"field\">\n <span class=\"field-label\">Brand name</span>\n <input class=\"config-input\" type=\"text\" bind:value={brand.name} on:input={persistBrand} placeholder=\"Motionly\" />\n </label>\n\n <label class=\"field\">\n <span class=\"field-label\">Logo</span>\n <select class=\"config-input\" bind:value={brand.logo} on:change={persistBrand}>\n <option value=\"\">None</option>\n {#each assetList as asset}\n <option value={asset.name}>{asset.name} ({asset.type})</option>\n {/each}\n </select>\n </label>\n\n <div class=\"field\">\n <span class=\"field-label\">Brand colors</span>\n <div class=\"chip-row\">\n {#each brand.colors as color}\n <span class=\"chip color-chip\">\n <span class=\"swatch\" style={`background:${color}`}></span>{color}\n <button type=\"button\" on:click={() => removeColor(color)} aria-label={`Remove ${color}`}><X size={11} /></button>\n </span>\n {/each}\n </div>\n <div class=\"inline-add\">\n <input class=\"color-input\" type=\"color\" bind:value={colorDraft} aria-label=\"Pick brand color\" />\n <input class=\"config-input\" type=\"text\" bind:value={colorDraft} placeholder=\"#4F8CFF\" />\n <button type=\"button\" class=\"config-btn\" on:click={addColor}><Plus size={13} /></button>\n </div>\n </div>\n\n <label class=\"field\">\n <span class=\"field-label\">Typography</span>\n <input class=\"config-input\" type=\"text\" bind:value={brand.typography} on:input={persistBrand} placeholder=\"Inter, Geist, system-ui\" />\n </label>\n\n <div class=\"field\">\n <span class=\"field-label\">Visual style</span>\n <div class=\"chip-row\">\n {#each brand.visualStyle as tag}\n <span class=\"chip\">{tag}<button type=\"button\" on:click={() => removeTag('visualStyle', tag)} aria-label={`Remove ${tag}`}><X size={11} /></button></span>\n {/each}\n </div>\n <input class=\"config-input\" type=\"text\" bind:value={styleDraft} on:keydown={(e) => handleTagKey(e, 'visualStyle', () => (styleDraft = ''))} placeholder=\"Minimal, Premium, Modern — press Enter\" />\n </div>\n\n <div class=\"field\">\n <span class=\"field-label\">Motion style</span>\n <div class=\"chip-row\">\n {#each brand.motionStyle as tag}\n <span class=\"chip\">{tag}<button type=\"button\" on:click={() => removeTag('motionStyle', tag)} aria-label={`Remove ${tag}`}><X size={11} /></button></span>\n {/each}\n </div>\n <input class=\"config-input\" type=\"text\" bind:value={motionDraft} on:keydown={(e) => handleTagKey(e, 'motionStyle', () => (motionDraft = ''))} placeholder=\"Smooth, Cinematic — press Enter\" />\n </div>\n\n <div class=\"field\">\n <span class=\"field-label\">Things to avoid</span>\n <div class=\"chip-row\">\n {#each brand.avoid as tag}\n <span class=\"chip avoid-chip\">{tag}<button type=\"button\" on:click={() => removeTag('avoid', tag)} aria-label={`Remove ${tag}`}><X size={11} /></button></span>\n {/each}\n </div>\n <input class=\"config-input\" type=\"text\" bind:value={avoidDraft} on:keydown={(e) => handleTagKey(e, 'avoid', () => (avoidDraft = ''))} placeholder=\"Overly flashy effects — press Enter\" />\n </div>\n\n <div class=\"brand-preview\">\n <span class=\"field-label\">BRAND.md preview {brandSaved ? '· saved' : ''}</span>\n <pre>{brandMarkdown}</pre>\n </div>\n {/if}\n </div>\n</div>\n\n<style>\n .panel-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 14px;\n scrollbar-width: thin;\n scrollbar-color: #34373d #111214;\n }\n .config-section { display: flex; flex-direction: column; gap: 12px; }\n .config-title { margin: 0; font-size: 13px; font-weight: 700; color: #f1f2f4; }\n .config-title-row { display: flex; align-items: center; justify-content: space-between; }\n .config-desc { margin: 0; font-size: 11px; line-height: 1.5; color: #8e939b; }\n\n .config-textarea {\n width: 100%;\n box-sizing: border-box;\n resize: vertical;\n padding: 10px;\n border: 1px solid #2c3138;\n border-radius: 6px;\n background: #0d0e10;\n color: #e7eaee;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.5;\n }\n\n .field { display: flex; flex-direction: column; gap: 6px; }\n .field-label {\n color: #8e939b;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .config-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 1px solid #2c3138;\n border-radius: 6px;\n background: #0d0e10;\n color: #e7eaee;\n font-size: 12px;\n }\n .config-input:focus { outline: none; border-color: #4a5563; }\n\n .inline-add { display: flex; gap: 6px; align-items: center; }\n .inline-add .config-input { flex: 1; }\n .color-input { width: 34px; height: 34px; padding: 0; border: 1px solid #2c3138; border-radius: 6px; background: #0d0e10; cursor: pointer; }\n\n .chip-row { display: flex; flex-wrap: wrap; gap: 6px; }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 6px 4px 9px;\n border: 1px solid #2c3138;\n border-radius: 20px;\n background: #16181c;\n color: #dce1e6;\n font-size: 11px;\n }\n .chip button { display: inline-flex; padding: 0; border: 0; background: transparent; color: #8e939b; cursor: pointer; }\n .chip button:hover { color: #ff9da5; }\n .color-chip .swatch { width: 12px; height: 12px; border-radius: 3px; border: 1px solid rgba(255,255,255,0.15); }\n .avoid-chip { border-color: #5a3a3d; background: #241a1b; }\n\n .config-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 12px;\n border: 1px solid #2c3138;\n border-radius: 6px;\n background: #16181c;\n color: #dce1e6;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n }\n .config-btn:hover { background: #202329; }\n\n .config-link {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n align-self: flex-start;\n padding: 0;\n border: 0;\n background: transparent;\n color: #7cf7c5;\n font-size: 11px;\n cursor: pointer;\n }\n .config-link:hover { text-decoration: underline; }\n .config-link.danger { color: #ff9da5; }\n\n .brand-preview { display: flex; flex-direction: column; gap: 6px; }\n .brand-preview pre {\n margin: 0;\n padding: 10px;\n border: 1px solid #2c3138;\n border-radius: 6px;\n background: #0d0e10;\n color: #b8bec6;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10.5px;\n line-height: 1.5;\n white-space: pre-wrap;\n word-break: break-word;\n }\n</style>\n","<script lang=\"ts\">\n import { onMount } from 'svelte';\n import { AlignHorizontalJustifyCenter, AlignHorizontalJustifyEnd, AlignHorizontalJustifyStart, AlignVerticalJustifyCenter, AlignVerticalJustifyEnd, AlignVerticalJustifyStart, Bot, Eye, EyeOff, FileImage, Layers3, Magnet, Maximize2, Minus, Music2, Pause, Play, Plus, Redo2, Scissors, Settings, SkipBack, Sparkles, Square, Trash2, Type, Upload, Video, Volume2, VolumeX, Undo2, X, FolderOpen, Headphones, Wand2 } from 'lucide-svelte';\n import { parseMotion } from '../../language/parser';\n import { buildSceneGraph } from '../../scene/scene-graph';\n import { evaluateScene } from '../../animation/evaluator';\n import { loadAssets, isLoadedVideo, pauseVideoAssets, synchronizeVideoAssets } from '../../assets/asset-loader';\n import type { LoadedAsset } from '../../assets/asset-loader';\n import { assetFilename, significantlyDifferentAsset, tagEmbeddedAssetPath } from '../../assets/asset-resolution';\n import type { AssetIdentity } from '../../assets/asset-resolution';\n import { CanvasRenderer, hiddenMaskSourceIds } from '../../render/canvas-renderer';\n import { canExport, exportVideo } from '../../export/exporter';\n import type { AnimationNode, AudioNode, CameraNode, ClipNode, ElementNode, ProgramNode, TrackNode } from '../../types/parser';\n import { serializeProgram } from '../../language/serializer';\n import type { Asset, Clip, Element, EvaluatedElement, EvaluatedScene, Scene, Track } from '../../types/scene';\n import { combinePersistentTrackRows, packClipTrackLanes, packTimelineLanes, type TimelineLane } from '../timeline-lanes';\n import { alignRect, snapRect, type Alignment, type SnapGuides } from '../canvas-geometry';\n import { moveKeyframe, removeKeyframe, seedKeyframes, setKeyframeEasing, upsertKeyframe } from '../keyframe-editing';\n import { splitClip, type ClipTiming } from '../clip-timing';\n import {\n adjacentClipBoundaries,\n applyClipTransition,\n removedClipTransitionProperties,\n type ClipTransitionBoundary,\n } from '../clip-transitions';\n import { elementWindowProperties, moveElementClip, splitElementClip } from '../element-clips';\n import { restoreEmbeddedAssetPaths } from '../../ai/chat';\n import { createEditorHistory, recordEditorSource, redoEditorSource, undoEditorSource } from '../editor-history';\n import { moveClipToTrack, removeClipFromTracks, trimClipOnTrack } from '../timeline-tracks';\n import { anchoredTimelineScroll, clampTimelineZoom, quantizeTimelineTime as quantizeFrameTime } from '../timeline-viewport';\n import { appUrl } from '../../app/routing';\n import AiChatPanel from './AiChatPanel.svelte';\n import AiConfigPanel from './AiConfigPanel.svelte';\n import BrandConfigPanel from './BrandConfigPanel.svelte';\n\n export let code = '';\n let canvas: HTMLCanvasElement;\n let stage: HTMLDivElement;\n let renderer: CanvasRenderer | null = null;\n let parseError: string | null = null;\n let ast: ProgramNode | null = null;\n let scene: Scene | null = null;\n let currentFrame: EvaluatedScene | null = null;\n let assets = new Map<string, LoadedAsset>();\n let assetsReady = true;\n let assetKey = '';\n let assetLoadId = 0;\n let embeddedAssets: Asset[] = [];\n let assistantAssets: Asset[] = [];\n let isPlaying = false;\n let currentTime = 0;\n let totalDuration = 5;\n let animationFrameId: number | null = null;\n let dragState:\n | { mode: 'move'; id: string; offsetX: number; offsetY: number; startX: number; startY: number }\n | { mode: 'resize'; id: string; centerX: number; centerY: number; startDistance: number; startScale: number }\n | null = null;\n let snapGuides: SnapGuides = { vertical: null, horizontal: null };\n // Live ghost preview for dragging a clip or element layer on the timeline.\n let clipDrag:\n | {\n id: string;\n kind: 'clip' | 'element' | 'audio';\n duration: number;\n grabOffset: number;\n originTrackId: string;\n startClientX: number;\n startClientY: number;\n ghostStart: number;\n ghostTrackId: string;\n valid: boolean;\n moved: boolean;\n }\n | null = null;\n let selectedKeyframeOffset: number | null = null;\n let showCodeEditor = false;\n let selectedElementId = '';\n let zoom = 0.42;\n let isFullscreen = false;\n let audioInput: HTMLInputElement;\n let assetInput: HTMLInputElement;\n let audioElement: HTMLAudioElement;\n let audioUrl = '';\n let audioName = '';\n let audioDuration = 0;\n let timelineHeight = 230;\n let mp4Supported = false;\n let isExporting = false;\n let exportError = '';\n let assetError = '';\n let activeNavTab: 'media' | 'audio' | 'text' | 'effects' | 'scenes' | 'ai' | 'settings' = 'media';\n let showAiChat = false;\n let mediaSubTab: 'assets' | 'presets' = 'assets';\n let showConfirmDialog = false;\n let pendingPresetPath = '';\n let previewAsset: { src: string; width: number; height: number; type: 'image' | 'video' } | null = null;\n let videoRenderId = 0;\n let isDraggingUpload = false;\n let draggingAsset: Asset | null = null;\n let draggingTransition: 'crossfade' | null = null;\n let selectedTransitionIds: { outgoingId: string; incomingId: string } | null = null;\n let dropTargetTime: number | null = null;\n let dropTargetTrack: number | string = '';\n let editorHistory = createEditorHistory(code);\n let timelineScroll: HTMLDivElement;\n let timelineZoom = 1;\n let snapEnabled = false;\n let historyGestureBase: string | null = null;\n\n interface AnimationPresetDef {\n name: string;\n description: string;\n category: 'text' | 'object' | 'transition' | 'camera';\n }\n\n const adjustmentControls = [\n { property: 'blur', label: 'Blur', min: 0, max: 40, step: 0.5, fallback: 0 },\n { property: 'brightness', label: 'Brightness', min: 0, max: 3, step: 0.01, fallback: 1 },\n { property: 'contrast', label: 'Contrast', min: 0, max: 3, step: 0.01, fallback: 1 },\n { property: 'saturation', label: 'Saturation', min: 0, max: 3, step: 0.01, fallback: 1 },\n { property: 'hue', label: 'Hue', min: -180, max: 180, step: 1, fallback: 0 },\n { property: 'grayscale', label: 'Grayscale', min: 0, max: 1, step: 0.01, fallback: 0 },\n { property: 'sepia', label: 'Sepia', min: 0, max: 1, step: 0.01, fallback: 0 },\n { property: 'invert', label: 'Invert', min: 0, max: 1, step: 0.01, fallback: 0 },\n ] as const;\n\n const ANIMATION_PRESETS: AnimationPresetDef[] = [\n // Text presets\n { name: 'splitReveal', description: 'Split character reveal', category: 'text' },\n { name: 'blurReveal', description: 'Blur and fade reveal', category: 'text' },\n { name: 'fadeUp', description: 'Fade up from bottom', category: 'text' },\n { name: 'slideIn', description: 'Slide in from side', category: 'text' },\n { name: 'typewriter', description: 'Typewriter effect', category: 'text' },\n { name: 'keynoteText', description: 'Keynote-style text reveal', category: 'text' },\n { name: 'charReveal', description: 'Character-by-character reveal', category: 'text' },\n { name: 'wordReveal', description: 'Word-by-word reveal', category: 'text' },\n \n // Object presets\n { name: 'heroLogo', description: 'Hero logo entrance', category: 'object' },\n { name: 'softReveal', description: 'Soft fade and scale reveal', category: 'object' },\n { name: 'springIn', description: 'Spring entrance', category: 'object' },\n { name: 'float', description: 'Floating motion', category: 'object' },\n { name: 'pulse', description: 'Pulsing scale', category: 'object' },\n { name: 'drawSVG', description: 'SVG path drawing', category: 'object' },\n { name: 'scaleReveal', description: 'Scale up reveal', category: 'object' },\n \n // Transitions\n { name: 'shapeWipe', description: 'Directional wipe transition', category: 'transition' },\n { name: 'irisWipe', description: 'Circular iris wipe', category: 'transition' },\n { name: 'maskReveal', description: 'Masked reveal transition', category: 'transition' },\n { name: 'dynamicSlide', description: 'Dynamic slide transition', category: 'transition' },\n \n // Camera\n { name: 'slowPush', description: 'Slow camera push', category: 'camera' },\n { name: 'pan', description: 'Camera pan', category: 'camera' },\n { name: 'speedZoom', description: 'Speed zoom punch', category: 'camera' },\n ];\n const availablePresets = [{\n name: 'Motionly',\n path: appUrl('preset/motionly/motionly.motion'),\n gifPath: appUrl('preset/motionly/motionly-preset.gif'),\n }];\n\n onMount(() => {\n mp4Supported = canExport('mp4');\n if (canvas) {\n renderer = new CanvasRenderer(canvas);\n parseAndRender();\n }\n const observer = new ResizeObserver(fitPreview);\n if (stage) observer.observe(stage);\n requestAnimationFrame(fitPreview);\n \n // Keyboard handler for Escape to clear preview\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n const editing = target?.matches('input, textarea, select, [contenteditable=\"true\"]');\n if ((e.ctrlKey || e.metaKey) && !editing && e.key.toLowerCase() === 'z') {\n e.preventDefault();\n if (e.shiftKey) redoEditor();\n else undoEditor();\n return;\n }\n if (e.key === 'Escape' && previewAsset) clearAssetPreview();\n };\n window.addEventListener('keydown', handleKeyDown);\n \n return () => {\n observer.disconnect();\n if (audioUrl) URL.revokeObjectURL(audioUrl);\n window.removeEventListener('keydown', handleKeyDown);\n };\n });\n\n function beginHistoryGesture() {\n if (historyGestureBase === null) historyGestureBase = editorHistory.present;\n }\n\n function endHistoryGesture() {\n if (historyGestureBase === null) return;\n const finalSource = editorHistory.present;\n const baseSource = historyGestureBase;\n historyGestureBase = null;\n editorHistory = recordEditorSource(\n { ...editorHistory, present: baseSource },\n finalSource\n );\n }\n\n function undoEditor() {\n const previous = undoEditorSource(editorHistory);\n if (previous === editorHistory) return;\n pause();\n editorHistory = previous;\n code = previous.present;\n }\n\n function redoEditor() {\n const next = redoEditorSource(editorHistory);\n if (next === editorHistory) return;\n pause();\n editorHistory = next;\n code = next.present;\n }\n\n function requestPresetLoad(presetPath: string) {\n pendingPresetPath = presetPath;\n showConfirmDialog = true;\n }\n\n async function confirmLoadPreset() {\n if (!pendingPresetPath) return;\n \n try {\n const response = await fetch(pendingPresetPath);\n if (!response.ok) throw new Error('Failed to load preset');\n \n code = await response.text();\n showConfirmDialog = false;\n pendingPresetPath = '';\n selectedElementId = '';\n \n // Reset playback\n currentTime = 0;\n if (isPlaying) pause();\n } catch (error) {\n console.error('Failed to load preset:', error);\n parseError = error instanceof Error ? error.message : 'Failed to load preset';\n showConfirmDialog = false;\n }\n }\n\n function cancelLoadPreset() {\n showConfirmDialog = false;\n pendingPresetPath = '';\n }\n\n function loadGeneratedMotion(source: string): string | null {\n try {\n const restoredSource = restoreEmbeddedAssetPaths(source, embeddedAssets);\n const program = parseMotion(restoredSource);\n buildSceneGraph(program);\n if (isPlaying) pause();\n selectedElementId = '';\n currentTime = 0;\n code = restoredSource;\n return null;\n } catch (cause) {\n return cause instanceof Error ? cause.message : 'The generated project is not valid .motion source.';\n }\n }\n\n $: if (code) {\n if (code !== editorHistory.present) {\n editorHistory = historyGestureBase === null\n ? recordEditorSource(editorHistory, code)\n : { ...editorHistory, present: code, future: [] };\n }\n parseAndRender();\n }\n\n $: selectedElement =\n scene?.elements.find((element) => element.id === selectedElementId) ?? null;\n $: selectedClip = scene?.clips.find((clip) => clip.id === selectedElementId) ?? null;\n $: selectedAnimation =\n scene?.animations.find((animation) => animation.target === selectedElement?.id) ?? null;\n $: keyframeDragDelta =\n clipDrag?.kind === 'element' && clipDrag.id === selectedElementId\n ? clipDrag.ghostStart - timelineRange(clipDrag.id).start\n : 0;\n $: sourceElements = scene?.elements.filter((element) => !element.id.includes('__')) ?? [];\n $: allTimelineRows = packTimelineLanes(sourceElements, timelineRange);\n $: combinedTimelineRows = combinePersistentTrackRows(\n packClipTrackLanes(scene?.clips ?? [], scene?.tracks ?? []),\n allTimelineRows\n );\n $: timelineRows = combinedTimelineRows.elementLanes;\n $: timelineClipTracks = combinedTimelineRows.clipTracks;\n $: defaultMainTrack = scene?.tracks.find((track) => track.role === 'main')?.id ?? 'main';\n $: projectAudioTrack = scene?.tracks.find((track) => track.role === 'audio') ?? null;\n $: transitionBoundaries = adjacentClipBoundaries(\n scene?.clips ?? [],\n 1 / (scene?.canvas.fps ?? 60)\n );\n $: selectedTransition = selectedTransitionIds\n ? transitionBoundaries.find(\n (boundary) =>\n boundary.outgoing.id === selectedTransitionIds?.outgoingId &&\n boundary.incoming.id === selectedTransitionIds?.incomingId &&\n boundary.type !== null\n ) ?? null\n : null;\n $: timelineTicks = Array.from({ length: 7 }, (_, index) => (totalDuration * index) / 6);\n $: displayFrame = Math.round(currentTime * (scene?.canvas.fps ?? 60));\n $: assistantAssets = mergeAssets(scene?.imports ?? [], embeddedAssets);\n $: canvasWidth = scene?.canvas.width ?? 1920;\n $: canvasHeight = scene?.canvas.height ?? 1080;\n $: aiProjectInfo = {\n width: canvasWidth,\n height: canvasHeight,\n fps: scene?.canvas.fps ?? 60,\n duration: totalDuration,\n elementCount: sourceElements.length,\n };\n $: canvasStyle = `width: ${Math.round(canvasWidth * zoom)}px; aspect-ratio: ${canvasWidth} / ${canvasHeight};`;\n $: timelineContentWidth = Math.max(820, 220 + totalDuration * 100 * timelineZoom);\n\n function parseAndRender() {\n try {\n parseError = null;\n ast = parseMotion(code);\n scene = buildSceneGraph(ast);\n if (audioElement) {\n audioElement.muted = scene.tracks.find((track) => track.role === 'audio')?.muted ?? false;\n }\n rememberEmbeddedAssets(scene.imports);\n totalDuration = scene.canvas.duration;\n currentTime = Math.min(currentTime, totalDuration);\n if (selectedElementId && !scene.elements.some((element) => element.id === selectedElementId) && !scene.clips.some((clip) => clip.id === selectedElementId)) selectedElementId = '';\n \n // Load audio if specified in scene\n if (scene.audio) {\n // Check if we need to load/reload audio\n const currentAudioPath = scene.audio;\n const needsLoad = !audioUrl || !audioName || !currentAudioPath.endsWith(audioName);\n \n if (needsLoad) {\n loadAudioFromPath(currentAudioPath);\n }\n } else if (!scene.audio && audioUrl) {\n // Clear audio if not in scene\n removeAudio();\n }\n \n const nextAssetKey = scene.imports.map((asset) => `${asset.name}:${asset.path}`).join('|');\n if (nextAssetKey !== assetKey) {\n assetKey = nextAssetKey;\n assetsReady = false;\n void refreshAssets(scene);\n }\n renderFrame(currentTime);\n } catch (error) {\n parseError = error instanceof Error ? error.message : String(error);\n console.error('Parse error:', error);\n }\n }\n\n function renderFrame(time: number, exactVideoSeek = false) {\n if (!renderer || !scene) return;\n const frame = evaluateScene(scene, time);\n currentFrame = frame;\n const renderId = ++videoRenderId;\n const draw = () => {\n if (!renderer || renderId !== videoRenderId) return;\n renderer.render(frame, assets);\n drawSelection();\n };\n if (exactVideoSeek) {\n void synchronizeVideoAssets(frame, assets, { playing: false, exact: true })\n .then(draw)\n .catch((error) => console.warn('Video seek failed:', error));\n return;\n }\n void synchronizeVideoAssets(frame, assets, { playing: isPlaying }).catch((error) =>\n console.warn('Video synchronization failed:', error)\n );\n draw();\n }\n\n function drawSelection() {\n if (!canvas || !currentFrame || !selectedElementId) return;\n const matches = currentFrame.elements.filter((element) => {\n const props = propertiesOf(element);\n return element.id === selectedElementId || props['textGroup'] === selectedElementId;\n });\n const visible = matches.filter((element) => Number(propertiesOf(element)['opacity'] ?? 1) > 0.001);\n const boxes = (visible.length ? visible : matches).map(elementBounds);\n if (!boxes.length) return;\n const left = Math.min(...boxes.map((box) => box.x));\n const top = Math.min(...boxes.map((box) => box.y));\n const right = Math.max(...boxes.map((box) => box.x + box.width));\n const bottom = Math.max(...boxes.map((box) => box.y + box.height));\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const inset = selectedElement?.kind === 'overlay' || selectedElement?.kind === 'effect' ? 3 / zoom : 0;\n const handleSize = 10 / zoom;\n ctx.save();\n ctx.strokeStyle = '#7cf7c5';\n ctx.lineWidth = 2 / zoom;\n ctx.setLineDash([8 / zoom, 5 / zoom]);\n ctx.strokeRect(left + inset, top + inset, right - left - inset * 2, bottom - top - inset * 2);\n if (selectedElement?.kind === 'asset' || selectedElement?.kind === 'text') {\n ctx.setLineDash([]);\n ctx.fillStyle = '#0d1513';\n const corners: Array<[number, number]> = [[left, top], [right, top], [right, bottom], [left, bottom]];\n for (const [x, y] of corners) {\n ctx.fillRect(x - handleSize / 2, y - handleSize / 2, handleSize, handleSize);\n ctx.strokeRect(x - handleSize / 2, y - handleSize / 2, handleSize, handleSize);\n }\n }\n ctx.restore();\n }\n\n async function refreshAssets(nextScene: Scene) {\n const loadId = ++assetLoadId;\n const previousAssets = assets;\n try {\n const loaded = await loadAssets(nextScene);\n if (loadId !== assetLoadId) return;\n for (const asset of nextScene.imports) {\n const previous = previousAssets.get(asset.name);\n if (!loaded.has(asset.name) && previous) loaded.set(asset.name, previous);\n }\n assets = loaded;\n const missing = nextScene.imports.filter((asset) => !loaded.has(asset.name));\n assetError = missing.length ? `Could not load ${missing.map((asset) => asset.name).join(', ')}.` : '';\n assetsReady = true;\n renderFrame(currentTime, true);\n } catch (error) {\n console.warn('Asset load failed:', error);\n }\n }\n\n function rememberEmbeddedAssets(imports: Asset[]) {\n const remembered = new Map(embeddedAssets.map((asset) => [asset.name, asset]));\n for (const asset of imports) if (asset.path.startsWith('data:')) remembered.set(asset.name, asset);\n embeddedAssets = [...remembered.values()];\n }\n\n function mergeAssets(current: Asset[], embedded: Asset[]): Asset[] {\n return [...new Map([...current, ...embedded].map((asset) => [asset.name, asset])).values()];\n }\n\n function play() {\n if (!scene) return;\n isPlaying = true;\n resumeAudioAtCurrentTime();\n\n const fps = scene.canvas.fps;\n const frameTime = 1000 / fps;\n let lastTime = performance.now();\n \n function animate(now: number) {\n if (!isPlaying) return;\n\n const delta = now - lastTime;\n if (delta >= frameTime) {\n if (audioUrl && audioElement && !audioElement.paused && !audioElement.ended) {\n currentTime = quantizeTimelineTime((scene?.audioStart ?? 0) + audioElement.currentTime);\n } else {\n currentTime = quantizeTimelineTime(currentTime + delta / 1000);\n resumeAudioAtCurrentTime();\n }\n \n if (currentTime >= totalDuration) {\n currentTime = totalDuration;\n pause();\n }\n\n renderFrame(currentTime);\n lastTime = now;\n }\n\n animationFrameId = requestAnimationFrame(animate);\n }\n\n animationFrameId = requestAnimationFrame(animate);\n }\n\n function pause() {\n isPlaying = false;\n audioElement?.pause();\n pauseVideoAssets(assets);\n if (animationFrameId) {\n cancelAnimationFrame(animationFrameId);\n animationFrameId = null;\n }\n }\n\n function reset() {\n pause();\n currentTime = 0;\n syncAudio();\n renderFrame(currentTime, true);\n }\n\n function quantizeTimelineTime(time: number): number {\n return quantizeFrameTime(time, totalDuration, scene?.canvas.fps ?? 60);\n }\n\n function seek(event: Event) {\n pause();\n currentTime = quantizeTimelineTime(Number((event.currentTarget as HTMLInputElement).value));\n syncAudio();\n renderFrame(currentTime, true);\n }\n\n function setTime(time: number) {\n pause();\n currentTime = quantizeTimelineTime(time);\n syncAudio();\n renderFrame(currentTime, true);\n }\n\n function resizeTimeline(event: PointerEvent) {\n event.preventDefault();\n const startY = event.clientY;\n const startHeight = timelineHeight;\n const move = (moveEvent: PointerEvent) => {\n timelineHeight = Math.max(130, Math.min(window.innerHeight * 0.55, startHeight + startY - moveEvent.clientY));\n fitPreview();\n };\n const stop = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', stop);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', stop);\n }\n\n function resizeTimelineWithKeyboard(event: KeyboardEvent) {\n if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return;\n event.preventDefault();\n timelineHeight = Math.max(130, Math.min(window.innerHeight * 0.55, timelineHeight + (event.key === 'ArrowUp' ? 24 : -24)));\n requestAnimationFrame(fitPreview);\n }\n\n function fitPreview() {\n if (!stage || !scene) return;\n const rect = stage.getBoundingClientRect();\n const next = Math.min((rect.width - 72) / canvasWidth, (rect.height - 72) / canvasHeight, 1);\n zoom = Math.max(0.08, Number(next.toFixed(3)));\n }\n\n function toggleFullscreen() {\n isFullscreen = !isFullscreen;\n requestAnimationFrame(fitPreview);\n }\n\n function toggleCodeEditor() {\n showCodeEditor = !showCodeEditor;\n }\n\n function formatTime(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n\n function formatPreciseTime(seconds: number): string {\n return `${formatTime(seconds)}.${Math.floor((seconds % 1) * 10)}`;\n }\n\n function propertiesOf(element: Element | EvaluatedElement): Record<string, unknown> {\n return (('render' in element ? element.render : element.properties) as unknown) as Record<string, unknown>;\n }\n\n function elementDetail(element: Element): string {\n if (element.asset?.path) return element.asset.path.split('/').pop() ?? 'Asset';\n if (element.kind === 'text') {\n const value = stringProperty(element, 'value', 'Text');\n return value.length > 24 ? `${value.slice(0, 24)}...` : value;\n }\n if (element.kind === 'overlay') return 'Scene color';\n if (element.kind === 'effect') return 'Effect';\n return 'Layer';\n }\n\n function timelineRange(id: string): { start: number; end: number } {\n if (!scene) return { start: 0, end: totalDuration };\n const targets = new Set(scene.elements\n .filter((element) => element.id === id || propertiesOf(element)['textGroup'] === id)\n .map((element) => element.id));\n const entries: number[] = [];\n const exits: number[] = [];\n const source = scene.elements.find((element) => element.id === id);\n const sourceProperties = source ? propertiesOf(source) : {};\n if (\n typeof sourceProperties['start'] === 'number' &&\n typeof sourceProperties['duration'] === 'number'\n ) {\n const start = Math.max(0, sourceProperties['start']);\n return {\n start,\n end: Math.min(totalDuration, start + Math.max(0, sourceProperties['duration'])),\n };\n }\n if (source && numericProperty(source, 'opacity', 1) > 0) entries.push(0);\n\n for (const animation of scene.animations.filter((item) => targets.has(item.target))) {\n if (animation.keyframes.length) {\n const visible = animation.keyframes.filter((frame) => Number(frame.properties['opacity'] ?? 0) > 0);\n if (visible[0]) entries.push(animation.delay + visible[0].offset * animation.duration);\n const lastVisible = visible.at(-1);\n const nextHidden = lastVisible && animation.keyframes.find(\n (frame) => frame.offset > lastVisible.offset && Number(frame.properties['opacity'] ?? 1) <= 0\n );\n if (nextHidden) exits.push(animation.delay + nextHidden.offset * animation.duration);\n continue;\n }\n const fromOpacity = Number(animation.from['opacity'] ?? numericProperty(source ?? null, 'opacity', 1));\n const toOpacity = Number(animation.to['opacity'] ?? fromOpacity);\n if (toOpacity > 0) entries.push(animation.delay);\n if (fromOpacity > 0 && toOpacity <= 0) exits.push(animation.delay + animation.duration);\n }\n\n const start = entries.length ? Math.min(...entries) : 0;\n const end = exits.length ? Math.max(start, ...exits) : totalDuration;\n return { start: Math.max(0, start), end: Math.min(totalDuration, end) };\n }\n\n function timelinePercent(time: number): number {\n return totalDuration > 0 ? Math.max(0, Math.min(100, (time / totalDuration) * 100)) : 0;\n }\n\n async function handleAudioSelected(event: Event) {\n const file = (event.currentTarget as HTMLInputElement).files?.[0];\n if (!file || !ast) return;\n if (file.size > 50 * 1024 * 1024) {\n assetError = 'Audio files must be 50 MB or smaller.';\n return;\n }\n const dataUrl = await readFileDataUrl(file);\n if (audioUrl.startsWith('blob:')) URL.revokeObjectURL(audioUrl);\n audioUrl = dataUrl;\n audioName = file.name;\n audioDuration = 0;\n audioElement.src = audioUrl;\n audioElement.muted = projectAudioTrack?.muted ?? false;\n audioElement.load();\n ast.body = ast.body.filter((node) => node.type !== 'Audio');\n const insertAt = ast.body.findIndex(\n (node) => node.type === 'Import' || node.type === 'Track' || node.type === 'Element'\n );\n ast.body.splice(insertAt < 0 ? ast.body.length : insertAt, 0, {\n type: 'Audio',\n path: dataUrl,\n properties: {},\n });\n audioInput.value = '';\n code = serializeProgram(ast);\n }\n\n async function loadAudioFromPath(path: string) {\n try {\n const response = await fetch(path);\n if (!response.ok) throw new Error('Failed to load audio');\n \n const blob = await response.blob();\n if (audioUrl) URL.revokeObjectURL(audioUrl);\n audioUrl = URL.createObjectURL(blob);\n audioName = path.startsWith('data:audio/')\n ? 'Embedded audio'\n : path.substring(path.lastIndexOf('/') + 1);\n audioDuration = 0;\n \n if (audioElement) {\n audioElement.src = audioUrl;\n audioElement.load();\n }\n } catch (error) {\n console.error('Failed to load audio:', error);\n }\n }\n\n function removeAudio() {\n pause();\n if (audioUrl) URL.revokeObjectURL(audioUrl);\n audioUrl = '';\n audioName = '';\n audioDuration = 0;\n if (audioElement) audioElement.removeAttribute('src');\n \n // Remove audio from AST\n if (ast) {\n ast.body = ast.body.filter(node => node.type !== 'Audio');\n code = serializeProgram(ast);\n }\n }\n\n export async function exportMp4(\n filename = 'motionly.mp4',\n onProgress?: (progress: number) => void\n ) {\n if (!scene || isExporting) return;\n if (!mp4Supported) {\n exportError = 'MP4 export is not supported by this browser.';\n return;\n }\n if (!assetsReady) {\n exportError = 'Assets are still loading. Try export again in a moment.';\n return;\n }\n pause();\n isExporting = true;\n exportError = '';\n try {\n const blob = await exportVideo({\n scene,\n assets,\n format: 'mp4',\n height: scene.canvas.height,\n fps: scene.canvas.fps,\n audioUrl: audioUrl || undefined,\n onProgress: (progress) => {\n onProgress?.(progress);\n },\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n URL.revokeObjectURL(url);\n } catch (error) {\n exportError = error instanceof Error ? error.message : String(error);\n } finally {\n isExporting = false;\n }\n }\n\n function deleteSelectedElement() {\n if (!ast || !selectedElementId) return;\n const id = selectedElementId;\n if (selectedClip) {\n deleteClip(id);\n return;\n }\n ast.body = ast.body.filter((node) =>\n !(node.type === 'Element' && node.name === id) &&\n !(node.type === 'Animation' && node.target === id)\n );\n selectedElementId = '';\n code = serializeProgram(ast);\n }\n\n function trimElement(event: PointerEvent, id: string, edge: 'start' | 'end') {\n event.preventDefault();\n event.stopPropagation();\n const lane = (event.currentTarget as HTMLElement).closest('.track-lane');\n if (!lane) return;\n beginHistoryGesture();\n const rect = lane.getBoundingClientRect();\n const update = (pointer: PointerEvent) => {\n const raw = ((pointer.clientX - rect.left) / rect.width) * totalDuration;\n setClipBoundary(id, edge, snapTimelineTime(raw, rect.width, id));\n };\n const stop = () => {\n endHistoryGesture();\n window.removeEventListener('pointermove', update);\n window.removeEventListener('pointerup', stop);\n };\n window.addEventListener('pointermove', update);\n window.addEventListener('pointerup', stop);\n }\n\n function setClipBoundary(id: string, edge: 'start' | 'end', time: number) {\n if (!ast) return;\n const range = timelineRange(id);\n const element = ast.body.find(\n (node): node is ElementNode => node.type === 'Element' && node.name === id\n );\n if (!element) return;\n const minimum = 1 / (scene?.canvas.fps ?? 60);\n const start = edge === 'start' ? Math.min(time, range.end - minimum) : range.start;\n const end = edge === 'end' ? Math.max(time, range.start + minimum) : range.end;\n element.properties = elementWindowProperties(element.properties, start, end, minimum);\n code = serializeProgram(ast);\n }\n\n function syncAudio() {\n if (!audioUrl || !audioElement) return;\n audioElement.currentTime = Math.min(\n Math.max(0, currentTime - (scene?.audioStart ?? 0)),\n audioDuration || currentTime\n );\n }\n\n function resumeAudioAtCurrentTime() {\n if (!audioUrl || !audioElement || !scene) return;\n const localTime = currentTime - scene.audioStart;\n if (localTime < 0 || localTime >= (audioDuration || Number.POSITIVE_INFINITY)) return;\n syncAudio();\n if (audioElement.paused) {\n audioElement.play().catch((error) => {\n console.warn('Audio playback failed (this is normal if no user interaction yet):', error.message);\n });\n }\n }\n\n function numericProperty(element: Element | EvaluatedElement | null, key: string, fallback: number): number {\n if (!element) return fallback;\n const value = propertiesOf(element)[key];\n return typeof value === 'number' ? value : fallback;\n }\n\n function stringProperty(element: Element | EvaluatedElement | null, key: string, fallback: string): string {\n if (!element) return fallback;\n const value = propertiesOf(element)[key];\n return typeof value === 'string' ? value : fallback;\n }\n\n function updateElementProperty(key: string, value: string | number | boolean) {\n if (!ast || !selectedElement) return;\n const node = ast.body.find(\n (item): item is ElementNode =>\n item.type === 'Element' && item.name === selectedElement.id\n );\n if (!node) return;\n node.properties = { ...node.properties, [key]: value };\n code = serializeProgram(ast);\n }\n\n function resetElementSize() {\n if (!ast) return;\n const targetId = selectedElement?.kind === 'asset' ? selectedElement.id : selectedClip?.assetName;\n if (!targetId) return;\n const node = ast.body.find(\n (item): item is ElementNode => item.type === 'Element' && item.name === targetId\n );\n if (!node) return;\n const properties = { ...node.properties };\n delete properties['width'];\n delete properties['height'];\n node.properties = properties;\n code = serializeProgram(ast);\n }\n\n function updateElementProperties(elementId: string, updates: Record<string, string | number | boolean>) {\n if (!ast) return;\n const node = ast.body.find(\n (item): item is ElementNode => item.type === 'Element' && item.name === elementId\n );\n if (!node) return;\n node.properties = { ...node.properties, ...updates };\n code = serializeProgram(ast);\n }\n\n function handleCanvasPointerDown(event: PointerEvent) {\n if (!scene || !canvas) return;\n const point = pointerToCanvas(event);\n if (selectedElement && (selectedElement.kind === 'asset' || selectedElement.kind === 'text')) {\n const bounds = selectedBounds();\n if (bounds) {\n const corners: Array<[number, number]> = [\n [bounds.x, bounds.y],\n [bounds.x + bounds.width, bounds.y],\n [bounds.x + bounds.width, bounds.y + bounds.height],\n [bounds.x, bounds.y + bounds.height],\n ];\n const handleRadius = 16 / zoom;\n if (corners.some(([x, y]) => Math.hypot(point.x - x, point.y - y) <= handleRadius)) {\n const centerX = bounds.x + bounds.width / 2;\n const centerY = bounds.y + bounds.height / 2;\n dragState = {\n mode: 'resize',\n id: selectedElement.id,\n centerX,\n centerY,\n startDistance: Math.max(1, Math.hypot(point.x - centerX, point.y - centerY)),\n startScale: numericProperty(selectedElement, 'scale', 1),\n };\n canvas.setPointerCapture(event.pointerId);\n return;\n }\n }\n }\n const element = hitTest(point.x, point.y);\n if (!element) {\n selectedElementId = '';\n renderFrame(currentTime);\n return;\n }\n\n pause();\n const targetId = stringProperty(element, 'textGroup', element.id);\n selectElement(targetId, false);\n const target = scene.elements.find((item) => item.id === targetId);\n if (!target) return;\n const center = elementCenter(target);\n dragState = {\n mode: 'move',\n id: targetId,\n offsetX: point.x - center.x,\n offsetY: point.y - center.y,\n startX: numericProperty(target, 'x', 0),\n startY: numericProperty(target, 'y', 0),\n };\n canvas.setPointerCapture(event.pointerId);\n }\n\n function handleCanvasPointerMove(event: PointerEvent) {\n if (!dragState || !scene) return;\n const point = pointerToCanvas(event);\n const element = scene.elements.find((item) => item.id === dragState?.id);\n if (!element) return;\n if (dragState.mode === 'resize') {\n const distance = Math.hypot(point.x - dragState.centerX, point.y - dragState.centerY);\n updateElementProperties(element.id, { scale: Number(Math.max(0.05, dragState.startScale * distance / dragState.startDistance).toFixed(3)) });\n return;\n }\n const centered = isCentered(element);\n let nextX = point.x - dragState.offsetX - (centered ? scene.canvas.width / 2 : 0);\n let nextY = point.y - dragState.offsetY - (centered ? scene.canvas.height / 2 : 0);\n if (event.shiftKey) {\n const deltaX = nextX - dragState.startX;\n const deltaY = nextY - dragState.startY;\n if (Math.abs(deltaX) >= Math.abs(deltaY)) nextY = dragState.startY;\n else nextX = dragState.startX;\n }\n\n const currentX = numericProperty(element, 'x', 0);\n const currentY = numericProperty(element, 'y', 0);\n const currentBounds = elementBounds(element);\n const proposedBounds = {\n ...currentBounds,\n x: currentBounds.x + nextX - currentX,\n y: currentBounds.y + nextY - currentY,\n };\n const others = scene.elements\n .filter((candidate) => candidate.id !== element.id && !candidate.id.includes('__'))\n .filter((candidate) => candidate.kind === 'asset' || candidate.kind === 'text')\n .map(elementBounds);\n const snapped = event.altKey\n ? { rect: proposedBounds, guides: { vertical: null, horizontal: null } }\n : snapRect(proposedBounds, others, scene.canvas, 6 / Math.max(zoom, 0.01));\n snapGuides = snapped.guides;\n nextX += snapped.rect.x - proposedBounds.x;\n nextY += snapped.rect.y - proposedBounds.y;\n updateElementProperties(element.id, { x: Math.round(nextX), y: Math.round(nextY) });\n }\n\n function handleCanvasPointerUp(event: PointerEvent) {\n dragState = null;\n snapGuides = { vertical: null, horizontal: null };\n if (canvas.hasPointerCapture(event.pointerId)) {\n canvas.releasePointerCapture(event.pointerId);\n }\n }\n\n function alignSelected(alignment: Alignment) {\n if (!scene || !selectedElement) return;\n const bounds = elementBounds(selectedElement);\n const aligned = alignRect(bounds, scene.canvas, alignment);\n updateElementProperties(selectedElement.id, {\n x: Math.round(numericProperty(selectedElement, 'x', 0) + aligned.x - bounds.x),\n y: Math.round(numericProperty(selectedElement, 'y', 0) + aligned.y - bounds.y),\n });\n }\n\n function pointerToCanvas(event: PointerEvent): { x: number; y: number } {\n const rect = canvas.getBoundingClientRect();\n return {\n x: ((event.clientX - rect.left) / rect.width) * canvasWidth,\n y: ((event.clientY - rect.top) / rect.height) * canvasHeight,\n };\n }\n\n function hitTest(x: number, y: number): EvaluatedElement | null {\n if (!currentFrame) return null;\n const hiddenMasks = hiddenMaskSourceIds(currentFrame.elements);\n const editable = currentFrame.elements\n .filter((element) => !hiddenMasks.has(element.id))\n .filter((element) => element.kind === 'text' || element.kind === 'asset')\n .filter((element) => numericProperty(element, 'opacity', 1) > 0)\n .reverse();\n\n return editable.find((element) => {\n const bounds = elementBounds(element);\n return x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height;\n }) ?? null;\n }\n\n function selectElement(id: string, seekToElement = true) {\n if (id !== selectedElementId) selectedKeyframeOffset = null;\n selectedTransitionIds = null;\n selectedElementId = id;\n if (seekToElement) setTime(firstVisibleTime(id));\n else renderFrame(currentTime);\n }\n\n function previewAssetOnly(asset: Asset) {\n const loaded = assets.get(asset.name);\n if (loaded) {\n previewAsset = {\n src: loaded.src,\n width: loaded.width,\n height: loaded.height,\n type: isLoadedVideo(loaded) ? 'video' : 'image',\n };\n }\n }\n\n function clearAssetPreview() {\n previewAsset = null;\n }\n\n function handleAssetDragStart(event: DragEvent, asset: Asset) {\n draggingAsset = asset;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'copy';\n event.dataTransfer.setData('text/plain', asset.name);\n }\n }\n\n function handleAssetDragEnd() {\n draggingAsset = null;\n dropTargetTime = null;\n dropTargetTrack = '';\n }\n\n async function handleAssetUpload(event: Event) {\n await importAssetFiles((event.currentTarget as HTMLInputElement).files);\n assetInput.value = '';\n }\n\n async function handleAssetFileDrop(event: DragEvent) {\n event.preventDefault();\n isDraggingUpload = false;\n await importAssetFiles(event.dataTransfer?.files);\n }\n\n function handleAssetFileDrag(event: DragEvent) {\n if (event.dataTransfer?.types.includes('Files')) isDraggingUpload = true;\n }\n\n function handleAssetFileDragLeave(event: DragEvent) {\n if (!(event.currentTarget as HTMLElement).contains(event.relatedTarget as Node | null)) {\n isDraggingUpload = false;\n }\n }\n\n async function importAssetFiles(fileList: FileList | null | undefined) {\n if (!ast) return;\n const program = ast;\n assetError = '';\n const files = Array.from(fileList ?? []);\n if (!files.length) return;\n for (const file of files) {\n const lowerName = file.name.toLowerCase();\n const isImage = file.type.startsWith('image/') || lowerName.endsWith('.svg');\n const isVideo = file.type === 'video/mp4' || file.type === 'video/webm' || /\\.(mp4|webm|m4v)$/.test(lowerName);\n if (!isImage && !isVideo) {\n assetError = `${file.name} is not a supported image, SVG, MP4, or WebM file.`;\n continue;\n }\n const maximumSize = isVideo ? 100_000_000 : 10_000_000;\n if (file.size > maximumSize) {\n assetError = `${file.name} is larger than ${isVideo ? '100' : '10'} MB.`;\n continue;\n }\n let path = '';\n try {\n path = tagEmbeddedAssetPath(await readFileDataUrl(file), file.name);\n } catch (cause) {\n assetError = cause instanceof Error ? cause.message : `Could not read ${file.name}.`;\n continue;\n }\n const matchingImports = program.body.filter(\n (node) => node.type === 'Import' && assetFilename(node.path) === file.name\n );\n if (matchingImports.length) {\n const existing = matchingImports\n .map((node) => assets.get(node.name))\n .find((asset): asset is LoadedAsset => !!asset);\n let replacement: AssetIdentity;\n try {\n replacement = await readMediaIdentity(file, isVideo);\n } catch (cause) {\n assetError = cause instanceof Error ? cause.message : `Could not inspect ${file.name}.`;\n continue;\n }\n if (\n existing &&\n significantlyDifferentAsset(\n { width: existing.width, height: existing.height, size: existing.motionlySize },\n replacement\n ) &&\n !window.confirm(\n `${file.name} has very different size or dimensions from the current asset. Replace it anyway?`\n )\n ) {\n assetError = `Kept the current ${file.name}.`;\n continue;\n }\n for (const node of matchingImports) node.path = path;\n assetError = `Matched ${file.name} to its existing import by filename.`;\n continue;\n }\n const used = new Set(program.body.flatMap((node) => node.type === 'Import' ? [node.name] : node.type === 'Element' ? [node.name] : []));\n const base = file.name.replace(/\\.[^.]+$/, '').replace(/[^a-zA-Z0-9_]/g, '_').replace(/^[^a-zA-Z_]/, 'asset_') || 'asset';\n let name = base;\n let suffix = 2;\n while (used.has(name)) name = `${base}_${suffix++}`;\n program.body.push({ type: 'Import', path, name });\n }\n code = serializeProgram(program);\n }\n\n async function readMediaIdentity(file: File, isVideo: boolean) {\n const url = URL.createObjectURL(file);\n try {\n if (isVideo) {\n const video = document.createElement('video');\n video.preload = 'metadata';\n video.src = url;\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(video.error ?? new Error(`Could not inspect ${file.name}.`));\n });\n return { width: video.videoWidth, height: video.videoHeight, size: file.size };\n }\n const image = new Image();\n image.src = url;\n await image.decode();\n return { width: image.naturalWidth, height: image.naturalHeight, size: file.size };\n } finally {\n URL.revokeObjectURL(url);\n }\n }\n\n function readFileDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () => reject(reader.error ?? new Error(`Could not read ${file.name}.`));\n reader.readAsDataURL(file);\n });\n }\n\n function handleTimelineDragOver(event: DragEvent) {\n if (!draggingAsset) return;\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n\n const timeline = event.currentTarget as HTMLElement;\n const rect = timeline.querySelector<HTMLElement>('.ruler')?.getBoundingClientRect();\n if (!rect) return;\n dropTargetTime = timelineTimeAt(event.clientX, rect);\n const track = (event.target as HTMLElement).closest<HTMLElement>('[data-track]')?.dataset['track'];\n dropTargetTrack = track && !Number.isNaN(Number(track)) ? Number(track) : (track || 1);\n }\n\n function handleTimelineDrop(event: DragEvent) {\n event.preventDefault();\n if (!draggingAsset || !ast || dropTargetTime === null) return;\n \n const assetName = draggingAsset.name;\n const frame = 1 / (scene?.canvas.fps ?? 60);\n const loadedAsset = assets.get(assetName);\n const naturalDuration = isLoadedVideo(loadedAsset) && loadedAsset.motionlyDuration > 0\n ? loadedAsset.motionlyDuration\n : 5;\n const duration = Math.min(naturalDuration, Math.max(frame, totalDuration - dropTargetTime));\n const start = Math.min(dropTargetTime, Math.max(0, totalDuration - duration));\n const targetId = String(dropTargetTrack || defaultMainTrack);\n const targetTrack = ensureLayerTrack(targetId);\n const clipNode: ClipNode = {\n type: 'Clip',\n assetName,\n properties: {\n track: targetTrack.id,\n start: `${start.toFixed(3)}s`,\n duration: `${duration.toFixed(3)}s`,\n trimIn: '0s',\n trimOut: '0s',\n },\n };\n ast.body.push(clipNode);\n if (scene) {\n const newId = `clip_${assetName}_${scene.clips.length}`;\n const runtimeClip: Clip = {\n id: newId,\n assetName,\n asset: draggingAsset,\n track: targetTrack.id,\n start,\n duration,\n trimIn: 0,\n trimOut: 0,\n transitionInDuration: 0,\n transitionOutDuration: 0,\n sourceOrder: scene.clips.length,\n };\n const next = moveClipToTrack(\n [...scene.clips, runtimeClip],\n newId,\n targetTrack,\n start,\n totalDuration\n );\n if (next) {\n writeClipLayout(next, false);\n const inserted = next.find((clip) => clip.id === newId);\n if (inserted) {\n clipNode.properties = {\n ...clipNode.properties,\n track: inserted.track,\n start: `${inserted.start.toFixed(3)}s`,\n };\n }\n }\n }\n code = serializeProgram(ast);\n draggingAsset = null;\n dropTargetTime = null;\n dropTargetTrack = '';\n }\n\n function writeClipLayout(nextClips: Clip[], serialize = true) {\n if (!ast || !scene) return;\n for (const current of scene.clips) {\n const next = nextClips.find((clip) => clip.id === current.id);\n if (!next) continue;\n const node = clipNodeAt(scene.clips.findIndex((clip) => clip.id === current.id));\n if (!node) continue;\n node.properties = {\n ...node.properties,\n track: next.track,\n start: `${next.start.toFixed(3)}s`,\n duration: `${next.duration.toFixed(3)}s`,\n trimIn: `${next.trimIn.toFixed(3)}s`,\n trimOut: `${next.trimOut.toFixed(3)}s`,\n };\n }\n if (serialize) code = serializeProgram(ast);\n }\n\n function deleteClip(clipId: string) {\n if (!ast || !scene) return;\n const node = clipNodeAt(scene.clips.findIndex((clip) => clip.id === clipId));\n if (!node) return;\n detachClipTransitions(clipId);\n const next = removeClipFromTracks(scene.clips, clipId);\n writeClipLayout(next, false);\n ast.body.splice(ast.body.indexOf(node), 1);\n if (selectedElementId === clipId) selectedElementId = '';\n code = serializeProgram(ast);\n }\n\n function firstVisibleTime(id: string): number {\n return scene?.clips.find((clip) => clip.id === id)?.start ?? timelineRange(id).start;\n }\n\n function clipNodeAt(sceneIndex: number): ClipNode | null {\n if (!ast || sceneIndex < 0) return null;\n return ast.body.filter((node): node is ClipNode => node.type === 'Clip')[sceneIndex] ?? null;\n }\n\n function detachClipTransitions(clipId: string) {\n if (!scene) return;\n const related = transitionBoundaries.filter(\n (boundary) =>\n boundary.type !== null &&\n (boundary.outgoing.id === clipId || boundary.incoming.id === clipId)\n );\n const removed = removedClipTransitionProperties();\n for (const boundary of related) {\n const outgoingNode = clipNodeAt(\n scene.clips.findIndex((clip) => clip.id === boundary.outgoing.id)\n );\n const incomingNode = clipNodeAt(\n scene.clips.findIndex((clip) => clip.id === boundary.incoming.id)\n );\n if (!outgoingNode || !incomingNode) continue;\n const outgoingProperties = { ...outgoingNode.properties };\n const incomingProperties = { ...incomingNode.properties };\n for (const key of removed.outgoing) delete outgoingProperties[key];\n for (const key of removed.incoming) delete incomingProperties[key];\n outgoingNode.properties = outgoingProperties;\n incomingNode.properties = incomingProperties;\n }\n if (related.length > 0) selectedTransitionIds = null;\n }\n\n function trackNodeFor(track: Track): TrackNode | null {\n if (!ast) return null;\n const existing = ast.body.find(\n (node): node is TrackNode => node.type === 'Track' && node.name === track.id\n );\n if (existing) return existing;\n const node: TrackNode = {\n type: 'Track',\n name: track.id,\n properties: {\n label: track.label,\n role: track.role,\n content: track.content,\n hidden: track.hidden,\n muted: track.muted,\n order: track.order,\n },\n };\n const firstContent = ast.body.findIndex(\n (item) => item.type === 'Element' || item.type === 'Clip' || item.type === 'Animation'\n );\n ast.body.splice(firstContent < 0 ? ast.body.length : firstContent, 0, node);\n return node;\n }\n\n function ensureLayerTrack(trackId: string): Track {\n const existing = scene?.tracks.find((track) => track.id === trackId);\n if (existing?.declared) return existing;\n const elementRow = allTimelineRows.findIndex((row) => row.trackId === trackId);\n const track: Track = {\n id: trackId,\n label: existing?.label ?? `Layer ${trackId.replace(/^legacy-/, '')}`,\n role: existing?.role ?? 'overlay',\n content: existing?.content ?? 'mixed',\n hidden: existing?.hidden ?? false,\n muted: existing?.muted ?? false,\n order: elementRow < 0\n ? (existing?.order ?? Math.max(0, ...(scene?.tracks.map((item) => item.order) ?? [])) + 1)\n : 9000 + elementRow,\n declared: true,\n };\n trackNodeFor(track);\n return track;\n }\n\n function materializeTimelineLayers() {\n if (!ast) return;\n for (const row of allTimelineRows) {\n const track = ensureLayerTrack(row.trackId);\n for (const item of row.items) {\n const node = ast.body.find(\n (candidate): candidate is ElementNode =>\n candidate.type === 'Element' && candidate.name === item.element.id\n );\n if (node) node.properties = { ...node.properties, track: track.id };\n }\n }\n }\n\n function updateTrack(track: Track, updates: { hidden?: boolean; muted?: boolean }) {\n const node = trackNodeFor(track);\n if (!node || !ast) return;\n node.properties = { ...node.properties, ...updates };\n if (track.id === projectAudioTrack?.id && updates.muted !== undefined && audioElement) {\n audioElement.muted = updates.muted;\n }\n code = serializeProgram(ast);\n }\n\n function updateClip(clipId: string, updates: Record<string, string | number | boolean>) {\n if (!ast || !scene) return;\n const node = clipNodeAt(scene.clips.findIndex((clip) => clip.id === clipId));\n if (!node) return;\n if (['track', 'start', 'duration'].some((key) => key in updates)) {\n detachClipTransitions(clipId);\n }\n node.properties = { ...node.properties, ...updates };\n code = serializeProgram(ast);\n }\n\n function moveSelectedClipFromInspector(trackId: string, requestedStart: number) {\n if (!scene || !selectedClip) return;\n const targetTrack = ensureLayerTrack(trackId);\n const next = moveClipToTrack(\n scene.clips,\n selectedClip.id,\n targetTrack,\n requestedStart,\n totalDuration\n );\n if (next) writeClipLayout(next);\n }\n\n function resizeSelectedClipFromInspector(duration: number) {\n if (!scene || !selectedClip) return;\n const requestedEnd = selectedClip.start + Math.max(1 / scene.canvas.fps, duration);\n const next = trimClipOnTrack(\n scene.clips,\n selectedClip.id,\n 'end',\n requestedEnd,\n 1 / scene.canvas.fps\n );\n writeClipLayout(next);\n }\n\n function handleTransitionDragStart(event: DragEvent) {\n draggingTransition = 'crossfade';\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'copy';\n event.dataTransfer.setData('application/x-motionly-transition', 'crossfade');\n event.dataTransfer.setData('text/plain', 'Crossfade');\n }\n }\n\n function handleTransitionDragEnd() {\n draggingTransition = null;\n }\n\n function applyTransitionAtBoundary(\n boundary: ClipTransitionBoundary,\n duration = boundary.duration || 0.5\n ) {\n if (!ast || !scene) return;\n const transition = applyClipTransition(\n boundary.outgoing,\n boundary.incoming,\n duration,\n 1 / scene.canvas.fps\n );\n if (!transition) return;\n const outgoingNode = clipNodeAt(\n scene.clips.findIndex((clip) => clip.id === boundary.outgoing.id)\n );\n const incomingNode = clipNodeAt(\n scene.clips.findIndex((clip) => clip.id === boundary.incoming.id)\n );\n if (!outgoingNode || !incomingNode) return;\n outgoingNode.properties = {\n ...outgoingNode.properties,\n transitionOut: transition.outgoing.transitionOut,\n transitionOutDuration: `${transition.duration.toFixed(3)}s`,\n };\n incomingNode.properties = {\n ...incomingNode.properties,\n transitionIn: transition.incoming.transitionIn,\n transitionInDuration: `${transition.duration.toFixed(3)}s`,\n };\n selectedElementId = '';\n selectedTransitionIds = {\n outgoingId: boundary.outgoing.id,\n incomingId: boundary.incoming.id,\n };\n code = serializeProgram(ast);\n }\n\n function dropTransition(event: DragEvent, boundary: ClipTransitionBoundary) {\n event.preventDefault();\n event.stopPropagation();\n if (!draggingTransition) return;\n applyTransitionAtBoundary(boundary);\n draggingTransition = null;\n }\n\n function selectTransition(boundary: ClipTransitionBoundary) {\n if (!boundary.type) {\n applyTransitionAtBoundary(boundary);\n return;\n }\n selectedElementId = '';\n selectedTransitionIds = {\n outgoingId: boundary.outgoing.id,\n incomingId: boundary.incoming.id,\n };\n setTime(boundary.at);\n }\n\n function removeSelectedTransition() {\n if (!ast || !scene || !selectedTransition) return;\n const outgoingNode = clipNodeAt(\n scene.clips.findIndex((clip) => clip.id === selectedTransition.outgoing.id)\n );\n const incomingNode = clipNodeAt(\n scene.clips.findIndex((clip) => clip.id === selectedTransition.incoming.id)\n );\n if (!outgoingNode || !incomingNode) return;\n const removed = removedClipTransitionProperties();\n const outgoingProperties = { ...outgoingNode.properties };\n const incomingProperties = { ...incomingNode.properties };\n for (const key of removed.outgoing) delete outgoingProperties[key];\n for (const key of removed.incoming) delete incomingProperties[key];\n outgoingNode.properties = outgoingProperties;\n incomingNode.properties = incomingProperties;\n selectedTransitionIds = null;\n code = serializeProgram(ast);\n }\n\n function timelineLaneRect(trackId: string): DOMRect | null {\n const lane = document.querySelector<HTMLElement>(\n `.track-lane[data-track=\"${CSS.escape(trackId)}\"]`\n );\n return lane?.getBoundingClientRect() ?? null;\n }\n\n function laneTrackAtPoint(clientX: number, clientY: number): string | null {\n const hit = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n return hit?.closest<HTMLElement>('.track-lane[data-track]')?.dataset['track'] ?? null;\n }\n\n function updateClipDrag(pointer: PointerEvent) {\n if (!clipDrag || !scene) return;\n if (\n Math.abs(pointer.clientX - clipDrag.startClientX) > 3 ||\n Math.abs(pointer.clientY - clipDrag.startClientY) > 3\n ) clipDrag.moved = true;\n const targetTrackId = clipDrag.kind === 'audio'\n ? clipDrag.originTrackId\n : laneTrackAtPoint(pointer.clientX, pointer.clientY) ?? clipDrag.originTrackId;\n const rect = timelineLaneRect(targetTrackId);\n if (!rect) return;\n const pointerTime = ((pointer.clientX - rect.left) / rect.width) * totalDuration;\n const rawStart = Math.min(\n totalDuration,\n Math.max(0, snapTimelineTime(pointerTime - clipDrag.grabOffset, rect.width, clipDrag.id))\n );\n clipDrag = { ...clipDrag, ghostStart: rawStart, ghostTrackId: targetTrackId, valid: true };\n }\n\n function moveTimelineClip(event: PointerEvent, clip: Clip) {\n if (event.button !== 0 || !scene) return;\n event.preventDefault();\n event.stopPropagation();\n selectElement(clip.id, false);\n const rect = timelineLaneRect(String(clip.track));\n if (!rect) return;\n const grabTime = ((event.clientX - rect.left) / rect.width) * totalDuration;\n clipDrag = {\n id: clip.id,\n kind: 'clip',\n duration: clip.duration,\n grabOffset: grabTime - clip.start,\n originTrackId: String(clip.track),\n startClientX: event.clientX,\n startClientY: event.clientY,\n ghostStart: clip.start,\n ghostTrackId: String(clip.track),\n valid: true,\n moved: false,\n };\n try {\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n } catch {\n /* pointer capture is best-effort */\n }\n const move = (pointer: PointerEvent) => updateClipDrag(pointer);\n const stop = (pointer: PointerEvent) => {\n updateClipDrag(pointer);\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', stop);\n window.removeEventListener('pointercancel', stop);\n commitClipDrag();\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', stop);\n window.addEventListener('pointercancel', stop);\n }\n\n function commitClipDrag() {\n const drag = clipDrag;\n clipDrag = null;\n if (!drag || !scene || !drag.moved || !drag.valid) return;\n if (drag.kind === 'audio') {\n const node = ast?.body.find((candidate): candidate is AudioNode => candidate.type === 'Audio');\n if (!node || !ast) return;\n node.properties = { ...node.properties, start: `${drag.ghostStart.toFixed(3)}s` };\n code = serializeProgram(ast);\n return;\n }\n materializeTimelineLayers();\n if (drag.kind === 'clip') {\n const targetTrack = ensureLayerTrack(drag.ghostTrackId);\n beginHistoryGesture();\n detachClipTransitions(drag.id);\n const next = moveClipToTrack(\n scene.clips,\n drag.id,\n targetTrack,\n drag.ghostStart,\n totalDuration\n );\n if (next) writeClipLayout(next);\n endHistoryGesture();\n return;\n }\n commitElementDrag(\n drag.id,\n drag.ghostStart,\n drag.ghostStart + drag.duration,\n drag.ghostTrackId\n );\n }\n\n function commitElementDrag(\n id: string,\n start: number,\n end: number,\n trackId: string\n ) {\n if (!ast || !scene) return;\n const node = ast.body.find(\n (item): item is ElementNode => item.type === 'Element' && item.name === id\n );\n if (!node) return;\n const targetTrack = ensureLayerTrack(trackId);\n beginHistoryGesture();\n const previousStart = timelineRange(id).start;\n if (selectedElement?.id === id) materializeSelectedAnimation();\n moveElementClip(ast, id, start, end, previousStart, 1 / scene.canvas.fps);\n node.properties = {\n ...node.properties,\n track: targetTrack.id,\n };\n code = serializeProgram(ast);\n endHistoryGesture();\n }\n\n function moveTimelineElement(event: PointerEvent, element: Element) {\n if (event.button !== 0 || !ast || !scene) return;\n event.preventDefault();\n event.stopPropagation();\n selectElement(element.id, false);\n const node = ast.body.find(\n (item): item is ElementNode => item.type === 'Element' && item.name === element.id\n );\n if (!node) return;\n const range = timelineRange(element.id);\n const duration = range.end - range.start;\n // Use the element's actual rendered lane as the drag origin. Never mutate\n // the project here — that mid-gesture re-render would abort the drag.\n const originLane = (event.currentTarget as HTMLElement).closest<HTMLElement>('.track-lane[data-track]');\n const originTrackId =\n originLane?.dataset['track'] ??\n String(node.properties['track'] ?? scene.tracks.find((track) => track.role === 'overlay')?.id ?? defaultMainTrack);\n const rect = originLane?.getBoundingClientRect() ?? timelineLaneRect(originTrackId);\n if (!rect) return;\n const grabTime = ((event.clientX - rect.left) / rect.width) * totalDuration;\n clipDrag = {\n id: element.id,\n kind: 'element',\n duration,\n grabOffset: grabTime - range.start,\n originTrackId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n ghostStart: range.start,\n ghostTrackId: originTrackId,\n valid: true,\n moved: false,\n };\n try {\n (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);\n } catch {\n /* pointer capture is best-effort */\n }\n const move = (pointer: PointerEvent) => updateClipDrag(pointer);\n const stop = (pointer: PointerEvent) => {\n updateClipDrag(pointer);\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', stop);\n window.removeEventListener('pointercancel', stop);\n commitClipDrag();\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', stop);\n window.addEventListener('pointercancel', stop);\n }\n\n function moveTimelineAudio(event: PointerEvent) {\n if (event.button !== 0 || !scene || !projectAudioTrack) return;\n event.preventDefault();\n event.stopPropagation();\n const lane = (event.currentTarget as HTMLElement).closest<HTMLElement>('.track-lane[data-track]');\n const rect = lane?.getBoundingClientRect();\n if (!rect) return;\n const grabTime = ((event.clientX - rect.left) / rect.width) * totalDuration;\n clipDrag = {\n id: '__audio__',\n kind: 'audio',\n duration: audioDuration || totalDuration,\n grabOffset: grabTime - scene.audioStart,\n originTrackId: projectAudioTrack.id,\n startClientX: event.clientX,\n startClientY: event.clientY,\n ghostStart: scene.audioStart,\n ghostTrackId: projectAudioTrack.id,\n valid: true,\n moved: false,\n };\n const move = (pointer: PointerEvent) => updateClipDrag(pointer);\n const stop = (pointer: PointerEvent) => {\n updateClipDrag(pointer);\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', stop);\n window.removeEventListener('pointercancel', stop);\n commitClipDrag();\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', stop);\n window.addEventListener('pointercancel', stop);\n }\n\n function trimTimelineClip(event: PointerEvent, clip: Clip, edge: 'start' | 'end') {\n if (event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n selectElement(clip.id, false);\n const lane = (event.currentTarget as HTMLElement).closest<HTMLElement>('.track-lane');\n if (!lane) return;\n beginHistoryGesture();\n const rect = lane.getBoundingClientRect();\n const minimum = 1 / (scene?.canvas.fps ?? 60);\n const move = (pointer: PointerEvent) => {\n const raw = ((pointer.clientX - rect.left) / rect.width) * totalDuration;\n const time = snapTimelineTime(raw, rect.width, clip.id);\n if (!scene) return;\n const next = trimClipOnTrack(\n scene.clips,\n clip.id,\n edge,\n time,\n minimum\n );\n writeClipLayout(next);\n };\n const stop = () => {\n endHistoryGesture();\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', stop);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', stop);\n }\n\n function splitSelectedClip() {\n if (!ast || !scene) return;\n if (selectedClip) {\n const sceneIndex = scene.clips.findIndex((clip) => clip.id === selectedClip.id);\n const node = clipNodeAt(sceneIndex);\n const result = splitClip(selectedClip as ClipTiming, currentTime, 1 / scene.canvas.fps);\n if (!node || !result) return;\n detachClipTransitions(selectedClip.id);\n const [left, right] = result;\n const originalProperties = { ...node.properties };\n const timingProperties = (timing: ClipTiming) => ({\n start: `${timing.start.toFixed(3)}s`,\n duration: `${timing.duration.toFixed(3)}s`,\n trimIn: `${timing.trimIn.toFixed(3)}s`,\n trimOut: `${timing.trimOut.toFixed(3)}s`,\n });\n node.properties = { ...originalProperties, ...timingProperties(left) };\n const rightNode: ClipNode = {\n type: 'Clip',\n assetName: node.assetName,\n properties: { ...originalProperties, ...timingProperties(right) },\n };\n ast.body.splice(ast.body.indexOf(node) + 1, 0, rightNode);\n code = serializeProgram(ast);\n return;\n }\n\n if (!selectedElement) return;\n const range = timelineRange(selectedElement.id);\n let rightId = `${selectedElement.id}_split`;\n let suffix = 2;\n const names = new Set(\n ast.body.filter((node): node is ElementNode => node.type === 'Element').map((node) => node.name)\n );\n while (names.has(rightId)) rightId = `${selectedElement.id}_split_${suffix++}`;\n const result = splitElementClip(\n ast,\n selectedElement.id,\n currentTime,\n range,\n rightId,\n 1 / scene.canvas.fps\n );\n if (!result) return;\n ast = result.program;\n selectedElementId = result.rightId;\n code = serializeProgram(ast);\n }\n\n function timelineTimeAt(clientX: number, rect: DOMRect): number {\n const raw = ((clientX - rect.left) / rect.width) * totalDuration;\n return snapTimelineTime(raw, rect.width);\n }\n\n function snapTimelineTime(raw: number, width: number, excludeClipId = ''): number {\n const clamped = Math.max(0, Math.min(totalDuration, raw));\n const fps = scene?.canvas.fps ?? 60;\n const frameTime = Math.round(clamped * fps) / fps;\n if (!snapEnabled) return frameTime;\n const candidates = [0, totalDuration, currentTime];\n for (const clip of scene?.clips ?? []) {\n if (clip.id === excludeClipId) continue;\n candidates.push(clip.start, clip.start + clip.duration);\n }\n for (const row of allTimelineRows) {\n for (const item of row.items) candidates.push(item.range.start, item.range.end);\n }\n const nearest = candidates.reduce((best, value) =>\n Math.abs(value - clamped) < Math.abs(best - clamped) ? value : best, 0);\n return Math.abs(nearest - clamped) <= (totalDuration * 8) / Math.max(1, width) ? nearest : frameTime;\n }\n\n function setTimelineZoom(nextZoom: number, anchorViewportX?: number) {\n const oldWidth = timelineScroll?.scrollWidth ?? timelineContentWidth;\n const viewportWidth = timelineScroll?.clientWidth ?? oldWidth;\n const anchor = anchorViewportX ?? viewportWidth / 2;\n const oldScroll = timelineScroll?.scrollLeft ?? 0;\n timelineZoom = clampTimelineZoom(nextZoom);\n requestAnimationFrame(() => {\n if (!timelineScroll) return;\n timelineScroll.scrollLeft = anchoredTimelineScroll(\n oldScroll,\n anchor,\n oldWidth,\n timelineScroll.scrollWidth,\n viewportWidth\n );\n });\n }\n\n function handleTimelineWheel(event: WheelEvent) {\n if (!event.ctrlKey && !event.metaKey) return;\n event.preventDefault();\n const rect = timelineScroll.getBoundingClientRect();\n setTimelineZoom(timelineZoom * Math.exp(-event.deltaY * 0.002), event.clientX - rect.left);\n }\n\n function timelineTrackDisplayOrder(\n track: Track | null | undefined,\n trackId: string\n ): number {\n if (track?.role === 'audio') return 1_000_000;\n if (track) return track.order;\n const elementRow = allTimelineRows.findIndex((row) => row.trackId === trackId);\n return elementRow < 0 ? 9000 : 9000 + elementRow;\n }\n\n function timelineLaneLabel(row: TimelineLane): string {\n if (row.kind === 'text') return 'Text';\n if (row.kind === 'asset') return 'Images & video';\n if (row.kind === 'overlay') return 'Scenes';\n return 'Effects';\n }\n\n function elementCenter(element: Element | EvaluatedElement): { x: number; y: number } {\n const centered = isCentered(element);\n return {\n x: (centered ? canvasWidth / 2 : 0) + numericProperty(element, 'x', 0),\n y: (centered ? canvasHeight / 2 : 0) + numericProperty(element, 'y', 0),\n };\n }\n\n function elementBounds(element: Element | EvaluatedElement): { x: number; y: number; width: number; height: number } {\n if (element.kind === 'overlay' || element.kind === 'effect') {\n return { x: 0, y: 0, width: canvasWidth, height: canvasHeight };\n }\n const center = elementCenter(element);\n const scale = numericProperty(element, 'scale', 1);\n const width = estimateElementWidth(element) * scale;\n const height = estimateElementHeight(element) * scale;\n return {\n x: center.x - width / 2,\n y: center.y - height / 2,\n width,\n height,\n };\n }\n\n function selectedBounds(): { x: number; y: number; width: number; height: number } | null {\n if (!currentFrame || !selectedElementId) return null;\n const matches = currentFrame.elements.filter((element) => element.id === selectedElementId || propertiesOf(element)['textGroup'] === selectedElementId);\n if (!matches.length) return null;\n const visible = matches.filter((element) => Number(propertiesOf(element)['opacity'] ?? 1) > 0.001);\n const boxes = (visible.length ? visible : matches).map(elementBounds);\n const x = Math.min(...boxes.map((box) => box.x));\n const y = Math.min(...boxes.map((box) => box.y));\n const right = Math.max(...boxes.map((box) => box.x + box.width));\n const bottom = Math.max(...boxes.map((box) => box.y + box.height));\n return { x, y, width: right - x, height: bottom - y };\n }\n\n function estimateElementWidth(element: Element | EvaluatedElement): number {\n const explicit = numericProperty(element, 'width', 0);\n if (explicit > 0) return explicit;\n if (element.kind === 'text') {\n return Math.max(80, stringProperty(element, 'value', '').length * numericProperty(element, 'size', 64) * 0.52);\n }\n const asset = element.assetName ? assets.get(element.assetName) : null;\n return asset?.width ?? 200;\n }\n\n function estimateElementHeight(element: Element | EvaluatedElement): number {\n const explicit = numericProperty(element, 'height', 0);\n if (explicit > 0) return explicit;\n if (element.kind === 'text') return numericProperty(element, 'size', 64) * 1.2;\n const width = numericProperty(element, 'width', 0);\n const asset = element.assetName ? assets.get(element.assetName) : null;\n if (asset && width > 0) return asset.height * (width / asset.width);\n return asset?.height ?? 120;\n }\n\n function isCentered(element: Element | EvaluatedElement): boolean {\n return Boolean(propertiesOf(element)['center']);\n }\n\n function selectedAnimationAst(): AnimationNode | null {\n if (!ast || !selectedElement) return null;\n return ast.body.find(\n (node): node is AnimationNode => node.type === 'Animation' && node.target === selectedElement.id\n ) ?? null;\n }\n\n // GSAP easing options offered per keyframe.\n const KEYFRAME_EASINGS = [\n { value: 'linear', label: 'Linear' },\n { value: 'power1.in', label: 'Ease In' },\n { value: 'power1.out', label: 'Ease Out' },\n { value: 'power1.inOut', label: 'Ease In-Out' },\n { value: 'power3.out', label: 'Smooth Out' },\n { value: 'power3.inOut', label: 'Smooth In-Out' },\n { value: 'back.out', label: 'Back Out' },\n { value: 'elastic.out', label: 'Elastic Out' },\n ] as const;\n\n // Markers shown on the selected element's row. Explicit `animate` blocks show\n // their real keyframes; preset-driven animations (animation/textAnimation)\n // surface their compiled start/end (or keyframes) so every animated element\n // shows editable keyframes.\n function selectedKeyframeMarkers(): { offset: number; easing?: string }[] {\n const node = selectedAnimationAst();\n if (node?.keyframes?.length)\n return node.keyframes.map((frame) => ({ offset: frame.offset, easing: frame.easing }));\n if (node) {\n const animated =\n Object.keys(node.from ?? {}).length > 0 || Object.keys(node.to ?? {}).length > 0;\n if (animated) return [{ offset: 0 }, { offset: 1 }];\n }\n // Preset-driven animation compiled into the scene graph.\n if (selectedAnimation) {\n if (selectedAnimation.keyframes?.length)\n return selectedAnimation.keyframes.map((frame) => ({\n offset: frame.offset,\n easing: frame.easing,\n }));\n return [{ offset: 0 }, { offset: 1 }];\n }\n return [];\n }\n\n /**\n * Return an editable `animate` AST node for the selected element, converting a\n * preset (animation/textAnimation) into explicit keyframes on first edit so\n * timing and easing changes persist. Conversion is intentionally best-effort.\n */\n function materializeSelectedAnimation(): AnimationNode | null {\n if (!ast || !selectedElement) return null;\n const existing = selectedAnimationAst();\n if (existing) return existing;\n const compiled = selectedAnimation;\n if (!compiled) return null;\n const created: AnimationNode = {\n type: 'Animation',\n target: selectedElement.id,\n from: { ...(compiled.from ?? {}) },\n to: { ...(compiled.to ?? {}) },\n keyframes: (compiled.keyframes ?? []).map((frame) => ({\n offset: frame.offset,\n properties: { ...frame.properties },\n ...(frame.easing ? { easing: frame.easing } : {}),\n })),\n delay: compiled.delay ?? 0,\n duration: compiled.duration ?? 1,\n easing: compiled.easing ?? 'power3.out',\n };\n const elementNode = ast.body.find(\n (candidate): candidate is ElementNode =>\n candidate.type === 'Element' && candidate.name === selectedElement!.id\n );\n if (elementNode) {\n const props = { ...elementNode.properties };\n delete props['animation'];\n delete props['textAnimation'];\n elementNode.properties = props;\n }\n ast.body.push(created);\n return created;\n }\n\n /** Convert a from/to animation into explicit keyframes so edits persist. */\n function ensureSeededKeyframes(node: AnimationNode): void {\n if (!node.keyframes?.length) node.keyframes = seedKeyframes(node.keyframes, node.from, node.to);\n }\n\n function keyframeEasingAt(offset: number | null): string {\n if (offset === null) return '';\n const frame = selectedAnimationAst()?.keyframes?.find(\n (candidate) => Math.abs(candidate.offset - offset) < 1e-6\n );\n return frame?.easing ?? '';\n }\n\n function setSelectedKeyframeEasing(value: string) {\n const node = materializeSelectedAnimation();\n if (!ast || !node || selectedKeyframeOffset === null) return;\n ensureSeededKeyframes(node);\n node.keyframes = setKeyframeEasing(node.keyframes ?? [], selectedKeyframeOffset, value);\n code = serializeProgram(ast);\n }\n\n function deleteKeyframeAt(event: Event, offset: number) {\n event.preventDefault();\n event.stopPropagation();\n const node = selectedAnimationAst();\n if (!ast || !node?.keyframes?.length) return;\n node.keyframes = removeKeyframe(node.keyframes, offset);\n if (selectedKeyframeOffset !== null && Math.abs(selectedKeyframeOffset - offset) < 1e-6)\n selectedKeyframeOffset = null;\n code = serializeProgram(ast);\n }\n\n $: selectedKeyframeEasingValue =\n code && selectedKeyframeOffset !== null ? keyframeEasingAt(selectedKeyframeOffset) : '';\n\n function keyframeTime(offset: number): number {\n return (selectedAnimation?.delay ?? 0) + offset * (selectedAnimation?.duration ?? 1);\n }\n\n function capturedKeyframeProperties(keys?: string[]): Record<string, unknown> {\n const evaluated = currentFrame?.elements.find((element) => element.id === selectedElement?.id);\n const source = evaluated ? propertiesOf(evaluated) : selectedElement ? propertiesOf(selectedElement) : {};\n const defaults = ['x', 'y', 'scale', 'rotation', 'opacity', 'blur'];\n const names = keys?.length ? keys : defaults;\n return Object.fromEntries(\n names\n .filter((key) => typeof source[key] === 'number' || typeof source[key] === 'string')\n .map((key) => [key, source[key]])\n );\n }\n\n function addKeyframeAtPlayhead() {\n if (!ast || !selectedElement) return;\n let node = materializeSelectedAnimation();\n if (!node) {\n const base = capturedKeyframeProperties();\n node = {\n type: 'Animation',\n target: selectedElement.id,\n from: {},\n to: {},\n keyframes: [\n { offset: 0, properties: { ...base } },\n { offset: 1, properties: { ...base } },\n ],\n delay: 0,\n duration: totalDuration,\n easing: 'power3.out',\n };\n ast.body.push(node);\n } else {\n node.keyframes = seedKeyframes(node.keyframes, node.from, node.to);\n }\n const delay = selectedAnimation?.delay ?? Number(node.delay ?? 0);\n const duration = selectedAnimation?.duration ?? (Number(node.duration ?? totalDuration) || totalDuration);\n const offset = Math.min(1, Math.max(0, (currentTime - delay) / Math.max(duration, 1e-6)));\n const propertyKeys = Array.from(\n new Set((node.keyframes ?? []).flatMap((frame) => Object.keys(frame.properties)))\n );\n node.keyframes = upsertKeyframe(\n node.keyframes ?? [],\n offset,\n capturedKeyframeProperties(propertyKeys)\n );\n node.from = {};\n node.to = {};\n selectedKeyframeOffset = offset;\n code = serializeProgram(ast);\n }\n\n function deleteSelectedKeyframe() {\n const node = selectedAnimationAst();\n if (!node || selectedKeyframeOffset === null) return;\n node.keyframes = removeKeyframe(node.keyframes ?? [], selectedKeyframeOffset);\n selectedKeyframeOffset = null;\n code = serializeProgram(ast!);\n }\n\n function dragKeyframeMarker(event: PointerEvent, offset: number) {\n if (event.button !== 0 || !selectedAnimation) return;\n event.preventDefault();\n event.stopPropagation();\n const lane = (event.currentTarget as HTMLElement).closest<HTMLElement>('.track-lane');\n if (!lane) return;\n // Materialize preset/from-to animations into real keyframes before editing.\n const seedNode = materializeSelectedAnimation();\n if (seedNode && !seedNode.keyframes?.length) {\n ensureSeededKeyframes(seedNode);\n }\n code = serializeProgram(ast!);\n const rect = lane.getBoundingClientRect();\n const animationDelay = selectedAnimation.delay;\n const animationDuration = selectedAnimation.duration;\n let previousOffset = offset;\n selectedKeyframeOffset = offset;\n setTime(keyframeTime(offset));\n const move = (pointer: PointerEvent) => {\n const raw = ((pointer.clientX - rect.left) / rect.width) * totalDuration;\n const snappedTime = snapTimelineTime(raw, rect.width);\n const nextOffset = Math.min(\n 1,\n Math.max(0, (snappedTime - animationDelay) / Math.max(animationDuration, 1e-6))\n );\n const node = selectedAnimationAst();\n if (!node) return;\n node.keyframes = moveKeyframe(node.keyframes ?? [], previousOffset, nextOffset);\n previousOffset = nextOffset;\n selectedKeyframeOffset = nextOffset;\n code = serializeProgram(ast!);\n };\n const stop = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', stop);\n window.removeEventListener('pointercancel', stop);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', stop);\n window.addEventListener('pointercancel', stop);\n }\n\n function updateAnimationProperty(key: keyof AnimationNode, value: string | number) {\n if (!ast || !selectedElement) return;\n const node = ensureAnimationNode(ast, selectedElement.id);\n (node as unknown as Record<string, unknown>)[key] = value;\n code = serializeProgram(ast);\n }\n\n function addTextElement() {\n if (!ast) return;\n const name = nextElementName('text');\n ast.body.push({\n type: 'Element',\n kind: 'text',\n name,\n properties: {\n value: 'New text',\n center: true,\n y: (scene?.elements.length ?? 0) * 80,\n size: 64,\n color: '#ffffff',\n opacity: 1,\n start: '0s',\n duration: `${totalDuration.toFixed(3)}s`,\n track: defaultMainTrack,\n },\n });\n selectedElementId = name;\n code = serializeProgram(ast);\n }\n\n function applyPreset(preset: string) {\n if (!ast || !selectedElement) return;\n ast.body = ast.body.filter(\n (item) => !(item.type === 'Animation' && item.target === selectedElement!.id)\n );\n if (preset !== 'none') {\n const node = ensureAnimationNode(ast, selectedElement.id);\n if (preset === 'fade') {\n node.from = { opacity: 0 };\n node.to = { opacity: numericProperty(selectedElement, 'opacity', 1) };\n }\n if (preset === 'rise') {\n node.from = { opacity: 0, y: numericProperty(selectedElement, 'y', 0) + 80 };\n node.to = { opacity: numericProperty(selectedElement, 'opacity', 1), y: numericProperty(selectedElement, 'y', 0) };\n }\n if (preset === 'scale') {\n node.from = { opacity: 0, scale: 0.85 };\n node.to = { opacity: numericProperty(selectedElement, 'opacity', 1), scale: numericProperty(selectedElement, 'scale', 1) };\n }\n if (preset === 'blur') {\n node.from = { opacity: 0, blur: 12, y: numericProperty(selectedElement, 'y', 0) + 24 };\n node.to = { opacity: numericProperty(selectedElement, 'opacity', 1), blur: 0, y: numericProperty(selectedElement, 'y', 0) };\n }\n if (preset === 'drift') {\n node.from = { opacity: 0, x: numericProperty(selectedElement, 'x', 0) - 90 };\n node.to = { opacity: numericProperty(selectedElement, 'opacity', 1), x: numericProperty(selectedElement, 'x', 0) };\n }\n node.duration = selectedAnimation?.duration ?? 1;\n node.delay = selectedAnimation?.delay ?? 0;\n node.easing = selectedAnimation?.easing ?? 'power3.out';\n }\n code = serializeProgram(ast);\n }\n\n function isBasicPreset(preset: string): boolean {\n const from = selectedAnimation?.from;\n if (!from) return false;\n if (preset === 'fade') return from['opacity'] === 0 && from['y'] === undefined && from['scale'] === undefined && from['blur'] === undefined && from['x'] === undefined;\n if (preset === 'rise') return from['opacity'] === 0 && typeof from['y'] === 'number';\n if (preset === 'scale') return from['opacity'] === 0 && from['scale'] === 0.85;\n if (preset === 'blur') return typeof from['blur'] === 'number' && from['blur'] > 0;\n if (preset === 'drift') return typeof from['x'] === 'number';\n return false;\n }\n\n function canApplyLibraryPreset(preset: AnimationPresetDef): boolean {\n if (preset.category === 'camera') return true;\n if (!selectedElement) return false;\n if (preset.category === 'text') return selectedElement.kind === 'text';\n if (preset.category === 'object') return selectedElement.kind === 'asset';\n return selectedElement.kind === 'asset' || selectedElement.kind === 'overlay';\n }\n\n function applyLibraryPreset(preset: AnimationPresetDef) {\n if (!ast || !canApplyLibraryPreset(preset)) return;\n if (preset.category === 'camera') {\n let camera = ast.body.find((node): node is CameraNode => node.type === 'Camera');\n if (!camera) {\n camera = { type: 'Camera', properties: {} };\n ast.body.push(camera);\n }\n camera.properties = { ...camera.properties, cameraAnimation: `${preset.name}(duration 1s ease power3.out)` };\n } else if (selectedElement) {\n const node = ast.body.find((item): item is ElementNode => item.type === 'Element' && item.name === selectedElement.id);\n if (!node) return;\n const key = preset.category === 'text' ? 'textAnimation' : 'animation';\n node.properties = { ...node.properties, [key]: `${preset.name}(duration 800ms ease power3.out)` };\n }\n code = serializeProgram(ast);\n }\n\n function ensureAnimationNode(program: ProgramNode, target: string): AnimationNode {\n const existing = program.body.find(\n (item): item is AnimationNode => item.type === 'Animation' && item.target === target\n );\n if (existing) return existing;\n const node: AnimationNode = {\n type: 'Animation',\n target,\n from: { opacity: 0 },\n to: { opacity: 1 },\n keyframes: [],\n delay: 0,\n duration: 1,\n easing: 'soft',\n };\n program.body.push(node);\n return node;\n }\n\n function nextElementName(prefix: string): string {\n const names = new Set(scene?.elements.map((element) => element.id) ?? []);\n let index = names.size + 1;\n let name = `${prefix}${index}`;\n while (names.has(name)) {\n index += 1;\n name = `${prefix}${index}`;\n }\n return name;\n }\n\n</script>\n\n<div class=\"motion-editor\" class:fullscreen={isFullscreen} style={`--timeline-height: ${timelineHeight}px`}>\n <div class=\"workbench\" class:chat-open={showAiChat}>\n <!-- Navigation Rail -->\n <nav class=\"nav-rail\">\n <button \n type=\"button\" \n class=\"nav-item\" \n class:active={activeNavTab === 'media'}\n on:click={() => activeNavTab = 'media'}\n title=\"Media / Assets\"\n >\n <FolderOpen size={20} />\n </button>\n <button \n type=\"button\" \n class=\"nav-item\" \n class:active={activeNavTab === 'audio'}\n on:click={() => activeNavTab = 'audio'}\n title=\"Audio\"\n >\n <Headphones size={20} />\n </button>\n <button \n type=\"button\" \n class=\"nav-item\" \n class:active={activeNavTab === 'text'}\n on:click={() => activeNavTab = 'text'}\n title=\"Text\"\n >\n <Type size={20} />\n </button>\n <button \n type=\"button\" \n class=\"nav-item\" \n class:active={activeNavTab === 'effects'}\n on:click={() => activeNavTab = 'effects'}\n title=\"Effects\"\n >\n <Wand2 size={20} />\n </button>\n <button \n type=\"button\" \n class=\"nav-item\" \n class:active={activeNavTab === 'scenes'}\n on:click={() => activeNavTab = 'scenes'}\n title=\"Scenes\"\n >\n <Layers3 size={20} />\n </button>\n <button \n type=\"button\" \n class=\"nav-item\" \n class:active={activeNavTab === 'ai'}\n on:click={() => activeNavTab = 'ai'}\n title=\"AI Config\"\n >\n <Bot size={20} />\n </button>\n <button \n type=\"button\" \n class=\"nav-item\" \n class:active={activeNavTab === 'settings'}\n on:click={() => activeNavTab = 'settings'}\n title=\"Settings\"\n >\n <Settings size={20} />\n </button>\n </nav>\n\n <!-- Assets/Content Panel -->\n <aside class=\"content-panel\">\n {#if activeNavTab === 'media'}\n <div class=\"panel-header\">\n <div class=\"panel-tabs\">\n <button \n type=\"button\" \n class=\"panel-tab\" \n class:active={mediaSubTab === 'assets'}\n on:click={() => mediaSubTab = 'assets'}\n >\n Assets\n </button>\n <button \n type=\"button\" \n class=\"panel-tab\" \n class:active={mediaSubTab === 'presets'}\n on:click={() => mediaSubTab = 'presets'}\n >\n Presets\n </button>\n </div>\n {#if mediaSubTab === 'assets'}\n <div class=\"panel-header-actions\">\n <input bind:this={assetInput} class=\"file-input\" type=\"file\" accept=\"image/*,video/mp4,video/webm,.svg,.mp4,.webm,.m4v\" multiple on:change={handleAssetUpload} />\n </div>\n {/if}\n </div>\n <div class=\"panel-content\">\n {#if mediaSubTab === 'assets'}\n <div\n class=\"media-dropzone\"\n class:drag-active={isDraggingUpload}\n role=\"region\"\n aria-label=\"Import media by dropping files\"\n on:dragenter={handleAssetFileDrag}\n on:dragover|preventDefault={handleAssetFileDrag}\n on:dragleave={handleAssetFileDragLeave}\n on:drop={handleAssetFileDrop}\n >\n {#if assetError}<p class=\"asset-error\">{assetError}</p>{/if}\n <div class=\"media-drop-prompt\">\n <button type=\"button\" class=\"import-media-button\" on:click={() => assetInput.click()}>\n <Upload size={15} />\n Import media\n </button>\n <span>or drag & drop from your device</span>\n <small>Images, SVG, MP4, and WebM</small>\n </div>\n <!-- Audio Section -->\n {#if scene?.audio}\n <div class=\"asset-folder\">\n <div class=\"folder-header\">\n <Music2 size={14} />\n <span class=\"folder-title\">Audio</span>\n </div>\n <div class=\"folder-content\">\n <div class=\"asset-item\">\n <div class=\"asset-item-icon\">\n <Music2 size={16} />\n </div>\n <div class=\"asset-item-info\">\n <div class=\"asset-item-name\">{scene.audio.substring(scene.audio.lastIndexOf('/') + 1)}</div>\n <div class=\"asset-item-path\">{scene.audio}</div>\n </div>\n </div>\n </div>\n </div>\n {/if}\n\n <!-- Visual Assets Section -->\n {#if scene && scene.imports.length > 0}\n <div class=\"asset-folder\">\n <div class=\"folder-header\">\n <FileImage size={14} />\n <span class=\"folder-title\">Media</span>\n <span class=\"folder-count\">{scene.imports.length}</span>\n </div>\n <div class=\"asset-grid\">\n {#each scene.imports as asset}\n <button\n type=\"button\"\n class=\"asset-card\"\n draggable=\"true\"\n on:click={() => previewAssetOnly(asset)}\n on:dragstart={(e) => handleAssetDragStart(e, asset)}\n on:dragend={handleAssetDragEnd}\n >\n <div class=\"asset-thumbnail\">\n {#if asset.type === 'video'}\n <video src={assets.get(asset.name)?.src ?? asset.path} muted playsinline preload=\"metadata\"></video>\n {:else if asset.path}\n <img src={assets.get(asset.name)?.src ?? asset.path} alt={asset.name} />\n {:else}\n <FileImage size={24} />\n {/if}\n </div>\n <div class=\"asset-info\">\n <div class=\"asset-name\">{asset.name}</div>\n </div>\n </button>\n {/each}\n </div>\n </div>\n {/if}\n\n <!-- Empty State -->\n {#if !scene?.audio && scene?.imports.length === 0}\n <p class=\"empty-state\">Imported media will stay here until you drag it onto the timeline.</p>\n {/if}\n </div>\n {:else if mediaSubTab === 'presets'}\n <div class=\"preset-grid\">\n {#each availablePresets as preset}\n <button\n type=\"button\"\n class=\"preset-card\"\n on:click={() => requestPresetLoad(preset.path)}\n >\n <div class=\"preset-thumbnail\">\n <img src={preset.gifPath} alt={preset.name} />\n </div>\n <div class=\"preset-info\">\n <div class=\"preset-name\">{preset.name}</div>\n </div>\n </button>\n {/each}\n </div>\n {/if}\n </div>\n {:else if activeNavTab === 'audio'}\n <div class=\"panel-header\">\n <h3 class=\"panel-heading-title\">Audio</h3>\n <div class=\"panel-header-actions\">\n <button type=\"button\" class=\"header-icon-btn\" on:click={() => audioInput.click()} title=\"Import audio\">\n <Upload size={16} />\n </button>\n </div>\n </div>\n <div class=\"panel-content\">\n {#if audioName}\n <div class=\"audio-item\">\n <Music2 size={18} />\n <span>{audioName}</span>\n <button class=\"icon-btn\" on:click={removeAudio} title=\"Remove audio\"><Trash2 size={14} /></button>\n </div>\n {:else}\n <p class=\"empty-state\">No audio attached</p>\n {/if}\n </div>\n {:else if activeNavTab === 'text'}\n <div class=\"panel-header\">\n <h3 class=\"panel-heading-title\">Text</h3>\n <div class=\"panel-header-actions\">\n <button type=\"button\" class=\"header-icon-btn\" on:click={addTextElement} title=\"Add text\">\n <Plus size={16} />\n </button>\n </div>\n </div>\n <div class=\"panel-content\">\n <div class=\"layer-list\">\n {#each sourceElements.filter(el => el.kind === 'text') as element}\n <button\n type=\"button\"\n class=\"layer-row\"\n class:selected={selectedElementId === element.id}\n on:click={() => selectElement(element.id)}\n >\n <span class=\"layer-icon\">\n <Type size={14} />\n </span>\n <span class=\"layer-copy\">\n <strong>{element.id}</strong>\n <small>{elementDetail(element)}</small>\n </span>\n </button>\n {/each}\n </div>\n </div>\n {:else if activeNavTab === 'effects'}\n <div class=\"panel-header\">\n <h3 class=\"panel-heading-title\">Effects</h3>\n </div>\n <div class=\"panel-content\">\n <div class=\"effects-categories\">\n <div class=\"effects-category\">\n <div class=\"category-title\">Text Effects</div>\n <div class=\"effects-list\">\n {#each ANIMATION_PRESETS.filter(p => p.category === 'text') as preset}\n <button type=\"button\" class=\"effect-item\" title={preset.description} disabled={!canApplyLibraryPreset(preset)} on:click={() => applyLibraryPreset(preset)}>\n <Sparkles size={14} />\n <span>{preset.name}</span>\n </button>\n {/each}\n </div>\n </div>\n <div class=\"effects-category\">\n <div class=\"category-title\">Object Effects</div>\n <div class=\"effects-list\">\n {#each ANIMATION_PRESETS.filter(p => p.category === 'object') as preset}\n <button type=\"button\" class=\"effect-item\" title={preset.description} disabled={!canApplyLibraryPreset(preset)} on:click={() => applyLibraryPreset(preset)}>\n <Sparkles size={14} />\n <span>{preset.name}</span>\n </button>\n {/each}\n </div>\n </div>\n <div class=\"effects-category\">\n <div class=\"category-title\">Clip Transitions</div>\n <p class=\"category-hint\">Drag onto a cut between two touching clips.</p>\n <div class=\"effects-list\">\n <button\n type=\"button\"\n class=\"effect-item transition-effect-item\"\n draggable=\"true\"\n title=\"Fade the outgoing clip into the incoming clip\"\n on:dragstart={handleTransitionDragStart}\n on:dragend={handleTransitionDragEnd}\n >\n <Wand2 size={14} />\n <span><strong>Crossfade</strong><small>Fade both clips</small></span>\n </button>\n </div>\n </div>\n <div class=\"effects-category\">\n <div class=\"category-title\">Scene Transitions</div>\n <div class=\"effects-list\">\n {#each ANIMATION_PRESETS.filter(p => p.category === 'transition') as preset}\n <button type=\"button\" class=\"effect-item\" title={preset.description} disabled={!canApplyLibraryPreset(preset)} on:click={() => applyLibraryPreset(preset)}>\n <Wand2 size={14} />\n <span>{preset.name}</span>\n </button>\n {/each}\n </div>\n </div>\n <div class=\"effects-category\">\n <div class=\"category-title\">Camera</div>\n <div class=\"effects-list\">\n {#each ANIMATION_PRESETS.filter(p => p.category === 'camera') as preset}\n <button type=\"button\" class=\"effect-item\" title={preset.description} disabled={!canApplyLibraryPreset(preset)} on:click={() => applyLibraryPreset(preset)}>\n <Maximize2 size={14} />\n <span>{preset.name}</span>\n </button>\n {/each}\n </div>\n </div>\n </div>\n </div>\n {:else if activeNavTab === 'scenes'}\n <div class=\"panel-header\">\n <h3 class=\"panel-heading-title\">Scenes</h3>\n </div>\n <div class=\"panel-content\">\n <p class=\"panel-description\">\n Backgrounds, overlays, and full-canvas effects that define the visual context of your animation. Use scenes to create atmosphere, transitions, and environmental layers.\n </p>\n <div class=\"layer-list\">\n {#each sourceElements.filter(el => el.kind === 'effect' || el.kind === 'overlay') as element}\n <button\n type=\"button\"\n class=\"layer-row\"\n class:selected={selectedElementId === element.id}\n on:click={() => selectElement(element.id)}\n >\n <span class=\"layer-icon\">\n <Square size={14} />\n </span>\n <span class=\"layer-copy\">\n <strong>{element.id}</strong>\n <small>{elementDetail(element)}</small>\n </span>\n </button>\n {/each}\n </div>\n </div>\n {:else if activeNavTab === 'ai'}\n <div class=\"panel-header\">\n <h3 class=\"panel-heading-title\">AI Config</h3>\n </div>\n <AiConfigPanel assetList={assistantAssets} projectInfo={aiProjectInfo} />\n {:else if activeNavTab === 'settings'}\n <div class=\"panel-header\">\n <h3 class=\"panel-heading-title\">Settings</h3>\n </div>\n <BrandConfigPanel assetList={assistantAssets} />\n {/if}\n </aside>\n\n <aside class=\"chat-drawer\" class:collapsed={!showAiChat}>\n {#if showAiChat}\n <AiChatPanel project={code} assetList={assistantAssets} onLoadMotion={loadGeneratedMotion} onCollapse={() => showAiChat = false} />\n {:else}\n <button type=\"button\" class=\"assistant-expand\" on:click={() => showAiChat = true} title=\"Open Motionly Assistant\" aria-label=\"Open Motionly Assistant\">\n <Sparkles size={16} />\n </button>\n {/if}\n </aside>\n\n <main class=\"preview-container\">\n <div class=\"stage-meta\">\n <span>{canvasWidth} x {canvasHeight}</span>\n <div class=\"stage-actions\">\n <button type=\"button\" class=\"meta-btn\" on:click={fitPreview}>Fit</button>\n <span>{Math.round(zoom * 100)}%</span>\n <button type=\"button\" class=\"icon-btn\" on:click={toggleFullscreen} title=\"Fullscreen preview\">\n <Maximize2 size={15} />\n </button>\n </div>\n </div>\n <div bind:this={stage} class=\"stage\">\n <div class=\"canvas-shell\" style={canvasStyle}>\n <canvas\n bind:this={canvas}\n width={canvasWidth}\n height={canvasHeight}\n class=\"preview-canvas\"\n class:dragging={Boolean(dragState)}\n on:pointerdown={handleCanvasPointerDown}\n on:pointermove={handleCanvasPointerMove}\n on:pointerup={handleCanvasPointerUp}\n on:pointercancel={handleCanvasPointerUp}\n ></canvas>\n {#if snapGuides.vertical !== null}\n <span class=\"snap-guide snap-guide-v\" style={`left: ${(snapGuides.vertical / canvasWidth) * 100}%`}></span>\n {/if}\n {#if snapGuides.horizontal !== null}\n <span class=\"snap-guide snap-guide-h\" style={`top: ${(snapGuides.horizontal / canvasHeight) * 100}%`}></span>\n {/if}\n </div>\n {#if previewAsset}\n <div class=\"asset-preview-overlay\">\n {#if previewAsset.type === 'video'}\n <video src={previewAsset.src} controls autoplay muted playsinline></video>\n {:else}\n <img src={previewAsset.src} alt=\"Asset preview\" />\n {/if}\n <button type=\"button\" class=\"asset-preview-close\" on:click={clearAssetPreview} aria-label=\"Close asset preview\"><X size={18} /></button>\n </div>\n {/if}\n </div>\n {#if parseError}\n <div class=\"error-banner\">{parseError}</div>\n {:else if exportError}\n <div class=\"error-banner\">{exportError}</div>\n {/if}\n </main>\n\n <aside class=\"properties-panel\">\n <div class=\"panel-title\">Properties</div>\n {#if selectedTransition}\n <div class=\"selection-summary transition-summary\">\n <span class=\"layer-icon\"><Wand2 size={15} /></span>\n <span><strong>Crossfade</strong><small>{selectedTransition.outgoing.assetName} → {selectedTransition.incoming.assetName}</small></span>\n </div>\n <div class=\"property-group\">\n <div class=\"property-label\">Duration</div>\n <div class=\"number-input-wrapper\">\n <input\n class=\"number-input\"\n type=\"number\"\n min=\"0.05\"\n max={Math.min(selectedTransition.outgoing.duration, selectedTransition.incoming.duration)}\n step=\"0.05\"\n value={selectedTransition.duration}\n on:change={(event) => applyTransitionAtBoundary(selectedTransition, Number(event.currentTarget.value))}\n />\n <span class=\"input-suffix\">s</span>\n </div>\n </div>\n <div class=\"transition-pair-copy\">\n <span><small>Outgoing</small><strong>{selectedTransition.outgoing.assetName}</strong></span>\n <span class=\"transition-pair-arrow\">→</span>\n <span><small>Incoming</small><strong>{selectedTransition.incoming.assetName}</strong></span>\n </div>\n <button type=\"button\" class=\"timeline-command transition-remove\" on:click={removeSelectedTransition}>\n Remove transition\n </button>\n {:else if selectedElement}\n <div class=\"selection-summary\">\n <span class=\"layer-icon\">\n {#if selectedElement.kind === 'asset' && selectedElement.asset?.type === 'video'}<Video size={15} />\n {:else if selectedElement.kind === 'asset' && selectedElement.asset?.path}<img src={assets.get(selectedElement.assetName ?? '')?.src ?? selectedElement.asset.path} alt=\"\" />\n {:else if selectedElement.kind === 'text'}<Type size={15} />\n {:else if selectedElement.kind === 'asset'}<FileImage size={15} />\n {:else if selectedElement.kind === 'effect'}<Sparkles size={15} />\n {:else}<Square size={15} />{/if}\n </span>\n <span><strong>{selectedElement.id}</strong><small>{elementDetail(selectedElement)}</small></span>\n </div>\n\n {#if selectedElement.kind === 'asset' || selectedElement.kind === 'text'}\n <div class=\"property-align-toolbar\">\n <span class=\"property-align-label\">Align to canvas</span>\n <div class=\"property-align-actions\" aria-label=\"Align selected layer to canvas\">\n <button type=\"button\" on:click={() => alignSelected('left')} title=\"Align left\" aria-label=\"Align left\"><AlignHorizontalJustifyStart size={15} /></button>\n <button type=\"button\" on:click={() => alignSelected('center-x')} title=\"Align horizontal center\" aria-label=\"Align horizontal center\"><AlignHorizontalJustifyCenter size={15} /></button>\n <button type=\"button\" on:click={() => alignSelected('right')} title=\"Align right\" aria-label=\"Align right\"><AlignHorizontalJustifyEnd size={15} /></button>\n <span class=\"align-divider\"></span>\n <button type=\"button\" on:click={() => alignSelected('top')} title=\"Align top\" aria-label=\"Align top\"><AlignVerticalJustifyStart size={15} /></button>\n <button type=\"button\" on:click={() => alignSelected('center-y')} title=\"Align vertical center\" aria-label=\"Align vertical center\"><AlignVerticalJustifyCenter size={15} /></button>\n <button type=\"button\" on:click={() => alignSelected('bottom')} title=\"Align bottom\" aria-label=\"Align bottom\"><AlignVerticalJustifyEnd size={15} /></button>\n </div>\n </div>\n {/if}\n \n <div class=\"property-group\">\n <div class=\"property-label\">Position</div>\n <div class=\"property-row\">\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" value={numericProperty(selectedElement, 'x', 0)} on:input={(e) => updateElementProperty('x', Number(e.currentTarget.value))} />\n <span class=\"input-suffix\">x</span>\n </div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" value={numericProperty(selectedElement, 'y', 0)} on:input={(e) => updateElementProperty('y', Number(e.currentTarget.value))} />\n <span class=\"input-suffix\">y</span>\n </div>\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"property-label\">Scale</div>\n <div class=\"slider-control\">\n <input \n class=\"custom-slider\" \n type=\"range\" \n min=\"0\" \n max=\"3\" \n step=\"0.01\" \n value={numericProperty(selectedElement, 'scale', 1)} \n on:input={(e) => updateElementProperty('scale', Number(e.currentTarget.value))} \n />\n <input \n class=\"slider-value-input\" \n type=\"number\" \n min=\"0\" \n step=\"0.01\" \n value={numericProperty(selectedElement, 'scale', 1).toFixed(2)} \n on:input={(e) => updateElementProperty('scale', Number(e.currentTarget.value))} \n />\n </div>\n </div>\n\n {#if selectedElement.kind === 'asset'}\n <div class=\"property-group\">\n <div class=\"property-label-row\">\n <div class=\"property-label\">Width</div>\n <button type=\"button\" class=\"property-action\" on:click={resetElementSize}>Original size</button>\n </div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"1\" step=\"1\" value={numericProperty(selectedElement, 'width', estimateElementWidth(selectedElement))} on:input={(e) => updateElementProperty('width', Number(e.currentTarget.value))} />\n <span class=\"input-suffix\">px</span>\n </div>\n </div>\n {/if}\n\n <div class=\"property-group\">\n <div class=\"property-label\">Rotation</div>\n <div class=\"slider-control\">\n <input \n class=\"custom-slider\" \n type=\"range\" \n min=\"-180\" \n max=\"180\" \n step=\"1\" \n value={numericProperty(selectedElement, 'rotation', 0)} \n on:input={(e) => updateElementProperty('rotation', Number(e.currentTarget.value))} \n />\n <input \n class=\"slider-value-input\" \n type=\"number\" \n min=\"-180\" \n max=\"180\" \n value={numericProperty(selectedElement, 'rotation', 0)} \n on:input={(e) => updateElementProperty('rotation', Number(e.currentTarget.value))} \n />\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"property-label\">Opacity</div>\n <div class=\"slider-control\">\n <input \n class=\"custom-slider\" \n type=\"range\" \n min=\"0\" \n max=\"1\" \n step=\"0.01\" \n value={numericProperty(selectedElement, 'opacity', 1)} \n on:input={(e) => updateElementProperty('opacity', Number(e.currentTarget.value))} \n />\n <input \n class=\"slider-value-input\" \n type=\"number\" \n min=\"0\" \n max=\"100\" \n value={Math.round(numericProperty(selectedElement, 'opacity', 1) * 100)} \n on:input={(e) => updateElementProperty('opacity', Number(e.currentTarget.value) / 100)} \n />\n </div>\n </div>\n\n {#if selectedElement.kind === 'overlay'}\n <div class=\"property-group\">\n <div class=\"property-label\">Background</div>\n <input class=\"color-input\" type=\"color\" value={stringProperty(selectedElement, 'fill', '#000000')} on:input={(e) => updateElementProperty('fill', e.currentTarget.value)} />\n </div>\n {/if}\n\n {#if selectedElement.kind === 'text'}\n <div class=\"property-group\">\n <div class=\"property-label\">Text</div>\n <textarea class=\"text-input\" rows=\"3\" value={stringProperty(selectedElement, 'value', '')} on:input={(e) => updateElementProperty('value', e.currentTarget.value)}></textarea>\n </div>\n <div class=\"property-group\">\n <div class=\"property-label\">Font Size</div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"1\" value={numericProperty(selectedElement, 'size', 72)} on:input={(e) => updateElementProperty('size', Number(e.currentTarget.value))} />\n <span class=\"input-suffix\">px</span>\n </div>\n </div>\n <div class=\"property-group\">\n <div class=\"property-label\">Color</div>\n <input class=\"color-input\" type=\"color\" value={stringProperty(selectedElement, 'color', '#ffffff')} on:input={(e) => updateElementProperty('color', e.currentTarget.value)} />\n </div>\n {/if}\n\n <div class=\"section-title\">Layer Mask</div>\n <div class=\"property-group\">\n <div class=\"property-label\">Use layer as alpha</div>\n <select\n class=\"text-input mask-select\"\n value={stringProperty(selectedElement, 'mask', 'none')}\n on:change={(event) => updateElementProperty('mask', event.currentTarget.value)}\n >\n <option value=\"none\">None</option>\n {#each sourceElements.filter((candidate) => candidate.id !== selectedElement?.id) as candidate}\n <option value={candidate.id}>{candidate.id}</option>\n {/each}\n </select>\n </div>\n {#if stringProperty(selectedElement, 'mask', 'none') !== 'none'}\n <label class=\"toggle-row\">\n <input type=\"checkbox\" checked={Boolean(propertiesOf(selectedElement)['maskInvert'])} on:change={(event) => updateElementProperty('maskInvert', event.currentTarget.checked)} />\n <span>Invert alpha</span>\n </label>\n <label class=\"toggle-row\">\n <input type=\"checkbox\" checked={Boolean(propertiesOf(selectedElement)['maskVisible'])} on:change={(event) => updateElementProperty('maskVisible', event.currentTarget.checked)} />\n <span>Show mask layer</span>\n </label>\n {/if}\n\n <div class=\"section-title\">Adjustments</div>\n {#each adjustmentControls as control}\n <div class=\"property-group\">\n <div class=\"property-label\">{control.label}</div>\n <div class=\"slider-control\">\n <input\n class=\"custom-slider\"\n type=\"range\"\n min={control.min}\n max={control.max}\n step={control.step}\n value={numericProperty(selectedElement, control.property, control.fallback)}\n on:input={(event) => updateElementProperty(control.property, Number(event.currentTarget.value))}\n />\n <input\n class=\"slider-value-input\"\n type=\"number\"\n min={control.min}\n max={control.max}\n step={control.step}\n value={numericProperty(selectedElement, control.property, control.fallback)}\n on:input={(event) => updateElementProperty(control.property, Number(event.currentTarget.value))}\n />\n </div>\n </div>\n {/each}\n\n <div class=\"section-title\">Keyframes</div>\n <div class=\"property-group keyframe-controls\">\n <button type=\"button\" class=\"timeline-command\" on:click={addKeyframeAtPlayhead}>◆ Add at playhead</button>\n {#if selectedKeyframeOffset !== null}\n <div class=\"number-input-wrapper\">\n <input\n class=\"number-input\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"0.1\"\n value={Number((selectedKeyframeOffset * 100).toFixed(1))}\n on:change={(event) => {\n const node = selectedAnimationAst();\n if (node && selectedKeyframeOffset !== null) {\n const next = Math.min(1, Math.max(0, Number(event.currentTarget.value) / 100));\n node.keyframes = moveKeyframe(node.keyframes ?? [], selectedKeyframeOffset, next);\n selectedKeyframeOffset = next;\n code = serializeProgram(ast!);\n }\n }}\n />\n <span class=\"input-suffix\">%</span>\n </div>\n <button type=\"button\" class=\"icon-btn danger-btn\" on:click={deleteSelectedKeyframe} title=\"Delete selected keyframe\"><Trash2 size={14} /></button>\n {/if}\n </div>\n {#if selectedKeyframeOffset !== null}\n <div class=\"property-group\">\n <div class=\"property-label\">Keyframe easing (into this keyframe)</div>\n <select\n class=\"text-input\"\n value={selectedKeyframeEasingValue}\n on:change={(event) => setSelectedKeyframeEasing(event.currentTarget.value)}\n >\n <option value=\"\">Animation default</option>\n {#each KEYFRAME_EASINGS as option}\n <option value={option.value}>{option.label}</option>\n {/each}\n </select>\n </div>\n {/if}\n\n <div class=\"section-title\">Animation</div>\n \n <div class=\"property-group\">\n <div class=\"property-label\">Preset</div>\n <div class=\"preset-cards\">\n <button \n type=\"button\" \n class=\"preset-option\" \n class:active={!selectedAnimation}\n on:click={() => applyPreset('none')}\n >\n None\n </button>\n <button \n type=\"button\" \n class=\"preset-option\" \n class:active={isBasicPreset('fade')}\n on:click={() => applyPreset('fade')}\n >\n Fade\n </button>\n <button \n type=\"button\" \n class=\"preset-option\" \n class:active={isBasicPreset('rise')}\n on:click={() => applyPreset('rise')}\n >\n Rise\n </button>\n <button \n type=\"button\" \n class=\"preset-option\" \n class:active={isBasicPreset('scale')}\n on:click={() => applyPreset('scale')}\n >\n Scale\n </button>\n <button \n type=\"button\" \n class=\"preset-option\" \n class:active={isBasicPreset('blur')}\n on:click={() => applyPreset('blur')}\n >\n Blur\n </button>\n <button \n type=\"button\" \n class=\"preset-option\" \n class:active={isBasicPreset('drift')}\n on:click={() => applyPreset('drift')}\n >\n Drift\n </button>\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"property-label\">Duration</div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"0.1\" step=\"0.1\" value={selectedAnimation?.duration ?? 1} on:input={(e) => updateAnimationProperty('duration', Number(e.currentTarget.value))} />\n <span class=\"input-suffix\">s</span>\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"property-label\">Delay</div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"0\" step=\"0.1\" value={selectedAnimation?.delay ?? 0} on:input={(e) => updateAnimationProperty('delay', Number(e.currentTarget.value))} />\n <span class=\"input-suffix\">s</span>\n </div>\n </div>\n\n <div class=\"property-group\">\n <div class=\"property-label\">Easing</div>\n <div class=\"easing-options\">\n {#each ['soft', 'power3.out', 'linear', 'ease-out', 'spring', 'smooth'] as easingOption}\n <button \n type=\"button\" \n class=\"easing-option\" \n class:active={(selectedAnimation?.easing ?? 'soft') === easingOption}\n on:click={() => updateAnimationProperty('easing', easingOption)}\n >\n {easingOption}\n </button>\n {/each}\n </div>\n <input\n class=\"text-input easing-input\"\n type=\"text\"\n value={String(selectedAnimation?.easing ?? 'soft')}\n placeholder=\"power3.out or cubic-bezier(...)\"\n on:change={(event) => updateAnimationProperty('easing', event.currentTarget.value)}\n aria-label=\"Custom animation easing\"\n />\n </div>\n {:else if selectedClip}\n <div class=\"selection-summary\">\n <span class=\"layer-icon\">\n {#if selectedClip.asset?.type === 'video'}<Video size={15} />\n {:else if selectedClip.asset?.path}<img src={assets.get(selectedClip.assetName)?.src ?? selectedClip.asset.path} alt=\"\" />\n {:else}<FileImage size={15} />{/if}\n </span>\n <span><strong>{selectedClip.assetName}</strong><small>Timeline clip</small></span>\n </div>\n <button type=\"button\" class=\"timeline-command clip-original-size\" on:click={resetElementSize}>Original size</button>\n <div class=\"property-group\">\n <div class=\"property-label\">Track</div>\n <select class=\"text-input\" value={String(selectedClip.track)} on:change={(event) => moveSelectedClipFromInspector(event.currentTarget.value, selectedClip.start)}>\n {#each (scene?.tracks ?? []).filter((track) => track.role !== 'audio' && (track.role === 'main' || track.content === (selectedClip.asset?.type === 'video' ? 'video' : 'image') || track.content === 'mixed')) as track}\n <option value={track.id}>{track.label} · {track.role}</option>\n {/each}\n </select>\n </div>\n <div class=\"property-group\">\n <div class=\"property-label\">Start</div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"0\" max={totalDuration} step=\"0.01\" value={selectedClip.start} on:change={(event) => moveSelectedClipFromInspector(String(selectedClip.track), Number(event.currentTarget.value))} />\n <span class=\"input-suffix\">s</span>\n </div>\n </div>\n <div class=\"property-group\">\n <div class=\"property-label\">Duration</div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"0.05\" max={totalDuration} step=\"0.05\" value={selectedClip.duration} on:change={(event) => resizeSelectedClipFromInspector(Number(event.currentTarget.value))} />\n <span class=\"input-suffix\">s</span>\n </div>\n </div>\n <div class=\"property-group\">\n <div class=\"property-label\">Trim In</div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"0\" step=\"0.01\" value={selectedClip.trimIn} on:input={(event) => updateClip(selectedClip.id, { trimIn: `${Math.max(0, Number(event.currentTarget.value))}s` })} />\n <span class=\"input-suffix\">s</span>\n </div>\n </div>\n <div class=\"property-group\">\n <div class=\"property-label\">Trim Out</div>\n <div class=\"number-input-wrapper\">\n <input class=\"number-input\" type=\"number\" min=\"0\" step=\"0.01\" value={selectedClip.trimOut} on:input={(event) => updateClip(selectedClip.id, { trimOut: `${Math.max(0, Number(event.currentTarget.value))}s` })} />\n <span class=\"input-suffix\">s</span>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"timeline-command\"\n disabled={currentTime <= selectedClip.start || currentTime >= selectedClip.start + selectedClip.duration}\n on:click={splitSelectedClip}\n >Split at playhead</button>\n {:else}\n <p class=\"empty\">No object selected.</p>\n {/if}\n </aside>\n </div>\n\n <section class=\"timeline-panel\">\n <button\n type=\"button\"\n class=\"timeline-resizer\"\n aria-label=\"Resize timeline\"\n title=\"Drag to resize timeline\"\n on:pointerdown={resizeTimeline}\n on:keydown={resizeTimelineWithKeyboard}\n ><span></span></button>\n <div class=\"timeline-toolbar\">\n <div class=\"playback-controls\">\n <button on:click={reset} class=\"control-btn\" title=\"Go to start\">\n <SkipBack size={17} />\n </button>\n <button on:click={isPlaying ? pause : play} class=\"control-btn play-btn\" title={isPlaying ? 'Pause' : 'Play'}>\n {#if isPlaying}<Pause size={19} />{:else}<Play size={19} />{/if}\n </button>\n <span class=\"timecode\">{formatPreciseTime(currentTime)}</span>\n <span class=\"framecode\">Frame {displayFrame}</span>\n </div>\n\n <div class=\"timeline-context\">\n <Layers3 size={14} />\n <span>{selectedElement?.id ?? selectedClip?.assetName ?? 'Timeline'}</span>\n </div>\n\n <div class=\"timeline-actions\">\n <input bind:this={audioInput} class=\"file-input\" type=\"file\" accept=\"audio/*\" on:change={handleAudioSelected} />\n {#if audioName}\n <span class=\"audio-chip\"><Music2 size={13} /> {audioName}</span>\n <button class=\"icon-btn\" on:click={removeAudio} title=\"Remove audio\"><Trash2 size={14} /></button>\n {:else}\n <button class=\"timeline-command\" on:click={() => audioInput.click()} title=\"Attach audio\"><Upload size={14} /> Audio</button>\n {/if}\n {#if selectedElement || selectedClip}\n <button class=\"icon-btn danger-btn\" on:click={deleteSelectedElement} title=\"Delete selected layer\"><Trash2 size={14} /></button>\n {/if}\n <button class=\"icon-btn\" on:click={undoEditor} disabled={editorHistory.past.length === 0} title=\"Undo (Ctrl/Cmd+Z)\"><Undo2 size={14} /></button>\n <button class=\"icon-btn\" on:click={redoEditor} disabled={editorHistory.future.length === 0} title=\"Redo (Ctrl/Cmd+Shift+Z)\"><Redo2 size={14} /></button>\n <button class=\"icon-btn\" on:click={splitSelectedClip} disabled={!((selectedClip && currentTime > selectedClip.start && currentTime < selectedClip.start + selectedClip.duration) || (selectedElement && currentTime > timelineRange(selectedElement.id).start && currentTime < timelineRange(selectedElement.id).end))} title=\"Split selected clip at playhead\"><Scissors size={14} /></button>\n <button class=\"icon-btn\" class:active={snapEnabled} on:click={() => snapEnabled = !snapEnabled} title={snapEnabled ? 'Disable edge snapping' : 'Enable edge snapping'}><Magnet size={15} /></button>\n <button on:click={() => setTimelineZoom(timelineZoom / 1.25)} class=\"icon-btn\" title=\"Timeline zoom out\"><Minus size={15} /></button>\n <span class=\"timeline-zoom-value\">{Math.round(timelineZoom * 100)}%</span>\n <button on:click={() => setTimelineZoom(timelineZoom * 1.25)} class=\"icon-btn\" title=\"Timeline zoom in\"><Plus size={15} /></button>\n </div>\n </div>\n\n <div \n bind:this={timelineScroll}\n class=\"timeline-scroll\" \n style={`--timeline-content-width: ${timelineContentWidth}px`}\n class:drop-target={draggingAsset !== null}\n role=\"region\"\n aria-label=\"Timeline tracks\"\n on:dragover={handleTimelineDragOver}\n on:drop={handleTimelineDrop}\n on:dragleave={() => dropTargetTime = null}\n on:wheel={handleTimelineWheel}\n >\n <div class=\"ruler-row\">\n <div class=\"track-label ruler-label\">Layers</div>\n <div class=\"ruler\">\n {#each timelineTicks as tick}\n <span class=\"ruler-tick\" style={`left: ${timelinePercent(tick)}%`}>{formatTime(tick)}</span>\n {/each}\n <span class=\"playhead-marker\" style={`left: ${timelinePercent(currentTime)}%`}></span>\n {#if dropTargetTime !== null}\n <span class=\"drop-indicator\" style={`left: ${timelinePercent(dropTargetTime)}%`}></span>\n {/if}\n <input class=\"timeline-scrubber\" type=\"range\" min=\"0\" max={totalDuration} step={1 / (scene?.canvas.fps ?? 60)} value={currentTime} on:input={seek} aria-label=\"Timeline scrubber\" />\n </div>\n </div>\n\n {#each timelineRows as row}\n {@const rowTrack = scene?.tracks.find((track) => track.id === row.trackId)}\n <div\n class=\"timeline-row\"\n class:selected={row.items.some((item) => item.element.id === selectedElementId)}\n style={`min-height: ${row.laneCount * 34 + 8}px; order: ${timelineTrackDisplayOrder(rowTrack, row.trackId)}`}\n >\n <div class=\"track-label\" class:track-hidden={rowTrack?.hidden}>\n <span class=\"track-thumb\">\n {#if row.items[0].element.kind === 'asset' && row.items[0].element.asset?.type === 'video'}<Video size={12} />\n {:else if row.items[0].element.kind === 'asset' && row.items[0].element.asset?.path}<img src={assets.get(row.items[0].element.assetName ?? '')?.src ?? row.items[0].element.asset.path} alt=\"\" />\n {:else if row.kind === 'text'}<Type size={12} />\n {:else if row.kind === 'effect'}<Sparkles size={12} />\n {:else}<Square size={12} />{/if}\n </span>\n <span class=\"track-copy\">\n <strong>{timelineLaneLabel(row)}</strong>\n <small>{row.items.length} {row.items.length === 1 ? 'element' : 'elements'}{row.laneCount > 1 ? ` · ${row.laneCount} stacked` : ''}</small>\n </span>\n {#if rowTrack}\n <span class=\"track-controls\">\n <button type=\"button\" class=\"track-control\" class:active={rowTrack.hidden} on:click|stopPropagation={() => updateTrack(rowTrack, { hidden: !rowTrack.hidden })} title={rowTrack.hidden ? 'Show track' : 'Hide track'}>\n {#if rowTrack.hidden}<EyeOff size={13} />{:else}<Eye size={13} />{/if}\n </button>\n </span>\n {:else}\n <span class=\"track-time\">{formatPreciseTime(row.start)} - {formatPreciseTime(row.end)}</span>\n {/if}\n </div>\n <div class=\"track-lane\" data-track={row.trackId} style={`min-height: ${row.laneCount * 34 + 7}px`}>\n {#if clipDrag && clipDrag.ghostTrackId === row.trackId}\n <span class=\"clip-ghost\" class:invalid={!clipDrag.valid} style={`left: ${timelinePercent(clipDrag.ghostStart)}%; width: ${Math.max(0.8, timelinePercent(clipDrag.duration))}%`}></span>\n {#if clipDrag.kind === 'element' && clipDrag.id === selectedElementId && !row.items.some((item) => item.element.id === selectedElementId)}\n {#each selectedKeyframeMarkers() as frame}\n <span class=\"keyframe-marker drag-keyframe\" style={`left: ${timelinePercent(keyframeTime(frame.offset) + keyframeDragDelta)}%; top: 19.5px`} aria-hidden=\"true\"></span>\n {/each}\n {/if}\n {/if}\n {#each row.items as item}\n <span class=\"clip element-clip\" class:selected-clip={item.element.id === selectedElementId} style={`left: ${timelinePercent(item.range.start)}%; width: ${Math.max(0.8, timelinePercent(item.range.end - item.range.start))}%; top: ${6 + item.lane * 34}px`}>\n {#if item.element.kind === 'asset' && item.element.asset?.type === 'video'}\n <span class=\"clip-media video-clip-media\"><Video size={13} /></span>\n {:else if item.element.kind === 'asset' && item.element.asset?.path}\n <span\n class=\"clip-media\"\n style={`background-image: url('${assets.get(item.element.assetName ?? '')?.src ?? item.element.asset.path}')`}\n ></span>\n {:else if item.element.kind === 'text'}\n <span class=\"clip-text\">{stringProperty(item.element, 'value', item.element.id)}</span>\n {:else if item.element.kind === 'overlay'}\n <span class=\"clip-color\" style={`background: ${stringProperty(item.element, 'fill', '#34404e')}`}></span>\n {/if}\n <button type=\"button\" class=\"clip-select\" on:pointerdown={(event) => moveTimelineElement(event, item.element)} on:click={() => selectElement(item.element.id, false)} aria-label={`Select or move ${item.element.id}`}></button>\n <button type=\"button\" class=\"trim-handle trim-start\" on:pointerdown={(event) => trimElement(event, item.element.id, 'start')} aria-label={`Trim start of ${item.element.id}`}></button>\n <button type=\"button\" class=\"trim-handle trim-end\" on:pointerdown={(event) => trimElement(event, item.element.id, 'end')} aria-label={`Trim end of ${item.element.id}`}></button>\n </span>\n {/each}\n {#if row.items.some((item) => item.element.id === selectedElementId) && !(clipDrag?.kind === 'element' && clipDrag.id === selectedElementId && clipDrag.ghostTrackId !== row.trackId)}\n {@const kfLane = row.items.find((item) => item.element.id === selectedElementId)?.lane ?? 0}\n {#each selectedKeyframeMarkers() as frame}\n <button\n type=\"button\"\n class=\"keyframe-marker\"\n class:selected-keyframe={selectedKeyframeOffset !== null && Math.abs(selectedKeyframeOffset - frame.offset) < 0.000001}\n style={`left: ${timelinePercent(keyframeTime(frame.offset) + keyframeDragDelta)}%; top: ${6 + kfLane * 34 + 13.5}px`}\n title={`Keyframe ${Math.round(frame.offset * 100)}%${frame.easing ? ' · ' + frame.easing : ''} — drag to retime, right-click to delete`}\n aria-label={`Keyframe at ${Math.round(frame.offset * 100)} percent`}\n on:pointerdown={(event) => dragKeyframeMarker(event, frame.offset)}\n on:contextmenu={(event) => deleteKeyframeAt(event, frame.offset)}\n ></button>\n {/each}\n <button\n type=\"button\"\n class=\"keyframe-add\"\n style={`left: ${timelinePercent(currentTime)}%; top: ${6 + kfLane * 34 + 13.5}px`}\n title=\"Add keyframe at playhead\"\n aria-label=\"Add keyframe at playhead\"\n on:pointerdown|stopPropagation\n on:click|stopPropagation={addKeyframeAtPlayhead}\n >+</button>\n {/if}\n <span class=\"playhead\" style={`left: ${timelinePercent(currentTime)}%`}></span>\n </div>\n </div>\n {/each}\n\n {#each timelineClipTracks as clipTrack}\n <div class=\"timeline-row clip-row\" class:selected={clipTrack.clips.some(({ clip }) => clip.id === selectedElementId) || clipTrack.elements.some(({ item }) => item.element.id === selectedElementId)} style={`min-height: ${clipTrack.laneCount * 34 + 8}px; order: ${timelineTrackDisplayOrder(clipTrack.metadata, String(clipTrack.track))}`}>\n <div class=\"track-label\" class:track-hidden={clipTrack.metadata?.hidden}>\n <span class=\"track-thumb\">\n {#if clipTrack.metadata?.role === 'audio'}\n <Music2 size={12} />\n {:else if clipTrack.clips[0]?.clip.asset?.type === 'video'}\n <Video size={12} />\n {:else if clipTrack.clips[0]?.clip.asset?.path}\n <img src={assets.get(clipTrack.clips[0].clip.assetName)?.src ?? clipTrack.clips[0].clip.asset?.path} alt=\"\" />\n {:else}\n <Layers3 size={12} />\n {/if}\n </span>\n <span class=\"track-copy\">\n <strong>{clipTrack.metadata?.label ?? `Legacy Track ${clipTrack.track}`}</strong>\n <small>{clipTrack.metadata?.role ?? 'overlay'} · {clipTrack.clips.length + clipTrack.elements.length} {clipTrack.clips.length + clipTrack.elements.length === 1 ? 'item' : 'items'}</small>\n </span>\n {#if clipTrack.metadata}\n <span class=\"track-controls\">\n {#if clipTrack.metadata.role !== 'audio'}\n <button type=\"button\" class=\"track-control\" class:active={clipTrack.metadata.hidden} on:click|stopPropagation={() => updateTrack(clipTrack.metadata!, { hidden: !clipTrack.metadata!.hidden })} title={clipTrack.metadata.hidden ? 'Show track' : 'Hide track'} aria-label={clipTrack.metadata.hidden ? 'Show track' : 'Hide track'}>\n {#if clipTrack.metadata.hidden}<EyeOff size={13} />{:else}<Eye size={13} />{/if}\n </button>\n {/if}\n {#if clipTrack.metadata.role === 'audio' || clipTrack.metadata.role === 'main' || clipTrack.metadata.content === 'video'}\n <button type=\"button\" class=\"track-control\" class:active={clipTrack.metadata.muted} on:click|stopPropagation={() => updateTrack(clipTrack.metadata!, { muted: !clipTrack.metadata!.muted })} title={clipTrack.metadata.muted ? 'Unmute track' : 'Mute track'} aria-label={clipTrack.metadata.muted ? 'Unmute track' : 'Mute track'}>\n {#if clipTrack.metadata.muted}<VolumeX size={13} />{:else}<Volume2 size={13} />{/if}\n </button>\n {/if}\n </span>\n {/if}\n </div>\n <div class=\"track-lane\" data-track={clipTrack.track} style={`min-height: ${clipTrack.laneCount * 34 + 7}px`}>\n {#if clipDrag && clipDrag.ghostTrackId === String(clipTrack.track)}\n <span class=\"clip-ghost\" class:invalid={!clipDrag.valid} style={`left: ${timelinePercent(clipDrag.ghostStart)}%; width: ${Math.max(0.8, timelinePercent(clipDrag.duration))}%`}></span>\n {#if clipDrag.kind === 'element' && clipDrag.id === selectedElementId && !clipTrack.elements.some(({ item }) => item.element.id === selectedElementId)}\n {#each selectedKeyframeMarkers() as frame}\n <span class=\"keyframe-marker drag-keyframe\" style={`left: ${timelinePercent(keyframeTime(frame.offset) + keyframeDragDelta)}%; top: 19.5px`} aria-hidden=\"true\"></span>\n {/each}\n {/if}\n {/if}\n {#if clipTrack.metadata?.id === projectAudioTrack?.id && audioName}\n <span class=\"clip audio-clip\" style={`left: ${timelinePercent(scene?.audioStart ?? 0)}%; width: ${timelinePercent(Math.min(audioDuration || totalDuration, Math.max(0, totalDuration - (scene?.audioStart ?? 0))))}%; top: 6px`}>\n <span class=\"clip-text\">{audioName}</span>\n <button type=\"button\" class=\"clip-select\" on:pointerdown={moveTimelineAudio} aria-label={`Move audio ${audioName}`}></button>\n </span>\n {/if}\n {#each clipTrack.elements as packedElement}\n {@const item = packedElement.item}\n <span class=\"clip element-clip\" class:selected-clip={item.element.id === selectedElementId} style={`left: ${timelinePercent(item.range.start)}%; width: ${Math.max(0.8, timelinePercent(item.range.end - item.range.start))}%; top: ${6 + packedElement.lane * 34}px`}>\n {#if item.element.kind === 'asset' && item.element.asset?.type === 'video'}\n <span class=\"clip-media video-clip-media\"><Video size={13} /></span>\n {:else if item.element.kind === 'asset' && item.element.asset?.path}\n <span class=\"clip-media\" style={`background-image: url('${assets.get(item.element.assetName ?? '')?.src ?? item.element.asset.path}')`}></span>\n {:else if item.element.kind === 'text'}\n <span class=\"clip-text\">{stringProperty(item.element, 'value', item.element.id)}</span>\n {:else if item.element.kind === 'overlay'}\n <span class=\"clip-color\" style={`background: ${stringProperty(item.element, 'fill', '#34404e')}`}></span>\n {:else}\n <span class=\"clip-text\">{item.element.id}</span>\n {/if}\n <button type=\"button\" class=\"clip-select\" on:pointerdown={(event) => moveTimelineElement(event, item.element)} on:click={() => selectElement(item.element.id, false)} aria-label={`Select or move ${item.element.id}`}></button>\n <button type=\"button\" class=\"trim-handle trim-start\" on:pointerdown={(event) => trimElement(event, item.element.id, 'start')} aria-label={`Trim start of ${item.element.id}`}></button>\n <button type=\"button\" class=\"trim-handle trim-end\" on:pointerdown={(event) => trimElement(event, item.element.id, 'end')} aria-label={`Trim end of ${item.element.id}`}></button>\n </span>\n {/each}\n {#if clipTrack.elements.some(({ item }) => item.element.id === selectedElementId) && !(clipDrag?.kind === 'element' && clipDrag.id === selectedElementId && clipDrag.ghostTrackId !== String(clipTrack.track))}\n {@const kfLane = clipTrack.elements.find(({ item }) => item.element.id === selectedElementId)?.lane ?? 0}\n {#each selectedKeyframeMarkers() as frame}\n <button\n type=\"button\"\n class=\"keyframe-marker\"\n class:selected-keyframe={selectedKeyframeOffset !== null && Math.abs(selectedKeyframeOffset - frame.offset) < 0.000001}\n style={`left: ${timelinePercent(keyframeTime(frame.offset) + keyframeDragDelta)}%; top: ${6 + kfLane * 34 + 13.5}px`}\n title={`Keyframe ${Math.round(frame.offset * 100)}%${frame.easing ? ' · ' + frame.easing : ''} — drag to retime, right-click to delete`}\n aria-label={`Keyframe at ${Math.round(frame.offset * 100)} percent`}\n on:pointerdown={(event) => dragKeyframeMarker(event, frame.offset)}\n on:contextmenu={(event) => deleteKeyframeAt(event, frame.offset)}\n ></button>\n {/each}\n <button\n type=\"button\"\n class=\"keyframe-add\"\n style={`left: ${timelinePercent(currentTime)}%; top: ${6 + kfLane * 34 + 13.5}px`}\n title=\"Add keyframe at playhead\"\n aria-label=\"Add keyframe at playhead\"\n on:pointerdown|stopPropagation\n on:click|stopPropagation={addKeyframeAtPlayhead}\n >+</button>\n {/if}\n {#each clipTrack.clips as packedClip}\n {@const clip = packedClip.clip}\n <span class=\"clip timeline-clip\" class:selected-clip={clip.id === selectedElementId} style={`left: ${timelinePercent(clip.start)}%; width: ${Math.max(0.8, timelinePercent(clip.duration))}%; top: ${6 + packedClip.lane * 34}px`}>\n {#if clip.asset?.type === 'video'}\n <span class=\"clip-media video-clip-media\"><Video size={13} /></span>\n {:else if clip.asset?.path}\n <span\n class=\"clip-media\"\n style={`background-image: url('${assets.get(clip.assetName)?.src ?? clip.asset.path}')`}\n ></span>\n {:else}\n <span class=\"clip-text\">{clip.assetName}</span>\n {/if}\n {#if clip.trimIn > 0 || clip.trimOut > 0}\n <span class=\"clip-trim-label\">↤ {clip.trimIn.toFixed(2)}s · {clip.trimOut.toFixed(2)}s ↦</span>\n {/if}\n <button type=\"button\" class=\"clip-select\" on:pointerdown={(event) => moveTimelineClip(event, clip)} on:click={() => selectElement(clip.id, false)} aria-label={`Select ${clip.assetName} clip`}></button>\n <button type=\"button\" class=\"trim-handle trim-start\" on:pointerdown={(event) => trimTimelineClip(event, clip, 'start')} aria-label={`Trim start of ${clip.assetName}`}></button>\n <button type=\"button\" class=\"trim-handle trim-end\" on:pointerdown={(event) => trimTimelineClip(event, clip, 'end')} aria-label={`Trim end of ${clip.assetName}`}></button>\n <button type=\"button\" class=\"clip-delete\" on:click|stopPropagation={() => deleteClip(clip.id)} title=\"Delete clip\">\n <X size={12} />\n </button>\n </span>\n {/each}\n {#each transitionBoundaries.filter((boundary) => String(boundary.outgoing.track) === String(clipTrack.track)) as boundary}\n <button\n type=\"button\"\n class=\"transition-cut\"\n class:has-transition={boundary.type !== null}\n class:drop-ready={draggingTransition !== null}\n class:selected-transition={selectedTransition?.outgoing.id === boundary.outgoing.id && selectedTransition?.incoming.id === boundary.incoming.id}\n style={`left: ${timelinePercent(boundary.at)}%`}\n title={boundary.type ? `Crossfade · ${boundary.duration.toFixed(2)}s` : 'Drop a transition here'}\n aria-label={boundary.type ? `Select crossfade between ${boundary.outgoing.assetName} and ${boundary.incoming.assetName}` : `Add transition between ${boundary.outgoing.assetName} and ${boundary.incoming.assetName}`}\n on:dragover|preventDefault|stopPropagation\n on:drop={(event) => dropTransition(event, boundary)}\n on:click|stopPropagation={() => selectTransition(boundary)}\n >\n {boundary.type ? '×' : '+'}\n </button>\n {/each}\n <span class=\"playhead\" style={`left: ${timelinePercent(currentTime)}%`}></span>\n </div>\n </div>\n {/each}\n\n </div>\n\n <audio bind:this={audioElement} on:loadedmetadata={() => (audioDuration = audioElement.duration)}></audio>\n </section>\n\n <button on:click={toggleCodeEditor} class=\"source-toggle\" title={showCodeEditor ? 'Hide .motion source' : 'Show .motion source'}>\n .motion\n </button>\n\n {#if showCodeEditor}\n <div class=\"code-overlay\">\n <div class=\"code-panel\">\n <div class=\"code-header\">\n <h3>.motion source</h3>\n <button on:click={toggleCodeEditor} class=\"close-btn\">\n <X size={20} />\n </button>\n </div>\n\n <textarea\n bind:value={code}\n placeholder=\".motion source\"\n spellcheck=\"false\"\n class=\"code-textarea\"\n ></textarea>\n\n {#if parseError}\n <div class=\"error-banner\">\n ⚠️ {parseError}\n </div>\n {/if}\n </div>\n </div>\n {/if}\n</div>\n\n<!-- Confirmation Dialog -->\n{#if showConfirmDialog}\n <div class=\"dialog-overlay\" on:click={cancelLoadPreset} on:keydown={(e) => e.key === 'Escape' && cancelLoadPreset()} role=\"button\" tabindex=\"-1\">\n <div class=\"dialog\" on:click|stopPropagation on:keydown={(e) => e.key === 'Enter' && confirmLoadPreset()} role=\"dialog\" aria-labelledby=\"dialog-title\" aria-modal=\"true\" tabindex=\"0\">\n <div class=\"dialog-header\">\n <h3 id=\"dialog-title\">Load Preset</h3>\n <button type=\"button\" class=\"dialog-close\" on:click={cancelLoadPreset}>\n <X size={18} />\n </button>\n </div>\n <div class=\"dialog-body\">\n <p>Loading this preset will replace your current project and assets. Continue?</p>\n </div>\n <div class=\"dialog-footer\">\n <button type=\"button\" class=\"dialog-btn secondary\" on:click={cancelLoadPreset}>\n Cancel\n </button>\n <button type=\"button\" class=\"dialog-btn danger\" on:click={confirmLoadPreset}>\n Load Preset\n </button>\n </div>\n </div>\n </div>\n{/if}\n\n<style>\n .motion-editor {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #09090a;\n color: #f1f2f4;\n position: relative;\n min-height: 0;\n overflow: hidden;\n }\n\n .motion-editor.fullscreen {\n position: fixed;\n inset: 0;\n z-index: 200;\n }\n\n .workbench {\n flex: 1;\n min-height: 0;\n display: grid;\n grid-template-columns: 52px 260px 50px minmax(0, 1fr) 300px;\n }\n\n .workbench.chat-open {\n grid-template-columns: 52px 260px 324px minmax(0, 1fr) 300px;\n }\n\n .chat-drawer {\n box-sizing: border-box;\n display: flex;\n min-width: 0;\n min-height: 0;\n padding: 8px;\n overflow: hidden;\n background:\n linear-gradient(90deg, rgba(255, 255, 255, 0.026) 1px, transparent 1px),\n linear-gradient(rgba(255, 255, 255, 0.026) 1px, transparent 1px),\n #0b0c0e;\n background-size: 32px 32px;\n }\n\n .chat-drawer :global(.ai-chat-panel) {\n flex: 1;\n height: auto;\n border: 1px solid #2a2d33;\n border-radius: 10px;\n overflow: hidden;\n box-shadow: 0 14px 34px rgba(0, 0, 0, 0.28);\n }\n\n .chat-drawer.collapsed {\n display: flex;\n justify-content: center;\n padding-top: 14px;\n }\n\n .assistant-expand {\n width: 28px;\n height: 28px;\n display: grid;\n place-items: center;\n padding: 0;\n border: 1px solid #355e4f;\n border-radius: 6px;\n background: #17231f;\n color: #7cf7c5;\n cursor: pointer;\n }\n\n /* Navigation Rail */\n .nav-rail {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 12px 6px;\n background: #0a0b0c;\n border-right: 1px solid #1c1d20;\n }\n\n .nav-item {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .nav-item:hover {\n background: #17191c;\n color: #9ca3af;\n }\n\n .nav-item.active {\n background: #1a2f28;\n color: #7cf7c5;\n box-shadow: inset 2px 0 0 #7cf7c5;\n }\n\n /* Content Panel (Assets, Audio, Text, etc.) */\n .content-panel {\n display: flex;\n flex-direction: column;\n background: #111214;\n border-right: 1px solid #24262a;\n min-height: 0;\n overflow: hidden;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid #1c1d20;\n background: #0d0e10;\n }\n\n .panel-heading-title {\n color: #e4e6ea;\n font-size: 13px;\n font-weight: 600;\n margin: 0;\n }\n\n .panel-header-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .header-icon-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n background: #17191c;\n color: #a8adb5;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .header-icon-btn:hover {\n background: #202328;\n color: #d8dce2;\n }\n\n .panel-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 12px;\n scrollbar-width: thin;\n scrollbar-color: #34373d #111214;\n }\n\n .empty-state {\n color: #6b7280;\n font-size: 12px;\n text-align: center;\n padding: 24px 16px;\n }\n\n .asset-error {\n margin: 0 0 12px;\n color: #f09b9b;\n font-size: 11px;\n line-height: 1.4;\n }\n\n .media-dropzone {\n min-height: 100%;\n box-sizing: border-box;\n padding: 18px 12px;\n border: 1px dashed #4b5060;\n border-radius: 8px;\n color: #b9b8e8;\n text-align: center;\n transition: background 0.2s ease, border-color 0.2s ease, transform 0.2s ease;\n }\n\n .media-drop-prompt {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 7px;\n margin-bottom: 16px;\n }\n\n .media-dropzone.drag-active {\n border-color: #79e4bb;\n background: rgba(77, 140, 117, 0.16);\n animation: upload-pulse 0.8s ease-in-out infinite alternate;\n }\n\n @keyframes upload-pulse {\n to {\n transform: scale(1.015);\n box-shadow: 0 0 18px rgba(121, 228, 187, 0.2);\n }\n }\n\n .media-dropzone:has(.import-media-button:hover) {\n border-color: #4d8c75;\n }\n\n .media-drop-prompt span,\n .media-drop-prompt small {\n font-size: 11px;\n }\n\n .media-drop-prompt small {\n color: #777b88;\n }\n\n .import-media-button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid #4d8c75;\n border-radius: 6px;\n background: #1a3b30;\n color: #9af8d1;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n }\n\n .import-media-button:hover {\n background: #1a3028;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .media-dropzone.drag-active {\n animation: none;\n }\n }\n\n .panel-description {\n color: #8e939b;\n font-size: 12px;\n line-height: 1.6;\n padding: 0 0 16px 0;\n margin: 0 0 16px 0;\n border-bottom: 1px solid #1c1d20;\n }\n\n /* Asset Folders */\n .asset-folder {\n margin-bottom: 20px;\n }\n\n .folder-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 0;\n margin-bottom: 10px;\n color: #8e939b;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .folder-title {\n flex: 1;\n }\n\n .folder-count {\n color: #6b7280;\n font-size: 10px;\n font-weight: 600;\n background: #1a1c20;\n padding: 2px 6px;\n border-radius: 10px;\n }\n\n .folder-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n /* Asset Item (for list view like audio) */\n .asset-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n background: #0d0e10;\n transition: all 0.15s ease;\n }\n\n .asset-item:hover {\n background: #17191c;\n border-color: #363d4b;\n }\n\n .asset-item-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #17191c;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n color: #7cf7c5;\n }\n\n .asset-item-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .asset-item-name {\n color: #e4e6ea;\n font-size: 12px;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .asset-item-path {\n color: #6b7280;\n font-size: 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Asset Grid */\n .asset-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n gap: 8px;\n }\n\n .asset-card {\n display: flex;\n flex-direction: column;\n border: 1px solid transparent;\n border-radius: 6px;\n background: #0d0e10;\n cursor: pointer;\n transition: all 0.15s ease;\n overflow: hidden;\n padding: 0;\n }\n\n .asset-card:hover {\n background: #17191c;\n border-color: #2a2d33;\n }\n\n .asset-thumbnail {\n width: 100%;\n aspect-ratio: 16 / 9;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #17191c;\n color: #6b7280;\n overflow: hidden;\n }\n\n .asset-thumbnail img,\n .asset-thumbnail video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .asset-info {\n padding: 8px;\n }\n\n .asset-name {\n color: #d8dce2;\n font-size: 11px;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Audio Item */\n .audio-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n background: #0d0e10;\n color: #d8dce2;\n font-size: 13px;\n }\n\n /* Panel Tabs */\n .panel-tabs {\n display: flex;\n gap: 2px;\n }\n\n .panel-tab {\n padding: 6px 12px;\n border: none;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: #6b7280;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .panel-tab:hover {\n color: #9ca3af;\n }\n\n .panel-tab.active {\n color: #7cf7c5;\n border-bottom-color: #7cf7c5;\n }\n\n /* Preset Grid */\n .preset-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n gap: 12px;\n }\n\n .preset-card {\n display: flex;\n flex-direction: column;\n border: 1px solid #2a2d33;\n border-radius: 8px;\n background: #0d0e10;\n cursor: pointer;\n transition: all 0.15s ease;\n overflow: hidden;\n padding: 0;\n }\n\n .preset-card:hover {\n background: #17191c;\n border-color: #33584d;\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n }\n\n .preset-thumbnail {\n width: 100%;\n aspect-ratio: 16 / 9;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #000;\n overflow: hidden;\n }\n\n .preset-thumbnail img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .preset-info {\n padding: 10px;\n }\n\n .preset-name {\n color: #e4e6ea;\n font-size: 12px;\n font-weight: 600;\n text-align: center;\n }\n\n /* Effects Categories */\n .effects-categories {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .effects-category {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-title {\n color: #8e939b;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .category-hint {\n margin: -2px 0 2px;\n color: #686e77;\n font-size: 10px;\n line-height: 1.35;\n }\n\n .effects-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .effect-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n color: #d8dce2;\n font-size: 12px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .effect-item:hover {\n background: #1a1c20;\n border-color: #2a2d33;\n }\n\n .effect-item:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n\n .effect-item span {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n\n .transition-effect-item {\n border-color: #315449;\n background: linear-gradient(135deg, rgba(124, 247, 197, 0.12), rgba(124, 247, 197, 0.03));\n cursor: grab;\n }\n\n .transition-effect-item:active { cursor: grabbing; }\n .transition-effect-item span { display: flex; flex-direction: column; gap: 2px; }\n .transition-effect-item strong { color: #e9fff6; font-size: 11px; }\n .transition-effect-item small { color: #79827f; font-size: 9px; }\n\n /* Dialog */\n .dialog-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n backdrop-filter: blur(4px);\n }\n\n .dialog {\n width: 90%;\n max-width: 440px;\n background: #17191c;\n border: 1px solid #2a2d33;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);\n overflow: hidden;\n }\n\n .dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #24262a;\n }\n\n .dialog-header h3 {\n margin: 0;\n color: #e4e6ea;\n font-size: 16px;\n font-weight: 600;\n }\n\n .dialog-close {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: #9ca3af;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .dialog-close:hover {\n background: #24262a;\n color: #e4e6ea;\n }\n\n .dialog-body {\n padding: 20px;\n }\n\n .dialog-body p {\n margin: 0;\n color: #d8dce2;\n font-size: 14px;\n line-height: 1.6;\n }\n\n .dialog-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n padding: 16px 20px;\n border-top: 1px solid #24262a;\n background: #111214;\n }\n\n .dialog-btn {\n padding: 8px 16px;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .dialog-btn.secondary {\n background: transparent;\n color: #d8dce2;\n }\n\n .dialog-btn.secondary:hover {\n background: #24262a;\n }\n\n .dialog-btn.danger {\n background: #ef4444;\n color: #ffffff;\n border-color: #ef4444;\n }\n\n .dialog-btn.danger:hover {\n background: #dc2626;\n }\n\n .properties-panel {\n min-height: 0;\n overflow: auto;\n background: #111214;\n border-color: #24262a;\n padding: 14px;\n scrollbar-width: thin;\n scrollbar-color: #34373d #111214;\n border-left: 1px solid #24262a;\n }\n\n .panel-title,\n .section-title {\n color: #8e939b;\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0;\n text-transform: uppercase;\n margin-bottom: 12px;\n }\n\n .section-title {\n margin-top: 22px;\n }\n\n .layer-list {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n\n .layer-row {\n width: 100%;\n min-height: 48px;\n display: grid;\n grid-template-columns: 28px minmax(0, 1fr);\n align-items: center;\n gap: 9px;\n margin: 0;\n padding: 6px 8px;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n color: #e4e6ea;\n cursor: pointer;\n text-align: left;\n }\n\n .layer-row:hover {\n background: #1a1c20;\n }\n\n .layer-row.selected {\n background: #18201e;\n border-color: #33584d;\n box-shadow: inset 2px 0 #7cf7c5;\n }\n .layer-icon {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #2d3137;\n border-radius: 4px;\n background: #17191c;\n color: #a8adb5;\n overflow: hidden;\n }\n\n .layer-icon img,\n .track-thumb img {\n width: 100%;\n height: 100%;\n display: block;\n object-fit: contain;\n }\n\n .selected .layer-icon,\n .selection-summary .layer-icon {\n color: #7cf7c5;\n border-color: #33584d;\n }\n\n .layer-copy,\n .selection-summary > span:last-child {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 3px;\n }\n\n .layer-copy strong,\n .selection-summary strong {\n overflow: hidden;\n color: #eef0f2;\n font-size: 12px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .layer-copy small,\n .selection-summary small {\n overflow: hidden;\n color: #777d86;\n font-size: 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .selection-summary {\n display: grid;\n grid-template-columns: 30px minmax(0, 1fr);\n align-items: center;\n gap: 10px;\n margin: 0 0 18px;\n padding: 8px;\n border-bottom: 1px solid #24262a;\n }\n\n .preview-container {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n background:\n linear-gradient(90deg, rgba(255, 255, 255, 0.026) 1px, transparent 1px),\n linear-gradient(rgba(255, 255, 255, 0.026) 1px, transparent 1px),\n #0b0c0e;\n background-size: 32px 32px;\n overflow: hidden;\n }\n\n .stage-meta {\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 18px;\n color: #858a92;\n font-size: 12px;\n border-bottom: 1px solid #22252a;\n background: rgba(13, 14, 16, 0.92);\n }\n\n .stage-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .meta-btn,\n .icon-btn {\n border: 1px solid #2c3035;\n border-radius: 6px;\n background: #17191c;\n color: #d8dce2;\n cursor: pointer;\n }\n\n .meta-btn {\n height: 28px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 0 10px;\n font-size: 12px;\n }\n\n .meta-btn:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n }\n\n .icon-btn {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .meta-btn:hover,\n .icon-btn:hover {\n background: #202328;\n }\n\n .stage {\n flex: 1;\n min-height: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 36px;\n overflow: hidden;\n position: relative;\n }\n\n .property-align-toolbar {\n margin: 0 14px 14px;\n padding: 10px;\n border: 1px solid #292d33;\n border-radius: 6px;\n background: #111317;\n }\n\n .property-align-label {\n display: block;\n margin-bottom: 8px;\n color: #7f8791;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n }\n\n .property-align-actions {\n display: grid;\n grid-template-columns: repeat(3, 1fr) 1px repeat(3, 1fr);\n overflow: hidden;\n border: 1px solid #30353c;\n border-radius: 5px;\n }\n\n .property-align-actions button {\n min-width: 0;\n height: 30px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n border-right: 1px solid #30353c;\n background: #181b20;\n color: #cbd0d7;\n cursor: pointer;\n }\n\n .property-align-actions button:last-child { border-right: 0; }\n .property-align-actions button:hover { background: #282d34; color: #7cf7c5; }\n\n .align-divider {\n width: 1px;\n height: 30px;\n justify-self: center;\n background: #30353c;\n }\n\n .canvas-shell {\n position: relative;\n flex: 0 0 auto;\n height: auto;\n }\n\n .preview-canvas {\n display: block;\n width: 100%;\n height: auto;\n max-width: none;\n max-height: none;\n border-radius: 4px;\n background: #000;\n box-shadow:\n 0 24px 80px rgba(0, 0, 0, 0.58),\n 0 0 0 1px rgba(255, 255, 255, 0.08);\n cursor: grab;\n touch-action: none;\n }\n\n .preview-canvas.dragging {\n cursor: grabbing;\n }\n\n .snap-guide {\n position: absolute;\n z-index: 5;\n display: block;\n background: #ff405f;\n box-shadow: 0 0 0 1px rgba(255, 64, 95, 0.18);\n pointer-events: none;\n }\n\n .snap-guide-v {\n top: 0;\n bottom: 0;\n width: 1px;\n transform: translateX(-0.5px);\n }\n\n .snap-guide-h {\n right: 0;\n left: 0;\n height: 1px;\n transform: translateY(-0.5px);\n }\n\n .asset-preview-overlay {\n position: absolute;\n inset: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.95);\n border: 0;\n padding: 0;\n backdrop-filter: blur(8px);\n z-index: 100;\n cursor: default;\n border-radius: 4px;\n }\n\n .asset-preview-overlay img,\n .asset-preview-overlay video {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: 4px;\n }\n\n .asset-preview-close {\n position: absolute;\n top: 12px;\n right: 12px;\n width: 32px;\n height: 32px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #3a3f46;\n border-radius: 6px;\n background: rgba(17, 19, 23, 0.9);\n color: #fff;\n cursor: pointer;\n }\n\n .asset-preview-close:hover { background: #292e35; }\n\n /* Properties Panel Controls */\n .property-group {\n margin-bottom: 16px;\n }\n\n .property-label {\n display: block;\n color: #8e939b;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n\n .property-label-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n }\n\n .property-label-row .property-label { margin-bottom: 0; }\n\n .property-action {\n padding: 0;\n border: 0;\n background: transparent;\n color: #7cf7c5;\n font-size: 10px;\n cursor: pointer;\n }\n\n .property-action:hover { color: #b8ffe4; text-decoration: underline; }\n\n .clip-original-size { width: 100%; margin-bottom: 14px; }\n\n .transition-pair-copy {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n align-items: center;\n gap: 8px;\n margin: 0 0 16px;\n padding: 10px;\n border: 1px solid #2a2d33;\n border-radius: 5px;\n background: #121417;\n }\n\n .transition-pair-copy > span:not(.transition-pair-arrow) {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 3px;\n }\n\n .transition-pair-copy small { color: #727983; font-size: 9px; text-transform: uppercase; }\n .transition-pair-copy strong { overflow: hidden; color: #e8ebef; font-size: 11px; text-overflow: ellipsis; }\n .transition-pair-arrow { color: #7cf7c5; }\n .transition-remove { width: 100%; color: #ff9d9d; }\n\n .property-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n }\n\n /* Number Inputs with Suffix */\n .number-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .number-input {\n width: 100%;\n height: 32px;\n box-sizing: border-box;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n background: #17191c;\n color: #e4e6ea;\n font: inherit;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n padding: 0 26px 0 10px;\n outline: none;\n transition: all 0.12s ease;\n }\n\n .number-input:hover {\n border-color: #363d4b;\n background: #1a1c20;\n }\n\n .number-input:focus {\n border-color: #7cf7c5;\n background: #1a1c20;\n box-shadow: 0 0 0 2px rgba(124, 247, 197, 0.12);\n }\n\n .input-suffix {\n position: absolute;\n right: 10px;\n color: #6b7280;\n font-size: 11px;\n font-weight: 500;\n pointer-events: none;\n }\n\n /* Custom Sliders */\n .slider-control {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .custom-slider {\n flex: 1;\n height: 3px;\n -webkit-appearance: none;\n appearance: none;\n background: transparent;\n outline: none;\n padding: 0;\n margin: 0;\n }\n\n .custom-slider::-webkit-slider-track {\n width: 100%;\n height: 3px;\n background: linear-gradient(\n to right,\n #7cf7c5 0%,\n #7cf7c5 var(--slider-progress, 50%),\n #2a2d33 var(--slider-progress, 50%),\n #2a2d33 100%\n );\n border-radius: 2px;\n }\n\n .custom-slider::-moz-range-track {\n width: 100%;\n height: 3px;\n background: #2a2d33;\n border-radius: 2px;\n }\n\n .custom-slider::-moz-range-progress {\n height: 3px;\n background: #7cf7c5;\n border-radius: 2px;\n }\n\n .custom-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 12px;\n height: 12px;\n background: #e4e6ea;\n border: 2px solid #7cf7c5;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n transition: all 0.12s ease;\n }\n\n .custom-slider::-moz-range-thumb {\n width: 12px;\n height: 12px;\n background: #e4e6ea;\n border: 2px solid #7cf7c5;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n transition: all 0.12s ease;\n }\n\n .custom-slider:hover::-webkit-slider-thumb {\n transform: scale(1.15);\n box-shadow: 0 2px 6px rgba(124, 247, 197, 0.3), 0 0 0 4px rgba(124, 247, 197, 0.1);\n }\n\n .custom-slider:hover::-moz-range-thumb {\n transform: scale(1.15);\n box-shadow: 0 2px 6px rgba(124, 247, 197, 0.3), 0 0 0 4px rgba(124, 247, 197, 0.1);\n }\n\n .custom-slider:active::-webkit-slider-thumb {\n transform: scale(1.05);\n }\n\n .custom-slider:active::-moz-range-thumb {\n transform: scale(1.05);\n }\n\n .slider-value-input {\n width: 52px;\n height: 28px;\n box-sizing: border-box;\n border: 1px solid #2a2d33;\n border-radius: 5px;\n background: #17191c;\n color: #e4e6ea;\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n text-align: center;\n padding: 0 6px;\n outline: none;\n transition: all 0.12s ease;\n }\n\n .slider-value-input:hover {\n border-color: #363d4b;\n }\n\n .slider-value-input:focus {\n border-color: #7cf7c5;\n box-shadow: 0 0 0 2px rgba(124, 247, 197, 0.12);\n }\n\n /* Text Input & Textarea */\n .text-input {\n width: 100%;\n min-height: 72px;\n box-sizing: border-box;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n background: #17191c;\n color: #e4e6ea;\n font: inherit;\n font-size: 12px;\n line-height: 1.5;\n padding: 8px 10px;\n outline: none;\n resize: vertical;\n transition: all 0.12s ease;\n }\n\n .text-input:hover {\n border-color: #363d4b;\n }\n\n .text-input:focus {\n border-color: #7cf7c5;\n background: #1a1c20;\n box-shadow: 0 0 0 2px rgba(124, 247, 197, 0.12);\n }\n\n /* Color Input */\n .color-input {\n width: 100%;\n height: 36px;\n box-sizing: border-box;\n border: 1px solid #2a2d33;\n border-radius: 6px;\n background: #17191c;\n padding: 4px;\n cursor: pointer;\n transition: all 0.12s ease;\n }\n\n .color-input:hover {\n border-color: #363d4b;\n }\n\n .color-input:focus {\n border-color: #7cf7c5;\n box-shadow: 0 0 0 2px rgba(124, 247, 197, 0.12);\n }\n\n /* Preset Cards */\n .preset-cards {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 6px;\n }\n\n .preset-option {\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #2a2d33;\n border-radius: 5px;\n background: #17191c;\n color: #d8dce2;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.12s ease;\n }\n\n .preset-option:hover {\n background: #1a1c20;\n border-color: #363d4b;\n }\n\n .preset-option.active {\n background: #1a2f28;\n border-color: #33584d;\n color: #7cf7c5;\n box-shadow: inset 0 0 0 1px rgba(124, 247, 197, 0.2);\n }\n\n /* Easing Options */\n .easing-options {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .easing-option {\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n border: 1px solid transparent;\n border-radius: 5px;\n background: transparent;\n color: #d8dce2;\n font-size: 11px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n padding: 0 10px;\n text-align: left;\n cursor: pointer;\n transition: all 0.12s ease;\n }\n\n .easing-option:hover {\n background: #1a1c20;\n border-color: #2a2d33;\n }\n\n .easing-option.active {\n background: #1a2f28;\n border-color: #33584d;\n color: #7cf7c5;\n }\n\n .empty {\n color: #858a92;\n font-size: 13px;\n }\n\n .timeline-panel {\n flex: 0 0 var(--timeline-height);\n min-height: 0;\n display: flex;\n flex-direction: column;\n background: #0d0e10;\n border-top: 1px solid #24262a;\n }\n\n .timeline-resizer {\n flex: 0 0 7px;\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n border-bottom: 1px solid #24262a;\n background: #0d0e10;\n cursor: ns-resize;\n }\n\n .timeline-resizer span {\n width: 34px;\n height: 2px;\n border-radius: 1px;\n background: #3b4047;\n }\n\n .timeline-resizer:hover span,\n .timeline-resizer:focus-visible span {\n background: #7cf7c5;\n }\n\n .timeline-toolbar {\n flex: 0 0 46px;\n display: grid;\n grid-template-columns: minmax(280px, 1fr) auto minmax(280px, 1fr);\n align-items: center;\n gap: 14px;\n padding: 0 12px;\n border-bottom: 1px solid #24262a;\n background: #111214;\n }\n\n .playback-controls,\n .timeline-actions,\n .timeline-context {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .timeline-actions {\n min-width: 0;\n justify-content: flex-end;\n }\n\n .timeline-context {\n min-width: 0;\n color: #858a92;\n font-size: 11px;\n }\n\n .timeline-context span {\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .control-btn {\n width: 30px;\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #2c3035;\n border-radius: 5px;\n background: #17191c;\n color: white;\n cursor: pointer;\n }\n\n .control-btn:hover {\n background: #202328;\n border-color: #3a3f46;\n }\n\n .play-btn {\n border: none;\n background: #e6e8ec;\n color: #09090a;\n }\n\n .timecode {\n min-width: 50px;\n color: #f1f2f4;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n font-weight: 600;\n }\n\n .framecode {\n color: #777d86;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10px;\n }\n\n .timeline-command,\n .audio-chip {\n height: 28px;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 1px solid #2c3035;\n border-radius: 5px;\n background: #17191c;\n color: #d8dce2;\n padding: 0 9px;\n font-size: 11px;\n }\n\n .timeline-command {\n cursor: pointer;\n }\n\n .timeline-command:hover {\n background: #202328;\n }\n\n .audio-chip {\n max-width: 170px;\n overflow: hidden;\n color: #cdb5e5;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .file-input,\n .timeline-panel audio {\n display: none;\n }\n\n .timeline-scroll {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n overflow: auto;\n scrollbar-width: thin;\n scrollbar-color: #34373d #0d0e10;\n }\n\n .ruler-row,\n .timeline-row {\n width: 100%;\n min-width: var(--timeline-content-width, 820px);\n display: grid;\n grid-template-columns: 220px minmax(600px, 1fr);\n }\n\n .ruler-row {\n position: sticky;\n order: -10000;\n top: 0;\n z-index: 4;\n height: 30px;\n background: #111214;\n }\n\n .timeline-row {\n min-height: 42px;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: #d8dce2;\n text-align: left;\n }\n\n .timeline-row:hover,\n .timeline-row.selected {\n background: #151719;\n }\n\n .timeline-row.selected .track-label {\n color: #f1f2f4;\n box-shadow: inset 2px 0 #7cf7c5;\n }\n\n .track-label {\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 11px;\n border-right: 1px solid #24262a;\n border-bottom: 1px solid #1d1f22;\n color: #a8adb5;\n border-top: 0;\n border-left: 0;\n background: transparent;\n font: inherit;\n font-size: 11px;\n text-align: left;\n cursor: default;\n }\n\n .track-label strong {\n min-width: 0;\n overflow: hidden;\n font-size: 11px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .track-thumb {\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border: 1px solid #2c3138;\n border-radius: 3px;\n background: #111419;\n color: #858c95;\n }\n\n .track-copy {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .track-copy small {\n max-width: 82px;\n overflow: hidden;\n color: #676d75;\n font-size: 9px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .track-controls { margin-left: auto; display: flex; align-items: center; gap: 2px; }\n .track-control { width: 24px; height: 24px; padding: 0; display: grid; place-items: center; border: 0; border-radius: 4px; background: transparent; color: #737a83; cursor: pointer; }\n .track-control:hover { color: #dce1e6; background: #202329; }\n .track-control.active { color: #f0b26d; }\n .track-label.track-hidden .track-copy { opacity: .55; }\n\n .track-time {\n margin-left: auto;\n color: #676d75;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 9px;\n white-space: nowrap;\n }\n\n .ruler-label {\n color: #777d86;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n }\n\n .ruler,\n .track-lane {\n position: relative;\n border-bottom: 1px solid #1d1f22;\n background-image: repeating-linear-gradient(90deg, transparent 0, transparent 59px, rgba(255, 255, 255, 0.035) 60px);\n }\n\n .ruler-tick {\n position: absolute;\n top: 8px;\n color: #676d75;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 9px;\n transform: translateX(-50%);\n pointer-events: none;\n }\n\n .playhead-marker {\n position: absolute;\n z-index: 2;\n top: 0;\n bottom: -1px;\n width: 2px;\n background: #f1f2f4;\n transform: translateX(-50%);\n pointer-events: none;\n }\n\n .playhead-marker::before {\n content: '';\n position: absolute;\n top: 0;\n left: 50%;\n width: 0;\n height: 0;\n border-top: 7px solid #f1f2f4;\n border-right: 6px solid transparent;\n border-left: 6px solid transparent;\n transform: translateX(-50%);\n }\n\n /* Drop Indicator */\n .drop-indicator {\n position: absolute;\n z-index: 3;\n top: 0;\n bottom: -1px;\n width: 3px;\n background: #7cf7c5;\n transform: translateX(-50%);\n pointer-events: none;\n box-shadow: 0 0 8px rgba(124, 247, 197, 0.6);\n }\n\n .drop-indicator::before {\n content: '';\n position: absolute;\n top: 0;\n left: 50%;\n width: 0;\n height: 0;\n border-top: 8px solid #7cf7c5;\n border-right: 7px solid transparent;\n border-left: 7px solid transparent;\n transform: translateX(-50%);\n }\n\n .timeline-scroll.drop-target {\n background: rgba(124, 247, 197, 0.05);\n }\n\n /* Timeline Clip Styles */\n .clip-row .track-label {\n background: #0d0e10;\n }\n\n .timeline-clip {\n border: 2px solid #7cf7c5;\n background: rgba(124, 247, 197, 0.1);\n }\n\n .clip-trim-label {\n position: absolute;\n z-index: 1;\n right: 22px;\n bottom: 2px;\n left: 4px;\n overflow: hidden;\n color: rgba(255, 255, 255, 0.82);\n font-size: 8px;\n line-height: 10px;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n }\n\n .timeline-clip.selected-clip {\n border-color: #f1f2f4;\n box-shadow: 0 0 0 1px #7cf7c5;\n }\n\n .transition-cut {\n position: absolute;\n z-index: 6;\n top: 10px;\n width: 16px;\n height: 16px;\n padding: 0;\n border: 1px solid #515860;\n border-radius: 4px;\n background: #15181c;\n color: #9ba1a9;\n font-size: 12px;\n line-height: 14px;\n cursor: pointer;\n transform: translateX(-50%);\n transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;\n }\n\n .transition-cut.has-transition {\n border-color: #7cf7c5;\n background: #1c4a3d;\n color: #ecfff7;\n box-shadow: 0 0 0 2px rgba(13, 14, 16, 0.85);\n }\n\n .transition-cut.drop-ready {\n width: 22px;\n height: 22px;\n top: 7px;\n border-color: #7cf7c5;\n background: #243d35;\n color: #fff;\n box-shadow: 0 0 12px rgba(124, 247, 197, 0.65);\n }\n\n .transition-cut.selected-transition {\n border-color: #fff;\n box-shadow: 0 0 0 2px #7cf7c5, 0 0 12px rgba(124, 247, 197, 0.55);\n }\n\n .clip-delete {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 18px;\n height: 18px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 3px;\n background: rgba(239, 68, 68, 0.9);\n color: #fff;\n opacity: 0;\n cursor: pointer;\n transition: opacity 0.15s ease;\n z-index: 2;\n }\n\n .timeline-clip:hover .clip-delete {\n opacity: 1;\n }\n\n .clip-delete:hover {\n background: #dc2626;\n }\n\n .timeline-scrubber {\n position: absolute;\n inset: 0;\n z-index: 3;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: ew-resize;\n }\n\n .track-lane {\n min-height: 41px;\n }\n\n .clip {\n position: absolute;\n top: 7px;\n height: 27px;\n min-width: 5px;\n border: 1px solid #536070;\n border-radius: 3px;\n background: #34404e;\n box-sizing: border-box;\n overflow: visible;\n }\n\n .clip-media,\n .clip-color,\n .clip-text {\n position: absolute;\n inset: 1px;\n overflow: hidden;\n border-radius: 2px;\n pointer-events: none;\n }\n\n .clip-media {\n background-color: #11151a;\n background-repeat: repeat-x;\n background-position: left center;\n background-size: auto 100%;\n opacity: 0.8;\n }\n\n .video-clip-media {\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #15241f, #17202b);\n color: #7cf7c5;\n }\n\n .clip-color {\n opacity: 0.8;\n }\n\n .clip-text {\n padding: 5px 8px;\n color: rgba(244, 247, 249, 0.9);\n font-size: 10px;\n line-height: 15px;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .clip-select {\n position: absolute;\n inset: 0;\n width: 100%;\n padding: 0;\n border: 0;\n border-radius: 2px;\n background: transparent;\n cursor: grab;\n touch-action: none;\n }\n .clip-select:active { cursor: grabbing; }\n\n .clip-ghost {\n position: absolute;\n z-index: 3;\n top: 6px;\n height: 27px;\n border: 1px dashed #7cf7c5;\n border-radius: 3px;\n background: rgba(124, 247, 197, 0.14);\n pointer-events: none;\n }\n .clip-ghost.invalid {\n border-color: #ff6b74;\n background: rgba(255, 107, 116, 0.14);\n }\n\n .trim-handle {\n position: absolute;\n z-index: 2;\n top: -2px;\n bottom: -2px;\n width: min(8px, 30%);\n padding: 0;\n border: 0;\n border-radius: 2px;\n background: #c7d0d9;\n opacity: 0;\n pointer-events: none;\n cursor: ew-resize;\n }\n\n .trim-start {\n left: -1px;\n }\n\n .trim-end {\n right: -1px;\n }\n\n .timeline-row:hover .trim-handle,\n .timeline-row.selected .trim-handle,\n .trim-handle:focus-visible {\n opacity: 1;\n pointer-events: auto;\n }\n\n .element-clip.selected-clip {\n border-color: #69cda9;\n background: #31594d;\n }\n\n .audio-clip {\n border-color: #725d86;\n background: #4e405d;\n }\n\n .mask-select { min-height: 34px; width: 100%; }\n\n .toggle-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: -2px 0 10px;\n color: #b6bbc2;\n font-size: 11px;\n cursor: pointer;\n }\n\n .toggle-row input { accent-color: #7cf7c5; }\n\n .keyframe-marker {\n position: absolute;\n z-index: 5;\n top: 50%;\n width: 10px;\n height: 10px;\n padding: 0;\n border: 1px solid #111318;\n border-radius: 1px;\n background: #f4b860;\n box-shadow: 0 0 0 1px rgba(244, 184, 96, 0.22);\n transform: translate(-50%, -50%) rotate(45deg);\n cursor: ew-resize;\n touch-action: none;\n }\n\n .keyframe-marker:hover,\n .keyframe-marker.selected-keyframe {\n background: #fff1c9;\n box-shadow: 0 0 0 2px #f4b860;\n }\n\n .drag-keyframe { pointer-events: none; }\n\n .keyframe-add {\n position: absolute;\n z-index: 5;\n top: 50%;\n width: 15px;\n height: 15px;\n padding: 0;\n display: grid;\n place-items: center;\n border: 1px solid #2f6d59;\n border-radius: 50%;\n background: #17362d;\n color: #b8ffe4;\n font-size: 12px;\n line-height: 1;\n transform: translate(-50%, -50%);\n cursor: pointer;\n opacity: 0;\n }\n .timeline-row:hover .keyframe-add,\n .timeline-row.selected .keyframe-add {\n opacity: 1;\n }\n .keyframe-add:hover { background: #1d4538; }\n\n .keyframe-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .keyframe-controls .timeline-command { flex: 1; }\n .keyframe-controls .number-input-wrapper { width: 84px; }\n .easing-input { margin-top: 8px; min-height: 32px; }\n\n .playhead {\n position: absolute;\n z-index: 2;\n top: 0;\n bottom: 0;\n width: 1px;\n background: #f1f2f4;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.45);\n pointer-events: none;\n }\n\n .danger-btn:hover {\n border-color: #714044;\n background: #2b1719;\n color: #ff9da5;\n }\n\n .source-toggle {\n position: absolute;\n right: 316px;\n bottom: calc(var(--timeline-height) + 10px);\n border: 1px solid #2c3035;\n border-radius: 6px;\n background: #111214;\n color: #d8dce2;\n padding: 8px 10px;\n font-size: 12px;\n cursor: pointer;\n }\n\n .code-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: var(--timeline-height);\n background: rgba(5, 5, 6, 0.88);\n backdrop-filter: blur(8px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n animation: fadeIn 0.2s ease-out;\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n .code-panel {\n width: 90%;\n max-width: 1200px;\n height: 80%;\n background: #111214;\n border: 1px solid #2c3035;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n box-shadow: 0 16px 64px rgba(0, 0, 0, 0.8);\n animation: slideUp 0.2s ease-out;\n }\n\n @keyframes slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n\n .code-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n border-bottom: 1px solid #24262a;\n }\n\n .code-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #f1f2f4;\n }\n\n .close-btn {\n width: 36px;\n height: 36px;\n background: transparent;\n border: 1px solid #2c3035;\n border-radius: 6px;\n color: #8e939b;\n cursor: pointer;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .close-btn:hover {\n background: #202328;\n color: #fff;\n border-color: #3a3f46;\n }\n\n .code-textarea {\n flex: 1;\n padding: 24px;\n background: #111214;\n border: none;\n color: #e6e8ec;\n font-family: 'Fira Code', 'Courier New', monospace;\n font-size: 15px;\n line-height: 1.6;\n resize: none;\n outline: none;\n tab-size: 2;\n }\n\n .code-textarea::placeholder {\n color: #6d737c;\n }\n\n .error-banner {\n margin: 12px;\n padding: 12px 14px;\n background: rgba(255, 107, 107, 0.08);\n border: 1px solid rgba(255, 107, 107, 0.28);\n border-radius: 6px;\n color: #ff6b6b;\n font-size: 12px;\n font-family: monospace;\n }\n\n @media (max-width: 900px) {\n .workbench,\n .workbench.chat-open {\n grid-template-columns: 1fr;\n }\n\n .nav-rail,\n .content-panel,\n .chat-drawer,\n .chat-drawer.collapsed,\n .properties-panel {\n display: none;\n }\n\n .source-toggle {\n right: 16px;\n }\n\n .timeline-toolbar {\n grid-template-columns: 1fr auto;\n }\n\n .timeline-context {\n display: none;\n }\n\n .timeline-actions .audio-chip,\n .framecode {\n display: none;\n }\n }\n</style>\n","<script lang=\"ts\">\n import { onMount } from 'svelte';\n import { CircleHelp, Download, FileText, FolderOpen, Save, Star } from 'lucide-svelte';\n import { appUrl } from '../app/routing';\n import MotionEditor from './components/MotionEditor.svelte';\n\n const logoUrl = appUrl('logo.svg');\n const githubIconUrl = appUrl('github.svg');\n\n type MotionFileHandle = {\n name: string;\n getFile(): Promise<File>;\n createWritable(): Promise<{ write(data: string): Promise<void>; close(): Promise<void> }>;\n };\n\n type FilePickerWindow = Window & {\n showOpenFilePicker?: (options: object) => Promise<MotionFileHandle[]>;\n showSaveFilePicker?: (options: object) => Promise<MotionFileHandle>;\n };\n\n type MotionEditorHandle = {\n exportMp4(filename?: string, onProgress?: (progress: number) => void): Promise<void>;\n };\n\n const fallbackMotion = `canvas {\n size 1920x1080\n fps 60\n duration 5s\n background #020308\n}\n\ntext title {\n value \"Motion graphics, written.\"\n center\n size 72\n color #ffffff\n opacity 1\n}\n\nanimate title {\n from {\n opacity 0\n y 80\n blur 10\n }\n\n to {\n opacity 1\n y 0\n blur 0\n }\n\n duration 1.2s\n easing power3.out\n}`;\n\n let motionCode = fallbackMotion;\n\n let currentFile = 'untitled.motion';\n let fileInput: HTMLInputElement;\n let fileHandle: MotionFileHandle | null = null;\n let serverBacked = false;\n let saveTimer: ReturnType<typeof setTimeout> | null = null;\n let writeQueue = Promise.resolve();\n let editor: MotionEditorHandle | undefined;\n let isExporting = false;\n let exportProgress = 0;\n let starCount: number | null = null;\n\n onMount(() => {\n void loadInitialProject();\n void loadStarCount();\n return () => {\n if (saveTimer) clearTimeout(saveTimer);\n };\n });\n\n $: if (fileHandle) scheduleAutoSave(motionCode);\n\n async function loadInitialProject() {\n try {\n let response = await fetch('/api/motion-project', { cache: 'no-store' });\n if (response.ok && response.headers.get('content-type')?.startsWith('text/plain')) {\n motionCode = await response.text();\n currentFile = response.headers.get('x-motionly-project-name') || 'project.motion';\n serverBacked = true;\n return;\n }\n } catch (error) {\n console.warn(error);\n }\n \n // Start with simple fallback motion\n motionCode = fallbackMotion;\n }\n\n async function handleOpen() {\n const picker = (window as FilePickerWindow).showOpenFilePicker;\n if (!picker) {\n fileInput.click();\n return;\n }\n try {\n const [handle] = await picker.call(window, {\n multiple: false,\n types: [{ description: 'Motionly project', accept: { 'text/plain': ['.motion'] } }],\n });\n if (!handle) return;\n const file = await handle.getFile();\n motionCode = await file.text();\n currentFile = file.name;\n fileHandle = handle;\n serverBacked = false;\n } catch (error) {\n if ((error as DOMException).name !== 'AbortError') console.error(error);\n }\n }\n\n async function handleSave() {\n if (fileHandle) {\n await writeFile(fileHandle, motionCode);\n return;\n }\n if (serverBacked) {\n const response = await fetch('/api/motion-project', {\n method: 'PUT',\n headers: { 'content-type': 'text/plain;charset=utf-8' },\n body: motionCode,\n });\n if (!response.ok) throw new Error(`Could not save ${currentFile} (${response.status})`);\n return;\n }\n const picker = (window as FilePickerWindow).showSaveFilePicker;\n if (picker) {\n try {\n fileHandle = await picker.call(window, {\n suggestedName: currentFile.endsWith('.motion') ? currentFile : `${currentFile}.motion`,\n types: [{ description: 'Motionly project', accept: { 'text/plain': ['.motion'] } }],\n });\n currentFile = fileHandle.name;\n await writeFile(fileHandle, motionCode);\n return;\n } catch (error) {\n if ((error as DOMException).name !== 'AbortError') console.error(error);\n return;\n }\n }\n const blob = new Blob([motionCode], { type: 'text/plain;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = currentFile.endsWith('.motion') ? currentFile : `${currentFile}.motion`;\n link.click();\n URL.revokeObjectURL(url);\n }\n\n async function handleFileSelected(event: Event) {\n const file = (event.currentTarget as HTMLInputElement).files?.[0];\n if (!file) return;\n motionCode = await file.text();\n currentFile = file.name;\n fileHandle = null;\n serverBacked = false;\n fileInput.value = '';\n }\n\n function scheduleAutoSave(source: string) {\n if (!fileHandle) return;\n if (saveTimer) clearTimeout(saveTimer);\n saveTimer = setTimeout(() => {\n const handle = fileHandle;\n if (!handle) return;\n writeQueue = writeQueue.then(() => writeFile(handle, source)).catch(console.error);\n }, 250);\n }\n\n async function writeFile(handle: MotionFileHandle, source: string) {\n const writable = await handle.createWritable();\n await writable.write(source);\n await writable.close();\n }\n\n async function handleExport() {\n if (!editor || isExporting) return;\n isExporting = true;\n exportProgress = 0;\n try {\n const filename = currentFile.replace(/\\.motion$/i, '') || 'motionly';\n await editor.exportMp4(`${filename}.mp4`, (progress) => (exportProgress = progress));\n } finally {\n isExporting = false;\n }\n }\n\n async function loadStarCount() {\n try {\n const response = await fetch('https://api.github.com/repos/COPPSARY/Motionly');\n if (!response.ok) return;\n const data = (await response.json()) as { stargazers_count?: number };\n if (typeof data.stargazers_count === 'number') starCount = data.stargazers_count;\n } catch {\n // The repository link still works if GitHub is unavailable.\n }\n }\n\n function formatStarCount(value: number): string {\n return new Intl.NumberFormat('en', { notation: 'compact', maximumFractionDigits: 1 }).format(value);\n }\n</script>\n\n<div class=\"app\">\n <!-- Top Bar -->\n <div class=\"top-bar\">\n <div class=\"brand\">\n <span class=\"logo-shell\">\n <img src={logoUrl} alt=\"Motionly\" class=\"logo\" />\n </span>\n <h1>Motionly</h1>\n <a\n class=\"product-hunt-badge\"\n href=\"https://www.producthunt.com/products/motionly?embed=true&utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-motionly\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"View Motionly on Product Hunt\"\n >\n <img\n alt=\"Motionly - Motionly is an AI-native motion graphics editor. | Product Hunt\"\n width=\"250\"\n height=\"54\"\n src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1197499&theme=dark&t=1784188075155\"\n />\n </a>\n </div>\n\n <div class=\"file-info\">\n <FileText size={16} />\n <span>{currentFile}</span>\n </div>\n\n <div class=\"actions\">\n <input\n bind:this={fileInput}\n class=\"file-input\"\n type=\"file\"\n accept=\".motion,text/plain\"\n on:change={handleFileSelected}\n />\n <button on:click={handleOpen} class=\"btn\" title=\"Open .motion file\">\n <FolderOpen size={18} />\n <span class=\"action-label\">Open</span>\n </button>\n <button on:click={handleSave} class=\"btn btn-primary\" title=\"Save changes\">\n <Save size={18} />\n <span class=\"action-label\">Save</span>\n </button>\n <button on:click={handleExport} class=\"btn export-action\" disabled={isExporting} title=\"Export MP4\">\n <Download size={18} />\n <span class=\"action-label\">{isExporting ? `Exporting ${Math.round(exportProgress * 100)}%` : 'Export MP4'}</span>\n </button>\n <a class=\"btn welcome-btn\" href={`${appUrl()}?welcome=1`} title=\"View welcome guide\" aria-label=\"View welcome guide\">\n <CircleHelp size={18} />\n </a>\n <a\n class=\"btn github-btn\"\n href=\"https://github.com/COPPSARY/Motionly\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Star Motionly on GitHub\"\n aria-label={starCount === null ? 'Star Motionly on GitHub' : `Star Motionly on GitHub, ${starCount} stars`}\n >\n <img src={githubIconUrl} alt=\"\" />\n <Star size={14} fill=\"currentColor\" />\n <span class=\"action-label\">Star</span>\n {#if starCount !== null}\n <strong>{formatStarCount(starCount)}</strong>\n {:else}\n <img\n class=\"star-count\"\n src=\"https://img.shields.io/github/stars/COPPSARY/Motionly?style=flat&label=\"\n alt=\"Stars\"\n />\n {/if}\n </a>\n <a\n class=\"btn docs-btn\"\n href=\"https://motionly.mintlify.app/\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"View Documentation\"\n aria-label=\"View Documentation\"\n >\n <FileText size={18} />\n <span class=\"action-label\">Documentation</span>\n </a>\n </div>\n </div>\n\n <!-- Editor -->\n <MotionEditor bind:this={editor} bind:code={motionCode} />\n</div>\n\n<style>\n :global(html),\n :global(body) {\n width: 100%;\n height: 100%;\n margin: 0;\n overflow: hidden;\n background: #09090a;\n }\n\n :global(body) {\n font-family:\n Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n }\n\n .app {\n width: 100%;\n height: 100dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #09090a;\n }\n\n .app :global(.motion-editor) {\n flex: 1 1 auto;\n min-height: 0;\n }\n\n .top-bar {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 18px;\n padding: 10px 18px;\n background: #101113;\n border-bottom: 1px solid #24262a;\n box-shadow: 0 1px 0 rgba(255, 255, 255, 0.03) inset;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .logo-shell {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n border-radius: 9px;\n background: #15171a;\n border: 1px solid #2a2d32;\n box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28);\n }\n\n .brand .logo {\n width: 24px;\n height: 24px;\n display: block;\n border-radius: 7px;\n }\n\n .brand h1 {\n margin: 0;\n font-size: 15px;\n font-weight: 650;\n color: #f2f3f5;\n letter-spacing: 0;\n }\n\n .product-hunt-badge {\n flex: 0 0 auto;\n display: flex;\n margin-left: 4px;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .product-hunt-badge img {\n width: 125px;\n height: 27px;\n display: block;\n }\n\n .file-info {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n color: #8e939b;\n font-size: 13px;\n }\n\n .file-info span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .actions {\n display: flex;\n gap: 8px;\n flex: 0 0 auto;\n }\n\n .file-input {\n display: none;\n }\n\n .btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 13px;\n background: #17191c;\n border: 1px solid #2c3035;\n border-radius: 6px;\n color: #e4e6ea;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.16s, border-color 0.16s, color 0.16s;\n }\n\n .btn:hover {\n background: #202328;\n border-color: #3a3f46;\n color: #fff;\n }\n\n .btn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n }\n\n .export-action {\n min-width: 116px;\n justify-content: center;\n }\n\n .btn-primary {\n background: #e6e8ec;\n border-color: #e6e8ec;\n color: #09090a;\n font-weight: 600;\n }\n\n .btn-primary:hover {\n background: #ffffff;\n border-color: #ffffff;\n color: #050506;\n }\n\n .github-btn {\n min-width: 92px;\n justify-content: center;\n padding: 8px 10px;\n box-sizing: border-box;\n text-decoration: none;\n }\n\n .docs-btn {\n justify-content: center;\n padding: 8px 10px;\n box-sizing: border-box;\n text-decoration: none;\n }\n\n .welcome-btn {\n width: 36px;\n justify-content: center;\n padding: 0;\n text-decoration: none;\n }\n\n .github-btn img {\n width: 18px;\n height: 18px;\n display: block;\n }\n\n .github-btn strong {\n padding-left: 7px;\n border-left: 1px solid #34383e;\n color: #ffffff;\n font-size: 12px;\n }\n\n .github-btn .star-count {\n width: auto;\n height: 18px;\n border-left: 1px solid #34383e;\n padding-left: 7px;\n }\n\n @media (max-width: 1120px) {\n .product-hunt-badge {\n display: none;\n }\n }\n\n @media (max-width: 760px) {\n .file-info {\n display: none;\n }\n }\n\n @media (max-width: 520px) {\n .top-bar {\n gap: 8px;\n padding: 8px;\n }\n\n .brand h1,\n .action-label {\n display: none;\n }\n\n .actions {\n gap: 5px;\n }\n\n .btn,\n .export-action {\n width: 36px;\n min-width: 36px;\n height: 36px;\n justify-content: center;\n padding: 0;\n }\n\n .github-btn {\n width: auto;\n min-width: 58px;\n padding: 0 8px;\n }\n }\n</style>\n","/**\n * Main application entry point - Svelte 5\n */\n\nimport { inject } from '@vercel/analytics';\nimport { mount } from 'svelte';\nimport { appUrl, initialRoute, ONBOARDING_COMPLETE_KEY, relativeAppPath } from './app/routing';\nimport Onboarding from './ui/Onboarding.svelte';\nimport MotionlyApp from './ui/MotionlyApp.svelte';\n\nconst forceWelcome = new URLSearchParams(location.search).get('welcome') === '1';\nconst completed = localStorage.getItem(ONBOARDING_COMPLETE_KEY) === 'true';\nconst route = initialRoute(location.pathname, forceWelcome, completed, import.meta.env.BASE_URL);\n\nif (route === 'editor' && relativeAppPath(location.pathname).replace(/\\/$/, '') !== '/editor') {\n history.replaceState(null, '', appUrl('editor'));\n}\n\ninject({ mode: import.meta.env.PROD ? 'production' : 'development' });\n\nconst app = mount(route === 'editor' ? MotionlyApp : Onboarding, {\n target: document.body,\n});\n\nexport default app;\n"],"names":["initQueue","params","name","version","isBrowser","detectEnvironment","env","setMode","mode","getMode","isDevelopment","getScriptSrc","props","makeAbsolute","loadProps","explicitProps","confString","_a","dataset","url","inject","beforeSend","src","script","key","value","errorMessage","DEV","is_array","index_of","includes","array_from","define_property","get_descriptor","get_descriptors","object_prototype","array_prototype","get_prototype_of","is_extensible","is_function","thing","noop","run","fn","run_all","arr","i","deferred","resolve","reject","promise","res","rej","to_array","n","array","element","DERIVED","EFFECT","RENDER_EFFECT","MANAGED_EFFECT","BLOCK_EFFECT","BRANCH_EFFECT","ROOT_EFFECT","BOUNDARY_EFFECT","CONNECTED","CLEAN","DIRTY","MAYBE_DIRTY","INERT","DESTROYED","REACTION_RAN","DESTROYING","EFFECT_TRANSPARENT","EAGER_EFFECT","HEAD_EFFECT","EFFECT_PRESERVED","USER_EFFECT","EFFECT_OFFSCREEN","WAS_MARKED","REACTION_IS_UPDATING","ASYNC","ERROR_VALUE","STATE_SYMBOL","LEGACY_PROPS","LOADING_ATTR_SYMBOL","ATTRIBUTES_CACHE","CLASS_CACHE","STYLE_CACHE","TEXT_CACHE","FORM_RESET_HANDLER","STALE_REACTION","IS_XHTML","lifecycle_outside_component","async_derived_orphan","each_key_duplicate","a","b","effect_in_teardown","rune","effect_in_unowned_derived","effect_orphan","effect_update_depth_exceeded","props_invalid_value","state_descriptors_fixed","state_prototype_fixed","state_unsafe_mutation","svelte_boundary_reset_onerror","EACH_ITEM_REACTIVE","EACH_INDEX_REACTIVE","EACH_IS_CONTROLLED","EACH_IS_ANIMATED","EACH_ITEM_IMMUTABLE","PROPS_IS_IMMUTABLE","PROPS_IS_RUNES","PROPS_IS_UPDATED","PROPS_IS_BINDABLE","PROPS_IS_LAZY_INITIAL","TEMPLATE_FRAGMENT","TEMPLATE_USE_IMPORT_NODE","UNINITIALIZED","NAMESPACE_HTML","NAMESPACE_SVG","ATTACHMENT_KEY","derived_inert","select_multiple_invalid_value","svelte_boundary_reset_noop","equals","safe_not_equal","safe_equals","legacy_mode_flag","tracing_mode_flag","enable_legacy_mode_flag","component_context","set_component_context","context","push","runes","active_effect","pop","component","effects","create_user_effect","is_runes","micro_tasks","run_micro_tasks","tasks","queue_micro_task","is_flushing_sync","flush_tasks","handle_error","error","effect","active_reaction","invoke_error_boundary","e","STATUS_MASK","set_signal_status","signal","status","update_derived_status","derived","clear_marked","deps","dep","defer_effect","dirty_effects","maybe_dirty_effects","is_store_binding","capture_store_binding","previous_is_store_binding","createSubscriber","start","subscribers","source","stop","effect_tracking","get","render_effect","untrack","increment","flags","boundary","node","children","transform_error","Boundary","#anchor","#hydrate_open","#props","#children","#effect","#main_effect","#pending_effect","#failed_effect","#offscreen_fragment","#local_pending_count","#pending_count","#pending_count_update_queued","#dirty_effects","#maybe_dirty_effects","#effect_pending","#effect_pending_subscriber","anchor","block","#render","#hydrate_resolved_content","branch","#hydrate_failed_content","failed","#hydrate_pending_content","pending","fragment","create_text","#run","pause_effect","#resolve","current_batch","move_effect","batch","previous_effect","previous_reaction","previous_ctx","set_active_effect","set_active_reaction","Batch","#update_pending_count","d","internal_set","#handle_error","destroy_effect","onerror","did_reset","calling_on_error","reset","w.svelte_boundary_reset_noop","e.svelte_boundary_reset_onerror","handle_error_result","transformed_error","result","flatten","blockers","sync","async","derived_safe_equal","deriveds","parent","restore","capture","blocker_promise","finish","unset_context","decrement_pending","increment_pending","expression","async_derived","previous_component_context","previous_batch","activate_batch","deactivate_batch","blocking","OBSOLETE","label","location","e.async_derived_orphan","should_suspend","deferreds","async_effect","handler","teardown","fulfil","next","p","go","user_derived","push_reaction_value","destroy_derived_effects","execute_derived","prev_active_effect","is_destroying_effect","w.derived_inert","update_reaction","update_derived","increment_write_version","batch_values","freeze_derived_effects","remove_reactions","destroy_effect_children","unfreeze_derived_effects","update_effect","first_batch","last_batch","last_scheduled_effect","is_processing","collected_effects","legacy_updates","flush_count","uid","#started","#prev","#next","#commit_callbacks","#discard_callbacks","#pending","#blocking_pending","#deferred","#roots","#new_effects","#skipped_branches","#unskipped_branches","#decrement_queued","#is_deferred","skipped","callback","tracked","#process","#unlink","infinite_loop_guard","roots","render_effects","updates","root","#traverse","reset_all","#defer_effects","t","reset_branch","earlier_batch","#find_earlier_batch","#merge","flush_queued_effects","next_batch","r","is_branch","is_skippable_branch","skip","is_dirty","child","is_derived","mark","reactions","reaction","old_values","#commit","is_earlier","sources","batch_value","current","others","unskipped","marked","checked","mark_effects","current_unequal","c","v1","v2","depends_on","blocking_pending_count","prev","flushSync","was_flushing_sync","e.effect_update_depth_exceeded","eager_block_effects","length","unlink_effect","ordered_effects","ancestor","j","schedule_effect","depends","eager_effects","eager_effects_deferred","v","stack","state","s","mutable_source","initial_value","immutable","trackable","mutate","set","should_proxy","untracking","current_sources","e.state_unsafe_mutation","new_value","proxy","updated_during_traversal","mark_reactions","untracked_writes","set_untracked_writes","flush_eager_effects","dirty","update","not_dirty","prototype","is_proxied_array","parent_version","update_version","with_parent","set_update_version","_","prop","descriptor","e.state_descriptors_fixed","target","receiver","exists","has","other_s","ls","own_keys","e.state_prototype_fixed","get_proxied_value","is","$window","is_firefox","first_child_getter","next_sibling_getter","init_operations","element_prototype","node_prototype","text_prototype","get_first_child","get_next_sibling","is_text","first_child","first","sibling","count","next_sibling","clear_text_content","should_defer_append","create_element","tag","namespace","autofocus","dom","body","listening_to_form_reset","add_form_reset_listener","evt","without_reactive_context","listen_to_event_and_reset_event","event","on_reset","validate_effect","e.effect_orphan","e.effect_in_unowned_derived","e.effect_in_teardown","push_effect","parent_effect","parent_last","create_effect","type","user_effect","defer","user_pre_effect","component_root","options","legacy_pre_effect","token","legacy_pre_effect_reset","template_effect","values","managed","execute_effect_teardown","previously_destroying_effect","set_is_destroying_effect","remove_dom","controller","destroy_block_effect_children","removed","remove_effect_dom","transitions","transition","end","destroy","pause_children","remaining","check","local","transparent","resume_effect","resume_children","captured_signals","capture_signals","previous_captured_signals","invalidate_inner_signals","is_updating_effect","new_deps","skipped_deps","write_version","read_version","dependencies","dependency","schedule_possible_effect_self_invalidation","previous_deps","previous_skipped_deps","previous_untracked_writes","previous_sources","previous_untracking","previous_update_version","is_fork","remove_reaction","index","new_length","start_index","was_updating_effect","tick","destroyed","depends_on_old_values","should_connect","is_new","reconnect","deep_read_state","deep_read","visited","proto","descriptors","is_capture_event","DELEGATED_EVENTS","can_delegate_event","event_name","ATTRIBUTE_ALIASES","normalize_attribute","PASSIVE_EVENTS","is_passive_event","event_symbol","all_registered_events","root_event_handles","create_event","target_handler","handle_event_propagation","passive","delegated","delegate","events","last_propagated_event","handler_element","owner_document","path","current_target","path_idx","handled_at","at_idx","handler_idx","throw_error","other_errors","policy","html","create_trusted_html","create_fragment_from_html","elem","assign_nodes","from_html","content","is_fragment","use_import_node","has_start","clone","from_namespace","ns","wrapped","from_svg","comment","frag","append","set_text","text","str","mount","_mount","listeners","Component","intro","transformError","unmount","anchor_node","ctx","registered_events","event_handle","counts","mounted_components","BranchManager","#batches","#onscreen","#offscreen","#outroing","#transition","onscreen","offscreen","k","on_destroy","#discard","keys","if_block","elseif","branches","update_branch","has_branch","NAN","get_key","render_fn","legacy","pause_effects","to_destroy","controlled_anchor","group","groups","destroy_effects","fast_path","parent_node","preserved_effects","offscreen_anchor","each","get_collection","fallback_fn","items","is_controlled","fallback","each_array","collection","first_run","commit","reconcile","move","discard","item","create_item","e.each_key_duplicate","skip_to_branch","is_animated","seen","to_animate","matched","stashed","link","destroy_length","dest","next_node","slot","$$props","slot_props","slot_fn","is_interop","get_tag","is_svg","get_namespace","next_tag","tmp_comment","child_anchor","attach","get_fn","f","o","clsx","_clsx","whitespace","to_class","hash","directives","classname","len","append_styles","styles","important","separator","css","to_css_name","to_style","new_style","normal_styles","important_styles","in_str","in_apo","in_comment","reserved_names","name_index","property","set_class","is_html","prev_classes","next_classes","next_class_name","is_present","update_styles","priority","set_style","prev_styles","next_styles","next_style_attr","select_option","select","mounting","w.select_multiple_invalid_value","option","get_option_value","option_value","init_select","observer","bind_select_value","batches","is_reset","query","selected_option","CLASS","STYLE","IS_CUSTOM_ELEMENT","IS_HTML","INPUT_TAG","OPTION_TAG","SELECT_TAG","PROGRESS_TAG","set_value","attributes","get_attributes","set_checked","set_selected","selected","set_attribute","attribute","skip_warning","get_setters","set_attributes","css_hash","should_remove_defaults","is_custom_element","preserve_attribute_case","is_option_element","setters","prev_value","prefix","opts","event_handle_key","is_delegated","handle","is_default","input","use_default","previous","attribute_effect","is_select","inited","symbol","setters_cache","cache_key","element_proto","bind_value","is_numberlike_input","to_number","bind_prop","desc","is_bound_this","bound_value","element_or_component","bind_this","get_value","get_parts","component_effect","old_parts","parts","original_teardown","stopPropagation","args","preventDefault","init","callbacks","changed","observe_all","fns","bubble_event","legacy_rest_props_handler","legacy_rest_props","exclude","spread_props_handler","spread_props","bindable","lazy","fallback_value","fallback_dirty","fallback_signal","get_fallback","setter","is_entry_props","is_store_sub","e.props_invalid_value","getter","legacy_parent","mutation","overridden","onMount","e.lifecycle_outside_component","init_update_callbacks","cleanup","l","ONBOARDING_COMPLETE_KEY","initialRoute","pathname","forceWelcome","completed","base","relativeAppPath","appUrl","PUBLIC_VERSION","defaultAttributes","hasA11yProp","mergeClasses","classes","className","color","size","strokeWidth","absoluteStrokeWidth","iconNode","$.prop","svg","$$restProps","$.untrack","$$sanitized_props","$.child","$.index","$$anchor","$$item","$.get","$$array","attrs","$$element","$.append","Icon","$.spread_props","assetFilename","embeddedMarker","embeddedIndex","decode","filename","tagEmbeddedAssetPath","dataUrl","significantlyDifferentAsset","existing","replacement","ratio","AI_SETTINGS_KEY","AI_HISTORY_KEY","SYSTEM_PROMPT","detectProvider","extractMotion","maskEmbeddedAssetPaths","assets","replaceEmbeddedAssetPaths","asset","restoreEmbeddedAssetPaths","references","reference","pathFor","resolveChatEndpoint","baseUrl","requestAssistant","settings","messages","project","knowledge","requestAnthropic","requestOpenAiCompatible","system","endpoints","models","provider","endpoint","model","request","role","response","raw","detail","part","logoUrl","githubIconUrl","presetPreviewUrl","step","apiKey","customEnabled","showKey","stored","saved","$.set","handleKeyInput","detected","handleProviderChange","toggleCustom","detectedProvider","continueWithKey","isKiroKey","cause","main","root_13","div","img","section","div_1","span","div_2","$.template_effect","$.set_class","div_3","root_12","div_4","$.sibling","$.first_child","button","ArrowRight","div_5","fragment_1","div_6","button_1","EyeOff","Eye","$$render","consequent_1","alternate","root_2","option_1","option_2","option_3","option_4","option_5","$.select_option","$.event","root_3","input_1","$.set_checked","consequent_2","alternate_1","root_4","consequent_4","div_7","root_5","input_2","$$value","consequent_5","div_8","root_6","input_3","p_1","root_7","consequent_7","div_9","node_9","button_2","button_3","button_4","$.set_attribute","div_10","fragment_5","img_1","div_11","div_12","button_5","button_6","img_2","fragment_6","div_13","img_3","div_14","button_7","button_8","img_4","fragment_7","button_9","consequent","consequent_8","consequent_9","consequent_10","alternate_2","createProgram","createCanvas","properties","createImport","createCamera","createElement","kind","createAnimation","createSequence","createTrack","tokenize","tokens","line","column","char","createToken","startColumn","escaped","ELEMENT_KINDS","PROPERTY_NAMES","parseMotion","Parser","frames","offsetToken","offset","easingValue","compactValues","message","parseColor","parseTime","parseSize","match","parseScalar","numeric","clamp","min","max","TIME_PROPERTIES","NUMBER_PROPERTIES","COLOR_PROPERTIES","normalizeCanvas","normalizeCamera","normalizeProperties","normalized","normalizeProperty","defaultElementProperties","common","parsePresetCall","parseOptions","normalizeOption","SEPARATOR_ALIASES","countDecimalPlaces","coefficient","exponent","resolveCountSeparator","formatCountValue","decimals","fractionDigits","formatted","TEXT_PRESETS","OBJECT_PRESETS","applyAnimationPresets","scene","generatedElements","generatedAnimations","sourceElements","animationPreset","textAnimationPreset","textPreset","isTextPreset","generated","expandCountUpPreset","expandTextPreset","hideElement","backgroundEffect","animation","isObjectPreset","preset","objectPresetAnimations","from","finiteNumber","to","direction","cameraPresetAnimations","delay","duration","easing","split","defaultSplitFor","splitText","stagger","normalizeEase","elements","layoutParts","presetBlurFrom","animations","partProps","textPresetFrom","textPresetTo","basicAnimation","x","y","scale","opacity","distance","dx","dy","skewX","approx","space","cursor","sum","width","widths","partWidth","LAYER_ORDER","buildSceneGraph","ast","canvasNode","cameraNode","audioNode","canvas","camera","sequences","buildSequences","imports","clips","assetType","assetName","normalizeAnimation","tracks","buildTracks","validateElementMasks","layerRank","TRACK_ROLES","TRACK_CONTENT","hasLegacyAudio","ids","declaredMain","fallbackContent","defaultTrackLabel","ensureSynthetic","id","track","clip","trackId","defaultContentLabel","left","right","sequenceDelay","sequenceOffset","frame","gap","sequence","layer","lower","byId","mask","sourceMask","_assertThisInitialized","self","_inheritsLoose","subClass","superClass","_config","_defaults","_suppressOverwrites","_reverting","_context","_bigNum","_tinyNum","_2PI","_HALF_PI","_gsID","_sqrt","_cos","_sin","_isString","_isFunction","_isNumber","_isUndefined","_isObject","_isNotFalse","_windowExists","_isFuncOrString","_isTypedArray","_isArray","_randomExp","_commaDelimExp","_strictNumExp","_numExp","_numWithUnitExp","_complexStringNumExp","_relExp","_delimitedValueExp","_unitExp","_globalTimeline","_win","_coreInitted","_doc","_globals","_installScope","_coreReady","_install","scope","_merge","gsap","_missingPlugin","_warn","suppress","_addGlobal","obj","_emptyFunc","_startAtRevertConfig","_revertConfigNoKill","_revertConfig","_reservedProps","_lazyTweens","_lazyLookup","_lastRenderedFrame","_plugins","_effects","_nextGCFrame","_harnessPlugins","_callbackNames","_harness","targets","harnessPlugin","GSCache","_getCache","toArray","_getProperty","_forEachName","names","func","_round","_roundPrecise","_parseRelative","operator","_arrayContainsAny","toSearch","toFind","_lazyRender","tween","_isRevertWorthy","_lazySafeRender","time","suppressEvents","force","_numericIfPossible","_passThrough","_setDefaults","defaults","_setKeyframeDefaults","excludeDuration","toMerge","_mergeDeep","_copyExcluding","excluding","copy","_inheritDefaults","vars","_arraysMatch","a1","a2","_addLinkedListItem","firstProp","lastProp","sortBy","_removeLinkedListItem","_removeFromParent","onlyIfParentHasAutoRemove","_uncache","_recacheAncestors","_rewindStartAt","totalTime","_hasNoPausedAncestors","_elapsedCycleDuration","_animationCycle","tTime","cycleDuration","whole","_parentToChildTotalTime","parentTime","_setEnd","_alignPlayhead","_postAddChecks","timeline","_clamp","_addToTimeline","position","skipChecks","_parsePosition","_isFromOrFromStart","_scrollTrigger","trigger","_attemptInitTween","_initTween","_ticker","_parentPlayheadIsBeforeStart","_ref","_ref2","data","_renderZeroDurationTween","prevRatio","repeatDelay","pt","iteration","prevIteration","_callback","_findNextPauseTween","prevTime","_setDuration","skipUncache","leavePlayhead","repeat","dur","totalProgress","_onUpdateTotalDuration","Timeline","_zeroPosition","percentAnimation","labels","recent","clippedDuration","isPercent","_createTweenType","isLegacy","varsIndex","irVars","Tween","_conditionalReturn","getUnit","_slice","_isArrayLike","nonEmpty","_flatten","ar","leaveStrings","accumulator","_accumulator","_wake","selector","el","shuffle","distribute","ease","_parseEase","cache","isDecimal","ratios","axis","ratioX","ratioY","distances","originX","originY","wrapAt","_invertEase","_roundModifier","snap","snapTo","isArray","radius","is2D","closest","random","roundingIncrement","returnFunction","pipe","_len","functions","_key","unitize","unit","normalize","mapRange","_wrapArray","wrapper","wrap","range","wrapYoyo","total","_replaceRandom","arIndex","inMin","inMax","outMin","outMax","inRange","outRange","interpolate","progress","isString","master","interpolators","il","_addPropTween","_renderPropTweens","_getLabelInDirection","fromTime","backward","executeLazyFirst","prevContext","_interrupt","_quickTween","_registerPluginQueue","_createPlugin","config","isFunc","Plugin","instanceDefaults","_killPropTweensOf","_addPluginModifier","statics","_getSetter","PropTween","_255","_colorLookup","_hue","h","m1","m2","splitColor","toHSL","forceAlpha","g","wasHSL","_colorOrderData","_colorExp","_formatColors","orderMatchData","colors","shell","_hslExp","_colorStringFilter","combined","_tickerActive","_getTime","_lagThreshold","_adjustedLag","_startTime","_lastUpdate","_gap","_nextTime","_listeners","_id","_req","_raf","_self","_delta","_i","_tick","elapsed","manual","overlap","dispatch","fps","threshold","adjustedLag","_fps","once","prioritize","_easeMap","_customEaseExp","_quotesExp","_parseObjectInString","val","parsedVal","_valueInParentheses","open","close","nested","_configEaseFromString","defaultEase","_insertEase","easeIn","easeOut","easeInOut","lowercaseName","_easeInOutFromOut","_configElastic","amplitude","period","p1","p2","p3","_configBack","overshoot","power","n1","n2","n3","steps","immediateStart","harness","Animation","_proto","_totalTime","includeRepeats","wrapRepeats","prevIsReverting","rawTime","includeDelay","atTime","onFulfilled","prevProm","_resolve","_then","_Animation","_this","_proto2","fromVars","toVars","onCompleteAll","onCompleteAllParams","tDur","crossingStart","prevPaused","pauseTween","timeScale","prevStart","yoyo","isYoyo","rewinding","doesWrap","adjustedTime","_this2","tweens","timelines","ignoreBeforeTime","_totalTime2","onlyActive","_overwritingTween","parsedTargets","isGlobalTime","tl","endTime","_vars","startAt","_onStart","onStartParams","immediateRender","initted","fromPosition","toPosition","afterTime","beforeTime","amount","adjustLabels","soft","includeLabels","_addComplexStringPropTween","stringFilter","funcParam","_renderComplexString","matchIndex","startNums","endNum","chunk","startNum","hasRandom","modifier","optional","currentValue","parsedStart","_setterFuncWithParam","_setterFunc","_setterPlain","_forceAllPropTweens","_renderBoolean","_renderPlain","_processVars","_parseFuncOrString","_checkPlugin","plugin","ptLookup","onUpdate","runBackwards","yoyoEase","keyframes","autoRevert","prevStartAt","fullTargets","autoOverwrite","reverseEase","cleanVars","hasPriority","gsData","harnessVars","overwritten","_sortPropTweensByPriority","_updatePropTweens","startIsRelative","skipRecursion","ptCache","rootPT","lookup","_addAliasesToVars","propertyAliases","aliases","_parseKeyframe","allProps","easeEach","_staggerTweenProps","_staggerPropsToSkip","_Animation2","skipInherit","_this3","_this3$vars","overwrite","scrollTrigger","curTarget","staggerFunc","staggerVarsToMerge","easeReverse","kf","_proto3","isNegative","inv","segDur","killingTargets","propTweenLookup","firstPT","overwrittenProps","curLookup","curOverwriteProps","_setterAttribute","hasNonDependentRemaining","_setterWithModifier","pt2","last","change","renderer","_proto4","_media","_emptyArray","_lastMediaTime","_contextID","_dispatch","_onMediaChange","matches","queries","conditions","anyMatch","toggled","Context","_proto5","prevSelector","revert","matchMedia","_this4","MatchMedia","_proto6","cond","mq","active","_gsap","_len2","_key2","uncache","format","_setDefaults2","_ref3","plugins","extendTimeline","pluginName","includeDelayedCalls","found","toAdd","_getPluginPropTween","_addModifiers","modifiers","_buildModifierPlugin","temp","_docElement","_pluginInitted","_tempDiv","_recentSetterPlugin","_transformProps","_RAD2DEG","_DEG2RAD","_atan2","_capsExp","_horizontalExp","_complexExp","_propertyAliases","_renderCSSProp","_renderPropWithEnd","_renderCSSPropWithBeginning","_renderCSSPropWithBeginningAndEnd","_renderRoundedCSSProp","_renderNonTweeningValue","_renderNonTweeningValueOnlyAtEnd","_setterCSSStyle","_setterCSSProp","_setterTransform","_setterScale","_setterScaleWithRender","_setterTransformWithRender","_transformProp","_transformOriginProp","_saveStyle","isNotCSS","style","_get","_removeIndependentTransforms","_revertStyle","_getStyleSaver","saver","_supports3D","_createElement","_getComputedProperty","skipPrefixFallback","cs","_checkPropPrefix","_prefixes","preferPrefix","_initCore","_getReparentedCloneBBox","owner","bbox","_getAttributeFallbacks","attributesArray","_getBBox","bounds","cloned","_isSVG","_removeProperty","first2Chars","_addNonTweeningPT","beginning","onlySetAtEnd","_nonConvertibleUnits","_nonStandardLayouts","_convertToUnit","curValue","curUnit","horizontal","isRootSVG","measureProperty","toPixels","toPercent","px","isSVG","_parseTransform","_firstTwoOnly","_specialProps","_tweenComplexCSSString","startValues","startValue","endValue","endUnit","startUnit","endValues","_keywordToPercent","_convertKeywordsToPercentages","_renderClearProps","clearTransforms","_identity2DMatrix","_rotationalProperties","_isNullTransform","_getComputedTransformMatrixAsArray","matrixString","_getMatrix","force2D","matrix","nextSibling","addedToDOM","_applySVGOrigin","origin","originIsAbsolute","smooth","matrixArray","pluginToAddPropTweensTo","xOriginOld","yOriginOld","xOffsetOld","yOffsetOld","tx","ty","originSplit","xOrigin","yOrigin","determinant","invertedScaleX","deg","z","scaleX","scaleY","rotation","rotationX","rotationY","skewY","perspective","angle","cos","sin","a12","a22","t1","t2","t3","a13","a23","a33","a42","a43","a32","_renderSVGTransforms","_renderCSSTransforms","_renderNon3DTransforms","_addPxTranslate","_zeroDeg","_zeroPx","_endParenthesis","xPercent","yPercent","transformPerspective","force3D","zOrigin","transforms","use3D","xOffset","yOffset","forceCSS","a11","a21","_addRotationalPropTween","cap","finalValue","_assign","_addRawTransformPTs","startCache","endCache","side","CSSPlugin","specialProp","relative","isTransformRelated","transformPropTween","inlineProps","finalTransformValue","origPerspective","positionAndScale","all","gsapWithCSS","EASE_ALIASES","cubicBezier","parsed","x1","y1","x2","y2","sample","inverse","slope","parameter","derivative","upper","interpolateValue","isColor","interpolateColor","colorToRgb","bl","alpha","hex","rgba","evaluateScene","evaluateCamera","clippedAssets","elementTrackVisible","elementWindowActive","render","evaluateElement","activeClips","candidate","transitionTail","clipTrackRank","sourceElement","sourceRender","clipEnd","transitionOpacity","sourceOpacity","clipElement","elementTrackRank","trackRank","rank","cameraElement","applyAnimation","localTime","rawProgress","applyKeyframes","firstFrame","lastFrame","nextFrame","segmentEasing","isLoadedVideo","loadAssets","uploadedByFilename","entries","loadAsset","entry","loadVideo","loadImage","loadAssetSize","isSvg","image","svgSource","parseSvg","video","mediaEvent","complete","fail","videoSourceTime","sourceTime","trimOut","maximum","synchronizeVideoAssets","operations","desired","tolerance","seekVideo","pauseVideoAssets","done","viewBox","height","paths","stroke","CanvasRenderer","maskContext","laidOut","layoutGeneratedText","hiddenMaskSources","hiddenMaskSourceIds","elementsById","applyCamera","drawElementWithMask","font","weight","output","layoutWordGroup","layoutContext","groupX","finalX","baseX","renderX","drift","textMeasureCanvas","fallbackMeasureContext","cameraProps","zoom","hidden","maskCanvas","maskId","maskElement","drawElement","filter","buildCanvasFilter","drawText","drawOverlay","drawEffect","drawAsset","box","resolveBox","drawShadow","applySkew","clipReveal","drawSvgReveal","artworkOpacity","center","tracking","drawTrackedText","chars","parentId","drawImageOverlay","parentProps","parentOpacity","referenceWidth","referenceHeight","parentRotation","parentScale","shape","drawVectorPrimitive","fill","radiusX","radiusY","drawOverlayLine","reveal","svgPath","arrow","endX","endY","head","drawNoise","drawGrid","drawRippleGrid","drawPrism","drawGradientMotion","gradient","palette","gradientPalette","intensity","cx","cy","half","phase","bg","w","hue","core","spacing","maxDistance","wave","fade","seed","assetWidth","assetHeight","cover","propX","propY","propWidth","propHeight","overscan","number","bounded","minimum","filters","blur","brightness","contrast","saturation","grayscale","sepia","invert","shadow","EXPORT_API","canExport","exportVideo","audioUrl","onProgress","exportMp4Frames","scaledScene","scaleScene","totalFrames","frameCount","job","requestJson","uploads","uploadedFrames","evaluated","canvasToJpeg","wait","audioResponse","blob","scaleProperties","scaled","ms","serializeProgram","program","serializeNode","escapeString","lines","indent","formatDuration","formatValue","packTimelineLanes","rangeOf","lanes","authoredTrack","lane","packClipTrackLanes","declaredTracks","trackClips","laneEnds","packed","sourceOrder","metadata","trackVisualOrder","combinePersistentTrackRows","clipTracks","elementLanes","persistentIds","remainingElementLanes","matchingElements","assignments","axisPoints","bestAxisSnap","moving","best","delta","snapRect","xTargets","yTargets","rect","xSnap","ySnap","alignRect","alignment","clampOffset","sorted","seedKeyframes","upsertKeyframe","nextOffset","setKeyframeEasing","moveKeyframe","previousOffset","moved","frameIndex","removeKeyframe","DEFAULT_MINIMUM_DURATION","finite","minimumDuration","moveClip","requestedStart","timelineDuration","latest","trimClipStart","requestedDelta","trimClipEnd","requestedEnd","currentEnd","splitClip","playhead","sameTrack","adjacentClipBoundaries","boundaries","byTrack","outgoing","at","incoming","paired","applyClipTransition","requestedDuration","cut","finiteDuration","maximumDuration","removedClipTransitionProperties","elementWindowProperties","safeStart","safeEnd","moveElementClip","elementId","previousStart","splitElementClip","splitTime","rightId","sourceImport","rightImport","cloneAnimation","createEditorHistory","recordEditorSource","history","limit","undoEditorSource","redoEditorSource","moveClipToTrack","clipId","targetTrack","timing","removeClipFromTracks","trimClipOnTrack","edge","requestedTime","MIN_TIMELINE_ZOOM","MAX_TIMELINE_ZOOM","clampTimelineZoom","quantizeTimelineTime","safeDuration","safeFps","clamped","anchoredTimelineScroll","oldScrollLeft","anchorViewportX","oldContentWidth","newContentWidth","viewportWidth","anchorContentX","requested","AI_BRAND_KEY","AI_SKILLS_KEY","MOTIONLY_PROMPT_TEMPLATE","AVAILABLE_SKILLS","emptyBrandProfile","title","generateBrandMarkdown","profile","blocks","motion","avoid","brandHasContent","defaultSkillState","skill","resolveSkillState","enabledSkills","resolved","buildAiKnowledge","describeAiContext","brandLoaded","enabledSkillCount","assetCount","safeGet","safeSet","loadBrand","saveBrand","loadSkillState","saveSkillState","assetList","onLoadMotion","onCollapse","showSettings","$.mutable_source","draft","sending","loadedMessageId","invalidMessageId","invalidMotionError","hasSavedSettings","promptCopied","composerInput","messageList","storedSettings","storedHistory","copyPromptTemplate","saveSettings","currentSettings","removeKey","clearHistory","sendMessage","userMessage","resizeComposer","scrollToLatest","persistHistory","$.mutate","handleComposerKeydown","loadMotion","issue","repairMotion","explanation","isHuggingFaceKey","root_18","header","Bot","Trash2","node_1","Settings","PanelLeftClose","root_9","root_1","consequent_6","node_12","p_2","node_13","root_8","node_14","fragment_3","root_10","$.each","node_16","article","root_14","p_3","root_11","pre","code","consequent_14","classes_1","root_15","consequent_15","p_4","consequent_16","node_21","textarea","button_10","Send","$0","alternate_3","$$args","projectInfo","view","skillState","openSkillId","toggleSkill","contextSummary","nav","Sparkles","node_3","BookOpen","code_1","classes_2","consequent_3","brand","brandMarkdownMode","brandSaved","styleDraft","motionDraft","avoidDraft","colorDraft","persistBrand","addColor","removeColor","addTag","list","removeTag","handleTagKey","toggleMarkdownMode","clearMarkdownOverride","brandMarkdown","FileCode","label_1","node_2","span_1","text_2","X","$.set_style","Plus","label_2","span_2","text_3","input_4","span_3","text_4","input_5","span_4","text_5","input_6","span_5","stage","parseError","currentFrame","assetsReady","assetKey","assetLoadId","embeddedAssets","assistantAssets","isPlaying","currentTime","totalDuration","animationFrameId","dragState","snapGuides","clipDrag","selectedKeyframeOffset","showCodeEditor","selectedElementId","isFullscreen","audioInput","assetInput","audioElement","audioName","audioDuration","timelineHeight","mp4Supported","isExporting","exportError","assetError","activeNavTab","showAiChat","mediaSubTab","showConfirmDialog","pendingPresetPath","previewAsset","videoRenderId","isDraggingUpload","draggingAsset","draggingTransition","selectedTransitionIds","dropTargetTime","dropTargetTrack","editorHistory","timelineScroll","timelineZoom","snapEnabled","historyGestureBase","adjustmentControls","ANIMATION_PRESETS","availablePresets","parseAndRender","fitPreview","handleKeyDown","editing","redoEditor","undoEditor","clearAssetPreview","beginHistoryGesture","endHistoryGesture","finalSource","baseSource","pause","requestPresetLoad","presetPath","confirmLoadPreset","cancelLoadPreset","loadGeneratedMotion","restoredSource","rememberEmbeddedAssets","currentAudioPath","loadAudioFromPath","removeAudio","nextAssetKey","refreshAssets","renderFrame","exactVideoSeek","renderId","draw","drawSelection","propertiesOf","visible","boxes","elementBounds","top","bottom","inset","selectedElement","handleSize","corners","nextScene","loadId","previousAssets","loaded","missing","remembered","mergeAssets","embedded","play","resumeAudioAtCurrentTime","frameTime","lastTime","animate","now","syncAudio","quantizeFrameTime","seek","setTime","resizeTimeline","startY","startHeight","moveEvent","resizeTimelineWithKeyboard","canvasWidth","canvasHeight","toggleFullscreen","toggleCodeEditor","formatTime","seconds","mins","secs","formatPreciseTime","elementDetail","stringProperty","timelineRange","exits","sourceProperties","numericProperty","lastVisible","nextHidden","fromOpacity","toOpacity","timelinePercent","handleAudioSelected","file","readFileDataUrl","projectAudioTrack","insertAt","exportMp4","deleteSelectedElement","selectedClip","deleteClip","trimElement","pointer","setClipBoundary","snapTimelineTime","updateElementProperty","resetElementSize","targetId","updateElementProperties","handleCanvasPointerDown","point","pointerToCanvas","selectedBounds","handleRadius","centerX","centerY","hitTest","selectElement","elementCenter","handleCanvasPointerMove","centered","isCentered","nextX","nextY","deltaX","deltaY","currentX","currentY","currentBounds","proposedBounds","snapped","handleCanvasPointerUp","alignSelected","aligned","hiddenMasks","seekToElement","firstVisibleTime","previewAssetOnly","handleAssetDragStart","handleAssetDragEnd","handleAssetUpload","importAssetFiles","handleAssetFileDrop","handleAssetFileDrag","handleAssetFileDragLeave","fileList","files","lowerName","isImage","isVideo","maximumSize","matchingImports","readMediaIdentity","used","suffix","reader","handleTimelineDragOver","timelineTimeAt","handleTimelineDrop","loadedAsset","naturalDuration","defaultMainTrack","ensureLayerTrack","clipNode","newId","runtimeClip","writeClipLayout","inserted","nextClips","serialize","clipNodeAt","detachClipTransitions","sceneIndex","related","transitionBoundaries","outgoingNode","incomingNode","outgoingProperties","incomingProperties","trackNodeFor","firstContent","elementRow","allTimelineRows","row","materializeTimelineLayers","updateTrack","updateClip","moveSelectedClipFromInspector","resizeSelectedClipFromInspector","handleTransitionDragStart","handleTransitionDragEnd","applyTransitionAtBoundary","dropTransition","selectTransition","removeSelectedTransition","selectedTransition","timelineLaneRect","laneTrackAtPoint","clientX","clientY","updateClipDrag","targetTrackId","pointerTime","rawStart","moveTimelineClip","grabTime","commitClipDrag","drag","commitElementDrag","materializeSelectedAnimation","moveTimelineElement","originLane","originTrackId","moveTimelineAudio","trimTimelineClip","splitSelectedClip","originalProperties","timingProperties","rightNode","excludeClipId","candidates","nearest","setTimelineZoom","nextZoom","oldWidth","timelineContentWidth","oldScroll","handleTimelineWheel","timelineTrackDisplayOrder","timelineLaneLabel","estimateElementWidth","estimateElementHeight","explicit","selectedAnimationAst","KEYFRAME_EASINGS","selectedKeyframeMarkers","selectedAnimation","compiled","created","elementNode","ensureSeededKeyframes","keyframeEasingAt","setSelectedKeyframeEasing","deleteKeyframeAt","keyframeTime","capturedKeyframeProperties","addKeyframeAtPlayhead","propertyKeys","deleteSelectedKeyframe","dragKeyframeMarker","seedNode","animationDelay","animationDuration","snappedTime","updateAnimationProperty","ensureAnimationNode","addTextElement","nextElementName","applyPreset","isBasicPreset","canApplyLibraryPreset","applyLibraryPreset","keyframeDragDelta","combinedTimelineRows","timelineRows","timelineClipTracks","timelineTicks","displayFrame","aiProjectInfo","canvasStyle","selectedKeyframeEasingValue","FolderOpen","Headphones","Type","Wand2","Layers3","aside","node_11","Upload","Music2","div_15","div_16","div_17","FileImage","node_17","div_18","div_19","video_1","div_20","div_21","$.set_text","classes_11","$.preventDefault","div_22","button_11","div_23","div_24","div_25","classes_9","classes_10","div_26","div_27","button_12","div_28","div_29","node_22","button_13","div_30","fragment_4","div_31","button_14","div_32","div_33","button_15","strong","small","classes_12","div_34","div_35","div_36","div_37","button_16","root_17","node_26","div_38","div_39","button_17","node_27","div_40","div_41","button_18","node_28","div_42","div_43","button_19","span_6","node_29","div_44","div_45","button_20","Maximize2","span_7","node_30","div_46","div_47","button_21","span_8","Square","span_9","strong_1","small_1","classes_13","AiConfigPanel","node_32","BrandConfigPanel","node_33","consequent_11","consequent_12","consequent_13","aside_1","AiChatPanel","button_22","root_22","consequent_17","div_48","span_10","div_49","button_23","span_11","button_24","div_50","div_51","canvas_1","node_37","span_12","root_23","span_13","root_24","div_52","root_27","video_2","root_25","root_26","button_25","node_40","consequent_21","div_53","root_28","div_54","consequent_23","aside_2","div_55","fragment_10","span_14","span_15","small_2","div_56","div_57","div_58","span_16","strong_2","span_17","strong_3","button_26","$.set_value","div_59","fragment_11","span_18","Video","root_30","span_19","strong_4","small_3","div_60","root_31","div_61","button_27","AlignHorizontalJustifyStart","button_28","AlignHorizontalJustifyCenter","button_29","AlignHorizontalJustifyEnd","button_30","AlignVerticalJustifyStart","button_31","AlignVerticalJustifyCenter","button_32","AlignVerticalJustifyEnd","div_62","node_46","div_63","div_64","div_65","div_66","div_67","div_68","root_32","div_69","button_33","div_70","div_71","node_53","div_72","input_7","input_8","div_73","div_74","input_9","input_10","div_75","root_33","input_11","div_76","fragment_17","div_77","div_78","input_12","div_79","input_13","$1","$2","div_80","node_55","root_35","$.init_select","fragment_18","input_14","input_15","node_58","control","div_81","root_37","div_82","div_83","input_16","input_17","div_84","button_34","div_85","fragment_19","input_18","button_35","consequent_35","div_86","root_39","select_1","node_62","consequent_36","div_87","node_61","div_88","button_36","button_37","button_38","button_39","button_40","button_41","div_89","div_90","input_19","div_91","div_92","input_20","div_93","div_94","easingOption","button_42","root_40","classes_22","input_21","$3","$4","$5","$6","$7","$8","$9","classes_16","classes_17","$10","classes_18","$11","classes_19","$12","classes_20","$13","classes_21","$14","$15","div_95","fragment_20","span_20","span_21","strong_5","button_43","div_96","select_2","div_97","div_98","input_22","div_99","div_100","input_23","div_101","div_102","input_24","div_103","div_104","input_25","button_44","root_43","consequent_24","consequent_37","consequent_40","alternate_6","button_45","div_105","div_106","button_46","SkipBack","button_47","Pause","Play","consequent_41","alternate_7","span_22","span_23","div_107","span_24","node_66","div_108","input_26","span_25","fragment_25","button_48","button_49","root_45","consequent_42","alternate_8","button_50","root_46","consequent_43","button_51","node_71","Undo2","button_52","Redo2","button_53","Scissors","button_54","Magnet","button_55","Minus","span_26","button_56","div_109","div_110","div_111","node_79","span_27","root_47","span_28","span_29","root_48","consequent_44","input_27","node_80","node_81","rowTrack","$.derived_safe_equal","div_112","root_60","div_113","span_30","img_5","consequent_46","consequent_47","consequent_48","alternate_9","span_31","strong_6","small_4","span_32","root_49","button_57","classes_27","$.stopPropagation","span_33","root_50","consequent_50","alternate_11","div_114","span_34","fragment_32","node_87","span_35","root_51","classes_28","node_88","span_36","root_57","span_37","root_53","span_38","root_54","span_39","root_55","span_40","root_56","button_58","node_89","button_59","button_60","classes_29","kfLane","node_92","button_61","root_58","classes_30","button_62","$$arg","span_41","node_91","classes_25","classes_26","text_37","node_93","clipTrack","div_115","root_66","div_116","span_42","img_6","span_43","strong_7","small_5","span_44","root_62","button_63","root_61","classes_33","button_64","VolumeX","Volume2","classes_34","consequent_65","div_117","span_45","fragment_42","node_102","span_46","classes_35","span_47","root_63","span_48","button_65","node_104","packedElement","span_49","span_50","span_51","span_52","span_53","span_54","button_66","node_105","button_67","button_68","classes_36","node_108","button_69","classes_37","button_70","node_109","packedClip","span_55","root_65","span_56","span_57","span_58","span_59","root_64","button_71","node_112","button_72","button_73","button_74","classes_38","button_75","text_47","classes_39","span_60","node_114","classes_31","classes_32","audio","button_76","div_118","root_67","div_119","div_120","button_77","textarea_1","node_117","div_121","consequent_77","$.bind_value","consequent_78","div_122","root_68","div_123","div_124","button_78","div_125","button_79","button_80","consequent_79","classes_3","classes_4","classes_5","classes_6","classes_7","classes_8","classes_14","text_15","classes_15","classes_23","classes_24","fallbackMotion","motionCode","currentFile","fileInput","fileHandle","serverBacked","saveTimer","writeQueue","editor","exportProgress","starCount","loadInitialProject","loadStarCount","handleOpen","picker","handleSave","writeFile","handleFileSelected","scheduleAutoSave","writable","handleExport","formatStarCount","FileText","Save","Download","CircleHelp","a_1","Star","a_2","node_7","MotionEditor","node_8","route","MotionlyApp","Onboarding"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,121,122,123]}
|