@dnyantra/dtly 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +21 -8
  2. package/dist/agents.d.ts +1 -0
  3. package/dist/agents.js +9 -4
  4. package/dist/agents.js.map +1 -1
  5. package/dist/cli.js +35 -5
  6. package/dist/cli.js.map +1 -1
  7. package/dist/core/anim.js +20 -0
  8. package/dist/core/anim.js.map +1 -1
  9. package/dist/core/captions.d.ts +13 -0
  10. package/dist/core/captions.js +57 -0
  11. package/dist/core/captions.js.map +1 -0
  12. package/dist/core/geo.d.ts +13 -0
  13. package/dist/core/geo.js +41 -0
  14. package/dist/core/geo.js.map +1 -0
  15. package/dist/core/model.d.ts +112 -9
  16. package/dist/core/model.js.map +1 -1
  17. package/dist/core/path.d.ts +35 -0
  18. package/dist/core/path.js +324 -0
  19. package/dist/core/path.js.map +1 -0
  20. package/dist/core/svg.d.ts +22 -0
  21. package/dist/core/svg.js +217 -0
  22. package/dist/core/svg.js.map +1 -0
  23. package/dist/core/text.d.ts +3 -1
  24. package/dist/core/text.js +49 -3
  25. package/dist/core/text.js.map +1 -1
  26. package/dist/mcp/server.js +28 -1
  27. package/dist/mcp/server.js.map +1 -1
  28. package/dist/ops/ops.d.ts +7 -0
  29. package/dist/ops/ops.js +11 -1
  30. package/dist/ops/ops.js.map +1 -1
  31. package/dist/presets/app.d.ts +2 -0
  32. package/dist/presets/app.js +82 -0
  33. package/dist/presets/app.js.map +1 -0
  34. package/dist/presets/captions.d.ts +2 -0
  35. package/dist/presets/captions.js +48 -0
  36. package/dist/presets/captions.js.map +1 -0
  37. package/dist/presets/charts.d.ts +2 -0
  38. package/dist/presets/charts.js +162 -0
  39. package/dist/presets/charts.js.map +1 -0
  40. package/dist/presets/index.d.ts +1 -1
  41. package/dist/presets/index.js +62 -1
  42. package/dist/presets/index.js.map +1 -1
  43. package/dist/presets/maps.d.ts +2 -0
  44. package/dist/presets/maps.js +79 -0
  45. package/dist/presets/maps.js.map +1 -0
  46. package/dist/render/fx.d.ts +11 -0
  47. package/dist/render/fx.js +87 -0
  48. package/dist/render/fx.js.map +1 -0
  49. package/dist/render/grade.d.ts +20 -0
  50. package/dist/render/grade.js +178 -0
  51. package/dist/render/grade.js.map +1 -0
  52. package/dist/render/lottie.d.ts +36 -0
  53. package/dist/render/lottie.js +523 -0
  54. package/dist/render/lottie.js.map +1 -0
  55. package/dist/render/node-host.d.ts +1 -0
  56. package/dist/render/node-host.js +15 -4
  57. package/dist/render/node-host.js.map +1 -1
  58. package/dist/render/perspective.d.ts +5 -0
  59. package/dist/render/perspective.js +71 -0
  60. package/dist/render/perspective.js.map +1 -0
  61. package/dist/render/renderer.d.ts +6 -0
  62. package/dist/render/renderer.js +156 -95
  63. package/dist/render/renderer.js.map +1 -1
  64. package/dist/render/shapes.d.ts +6 -0
  65. package/dist/render/shapes.js +129 -0
  66. package/dist/render/shapes.js.map +1 -0
  67. package/dist/render/tiles.d.ts +11 -0
  68. package/dist/render/tiles.js +42 -0
  69. package/dist/render/tiles.js.map +1 -0
  70. package/dist/render/transcribe.d.ts +14 -0
  71. package/dist/render/transcribe.js +55 -0
  72. package/dist/render/transcribe.js.map +1 -0
  73. package/dist/studio/server.js +14 -1
  74. package/dist/studio/server.js.map +1 -1
  75. package/dist/studio-app/app.js +5 -4
  76. package/dist/studio-app/app.js.map +4 -4
  77. package/dist/version.d.ts +1 -1
  78. package/dist/version.js +1 -1
  79. package/package.json +1 -1
  80. package/plugin/skills/{dtly → moti}/SKILL.md +26 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../node_modules/preact/src/constants.js", "../../node_modules/preact/src/options.js", "../../node_modules/preact/src/create-element.js", "../../node_modules/preact/src/component.js", "../../node_modules/preact/src/diff/props.js", "../../node_modules/preact/src/create-context.js", "../../node_modules/preact/src/util.js", "../../node_modules/preact/src/diff/children.js", "../../node_modules/preact/src/diff/index.js", "../../node_modules/preact/src/render.js", "../../node_modules/preact/src/create-portal.js", "../../node_modules/preact/src/diff/catch-error.js", "../../node_modules/preact/hooks/src/index.js", "../../src/core/model.ts", "../../src/ops/ops.ts", "../../src/presets/text.ts", "../../src/presets/index.ts", "../../src/studio/app/config.ts", "../../src/core/ease.ts", "../../src/core/color.ts", "../../src/core/anim.ts", "../../src/studio/app/host.ts", "../../node_modules/preact/jsx-runtime/src/utils.js", "../../node_modules/preact/jsx-runtime/src/index.js", "../../src/studio/app/fields.tsx", "../../src/studio/app/store.ts", "../../src/studio/app/Inspector.tsx", "../../src/studio/app/Timeline.tsx", "../../src/core/text.ts", "../../src/render/renderer.ts", "../../src/studio/app/geometry.ts", "../../src/studio/app/Viewer.tsx", "../../src/studio/app/main.tsx"],
4
- "sourcesContent": ["// Vnode._flags\n/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n/** Indicates that this vnode has been unmounted before indicating the loss of event listeners */\nexport const FORCE_PROPS_REVALIDATE = 1 << 0;\n/** The vnode's ref was detached while its subtree was parked by Suspense */\nexport const REF_DETACHED = 1 << 3;\n\n// component._bits\n/** Component is processing an exception */\nexport const COMPONENT_PROCESSING_EXCEPTION = 1 << 0;\n/** Component has a pending error */\nexport const COMPONENT_PENDING_ERROR = 1 << 1;\n/** Component should force update (skip shouldComponentUpdate) */\nexport const COMPONENT_FORCE = 1 << 2;\n/** Component is queued for update */\nexport const COMPONENT_DIRTY = 1 << 3;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\n\nexport const MATHML_TOKEN_ELEMENTS = /^m(i|n|o|s|text|space)$/;\n\n/** Matched new vnode eligible for the longest increasing subsequence. */\nexport const LIS_CANDIDATE = 1 << 4;\n", "import { _catchError } from './diff/catch-error';\n\n/**\n * The `option` object can potentially contain callback functions\n * that are called during various stages of our renderer. This is the\n * foundation on which all our addons like `preact/debug`, `preact/compat`,\n * and `preact/hooks` are based on. See the `Options` type in `internal.d.ts`\n * for a full list of available option hooks (most editors/IDEs allow you to\n * ctrl+click or cmd+click on mac the type definition below).\n * @type {import('./internal').Options}\n */\nconst options = {\n\t_catchError\n};\n\nexport default options;\n", "import { assign, slice } from './util';\nimport options from './options';\nimport { NULL, UNDEFINED } from './constants';\n\nlet vnodeId = 0;\n\n/**\n * Create an virtual node (used for JSX)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor for this\n * virtual node\n * @param {object | null | undefined} [props] The properties of the virtual node\n * @param {Array<import('.').ComponentChildren>} [children] The children of the\n * virtual node\n * @returns {import('./internal').VNode}\n */\nexport function createElement(type, props, children) {\n\tlet normalizedProps = {},\n\t\tkey,\n\t\tref,\n\t\ti,\n\t\tlength = arguments.length;\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref' && typeof type != 'function') ref = props[i];\n\t\telse normalizedProps[i] = props[i];\n\t}\n\n\tif (length > 2) {\n\t\tnormalizedProps.children = length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\treturn createVNode(type, normalizedProps, key, ref, NULL);\n}\n\n/**\n * Clones the given VNode, optionally adding attributes/props and replacing its\n * children.\n * @param {import('./internal').VNode} vnode The virtual DOM element to clone\n * @param {object} props Attributes/props to add when cloning\n * @param {Array<import('./internal').ComponentChildren>} children Any additional arguments will be used\n * as replacement children.\n * @returns {import('./internal').VNode}\n */\nexport function cloneElement(vnode, props, children) {\n\tlet normalizedProps = assign({}, vnode.props),\n\t\tkey,\n\t\tref,\n\t\ti,\n\t\tlength = arguments.length;\n\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref' && typeof vnode.type != 'function') ref = props[i];\n\t\telse normalizedProps[i] = props[i];\n\t}\n\n\tif (length > 2) {\n\t\tnormalizedProps.children = length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\treturn createVNode(\n\t\tvnode.type,\n\t\tnormalizedProps,\n\t\tkey !== UNDEFINED ? key : vnode.key,\n\t\tref !== UNDEFINED ? ref : vnode.ref,\n\t\tNULL\n\t);\n}\n\n/**\n * Create a VNode (used internally by Preact)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * Constructor for this virtual node\n * @param {object | string | number | null} props The properties of this virtual node.\n * If this virtual node represents a text node, this is the text of the node (string or number).\n * @param {string | number | null} key The key for this virtual node, used when\n * diffing it against its children\n * @param {import('./internal').VNode[\"ref\"]} ref The ref property that will\n * receive a reference to its created child\n * @returns {import('./internal').VNode}\n */\nexport function createVNode(type, props, key, ref, original) {\n\t// V8 seems to be better at detecting type shapes if the object is allocated from the same call site\n\t// Do not inline into createElement and coerceToVNode!\n\t/** @type {import('./internal').VNode} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops,\n\t\tkey,\n\t\tref,\n\t\t_children: NULL,\n\t\t_parent: NULL,\n\t\t_depth: 0,\n\t\t_dom: NULL,\n\t\t_component: NULL,\n\t\tconstructor: UNDEFINED,\n\t\t_original: original || ++vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0\n\t};\n\n\t// Only invoke the vnode hook if this was *not* a direct copy:\n\tif (!original && options.vnode) options.vnode(vnode);\n\n\treturn vnode;\n}\n\nexport function createRef() {\n\treturn { current: NULL };\n}\n\nexport function Fragment(props) {\n\treturn props.children;\n}\n\n/**\n * Check if a the argument is a valid Preact VNode.\n * @param {*} vnode\n * @returns {vnode is VNode}\n */\nexport const isValidElement = vnode =>\n\tvnode != NULL && vnode.constructor === UNDEFINED;\n", "import {\n\tCOMPONENT_DIRTY,\n\tCOMPONENT_FORCE,\n\tMODE_HYDRATE,\n\tNULL,\n\tUNDEFINED\n} from './constants';\nimport { Fragment } from './create-element';\nimport { commitRoot, diff } from './diff/index';\nimport options from './options';\nimport { assign } from './util';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function BaseComponent(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n\tthis._bits = 0;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @this {import('./internal').Component}\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nBaseComponent.prototype.setState = function (update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s = this._nextState;\n\tif (!s || s == this.state) {\n\t\ts = this._nextState = assign({}, this.state);\n\t}\n\n\tif (typeof update == 'function') {\n\t\t// Some libraries like `immer` mark the current state as readonly,\n\t\t// preventing us from mutating it, so we need to clone it. See #2716\n\t\tupdate = update(assign({}, s), this.props);\n\t}\n\n\tif (update) {\n\t\tassign(s, update);\n\t} else {\n\t\treturn;\n\t}\n\n\tif (this._vnode) {\n\t\tif (callback) {\n\t\t\tthis._stateCallbacks.push(callback);\n\t\t}\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @this {import('./internal').Component}\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nBaseComponent.prototype.forceUpdate = function (callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._bits |= COMPONENT_FORCE;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](https://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {ComponentChildren | void}\n */\nBaseComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == NULL) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent && getDomSibling(vnode._parent, vnode._index + 1);\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling && sibling._dom) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search). New roots (_parentDom) are a DOM boundary too.\n\treturn typeof vnode.type == 'function' && !vnode.props._parentDom\n\t\t? getDomSibling(vnode)\n\t\t: NULL;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} component The component to rerender\n */\nfunction renderComponent(component) {\n\tconst oldVNode = component._vnode,\n\t\toldDom = oldVNode._dom,\n\t\tcommitQueue = [],\n\t\trefQueue = [];\n\n\tconst parentDom = component._parentDom;\n\tif (parentDom) {\n\t\tconst newVNode = assign({ constructor: UNDEFINED }, oldVNode);\n\t\tnewVNode._original = oldVNode._original + 1;\n\t\tif (options.vnode) options.vnode(newVNode);\n\n\t\tdiff(\n\t\t\tparentDom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tcomponent._globalContext,\n\t\t\tparentDom.namespaceURI,\n\t\t\toldVNode._flags & MODE_HYDRATE ? [oldDom] : NULL,\n\t\t\tcommitQueue,\n\t\t\toldDom || getDomSibling(oldVNode),\n\t\t\toldVNode._flags & MODE_HYDRATE,\n\t\t\trefQueue\n\t\t);\n\n\t\tnewVNode._original = oldVNode._original;\n\t\tnewVNode._parent._children[newVNode._index] = newVNode;\n\t\tcommitRoot(commitQueue, newVNode, refQueue);\n\t\toldVNode._parent = oldVNode._dom = NULL;\n\n\t\tif (newVNode._dom != oldDom) {\n\t\t\tupdateParentDomPointers(newVNode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\t// Stop at root boundaries (_parentDom)\n\tif ((vnode = vnode._parent) && vnode._component && !vnode.props._parentDom) {\n\t\t// _dom starts nulled, so re-assigning a null child._dom is a no-op and\n\t\t// the first truthy _dom stops the walk.\n\t\tvnode._dom = NULL;\n\t\tvnode._children.some(child => child && (vnode._dom = child._dom));\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array<import('./internal').Component>}\n */\nconst rerenderQueue = [];\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce,\n\trerenderCount = 0;\n\nexport function resetRenderCount() {\n\trerenderCount = 0;\n}\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif (\n\t\t(!(c._bits & COMPONENT_DIRTY) &&\n\t\t\t((c._bits |= COMPONENT_DIRTY),\n\t\t\trerenderQueue.push(c),\n\t\t\t!rerenderCount++)) ||\n\t\tprevDebounce != options.debounceRendering\n\t) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(prevDebounce || queueMicrotask)(process);\n\t}\n}\n\n/**\n * @param {import('./internal').Component} a\n * @param {import('./internal').Component} b\n */\nconst depthSort = (a, b) => a._vnode._depth - b._vnode._depth;\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\ttry {\n\t\tlet c,\n\t\t\tl = 1;\n\n\t\t// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary\n\t\t// process() calls from getting scheduled while `queue` is still being consumed.\n\t\twhile (rerenderQueue.length) {\n\t\t\t// Keep the rerender queue sorted by (depth, insertion order). The queue\n\t\t\t// will initially be sorted on the first iteration only if it has more than 1 item.\n\t\t\t//\n\t\t\t// New items can be added to the queue e.g. when rerendering a provider, so we want to\n\t\t\t// keep the order from top to bottom with those new items so we can handle them in a\n\t\t\t// single pass\n\t\t\tif (rerenderQueue.length > l) {\n\t\t\t\trerenderQueue.sort(depthSort);\n\t\t\t}\n\n\t\t\tc = rerenderQueue.shift();\n\t\t\tl = rerenderQueue.length;\n\n\t\t\tif (c._bits & COMPONENT_DIRTY) {\n\t\t\t\trenderComponent(c);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tif ((rerenderCount = rerenderQueue.length)) {\n\t\t\t(prevDebounce || queueMicrotask)(process);\n\t\t}\n\t}\n}\n", "import { NULL, SVG_NAMESPACE } from '../constants';\nimport options from '../options';\n\n// Per-instance unique key for the event clock stamp. Each Preact copy on the\n// page gets its own Symbol so that stamps on shared event objects can never\n// collide across instances.\nlet EVENT_DISPATCHED = Symbol();\n\nfunction setStyle(style, key, value) {\n\tif (value == NULL) value = '';\n\tif (key[0] == '-') {\n\t\tstyle.setProperty(key, value);\n\t} else {\n\t\tstyle[key] = value;\n\t}\n}\n\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\n\n// A logical clock to solve issues like https://github.com/preactjs/preact/issues/3927.\n// When the DOM performs an event it leaves micro-ticks in between bubbling up which means that\n// an event can trigger on a newly reated DOM-node while the event bubbles up.\n//\n// Originally inspired by Vue\n// (https://github.com/vuejs/core/blob/caeb8a68811a1b0f79/packages/runtime-dom/src/modules/events.ts#L90-L101),\n// but modified to use a logical clock instead of Date.now() in case event handlers get attached\n// and events get dispatched during the same millisecond.\n//\n// The clock is incremented after each new event dispatch. This allows 1 000 000 new events\n// per second for over 280 years before the value reaches Number.MAX_SAFE_INTEGER (2**53 - 1).\nlet eventClock = 0;\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {string} namespace Whether or not this DOM node is an SVG node or not\n */\nexport function setProperty(dom, name, value, oldValue, namespace) {\n\tlet useCapture;\n\n\tif (name == 'style') {\n\t\tif (typeof value == 'string') {\n\t\t\tdom.style.cssText = value;\n\t\t} else {\n\t\t\tif (typeof oldValue == 'string') {\n\t\t\t\tdom.style.cssText = oldValue = '';\n\t\t\t}\n\n\t\t\tif (oldValue) {\n\t\t\t\tfor (name in oldValue) {\n\t\t\t\t\tif (!(value && name in value)) {\n\t\t\t\t\t\tsetStyle(dom.style, name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tfor (name in value) {\n\t\t\t\t\tif (!oldValue || value[name] != oldValue[name]) {\n\t\t\t\t\t\tsetStyle(dom.style, name, value[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0] == 'o' && name[1] == 'n') {\n\t\t// Handlers are keyed by prop name and every prop name gets its own proxy,\n\t\t// so swapping one (e.g. an inline arrow function on every render) is a\n\t\t// single store. The event name is only derived to attach or remove it.\n\t\t(dom._listeners || (dom._listeners = {}))[name] = value;\n\n\t\tif (!value || !oldValue) {\n\t\t\tconst proxy =\n\t\t\t\teventProxies[name] || (eventProxies[name] = createEventProxy(name));\n\t\t\t// The attach time belongs to the listener, not to the handler: one\n\t\t\t// function can back several listeners that were attached at different\n\t\t\t// times. It lives outside `_listeners`, which unmount resets even when\n\t\t\t// a re-suspended Suspense boundary keeps the DOM and its listeners.\n\t\t\t(dom._attached || (dom._attached = {}))[name] = eventClock;\n\t\t\tuseCapture = name != (name = name.replace(CAPTURE_REGEX, '$1'));\n\n\t\t\t// Infer correct casing for DOM built-in events: `onClick` -> `click`.\n\t\t\t// Only names starting with an uppercase letter are lowercased, so\n\t\t\t// camelCase custom events keep their casing: `onionChange` -> `ionChange`.\n\t\t\tname = name.slice(2);\n\t\t\tif (name[0] < 'a') name = name.toLowerCase();\n\n\t\t\tif (value) {\n\t\t\t\tdom.addEventListener(name, proxy, useCapture);\n\t\t\t} else {\n\t\t\t\tdom.removeEventListener(name, proxy, useCapture);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (namespace == SVG_NAMESPACE) {\n\t\t\t// Normalize incorrect prop usage for SVG:\n\t\t\t// - xlink:href / xlinkHref --> href (xlink:href was removed from SVG and isn't needed)\n\t\t\t// - className --> class\n\t\t\tname = name.replace(/xlink(H|:h)/, 'h').replace(/sName$/, 's');\n\t\t} else if (\n\t\t\tname != 'width' &&\n\t\t\tname != 'height' &&\n\t\t\tname != 'href' &&\n\t\t\tname != 'list' &&\n\t\t\tname != 'form' &&\n\t\t\t// Default value in browsers is `-1` and an empty string is\n\t\t\t// cast to `0` instead\n\t\t\tname != 'tabIndex' &&\n\t\t\tname != 'download' &&\n\t\t\tname != 'rowSpan' &&\n\t\t\tname != 'colSpan' &&\n\t\t\tname != 'role' &&\n\t\t\tname != 'popover' &&\n\t\t\tname in dom\n\t\t) {\n\t\t\ttry {\n\t\t\t\tdom[name] = value == NULL ? '' : value;\n\t\t\t\treturn;\n\t\t\t} catch (e) {}\n\t\t}\n\n\t\t// aria- and data- attributes have no boolean representation.\n\t\t// A `false` value is different from the attribute not being\n\t\t// present, so we can't remove it. For non-boolean aria\n\t\t// attributes we could treat false as a removal, but the\n\t\t// amount of exceptions would cost too many bytes. On top of\n\t\t// that other frameworks generally stringify `false`.\n\n\t\t// Never serialize functions as attribute values.\n\t\tif (typeof value == 'function') return;\n\t\tif (value != NULL && (value !== false || name[4] == '-')) {\n\t\t\tdom.setAttribute(name, name == 'popover' && value == true ? '' : value);\n\t\t} else {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t}\n}\n\n/**\n * Create an event proxy function.\n * @param {string} name The prop name the handler is stored under.\n * @private\n */\nfunction createEventProxy(name) {\n\t/**\n\t * Proxy an event to hooked event handlers\n\t * @param {import('../internal').PreactEvent} e The event object from the browser\n\t * @private\n\t */\n\treturn function (e) {\n\t\tlet eventHandler = this._listeners;\n\t\tif (eventHandler) {\n\t\t\teventHandler = eventHandler[name];\n\t\t\tif (e[EVENT_DISPATCHED] == NULL) {\n\t\t\t\te[EVENT_DISPATCHED] = eventClock++;\n\n\t\t\t\t// When `e[EVENT_DISPATCHED]` is smaller than the time when the targeted event\n\t\t\t\t// listener was attached we know we have bubbled up to an element that was added\n\t\t\t\t// during patching the DOM.\n\t\t\t} else if (e[EVENT_DISPATCHED] < this._attached[name]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn eventHandler(options.event ? options.event(e) : e);\n\t\t}\n\t};\n}\n\n/** @type {Record<string, (e: Event) => any>} */\nconst eventProxies = {};\n", "import { enqueueRender } from './component';\nimport { COMPONENT_FORCE } from './constants';\n\nexport let i = 0;\n\nexport function createContext(defaultValue) {\n\tfunction Context(props) {\n\t\tif (!this.getChildContext) {\n\t\t\t/** @type {Set<import('./internal').Component> | null} */\n\t\t\tlet subs = new Set();\n\t\t\tlet ctx = {};\n\t\t\tctx[Context._id] = this;\n\n\t\t\tthis.getChildContext = () => ctx;\n\n\t\t\tthis.shouldComponentUpdate = function (_props) {\n\t\t\t\t// @ts-expect-error even\n\t\t\t\tif (this.props.value != _props.value) {\n\t\t\t\t\tsubs.forEach(c => {\n\t\t\t\t\t\tc._bits |= COMPONENT_FORCE;\n\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.sub = c => {\n\t\t\t\tsubs.add(c);\n\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\tsubs.delete(c);\n\t\t\t\t\tif (old) old.call(c);\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\n\t\treturn props.children;\n\t}\n\n\tContext._id = '__cC' + i++;\n\tContext._defaultValue = defaultValue;\n\n\t/** @type {import('./internal').FunctionComponent} */\n\tContext.Consumer = (props, contextValue) => {\n\t\treturn props.children(contextValue);\n\t};\n\n\tContext.Provider = Context.Consumer.contextType = Context;\n\n\treturn Context;\n}\n", "import { EMPTY_ARR } from './constants';\n\nexport const isArray = Array.isArray;\nexport const slice = EMPTY_ARR.slice;\nexport const assign = Object.assign;\n\n/**\n * Remove a child node from its parent if attached.\n * @param {import('./internal').PreactElement | null} node The node to remove\n */\nexport function removeNode(node) {\n\tif (node && node.parentNode) node.remove();\n}\n", "import { diff, unmount, applyRef } from './index';\nimport { createVNode, Fragment } from '../create-element';\nimport {\n\tEMPTY_OBJ,\n\tEMPTY_ARR,\n\tINSERT_VNODE,\n\tMATCHED,\n\tLIS_CANDIDATE,\n\tREF_DETACHED,\n\tUNDEFINED,\n\tNULL\n} from '../constants';\nimport { isArray } from '../util';\nimport { getDomSibling } from '../component';\n\n/**\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * Diff the children of a virtual node\n * @param {PreactElement} parentDom The DOM element whose children are being\n * diffed\n * @param {ComponentChildren[]} renderResult\n * @param {VNode} newParentVNode The new virtual node whose children should be\n * diff'ed against oldParentVNode\n * @param {VNode} oldParentVNode The old virtual node whose children should be\n * diff'ed against newParentVNode\n * @param {object} globalContext The current context object - modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n * @returns {PreactElement} The next sibling DOM element to insert new elements\n */\nexport function diffChildren(\n\tparentDom,\n\trenderResult,\n\tnewParentVNode,\n\toldParentVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\tlet i,\n\t\t/** @type {VNode} */\n\t\toldVNode,\n\t\t/** @type {VNode} */\n\t\tchildVNode,\n\t\t/** @type {PreactElement} */\n\t\tnewDom,\n\t\t/** @type {PreactElement} */\n\t\tfirstChildDom;\n\n\t// This is a compression of oldParentVNode != EMPTY_OBJ && oldParentVNode._children || EMPTY_ARR\n\t// as EMPTY_OBJ._children should be `undefined`. Callers always pass at\n\t// least EMPTY_OBJ, so a null check isn't needed.\n\t/** @type {VNode[]} */\n\tlet oldChildren = oldParentVNode._children || EMPTY_ARR;\n\n\tlet newChildrenLength = renderResult.length;\n\n\toldDom = constructNewChildrenArray(\n\t\tnewParentVNode,\n\t\trenderResult,\n\t\toldChildren,\n\t\toldDom,\n\t\tnewChildrenLength\n\t);\n\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\tchildVNode = newParentVNode._children[i];\n\t\tif (childVNode == NULL) continue;\n\n\t\t// At this point, constructNewChildrenArray has assigned _index to be the\n\t\t// matchingIndex for this VNode's oldVNode (or -1 if there is no oldVNode).\n\t\t// ~_index guards the -1 case: a negative array index is a named property\n\t\t// access which V8 can't serve from the fast elements path.\n\t\toldVNode =\n\t\t\t(~childVNode._index && oldChildren[childVNode._index]) || EMPTY_OBJ;\n\n\t\t// Update childVNode._index to its final index\n\t\tchildVNode._index = i;\n\n\t\t// Morph the old element into the new one, but don't append it to the dom yet\n\t\tlet result = diff(\n\t\t\tparentDom,\n\t\t\tchildVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\toldDom,\n\t\t\tisHydrating,\n\t\t\trefQueue\n\t\t);\n\n\t\t// Adjust DOM nodes\n\t\tnewDom = childVNode._dom;\n\t\t// A ref detached while its subtree was parked by Suspense is attached\n\t\t// again on reveal.\n\t\tif (oldVNode.ref != childVNode.ref || oldVNode._flags & REF_DETACHED) {\n\t\t\tif (oldVNode.ref) applyRef(oldVNode.ref, NULL, childVNode, oldVNode);\n\t\t\tif (childVNode.ref) {\n\t\t\t\trefQueue.push(\n\t\t\t\t\tchildVNode.ref,\n\t\t\t\t\tchildVNode._component || newDom,\n\t\t\t\t\tchildVNode\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfirstChildDom = firstChildDom || newDom;\n\n\t\tif (childVNode._flags & INSERT_VNODE) {\n\t\t\toldDom = insert(childVNode, oldDom, parentDom, !oldVNode._original);\n\n\t\t\t// When a matched VNode is physically moved via INSERT_VNODE, its old\n\t\t\t// _dom pointer becomes a stale positional reference. Clear it so that\n\t\t\t// getDomSibling (called from nested diffs) won't return this stale\n\t\t\t// reference and mis-place subsequent DOM nodes. See #5065.\n\t\t\tif (oldVNode._dom) {\n\t\t\t\toldVNode._dom = NULL;\n\t\t\t}\n\t\t} else if (typeof childVNode.type == 'function' && result !== UNDEFINED) {\n\t\t\toldDom = result;\n\t\t} else if (newDom) {\n\t\t\toldDom = newDom.nextSibling;\n\t\t}\n\n\t\t// Clear placement and LIS flags; MATCHED only belongs to old vnodes.\n\t\tchildVNode._flags &= ~(INSERT_VNODE | LIS_CANDIDATE);\n\t}\n\n\tnewParentVNode._dom = firstChildDom;\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} newParentVNode\n * @param {ComponentChildren[]} renderResult\n * @param {VNode[]} oldChildren\n */\nfunction constructNewChildrenArray(\n\tnewParentVNode,\n\trenderResult,\n\toldChildren,\n\toldDom,\n\tnewChildrenLength\n) {\n\t/** @type {number} */\n\tlet i;\n\t/** @type {VNode} */\n\tlet childVNode;\n\t/** @type {VNode} */\n\tlet oldVNode;\n\n\tlet oldChildrenLength = oldChildren.length,\n\t\tremainingOldChildren = oldChildrenLength;\n\n\tlet skew = 0;\n\n\t/** Whether any matched child was found far from its skewed index, i.e. a\n\t * real reorder happened and we need to compute the minimal set of moves. */\n\tlet moved = 0;\n\n\t// Hoisted: every normalization branch below writes through this array, so\n\t// reading `_children` off the vnode each time is a wasted property load.\n\t/** @type {VNode[]} */\n\tlet newChildren = (newParentVNode._children = Array(newChildrenLength));\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\t// @ts-expect-error We are reusing the childVNode variable to hold both the\n\t\t// pre and post normalized childVNode\n\t\tchildVNode = renderResult[i];\n\n\t\tif (\n\t\t\tchildVNode == NULL ||\n\t\t\ttypeof childVNode == 'boolean' ||\n\t\t\ttypeof childVNode == 'function'\n\t\t) {\n\t\t\tnewChildren[i] = NULL;\n\t\t\tcontinue;\n\t\t}\n\t\t// If this newVNode is being reused (e.g. <div>{reuse}{reuse}</div>) in the same diff,\n\t\t// or we are rendering a component (e.g. setState) copy the oldVNodes so it can have\n\t\t// it's own DOM & etc. pointers\n\t\t// Anything that isn't an object at this point is a string, number or\n\t\t// bigint (null, booleans and functions are handled above), String\n\t\t// objects are the lone object type rendered as text.\n\t\telse if (\n\t\t\ttypeof childVNode != 'object' ||\n\t\t\tchildVNode.constructor == String\n\t\t) {\n\t\t\tchildVNode = newChildren[i] = createVNode(NULL, childVNode);\n\t\t} else if (isArray(childVNode)) {\n\t\t\tchildVNode = newChildren[i] = createVNode(Fragment, {\n\t\t\t\tchildren: childVNode\n\t\t\t});\n\t\t} else if (childVNode.constructor === UNDEFINED && childVNode._depth) {\n\t\t\t// VNode is already in use, clone it. This can happen in the following\n\t\t\t// scenario:\n\t\t\t// const reuse = <div />\n\t\t\t// <div>{reuse}<span />{reuse}</div>\n\t\t\tchildVNode = newChildren[i] = createVNode(\n\t\t\t\tchildVNode.type,\n\t\t\t\tchildVNode.props,\n\t\t\t\tchildVNode.key,\n\t\t\t\tchildVNode.ref,\n\t\t\t\tchildVNode._original\n\t\t\t);\n\t\t} else {\n\t\t\tnewChildren[i] = childVNode;\n\t\t}\n\n\t\tconst skewedIndex = i + skew;\n\t\tchildVNode._parent = newParentVNode;\n\t\tchildVNode._depth = newParentVNode._depth + 1;\n\n\t\t// Temporarily store the matchingIndex on the _index property so we can pull\n\t\t// out the oldVNode in diffChildren. We'll override this to the VNode's\n\t\t// final index after using this property to get the oldVNode\n\t\tconst matchingIndex = (childVNode._index = findMatchingIndex(\n\t\t\tchildVNode,\n\t\t\toldChildren,\n\t\t\tskewedIndex,\n\t\t\tremainingOldChildren\n\t\t));\n\n\t\toldVNode = NULL;\n\t\t// ~matchingIndex is only falsy for -1, i.e. when no match was found\n\t\tif (~matchingIndex) {\n\t\t\toldVNode = oldChildren[matchingIndex];\n\t\t\tremainingOldChildren--;\n\t\t\tif (oldVNode) {\n\t\t\t\toldVNode._flags |= MATCHED;\n\t\t\t}\n\t\t}\n\n\t\t// Here, we define isMounting for the purposes of the skew diffing\n\t\t// algorithm. Nodes that are unsuspending are considered mounting and we detect\n\t\t// this by checking if oldVNode._original == null\n\t\tif (!oldVNode || !oldVNode._original) {\n\t\t\tif (!~matchingIndex) {\n\t\t\t\t// When the array of children is growing we need to decrease the skew\n\t\t\t\t// as we are adding a new element to the array.\n\t\t\t\t// Example:\n\t\t\t\t// [1, 2, 3] --> [0, 1, 2, 3]\n\t\t\t\t// oldChildren newChildren\n\t\t\t\t//\n\t\t\t\t// The new element is at index 0, so our skew is 0,\n\t\t\t\t// we need to decrease the skew as we are adding a new element.\n\t\t\t\t// The decrease will cause us to compare the element at position 1\n\t\t\t\t// with value 1 with the element at position 0 with value 0.\n\t\t\t\t//\n\t\t\t\t// A linear concept is applied when the array is shrinking,\n\t\t\t\t// if the length is unchanged we can assume that no skew\n\t\t\t\t// changes are needed.\n\t\t\t\tif (newChildrenLength > oldChildrenLength) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else if (newChildrenLength < oldChildrenLength) {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we are mounting a DOM VNode, mark it for insertion\n\t\t\tif (typeof childVNode.type != 'function') {\n\t\t\t\tchildVNode._flags |= INSERT_VNODE;\n\t\t\t}\n\t\t} else {\n\t\t\t// Keep LIS eligibility separate from MATCHED on old vnodes: if a child\n\t\t\t// throws, uncleared new-vnode flags must not prevent the next match.\n\t\t\tchildVNode._flags |= LIS_CANDIDATE;\n\n\t\t\t// Center the next search for shifts. Only matches farther than one\n\t\t\t// position away require the minimal-move pass.\n\t\t\tif (matchingIndex == skewedIndex - 1) {\n\t\t\t\tskew--;\n\t\t\t} else if (matchingIndex == skewedIndex + 1) {\n\t\t\t\tskew++;\n\t\t\t} else if (matchingIndex != skewedIndex) {\n\t\t\t\tif (matchingIndex > skewedIndex) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\n\t\t\t\tmoved = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (moved) {\n\t\t// Children were reordered: mark the minimal set of matched (LIS_CANDIDATE flag)\n\t\t// children for insertion by finding the longest increasing subsequence of\n\t\t// old indices (patience sorting). Children on the subsequence stay in\n\t\t// place, all others get INSERT_VNODE. `_index` still holds the\n\t\t// matchingIndex here.\n\t\t/** @type {number[]} tails[x] is the smallest old index ending an increasing subsequence of length x+1 */\n\t\tlet tails = [];\n\t\t/** @type {number[]} length of the longest increasing subsequence ending at child i */\n\t\tlet lisLengths = [];\n\t\tfor (i = 0; i < newChildrenLength; i++) {\n\t\t\tchildVNode = newChildren[i];\n\t\t\tif (childVNode && childVNode._flags & LIS_CANDIDATE) {\n\t\t\t\t// Binary search for the insertion point, keeping the pass at\n\t\t\t\t// O(n log n) even for pathological reorders.\n\t\t\t\tskew = 0;\n\t\t\t\tlet hi = tails.length;\n\t\t\t\twhile (skew < hi) {\n\t\t\t\t\tconst mid = (skew + hi) >> 1;\n\t\t\t\t\tif (tails[mid] < childVNode._index) {\n\t\t\t\t\t\tskew = mid + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thi = mid;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttails[skew] = childVNode._index;\n\t\t\t\tlisLengths[i] = skew + 1;\n\t\t\t}\n\t\t}\n\n\t\t// `skew` is dead after the main loop; reuse it as the remaining\n\t\t// subsequence length while walking backwards. Likewise `i` is left at\n\t\t// newChildrenLength by the loop above.\n\t\tskew = tails.length;\n\t\twhile (i--) {\n\t\t\tif (lisLengths[i]) {\n\t\t\t\tif (lisLengths[i] == skew) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else {\n\t\t\t\t\tnewChildren[i]._flags |= INSERT_VNODE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove remaining oldChildren if there are any. Loop forwards so that as we\n\t// unmount DOM from the beginning of the oldChildren, we can adjust oldDom to\n\t// point to the next child, which needs to be the first DOM node that won't be\n\t// unmounted. Keep this a plain loop: an arrow function here would capture\n\t// `oldDom`, forcing V8 to context-allocate it on every call to this function.\n\tif (remainingOldChildren) {\n\t\tfor (i = 0; i < oldChildrenLength; i++) {\n\t\t\toldVNode = oldChildren[i];\n\t\t\tif (oldVNode && !(oldVNode._flags & MATCHED)) {\n\t\t\t\tif (oldVNode._dom == oldDom) {\n\t\t\t\t\toldDom = getDomSibling(oldVNode);\n\t\t\t\t}\n\n\t\t\t\tunmount(oldVNode, oldVNode);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} parentVNode\n * @param {PreactElement} oldDom\n * @param {PreactElement} parentDom\n * @param {boolean} isMounting\n * @returns {PreactElement}\n */\nfunction insert(parentVNode, oldDom, parentDom, isMounting) {\n\t// Note: VNodes in nested suspended trees may be missing _children.\n\tif (typeof parentVNode.type == 'function') {\n\t\t// Root children live in another container, they never move with the\n\t\t// host tree and contribute nothing to the host insertion cursor.\n\t\tif (parentVNode.props._parentDom) return oldDom;\n\t\tlet children = parentVNode._children;\n\t\tif (children) {\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tif (children[i]) {\n\t\t\t\t\t// If we enter this code path on sCU bailout, where we copy\n\t\t\t\t\t// oldVNode._children to newVNode._children, we need to update the old\n\t\t\t\t\t// children's _parent pointer to point to the newVNode (parentVNode\n\t\t\t\t\t// here).\n\t\t\t\t\tchildren[i]._parent = parentVNode;\n\t\t\t\t\toldDom = insert(children[i], oldDom, parentDom, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn oldDom;\n\t} else {\n\t\t// A cursor a parked Suspense subtree detached can't be a reference node:\n\t\t// retry from the vnode tree, then give up and append.\n\t\tif (oldDom && !oldDom.parentNode) {\n\t\t\toldDom = getDomSibling(parentVNode);\n\t\t\tif (oldDom && !oldDom.parentNode) oldDom = NULL;\n\t\t}\n\n\t\t// Comments (e.g. server `$s` markers) are never ours: a node right after\n\t\t// them is already in place.\n\t\tlet dom = parentVNode._dom;\n\t\tlet next = oldDom;\n\t\twhile (next && next.nodeType == 8) next = next.nextSibling;\n\n\t\tif (dom != next) {\n\t\t\t// Containers that aren't DOM nodes may not implement moveBefore()\n\t\t\tif (!isMounting && parentDom.moveBefore && dom.parentNode) {\n\t\t\t\t// @ts-expect-error This isn't added to TypeScript lib.d.ts yet\n\t\t\t\tparentDom.moveBefore(dom, oldDom);\n\t\t\t} else {\n\t\t\t\tparentDom.insertBefore(dom, oldDom || NULL);\n\t\t\t}\n\t\t}\n\t\toldDom = dom;\n\t}\n\n\twhile (\n\t\t(oldDom = oldDom && oldDom.nextSibling) &&\n\t\toldDom.nodeType == 8 &&\n\t\t!oldDom.data.startsWith('$s')\n\t);\n\n\treturn oldDom;\n}\n\n/**\n * Flatten and loop through the children of a virtual node\n * @param {ComponentChildren} children The unflattened children of a virtual\n * node\n * @returns {VNode[]}\n */\nexport function toChildArray(children, out) {\n\tout = out || [];\n\tif (children != NULL && typeof children != 'boolean') {\n\t\tif (isArray(children)) {\n\t\t\tchildren.some(child => {\n\t\t\t\ttoChildArray(child, out);\n\t\t\t});\n\t\t} else {\n\t\t\tout.push(children);\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * @param {VNode} childVNode\n * @param {VNode[]} oldChildren\n * @param {number} skewedIndex\n * @param {number} remainingOldChildren\n * @returns {number}\n */\nfunction findMatchingIndex(\n\tchildVNode,\n\toldChildren,\n\tskewedIndex,\n\tremainingOldChildren\n) {\n\tconst key = childVNode.key;\n\tconst type = childVNode.type;\n\tlet oldVNode = oldChildren[skewedIndex];\n\tconst matched = oldVNode && !(oldVNode._flags & MATCHED);\n\n\t// We only need to perform a search if there are more children\n\t// (remainingOldChildren) to search. However, if the oldVNode we just looked\n\t// at skewedIndex was not already used in this diff, then there must be at\n\t// least 1 other (so greater than 1) remainingOldChildren to attempt to match\n\t// against. So the following condition checks that ensuring\n\t// remainingOldChildren > 1 if the oldVNode is not already used/matched. Else\n\t// if the oldVNode was null or matched, then there could needs to be at least\n\t// 1 (aka `remainingOldChildren > 0`) children to find and compare against.\n\t//\n\t// If there is an unkeyed functional VNode, that isn't a built-in like our Fragment,\n\t// we should not search as we risk re-using state of an unrelated VNode. (reverted for now)\n\tlet shouldSearch =\n\t\t// (typeof type != 'function' || type === Fragment || key) &&\n\t\t// The ternary keeps this a Smi comparison; `> matched` would compare\n\t\t// number to boolean which V8 can't serve from the fast path.\n\t\tremainingOldChildren > (matched ? 1 : 0);\n\n\tif (\n\t\t(oldVNode === NULL && key == NULL) ||\n\t\t(matched && key == oldVNode.key && type == oldVNode.type)\n\t) {\n\t\treturn skewedIndex;\n\t} else if (shouldSearch) {\n\t\tlet x;\n\t\tfor (x = skewedIndex - 1; x >= 0; x--) {\n\t\t\toldVNode = oldChildren[x];\n\t\t\tif (\n\t\t\t\toldVNode &&\n\t\t\t\t!(oldVNode._flags & MATCHED) &&\n\t\t\t\tkey == oldVNode.key &&\n\t\t\t\ttype == oldVNode.type\n\t\t\t)\n\t\t\t\treturn x;\n\t\t}\n\t\tfor (x = skewedIndex + 1; x < oldChildren.length; x++) {\n\t\t\toldVNode = oldChildren[x];\n\t\t\tif (\n\t\t\t\toldVNode &&\n\t\t\t\t!(oldVNode._flags & MATCHED) &&\n\t\t\t\tkey == oldVNode.key &&\n\t\t\t\ttype == oldVNode.type\n\t\t\t)\n\t\t\t\treturn x;\n\t\t}\n\t}\n\n\treturn -1;\n}\n", "import { BaseComponent, getDomSibling } from '../component';\nimport {\n\tCOMPONENT_DIRTY,\n\tCOMPONENT_FORCE,\n\tCOMPONENT_PENDING_ERROR,\n\tCOMPONENT_PROCESSING_EXCEPTION,\n\tEMPTY_ARR,\n\tEMPTY_OBJ,\n\tFORCE_PROPS_REVALIDATE,\n\tMATHML_TOKEN_ELEMENTS,\n\tMATH_NAMESPACE,\n\tMODE_HYDRATE,\n\tMODE_SUSPENDED,\n\tNULL,\n\tRESET_MODE,\n\tSVG_NAMESPACE,\n\tUNDEFINED,\n\tXHTML_NAMESPACE\n} from '../constants';\nimport { Fragment } from '../create-element';\nimport options from '../options';\nimport { assign, isArray, removeNode, slice } from '../util';\nimport { diffChildren } from './children';\nimport { setProperty } from './props';\n\n/**\n * @typedef {import('../internal').ComponentType} ComponentType\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * @template {any} T\n * @typedef {import('../internal').Ref<T>} Ref<T>\n */\n\n/**\n * Diff two virtual nodes and apply proper changes to the DOM\n * @param {PreactElement} parentDom The parent of the DOM element\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object. Modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n */\nexport function diff(\n\tparentDom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\t/** @type {any} */\n\tlet tmp,\n\t\tresumed,\n\t\tnewType = newVNode.type;\n\n\t// When passing through createElement it assigns the object\n\t// constructor as undefined. This to prevent JSON-injection.\n\tif (newVNode.constructor !== UNDEFINED) return NULL;\n\n\t// If the previous diff bailed out, resume creating/hydrating into the DOM\n\t// that was kept while suspended (server-rendered, or already in the\n\t// container we rendered into). `tmp` holds the stored excess node until the\n\t// options._diff call below.\n\tif (\n\t\toldVNode._flags & MODE_SUSPENDED &&\n\t\t// @ts-expect-error This is MODE_HYDRATE or 0\n\t\t((isHydrating = oldVNode._flags & MODE_HYDRATE),\n\t\t(tmp = oldVNode._component._excess))\n\t) {\n\t\tnewVNode._flags |= isHydrating;\n\t\tresumed = excessDomChildren = [];\n\t\tif (tmp.nodeType == 8) {\n\t\t\t// Re-scan DOM from stored start marker for streamed hydration.\n\t\t\toldDom = rangeEnd(tmp, excessDomChildren);\n\t\t} else {\n\t\t\texcessDomChildren.push(tmp);\n\t\t}\n\t\toldDom = excessDomChildren[0] || oldDom;\n\t}\n\n\tif ((tmp = options._diff)) tmp(newVNode);\n\n\touter: if (typeof newType == 'function') {\n\t\tlet oldCommitQueueLength = commitQueue.length;\n\t\ttry {\n\t\t\tlet c,\n\t\t\t\toldProps,\n\t\t\t\toldState,\n\t\t\t\tsnapshot,\n\t\t\t\tnewProps = newVNode.props;\n\t\t\tconst isClassComponent = (tmp = newType.prototype) && tmp.render;\n\n\t\t\t// Necessary for createContext api. Setting this property will pass\n\t\t\t// the context value as `this.context` just for this component.\n\t\t\ttmp = newType.contextType;\n\t\t\tconst provider = tmp && globalContext[tmp._id];\n\t\t\tconst componentContext = tmp\n\t\t\t\t? provider\n\t\t\t\t\t? provider.props.value\n\t\t\t\t\t: tmp._defaultValue\n\t\t\t\t: globalContext;\n\n\t\t\t// Get component and set it to `c`\n\t\t\tif ((c = oldVNode._component)) {\n\t\t\t\tnewVNode._component = c;\n\t\t\t\tif (c._bits & COMPONENT_PENDING_ERROR) {\n\t\t\t\t\tc._bits |= COMPONENT_PROCESSING_EXCEPTION;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Instantiate the new component\n\t\t\t\tif (isClassComponent) {\n\t\t\t\t\t// @ts-expect-error Trust me, Component implements the interface we want\n\t\t\t\t\tnewVNode._component = c = new newType(newProps, componentContext); // eslint-disable-line new-cap\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-expect-error Trust me, Component implements the interface we want\n\t\t\t\t\tnewVNode._component = c = new BaseComponent(\n\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t);\n\n\t\t\t\t\tc.constructor = newType;\n\t\t\t\t\tc.render = doRender;\n\t\t\t\t}\n\t\t\t\tif (provider) provider.sub(c);\n\n\t\t\t\tif (!c.state) c.state = {};\n\t\t\t\tc._globalContext = globalContext;\n\t\t\t\tc._bits |= COMPONENT_DIRTY;\n\t\t\t\tc._renderCallbacks = [];\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t}\n\n\t\t\tif (isClassComponent) {\n\t\t\t\tif (!c._nextState) c._nextState = c.state;\n\n\t\t\t\t// Invoke getDerivedStateFromProps\n\t\t\t\tif (newType.getDerivedStateFromProps) {\n\t\t\t\t\tif (c._nextState == c.state) {\n\t\t\t\t\t\tc._nextState = assign({}, c._nextState);\n\t\t\t\t\t}\n\n\t\t\t\t\tassign(\n\t\t\t\t\t\tc._nextState,\n\t\t\t\t\t\tnewType.getDerivedStateFromProps(newProps, c._nextState)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toldProps = c.props;\n\t\t\toldState = c.state;\n\t\t\tc._vnode = newVNode;\n\n\t\t\t// Invoke pre-render lifecycle methods\n\t\t\tif (!oldVNode._component) {\n\t\t\t\tif (\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\t!newType.getDerivedStateFromProps &&\n\t\t\t\t\tc.componentWillMount\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillMount();\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidMount) {\n\t\t\t\t\tc._renderCallbacks.push(c.componentDidMount);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tnewProps !== oldProps &&\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\t!newType.getDerivedStateFromProps &&\n\t\t\t\t\tc.componentWillReceiveProps\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillReceiveProps(newProps, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(newVNode._original == oldVNode._original &&\n\t\t\t\t\t\t!(c._bits & COMPONENT_DIRTY)) ||\n\t\t\t\t\t(!(c._bits & COMPONENT_FORCE) &&\n\t\t\t\t\t\tc.shouldComponentUpdate &&\n\t\t\t\t\t\tc.shouldComponentUpdate(\n\t\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\t\tc._nextState,\n\t\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t\t) === false)\n\t\t\t\t) {\n\t\t\t\t\t// More info about this here: https://gist.github.com/JoviDeCroock/bec5f2ce93544d2e6070ef8e0036e4e8\n\t\t\t\t\tif (newVNode._original != oldVNode._original) {\n\t\t\t\t\t\t// When we are dealing with a bail because of sCU we have to update\n\t\t\t\t\t\t// the props, state and dirty-state.\n\t\t\t\t\t\t// when we are dealing with strict-equality we don't as the child could still\n\t\t\t\t\t\t// be dirtied see #3883\n\t\t\t\t\t\tc.props = newProps;\n\t\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t\t\tc._bits &= ~COMPONENT_DIRTY;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t\tnewVNode._children.some(vnode => {\n\t\t\t\t\t\tif (vnode) vnode._parent = newVNode;\n\t\t\t\t\t});\n\n\t\t\t\t\tEMPTY_ARR.push.apply(c._renderCallbacks, c._stateCallbacks);\n\t\t\t\t\tc._stateCallbacks = [];\n\n\t\t\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\t\t\tcommitQueue.push(c);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Skip over the retained subtree without traversing it; the\n\t\t\t\t\t// `result` branch in diffChildren picks this up as the next\n\t\t\t\t\t// oldDom.\n\t\t\t\t\toldDom = getDomSibling(oldVNode);\n\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\n\t\t\t\tif (c.componentWillUpdate) {\n\t\t\t\t\tc.componentWillUpdate(newProps, c._nextState, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidUpdate) {\n\t\t\t\t\tc._renderCallbacks.push(() => {\n\t\t\t\t\t\tc.componentDidUpdate(oldProps, oldState, snapshot);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tc.context = componentContext;\n\t\t\tc.props = newProps;\n\t\t\tc._parentDom = parentDom;\n\t\t\tc._bits &= ~COMPONENT_FORCE;\n\n\t\t\tlet renderHook = options._render,\n\t\t\t\tcount = 0;\n\t\t\tif (isClassComponent) {\n\t\t\t\tc.state = c._nextState;\n\t\t\t\tc._bits &= ~COMPONENT_DIRTY;\n\n\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\tEMPTY_ARR.push.apply(c._renderCallbacks, c._stateCallbacks);\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t} else {\n\t\t\t\tdo {\n\t\t\t\t\tc._bits &= ~COMPONENT_DIRTY;\n\t\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\t\t// Handle setState called in render, see #2553\n\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t} while (c._bits & COMPONENT_DIRTY && ++count < 25);\n\t\t\t}\n\n\t\t\t// Handle setState called in render, see #2553\n\t\t\tc.state = c._nextState;\n\n\t\t\tif (c.getChildContext) {\n\t\t\t\tglobalContext = assign({}, globalContext, c.getChildContext());\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tisClassComponent &&\n\t\t\t\toldVNode._component &&\n\t\t\t\tc.getSnapshotBeforeUpdate\n\t\t\t) {\n\t\t\t\tsnapshot = c.getSnapshotBeforeUpdate(oldProps, oldState);\n\t\t\t}\n\n\t\t\tconst renderResult =\n\t\t\t\ttmp && tmp.type === Fragment && tmp.key == NULL\n\t\t\t\t\t? tmp.props.children\n\t\t\t\t\t: tmp;\n\n\t\t\t// A vnode carrying a `_parentDom` prop, considered a new root,\n\t\t\t// continues rendering into that container. The subtree must stay\n\t\t\t// invisible to the host tree's DOM bookkeeping: the portal vnode\n\t\t\t// keeps a `null` `_dom` and the host insertion cursor (`oldDom`)\n\t\t\t// passes through unchanged.\n\t\t\t// `tmp` (the raw render result, already unwrapped into renderResult)\n\t\t\t// doubles as the saved host insertion cursor while we render into\n\t\t\t// the portal's container.\n\t\t\tif (newProps._parentDom) {\n\t\t\t\ttmp = oldDom;\n\t\t\t\tparentDom = newProps._parentDom;\n\t\t\t\t// If we portal into a math or svg element we need\n\t\t\t\t// to swap the namespace (chart libraries often do this).\n\t\t\t\t// The document follows the container too (e.g. iframes) as\n\t\t\t\t// diffElementNodes derives it from its parentDom.\n\t\t\t\tnamespace = parentDom.namespaceURI;\n\t\t\t\t// Portals are never server-rendered: hydration must not claim the\n\t\t\t\t// host parent's excess nodes for the container's children.\n\t\t\t\tisHydrating = excessDomChildren = NULL;\n\n\t\t\t\t// Changing the container remounts the children into the new one\n\t\t\t\tif (oldVNode.props && oldVNode.props._parentDom != parentDom) {\n\t\t\t\t\t/** @type {VNode[]} */ (oldVNode._children).some(child => {\n\t\t\t\t\t\tif (child) unmount(child, child);\n\t\t\t\t\t});\n\t\t\t\t\toldVNode._children = NULL;\n\t\t\t\t}\n\n\t\t\t\toldDom = oldVNode._children ? getDomSibling(oldVNode, 0) : NULL;\n\t\t\t}\n\n\t\t\toldDom = diffChildren(\n\t\t\t\tparentDom,\n\t\t\t\tisArray(renderResult) ? renderResult : [renderResult],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnamespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\toldDom,\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\t// When we exit a portal we\n\t\t\t// change up the oldDom\n\t\t\tif (newProps._parentDom) {\n\t\t\t\tnewVNode._dom = NULL;\n\t\t\t\toldDom = tmp;\n\t\t\t}\n\n\t\t\t// Keep `_excess` so unmount can remove the range markers.\n\t\t\tnewVNode._flags &= RESET_MODE;\n\n\t\t\t// Remove the kept DOM this resumed render didn't claim\n\t\t\tif (resumed) resumed.some(removeNode);\n\n\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\tcommitQueue.push(c);\n\t\t\t}\n\n\t\t\t// Only clear when this render was the retry; PENDING_ERROR set by a\n\t\t\t// descendant during this render must survive until then.\n\t\t\tif (c._bits & COMPONENT_PROCESSING_EXCEPTION) {\n\t\t\t\tc._bits &= ~(COMPONENT_PROCESSING_EXCEPTION | COMPONENT_PENDING_ERROR);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// We remove any componentDidMount, ...\n\t\t\t// that have been invalidated by us\n\t\t\t// intercepting the error.\n\t\t\tcommitQueue.length = oldCommitQueueLength;\n\t\t\tnewVNode._original = NULL;\n\t\t\t// if hydrating or creating initial tree, bailout preserves DOM:\n\t\t\tif (isHydrating || excessDomChildren) {\n\t\t\t\tif (e.then) {\n\t\t\t\t\tlet commentMarkersToFind = 0,\n\t\t\t\t\t\tstartMarker;\n\n\t\t\t\t\t// isHydrating is MODE_HYDRATE or falsy\n\t\t\t\t\tnewVNode._flags |= MODE_SUSPENDED | isHydrating;\n\n\t\t\t\t\tif (excessDomChildren) {\n\t\t\t\t\t\tlet i = excessDomChildren.indexOf(oldDom || UNDEFINED),\n\t\t\t\t\t\t\tchild;\n\t\t\t\t\t\tif (!~i) i = excessDomChildren.length;\n\n\t\t\t\t\t\t// The cursor skips comments: step back to this component's markers.\n\t\t\t\t\t\twhile ((child = excessDomChildren[i - 1]) && child.nodeType == 8) {\n\t\t\t\t\t\t\ti--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (; i < excessDomChildren.length; i++) {\n\t\t\t\t\t\t\tchild = excessDomChildren[i];\n\t\t\t\t\t\t\tif (!child) continue;\n\t\t\t\t\t\t\texcessDomChildren[i] = NULL;\n\n\t\t\t\t\t\t\tif (child.nodeType == 8) {\n\t\t\t\t\t\t\t\tif (child.data.startsWith('$s')) {\n\t\t\t\t\t\t\t\t\tif (!commentMarkersToFind++) startMarker = child;\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tcommentMarkersToFind &&\n\t\t\t\t\t\t\t\t\tchild.data.startsWith('/$s') &&\n\t\t\t\t\t\t\t\t\t!--commentMarkersToFind\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (!commentMarkersToFind) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!startMarker) {\n\t\t\t\t\t\twhile (oldDom && oldDom.nodeType == 8 && oldDom.nextSibling) {\n\t\t\t\t\t\t\toldDom = oldDom.nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstartMarker = oldDom;\n\t\t\t\t\t}\n\t\t\t\t\t// Preserve the original range when re-suspending.\n\t\t\t\t\tstartMarker =\n\t\t\t\t\t\tnewVNode._component._excess ||\n\t\t\t\t\t\t(newVNode._component._excess = startMarker);\n\t\t\t\t\t// Insert before the range; continue diffing after it.\n\t\t\t\t\tif ((tmp = rangeEnd(startMarker))) {\n\t\t\t\t\t\tnewVNode._dom = startMarker;\n\t\t\t\t\t\toldDom = tmp;\n\t\t\t\t\t} else newVNode._dom = oldDom;\n\t\t\t\t\toldDom = oldDom && oldDom.nextSibling;\n\t\t\t\t} else if (excessDomChildren) {\n\t\t\t\t\texcessDomChildren.some(removeNode);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t}\n\n\t\t\tif (!newVNode._children) {\n\t\t\t\tnewVNode._children = oldVNode._children || [];\n\t\t\t}\n\n\t\t\tif (!e.then) markAsForce(newVNode);\n\t\t\toptions._catchError(e, newVNode, oldVNode);\n\t\t}\n\t} else {\n\t\toldDom = newVNode._dom = diffElementNodes(\n\t\t\toldVNode._dom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\tisHydrating,\n\t\t\trefQueue,\n\t\t\tparentDom\n\t\t);\n\t}\n\n\tif ((tmp = options.diffed)) tmp(newVNode);\n\n\treturn oldDom;\n}\n\n/**\n * Find the closing marker of a streamed range.\n * @param {PreactElement} start A `$s` marker opening a range\n * @param {PreactElement[]} [nodes] Collects the nodes inside the range\n * @returns {PreactElement} The closing marker, or undefined when `start` doesn't\n * open a range or the range is unclosed\n */\nfunction rangeEnd(start, nodes) {\n\tif (start && start.nodeType == 8 && start.data.startsWith('$s')) {\n\t\tfor (let depth = 1; (start = start.nextSibling); ) {\n\t\t\tif (start.nodeType == 8) {\n\t\t\t\tif (start.data.startsWith('$s')) depth++;\n\t\t\t\telse if (start.data.startsWith('/$s') && !--depth) return start;\n\t\t\t}\n\t\t\tif (nodes) nodes.push(start);\n\t\t}\n\t}\n}\n\nfunction markAsForce(vnode) {\n\tif (vnode) {\n\t\tif (vnode._component) vnode._component._bits |= COMPONENT_FORCE;\n\t\tif (vnode._children) vnode._children.some(markAsForce);\n\t}\n}\n\n/**\n * @param {Array<Component>} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {VNode} root\n */\nexport function commitRoot(commitQueue, root, refQueue) {\n\tfor (let i = 0; i < refQueue.length; ) {\n\t\tapplyRef(refQueue[i++], refQueue[i++], refQueue[i++]);\n\t}\n\n\tif (options._commit) options._commit(root, commitQueue);\n\n\tcommitQueue.some(c => {\n\t\ttry {\n\t\t\t// @ts-expect-error Reuse the commitQueue variable here so the type changes\n\t\t\tcommitQueue = c._renderCallbacks;\n\t\t\tc._renderCallbacks = [];\n\t\t\tcommitQueue.some(cb => {\n\t\t\t\t// @ts-expect-error See above comment on commitQueue\n\t\t\t\tcb.call(c);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t});\n}\n\n/**\n * Diff two virtual nodes representing DOM element\n * @param {PreactElement} dom The DOM element representing the virtual nodes\n * being diffed\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n * @param {PreactElement} parentDom The parent this element will be inserted\n * into; new nodes are created from its ownerDocument (e.g. iframes), or from\n * the global document for containers that don't have one\n * @returns {PreactElement}\n */\nfunction diffElementNodes(\n\tdom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\tisHydrating,\n\trefQueue,\n\tparentDom\n) {\n\tlet oldProps = oldVNode.props || EMPTY_OBJ;\n\tconst newProps = newVNode.props;\n\tconst nodeType = /** @type {string} */ (newVNode.type);\n\t/** @type {any} */\n\tlet i;\n\t/** @type {{ __html?: string }} */\n\tlet newHtml;\n\t/** @type {{ __html?: string }} */\n\tlet oldHtml;\n\t/** @type {ComponentChildren} */\n\tlet newChildren;\n\tlet value;\n\tlet inputValue;\n\tlet checked;\n\n\t// Tracks entering and exiting namespaces when descending through the tree.\n\tif (nodeType == 'svg') namespace = SVG_NAMESPACE;\n\telse if (nodeType == 'math') namespace = MATH_NAMESPACE;\n\telse if (!namespace) namespace = XHTML_NAMESPACE;\n\n\tif (excessDomChildren) {\n\t\tfor (i = 0; i < excessDomChildren.length; i++) {\n\t\t\tvalue = excessDomChildren[i];\n\n\t\t\t// if newVNode matches an element in excessDomChildren or the `dom`\n\t\t\t// argument matches an element in excessDomChildren, remove it from\n\t\t\t// excessDomChildren so it isn't later removed in diffChildren.\n\t\t\t// `localName` is only present on elements, so it doubles as the\n\t\t\t// element check for the non-text branch.\n\t\t\tif (\n\t\t\t\tvalue &&\n\t\t\t\t(nodeType ? value.localName == nodeType : value.nodeType == 3)\n\t\t\t) {\n\t\t\t\tdom = value;\n\t\t\t\texcessDomChildren[i] = NULL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!dom) {\n\t\tconst doc = parentDom.ownerDocument || document;\n\t\tif (!nodeType) {\n\t\t\treturn doc.createTextNode(newProps);\n\t\t}\n\n\t\tdom = doc.createElementNS(namespace, nodeType, newProps.is && newProps);\n\n\t\t// we are creating a new node, so we can assume this is a new subtree (in\n\t\t// case we are hydrating), this deopts the hydrate\n\t\tif (isHydrating) {\n\t\t\tif (options._hydrationMismatch)\n\t\t\t\toptions._hydrationMismatch(newVNode, excessDomChildren);\n\t\t\tisHydrating = false;\n\t\t}\n\t\t// we created a new parent, so none of the previously attached children can be reused:\n\t\texcessDomChildren = NULL;\n\t}\n\n\tif (!nodeType) {\n\t\t// During hydration, we still have to split merged text from SSR'd HTML.\n\t\tif (oldProps !== newProps && (!isHydrating || dom.data != newProps)) {\n\t\t\tdom.data = newProps;\n\t\t}\n\t} else {\n\t\t// A <template> holds its children in a separate document-fragment, both\n\t\t// when reading existing DOM and when inserting new nodes. `parentDom` is\n\t\t// unused from here on, so we reuse it as the container for our children.\n\t\t// @ts-expect-error\n\t\tparentDom = nodeType == 'template' ? dom.content : dom;\n\n\t\t// If excessDomChildren was not null, repopulate it with the current element's children:\n\t\texcessDomChildren =\n\t\t\tnodeType == 'textarea' && newProps.defaultValue != NULL\n\t\t\t\t? NULL\n\t\t\t\t: excessDomChildren && slice.call(parentDom.childNodes);\n\n\t\t// If we are in a situation where we are not hydrating but are using\n\t\t// existing DOM (e.g. replaceNode) we should read the existing DOM\n\t\t// attributes to diff them\n\t\tif (!isHydrating && excessDomChildren) {\n\t\t\t// Keep this a plain loop: an arrow function here would capture\n\t\t\t// `oldProps`, forcing V8 to context-allocate it and slowing down the\n\t\t\t// hot `for (i in oldProps)` loop below for every element we diff.\n\t\t\toldProps = {};\n\t\t\tfor (i = 0; i < dom.attributes.length; i++) {\n\t\t\t\tvalue = dom.attributes[i];\n\t\t\t\toldProps[value.name] = value.value;\n\t\t\t}\n\t\t}\n\n\t\tfor (i in oldProps) {\n\t\t\tvalue = oldProps[i];\n\t\t\tif (i == 'dangerouslySetInnerHTML') {\n\t\t\t\toldHtml = value;\n\t\t\t} else if (\n\t\t\t\ti != 'children' &&\n\t\t\t\t!(i in newProps) &&\n\t\t\t\t!(i == 'value' && 'defaultValue' in newProps) &&\n\t\t\t\t!(i == 'checked' && 'defaultChecked' in newProps)\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, NULL, value, namespace);\n\t\t\t}\n\t\t}\n\n\t\t// During hydration, props are not diffed at all (including dangerouslySetInnerHTML)\n\t\t// @TODO we should warn in debug mode when props don't match here.\n\t\tconst shouldRevalidateProps = oldVNode._flags & FORCE_PROPS_REVALIDATE;\n\t\tfor (i in newProps) {\n\t\t\tvalue = newProps[i];\n\t\t\tif (i == 'children') {\n\t\t\t\tnewChildren = value;\n\t\t\t} else if (i == 'dangerouslySetInnerHTML') {\n\t\t\t\tnewHtml = value;\n\t\t\t} else if (i == 'value') {\n\t\t\t\tinputValue = value;\n\t\t\t} else if (i == 'checked') {\n\t\t\t\tchecked = value;\n\t\t\t} else if (\n\t\t\t\t(!isHydrating || typeof value == 'function') &&\n\t\t\t\t(oldProps[i] !== value || (shouldRevalidateProps && value != NULL))\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, value, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\n\t\t// If the new vnode didn't have dangerouslySetInnerHTML, diff its children\n\t\tif (newHtml) {\n\t\t\t// Avoid re-applying the same '__html' if it did not changed between re-render\n\t\t\tif (\n\t\t\t\t!isHydrating &&\n\t\t\t\t(!oldHtml ||\n\t\t\t\t\t(newHtml.__html != oldHtml.__html && newHtml.__html != dom.innerHTML))\n\t\t\t) {\n\t\t\t\tdom.innerHTML = newHtml.__html;\n\t\t\t}\n\n\t\t\tnewVNode._children = [];\n\t\t} else {\n\t\t\tif (oldHtml) dom.textContent = '';\n\n\t\t\tif (\n\t\t\t\tnodeType == 'foreignObject' ||\n\t\t\t\t(namespace == MATH_NAMESPACE && MATHML_TOKEN_ELEMENTS.test(nodeType))\n\t\t\t) {\n\t\t\t\tnamespace = XHTML_NAMESPACE;\n\t\t\t}\n\n\t\t\tdiffChildren(\n\t\t\t\tparentDom,\n\t\t\t\tisArray(newChildren) ? newChildren : [newChildren],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnamespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\texcessDomChildren\n\t\t\t\t\t? excessDomChildren[0]\n\t\t\t\t\t: oldVNode._children && getDomSibling(oldVNode, 0),\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\t// Remove children that are not part of any vnode.\n\t\t\tif (excessDomChildren) excessDomChildren.some(removeNode);\n\t\t}\n\n\t\t// As above, don't diff props during hydration\n\t\tif (!isHydrating || nodeType == 'textarea') {\n\t\t\ti = 'value';\n\t\t\tif (nodeType == 'progress' && inputValue == NULL) {\n\t\t\t\tdom.removeAttribute(i);\n\t\t\t} else if (\n\t\t\t\tinputValue != UNDEFINED &&\n\t\t\t\t// #2756 For the <progress>-element the initial value is 0,\n\t\t\t\t// despite the attribute not being present. When the attribute\n\t\t\t\t// is missing the progress bar is treated as indeterminate.\n\t\t\t\t// To fix that we'll always update it when it is 0 for progress elements\n\t\t\t\t(inputValue !== dom[i] || (nodeType == 'progress' && !inputValue))\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, inputValue, oldProps[i], namespace);\n\t\t\t}\n\n\t\t\ti = 'checked';\n\t\t\tif (checked != UNDEFINED && checked != dom[i]) {\n\t\t\t\tsetProperty(dom, i, checked, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn dom;\n}\n\n/**\n * Invoke or update a ref, depending on whether it is a function or object ref.\n * @param {Ref<any>} ref\n * @param {any} value The element or component to attach, or `null` to detach\n * @param {VNode} vnode\n * @param {any} [owner] The vnode the ref is detached from\n */\nexport function applyRef(ref, value, vnode, owner) {\n\ttry {\n\t\tif (typeof ref == 'function') {\n\t\t\t// Store the cleanup on the element or component rather than on the\n\t\t\t// ref function, which can be shared between several of them. The\n\t\t\t// slot is cleared on detach, so detaching twice is a no-op.\n\t\t\tif (value) value._refCleanup = ref(value) || 1;\n\t\t\telse if (\n\t\t\t\towner &&\n\t\t\t\t(owner = owner._component || owner._dom) &&\n\t\t\t\t(value = owner._refCleanup)\n\t\t\t) {\n\t\t\t\towner._refCleanup = NULL;\n\t\t\t\tif (typeof value == 'function') value();\n\t\t\t\telse ref(NULL);\n\t\t\t}\n\t\t} else ref.current = value;\n\t} catch (e) {\n\t\toptions._catchError(e, vnode);\n\t}\n}\n\n/**\n * Unmount a virtual node from the tree and apply DOM changes\n * @param {VNode} vnode The virtual node to unmount\n * @param {VNode} parentVNode The parent of the VNode that initiated the unmount\n * @param {boolean} [skipRemove] Flag that indicates that a parent node of the\n * current element is already detached from the DOM.\n */\nexport function unmount(vnode, parentVNode, skipRemove) {\n\tlet r, end, nodes;\n\tif (options.unmount) options.unmount(vnode);\n\n\tif ((r = vnode.ref) && (!r.current || r.current == vnode._dom)) {\n\t\tapplyRef(r, NULL, parentVNode, vnode);\n\t}\n\n\tif ((r = vnode._component)) {\n\t\tif (r.componentWillUnmount) {\n\t\t\ttry {\n\t\t\t\tr.componentWillUnmount();\n\t\t\t} catch (e) {\n\t\t\t\toptions._catchError(e, parentVNode);\n\t\t\t}\n\t\t}\n\n\t\tr._parentDom = r._globalContext = NULL;\n\t}\n\n\tif ((r = vnode._children)) {\n\t\tfor (let i = 0; i < r.length; i++) {\n\t\t\tif (r[i]) {\n\t\t\t\tunmount(\n\t\t\t\t\tr[i],\n\t\t\t\t\tparentVNode,\n\t\t\t\t\t// A portal's children live in another container, so a removed\n\t\t\t\t\t// host ancestor doesn't detach them; always remove them.\n\t\t\t\t\ttypeof vnode.type == 'function'\n\t\t\t\t\t\t? skipRemove && !vnode.props._parentDom\n\t\t\t\t\t\t: true\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// A component that suspended while hydrating owns its range's markers,\n\t// and its content too while still pending.\n\tif (\n\t\t!skipRemove &&\n\t\t(r = vnode._component) &&\n\t\t(r = r._excess) &&\n\t\t(end = rangeEnd(r, (nodes = [])))\n\t) {\n\t\tif (r == vnode._dom) nodes.some(removeNode);\n\t\tremoveNode(end);\n\t\tremoveNode(r);\n\t}\n\n\tif ((r = vnode._dom)) {\n\t\tif (!skipRemove) removeNode(r);\n\t\tif (r._listeners) r._listeners = NULL;\n\t}\n\n\tvnode._dom = vnode._component = vnode._parent = NULL;\n}\n\n/** The `.render()` method for a PFC backing instance. */\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n", "import { EMPTY_OBJ, MODE_HYDRATE, NULL } from './constants';\nimport { commitRoot, diff } from './diff/index';\nimport { createVNode, Fragment } from './create-element';\nimport options from './options';\nimport { slice } from './util';\n\n/**\n * Render a Preact virtual node into a DOM element\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to render into\n */\nexport function render(vnode, parentDom) {\n\tif (options._root) options._root(vnode, parentDom);\n\n\t// https://github.com/preactjs/preact/issues/3794\n\t// https://github.com/preactjs/preact/issues/5118\n\tif (parentDom.nodeType == 9) {\n\t\tparentDom = parentDom.documentElement;\n\t}\n\n\t// @ts-expect-error\n\tlet isHydrating = vnode && vnode._flags & MODE_HYDRATE;\n\n\t// To be able to support calling `render()` multiple times on the same\n\t// DOM node, we need to obtain a reference to the previous tree. We do\n\t// this by assigning a new `_children` property to DOM nodes which points\n\t// to the last rendered tree. By default this property is not present, which\n\t// means that we are mounting a new tree for the first time.\n\tlet oldVNode = isHydrating ? NULL : parentDom._children;\n\n\tparentDom._children = createVNode(Fragment, { children: [vnode] });\n\n\t// List of effects that need to be called after diffing.\n\tlet commitQueue = [],\n\t\trefQueue = [];\n\n\tdiff(\n\t\tparentDom,\n\t\t// Determine the new vnode tree and store it on the DOM element on\n\t\t// our custom `_children` property.\n\t\tparentDom._children,\n\t\toldVNode || EMPTY_OBJ,\n\t\tEMPTY_OBJ,\n\t\tparentDom.namespaceURI,\n\t\toldVNode\n\t\t\t? NULL\n\t\t\t: parentDom.firstChild\n\t\t\t\t? slice.call(parentDom.childNodes)\n\t\t\t\t: NULL,\n\t\tcommitQueue,\n\t\toldVNode ? oldVNode._dom : parentDom.firstChild,\n\t\t// @ts-expect-error we are doing a bit-wise operation so it's either 0 or true\n\t\tisHydrating,\n\t\trefQueue\n\t);\n\n\t// Flush all queued effects\n\tcommitRoot(commitQueue, parentDom._children, refQueue);\n\n\t// The live children are tracked on _children after diffing.\n\tparentDom._children.props.children = NULL;\n}\n\n/**\n * Update an existing DOM element with data from a Preact virtual node\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to update\n */\nexport function hydrate(vnode, parentDom) {\n\t// Only objects can carry the flag. Primitives (null, strings, numbers,\n\t// booleans) render into the existing DOM the same way hydrating would.\n\tif (vnode && typeof vnode == 'object') {\n\t\t// @ts-expect-error\n\t\tvnode._flags |= MODE_HYDRATE;\n\t}\n\trender(vnode, parentDom);\n}\n", "import { createVNode } from './create-element';\n\n/**\n * Portal component. A unique type is used instead of Fragment so that a\n * portal returned directly from a component isn't collapsed into the\n * component's children array by the Fragment unwrapping in `diff()`.\n * @param {object} props\n */\nfunction Portal(props) {\n\treturn props.children;\n}\n\n/**\n * Create a `Portal` to continue rendering the vnode tree at a different DOM node\n * @param {import('./internal').ComponentChildren} vnode The vnode to render\n * @param {import('./internal').PreactElement} container The DOM node to continue rendering in to\n */\nexport function createPortal(vnode, container) {\n\treturn createVNode(Portal, { _parentDom: container, children: vnode });\n}\n", "import { resetRenderCount } from '../component';\nimport {\n\tCOMPONENT_DIRTY,\n\tCOMPONENT_PENDING_ERROR,\n\tCOMPONENT_PROCESSING_EXCEPTION,\n\tCOMPONENT_FORCE\n} from '../constants';\n\n/**\n * Find the closest error boundary to a thrown error and call it\n * @param {object} error The thrown value\n * @param {import('../internal').VNode} vnode The vnode that threw the error that was caught (except\n * for unmounting when this parameter is the highest parent that was being\n * unmounted)\n * @param {import('../internal').VNode} [oldVNode]\n * @param {import('../internal').ErrorInfo} [errorInfo]\n */\nexport function _catchError(error, vnode, oldVNode, errorInfo) {\n\t/** @type {import('../internal').Component} */\n\tlet component,\n\t\t/** @type {import('../internal').ComponentType} */\n\t\tctor,\n\t\t/** @type {number} */\n\t\thandled;\n\n\tfor (; (vnode = vnode._parent); ) {\n\t\tif (\n\t\t\t(component = vnode._component) &&\n\t\t\t!(component._bits & COMPONENT_PROCESSING_EXCEPTION)\n\t\t) {\n\t\t\tcomponent._bits |= COMPONENT_FORCE;\n\t\t\ttry {\n\t\t\t\tctor = component.constructor;\n\n\t\t\t\t// `handled` is reassigned before any read on every boundary\n\t\t\t\t// candidate, so nothing carries over to the next ancestor.\n\t\t\t\tif ((handled = ctor && ctor.getDerivedStateFromError)) {\n\t\t\t\t\tcomponent.setState(ctor.getDerivedStateFromError(error));\n\t\t\t\t}\n\n\t\t\t\tif (component.componentDidCatch) {\n\t\t\t\t\tcomponent.componentDidCatch(error, errorInfo || {});\n\t\t\t\t\thandled = 1;\n\t\t\t\t}\n\n\t\t\t\t// This is an error boundary. Mark it as having bailed out, and whether it was mid-hydration.\n\t\t\t\tif (handled && component._bits & COMPONENT_DIRTY) {\n\t\t\t\t\tcomponent._bits |= COMPONENT_PENDING_ERROR;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Reset rerender count to 0, so that the next render will not be skipped\n\t// when we leverage prefresh\n\tresetRenderCount();\n\tthrow error;\n}\n", "import { options as _options } from 'preact';\n\nconst ObjectIs = Object.is;\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n\n/** @type {import('./internal').Component} */\nlet previousComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\n/**\n * Passive (useEffect) hook states of unmounted components whose cleanup is\n * still pending. Deferred to the after-paint flush to match React, which runs\n * passive destroys after the commit has painted. Each state's `_passive` holds\n * the surviving component its errors should be routed to.\n * @type {Array<import('./internal').EffectHookState>}\n */\nlet unmountCleanups = [];\n\n// Cast to use internal Options type\nconst options = /** @type {import('./internal').Options} */ (_options);\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\nlet oldRoot = options._root;\n\n// We take the minimum timeout for requestAnimationFrame to ensure that\n// the callback is invoked after the next frame. 35ms is based on a 30hz\n// refresh rate, which is the minimum rate for a smooth user experience.\nconst RAF_TIMEOUT = 35;\nlet prevRaf;\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._root = (vnode, parentDom) => {\n\tif (vnode && parentDom._children && parentDom._children._mask) {\n\t\tvnode._mask = parentDom._children._mask;\n\t}\n\n\tif (oldRoot) oldRoot(vnode, parentDom);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\tif (previousComponent == currentComponent) {\n\t\t\tcurrentComponent._renderCallbacks = [];\n\t\t} else {\n\t\t\thooks._pendingEffects.some(invokeCleanup);\n\t\t\thooks._pendingEffects.some(invokeEffect);\n\t\t\tcurrentIndex = 0;\n\t\t}\n\t\thooks._pendingEffects = [];\n\n\t\t// Runs before every render, forced or not, so `shouldComponentUpdate`\n\t\t// never has to apply these itself.\n\t\thooks._list.some(hookItem => {\n\t\t\tif (hookItem._nextValue) {\n\t\t\t\thookItem._value = hookItem._nextValue;\n\t\t\t}\n\t\t\thookItem._pendingArgs = hookItem._nextValue = undefined;\n\t\t});\n\t}\n\tpreviousComponent = currentComponent;\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tif (c.__hooks._pendingEffects.length) afterPaint(afterPaintEffects.push(c));\n\t\t// `_pendingArgs` is cleared again by `options._render` before anything\n\t\t// can read it, so committing it here is enough.\n\t\tc.__hooks._list.some(hookItem => {\n\t\t\tif (hookItem._pendingArgs) hookItem._args = hookItem._pendingArgs;\n\t\t});\n\t}\n\tpreviousComponent = currentComponent = null;\n};\n\n// TODO: Improve typing of commitQueue parameter\n/** @type {(vnode: import('./internal').VNode, commitQueue: any) => void} */\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.some(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tlet hasErrored, errorParent;\n\t\tc.__hooks._list.some(s => {\n\t\t\ttry {\n\t\t\t\t// Layout cleanups have to run before the new DOM is in place, so\n\t\t\t\t// they stay in the commit phase (see #1886). Passive cleanups run\n\t\t\t\t// after paint, before any new passive effect (see #4299), with\n\t\t\t\t// `_passive` repurposed to hold the error-routing component.\n\t\t\t\tif (s._passive && s._cleanup) {\n\t\t\t\t\tif (errorParent === undefined) {\n\t\t\t\t\t\terrorParent = vnode._parent;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\terrorParent &&\n\t\t\t\t\t\t\t!(errorParent._component && errorParent._component._parentDom)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\terrorParent = errorParent._parent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorParent = errorParent && errorParent._component;\n\t\t\t\t\t}\n\t\t\t\t\ts._passive = errorParent;\n\t\t\t\t\tafterPaint(unmountCleanups.push(s));\n\t\t\t\t} else {\n\t\t\t\t\tinvokeCleanup(s);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tc.__hooks = undefined;\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The type of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\n\treturn hooks._list[index];\n}\n\n/**\n * @template {unknown} S\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} [initialState]\n * @returns {[S, (state: S) => void]}\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @template {unknown} S\n * @template {unknown} A\n * @param {import('./index').Reducer<S, A>} reducer\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ S, (state: S) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst currentValue = hookState._nextValue\n\t\t\t\t\t? hookState._nextValue[0]\n\t\t\t\t\t: hookState._value[0];\n\t\t\t\tconst nextValue = hookState._reducer(currentValue, action);\n\n\t\t\t\tif (!ObjectIs(currentValue, nextValue)) {\n\t\t\t\t\thookState._nextValue = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\n\t\tif (!currentComponent._hasScuFromHooks) {\n\t\t\tcurrentComponent._hasScuFromHooks = true;\n\t\t\tconst prevScu = currentComponent.shouldComponentUpdate;\n\n\t\t\t// This SCU has the purpose of bailing out after repeated updates\n\t\t\t// to stateful hooks. We store the next value in `_nextValue[0]` and\n\t\t\t// keep doing that for all state setters; if we have next states and\n\t\t\t// all next states within a component end up being equal to their\n\t\t\t// original state we are safe to bail out for this specific component.\n\t\t\tcurrentComponent.shouldComponentUpdate = function (p, s, c) {\n\t\t\t\tconst hooks = this.__hooks;\n\t\t\t\tif (!hooks) return true;\n\n\t\t\t\t// We check whether we have components with a nextValue set that\n\t\t\t\t// have values that aren't equal to one another this pushes\n\t\t\t\t// us to update further down the tree\n\t\t\t\tlet updatedHook = false;\n\t\t\t\tlet shouldUpdate = this.props != p;\n\t\t\t\thooks._list.some(hookItem => {\n\t\t\t\t\tif (hookItem._nextValue) {\n\t\t\t\t\t\tupdatedHook = true;\n\t\t\t\t\t\tif (!ObjectIs(hookItem._value[0], hookItem._nextValue[0])) {\n\t\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (prevScu) {\n\t\t\t\t\tconst result = prevScu.call(this, p, s, c);\n\t\t\t\t\treturn updatedHook ? result || shouldUpdate : result;\n\t\t\t\t}\n\n\t\t\t\treturn !updatedHook || shouldUpdate;\n\t\t\t};\n\t\t}\n\t}\n\n\treturn hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._passive = true;\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._passive = false;\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\n/** @type {(initialValue: unknown) => unknown} */\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') {\n\t\t\t\tconst result = ref(createHandle());\n\t\t\t\treturn () => {\n\t\t\t\t\tref(null);\n\t\t\t\t\tif (result && typeof result == 'function') result();\n\t\t\t\t};\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => (ref.current = null);\n\t\t\t}\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @template {unknown} T\n * @param {() => T} factory\n * @param {unknown[]} args\n * @returns {T}\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState<T>} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {unknown[]} args\n * @returns {() => void}\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(\n\t\t\tformatter ? formatter(value) : /** @type {any}*/ (value)\n\t\t);\n\t}\n}\n\n/**\n * @param {(error: unknown, errorInfo: import('preact').ErrorInfo) => void} cb\n * @returns {[unknown, () => void]}\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = (err, errorInfo) => {\n\t\t\tif (state._value) state._value(err, errorInfo);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/** @type {() => string} */\nexport function useId() {\n\t/** @type {import('./internal').IdHookState} */\n\tconst state = getHookState(currentIndex++, 11);\n\tif (!state._value) {\n\t\t// Grab either the root node or the nearest async boundary node.\n\t\t/** @type {import('./internal').VNode} */\n\t\tlet root = currentComponent._vnode;\n\t\twhile (!root._mask && root._parent) {\n\t\t\troot = root._parent;\n\t\t}\n\n\t\tlet mask = root._mask || (root._mask = [0, 0]);\n\t\tstate._value = 'P' + mask[0] + '-' + mask[1]++;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tlet component;\n\t// The loop picks up components unmounted by an effect we just invoked, which\n\t// don't necessarily schedule a flush of their own.\n\tdo {\n\t\t// Unmounted components' passive cleanups run before any new passive\n\t\t// effect, mirroring React running all destroys before any create.\n\t\twhile ((component = unmountCleanups.shift())) {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(component);\n\t\t\t} catch (e) {\n\t\t\t\tcomponent = /** @type {any} */ (component._passive);\n\t\t\t\toptions._catchError(e, { _parent: component && component._vnode });\n\t\t\t}\n\t\t}\n\n\t\twhile ((component = afterPaintEffects.shift())) {\n\t\t\tconst hooks = component.__hooks;\n\t\t\tif (!component._parentDom || !hooks) continue;\n\t\t\ttry {\n\t\t\t\thooks._pendingEffects.some(invokeCleanup);\n\t\t\t\thooks._pendingEffects.some(invokeEffect);\n\t\t\t\thooks._pendingEffects = [];\n\t\t\t} catch (e) {\n\t\t\t\thooks._pendingEffects = [];\n\t\t\t\toptions._catchError(e, component._vnode);\n\t\t\t}\n\t\t}\n\t} while (unmountCleanups.length);\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n * @returns {void}\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength == 1 || prevRaf != options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').HookState} hook\n * @returns {void}\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\n\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n * @returns {void}\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {unknown[]} oldArgs\n * @param {unknown[]} newArgs\n * @returns {boolean}\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length != newArgs.length ||\n\t\tnewArgs.some((arg, index) => !ObjectIs(arg, oldArgs[index]))\n\t);\n}\n\n/**\n * @template Arg\n * @param {Arg} arg\n * @param {(arg: Arg) => any} f\n * @returns {any}\n */\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n", "// DT.ly document model \u2014 an After Effects-style project as plain JSON.\n// Units follow AE: time in seconds, scale and opacity in percent, rotation in degrees.\n\nexport type Vec2 = [number, number];\nexport type Color = string; // any CSS color: '#E8692A', 'rgba(0,0,0,.5)'\n\nexport type EaseName =\n | 'linear' | 'hold'\n | 'easeIn' | 'easeOut' | 'easyEase'\n | 'quadOut' | 'cubicOut' | 'expoIn' | 'expoOut' | 'expoInOut' | 'backOut' | 'backIn' | 'elasticOut' | 'bounceOut';\n// A named curve, a cubic-bezier [x1, y1, x2, y2], or a damped spring.\nexport type Ease = EaseName | [number, number, number, number] | {spring: {stiffness?: number; damping?: number; mass?: number}};\n\n// `ease` shapes the segment that LEAVES this keyframe (towards the next one).\nexport interface Keyframe<T> { t: number; v: T; ease?: Ease }\nexport interface Wiggle { freq: number; amp: number; seed?: number }\nexport interface Animated<T> { keyframes: Keyframe<T>[]; wiggle?: Wiggle }\nexport type Prop<T> = T | Animated<T>;\n\nexport interface Transform {\n anchor?: Prop<Vec2>;\n position?: Prop<Vec2>;\n scale?: Prop<Vec2>; // percent\n rotation?: Prop<number>; // degrees\n opacity?: Prop<number>; // percent\n skew?: Prop<number>; // degrees, along X\n}\n\nexport type Effect =\n | {type: 'blur'; radius: Prop<number>}\n | {type: 'dropShadow'; color?: Color; blur?: Prop<number>; distance?: Prop<number>; angle?: number; opacity?: Prop<number>}\n | {type: 'glow'; color?: Color; radius?: Prop<number>; strength?: Prop<number>}\n | {type: 'fill'; color: Color; opacity?: Prop<number>}\n | {type: 'brightness'; amount: Prop<number>} // percent, 100 = unchanged\n | {type: 'saturate'; amount: Prop<number>}\n | {type: 'contrast'; amount: Prop<number>};\n\nexport interface Mask {\n shape: 'rect' | 'ellipse' | 'path';\n // rect/ellipse: [x, y, w, h] in layer space; path: list of points\n rect?: Prop<[number, number, number, number]>;\n points?: Vec2[];\n radius?: number;\n inverted?: boolean;\n}\n\nexport interface Matte { layer: string; mode: 'alpha' | 'alphaInverted' }\n\nexport type BlendMode = 'normal' | 'multiply' | 'screen' | 'overlay' | 'add' | 'darken' | 'lighten' | 'softLight' | 'difference';\n\n// Text animators: AE-style per-unit animation with a stagger, so every grapheme/word/line\n// starts `stagger` seconds after the previous one, moving FROM the given offsets to rest.\nexport interface TextAnimator {\n unit: 'grapheme' | 'word' | 'line';\n mode?: 'in' | 'out'; // 'out' animates from rest TO the offsets, ending at `delay + ...`\n delay?: number; // seconds from layer inPoint (for 'out': seconds before layer outPoint)\n stagger?: number;\n duration?: number;\n order?: 'forward' | 'reverse' | 'center' | 'edges' | 'random';\n ease?: Ease;\n seed?: number;\n clip?: boolean; // reveal each line through its own box (classic masked line reveal)\n from: {opacity?: number; x?: number; y?: number; scale?: number; rotation?: number; blur?: number; tracking?: number; color?: Color};\n}\n\ninterface LayerBase {\n id: string;\n name?: string;\n inPoint?: number; // seconds, default 0\n outPoint?: number; // seconds, default comp duration\n parent?: string; // layer id \u2014 inherits transform (not opacity), like AE parenting\n transform?: Transform;\n blendMode?: BlendMode;\n effects?: Effect[];\n masks?: Mask[];\n matte?: Matte; // track matte: this layer is shown through another layer\n hidden?: boolean; // e.g. layers used only as mattes\n motionBlur?: {samples?: number; shutter?: number}; // shutter in degrees, AE default 180\n}\n\nexport interface SolidLayer extends LayerBase { type: 'solid'; color: Prop<Color>; size?: Vec2 }\nexport interface NullLayer extends LayerBase { type: 'null' }\nexport interface ShapeLayer extends LayerBase {\n type: 'shape';\n shape: 'rect' | 'ellipse' | 'polygon' | 'path' | 'line';\n size?: Prop<Vec2>; // rect/ellipse\n radius?: Prop<number>; // rect corner radius / polygon radius\n sides?: number; // polygon\n points?: Vec2[]; // path/line\n closed?: boolean;\n fill?: Prop<Color> | {linear: {from: Vec2; to: Vec2; stops: [number, Color][]}};\n stroke?: Prop<Color>;\n strokeWidth?: Prop<number>;\n lineCap?: 'butt' | 'round' | 'square';\n trim?: {start?: Prop<number>; end?: Prop<number>}; // percent of path length, for draw-on lines\n}\nexport interface TextLayer extends LayerBase {\n type: 'text';\n text: string;\n font?: string; // family registered in project.fonts\n weight?: number;\n size?: Prop<number>;\n color?: Prop<Color>;\n align?: 'left' | 'center' | 'right';\n lineHeight?: number; // multiple of size\n tracking?: Prop<number>; // extra px between graphemes\n maxWidth?: number; // wrap width in px\n stroke?: {color: Color; width: number};\n shadow?: {color: Color; blur: number; x?: number; y?: number};\n box?: {color: Prop<Color>; padding?: [number, number]; radius?: number; reveal?: Prop<number>}; // background plate; reveal 0-100 wipes it in\n animators?: TextAnimator[];\n}\nexport interface ImageLayer extends LayerBase { type: 'image'; src: string; size?: Vec2; fit?: 'cover' | 'contain' | 'fill' }\nexport interface VideoLayer extends LayerBase {\n type: 'video';\n src: string;\n size?: Vec2;\n fit?: 'cover' | 'contain' | 'fill';\n trimIn?: number; // seconds into the source\n speed?: number; // 0.5 = half speed\n volume?: Prop<number>; // 0-1, default 0 (muted)\n}\nexport interface AudioLayer extends LayerBase {\n type: 'audio';\n src: string;\n trimIn?: number;\n volume?: Prop<number>; // 0-1\n fadeIn?: number;\n fadeOut?: number;\n}\nexport interface PrecompLayer extends LayerBase { type: 'precomp'; comp: string; timeOffset?: number; speed?: number }\n\nexport type Layer = SolidLayer | NullLayer | ShapeLayer | TextLayer | ImageLayer | VideoLayer | AudioLayer | PrecompLayer;\nexport type LayerType = Layer['type'];\n// A layer before it has an id (Omit distributed over the union).\nexport type NewLayer = Layer extends infer L ? (L extends Layer ? Omit<L, 'id'> & {id?: string} : never) : never;\n\nexport interface Composition {\n id: string;\n name?: string;\n width: number;\n height: number;\n fps: number;\n duration: number;\n background?: Color;\n layers: Layer[]; // index 0 is the TOP layer, as in After Effects\n markers?: {t: number; label: string}[];\n}\n\nexport interface Project {\n dtly: 1;\n name: string;\n root: string; // id of the comp that gets rendered\n fonts?: Record<string, string[]>; // family -> font file paths (relative to the project file)\n comps: Composition[];\n}\n\nexport const isAnimated = <T>(p: Prop<T> | undefined): p is Animated<T> =>\n typeof p === 'object' && p !== null && !Array.isArray(p) && 'keyframes' in p;\n", "// Document operations: the fine-grained edits agents (via MCP) and tools make to a project.\n// Every op is a pure-ish mutation of a Project object; IO lives in ./store.ts.\nimport {isAnimated, type Composition, type Ease, type Keyframe, type Layer, type NewLayer, type Project} from '../core/model.js';\n\nexport class OpError extends Error {}\n\nexport const newProject = (o: {name: string; width?: number; height?: number; fps?: number; duration?: number; background?: string}): Project => ({\n dtly: 1,\n name: o.name,\n root: 'main',\n comps: [{id: 'main', name: 'Main', width: o.width ?? 1080, height: o.height ?? 1920, fps: o.fps ?? 30, duration: o.duration ?? 10, background: o.background ?? '#000000', layers: []}],\n});\n\nexport const getComp = (p: Project, id?: string): Composition => {\n const c = p.comps.find((c) => c.id === (id ?? p.root));\n if (!c) throw new OpError(`No composition \"${id}\". Comps: ${p.comps.map((c) => c.id).join(', ')}`);\n return c;\n};\n\nexport const findLayer = (p: Project, layerId: string): {comp: Composition; layer: Layer; index: number} => {\n for (const comp of p.comps) {\n const index = comp.layers.findIndex((l) => l.id === layerId);\n if (index >= 0) return {comp, layer: comp.layers[index], index};\n }\n throw new OpError(`No layer \"${layerId}\"`);\n};\n\nconst allIds = (p: Project) => new Set(p.comps.flatMap((c) => c.layers.map((l) => l.id)));\nexport const uniqueId = (p: Project, base: string) => {\n const ids = allIds(p);\n const clean = base.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-|-$/g, '') || 'layer';\n if (!ids.has(clean)) return clean;\n let i = 2;\n while (ids.has(`${clean}-${i}`)) i++;\n return `${clean}-${i}`;\n};\n\nexport const addComp = (p: Project, c: Partial<Composition> & {id: string}) => {\n if (p.comps.some((x) => x.id === c.id)) throw new OpError(`Composition \"${c.id}\" already exists`);\n const root = getComp(p);\n const comp: Composition = {width: root.width, height: root.height, fps: root.fps, duration: root.duration, layers: [], ...c};\n p.comps.push(comp);\n return comp;\n};\n\nexport const updateComp = (p: Project, id: string, patch: Partial<Omit<Composition, 'id' | 'layers'>>) => {\n Object.assign(getComp(p, id), patch);\n};\n\n// Adds a layer. index 0 = top of the stack (After Effects order).\nexport const addLayer = (p: Project, compId: string | undefined, layer: NewLayer, index = 0): Layer => {\n const comp = getComp(p, compId);\n const id = layer.id ? (allIds(p).has(layer.id) ? (() => { throw new OpError(`Layer id \"${layer.id}\" already used`); })() : layer.id) : uniqueId(p, (layer as Layer).name ?? layer.type);\n const full = {...layer, id} as Layer;\n comp.layers.splice(Math.max(0, Math.min(index, comp.layers.length)), 0, full);\n return full;\n};\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n\n// Deep merge; `null` deletes a key. Arrays and keyframe objects are replaced wholesale.\nexport const deepMerge = (target: Record<string, unknown>, patch: Record<string, unknown>) => {\n for (const [k, v] of Object.entries(patch)) {\n if (v === null) delete target[k];\n else if (isPlainObject(v) && isPlainObject(target[k]) && !('keyframes' in v)) deepMerge(target[k] as Record<string, unknown>, v);\n else target[k] = v;\n }\n return target;\n};\n\nexport const updateLayer = (p: Project, layerId: string, patch: Record<string, unknown>) => {\n if ('id' in patch) throw new OpError('Cannot change a layer id; duplicate it instead');\n const {layer} = findLayer(p, layerId);\n deepMerge(layer as unknown as Record<string, unknown>, patch);\n return layer;\n};\n\nexport const removeLayer = (p: Project, layerId: string) => {\n const {comp, index} = findLayer(p, layerId);\n comp.layers.splice(index, 1);\n for (const c of p.comps) for (const l of c.layers) {\n if (l.parent === layerId) delete l.parent;\n if (l.matte?.layer === layerId) delete l.matte;\n }\n};\n\nexport const moveLayer = (p: Project, layerId: string, toIndex: number) => {\n const {comp, index, layer} = findLayer(p, layerId);\n comp.layers.splice(index, 1);\n comp.layers.splice(Math.max(0, Math.min(toIndex, comp.layers.length)), 0, layer);\n};\n\n// Visits every keyframe list inside a value (for shifting/scaling time).\nconst eachKeyframes = (v: unknown, fn: (kfs: Keyframe<unknown>[]) => void) => {\n if (Array.isArray(v)) v.forEach((x) => eachKeyframes(x, fn));\n else if (isPlainObject(v)) {\n if (Array.isArray(v.keyframes)) fn(v.keyframes as Keyframe<unknown>[]);\n Object.values(v).forEach((x) => eachKeyframes(x, fn));\n }\n};\n\n// Slides a layer in time: in/out points and all its keyframes (like dragging the bar in AE).\nexport const shiftLayer = (p: Project, layerId: string, delta: number) => {\n const {layer} = findLayer(p, layerId);\n if (layer.inPoint !== undefined || delta) layer.inPoint = (layer.inPoint ?? 0) + delta;\n if (layer.outPoint !== undefined) layer.outPoint += delta;\n eachKeyframes(layer, (kfs) => kfs.forEach((k) => (k.t = +(k.t + delta).toFixed(4))));\n};\n\nexport const duplicateLayer = (p: Project, layerId: string, opts: {newId?: string; timeShift?: number} = {}) => {\n const {comp, index, layer} = findLayer(p, layerId);\n const copy = structuredClone(layer);\n copy.id = opts.newId ?? uniqueId(p, layer.id);\n comp.layers.splice(index, 0, copy);\n if (opts.timeShift) shiftLayer(p, copy.id, opts.timeShift);\n return copy;\n};\n\n// Property paths: \"transform.position\", \"trim.end\", \"box.reveal\", \"effects.0.radius\", \"size\".\nconst splitPath = (path: string) => path.split('.').map((s) => (/^\\d+$/.test(s) ? Number(s) : s));\nconst getAt = (obj: unknown, path: string) => splitPath(path).reduce<unknown>((o, k) => (o == null ? undefined : (o as Record<string | number, unknown>)[k]), obj);\nconst setAt = (obj: Record<string, unknown>, path: string, value: unknown) => {\n const keys = splitPath(path);\n let o: Record<string | number, unknown> = obj;\n keys.slice(0, -1).forEach((k, i) => {\n if (o[k] == null) o[k] = typeof keys[i + 1] === 'number' ? [] : {};\n o = o[k] as Record<string | number, unknown>;\n });\n o[keys[keys.length - 1]] = value;\n};\n\nconst TIME_EPS = 1e-3;\n\nexport const setProperty = (p: Project, layerId: string, path: string, value: unknown) => {\n const {layer} = findLayer(p, layerId);\n setAt(layer as unknown as Record<string, unknown>, path, value);\n};\n\n// Adds or replaces the keyframe at time t. A static property becomes animated\n// (its current value is kept as a keyframe at the layer's inPoint, like AE's stopwatch).\nexport const setKeyframe = (p: Project, layerId: string, path: string, t: number, v: unknown, ease?: Ease) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path);\n let kfs: Keyframe<unknown>[];\n if (isAnimated(cur as never)) kfs = (cur as {keyframes: Keyframe<unknown>[]}).keyframes;\n else {\n kfs = [];\n const anchorT = layer.inPoint ?? 0;\n if (cur !== undefined && Math.abs(anchorT - t) > TIME_EPS) kfs.push({t: anchorT, v: cur});\n setAt(layer as unknown as Record<string, unknown>, path, {keyframes: kfs});\n }\n const existing = kfs.find((k) => Math.abs(k.t - t) < TIME_EPS);\n if (existing) {\n existing.v = v;\n if (ease !== undefined) existing.ease = ease;\n } else kfs.push(ease !== undefined ? {t, v, ease} : {t, v});\n kfs.sort((a, b) => a.t - b.t);\n return kfs;\n};\n\nexport const removeKeyframe = (p: Project, layerId: string, path: string, t: number) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path) as {keyframes: Keyframe<unknown>[]} | undefined;\n if (!cur || !isAnimated(cur as never)) throw new OpError(`${layerId}.${path} is not animated`);\n const i = cur.keyframes.findIndex((k) => Math.abs(k.t - t) < TIME_EPS);\n if (i < 0) throw new OpError(`No keyframe at ${t}s on ${layerId}.${path}`);\n cur.keyframes.splice(i, 1);\n // One keyframe left = a static value again (AE behaviour when you delete down to one).\n if (cur.keyframes.length === 1 && !(cur as {wiggle?: unknown}).wiggle) setAt(layer as unknown as Record<string, unknown>, path, cur.keyframes[0].v);\n};\n\n// Retimes one keyframe, keeping its value and ease (dragging a key in the timeline).\nexport const moveKeyframe = (p: Project, layerId: string, path: string, from: number, to: number) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path) as {keyframes: Keyframe<unknown>[]} | undefined;\n const k = cur?.keyframes?.find((k) => Math.abs(k.t - from) < TIME_EPS);\n if (!cur || !k) throw new OpError(`No keyframe at ${from}s on ${layerId}.${path}`);\n const target = Math.round(to * 1000) / 1000;\n if (cur.keyframes.some((x) => x !== k && Math.abs(x.t - target) < TIME_EPS)) throw new OpError(`There is already a keyframe at ${target}s`);\n k.t = target;\n cur.keyframes.sort((a, b) => a.t - b.t);\n};\n\nexport const setEase = (p: Project, layerId: string, path: string, t: number, ease: Ease) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path) as {keyframes: Keyframe<unknown>[]} | undefined;\n const k = cur?.keyframes?.find((k) => Math.abs(k.t - t) < TIME_EPS);\n if (!k) throw new OpError(`No keyframe at ${t}s on ${layerId}.${path}`);\n k.ease = ease;\n};\n\n// Static checks an agent should run before rendering.\nexport const validate = (p: Project): string[] => {\n const warnings: string[] = [];\n const ids = new Set<string>();\n for (const c of p.comps) {\n for (const l of c.layers) {\n if (ids.has(l.id)) warnings.push(`Duplicate layer id \"${l.id}\"`);\n ids.add(l.id);\n const inP = l.inPoint ?? 0, outP = l.outPoint ?? c.duration;\n if (outP <= inP) warnings.push(`${c.id}/${l.id}: outPoint (${outP}) is not after inPoint (${inP})`);\n if (inP >= c.duration) warnings.push(`${c.id}/${l.id}: starts after the comp ends (${c.duration}s)`);\n if (l.parent && !c.layers.some((x) => x.id === l.parent)) warnings.push(`${c.id}/${l.id}: parent \"${l.parent}\" not in the same comp`);\n if (l.matte && !c.layers.some((x) => x.id === l.matte!.layer)) warnings.push(`${c.id}/${l.id}: matte \"${l.matte.layer}\" not in the same comp`);\n if (l.type === 'precomp' && !p.comps.some((x) => x.id === l.comp)) warnings.push(`${c.id}/${l.id}: unknown comp \"${l.comp}\"`);\n eachKeyframes(l, (kfs) => {\n if (kfs.length === 0) warnings.push(`${c.id}/${l.id}: empty keyframe list`);\n kfs.forEach((k) => { if (k.t < 0 || k.t > c.duration + 1) warnings.push(`${c.id}/${l.id}: keyframe at ${k.t}s is outside the comp`); });\n });\n }\n }\n if (!p.comps.some((c) => c.id === p.root)) warnings.push(`Root comp \"${p.root}\" does not exist`);\n return warnings;\n};\n\n// Compact, agent-readable outline of the project.\nexport const describe = (p: Project): string => {\n const lines = [`Project \"${p.name}\" \u2014 root: ${p.root}`];\n for (const c of p.comps) {\n lines.push(`\\nComp ${c.id}${c.name ? ` (${c.name})` : ''}: ${c.width}x${c.height} @${c.fps}fps, ${c.duration}s, bg ${c.background ?? 'transparent'}`);\n if (c.markers?.length) lines.push(` markers: ${c.markers.map((m) => `${m.t}s ${m.label}`).join(', ')}`);\n c.layers.forEach((l, i) => {\n const animated: string[] = [];\n const walk = (v: unknown, path: string) => {\n if (isPlainObject(v)) {\n if (Array.isArray(v.keyframes)) animated.push(`${path}@[${(v.keyframes as Keyframe<unknown>[]).map((k) => k.t).join(',')}]`);\n else Object.entries(v).forEach(([k, x]) => walk(x, path ? `${path}.${k}` : k));\n } else if (Array.isArray(v)) v.forEach((x, j) => isPlainObject(x) && walk(x, `${path}.${j}`));\n };\n walk(l, '');\n const extra =\n l.type === 'text' ? ` \"${l.text.replace(/\\n/g, ' / ').slice(0, 60)}\"${l.animators?.length ? ` animators:${l.animators.map((a) => a.unit).join('+')}` : ''}`\n : l.type === 'video' || l.type === 'image' || l.type === 'audio' ? ` ${l.src}`\n : l.type === 'precomp' ? ` \u2192 ${l.comp}`\n : l.type === 'shape' ? ` ${l.shape}` : '';\n lines.push(` [${i}] ${l.id} (${l.type})${extra} ${l.inPoint ?? 0}\u2013${l.outPoint ?? c.duration}s${l.parent ? ` parent:${l.parent}` : ''}${l.matte ? ` matte:${l.matte.layer}` : ''}${l.hidden ? ' hidden' : ''}${animated.length ? `\\n animated: ${animated.join(' ')}` : ''}`);\n });\n }\n return lines.join('\\n');\n};\n", "import type {TextAnimator} from '../core/model.js';\n\n// Text animator presets \u2014 the \"Animation Presets > Text\" folder of DT.ly.\nexport const TEXT_ANIMATORS: Record<string, {description: string; animators: TextAnimator[]}> = {\n typewriter: {description: 'Letters appear one by one with no motion.', animators: [{unit: 'grapheme', stagger: 0.05, duration: 0.01, ease: 'hold', from: {opacity: 0}}]},\n fadeUp: {description: 'Words fade in while rising slightly. Calm, readable default.', animators: [{unit: 'word', stagger: 0.08, duration: 0.6, ease: 'cubicOut', from: {opacity: 0, y: 40}}]},\n popIn: {description: 'Words scale up from zero with an overshoot. Playful, energetic.', animators: [{unit: 'word', stagger: 0.1, duration: 0.55, ease: 'backOut', from: {opacity: 0, scale: 0}}]},\n slam: {description: 'Words crash in from huge and blurred. Punchy kinetic typography.', animators: [{unit: 'word', stagger: 0.18, duration: 0.35, ease: 'expoOut', from: {opacity: 0, scale: 320, blur: 14}}]},\n blurIn: {description: 'Letters sharpen from a blur. Elegant, premium.', animators: [{unit: 'grapheme', stagger: 0.03, duration: 0.7, ease: 'cubicOut', from: {opacity: 0, blur: 18, x: -20}}]},\n maskedLines: {description: 'Each line slides up from behind its own mask. The classic title reveal.', animators: [{unit: 'line', stagger: 0.12, duration: 0.8, ease: 'expoOut', clip: true, from: {y: 120}}]},\n cascade: {description: 'Letters drop and rotate into place with an overshoot.', animators: [{unit: 'grapheme', stagger: 0.035, duration: 0.7, ease: 'backOut', from: {opacity: 0, y: -70, rotation: -25}}]},\n trackingIn: {description: 'Letter spacing collapses from wide to normal while fading in. Cinematic openers.', animators: [{unit: 'grapheme', stagger: 0, duration: 1.4, ease: 'expoOut', from: {opacity: 0, tracking: 60}}]},\n centerOut: {description: 'Letters grow outward from the middle of the word.', animators: [{unit: 'grapheme', order: 'center', stagger: 0.04, duration: 0.5, ease: 'backOut', from: {opacity: 0, scale: 0}}]},\n randomFlicker: {description: 'Letters switch on in random order.', animators: [{unit: 'grapheme', order: 'random', stagger: 0.03, duration: 0.08, ease: 'hold', from: {opacity: 0}}]},\n colorSweep: {description: 'A highlight colour sweeps through the letters, settling to the text colour.', animators: [{unit: 'grapheme', stagger: 0.04, duration: 0.5, ease: 'easeOut', from: {color: '#FFC93C', scale: 115}}]},\n // Exits (mode: out) end at the layer's outPoint.\n fadeOutDown: {description: 'Exit: words fade out while dropping.', animators: [{unit: 'word', mode: 'out', stagger: 0.05, duration: 0.4, ease: 'easeIn', from: {opacity: 0, y: 40}}]},\n blurOut: {description: 'Exit: letters blur away.', animators: [{unit: 'grapheme', mode: 'out', stagger: 0.02, duration: 0.45, ease: 'easeIn', from: {opacity: 0, blur: 16}}]},\n maskedLinesOut: {description: 'Exit: lines slide up out of their masks.', animators: [{unit: 'line', mode: 'out', stagger: 0.08, duration: 0.5, ease: 'expoInOut', clip: true, from: {y: -120}}]},\n};\n", "// Preset catalogue: text animators, kinetic typography, openers, slides and transitions.\n// Each preset edits a project through the same ops an agent uses, and returns what it created.\nimport type {Ease, NewLayer, Project, Vec2} from '../core/model.js';\nimport {addLayer, findLayer, getComp, OpError, setKeyframe, updateLayer} from '../ops/ops.js';\nimport {TEXT_ANIMATORS} from './text.js';\n\ntype Params = Record<string, unknown>;\nexport interface Preset {\n kind: 'text' | 'kinetic' | 'opener' | 'slides' | 'transition' | 'element';\n description: string;\n params: string; // human-readable parameter reference\n apply: (p: Project, comp: string | undefined, params: Params) => {created: string[]; note?: string};\n}\n\nconst num = (v: unknown, d: number) => (typeof v === 'number' ? v : d);\nconst str = (v: unknown, d: string) => (typeof v === 'string' ? v : d);\nconst r3 = (t: number) => Math.round(t * 1000) / 1000;\nconst kf = <T>(...k: [number, T, Ease?][]) => ({keyframes: k.map(([t, v, ease]) => (ease ? {t: r3(t), v, ease} : {t: r3(t), v}))});\n\nexport const PRESETS: Record<string, Preset> = {};\n\nfor (const [name, def] of Object.entries(TEXT_ANIMATORS)) {\n PRESETS[`text.${name}`] = {\n kind: 'text',\n description: def.description,\n params: '{layer: textLayerId, delay?: s, stagger?: s, duration?: s, replace?: boolean}',\n apply: (p, _comp, o) => {\n const {layer} = findLayer(p, str(o.layer, ''));\n if (layer.type !== 'text') throw new OpError(`${layer.id} is not a text layer`);\n const anims = def.animators.map((a) => ({...a, ...(o.delay !== undefined && {delay: num(o.delay, 0)}), ...(o.stagger !== undefined && {stagger: num(o.stagger, 0)}), ...(o.duration !== undefined && {duration: num(o.duration, 0.5)})}));\n layer.animators = o.replace === false ? [...(layer.animators ?? []), ...anims] : [...(layer.animators ?? []).filter((a) => (a.mode === 'out') !== (anims[0].mode === 'out')), ...anims];\n return {created: [], note: `Applied ${name} to ${layer.id}`};\n },\n };\n}\n\nPRESETS['kinetic.sequence'] = {\n kind: 'kinetic',\n description: 'Classic kinetic typography: phrases appear one after another in the same spot, each with its own entrance, emphasis words bigger and coloured.',\n params: '{phrases: string[], start?: s, each?: s (default by length), position?: [x,y], size?: px, color?, accent?: color, emphasis?: string[] (words to highlight), style?: \"slam\"|\"popIn\"|\"fadeUp\"|\"blurIn\"|\"cascade\", font?, maxWidth?, holdLast?: boolean (default true: last phrase stays to the end of the comp)}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const phrases = (o.phrases as string[]) ?? [];\n const pos = (o.position as Vec2) ?? [comp.width / 2, comp.height / 2];\n const size = num(o.size, Math.round(comp.width / 9));\n const style = str(o.style, 'slam');\n const emphasis = new Set(((o.emphasis as string[]) ?? []).map((w) => w.toLowerCase()));\n let t = num(o.start, 0);\n const created: string[] = [];\n const holdLast = o.holdLast !== false;\n phrases.forEach((text, i) => {\n const words = text.split(/\\s+/).length;\n const each = num(o.each, Math.max(0.7, 0.35 + words * 0.32));\n const last = holdLast && i === phrases.length - 1;\n const outPoint = last ? Math.max(comp.duration, t + each) : t + each;\n const isEmph = text.split(/\\s+/).some((w) => emphasis.has(w.toLowerCase()));\n const layer = addLayer(p, comp.id, {\n type: 'text', name: `kinetic-${i + 1}`, text, inPoint: r3(t), outPoint: r3(outPoint),\n size: isEmph ? Math.round(size * 1.35) : size, weight: 800, font: o.font as string | undefined,\n color: isEmph ? str(o.accent, '#FFC93C') : str(o.color, '#ffffff'), maxWidth: num(o.maxWidth, comp.width * 0.86),\n transform: {position: pos, scale: kf<Vec2>([t, [100, 100]], [outPoint, [100 + 8 * ((outPoint - t) / each), 100 + 8 * ((outPoint - t) / each)]])},\n animators: [...TEXT_ANIMATORS[style in TEXT_ANIMATORS ? style : 'slam'].animators, ...(last ? [] : [{unit: 'word' as const, mode: 'out' as const, stagger: 0.03, duration: 0.18, ease: 'easeIn' as const, from: {opacity: 0, scale: 80}}])],\n } as NewLayer);\n created.push(layer.id);\n t = r3(t + each);\n });\n return {created, note: `Sequence ends at ${t.toFixed(2)}s`};\n },\n};\n\nPRESETS['opener.logoReveal'] = {\n kind: 'opener',\n description: 'Brand opener: a ring draws on and bursts, the title tracks in, an accent line draws, and a tagline reveals from a mask.',\n params: '{title: string, tagline?: string, start?: s, color?: brand colour, accent?: colour, textColor?, position?: [x,y], size?: px, font?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = num(o.start, 0);\n const [cx, cy] = (o.position as Vec2) ?? [comp.width / 2, comp.height / 2];\n const color = str(o.color, '#E8692A'), accent = str(o.accent, '#FFC93C');\n const size = num(o.size, Math.round(comp.width / 7.5));\n const r = Math.min(comp.width, comp.height) * 0.42;\n const created: string[] = [];\n const add = (l: NewLayer) => created.push(addLayer(p, comp.id, l).id);\n add({type: 'shape', name: 'reveal-ring', shape: 'ellipse', size: [r, r], stroke: color, strokeWidth: 10, inPoint: t0, outPoint: t0 + 1.6, motionBlur: {samples: 8},\n transform: {position: [cx, cy], rotation: kf([t0, -120, 'expoOut'], [t0 + 1, 0]), scale: kf<Vec2>([t0 + 0.7, [100, 100], 'expoOut'], [t0 + 1.4, [260, 260]]), opacity: kf([t0 + 0.9, 100], [t0 + 1.4, 0])},\n trim: {end: kf([t0, 0, 'expoOut'], [t0 + 0.8, 100])}} as NewLayer);\n add({type: 'shape', name: 'reveal-burst', shape: 'ellipse', size: [r * 0.9, r * 0.9], fill: color, inPoint: t0 + 0.7, outPoint: t0 + 1.5,\n transform: {position: [cx, cy], scale: kf<Vec2>([t0 + 0.7, [0, 0], 'expoOut'], [t0 + 1.2, [220, 220]]), opacity: kf([t0 + 0.9, 90], [t0 + 1.5, 0])}} as NewLayer);\n add({type: 'text', name: 'opener-title', text: str(o.title, 'TITLE'), size, weight: 800, color: str(o.textColor, '#ffffff'), font: o.font as string | undefined, inPoint: t0 + 0.8,\n maxWidth: comp.width * 0.88, transform: {position: [cx, cy]},\n animators: [{unit: 'grapheme', stagger: 0.025, duration: 1.1, ease: 'expoOut', from: {opacity: 0, tracking: 40, blur: 10}}],\n effects: [{type: 'dropShadow', blur: 30, distance: 0, opacity: 50}]} as NewLayer);\n add({type: 'shape', name: 'opener-line', shape: 'line', points: [[-comp.width * 0.3, 0], [comp.width * 0.3, 0]], stroke: accent, strokeWidth: 8, inPoint: t0 + 1.2,\n transform: {position: [cx, cy + size * 0.85]}, trim: {start: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 0]), end: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 100])}} as NewLayer);\n if (o.tagline) add({type: 'text', name: 'opener-tagline', text: str(o.tagline, ''), size: Math.round(size * 0.42), weight: 600, color: accent, font: o.font as string | undefined, inPoint: t0 + 1.5,\n transform: {position: [cx, cy + size * 1.4]}, animators: [{unit: 'line', clip: true, stagger: 0.1, duration: 0.8, ease: 'expoOut', from: {y: size * 0.6}}]} as NewLayer);\n return {created, note: `Opener settles at ${(t0 + 2.3).toFixed(1)}s`};\n },\n};\n\nPRESETS['opener.bars'] = {\n kind: 'opener',\n description: 'Coloured bars sweep across the frame in a stagger, uncovering a title that slams in.',\n params: '{title: string, start?: s, colors?: string[], textColor?, size?: px, font?, direction?: \"left\"|\"right\"}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = num(o.start, 0);\n const colors = (o.colors as string[]) ?? ['#E8692A', '#FFC93C', '#F6EEDF', '#1A1512'];\n const dir = o.direction === 'right' ? -1 : 1;\n const barH = comp.height / colors.length;\n const created: string[] = [];\n colors.forEach((c, i) => {\n const ts = t0 + i * 0.08;\n created.push(addLayer(p, comp.id, {type: 'solid', name: `bar-${i + 1}`, color: c, size: [comp.width, barH + 2], inPoint: t0, outPoint: t0 + 1.6,\n transform: {anchor: [0, 0], position: kf<Vec2>([ts, [-comp.width * dir, i * barH], 'expoInOut'], [ts + 0.6, [0, i * barH], 'expoInOut'], [ts + 0.85, [0, i * barH], 'expoInOut'], [ts + 1.4, [comp.width * dir, i * barH]])}} as NewLayer).id);\n });\n created.unshift(addLayer(p, comp.id, {type: 'text', name: 'bars-title', text: str(o.title, 'TITLE'), size: num(o.size, Math.round(comp.width / 8)), weight: 800, color: str(o.textColor, '#ffffff'),\n font: o.font as string | undefined, inPoint: t0 + 0.9, maxWidth: comp.width * 0.88,\n animators: TEXT_ANIMATORS.slam.animators}, 0).id);\n return {created};\n },\n};\n\nPRESETS['slides.slideshow'] = {\n kind: 'slides',\n description: 'Slider/slideshow from images and clips: each slide gets a slow Ken Burns move, an optional caption, and a transition into the next.',\n params: '{items: [{src, type?: \"image\"|\"video\", caption?, trimIn?, speed?}], start?: s, each?: s, transition?: type or list of types cycled per cut (\"push\"|\"crossfade\"|\"zoom\"|\"wipe\"|\"whip\"|\"slideUp\"), transitionDuration?: s, captionStyle?: text preset name, captionColor?, captionY?: px, plate?: colour, fitComp?: boolean (default true: comp duration = slideshow end)}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const items = (o.items as {src: string; type?: string; caption?: string; trimIn?: number; speed?: number}[]) ?? [];\n const each = num(o.each, 3), td = num(o.transitionDuration, 0.5), t0 = num(o.start, 0);\n const created: string[] = [];\n const ids: string[] = [];\n items.forEach((it, i) => {\n const start = t0 + i * (each - td);\n const end = start + each;\n const type = it.type ?? (/\\.(mp4|mov|webm|m4v)$/i.test(it.src) ? 'video' : 'image');\n const zoomIn = i % 2 === 0;\n const layer = addLayer(p, comp.id, {\n type, name: `slide-${i + 1}`, src: it.src, inPoint: +start.toFixed(3), outPoint: +end.toFixed(3),\n ...(type === 'video' ? {trimIn: it.trimIn ?? 0, speed: it.speed ?? 1} : {}),\n transform: {scale: kf<Vec2>([start, zoomIn ? [104, 104] : [118, 118]], [end, zoomIn ? [118, 118] : [104, 104]])},\n } as NewLayer, comp.layers.length);\n ids.push(layer.id);\n created.push(layer.id);\n if (it.caption) {\n created.push(addLayer(p, comp.id, {type: 'text', name: `caption-${i + 1}`, text: it.caption, size: Math.round(comp.width / 15), weight: 800, color: str(o.captionColor, '#ffffff'),\n inPoint: +(start + td * 0.6).toFixed(3), outPoint: +(end - td).toFixed(3), maxWidth: comp.width * 0.84,\n transform: {position: [comp.width / 2, num(o.captionY, comp.height * 0.78)]},\n box: o.plate ? {color: str(o.plate, '#000000'), padding: [32, 16], radius: 18, reveal: kf([start + td * 0.6, 0, 'expoOut'], [start + td * 0.6 + 0.5, 100])} : undefined,\n shadow: o.plate ? undefined : {color: 'rgba(0,0,0,0.7)', blur: 18, y: 4},\n animators: [...TEXT_ANIMATORS[str(o.captionStyle, 'fadeUp')]?.animators ?? TEXT_ANIMATORS.fadeUp.animators, ...TEXT_ANIMATORS.fadeOutDown.animators]} as NewLayer, 0).id);\n }\n });\n // Transitions between consecutive slides.\n const types = Array.isArray(o.transition) ? (o.transition as string[]) : [str(o.transition, 'push')];\n for (let i = 1; i < ids.length; i++) PRESETS['transition.between'].apply(p, comp.id, {from: ids[i - 1], to: ids[i], type: types[(i - 1) % types.length], duration: td});\n const end = r3(t0 + items.length * (each - td) + td);\n if (o.fitComp !== false) comp.duration = end;\n return {created, note: `Slideshow ends at ${end}s${o.fitComp !== false ? ' (comp duration set to match)' : ''}`};\n },\n};\n\nPRESETS['transition.between'] = {\n kind: 'transition',\n description: 'Animates two overlapping layers (clips, images or precomps) so one hands over to the other at the overlap.',\n params: '{from: layerId (outgoing), to: layerId (incoming, must start before `from` ends), type: \"push\"|\"crossfade\"|\"zoom\"|\"wipe\"|\"whip\"|\"slideUp\", duration?: s}',\n apply: (p, compId, o) => {\n const a = findLayer(p, str(o.from, '')), b = findLayer(p, str(o.to, ''));\n const comp = a.comp;\n const d = num(o.duration, 0.5);\n const t1 = b.layer.inPoint ?? 0, t2 = t1 + d;\n const W = comp.width, H = comp.height;\n const center: Vec2 = [W / 2, H / 2];\n const type = str(o.type, 'push');\n const pos = (id: string, ...k: [number, Vec2, Ease?][]) => k.forEach(([t, v, e]) => setKeyframe(p, id, 'transform.position', t, v, e));\n // Incoming must sit above the outgoing layer for overlays like wipe/crossfade.\n if (b.index > a.index) { comp.layers.splice(b.index, 1); comp.layers.splice(a.index, 0, b.layer); }\n switch (type) {\n case 'crossfade':\n setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easyEase'); setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);\n break;\n case 'zoom':\n setKeyframe(p, a.layer.id, 'transform.opacity', t1, 100, 'easeIn'); setKeyframe(p, a.layer.id, 'transform.opacity', t2, 0);\n updateLayer(p, a.layer.id, {effects: [...(a.layer.effects ?? []), {type: 'blur', radius: kf([t1, 0, 'easeIn'], [t2, 25])}]});\n setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easeOut'); setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);\n break;\n case 'wipe':\n updateLayer(p, b.layer.id, {masks: [{shape: 'rect', rect: kf<[number, number, number, number]>([t1, [0, 0, 0, H], 'expoInOut'], [t2, [0, 0, W * 1.2, H]])}]});\n break;\n case 'slideUp':\n pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [W / 2, -H / 2]]);\n pos(b.layer.id, [t1, [W / 2, H * 1.5], 'expoInOut'], [t2, center]);\n break;\n case 'whip':\n pos(a.layer.id, [t1, center, 'expoIn'], [t2, [-W / 2, H / 2]]);\n pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoOut'], [t2, center]);\n for (const id of [a.layer.id, b.layer.id]) updateLayer(p, id, {motionBlur: {samples: 12, shutter: 360}});\n break;\n default: // push\n pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [-W / 2, H / 2]]);\n pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoInOut'], [t2, center]);\n }\n return {created: [], note: `${type} from ${a.layer.id} to ${b.layer.id} at ${t1}s\u2013${t2}s`};\n },\n};\n\nPRESETS['element.lowerThird'] = {\n kind: 'element',\n description: 'Lower third: an accent bar wipes in, then name and title slide out from behind it.',\n params: '{name: string, title?: string, start?: s, duration?: s, color?, textColor?, y?: px, font?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = num(o.start, 0), dur = num(o.duration, 4), y = num(o.y, comp.height * 0.72);\n const color = str(o.color, '#E8692A');\n const x = comp.width * 0.08;\n const created: string[] = [];\n const bar = addLayer(p, comp.id, {type: 'solid', name: 'lt-bar', color, size: [12, 170], inPoint: t0, outPoint: t0 + dur,\n transform: {anchor: [0, 0], position: [x, y], scale: kf<Vec2>([t0, [100, 0], 'expoOut'], [t0 + 0.5, [100, 100]], [t0 + dur - 0.5, [100, 100], 'expoIn'], [t0 + dur, [100, 0]])}} as NewLayer);\n created.push(bar.id);\n const mk = (text: string, size: number, dy: number, delay: number, c: string, name: string) =>\n created.push(addLayer(p, comp.id, {type: 'text', name, text, size, weight: 800, align: 'left', color: c, font: o.font as string | undefined, inPoint: t0 + delay, outPoint: t0 + dur,\n transform: {position: [x + 34, y + dy]}, masks: [{shape: 'rect', rect: [0, -200, comp.width, 400]}],\n animators: [{unit: 'line', duration: 0.7, ease: 'expoOut', from: {x: -comp.width * 0.6}}, {unit: 'line', mode: 'out', duration: 0.5, ease: 'expoIn', from: {x: -comp.width * 0.6}}]} as NewLayer).id);\n mk(str(o.name, 'Name'), Math.round(comp.width / 15), 55, 0.25, str(o.textColor, '#ffffff'), 'lt-name');\n if (o.title) mk(str(o.title, ''), Math.round(comp.width / 28), 125, 0.4, color, 'lt-title');\n return {created};\n },\n};\n\nPRESETS['element.highlightWord'] = {\n kind: 'element',\n description: 'Adds a background plate that wipes in behind an existing text layer (marker highlight).',\n params: '{layer: textLayerId, color?, at?: s, duration?: s, padding?: [x,y], radius?}',\n apply: (p, _c, o) => {\n const {layer} = findLayer(p, str(o.layer, ''));\n if (layer.type !== 'text') throw new OpError(`${layer.id} is not a text layer`);\n const at = num(o.at, layer.inPoint ?? 0), d = num(o.duration, 0.45);\n layer.box = {color: str(o.color, '#E8692A'), padding: (o.padding as [number, number]) ?? [26, 10], radius: num(o.radius, 14), reveal: kf([at, 0, 'expoOut'], [at + d, 100])};\n return {created: []};\n },\n};\n\nexport const listPresets = () =>\n Object.entries(PRESETS).map(([name, p]) => `${name} [${p.kind}] \u2014 ${p.description}\\n params: ${p.params}`).join('\\n');\n", "// Injected by the studio server into index.html.\nexport const config = (window as unknown as {DTLY: {token: string; file: string; version: string; brand: string}}).DTLY;\n", "import type {Ease} from './model.js';\n\n// Cubic-bezier solver (same curve definition as CSS / AE's speed graph handles).\nconst bezier = (x1: number, y1: number, x2: number, y2: number) => {\n const cx = 3 * x1, bx = 3 * (x2 - x1) - cx, ax = 1 - cx - bx;\n const cy = 3 * y1, by = 3 * (y2 - y1) - cy, ay = 1 - cy - by;\n const sx = (t: number) => ((ax * t + bx) * t + cx) * t;\n const sy = (t: number) => ((ay * t + by) * t + cy) * t;\n const dx = (t: number) => (3 * ax * t + 2 * bx) * t + cx;\n return (x: number) => {\n let t = x;\n for (let i = 0; i < 8; i++) {\n const e = sx(t) - x;\n if (Math.abs(e) < 1e-6) return sy(t);\n const d = dx(t);\n if (Math.abs(d) < 1e-6) break;\n t -= e / d;\n }\n let lo = 0, hi = 1;\n t = x;\n for (let i = 0; i < 40; i++) {\n const v = sx(t);\n if (Math.abs(v - x) < 1e-6) break;\n if (v < x) lo = t; else hi = t;\n t = (lo + hi) / 2;\n }\n return sy(t);\n };\n};\n\nconst CURVES: Record<string, [number, number, number, number]> = {\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easyEase: [0.333, 0, 0.667, 1], // AE \"Easy Ease\" (33% influence both sides)\n quadOut: [0.25, 0.46, 0.45, 0.94],\n cubicOut: [0.215, 0.61, 0.355, 1],\n expoIn: [0.95, 0.05, 0.795, 0.035],\n expoOut: [0.19, 1, 0.22, 1],\n expoInOut: [1, 0, 0, 1],\n backOut: [0.175, 0.885, 0.32, 1.275],\n backIn: [0.6, -0.28, 0.735, 0.045],\n};\n\nconst cache = new Map<string, (x: number) => number>();\n\nconst elasticOut = (x: number) =>\n x === 0 || x === 1 ? x : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * ((2 * Math.PI) / 3)) + 1;\nconst bounceOut = (x: number) => {\n const n = 7.5625, d = 2.75;\n if (x < 1 / d) return n * x * x;\n if (x < 2 / d) return n * (x -= 1.5 / d) * x + 0.75;\n if (x < 2.5 / d) return n * (x -= 2.25 / d) * x + 0.9375;\n return n * (x -= 2.625 / d) * x + 0.984375;\n};\n\n// Damped spring from 0 to 1; `elapsed` in seconds so the motion is physical, not stretched.\nexport const spring = (elapsed: number, {stiffness = 170, damping = 18, mass = 1} = {}) => {\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n if (zeta < 1) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * elapsed) * (Math.cos(wd * elapsed) + ((zeta * w0) / wd) * Math.sin(wd * elapsed));\n }\n return 1 - Math.exp(-w0 * elapsed) * (1 + w0 * elapsed);\n};\n\n// Progress 0..1 (may overshoot) for a segment, given linear progress x and segment length in seconds.\nexport const applyEase = (ease: Ease | undefined, x: number, segSeconds = 1): number => {\n if (!ease || ease === 'linear') return x;\n if (ease === 'hold') return x >= 1 ? 1 : 0;\n if (ease === 'elasticOut') return elasticOut(x);\n if (ease === 'bounceOut') return bounceOut(x);\n if (typeof ease === 'object' && !Array.isArray(ease)) return x >= 1 ? 1 : spring(x * segSeconds, ease.spring);\n const pts = Array.isArray(ease) ? ease : CURVES[ease];\n if (!pts) return x;\n const key = pts.join(',');\n let fn = cache.get(key);\n if (!fn) cache.set(key, (fn = bezier(...pts)));\n return fn(x);\n};\n\nexport const EASE_NAMES = ['linear', 'hold', ...Object.keys(CURVES), 'elasticOut', 'bounceOut'];\n", "export type RGBA = [number, number, number, number];\n\nconst NAMED: Record<string, string> = {\n white: '#ffffff', black: '#000000', red: '#ff0000', green: '#008000', blue: '#0000ff',\n yellow: '#ffff00', orange: '#ffa500', transparent: '#00000000', gray: '#808080', grey: '#808080',\n};\n\nexport const parseColor = (c: string): RGBA | null => {\n const s = (NAMED[c.trim().toLowerCase()] ?? c).trim();\n if (s.startsWith('#')) {\n let h = s.slice(1);\n if (h.length === 3 || h.length === 4) h = [...h].map((ch) => ch + ch).join('');\n if (h.length !== 6 && h.length !== 8) return null;\n const n = (i: number) => parseInt(h.slice(i, i + 2), 16);\n return [n(0), n(2), n(4), h.length === 8 ? n(6) / 255 : 1];\n }\n const m = s.match(/^rgba?\\(([^)]+)\\)$/i);\n if (m) {\n const p = m[1].split(/[\\s,\\/]+/).filter(Boolean).map(Number);\n return [p[0], p[1], p[2], p[3] ?? 1];\n }\n return null;\n};\n\nexport const rgbaString = ([r, g, b, a]: RGBA) =>\n `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${Math.max(0, Math.min(1, a)).toFixed(4)})`;\n\nexport const withAlpha = (c: string, alpha: number) => {\n const p = parseColor(c);\n return p ? rgbaString([p[0], p[1], p[2], p[3] * alpha]) : c;\n};\n", "import {applyEase} from './ease.js';\nimport {parseColor, rgbaString} from './color.js';\nimport {isAnimated, type Keyframe, type Prop, type Wiggle} from './model.js';\n\nconst lerp = (a: number, b: number, p: number) => a + (b - a) * p;\n\nconst interpolate = (a: unknown, b: unknown, p: number): unknown => {\n if (typeof a === 'number' && typeof b === 'number') return lerp(a, b, p);\n if (Array.isArray(a) && Array.isArray(b)) return a.map((v, i) => lerp(v as number, (b[i] as number) ?? (v as number), p));\n if (typeof a === 'string' && typeof b === 'string') {\n const ca = parseColor(a), cb = parseColor(b);\n if (ca && cb) return rgbaString(ca.map((v, i) => lerp(v, cb[i], p)) as [number, number, number, number]);\n }\n return p < 1 ? a : b;\n};\n\n// Smooth 1D value noise for wiggle(); deterministic per seed so renders are repeatable.\nconst hash = (n: number) => {\n const x = Math.sin(n * 127.1 + 311.7) * 43758.5453;\n return x - Math.floor(x);\n};\nconst noise = (x: number, seed: number) => {\n const i = Math.floor(x), f = x - i;\n const u = f * f * (3 - 2 * f);\n return lerp(hash(i + seed * 1000) * 2 - 1, hash(i + 1 + seed * 1000) * 2 - 1, u);\n};\nconst wiggle = (value: unknown, t: number, w: Wiggle): unknown => {\n const off = (dim: number) => noise(t * w.freq, (w.seed ?? 1) + dim * 17.3) * w.amp;\n if (typeof value === 'number') return value + off(0);\n if (Array.isArray(value)) return value.map((v, i) => (v as number) + off(i));\n return value;\n};\n\nexport const evalKeyframes = <T>(kfs: Keyframe<T>[], t: number): T => {\n if (kfs.length === 0) throw new Error('empty keyframes');\n if (t <= kfs[0].t) return kfs[0].v;\n const last = kfs[kfs.length - 1];\n if (t >= last.t) return last.v;\n let i = 0;\n while (i < kfs.length - 2 && t >= kfs[i + 1].t) i++;\n const a = kfs[i], b = kfs[i + 1];\n const seg = b.t - a.t;\n const p = applyEase(a.ease, seg <= 0 ? 1 : (t - a.t) / seg, seg);\n return interpolate(a.v, b.v, p) as T;\n};\n\n// Evaluate any property at time t (seconds, in the layer's composition time).\nexport function val<T>(p: Prop<T> | undefined, t: number, fallback: T): T {\n if (p === undefined || p === null) return fallback;\n if (!isAnimated(p)) return p as T;\n const sorted = [...p.keyframes].sort((a, b) => a.t - b.t);\n const v = evalKeyframes(sorted, t);\n return (p.wiggle ? wiggle(v, t, p.wiggle) : v) as T;\n}\n", "// Browser host for the shared Renderer: <canvas> for drawing, <video>/<img> for media.\nimport {val} from '../../core/anim.js';\nimport type {AudioLayer, Composition, Project, VideoLayer} from '../../core/model.js';\nimport type {CanvasLike, Drawable, Host} from '../../render/renderer.js';\nimport {config} from './config.js';\n\nexport const mediaUrl = (src: string) => `/api/media?src=${encodeURIComponent(src)}&token=${config.token}`;\n\nconst waitFor = (el: HTMLMediaElement, event: string, ms = 2000) =>\n new Promise<void>((resolve) => {\n const done = () => { clearTimeout(timer); el.removeEventListener(event, done); resolve(); };\n const timer = setTimeout(done, ms);\n el.addEventListener(event, done, {once: true});\n });\n\ninterface VideoEntry { el: HTMLVideoElement; canvas: HTMLCanvasElement; used: number }\n\nexport class BrowserHost implements Host {\n defaultFont = 'Baloo 2';\n playing = false;\n private images = new Map<string, Promise<Drawable>>();\n private videos = new Map<string, VideoEntry>();\n private frameNo = 0;\n\n createCanvas(w: number, h: number): CanvasLike {\n const c = document.createElement('canvas');\n c.width = w;\n c.height = h;\n return c as unknown as CanvasLike;\n }\n\n image(src: string) {\n if (!this.images.has(src)) {\n this.images.set(src, new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`Could not load ${src}`));\n img.src = mediaUrl(src);\n }));\n }\n return this.images.get(src)!;\n }\n\n // Scrubbing seeks exactly; playback lets the element play and only corrects drift.\n async videoFrame(layer: VideoLayer, sourceTime: number, w: number, h: number, fps: number): Promise<Drawable> {\n const key = `${layer.id}|${layer.src}`;\n let v = this.videos.get(key);\n if (!v) {\n const el = document.createElement('video');\n el.muted = true;\n el.playsInline = true;\n el.preload = 'auto';\n el.crossOrigin = 'anonymous';\n el.src = mediaUrl(layer.src);\n v = {el, canvas: document.createElement('canvas'), used: 0};\n this.videos.set(key, v);\n await waitFor(el, 'loadeddata', 5000);\n }\n v.used = this.frameNo;\n const el = v.el;\n const t = Math.max(0, Math.min(sourceTime, (el.duration || Infinity) - 0.001));\n if (this.playing) {\n el.playbackRate = layer.speed ?? 1;\n if (Math.abs(el.currentTime - t) > 0.25) el.currentTime = t;\n if (el.paused) el.play().catch(() => {});\n } else {\n if (!el.paused) el.pause();\n if (Math.abs(el.currentTime - t) > 0.5 / fps) {\n el.currentTime = t;\n await waitFor(el, 'seeked');\n }\n }\n // Fit into the layer box the same way the FFmpeg path does (cover/contain/fill).\n const c = v.canvas;\n if (c.width !== w || c.height !== h) { c.width = w; c.height = h; }\n const ctx = c.getContext('2d')!;\n ctx.clearRect(0, 0, w, h);\n const vw = el.videoWidth || w, vh = el.videoHeight || h;\n const fit = layer.fit ?? 'cover';\n if (fit === 'fill') ctx.drawImage(el, 0, 0, w, h);\n else {\n const s = fit === 'cover' ? Math.max(w / vw, h / vh) : Math.min(w / vw, h / vh);\n ctx.drawImage(el, (w - vw * s) / 2, (h - vh * s) / 2, vw * s, vh * s);\n }\n return c;\n }\n\n // Call after each rendered frame: pauses videos whose layers are no longer on screen.\n endFrame() {\n for (const v of this.videos.values()) if (v.used !== this.frameNo && !v.el.paused) v.el.pause();\n this.frameNo++;\n }\n\n stopAll() { for (const v of this.videos.values()) v.el.pause(); }\n}\n\n// Preview audio for audio layers and un-muted video layers of the shown comp (not nested comps).\nexport class AudioPreview {\n private els = new Map<string, HTMLAudioElement>();\n\n sync(project: Project, comp: Composition, t: number, playing: boolean) {\n const live = new Set<string>();\n for (const l of comp.layers) {\n if (l.type !== 'audio' && !(l.type === 'video' && l.volume)) continue;\n const layer = l as AudioLayer | VideoLayer;\n const key = `${layer.id}|${layer.src}`;\n let el = this.els.get(key);\n if (!el) {\n el = new Audio(mediaUrl(layer.src));\n el.preload = 'auto';\n this.els.set(key, el);\n }\n live.add(key);\n const inP = layer.inPoint ?? 0, outP = layer.outPoint ?? comp.duration;\n const active = playing && t >= inP && t < outP;\n if (!active) { if (!el.paused) el.pause(); continue; }\n const speed = layer.type === 'video' ? layer.speed ?? 1 : 1;\n const src = (layer.trimIn ?? 0) + (t - inP) * speed;\n let vol = Math.max(0, Math.min(1, val(layer.volume, t, 1)));\n if (layer.type === 'audio') {\n if (layer.fadeIn && t - inP < layer.fadeIn) vol *= (t - inP) / layer.fadeIn;\n if (layer.fadeOut && outP - t < layer.fadeOut) vol *= (outP - t) / layer.fadeOut;\n }\n el.volume = vol;\n el.playbackRate = speed;\n if (Math.abs(el.currentTime - src) > 0.2) el.currentTime = src;\n if (el.paused) el.play().catch(() => {});\n }\n for (const [k, el] of this.els) if (!live.has(k) && !el.paused) el.pause();\n void project;\n }\n\n stop() { for (const el of this.els.values()) el.pause(); }\n}\n\n// Fonts: the bundled families plus any the project registers.\nexport const loadFonts = async (project: Project) => {\n const faces: FontFace[] = [\n new FontFace('Baloo 2', 'url(/fonts/Baloo2.ttf)', {weight: '400 800'}),\n new FontFace('Mukta', 'url(/fonts/Mukta-Bold.ttf)', {weight: '400 800'}),\n ];\n for (const [family, files] of Object.entries(project.fonts ?? {})) for (const f of files) faces.push(new FontFace(family, `url(${mediaUrl(f)})`));\n await Promise.all(faces.map(async (f) => { try { document.fonts.add(await f.load()); } catch { /* missing font: fall back */ } }));\n};\n", "const ENCODED_ENTITIES = /[\"&<]/;\n\n/** @param {string} str */\nexport function encodeEntities(str) {\n\t// Skip all work for strings with no entities needing encoding:\n\tif (!str.length || !ENCODED_ENTITIES.test(str)) return str;\n\n\tlet last = 0,\n\t\ti = 0,\n\t\tout = '',\n\t\tch = '';\n\n\t// Seek forward in str until the next entity char:\n\tfor (; i < str.length; i++) {\n\t\tswitch (str.charCodeAt(i)) {\n\t\t\tcase 34:\n\t\t\t\tch = '&quot;';\n\t\t\t\tbreak;\n\t\t\tcase 38:\n\t\t\t\tch = '&amp;';\n\t\t\t\tbreak;\n\t\t\tcase 60:\n\t\t\t\tch = '&lt;';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcontinue;\n\t\t}\n\t\t// Append skipped/buffered characters and the encoded entity:\n\t\tif (i != last) out += str.slice(last, i);\n\t\tout += ch;\n\t\t// Start the next seek/buffer after the entity's offset:\n\t\tlast = i + 1;\n\t}\n\tif (i != last) out += str.slice(last, i);\n\treturn out;\n}\n", "import { options, Fragment } from 'preact';\nimport { encodeEntities } from './utils';\n\nlet vnodeId = 0;\n\nconst isArray = Array.isArray;\n\n/**\n * @fileoverview\n * This file exports various methods that implement Babel's \"automatic\" JSX runtime API:\n * - jsx(type, props, key)\n * - jsxs(type, props, key)\n * - jsxDEV(type, props, key, __source, __self)\n *\n * The implementation of createVNode here is optimized for performance.\n * Benchmarks: https://esbench.com/bench/5f6b54a0b4632100a7dcd2b3\n */\n\n/**\n * JSX.Element factory used by Babel's {runtime:\"automatic\"} JSX transform\n * @param {import('../../src/internal').VNode['type']} type\n * @param {import('preact').VNode['props']} props\n * @param {import('preact').VNode['key']} [key]\n * @param {unknown} [isStaticChildren]\n * @param {unknown} [__source]\n * @param {unknown} [__self]\n */\nfunction createVNode(type, props, key, isStaticChildren, __source, __self) {\n\tif (!props) props = {};\n\t// We'll want to preserve `ref` in props to get rid of the need for\n\t// forwardRef components in the future, but that should happen via\n\t// a separate PR.\n\tlet normalizedProps = props,\n\t\tref,\n\t\ti;\n\n\tif ('ref' in normalizedProps && typeof type != 'function') {\n\t\tnormalizedProps = {};\n\t\tfor (i in props) {\n\t\t\tif (i == 'ref') {\n\t\t\t\tref = props[i];\n\t\t\t} else {\n\t\t\t\tnormalizedProps[i] = props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @type {import('../../src/internal').VNode & { __source?: any; __self?: any }} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops: normalizedProps,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t_component: null,\n\t\tconstructor: undefined,\n\t\t_original: --vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0\n\t};\n\n\tif (__source || __self) {\n\t\tvnode.__source = __source;\n\t\tvnode.__self = __self;\n\t}\n\n\tif (options.vnode) options.vnode(vnode);\n\treturn vnode;\n}\n\n/**\n * Create a template vnode. This function is not expected to be\n * used directly, but rather through a precompile JSX transform\n * @param {string[]} templates\n * @param {Array<string | null | import('preact').VNode>} exprs\n * @returns {import('preact').VNode}\n */\nfunction jsxTemplate(templates, ...exprs) {\n\tconst vnode = createVNode(Fragment, { tpl: templates, exprs });\n\t// Bypass render to string top level Fragment optimization\n\t// @ts-ignore\n\tvnode.key = vnode._vnode;\n\treturn vnode;\n}\n\nconst JS_TO_CSS = {};\nconst CSS_REGEX = /[A-Z]/g;\n\n/**\n * Unwrap potential signals.\n * @param {*} value\n * @returns {*}\n */\nfunction normalizeAttrValue(value) {\n\treturn value != null &&\n\t\ttypeof value == 'object' &&\n\t\ttypeof value.valueOf == 'function'\n\t\t? value.valueOf()\n\t\t: value;\n}\n\n/**\n * Serialize an HTML attribute to a string. This function is not\n * expected to be used directly, but rather through a precompile\n * JSX transform\n * @param {string} name The attribute name\n * @param {*} value The attribute value\n * @returns {string}\n */\nfunction jsxAttr(name, value) {\n\tif (options.attr) {\n\t\tconst result = options.attr(name, value);\n\t\tif (typeof result == 'string') return result;\n\t}\n\n\tvalue = normalizeAttrValue(value);\n\n\tif (name == 'ref' || name == 'key') return '';\n\tif (name == 'style' && typeof value == 'object') {\n\t\tlet str = '';\n\t\tfor (let prop in value) {\n\t\t\tlet val = value[prop];\n\t\t\tif (val != null && val !== '') {\n\t\t\t\tconst name =\n\t\t\t\t\tprop[0] == '-'\n\t\t\t\t\t\t? prop\n\t\t\t\t\t\t: JS_TO_CSS[prop] ||\n\t\t\t\t\t\t\t(JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$&').toLowerCase());\n\n\t\t\t\tstr = str + name + ':' + val + ';';\n\t\t\t}\n\t\t}\n\t\treturn name + '=\"' + encodeEntities(str) + '\"';\n\t}\n\n\tif (\n\t\tvalue == null ||\n\t\tvalue === false ||\n\t\ttypeof value == 'function' ||\n\t\ttypeof value == 'object'\n\t) {\n\t\treturn '';\n\t} else if (value === true) return name;\n\n\treturn name + '=\"' + encodeEntities('' + value) + '\"';\n}\n\n/**\n * Escape a dynamic child passed to `jsxTemplate`. This function\n * is not expected to be used directly, but rather through a\n * precompile JSX transform\n * @param {*} value\n * @returns {string | null | import('preact').VNode | Array<string | null | import('preact').VNode>}\n */\nfunction jsxEscape(value) {\n\tif (\n\t\tvalue == null ||\n\t\ttypeof value == 'boolean' ||\n\t\ttypeof value == 'function'\n\t) {\n\t\treturn null;\n\t}\n\n\tif (typeof value == 'object') {\n\t\t// Check for VNode\n\t\tif (value.constructor === undefined) return value;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tvalue[i] = jsxEscape(value[i]);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t}\n\n\treturn encodeEntities('' + value);\n}\n\nexport {\n\tcreateVNode as jsx,\n\tcreateVNode as jsxs,\n\tcreateVNode as jsxDEV,\n\tFragment,\n\t// precompiled JSX transform\n\tjsxTemplate,\n\tjsxAttr,\n\tjsxEscape\n};\n", "// Inspector inputs. Numbers are \"scrubby\" like After Effects: drag the value sideways to change it.\nimport {useRef, useState} from 'preact/hooks';\n\nconst fmt = (n: number) => (Number.isInteger(n) ? String(n) : n.toFixed(Math.abs(n) < 10 ? 2 : 1));\n\nexport const NumberField = ({value, onChange, onDragStart, onDragEnd, step = 1, min, max, title}: {\n value: number; onChange: (v: number, dragging: boolean) => void; onDragStart?: () => void; onDragEnd?: () => void; step?: number; min?: number; max?: number; title?: string;\n}) => {\n const [editing, setEditing] = useState<string | null>(null);\n const drag = useRef<{x: number; v: number; moved: boolean} | null>(null);\n const clamp = (v: number) => Math.min(max ?? Infinity, Math.max(min ?? -Infinity, v));\n if (editing !== null) {\n return (\n <input class=\"num editing\" value={editing} autoFocus title={title}\n onInput={(e) => setEditing((e.target as HTMLInputElement).value)}\n onBlur={() => { const n = Number(editing); if (Number.isFinite(n)) onChange(clamp(n), false); setEditing(null); }}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.target as HTMLInputElement).blur(); if (e.key === 'Escape') setEditing(null); e.stopPropagation(); }} />\n );\n }\n return (\n <span class=\"num\" title={title ?? 'Drag to scrub, click to type'}\n onPointerDown={(e) => {\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n drag.current = {x: e.clientX, v: value, moved: false};\n }}\n onPointerMove={(e) => {\n const d = drag.current;\n if (!d) return;\n const dx = e.clientX - d.x;\n if (!d.moved && Math.abs(dx) > 2) { d.moved = true; onDragStart?.(); }\n if (d.moved) onChange(clamp(+(d.v + dx * step * (e.shiftKey ? 10 : e.altKey ? 0.1 : 1)).toFixed(4)), true);\n }}\n onPointerUp={() => {\n const d = drag.current;\n drag.current = null;\n if (d?.moved) onDragEnd?.();\n else setEditing(fmt(value));\n }}>\n {fmt(value)}\n </span>\n );\n};\n\nexport const VecField = ({value, onChange, onDragStart, onDragEnd, step = 1, labels = ['x', 'y']}: {\n value: number[]; onChange: (v: number[], dragging: boolean) => void; onDragStart?: () => void; onDragEnd?: () => void; step?: number; labels?: string[];\n}) => (\n <span class=\"vec\">\n {value.map((n, i) => (\n <span class=\"vec-item\" key={i}>\n <label>{labels[i]}</label>\n <NumberField value={n} step={step} onDragStart={onDragStart} onDragEnd={onDragEnd} onChange={(v, d) => onChange(value.map((x, j) => (j === i ? v : x)), d)} />\n </span>\n ))}\n </span>\n);\n\nconst toHex = (c: string) => {\n if (/^#[0-9a-f]{6}$/i.test(c)) return c;\n if (/^#[0-9a-f]{3}$/i.test(c)) return `#${[...c.slice(1)].map((x) => x + x).join('')}`;\n const m = c.match(/rgba?\\(([^)]+)\\)/);\n if (m) return `#${m[1].split(',').slice(0, 3).map((x) => Math.round(Number(x)).toString(16).padStart(2, '0')).join('')}`;\n return '#ffffff';\n};\n\nexport const ColorField = ({value, onChange}: {value: string; onChange: (v: string) => void}) => (\n <span class=\"color\">\n <input type=\"color\" value={toHex(value)} onInput={(e) => onChange((e.target as HTMLInputElement).value)} />\n <input class=\"text\" value={value} onChange={(e) => onChange((e.target as HTMLInputElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n </span>\n);\n\nexport const TextField = ({value, onChange, multiline}: {value: string; onChange: (v: string) => void; multiline?: boolean}) =>\n multiline ? (\n <textarea class=\"text\" value={value} rows={3} onChange={(e) => onChange((e.target as HTMLTextAreaElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n ) : (\n <input class=\"text\" value={value} onChange={(e) => onChange((e.target as HTMLInputElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n );\n\nexport const Select = ({value, options, onChange}: {value: string; options: string[]; onChange: (v: string) => void}) => (\n <select value={value} onChange={(e) => onChange((e.target as HTMLSelectElement).value)}>\n {options.map((o) => <option key={o} value={o}>{o}</option>)}\n </select>\n);\n", "// Editor state: one project, history, autosave and live reload from disk.\nimport {useEffect, useState} from 'preact/hooks';\nimport {isAnimated, type Keyframe, type Layer, type Project} from '../../core/model.js';\nimport {config} from './config.js';\n\nexport interface KeySel { layer: string; path: string; t: number }\nexport interface State {\n project: Project | null;\n rev: number;\n comp: string;\n time: number;\n playing: boolean;\n loop: boolean;\n layer: string | null;\n key: KeySel | null;\n expanded: Record<string, boolean>;\n zoom: number; // timeline px per second\n status: 'loading' | 'saved' | 'saving' | 'error' | 'reloaded';\n message: string;\n warnings: string[];\n render: {active: boolean; done?: number; total?: number; out?: string; error?: string};\n}\n\nlet state: State = {\n project: null, rev: 0, comp: 'main', time: 0, playing: false, loop: true, layer: null, key: null, expanded: {},\n zoom: 120, status: 'loading', message: '', warnings: [], render: {active: false},\n};\nconst listeners = new Set<() => void>();\nexport const getState = () => state;\nexport const setState = (patch: Partial<State>) => {\n state = {...state, ...patch};\n listeners.forEach((l) => l());\n};\nexport const useStore = <T,>(select: (s: State) => T): T => {\n const [, force] = useState(0);\n useEffect(() => {\n const l = () => force((n) => n + 1);\n listeners.add(l);\n return () => { listeners.delete(l); };\n }, []);\n return select(state);\n};\n\nconst api = (path: string, init: RequestInit = {}) =>\n fetch(path, {...init, headers: {'Content-Type': 'application/json', 'X-DTLY-Token': config.token, ...(init.headers ?? {})}});\n\n// --- history -----------------------------------------------------------------------------\nconst undoStack: string[] = [];\nconst redoStack: string[] = [];\nconst MAX_HISTORY = 200;\n\nlet saveTimer: number | undefined;\nconst scheduleSave = () => {\n setState({status: 'saving'});\n clearTimeout(saveTimer);\n saveTimer = window.setTimeout(save, 250);\n};\nconst save = async () => {\n if (!state.project) return;\n try {\n const r = await api('/api/project', {method: 'PUT', body: JSON.stringify({project: state.project})});\n if (!r.ok) throw new Error(await r.text());\n const {rev, warnings} = (await r.json()) as {rev: number; warnings: string[]};\n setState({rev, warnings, status: 'saved', message: ''});\n } catch (e) {\n setState({status: 'error', message: `Save failed: ${(e as Error).message}`});\n }\n};\n\n// Apply an edit (usually a DT.ly op) to a copy of the project, as one undo step.\nexport const edit = (fn: (p: Project) => void) => {\n if (!state.project) return;\n const before = JSON.stringify(state.project);\n const next = JSON.parse(before) as Project;\n try {\n fn(next);\n } catch (e) {\n setState({message: (e as Error).message});\n return;\n }\n undoStack.push(before);\n if (undoStack.length > MAX_HISTORY) undoStack.shift();\n redoStack.length = 0;\n setState({project: next, message: ''});\n scheduleSave();\n};\n\n// Drags re-apply from the snapshot on every move, then commit as a single undo step.\nlet dragBase: string | null = null;\nexport const dragStart = () => { dragBase = state.project ? JSON.stringify(state.project) : null; };\nexport const dragUpdate = (fn: (p: Project) => void) => {\n if (!dragBase) return;\n const next = JSON.parse(dragBase) as Project;\n try { fn(next); } catch { return; }\n setState({project: next});\n};\nexport const dragEnd = () => {\n if (dragBase && JSON.stringify(state.project) !== dragBase) {\n undoStack.push(dragBase);\n redoStack.length = 0;\n scheduleSave();\n }\n dragBase = null;\n};\n\nexport const undo = () => {\n const prev = undoStack.pop();\n if (!prev || !state.project) return;\n redoStack.push(JSON.stringify(state.project));\n setState({project: JSON.parse(prev)});\n scheduleSave();\n};\nexport const redo = () => {\n const next = redoStack.pop();\n if (!next || !state.project) return;\n undoStack.push(JSON.stringify(state.project));\n setState({project: JSON.parse(next)});\n scheduleSave();\n};\n\n// --- loading & live reload ----------------------------------------------------------------\nexport const load = async (fromDisk = false) => {\n const r = await api('/api/project');\n const {rev, project} = (await r.json()) as {rev: number; project: Project};\n if (fromDisk && state.project) {\n undoStack.push(JSON.stringify(state.project)); // an external edit can be undone here too\n redoStack.length = 0;\n }\n const comp = project.comps.some((c) => c.id === state.comp) ? state.comp : project.root;\n const layer = state.layer && project.comps.some((c) => c.layers.some((l) => l.id === state.layer)) ? state.layer : null;\n setState({project, rev, comp, layer, key: layer ? state.key : null, status: fromDisk ? 'reloaded' : 'saved', message: fromDisk ? 'Reloaded: the file changed on disk' : ''});\n};\n\nexport const connectEvents = () => {\n const es = new EventSource(`/api/events?token=${config.token}`);\n es.addEventListener('project', (e) => {\n const {rev} = JSON.parse((e as MessageEvent).data) as {rev: number};\n if (rev > state.rev) load(true);\n });\n es.addEventListener('render', (e) => {\n const d = JSON.parse((e as MessageEvent).data) as {done?: number; total?: number; finished?: boolean; out?: string; error?: string; took?: number};\n if (d.error) setState({render: {active: false, error: d.error}});\n else if (d.finished) setState({render: {active: false, out: d.out}, message: `Rendered ${d.out} in ${d.took?.toFixed(1)}s`});\n else setState({render: {active: true, done: d.done, total: d.total}});\n });\n};\n\nexport const startRender = async () => {\n setState({render: {active: true, done: 0}});\n const r = await api('/api/render', {method: 'POST', body: JSON.stringify({comp: state.comp})});\n if (!r.ok) setState({render: {active: false, error: await r.text()}});\n};\n\n// --- helpers --------------------------------------------------------------------------------\nexport const currentComp = () => state.project?.comps.find((c) => c.id === state.comp) ?? state.project?.comps[0];\nexport const selectedLayer = (): Layer | undefined => currentComp()?.layers.find((l) => l.id === state.layer);\n\n// Every animated property on a layer, as dot paths (\"transform.position\", \"effects.0.radius\").\nexport const animatedPaths = (layer: Layer): {path: string; keyframes: Keyframe<unknown>[]}[] => {\n const out: {path: string; keyframes: Keyframe<unknown>[]}[] = [];\n const walk = (v: unknown, path: string) => {\n if (Array.isArray(v)) v.forEach((x, i) => typeof x === 'object' && x !== null && walk(x, `${path}.${i}`));\n else if (typeof v === 'object' && v !== null) {\n if (isAnimated(v as never)) out.push({path, keyframes: (v as {keyframes: Keyframe<unknown>[]}).keyframes});\n else for (const [k, x] of Object.entries(v)) if (k !== 'animators') walk(x, path ? `${path}.${k}` : k);\n }\n };\n walk(layer, '');\n return out;\n};\n\nexport const getPath = (obj: unknown, path: string): unknown =>\n path.split('.').reduce<unknown>((o, k) => (o == null ? undefined : (o as Record<string, unknown>)[k]), obj);\n\n// Snap to the frame grid, stored to the millisecond (avoids values like -1.7000000000000002).\nexport const snap = (t: number, fps: number) => Math.round((Math.round(t * fps) / fps) * 1000) / 1000;\n", "// Properties panel: composition settings, layer properties with stopwatches, keyframe easing, raw JSON.\nimport {useEffect, useState} from 'preact/hooks';\nimport {val} from '../../core/anim.js';\nimport {applyEase, EASE_NAMES} from '../../core/ease.js';\nimport {isAnimated, type Composition, type Ease, type Layer, type Project} from '../../core/model.js';\nimport {duplicateLayer, findLayer, moveLayer, removeLayer, removeKeyframe, setEase, setKeyframe, setProperty, updateComp, updateLayer} from '../../ops/ops.js';\nimport {PRESETS} from '../../presets/index.js';\nimport {ColorField, NumberField, Select, TextField, VecField} from './fields.js';\nimport {currentComp, dragEnd, dragStart, dragUpdate, edit, getPath, getState, setState, snap, useStore} from './store.js';\n\ntype Kind = 'num' | 'vec' | 'color';\n\n// One animatable property: value at the playhead, stopwatch, and keyframe navigation.\nconst Prop = ({layer, path, label, kind, fallback, step = 1, min, max}: {layer: Layer; path: string; label: string; kind: Kind; fallback: unknown; step?: number; min?: number; max?: number}) => {\n const time = useStore((s) => s.time);\n const comp = currentComp()!;\n const raw = getPath(layer, path);\n const animated = isAnimated(raw as never);\n const value = val(raw as never, time, fallback as never) as unknown;\n const t = snap(time, comp.fps);\n const apply = (p: Project, v: unknown) => (animated ? setKeyframe(p, layer.id, path, t, v) : setProperty(p, layer.id, path, v));\n const onChange = (v: unknown, dragging: boolean) => (dragging ? dragUpdate((p) => apply(p, v)) : edit((p) => apply(p, v)));\n const keys = animated ? (raw as {keyframes: {t: number}[]}).keyframes.map((k) => k.t) : [];\n const onKey = keys.some((k) => Math.abs(k - t) < 1e-3);\n const prev = [...keys].reverse().find((k) => k < t - 1e-3);\n const next = keys.find((k) => k > t + 1e-3);\n const toggleWatch = () => edit((p) => (animated ? setProperty(p, layer.id, path, value) : setKeyframe(p, layer.id, path, t, value)));\n const toggleKey = () => edit((p) => (onKey ? removeKeyframe(p, layer.id, path, t) : setKeyframe(p, layer.id, path, t, value)));\n return (\n <div class=\"prop\">\n <button class={`watch ${animated ? 'on' : ''}`} title={animated ? 'Stop animating (keep current value)' : 'Animate: add a keyframe at the playhead'} onClick={toggleWatch}>\u23F1</button>\n <label>{label}</label>\n <span class=\"prop-value\">\n {kind === 'num' && <NumberField value={Number(value ?? 0)} step={step} min={min} max={max} onChange={onChange} onDragStart={dragStart} onDragEnd={dragEnd} />}\n {kind === 'vec' && <VecField value={(value as number[]) ?? [0, 0]} step={step} onChange={onChange} onDragStart={dragStart} onDragEnd={dragEnd} />}\n {kind === 'color' && <ColorField value={String(value ?? '#ffffff')} onChange={(v) => onChange(v, false)} />}\n </span>\n {animated && (\n <span class=\"keynav\">\n <button disabled={prev === undefined} onClick={() => setState({time: prev!})}>\u25C0</button>\n <button class={onKey ? 'on' : ''} title={onKey ? 'Remove keyframe here' : 'Add keyframe here'} onClick={toggleKey}>\u25C6</button>\n <button disabled={next === undefined} onClick={() => setState({time: next!})}>\u25B6</button>\n </span>\n )}\n </div>\n );\n};\n\nconst Field = ({label, children}: {label: string; children: preact.ComponentChildren}) => (\n <div class=\"prop\"><span class=\"watch-space\" /><label>{label}</label><span class=\"prop-value\">{children}</span></div>\n);\n\nconst set = (layer: Layer, patch: Record<string, unknown>) => edit((p) => updateLayer(p, layer.id, patch));\nconst num = (layer: Layer, label: string, key: string, value: number | undefined, fallback: number, step = 1) => (\n <Field label={label}><NumberField value={value ?? fallback} step={step} onChange={(v, d) => (d ? dragUpdate((p) => updateLayer(p, layer.id, {[key]: v})) : set(layer, {[key]: v}))} onDragStart={dragStart} onDragEnd={dragEnd} /></Field>\n);\n\nconst Section = ({title, children, open = true}: {title: string; children: preact.ComponentChildren; open?: boolean}) => (\n <details class=\"section\" open={open}><summary>{title}</summary>{children}</details>\n);\n\nconst JsonEditor = ({value, onApply, rows = 8}: {value: unknown; onApply: (v: unknown) => void; rows?: number}) => {\n const text = JSON.stringify(value, null, 2);\n const [draft, setDraft] = useState(text);\n const [error, setError] = useState('');\n useEffect(() => { setDraft(text); setError(''); }, [text]);\n return (\n <div class=\"json\">\n <textarea rows={rows} value={draft} spellcheck={false} onInput={(e) => setDraft((e.target as HTMLTextAreaElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n <div class=\"row\">\n {error && <span class=\"error\">{error}</span>}\n <button disabled={draft === text} onClick={() => { try { onApply(JSON.parse(draft)); setError(''); } catch (e) { setError((e as Error).message); } }}>Apply</button>\n </div>\n </div>\n );\n};\n\nconst KeyPanel = () => {\n const key = useStore((s) => s.key);\n const project = useStore((s) => s.project);\n if (!key || !project) return null;\n let k: {t: number; v: unknown; ease?: Ease} | undefined;\n try {\n const {layer} = findLayer(project, key.layer);\n k = (getPath(layer, key.path) as {keyframes: {t: number; v: unknown; ease?: Ease}[]})?.keyframes?.find((x) => Math.abs(x.t - key.t) < 1e-3);\n } catch { /* layer gone */ }\n if (!k) return null;\n const ease = k.ease ?? 'linear';\n const mode = typeof ease === 'string' ? ease : Array.isArray(ease) ? 'bezier' : 'spring';\n const setE = (e: Ease) => edit((p) => setEase(p, key.layer, key.path, key.t, e));\n return (\n <Section title={`Keyframe \u00B7 ${key.path} @ ${key.t}s`}>\n <Field label=\"Ease out\">\n <Select value={mode} options={[...EASE_NAMES, 'bezier', 'spring']} onChange={(m) => setE(m === 'bezier' ? [0.25, 0.1, 0.25, 1] : m === 'spring' ? {spring: {stiffness: 170, damping: 18}} : (m as Ease))} />\n </Field>\n {Array.isArray(ease) && (\n <Field label=\"Bezier\"><VecField value={ease} step={0.01} labels={['x1', 'y1', 'x2', 'y2']} onChange={(v, d) => (d ? dragUpdate((p) => setEase(p, key.layer, key.path, key.t, v as Ease)) : setE(v as Ease))} onDragStart={dragStart} onDragEnd={dragEnd} /></Field>\n )}\n {mode === 'spring' && typeof ease === 'object' && !Array.isArray(ease) && (\n <Field label=\"Spring\"><VecField value={[ease.spring.stiffness ?? 170, ease.spring.damping ?? 18]} labels={['stiff', 'damp']} onChange={(v) => setE({spring: {stiffness: v[0], damping: v[1]}})} /></Field>\n )}\n <EaseGraph ease={ease} />\n <Field label=\"Value\"><JsonEditor value={k.v} rows={2} onApply={(v) => edit((p) => setKeyframe(p, key.layer, key.path, key.t, v))} /></Field>\n <div class=\"row\"><button onClick={() => { edit((p) => removeKeyframe(p, key.layer, key.path, key.t)); setState({key: null}); }}>Delete keyframe</button></div>\n </Section>\n );\n};\n\n// Small speed-graph style preview of the ease curve.\nconst EaseGraph = ({ease}: {ease: Ease}) => {\n const pts: string[] = [];\n for (let i = 0; i <= 40; i++) {\n const x = i / 40;\n const y = applyEase(ease, x);\n pts.push(`${(x * 180 + 10).toFixed(1)},${(110 - y * 90).toFixed(1)}`);\n }\n return (\n <svg class=\"ease-graph\" viewBox=\"0 0 200 130\">\n <line x1=\"10\" y1=\"110\" x2=\"190\" y2=\"110\" /><line x1=\"10\" y1=\"20\" x2=\"190\" y2=\"20\" class=\"guide\" />\n <polyline points={pts.join(' ')} />\n </svg>\n );\n};\n\n// Matches Renderer.layerSize: boxed layers anchor at their centre, others at the origin.\nconst defaultAnchor = (layer: Layer, comp: Composition): number[] => {\n if (layer.type === 'solid' || layer.type === 'image' || layer.type === 'video') return [(layer.size?.[0] ?? comp.width) / 2, (layer.size?.[1] ?? comp.height) / 2];\n if (layer.type === 'precomp') {\n const c = getState().project?.comps.find((x) => x.id === layer.comp);\n return [(c?.width ?? comp.width) / 2, (c?.height ?? comp.height) / 2];\n }\n return [0, 0];\n};\n\nconst LayerPanel = ({layer, comp}: {layer: Layer; comp: Composition}) => {\n const others = comp.layers.filter((l) => l.id !== layer.id);\n const idx = comp.layers.indexOf(layer);\n const fonts = ['Baloo 2', 'Mukta', ...Object.keys(getState().project?.fonts ?? {})];\n return (\n <>\n <Section title={`${layer.type} \u00B7 ${layer.id}`}>\n <Field label=\"Name\"><TextField value={layer.name ?? ''} onChange={(v) => set(layer, {name: v || null})} /></Field>\n {num(layer, 'In', 'inPoint', layer.inPoint, 0, 1 / comp.fps)}\n {num(layer, 'Out', 'outPoint', layer.outPoint, comp.duration, 1 / comp.fps)}\n <Field label=\"Parent\"><Select value={layer.parent ?? '(none)'} options={['(none)', ...others.map((l) => l.id)]} onChange={(v) => set(layer, {parent: v === '(none)' ? null : v})} /></Field>\n <Field label=\"Blend\"><Select value={layer.blendMode ?? 'normal'} options={['normal', 'multiply', 'screen', 'overlay', 'add', 'darken', 'lighten', 'softLight', 'difference']} onChange={(v) => set(layer, {blendMode: v === 'normal' ? null : v})} /></Field>\n <Field label=\"Motion blur\"><input type=\"checkbox\" checked={!!layer.motionBlur} onChange={(e) => set(layer, {motionBlur: (e.target as HTMLInputElement).checked ? {samples: 8} : null})} /></Field>\n <div class=\"row\">\n <button disabled={idx <= 0} onClick={() => edit((p) => moveLayer(p, layer.id, idx - 1))}>Up</button>\n <button disabled={idx >= comp.layers.length - 1} onClick={() => edit((p) => moveLayer(p, layer.id, idx + 1))}>Down</button>\n <button onClick={() => edit((p) => { const c = duplicateLayer(p, layer.id); setState({layer: c.id}); })}>Duplicate</button>\n <button class=\"danger\" onClick={() => { edit((p) => removeLayer(p, layer.id)); setState({layer: null, key: null}); }}>Delete</button>\n </div>\n </Section>\n\n {layer.type !== 'audio' && (\n <Section title=\"Transform\">\n <Prop layer={layer} path=\"transform.position\" label=\"Position\" kind=\"vec\" fallback={[comp.width / 2, comp.height / 2]} />\n <Prop layer={layer} path=\"transform.scale\" label=\"Scale %\" kind=\"vec\" fallback={[100, 100]} />\n <Prop layer={layer} path=\"transform.rotation\" label=\"Rotation \u00B0\" kind=\"num\" fallback={0} />\n <Prop layer={layer} path=\"transform.opacity\" label=\"Opacity %\" kind=\"num\" fallback={100} min={0} max={100} />\n <Prop layer={layer} path=\"transform.anchor\" label=\"Anchor\" kind=\"vec\" fallback={defaultAnchor(layer, comp)} />\n <Prop layer={layer} path=\"transform.skew\" label=\"Skew \u00B0\" kind=\"num\" fallback={0} />\n </Section>\n )}\n\n {layer.type === 'text' && (\n <Section title=\"Text\">\n <Field label=\"Text\"><TextField multiline value={layer.text} onChange={(v) => set(layer, {text: v})} /></Field>\n <Prop layer={layer} path=\"size\" label=\"Size\" kind=\"num\" fallback={72} min={1} />\n <Prop layer={layer} path=\"color\" label=\"Color\" kind=\"color\" fallback=\"#ffffff\" />\n <Prop layer={layer} path=\"tracking\" label=\"Tracking\" kind=\"num\" fallback={0} />\n <Field label=\"Font\"><Select value={layer.font ?? 'Baloo 2'} options={fonts} onChange={(v) => set(layer, {font: v})} /></Field>\n <Field label=\"Weight\"><Select value={String(layer.weight ?? 700)} options={['400', '500', '600', '700', '800']} onChange={(v) => set(layer, {weight: Number(v)})} /></Field>\n <Field label=\"Align\"><Select value={layer.align ?? 'center'} options={['left', 'center', 'right']} onChange={(v) => set(layer, {align: v})} /></Field>\n {num(layer, 'Max width', 'maxWidth', layer.maxWidth, 0, 5)}\n {num(layer, 'Line height', 'lineHeight', layer.lineHeight, 1.25, 0.01)}\n <Field label=\"Animators\"><JsonEditor value={layer.animators ?? []} rows={6} onApply={(v) => set(layer, {animators: v})} /></Field>\n <div class=\"presets\">\n {Object.entries(PRESETS).filter(([, pr]) => pr.kind === 'text').map(([name]) => (\n <button key={name} title={PRESETS[name].description} onClick={() => edit((p) => PRESETS[name].apply(p, comp.id, {layer: layer.id}))}>{name.slice(5)}</button>\n ))}\n </div>\n </Section>\n )}\n\n {layer.type === 'shape' && (\n <Section title=\"Shape\">\n <Field label=\"Shape\"><Select value={layer.shape} options={['rect', 'ellipse', 'polygon', 'path', 'line']} onChange={(v) => set(layer, {shape: v})} /></Field>\n {(layer.shape === 'rect' || layer.shape === 'ellipse') && <Prop layer={layer} path=\"size\" label=\"Size\" kind=\"vec\" fallback={[200, 200]} />}\n {(layer.shape === 'rect' || layer.shape === 'polygon') && <Prop layer={layer} path=\"radius\" label=\"Radius\" kind=\"num\" fallback={layer.shape === 'rect' ? 0 : 100} />}\n {(typeof layer.fill === 'string' || isAnimated(layer.fill as never) || layer.fill === undefined) && <Prop layer={layer} path=\"fill\" label=\"Fill\" kind=\"color\" fallback=\"#ffffff\" />}\n <Prop layer={layer} path=\"stroke\" label=\"Stroke\" kind=\"color\" fallback=\"#ffffff\" />\n <Prop layer={layer} path=\"strokeWidth\" label=\"Stroke width\" kind=\"num\" fallback={4} min={0} />\n <Prop layer={layer} path=\"trim.start\" label=\"Trim start %\" kind=\"num\" fallback={0} min={0} max={100} />\n <Prop layer={layer} path=\"trim.end\" label=\"Trim end %\" kind=\"num\" fallback={100} min={0} max={100} />\n </Section>\n )}\n\n {layer.type === 'solid' && (\n <Section title=\"Solid\"><Prop layer={layer} path=\"color\" label=\"Color\" kind=\"color\" fallback=\"#000000\" /></Section>\n )}\n\n {(layer.type === 'image' || layer.type === 'video') && (\n <Section title={layer.type === 'video' ? 'Video' : 'Image'}>\n <Field label=\"Source\"><TextField value={layer.src} onChange={(v) => set(layer, {src: v})} /></Field>\n <Field label=\"Fit\"><Select value={layer.fit ?? 'cover'} options={['cover', 'contain', 'fill']} onChange={(v) => set(layer, {fit: v})} /></Field>\n {layer.type === 'video' && num(layer, 'Trim in (s)', 'trimIn', layer.trimIn, 0, 0.05)}\n {layer.type === 'video' && num(layer, 'Speed', 'speed', layer.speed, 1, 0.01)}\n {layer.type === 'video' && <Prop layer={layer} path=\"volume\" label=\"Volume\" kind=\"num\" fallback={0} step={0.01} min={0} max={1} />}\n </Section>\n )}\n\n {layer.type === 'audio' && (\n <Section title=\"Audio\">\n <Field label=\"Source\"><TextField value={layer.src} onChange={(v) => set(layer, {src: v})} /></Field>\n {num(layer, 'Trim in (s)', 'trimIn', layer.trimIn, 0, 0.05)}\n <Prop layer={layer} path=\"volume\" label=\"Volume\" kind=\"num\" fallback={1} step={0.01} min={0} max={1} />\n {num(layer, 'Fade in (s)', 'fadeIn', layer.fadeIn, 0, 0.05)}\n {num(layer, 'Fade out (s)', 'fadeOut', layer.fadeOut, 0, 0.05)}\n </Section>\n )}\n\n {layer.type === 'precomp' && (\n <Section title=\"Precomp\">\n <Field label=\"Comp\"><Select value={layer.comp} options={getState().project!.comps.filter((c) => c.id !== comp.id).map((c) => c.id)} onChange={(v) => set(layer, {comp: v})} /></Field>\n {num(layer, 'Time offset', 'timeOffset', layer.timeOffset, 0, 0.05)}\n <div class=\"row\"><button onClick={() => setState({comp: layer.comp, layer: null, key: null, time: 0})}>Open comp</button></div>\n </Section>\n )}\n\n <Section title=\"Effects, masks & matte (JSON)\" open={false}>\n <Field label=\"Effects\"><JsonEditor value={layer.effects ?? []} rows={5} onApply={(v) => set(layer, {effects: v})} /></Field>\n <Field label=\"Masks\"><JsonEditor value={layer.masks ?? []} rows={4} onApply={(v) => set(layer, {masks: v})} /></Field>\n <Field label=\"Matte\"><JsonEditor value={layer.matte ?? null} rows={2} onApply={(v) => set(layer, {matte: v})} /></Field>\n </Section>\n <Section title=\"Layer JSON\" open={false}>\n <JsonEditor value={layer} rows={16} onApply={(v) => edit((p) => {\n const next = v as Layer;\n if (next.id !== layer.id) throw new Error('The id cannot change here');\n const c = p.comps.find((x) => x.id === comp.id)!;\n c.layers[c.layers.findIndex((l) => l.id === layer.id)] = next;\n })} />\n </Section>\n </>\n );\n};\n\nconst CompPanel = ({comp}: {comp: Composition}) => {\n const project = getState().project!;\n const up = (patch: Partial<Composition>) => edit((p) => updateComp(p, comp.id, patch));\n return (\n <Section title={`Composition \u00B7 ${comp.id}`}>\n <Field label=\"Name\"><TextField value={comp.name ?? ''} onChange={(v) => up({name: v || undefined})} /></Field>\n <Field label=\"Size\"><VecField value={[comp.width, comp.height]} labels={['w', 'h']} onChange={(v) => up({width: Math.round(v[0]), height: Math.round(v[1])})} /></Field>\n <Field label=\"FPS\"><NumberField value={comp.fps} onChange={(v) => up({fps: Math.max(1, Math.round(v))})} /></Field>\n <Field label=\"Duration (s)\"><NumberField value={comp.duration} step={0.1} min={0.1} onChange={(v) => up({duration: v})} /></Field>\n <Field label=\"Background\"><ColorField value={comp.background ?? '#000000'} onChange={(v) => up({background: v})} /></Field>\n <Field label=\"Markers\"><JsonEditor value={comp.markers ?? []} rows={3} onApply={(v) => up({markers: v as Composition['markers']})} /></Field>\n {project.root !== comp.id && <div class=\"row\"><button onClick={() => edit((p) => { p.root = comp.id; })}>Render this comp</button></div>}\n </Section>\n );\n};\n\nexport const Inspector = () => {\n const project = useStore((s) => s.project);\n const compId = useStore((s) => s.comp);\n const layerId = useStore((s) => s.layer);\n const comp = project?.comps.find((c) => c.id === compId);\n if (!comp) return <aside class=\"inspector\" />;\n const layer = comp.layers.find((l) => l.id === layerId);\n return (\n <aside class=\"inspector\">\n <KeyPanel />\n {layer ? <LayerPanel key={layer.id} layer={layer} comp={comp} /> : <CompPanel comp={comp} />}\n </aside>\n );\n};\n", "// Timeline: ruler, layer bars (move / trim), keyframe rows (drag to retime, click to edit).\nimport {useRef} from 'preact/hooks';\nimport {val} from '../../core/anim.js';\nimport type {Keyframe, Layer} from '../../core/model.js';\nimport {findLayer, moveKeyframe, setKeyframe, shiftLayer, updateLayer} from '../../ops/ops.js';\nimport {animatedPaths, dragEnd, dragStart, dragUpdate, edit, getPath, getState, setState, snap, useStore} from './store.js';\n\nconst LABEL_W = 230;\nconst TYPE_COLOR: Record<string, string> = {text: '#e0a84a', shape: '#5fb3a0', solid: '#9b7fd1', image: '#5b9bd5', video: '#d36c6c', audio: '#7fb35f', precomp: '#c78bc0', null: '#888'};\nconst PROP_LABEL = (path: string) => path.replace(/^transform\\./, '').replace(/\\.(\\d+)\\./g, '[$1].');\n\nconst ticks = (duration: number, zoom: number) => {\n const steps = [0.1, 0.25, 0.5, 1, 2, 5, 10, 30, 60];\n const step = steps.find((s) => s * zoom >= 60) ?? 60;\n const out: number[] = [];\n for (let t = 0; t <= duration + 1e-6; t += step) out.push(+t.toFixed(3));\n return {out, step};\n};\n\n// Follows a drag on window, so re-renders of the dragged element can't interrupt it.\nconst trackPointer = (move: (e: PointerEvent) => void, done: () => void) => {\n const up = () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); done(); };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n};\n\nconst keyShape = (k: Keyframe<unknown>) => (k.ease === 'hold' ? 'hold' : !k.ease || k.ease === 'linear' ? 'linear' : 'eased');\n\nexport const Timeline = () => {\n const project = useStore((s) => s.project);\n const compId = useStore((s) => s.comp);\n const time = useStore((s) => s.time);\n const zoom = useStore((s) => s.zoom);\n const sel = useStore((s) => s.layer);\n const key = useStore((s) => s.key);\n const expanded = useStore((s) => s.expanded);\n const tracks = useRef<HTMLDivElement>(null);\n const comp = project?.comps.find((c) => c.id === compId);\n if (!comp) return <div class=\"timeline\" />;\n\n const width = comp.duration * zoom + 120;\n const fps = comp.fps;\n const xToTime = (clientX: number) => {\n const r = tracks.current!.getBoundingClientRect();\n return Math.max(0, Math.min(comp.duration, (clientX - r.left - LABEL_W + tracks.current!.scrollLeft) / zoom));\n };\n // Snap to frames, and to the playhead when close.\n const snapT = (t: number) => {\n const ct = getState().time;\n return Math.abs(t - ct) * zoom < 6 ? ct : snap(t, fps);\n };\n\n const scrub = (e: PointerEvent) => {\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n setState({time: snap(xToTime(e.clientX), fps), playing: false});\n };\n const scrubMove = (e: PointerEvent) => {\n if ((e.buttons & 1) === 0) return;\n setState({time: snap(xToTime(e.clientX), fps)});\n };\n\n const barDrag = (e: PointerEvent, layer: Layer, mode: 'move' | 'in' | 'out') => {\n e.stopPropagation();\n setState({layer: layer.id, key: null});\n const x0 = e.clientX;\n const inP = layer.inPoint ?? 0, outP = layer.outPoint ?? comp.duration;\n let started = false;\n const move = (ev: PointerEvent) => {\n const dt = (ev.clientX - x0) / zoom;\n if (!started) { if (Math.abs(ev.clientX - x0) < 3) return; started = true; dragStart(); }\n dragUpdate((p) => {\n if (mode === 'move') {\n const target = snapT(inP + dt);\n shiftLayer(p, layer.id, target - inP);\n } else if (mode === 'in') updateLayer(p, layer.id, {inPoint: Math.min(outP - 1 / fps, Math.max(0, snapT(inP + dt)))});\n else updateLayer(p, layer.id, {outPoint: Math.max(inP + 1 / fps, snapT(outP + dt))});\n });\n };\n trackPointer(move, () => { if (started) dragEnd(); });\n };\n\n const keyDrag = (e: PointerEvent, layer: Layer, path: string, k: Keyframe<unknown>) => {\n e.stopPropagation();\n setState({layer: layer.id, key: {layer: layer.id, path, t: k.t}, time: e.altKey ? getState().time : k.t, playing: false});\n const x0 = e.clientX, t0 = k.t;\n let started = false;\n const move = (ev: PointerEvent) => {\n if (!started) { if (Math.abs(ev.clientX - x0) < 3) return; started = true; dragStart(); }\n const to = Math.max(0, snapT(t0 + (ev.clientX - x0) / zoom));\n dragUpdate((p) => moveKeyframe(p, layer.id, path, t0, to));\n setState({key: {layer: layer.id, path, t: to}, time: to});\n };\n trackPointer(move, () => { if (started) dragEnd(); });\n };\n\n // Double-click a property row: add a keyframe there with the value the property has at that time.\n const addKeyAt = (e: MouseEvent, layer: Layer, path: string) => {\n const t = snap(xToTime(e.clientX), fps);\n const cur = getPath(layer, path);\n const v = val(cur as never, t, undefined as never);\n edit((p) => setKeyframe(p, layer.id, path, t, v));\n setState({key: {layer: layer.id, path, t}, time: t});\n };\n\n const {out: tickList} = ticks(comp.duration, zoom);\n const onWheel = (e: WheelEvent) => {\n if (!(e.ctrlKey || e.metaKey)) return;\n e.preventDefault();\n setState({zoom: Math.min(2000, Math.max(10, zoom * (e.deltaY < 0 ? 1.15 : 1 / 1.15)))});\n };\n\n return (\n <div class=\"timeline\">\n <div class=\"tl-scroll\" ref={tracks} onWheel={onWheel}>\n <div class=\"tl-inner\" style={{width: `${LABEL_W + width}px`}}>\n <div class=\"tl-ruler-row\">\n <div class=\"tl-label tl-corner\">{comp.name ?? comp.id} \u00B7 {comp.fps} fps</div>\n <div class=\"tl-ruler\" style={{width: `${width}px`}} onPointerDown={scrub} onPointerMove={scrubMove}>\n {tickList.map((t) => <div key={t} class=\"tick\" style={{left: `${t * zoom}px`}}><span>{t}s</span></div>)}\n {(comp.markers ?? []).map((m) => <div key={m.t} class=\"marker\" style={{left: `${m.t * zoom}px`}} title={m.label} />)}\n <div class=\"tl-end\" style={{left: `${comp.duration * zoom}px`}} />\n </div>\n </div>\n {comp.layers.map((layer, idx) => {\n const inP = layer.inPoint ?? 0, outP = layer.outPoint ?? comp.duration;\n const props = animatedPaths(layer);\n const open = expanded[layer.id];\n return (\n <div key={layer.id} class={`tl-group ${sel === layer.id ? 'selected' : ''}`}>\n <div class=\"tl-row layer-row\">\n <div class=\"tl-label\" onPointerDown={() => setState({layer: layer.id, key: null})}>\n <button class={`twirl ${open ? 'open' : ''} ${props.length ? '' : 'empty'}`} onClick={(e) => { e.stopPropagation(); setState({expanded: {...expanded, [layer.id]: !open}}); }}>\u25B8</button>\n <button class={`eye ${layer.hidden ? 'off' : ''}`} title=\"Show/hide\" onClick={(e) => { e.stopPropagation(); edit((p) => updateLayer(p, layer.id, {hidden: layer.hidden ? null : true})); }}>\u25CF</button>\n <span class=\"idx\">{idx + 1}</span>\n <span class=\"chip\" style={{background: TYPE_COLOR[layer.type]}} />\n <span class=\"name\" title={layer.id}>{layer.name ?? layer.id}</span>\n </div>\n <div class=\"tl-track\" style={{width: `${width}px`}} onPointerDown={scrub} onPointerMove={scrubMove}>\n <div class={`bar ${layer.hidden ? 'hidden' : ''}`} style={{left: `${inP * zoom}px`, width: `${Math.max(2, (outP - inP) * zoom)}px`, background: TYPE_COLOR[layer.type]}}\n onPointerDown={(e) => barDrag(e, layer, 'move')}>\n <span class=\"handle in\" onPointerDown={(e) => barDrag(e, layer, 'in')} />\n <span class=\"bar-name\">{layer.type === 'text' ? layer.text.split('\\n')[0] : layer.name ?? layer.id}</span>\n <span class=\"handle out\" onPointerDown={(e) => barDrag(e, layer, 'out')} />\n </div>\n {!open && props.flatMap((pr) => pr.keyframes.map((k) => <span key={`${pr.path}${k.t}`} class=\"mini-key\" style={{left: `${k.t * zoom}px`}} />))}\n </div>\n </div>\n {open && props.map((pr) => (\n <div key={pr.path} class=\"tl-row prop-row\">\n <div class=\"tl-label prop-label\" title={pr.path}>{PROP_LABEL(pr.path)}</div>\n <div class=\"tl-track\" style={{width: `${width}px`}} onPointerDown={scrub} onPointerMove={scrubMove} onDblClick={(e) => addKeyAt(e, layer, pr.path)}>\n {pr.keyframes.map((k, i) => {\n const next = pr.keyframes[i + 1];\n return next ? <span key={`seg${k.t}`} class={`seg ${keyShape(k)}`} style={{left: `${k.t * zoom}px`, width: `${(next.t - k.t) * zoom}px`}} /> : null;\n })}\n {pr.keyframes.map((k, ki) => {\n const active = key && key.layer === layer.id && key.path === pr.path && Math.abs(key.t - k.t) < 1e-3;\n return <span key={ki} class={`key ${keyShape(k)} ${active ? 'active' : ''}`} style={{left: `${k.t * zoom}px`}} title={`${k.t}s = ${JSON.stringify(k.v)}${k.ease ? ` \u00B7 ${typeof k.ease === 'string' ? k.ease : JSON.stringify(k.ease)}` : ''}`}\n onPointerDown={(e) => keyDrag(e, layer, pr.path, k)} />;\n })}\n </div>\n </div>\n ))}\n </div>\n );\n })}\n <div class=\"playhead\" style={{left: `${LABEL_W + time * zoom}px`}} />\n </div>\n </div>\n </div>\n );\n};\n\n// Helpers used by keyboard shortcuts.\nexport const keyTimes = (layerId: string) => {\n const s = getState();\n if (!s.project) return [];\n const {layer} = findLayer(s.project, layerId);\n return [...new Set(animatedPaths(layer).flatMap((p) => p.keyframes.map((k) => k.t)))].sort((a, b) => a - b);\n};\n", "import {applyEase} from './ease.js';\nimport {parseColor, rgbaString} from './color.js';\nimport type {TextAnimator, TextLayer} from './model.js';\nimport {val} from './anim.js';\n\ntype Ctx = CanvasRenderingContext2D;\n\nexport interface Unit {\n text: string;\n x: number; // left edge, relative to block origin\n y: number; // baseline\n w: number;\n line: number;\n word: number;\n grapheme: number; // index of first grapheme\n}\nexport interface TextLayout {\n lines: {text: string; x: number; y: number; w: number}[];\n graphemes: Unit[];\n words: Unit[];\n width: number;\n height: number;\n top: number; // block top relative to origin\n size: number;\n}\n\nconst segmenter = new Intl.Segmenter(undefined, {granularity: 'grapheme'});\nexport const graphemes = (s: string) => [...segmenter.segment(s)].map((g) => g.segment);\n\nexport const fontString = (layer: TextLayer, size: number, fallbackFamily: string) =>\n `${layer.weight ?? 700} ${size}px \"${layer.font ?? fallbackFamily}\"`;\n\nconst layoutCache = new Map<string, TextLayout>();\n\n// Lays text out once, measuring each grapheme at its position inside the shaped line,\n// so per-letter animation of Devanagari keeps conjuncts and matras in place.\nexport const layoutText = (ctx: Ctx, layer: TextLayer, size: number, tracking: number, font: string): TextLayout => {\n const key = [layer.text, font, tracking, layer.maxWidth, layer.align, layer.lineHeight].join('|');\n const hit = layoutCache.get(key);\n if (hit) return hit;\n ctx.font = font;\n // skia (and some browsers) drop trailing whitespace from measureText, so measure with a sentinel.\n const sentinel = ctx.measureText('|').width;\n const advance = (s: string) => (/\\s$/.test(s) ? ctx.measureText(`${s}|`).width - sentinel : ctx.measureText(s).width);\n const measure = (s: string) => advance(s) + tracking * Math.max(0, graphemes(s).length - 1);\n const lineHeight = (layer.lineHeight ?? 1.25) * size;\n\n const rawLines: string[] = [];\n for (const para of layer.text.split('\\n')) {\n if (!layer.maxWidth) {\n rawLines.push(para);\n continue;\n }\n let cur = '';\n for (const word of para.split(' ')) {\n const next = cur ? `${cur} ${word}` : word;\n if (cur && measure(next) > layer.maxWidth) {\n rawLines.push(cur);\n cur = word;\n } else cur = next;\n }\n rawLines.push(cur);\n }\n\n const align = layer.align ?? 'center';\n const top = -(rawLines.length * lineHeight) / 2;\n const out: TextLayout = {lines: [], graphemes: [], words: [], width: 0, height: rawLines.length * lineHeight, top, size};\n let gi = 0, wi = 0;\n rawLines.forEach((line, li) => {\n const w = measure(line);\n out.width = Math.max(out.width, w);\n const x0 = align === 'left' ? 0 : align === 'right' ? -w : -w / 2;\n // Baseline sits ~78% down the line box, which centres Latin and Devanagari well.\n const y = top + li * lineHeight + lineHeight * 0.5 + size * 0.32;\n out.lines.push({text: line, x: x0, y, w});\n const gs = graphemes(line);\n let prefix = '';\n let wordStart: number | null = null, wordText = '';\n const flushWord = (endX: number) => {\n if (wordStart !== null) out.words.push({text: wordText, x: wordStart, y, w: endX - wordStart, line: li, word: wi++, grapheme: gi});\n wordStart = null;\n wordText = '';\n };\n gs.forEach((g, i) => {\n const x = x0 + (prefix ? advance(prefix) : 0) + tracking * i;\n const gw = ctx.measureText(g).width;\n if (g === ' ') flushWord(x);\n else {\n if (wordStart === null) wordStart = x;\n wordText += g;\n out.graphemes.push({text: g, x, y, w: gw, line: li, word: wi, grapheme: gi++});\n }\n prefix += g;\n });\n flushWord(x0 + w);\n });\n if (layoutCache.size > 500) layoutCache.clear();\n layoutCache.set(key, out);\n return out;\n};\n\nconst rank = (i: number, n: number, order: TextAnimator['order'], seed = 1) => {\n switch (order) {\n case 'reverse': return n - 1 - i;\n case 'center': return Math.abs(i - (n - 1) / 2);\n case 'edges': return (n - 1) / 2 - Math.abs(i - (n - 1) / 2);\n case 'random': {\n const ids = [...Array(n).keys()].sort((a, b) => Math.sin(a * 91.7 + seed) - Math.sin(b * 91.7 + seed));\n return ids.indexOf(i);\n }\n default: return i;\n }\n};\n\nexport interface UnitState { opacity: number; x: number; y: number; scale: number; rotation: number; blur: number; tracking: number; color?: string }\n\n// Combined animator state for one unit at local layer time `lt` (seconds since inPoint).\nexport const unitState = (animators: TextAnimator[], unitIndex: Record<TextAnimator['unit'], number>, counts: Record<TextAnimator['unit'], number>, lt: number, layerDur: number, baseColor: string): UnitState => {\n const s: UnitState = {opacity: 1, x: 0, y: 0, scale: 1, rotation: 0, blur: 0, tracking: 0};\n for (const a of animators) {\n const n = counts[a.unit], i = unitIndex[a.unit];\n const stagger = a.stagger ?? 0.05, dur = a.duration ?? 0.5, delay = a.delay ?? 0;\n const r = rank(i, n, a.order, a.seed);\n const maxRank = a.order === 'center' || a.order === 'edges' ? (n - 1) / 2 : n - 1;\n let p: number;\n if (a.mode === 'out') {\n const start = layerDur - delay - dur - (maxRank - r) * stagger;\n p = 1 - applyEase(a.ease ?? 'easeIn', Math.min(1, Math.max(0, (lt - start) / dur)), dur);\n } else {\n const start = delay + r * stagger;\n p = applyEase(a.ease ?? 'cubicOut', Math.min(1, Math.max(0, (lt - start) / dur)), dur);\n }\n const q = 1 - p; // amount of the \"from\" offset still applied\n const f = a.from;\n if (f.opacity !== undefined) s.opacity *= (f.opacity + (100 - f.opacity) * p) / 100;\n if (f.x) s.x += f.x * q;\n if (f.y) s.y += f.y * q;\n if (f.scale !== undefined) s.scale *= (f.scale + (100 - f.scale) * p) / 100;\n if (f.rotation) s.rotation += f.rotation * q;\n if (f.blur) s.blur += f.blur * q;\n if (f.tracking) s.tracking += f.tracking * q;\n if (f.color) {\n const c0 = parseColor(f.color), c1 = parseColor(baseColor);\n if (c0 && c1) s.color = rgbaString(c0.map((v, k) => v + (c1[k] - v) * p) as [number, number, number, number]);\n }\n }\n return s;\n};\n\nconst roundRect = (ctx: Ctx, x: number, y: number, w: number, h: number, r: number) => {\n ctx.beginPath();\n ctx.roundRect(x, y, w, h, r);\n};\n\n// Draws a text layer in its own layer space (origin = alignment point, vertically centred).\nexport const drawText = (ctx: Ctx, layer: TextLayer, t: number, inPoint: number, outPoint: number, fallbackFamily: string) => {\n const size = val(layer.size, t, 72);\n const tracking = val(layer.tracking, t, 0);\n const color = val(layer.color, t, '#ffffff');\n const font = fontString(layer, size, fallbackFamily);\n const L = layoutText(ctx, layer, size, tracking, font);\n ctx.font = font;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'alphabetic';\n\n if (layer.box) {\n const [px, py] = layer.box.padding ?? [24, 12];\n const reveal = val(layer.box.reveal, t, 100) / 100;\n const x0 = Math.min(...L.lines.map((l) => l.x)) - px;\n const bw = L.width + px * 2, bh = L.height + py * 2;\n if (reveal > 0) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x0, L.top - py, bw * reveal, bh);\n ctx.clip();\n ctx.fillStyle = val(layer.box.color, t, '#000');\n roundRect(ctx, x0, L.top - py, bw, bh, layer.box.radius ?? 12);\n ctx.fill();\n ctx.restore();\n }\n }\n\n if (layer.shadow) {\n ctx.shadowColor = layer.shadow.color;\n ctx.shadowBlur = layer.shadow.blur;\n ctx.shadowOffsetX = layer.shadow.x ?? 0;\n ctx.shadowOffsetY = layer.shadow.y ?? 0;\n }\n const paint = (s: string, x: number, y: number, fill: string) => {\n if (layer.stroke) {\n ctx.lineJoin = 'round';\n ctx.lineWidth = layer.stroke.width;\n ctx.strokeStyle = layer.stroke.color;\n ctx.strokeText(s, x, y);\n }\n ctx.fillStyle = fill;\n ctx.fillText(s, x, y);\n };\n\n const animators = layer.animators ?? [];\n if (animators.length === 0) {\n for (const l of L.lines) paint(l.text, l.x, l.y, color);\n return;\n }\n\n // Draw at the finest unit any animator needs; coarser units keep whole-word shaping.\n const finest = animators.some((a) => a.unit === 'grapheme') ? 'grapheme' : animators.some((a) => a.unit === 'word') ? 'word' : 'line';\n const units: Unit[] = finest === 'grapheme' ? L.graphemes : finest === 'word' ? L.words : L.lines.map((l, i) => ({...l, line: i, word: 0, grapheme: 0}));\n const counts = {grapheme: L.graphemes.length, word: L.words.length, line: L.lines.length};\n const lt = t - inPoint, dur = outPoint - inPoint;\n const clip = animators.some((a) => a.clip);\n const lineHeight = L.height / L.lines.length;\n const lineCounts = new Map<number, number>();\n for (const u of units) lineCounts.set(u.line, (lineCounts.get(u.line) ?? 0) + 1);\n const lineIdx = new Map<number, number>();\n\n for (const u of units) {\n const idxInLine = lineIdx.get(u.line) ?? 0;\n lineIdx.set(u.line, idxInLine + 1);\n const st = unitState(animators, {grapheme: u.grapheme, word: u.word, line: u.line}, counts, lt, dur, color);\n if (st.opacity <= 0.001) continue;\n ctx.save();\n if (clip) {\n ctx.beginPath();\n ctx.rect(-1e5, L.top + u.line * lineHeight, 2e5, lineHeight);\n ctx.clip();\n }\n const spread = st.tracking * (idxInLine - ((lineCounts.get(u.line) ?? 1) - 1) / 2);\n const cx = u.x + u.w / 2 + st.x + spread;\n const cy = u.y - size * 0.35 + st.y;\n ctx.translate(cx, cy);\n if (st.rotation) ctx.rotate((st.rotation * Math.PI) / 180);\n if (st.scale !== 1) ctx.scale(st.scale, st.scale);\n ctx.globalAlpha *= st.opacity;\n if (st.blur > 0.1) ctx.filter = `blur(${st.blur.toFixed(2)}px)`;\n paint(u.text, -u.w / 2, size * 0.35, st.color ?? color);\n ctx.restore();\n }\n};\n", "// Environment-agnostic compositor: draws a composition at time t onto any Canvas2D context.\n// The same code runs in Node (skia-canvas) for export and in the browser for preview.\nimport {val} from '../core/anim.js';\nimport {parseColor, rgbaString} from '../core/color.js';\nimport type {Composition, Effect, Layer, Project, ShapeLayer, Vec2, VideoLayer} from '../core/model.js';\nimport {drawText} from '../core/text.js';\n\ntype Ctx = CanvasRenderingContext2D;\nexport interface CanvasLike { width: number; height: number; getContext(type: '2d'): Ctx }\nexport interface Drawable { width: number; height: number }\n\nexport interface Host {\n createCanvas(w: number, h: number): CanvasLike;\n image(src: string): Promise<Drawable>;\n videoFrame(layer: VideoLayer, sourceTime: number, w: number, h: number, fps: number): Promise<Drawable>;\n // Effects the host applies while decoding video (e.g. static blur in FFmpeg); the renderer skips them.\n bakedVideoEffects?(layer: VideoLayer): Set<Effect>;\n defaultFont: string;\n}\n\ntype M = [number, number, number, number, number, number]; // a b c d e f\nconst I: M = [1, 0, 0, 1, 0, 0];\nconst mul = (m: M, n: M): M => [\n m[0] * n[0] + m[2] * n[1], m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3], m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4], m[1] * n[4] + m[3] * n[5] + m[5],\n];\n\nconst BLEND: Record<string, GlobalCompositeOperation> = {\n normal: 'source-over', multiply: 'multiply', screen: 'screen', overlay: 'overlay', add: 'lighter',\n darken: 'darken', lighten: 'lighten', softLight: 'soft-light', difference: 'difference',\n};\n\nexport class Renderer {\n private pool = new Map<string, CanvasLike[]>();\n constructor(public project: Project, public host: Host) {}\n\n comp(id: string): Composition {\n const c = this.project.comps.find((c) => c.id === id);\n if (!c) throw new Error(`Unknown composition \"${id}\"`);\n return c;\n }\n\n private acquire(w: number, h: number): CanvasLike {\n const list = this.pool.get(`${w}x${h}`);\n const c = list?.pop() ?? this.host.createCanvas(w, h);\n const ctx = c.getContext('2d');\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, w, h);\n return c;\n }\n private release(c: CanvasLike) {\n const k = `${c.width}x${c.height}`;\n if (!this.pool.has(k)) this.pool.set(k, []);\n this.pool.get(k)!.push(c);\n }\n\n // Natural size of a layer's content in layer space (used for default anchor points).\n layerSize(layer: Layer, comp: Composition, t: number): Vec2 {\n switch (layer.type) {\n case 'solid': return layer.size ?? [comp.width, comp.height];\n case 'image': case 'video': return layer.size ?? [comp.width, comp.height];\n case 'precomp': { const c = this.comp(layer.comp); return [c.width, c.height]; }\n default: return [0, 0];\n }\n }\n\n // Layer-space \u2192 comp-space matrix, including parents (AE parenting: transform only).\n matrix(layer: Layer, comp: Composition, t: number, depth = 0): M {\n const tr = layer.transform ?? {};\n const size = this.layerSize(layer, comp, t);\n const anchor = val(tr.anchor, t, [size[0] / 2, size[1] / 2] as Vec2);\n const pos = val(tr.position, t, [comp.width / 2, comp.height / 2] as Vec2);\n const [sx, sy] = val(tr.scale, t, [100, 100] as Vec2);\n const rot = (val(tr.rotation, t, 0) * Math.PI) / 180;\n const skew = Math.tan((val(tr.skew, t, 0) * Math.PI) / 180);\n const cos = Math.cos(rot), sin = Math.sin(rot);\n let m: M = [1, 0, 0, 1, pos[0], pos[1]];\n m = mul(m, [cos, sin, -sin, cos, 0, 0]);\n m = mul(m, [1, 0, skew, 1, 0, 0]);\n m = mul(m, [sx / 100, 0, 0, sy / 100, 0, 0]);\n m = mul(m, [1, 0, 0, 1, -anchor[0], -anchor[1]]);\n if (layer.parent && depth < 20) {\n const p = comp.layers.find((l) => l.id === layer.parent);\n if (p) m = mul(this.matrix(p, comp, t, depth + 1), m);\n }\n return m;\n }\n\n async renderComp(ctx: Ctx, comp: Composition, t: number, withBackground = true) {\n if (withBackground && comp.background) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.fillStyle = comp.background;\n ctx.fillRect(0, 0, comp.width, comp.height);\n ctx.restore();\n }\n const matteSources = new Set(comp.layers.map((l) => l.matte?.layer).filter(Boolean));\n for (let i = comp.layers.length - 1; i >= 0; i--) {\n const layer = comp.layers[i];\n if (layer.hidden || layer.type === 'audio' || layer.type === 'null') continue;\n if (matteSources.has(layer.id)) continue; // mattes only show through the layer that uses them\n await this.renderLayer(ctx, layer, comp, t);\n }\n }\n\n isActive(layer: Layer, comp: Composition, t: number) {\n return t >= (layer.inPoint ?? 0) && t < (layer.outPoint ?? comp.duration);\n }\n\n async renderLayer(target: Ctx, layer: Layer, comp: Composition, t: number) {\n if (!this.isActive(layer, comp, t)) return;\n const tr = layer.transform ?? {};\n const opacity = val(tr.opacity, t, 100) / 100;\n if (opacity <= 0) return;\n const baked = layer.type === 'video' ? this.host.bakedVideoEffects?.(layer) : undefined;\n const effects = (layer.effects ?? []).filter((e) => !baked?.has(e));\n // Filters and drop shadows can be applied while drawing; only masks, mattes, motion blur,\n // glow and fill need the layer composited in a full-frame buffer first (much slower).\n const direct = !layer.masks?.length && !layer.matte && !layer.motionBlur && effects.every((e) => DIRECT_EFFECTS.has(e.type));\n\n if (direct) {\n target.save();\n target.globalAlpha *= opacity;\n target.globalCompositeOperation = BLEND[layer.blendMode ?? 'normal'];\n const filters = filterString(effects, t);\n if (filters) target.filter = filters;\n this.applyShadow(target, effects, t);\n target.setTransform(...this.matrix(layer, comp, t));\n await this.drawContent(target, layer, comp, t);\n target.restore();\n return;\n }\n\n const buf = this.acquire(comp.width, comp.height);\n const b = buf.getContext('2d');\n if (layer.motionBlur) {\n // Average sub-frame samples across the shutter (AE: 180\u00B0 shutter, ~8-16 samples).\n const n = Math.max(2, layer.motionBlur.samples ?? 8);\n const span = ((layer.motionBlur.shutter ?? 180) / 360) / comp.fps;\n for (let k = 0; k < n; k++) {\n const st = t - span / 2 + (span * k) / (n - 1);\n b.save();\n b.globalAlpha = 1 / (k + 1);\n b.setTransform(...this.matrix(layer, comp, st));\n await this.drawContent(b, layer, comp, st);\n b.restore();\n }\n } else {\n b.save();\n b.setTransform(...this.matrix(layer, comp, t));\n await this.drawContent(b, layer, comp, t);\n b.restore();\n }\n\n if (layer.masks?.length) {\n const m = this.matrix(layer, comp, t);\n for (const mask of layer.masks) {\n b.save();\n b.setTransform(...m);\n b.globalCompositeOperation = mask.inverted ? 'destination-out' : 'destination-in';\n b.beginPath();\n if (mask.shape === 'path' && mask.points?.length) {\n mask.points.forEach(([x, y], i) => (i ? b.lineTo(x, y) : b.moveTo(x, y)));\n b.closePath();\n } else {\n const [x, y, w, h] = val(mask.rect, t, [0, 0, 0, 0] as [number, number, number, number]);\n if (mask.shape === 'ellipse') b.ellipse(x + w / 2, y + h / 2, Math.abs(w / 2), Math.abs(h / 2), 0, 0, Math.PI * 2);\n else b.roundRect(x, y, w, h, mask.radius ?? 0);\n }\n b.fillStyle = '#000';\n b.fill();\n b.restore();\n }\n }\n\n for (const e of effects) {\n if (e.type === 'fill') {\n b.save();\n b.globalCompositeOperation = 'source-in';\n b.globalAlpha = val(e.opacity, t, 100) / 100;\n b.fillStyle = e.color;\n b.fillRect(0, 0, comp.width, comp.height);\n b.restore();\n }\n }\n\n if (layer.matte) {\n const src = comp.layers.find((l) => l.id === layer.matte!.layer);\n if (src) {\n const mb = this.acquire(comp.width, comp.height);\n await this.renderLayer(mb.getContext('2d'), {...src, hidden: false, matte: undefined}, comp, t);\n b.save();\n b.globalCompositeOperation = layer.matte.mode === 'alphaInverted' ? 'destination-out' : 'destination-in';\n b.drawImage(mb as unknown as CanvasImageSource, 0, 0);\n b.restore();\n this.release(mb);\n }\n }\n\n target.save();\n target.setTransform(1, 0, 0, 1, 0, 0);\n target.globalAlpha *= opacity;\n target.globalCompositeOperation = BLEND[layer.blendMode ?? 'normal'];\n const filters = filterString(effects, t);\n if (filters) target.filter = filters;\n this.applyShadow(target, effects, t);\n const glow = effects.find((e) => e.type === 'glow') as Extract<Effect, {type: 'glow'}> | undefined;\n if (glow) {\n const strength = val(glow.strength, t, 100) / 100;\n target.save();\n target.shadowColor = 'transparent';\n target.filter = `blur(${val(glow.radius, t, 24)}px)`;\n target.globalCompositeOperation = 'lighter';\n target.globalAlpha *= strength;\n if (glow.color) {\n const g = this.acquire(comp.width, comp.height);\n const gc = g.getContext('2d');\n gc.drawImage(buf as unknown as CanvasImageSource, 0, 0);\n gc.globalCompositeOperation = 'source-in';\n gc.fillStyle = glow.color;\n gc.fillRect(0, 0, comp.width, comp.height);\n target.drawImage(g as unknown as CanvasImageSource, 0, 0);\n this.release(g);\n } else target.drawImage(buf as unknown as CanvasImageSource, 0, 0);\n target.restore();\n }\n target.drawImage(buf as unknown as CanvasImageSource, 0, 0);\n target.restore();\n this.release(buf);\n }\n\n private applyShadow(ctx: Ctx, effects: Effect[], t: number) {\n const shadow = effects.find((e) => e.type === 'dropShadow') as Extract<Effect, {type: 'dropShadow'}> | undefined;\n if (!shadow) return;\n const dist = val(shadow.distance, t, 8), ang = ((shadow.angle ?? 135) * Math.PI) / 180;\n const c = parseColor(shadow.color ?? '#000') ?? [0, 0, 0, 1];\n ctx.shadowColor = rgbaString([c[0], c[1], c[2], c[3] * (val(shadow.opacity, t, 60) / 100)]);\n ctx.shadowBlur = val(shadow.blur, t, 16);\n ctx.shadowOffsetX = Math.sin(ang) * dist;\n ctx.shadowOffsetY = -Math.cos(ang) * dist;\n }\n\n private async drawContent(ctx: Ctx, layer: Layer, comp: Composition, t: number) {\n const inP = layer.inPoint ?? 0;\n switch (layer.type) {\n case 'solid': {\n const [w, h] = layer.size ?? [comp.width, comp.height];\n ctx.fillStyle = val(layer.color, t, '#000');\n ctx.fillRect(0, 0, w, h);\n return;\n }\n case 'shape': return drawShape(ctx, layer, t);\n case 'text': return drawText(ctx, layer, t, inP, layer.outPoint ?? comp.duration, this.project.fonts ? Object.keys(this.project.fonts)[0] ?? this.host.defaultFont : this.host.defaultFont);\n case 'image': {\n const img = await this.host.image(layer.src);\n const [w, h] = layer.size ?? [comp.width, comp.height];\n drawFitted(ctx, img, w, h, layer.fit ?? 'cover');\n return;\n }\n case 'video': {\n const [w, h] = layer.size ?? [comp.width, comp.height];\n const srcTime = (layer.trimIn ?? 0) + (t - inP) * (layer.speed ?? 1);\n const frame = await this.host.videoFrame(layer, srcTime, w, h, comp.fps);\n ctx.drawImage(frame as unknown as CanvasImageSource, 0, 0, w, h);\n return;\n }\n case 'precomp': {\n const child = this.comp(layer.comp);\n const ct = (t - inP) * (layer.speed ?? 1) + (layer.timeOffset ?? 0);\n const c = this.acquire(child.width, child.height);\n await this.renderComp(c.getContext('2d'), child, ct, true);\n ctx.drawImage(c as unknown as CanvasImageSource, 0, 0);\n this.release(c);\n return;\n }\n }\n }\n}\n\nconst DIRECT_EFFECTS = new Set<Effect['type']>(['blur', 'brightness', 'saturate', 'contrast', 'dropShadow']);\n\nconst filterString = (effects: Effect[], t: number) =>\n effects\n .map((e) => {\n if (e.type === 'blur') { const r = val(e.radius, t, 0); return r > 0.05 ? `blur(${r}px)` : ''; }\n if (e.type === 'brightness') return `brightness(${val(e.amount, t, 100)}%)`;\n if (e.type === 'saturate') return `saturate(${val(e.amount, t, 100)}%)`;\n if (e.type === 'contrast') return `contrast(${val(e.amount, t, 100)}%)`;\n return '';\n })\n .filter(Boolean)\n .join(' ');\n\nconst drawFitted = (ctx: Ctx, img: Drawable, w: number, h: number, fit: 'cover' | 'contain' | 'fill') => {\n if (fit === 'fill') return ctx.drawImage(img as unknown as CanvasImageSource, 0, 0, w, h);\n const s = fit === 'cover' ? Math.max(w / img.width, h / img.height) : Math.min(w / img.width, h / img.height);\n const dw = img.width * s, dh = img.height * s;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, w, h);\n ctx.clip();\n ctx.drawImage(img as unknown as CanvasImageSource, (w - dw) / 2, (h - dh) / 2, dw, dh);\n ctx.restore();\n};\n\n// Shape outline as a polyline (layer space, centred on the origin), used for trim paths.\nconst outline = (s: ShapeLayer, t: number): {pts: Vec2[]; closed: boolean} => {\n const [w, h] = val(s.size, t, [200, 200] as Vec2);\n switch (s.shape) {\n case 'rect': return {pts: [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]], closed: true};\n case 'ellipse': return {pts: [...Array(96).keys()].map((i) => { const a = (i / 96) * Math.PI * 2 - Math.PI / 2; return [Math.cos(a) * w / 2, Math.sin(a) * h / 2] as Vec2; }), closed: true};\n case 'polygon': {\n const r = val(s.radius, t, 100), n = s.sides ?? 6;\n return {pts: [...Array(n).keys()].map((i) => { const a = (i / n) * Math.PI * 2 - Math.PI / 2; return [Math.cos(a) * r, Math.sin(a) * r] as Vec2; }), closed: true};\n }\n default: return {pts: s.points ?? [], closed: s.closed ?? s.shape === 'path'};\n }\n};\n\nconst drawShape = (ctx: Ctx, s: ShapeLayer, t: number) => {\n const start = val(s.trim?.start, t, 0) / 100, end = val(s.trim?.end, t, 100) / 100;\n ctx.beginPath();\n if (s.trim && (start > 0 || end < 1)) {\n const {pts, closed} = outline(s, t);\n const all = closed ? [...pts, pts[0]] : pts;\n const lens = all.slice(1).map((p, i) => Math.hypot(p[0] - all[i][0], p[1] - all[i][1]));\n const total = lens.reduce((a, b) => a + b, 0);\n const a = Math.min(start, end) * total, z = Math.max(start, end) * total;\n let acc = 0, started = false;\n for (let i = 0; i < lens.length; i++) {\n const s0 = acc, s1 = acc + lens[i];\n acc = s1;\n if (s1 < a || s0 > z) continue;\n const p = (d: number): Vec2 => { const k = lens[i] ? (d - s0) / lens[i] : 0; return [all[i][0] + (all[i + 1][0] - all[i][0]) * k, all[i][1] + (all[i + 1][1] - all[i][1]) * k]; };\n const from = p(Math.max(a, s0)), to = p(Math.min(z, s1));\n if (!started) { ctx.moveTo(...from); started = true; }\n ctx.lineTo(...to);\n }\n } else if (s.shape === 'rect') {\n const [w, h] = val(s.size, t, [200, 200] as Vec2);\n ctx.roundRect(-w / 2, -h / 2, w, h, val(s.radius, t, 0));\n } else if (s.shape === 'ellipse') {\n const [w, h] = val(s.size, t, [200, 200] as Vec2);\n ctx.ellipse(0, 0, Math.abs(w / 2), Math.abs(h / 2), 0, 0, Math.PI * 2);\n } else {\n const {pts, closed} = outline(s, t);\n pts.forEach((p, i) => (i ? ctx.lineTo(...p) : ctx.moveTo(...p)));\n if (closed) ctx.closePath();\n }\n const trimmed = !!s.trim && (start > 0 || end < 1);\n if (s.fill && !trimmed && s.shape !== 'line') {\n if (typeof s.fill === 'object' && 'linear' in s.fill) {\n const g = ctx.createLinearGradient(...s.fill.linear.from, ...s.fill.linear.to);\n for (const [o, c] of s.fill.linear.stops) g.addColorStop(o, c);\n ctx.fillStyle = g;\n } else ctx.fillStyle = val(s.fill as string, t, '#fff');\n ctx.fill();\n }\n if (s.stroke) {\n ctx.strokeStyle = val(s.stroke, t, '#fff');\n ctx.lineWidth = val(s.strokeWidth, t, 4);\n ctx.lineCap = s.lineCap ?? 'round';\n ctx.lineJoin = 'round';\n ctx.stroke();\n }\n};\n", "// Layer bounds for selection outlines and click-to-select in the viewer.\nimport {val} from '../../core/anim.js';\nimport type {Composition, Layer, Vec2} from '../../core/model.js';\nimport {fontString, layoutText} from '../../core/text.js';\nimport type {Renderer} from '../../render/renderer.js';\n\ntype M = [number, number, number, number, number, number];\nexport const apply = (m: M, [x, y]: Vec2): Vec2 => [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\nexport const invert = (m: M): M | null => {\n const det = m[0] * m[3] - m[1] * m[2];\n if (Math.abs(det) < 1e-9) return null;\n return [m[3] / det, -m[1] / det, -m[2] / det, m[0] / det, (m[2] * m[5] - m[3] * m[4]) / det, (m[1] * m[4] - m[0] * m[5]) / det];\n};\n\n// Content rectangle [x, y, w, h] in layer space.\nexport const layerRect = (layer: Layer, comp: Composition, t: number, r: Renderer, ctx: CanvasRenderingContext2D): [number, number, number, number] | null => {\n switch (layer.type) {\n case 'solid': case 'image': case 'video': case 'precomp': {\n const [w, h] = r.layerSize(layer, comp, t);\n return [0, 0, w, h];\n }\n case 'shape': {\n if (layer.shape === 'rect' || layer.shape === 'ellipse') {\n const [w, h] = val(layer.size, t, [200, 200] as Vec2);\n return [-w / 2, -h / 2, w, h];\n }\n if (layer.shape === 'polygon') { const rad = val(layer.radius, t, 100); return [-rad, -rad, rad * 2, rad * 2]; }\n const pts = layer.points ?? [];\n if (!pts.length) return null;\n const xs = pts.map((p) => p[0]), ys = pts.map((p) => p[1]);\n const pad = val(layer.strokeWidth, t, 4) / 2 + 4;\n return [Math.min(...xs) - pad, Math.min(...ys) - pad, Math.max(...xs) - Math.min(...xs) + pad * 2, Math.max(...ys) - Math.min(...ys) + pad * 2];\n }\n case 'text': {\n const size = val(layer.size, t, 72);\n const L = layoutText(ctx, layer, size, val(layer.tracking, t, 0), fontString(layer, size, r.host.defaultFont));\n const x0 = Math.min(...L.lines.map((l) => l.x));\n return [x0, L.top, L.width, L.height];\n }\n default: return null;\n }\n};\n\nexport const layerQuad = (layer: Layer, comp: Composition, t: number, r: Renderer, ctx: CanvasRenderingContext2D): Vec2[] | null => {\n const rect = layerRect(layer, comp, t, r, ctx);\n if (!rect) return null;\n const m = r.matrix(layer, comp, t) as M;\n const [x, y, w, h] = rect;\n return [apply(m, [x, y]), apply(m, [x + w, y]), apply(m, [x + w, y + h]), apply(m, [x, y + h])];\n};\n\n// Topmost visible layer under a comp-space point.\nexport const hitTest = (pt: Vec2, comp: Composition, t: number, r: Renderer, ctx: CanvasRenderingContext2D): string | null => {\n for (const layer of comp.layers) {\n if (layer.hidden || layer.type === 'audio' || layer.type === 'null' || !r.isActive(layer, comp, t)) continue;\n const rect = layerRect(layer, comp, t, r, ctx);\n const inv = invert(r.matrix(layer, comp, t) as M);\n if (!rect || !inv) continue;\n const [lx, ly] = apply(inv, pt);\n if (lx >= rect[0] && lx <= rect[0] + rect[2] && ly >= rect[1] && ly <= rect[1] + rect[3]) return layer.id;\n }\n return null;\n};\n", "// Live preview: the shared Renderer drawing into a <canvas>, plus a selection overlay.\nimport {useEffect, useRef, useState} from 'preact/hooks';\nimport {val} from '../../core/anim.js';\nimport {isAnimated, type Vec2} from '../../core/model.js';\nimport {setKeyframe, setProperty} from '../../ops/ops.js';\nimport {Renderer} from '../../render/renderer.js';\nimport {hitTest, layerQuad} from './geometry.js';\nimport {BrowserHost} from './host.js';\nimport {currentComp, dragEnd, dragStart, dragUpdate, getState, setState, snap, useStore} from './store.js';\n\nexport const host = new BrowserHost();\nlet renderer: Renderer | null = null;\n// Frames render off-screen and are shown only when complete (no half-drawn frames while seeking video).\nconst back = document.createElement('canvas');\n\nexport const Viewer = () => {\n const project = useStore((s) => s.project);\n const time = useStore((s) => s.time);\n const compId = useStore((s) => s.comp);\n const selected = useStore((s) => s.layer);\n const playing = useStore((s) => s.playing);\n const wrap = useRef<HTMLDivElement>(null);\n const canvas = useRef<HTMLCanvasElement>(null);\n const overlay = useRef<HTMLCanvasElement>(null);\n const [box, setBox] = useState({w: 400, h: 600});\n const [renderMs, setRenderMs] = useState(0);\n const busy = useRef(false);\n const pending = useRef(false);\n const comp = project?.comps.find((c) => c.id === compId);\n\n // Fit the comp into the available space.\n useEffect(() => {\n const el = wrap.current;\n if (!el) return;\n const ro = new ResizeObserver(() => setBox({w: el.clientWidth - 24, h: el.clientHeight - 24}));\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const scale = comp ? Math.min(box.w / comp.width, box.h / comp.height) : 1;\n\n const draw = async () => {\n if (busy.current) { pending.current = true; return; }\n const s = getState();\n const c = currentComp();\n if (!s.project || !c || !canvas.current) return;\n busy.current = true;\n try {\n if (!renderer) renderer = new Renderer(s.project, host);\n renderer.project = s.project;\n host.playing = s.playing;\n const el = canvas.current;\n if (back.width !== c.width || back.height !== c.height) { back.width = c.width; back.height = c.height; }\n const ctx = back.getContext('2d')!;\n const t0 = performance.now();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, c.width, c.height);\n if (!c.background) { ctx.fillStyle = '#000'; ctx.fillRect(0, 0, c.width, c.height); }\n await renderer.renderComp(ctx, c, s.time);\n host.endFrame();\n if (el.width !== c.width || el.height !== c.height) { el.width = c.width; el.height = c.height; }\n el.getContext('2d')!.drawImage(back, 0, 0);\n el.dataset.time = String(s.time);\n setRenderMs(performance.now() - t0);\n drawOverlay();\n } catch (e) {\n setState({message: `Preview error: ${(e as Error).message}`});\n } finally {\n busy.current = false;\n if (pending.current) { pending.current = false; draw(); }\n }\n };\n\n const drawOverlay = () => {\n const s = getState();\n const c = currentComp();\n const o = overlay.current;\n if (!o || !c || !renderer) return;\n if (o.width !== c.width || o.height !== c.height) { o.width = c.width; o.height = c.height; }\n const ctx = o.getContext('2d')!;\n ctx.clearRect(0, 0, o.width, o.height);\n const layer = c.layers.find((l) => l.id === s.layer);\n if (!layer || s.playing || !renderer.isActive(layer, c, s.time)) return;\n const quad = layerQuad(layer, c, s.time, renderer, ctx);\n const lw = 2 / scale;\n ctx.strokeStyle = '#4da3ff';\n ctx.lineWidth = lw;\n if (quad) {\n ctx.beginPath();\n quad.forEach((p, i) => (i ? ctx.lineTo(...p) : ctx.moveTo(...p)));\n ctx.closePath();\n ctx.stroke();\n }\n const [px, py] = val(layer.transform?.position, s.time, [c.width / 2, c.height / 2] as Vec2);\n ctx.beginPath();\n ctx.arc(px, py, 6 / scale, 0, Math.PI * 2);\n ctx.moveTo(px - 12 / scale, py); ctx.lineTo(px + 12 / scale, py);\n ctx.moveTo(px, py - 12 / scale); ctx.lineTo(px, py + 12 / scale);\n ctx.stroke();\n };\n\n useEffect(() => { draw(); }, [project, time, compId, playing]);\n useEffect(() => { drawOverlay(); }, [selected, scale]);\n\n // Click selects the topmost layer; dragging moves the selected layer (keyframing if animated).\n const toComp = (e: PointerEvent): Vec2 => {\n const r = overlay.current!.getBoundingClientRect();\n return [((e.clientX - r.left) / r.width) * comp!.width, ((e.clientY - r.top) / r.height) * comp!.height];\n };\n const drag = useRef<{start: Vec2; pos: Vec2; layer: string; moved: boolean} | null>(null);\n const onDown = (e: PointerEvent) => {\n if (!comp || !renderer) return;\n const pt = toComp(e);\n const s = getState();\n const ctx = overlay.current!.getContext('2d')!;\n const target = hitTest(pt, comp, s.time, renderer, ctx);\n setState({layer: target, key: null});\n if (!target) return;\n const layer = comp.layers.find((l) => l.id === target)!;\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n drag.current = {start: pt, pos: val(layer.transform?.position, s.time, [comp.width / 2, comp.height / 2] as Vec2), layer: target, moved: false};\n };\n const onMove = (e: PointerEvent) => {\n const d = drag.current;\n if (!d || !comp) return;\n const pt = toComp(e);\n const dx = pt[0] - d.start[0], dy = pt[1] - d.start[1];\n if (!d.moved && Math.hypot(dx, dy) * scale < 3) return;\n if (!d.moved) { d.moved = true; dragStart(); }\n const t = snap(getState().time, comp.fps);\n const next: Vec2 = [Math.round(d.pos[0] + dx), Math.round(d.pos[1] + (e.shiftKey ? 0 : dy))];\n dragUpdate((p) => {\n const layer = p.comps.find((c) => c.id === comp.id)!.layers.find((l) => l.id === d.layer)!;\n if (isAnimated(layer.transform?.position)) setKeyframe(p, d.layer, 'transform.position', t, next);\n else setProperty(p, d.layer, 'transform.position', next);\n });\n };\n const onUp = () => { if (drag.current?.moved) dragEnd(); drag.current = null; };\n\n if (!comp) return <div class=\"viewer\" ref={wrap} />;\n const style = {width: `${comp.width * scale}px`, height: `${comp.height * scale}px`};\n return (\n <div class=\"viewer\" ref={wrap}>\n <div class=\"stage\" style={style}>\n <canvas ref={canvas} class=\"frame\" style={style} />\n <canvas ref={overlay} class=\"overlay\" style={style} onPointerDown={onDown} onPointerMove={onMove} onPointerUp={onUp} />\n </div>\n <div class=\"viewer-info\">{comp.width}\u00D7{comp.height} \u00B7 {Math.round(scale * 100)}% \u00B7 {renderMs.toFixed(0)} ms/frame</div>\n </div>\n );\n};\n", "// DT.ly Studio \u2014 browser preview and timeline editor.\nimport {render} from 'preact';\nimport {useEffect, useState} from 'preact/hooks';\nimport type {NewLayer} from '../../core/model.js';\nimport {addComp, addLayer, removeKeyframe, removeLayer, shiftLayer, duplicateLayer, updateLayer} from '../../ops/ops.js';\nimport {PRESETS} from '../../presets/index.js';\nimport {config} from './config.js';\nimport {AudioPreview, loadFonts} from './host.js';\nimport {Inspector} from './Inspector.js';\nimport {connectEvents, currentComp, edit, getState, load, redo, selectedLayer, setState, snap, startRender, undo, useStore} from './store.js';\nimport {keyTimes, Timeline} from './Timeline.js';\nimport {host, Viewer} from './Viewer.js';\nimport './styles.css';\n\nconst audio = new AudioPreview();\n\n// --- playback -------------------------------------------------------------------------------\nlet raf = 0;\nconst play = () => {\n const comp = currentComp();\n if (!comp) return;\n if (getState().time >= comp.duration - 1 / comp.fps) setState({time: 0});\n const start = performance.now() - getState().time * 1000;\n setState({playing: true});\n const tick = (now: number) => {\n const s = getState();\n const c = currentComp();\n if (!s.playing || !c) return;\n let t = (now - start) / 1000;\n if (t >= c.duration) {\n if (s.loop) { t = 0; stop(); setState({time: 0}); play(); return; }\n stop();\n setState({time: snap(c.duration - 1 / c.fps, c.fps)});\n return;\n }\n setState({time: t});\n audio.sync(s.project!, c, t, true);\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n};\nconst stop = () => {\n cancelAnimationFrame(raf);\n const c = currentComp();\n setState({playing: false, time: c ? snap(getState().time, c.fps) : getState().time});\n audio.stop();\n host.stopAll();\n};\nconst toggle = () => (getState().playing ? stop() : play());\n\n// --- adding layers --------------------------------------------------------------------------\nconst addAndSelect = (layer: NewLayer) => {\n const comp = currentComp()!;\n let id = '';\n edit((p) => { id = addLayer(p, comp.id, {inPoint: snap(getState().time, comp.fps), ...layer} as NewLayer).id; });\n if (id) setState({layer: id, key: null});\n};\nconst ADD: Record<string, () => void> = {\n Text: () => addAndSelect({type: 'text', name: 'Text', text: 'Your text', size: Math.round(currentComp()!.width / 10), color: '#ffffff', weight: 800} as NewLayer),\n Shape: () => addAndSelect({type: 'shape', name: 'Shape', shape: 'ellipse', size: [300, 300], fill: '#E8692A'} as NewLayer),\n Solid: () => addAndSelect({type: 'solid', name: 'Solid', color: '#1f2933'} as NewLayer),\n Null: () => addAndSelect({type: 'null', name: 'Null'} as NewLayer),\n 'Image / video / audio\u2026': () => {\n const src = prompt('Path to the file, relative to the project file:');\n if (!src) return;\n const type = /\\.(mp4|mov|webm|m4v)$/i.test(src) ? 'video' : /\\.(mp3|wav|m4a|aac|ogg)$/i.test(src) ? 'audio' : 'image';\n addAndSelect({type, name: src.split('/').pop(), src} as NewLayer);\n },\n 'New comp (precomp)\u2026': () => {\n const id = prompt('Id for the new composition:');\n if (!id) return;\n const comp = currentComp()!;\n edit((p) => { addComp(p, {id, name: id, duration: comp.duration, width: comp.width, height: comp.height, fps: comp.fps}); });\n addAndSelect({type: 'precomp', name: id, comp: id} as NewLayer);\n },\n};\n\n// --- presets dialog -------------------------------------------------------------------------\nconst PresetDialog = ({onClose}: {onClose: () => void}) => {\n const layer = selectedLayer();\n const [name, setName] = useState(layer?.type === 'text' ? 'text.fadeUp' : 'opener.logoReveal');\n const preset = PRESETS[name];\n const defaults = (n: string) => {\n const p = PRESETS[n];\n if (p.kind === 'text' || n === 'element.highlightWord') return {layer: getState().layer ?? ''};\n if (n === 'opener.logoReveal' || n === 'opener.bars') return {title: 'Your Brand', start: snap(getState().time, 30)};\n if (n === 'kinetic.sequence') return {phrases: ['Make', 'it', 'move'], start: snap(getState().time, 30), style: 'slam'};\n if (n === 'element.lowerThird') return {name: 'Your Name', title: 'Your title', start: snap(getState().time, 30)};\n if (n === 'transition.between') return {from: '', to: '', type: 'push', duration: 0.5};\n if (n === 'slides.slideshow') return {items: [{src: 'photo1.jpg', caption: 'Caption'}], each: 3, transition: 'push'};\n return {};\n };\n const [params, setParams] = useState(JSON.stringify(defaults(name), null, 2));\n const [error, setError] = useState('');\n const groups = ['text', 'kinetic', 'opener', 'slides', 'transition', 'element'];\n return (\n <div class=\"modal\" onClick={onClose}>\n <div class=\"dialog\" onClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()}>\n <div class=\"dialog-list\">\n {groups.map((g) => (\n <div key={g}>\n <div class=\"group\">{g}</div>\n {Object.entries(PRESETS).filter(([, p]) => p.kind === g).map(([n]) => (\n <button key={n} class={n === name ? 'active' : ''} onClick={() => { setName(n); setParams(JSON.stringify(defaults(n), null, 2)); setError(''); }}>{n.split('.')[1]}</button>\n ))}\n </div>\n ))}\n </div>\n <div class=\"dialog-body\">\n <h3>{name}</h3>\n <p>{preset.description}</p>\n <p class=\"hint\">Params: {preset.params}</p>\n <textarea rows={10} value={params} spellcheck={false} onInput={(e) => setParams((e.target as HTMLTextAreaElement).value)} />\n {error && <div class=\"error\">{error}</div>}\n <div class=\"row\">\n <button onClick={onClose}>Cancel</button>\n <button class=\"primary\" onClick={() => {\n try {\n const parsed = JSON.parse(params);\n let created: string[] = [];\n const before = getState().project;\n edit((p) => { created = preset.apply(p, getState().comp, parsed).created; });\n if (getState().project === before) throw new Error(getState().message || 'Preset failed');\n if (created[0]) setState({layer: created[0]});\n onClose();\n } catch (e) { setError((e as Error).message); }\n }}>Apply</button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// --- keyboard -------------------------------------------------------------------------------\nconst onKey = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if (target.closest?.('input, textarea, select')) return;\n const s = getState();\n const comp = currentComp();\n if (!comp) return;\n const mod = e.metaKey || e.ctrlKey;\n const frame = 1 / comp.fps;\n const go = (t: number) => setState({time: Math.max(0, Math.min(comp.duration, snap(t, comp.fps))), playing: false});\n if (e.code === 'Space') { e.preventDefault(); toggle(); }\n else if (mod && e.key.toLowerCase() === 'z') { e.preventDefault(); e.shiftKey ? redo() : undo(); }\n else if (mod && e.key.toLowerCase() === 'y') { e.preventDefault(); redo(); }\n else if (mod && e.key.toLowerCase() === 'd' && s.layer) { e.preventDefault(); edit((p) => { const c = duplicateLayer(p, s.layer!); setState({layer: c.id}); }); }\n else if (e.key === 'ArrowLeft') { e.preventDefault(); go(s.time - frame * (e.shiftKey ? 10 : 1)); }\n else if (e.key === 'ArrowRight') { e.preventDefault(); go(s.time + frame * (e.shiftKey ? 10 : 1)); }\n else if (e.key === 'Home') go(0);\n else if (e.key === 'End') go(comp.duration - frame);\n else if ((e.key === 'j' || e.key === 'k') && s.layer) {\n const ts = keyTimes(s.layer);\n const t = e.key === 'j' ? [...ts].reverse().find((x) => x < s.time - 1e-3) : ts.find((x) => x > s.time + 1e-3);\n if (t !== undefined) go(t);\n }\n else if (e.key === '[' && s.layer) edit((p) => { const l = p.comps.find((c) => c.id === comp.id)!.layers.find((x) => x.id === s.layer)!; shiftLayer(p, s.layer!, snap(s.time, comp.fps) - (l.inPoint ?? 0)); });\n else if (e.key === ']' && s.layer) edit((p) => updateLayer(p, s.layer!, {outPoint: snap(s.time, comp.fps)}));\n else if (e.key === 'Delete' || e.key === 'Backspace') {\n if (s.key) { edit((p) => removeKeyframe(p, s.key!.layer, s.key!.path, s.key!.t)); setState({key: null}); }\n else if (s.layer) { edit((p) => removeLayer(p, s.layer!)); setState({layer: null}); }\n }\n else if (e.key === 'Escape') setState({layer: null, key: null});\n else if (e.key === '=' || e.key === '+') setState({zoom: Math.min(2000, s.zoom * 1.25)});\n else if (e.key === '-') setState({zoom: Math.max(10, s.zoom / 1.25)});\n};\n\n// --- layout ---------------------------------------------------------------------------------\nconst fmtTime = (t: number, fps: number) => {\n const f = Math.round(t * fps);\n const sec = Math.floor(f / fps);\n return `${String(Math.floor(sec / 60)).padStart(2, '0')}:${String(sec % 60).padStart(2, '0')}:${String(f % fps).padStart(2, '0')}`;\n};\n\nconst Transport = () => {\n const time = useStore((s) => s.time);\n const playing = useStore((s) => s.playing);\n const loop = useStore((s) => s.loop);\n const zoom = useStore((s) => s.zoom);\n const comp = currentComp();\n if (!comp) return null;\n return (\n <div class=\"transport\">\n <button title=\"Start (Home)\" onClick={() => setState({time: 0})}>\u23EE</button>\n <button title=\"Previous frame (\u2190)\" onClick={() => setState({time: Math.max(0, snap(time - 1 / comp.fps, comp.fps))})}>\u25C0\uFE0E</button>\n <button class=\"play\" title=\"Play / pause (Space)\" onClick={toggle}>{playing ? '\u275A\u275A' : '\u25B6'}</button>\n <button title=\"Next frame (\u2192)\" onClick={() => setState({time: Math.min(comp.duration, snap(time + 1 / comp.fps, comp.fps))})}>\u25B6\uFE0E</button>\n <button class={loop ? 'on' : ''} title=\"Loop\" onClick={() => setState({loop: !loop})}>\u27F2</button>\n <span class=\"timecode\">{fmtTime(time, comp.fps)}</span>\n <span class=\"muted\">{time.toFixed(2)}s / {comp.duration}s</span>\n <span class=\"spacer\" />\n <span class=\"muted\">Zoom</span>\n <button onClick={() => setState({zoom: Math.max(10, zoom / 1.25)})}>\u2212</button>\n <button onClick={() => setState({zoom: Math.min(2000, zoom * 1.25)})}>+</button>\n </div>\n );\n};\n\nconst TopBar = ({onPresets}: {onPresets: () => void}) => {\n const project = useStore((s) => s.project);\n const compId = useStore((s) => s.comp);\n const status = useStore((s) => s.status);\n const message = useStore((s) => s.message);\n const warnings = useStore((s) => s.warnings);\n const rend = useStore((s) => s.render);\n const [menu, setMenu] = useState(false);\n return (\n <header class=\"topbar\">\n <div class=\"brand\"><b>DT.ly</b> Studio <span class=\"muted\">\u00B7 {config.file}</span></div>\n <nav class=\"comps\">\n {project?.comps.map((c) => (\n <button key={c.id} class={c.id === compId ? 'active' : ''} onClick={() => { stop(); setState({comp: c.id, layer: null, key: null, time: 0}); }}>\n {c.name ?? c.id}{project.root === c.id ? ' \u2605' : ''}\n </button>\n ))}\n </nav>\n <div class=\"actions\">\n <div class=\"menu-wrap\">\n <button onClick={() => setMenu(!menu)}>+ Layer \u25BE</button>\n {menu && <div class=\"menu\" onMouseLeave={() => setMenu(false)}>{Object.entries(ADD).map(([k, fn]) => <button key={k} onClick={() => { setMenu(false); fn(); }}>{k}</button>)}</div>}\n </div>\n <button onClick={onPresets}>Presets\u2026</button>\n <button title=\"Undo (\u2318Z)\" onClick={undo}>\u21B6</button>\n <button title=\"Redo (\u21E7\u2318Z)\" onClick={redo}>\u21B7</button>\n <button class=\"primary\" disabled={rend.active} onClick={() => { stop(); startRender(); }}>\n {rend.active ? `Rendering ${rend.total ? Math.round(((rend.done ?? 0) / rend.total) * 100) : 0}%` : 'Render MP4'}\n </button>\n </div>\n <div class={`status ${status}`} title={warnings.join('\\n')}>\n {message || (status === 'saving' ? 'Saving\u2026' : status === 'error' ? 'Save failed' : status === 'reloaded' ? 'Reloaded from disk' : 'Saved')}\n {warnings.length > 0 && <span class=\"warn\"> \u00B7 {warnings.length} warning{warnings.length > 1 ? 's' : ''}</span>}\n {rend.out && !rend.active && <a href={`/api/media?src=${encodeURIComponent(rend.out)}&token=${config.token}`} target=\"_blank\"> \u00B7 open {rend.out}</a>}\n {rend.error && <span class=\"error\"> \u00B7 render failed: {rend.error}</span>}\n </div>\n </header>\n );\n};\n\nconst App = () => {\n const project = useStore((s) => s.project);\n const [presets, setPresets] = useState(false);\n useEffect(() => {\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n if (!project) return <div class=\"loading\">Loading project\u2026</div>;\n return (\n <div class=\"app\">\n <TopBar onPresets={() => setPresets(true)} />\n <main class=\"workspace\">\n <Viewer />\n <Inspector />\n </main>\n <section class=\"bottom\">\n <Transport />\n <Timeline />\n </section>\n {presets && <PresetDialog onClose={() => setPresets(false)} />}\n </div>\n );\n};\n\n(async () => {\n document.title = `${config.file} \u2014 DT.ly Studio`;\n await load();\n // Fit the whole comp into the timeline width on open.\n const c = currentComp();\n if (c) setState({zoom: Math.max(20, Math.min(400, (window.innerWidth - 260) / c.duration))});\n await loadFonts(getState().project!);\n connectEvents();\n render(<App />, document.getElementById('root')!);\n})();\n\n"],
5
- "mappings": "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",
6
- "names": ["options", "vnodeId", "isValidElement", "rerenderQueue", "prevDebounce", "rerenderCount", "depthSort", "EVENT_DISPATCHED", "CAPTURE_REGEX", "eventClock", "eventProxies", "i", "EMPTY_OBJ", "EMPTY_ARR", "MATHML_TOKEN_ELEMENTS", "isArray", "Array", "slice", "assign", "Object", "removeNode", "node", "parentNode", "remove", "createVNode", "type", "props", "key", "ref", "original", "vnode", "__k", "__", "__b", "__e", "__c", "constructor", "__v", "vnodeId", "__i", "__u", "options", "Fragment", "props", "children", "BaseComponent", "context", "this", "__g", "getDomSibling", "vnode", "childIndex", "__", "__i", "sibling", "__k", "length", "__e", "type", "__P", "updateParentDomPointers", "__c", "some", "child", "enqueueRender", "c", "rerenderQueue", "push", "rerenderCount", "prevDebounce", "options", "debounceRendering", "queueMicrotask", "process", "l", "component", "newVNode", "oldVNode", "oldDom", "commitQueue", "refQueue", "parentDom", "sort", "depthSort", "shift", "__v", "assign", "constructor", "undefined", "diff", "__n", "namespaceURI", "__u", "commitRoot", "diffChildren", "renderResult", "newParentVNode", "oldParentVNode", "globalContext", "namespace", "excessDomChildren", "isHydrating", "i", "childVNode", "newDom", "firstChildDom", "result", "oldChildren", "EMPTY_ARR", "newChildrenLength", "constructNewChildrenArray", "EMPTY_OBJ", "ref", "applyRef", "insert", "nextSibling", "skewedIndex", "matchingIndex", "tails", "lisLengths", "hi", "mid", "oldChildrenLength", "remainingOldChildren", "skew", "moved", "newChildren", "Array", "String", "createVNode", "isArray", "__b", "key", "findMatchingIndex", "unmount", "parentVNode", "isMounting", "dom", "next", "parentNode", "nodeType", "moveBefore", "insertBefore", "data", "startsWith", "findMatchingIndex", "childVNode", "oldChildren", "skewedIndex", "remainingOldChildren", "x", "key", "type", "oldVNode", "matched", "__u", "length", "setStyle", "style", "value", "setProperty", "dom", "name", "oldValue", "namespace", "useCapture", "proxy", "cssText", "__e", "eventProxies", "createEventProxy", "__a", "eventClock", "replace", "CAPTURE_REGEX", "slice", "toLowerCase", "addEventListener", "removeEventListener", "e", "removeAttribute", "setAttribute", "eventHandler", "this", "EVENT_DISPATCHED", "options", "event", "diff", "parentDom", "newVNode", "globalContext", "excessDomChildren", "commitQueue", "oldDom", "isHydrating", "refQueue", "tmp", "resumed", "oldCommitQueueLength", "c", "oldProps", "oldState", "snapshot", "newProps", "isClassComponent", "provider", "componentContext", "renderHook", "count", "renderResult", "commentMarkersToFind", "startMarker", "i", "child", "newType", "constructor", "__c", "__z", "nodeType", "rangeEnd", "push", "__b", "outer", "props", "prototype", "render", "contextType", "__", "__g", "BaseComponent", "doRender", "sub", "state", "__n", "__h", "__k", "__s", "getDerivedStateFromProps", "assign", "__v", "componentWillReceiveProps", "shouldComponentUpdate", "some", "vnode", "EMPTY_ARR", "apply", "getDomSibling", "componentWillUpdate", "componentDidUpdate", "componentWillMount", "componentDidMount", "context", "__P", "__r", "getChildContext", "getSnapshotBeforeUpdate", "Fragment", "children", "namespaceURI", "unmount", "diffChildren", "isArray", "removeNode", "then", "indexOf", "undefined", "data", "startsWith", "nextSibling", "markAsForce", "diffElementNodes", "diffed", "start", "nodes", "depth", "commitRoot", "root", "applyRef", "cb", "call", "newHtml", "oldHtml", "newChildren", "inputValue", "checked", "doc", "shouldRevalidateProps", "EMPTY_OBJ", "localName", "ownerDocument", "document", "createTextNode", "createElementNS", "is", "__m", "content", "defaultValue", "childNodes", "attributes", "__html", "innerHTML", "textContent", "MATHML_TOKEN_ELEMENTS", "test", "ref", "owner", "__x", "current", "parentVNode", "skipRemove", "r", "end", "componentWillUnmount", "documentElement", "createVNode", "firstChild", "options", "__e", "error", "vnode", "oldVNode", "errorInfo", "component", "ctor", "handled", "__", "__c", "__g", "constructor", "getDerivedStateFromError", "setState", "componentDidCatch", "e", "rerenderCount", "vnodeId", "isValidElement", "BaseComponent", "prototype", "update", "callback", "s", "this", "__s", "state", "assign", "props", "__v", "__k", "push", "enqueueRender", "forceUpdate", "__h", "render", "Fragment", "rerenderQueue", "depthSort", "a", "b", "__b", "EVENT_DISPATCHED", "Symbol", "CAPTURE_REGEX", "eventClock", "eventProxies", "i", "currentIndex", "currentComponent", "previousComponent", "prevRaf", "ObjectIs", "Object", "is", "currentHook", "afterPaintEffects", "unmountCleanups", "options", "_options", "oldBeforeDiff", "__b", "oldBeforeRender", "__r", "oldAfterDiff", "diffed", "oldCommit", "__c", "oldBeforeUnmount", "unmount", "oldRoot", "__", "getHookState", "index", "type", "__h", "hooks", "__H", "length", "push", "useState", "initialState", "useReducer", "invokeOrReturn", "reducer", "init", "hookState", "_reducer", "action", "currentValue", "__N", "nextValue", "setState", "__f", "prevScu", "shouldComponentUpdate", "p", "s", "c", "this", "updatedHook", "shouldUpdate", "props", "some", "hookItem", "result", "call", "useEffect", "callback", "args", "state", "__s", "argsChanged", "__P", "_pendingArgs", "useRef", "initialValue", "currentHook", "useMemo", "current", "useMemo", "factory", "args", "state", "getHookState", "currentIndex", "argsChanged", "__H", "__", "flushAfterPaintEffects", "component", "unmountCleanups", "shift", "invokeCleanup", "e", "options", "__e", "__", "__P", "__v", "afterPaintEffects", "hooks", "__H", "__h", "some", "invokeEffect", "length", "__b", "vnode", "currentComponent", "oldBeforeDiff", "parentDom", "__k", "__m", "oldRoot", "__r", "oldBeforeRender", "currentIndex", "__c", "previousComponent", "hookItem", "__N", "_pendingArgs", "diffed", "oldAfterDiff", "c", "afterPaint", "push", "commitQueue", "filter", "cb", "oldCommit", "unmount", "oldBeforeUnmount", "hasErrored", "errorParent", "s", "HAS_RAF", "requestAnimationFrame", "afterNextFrame", "callback", "raf", "done", "clearTimeout", "timeout", "cancelAnimationFrame", "setTimeout", "newQueueLength", "prevRaf", "hook", "comp", "cleanup", "argsChanged", "oldArgs", "newArgs", "arg", "index", "ObjectIs", "invokeOrReturn", "f", "isAnimated", "p", "OpError", "getComp", "p", "id", "c", "OpError", "findLayer", "layerId", "comp", "index", "l", "allIds", "uniqueId", "base", "ids", "clean", "addComp", "x", "root", "updateComp", "patch", "addLayer", "compId", "layer", "full", "isPlainObject", "v", "deepMerge", "target", "k", "updateLayer", "removeLayer", "moveLayer", "toIndex", "eachKeyframes", "fn", "shiftLayer", "delta", "kfs", "duplicateLayer", "opts", "copy", "splitPath", "path", "s", "getAt", "obj", "o", "setAt", "value", "keys", "i", "TIME_EPS", "setProperty", "setKeyframe", "t", "ease", "cur", "isAnimated", "anchorT", "existing", "a", "b", "removeKeyframe", "moveKeyframe", "from", "to", "setEase", "TEXT_ANIMATORS", "num", "v", "d", "str", "r3", "t", "kf", "k", "ease", "PRESETS", "name", "def", "TEXT_ANIMATORS", "p", "_comp", "o", "layer", "findLayer", "OpError", "anims", "a", "compId", "comp", "getComp", "phrases", "pos", "size", "style", "emphasis", "w", "created", "holdLast", "text", "i", "words", "each", "last", "outPoint", "isEmph", "addLayer", "t0", "cx", "cy", "color", "accent", "r", "add", "l", "colors", "dir", "barH", "c", "ts", "items", "td", "ids", "it", "start", "end", "type", "zoomIn", "types", "b", "t1", "t2", "W", "H", "center", "id", "e", "setKeyframe", "updateLayer", "dur", "y", "x", "bar", "mk", "dy", "delay", "_c", "at", "config", "bezier", "x1", "y1", "x2", "y2", "cx", "bx", "ax", "cy", "by", "ay", "sx", "t", "sy", "dx", "x", "i", "e", "d", "lo", "hi", "v", "CURVES", "cache", "elasticOut", "bounceOut", "spring", "elapsed", "stiffness", "damping", "mass", "w0", "zeta", "wd", "applyEase", "ease", "segSeconds", "pts", "key", "fn", "EASE_NAMES", "NAMED", "parseColor", "c", "s", "h", "ch", "n", "i", "m", "p", "rgbaString", "r", "g", "b", "a", "lerp", "a", "b", "p", "interpolate", "v", "ca", "parseColor", "cb", "rgbaString", "i", "hash", "n", "x", "noise", "seed", "f", "u", "wiggle", "value", "w", "off", "dim", "evalKeyframes", "kfs", "last", "seg", "applyEase", "val", "fallback", "isAnimated", "sorted", "mediaUrl", "src", "config", "waitFor", "el", "event", "ms", "resolve", "done", "timer", "BrowserHost", "w", "h", "c", "reject", "img", "layer", "sourceTime", "fps", "key", "v", "t", "ctx", "vw", "vh", "fit", "s", "AudioPreview", "project", "comp", "playing", "live", "l", "inP", "outP", "speed", "vol", "val", "k", "loadFonts", "faces", "family", "files", "f", "vnodeId", "createVNode", "type", "props", "key", "isStaticChildren", "__source", "__self", "ref", "i", "normalizedProps", "vnode", "__k", "__", "__b", "__e", "__c", "constructor", "__v", "vnodeId", "__i", "__u", "options", "fmt", "n", "NumberField", "value", "onChange", "onDragStart", "onDragEnd", "step", "min", "max", "title", "editing", "setEditing", "d", "drag", "T", "clamp", "v", "u", "e", "dx", "VecField", "labels", "i", "x", "j", "toHex", "c", "m", "ColorField", "TextField", "multiline", "Select", "options", "state", "listeners", "getState", "setState", "patch", "l", "useStore", "select", "force", "d", "A", "n", "api", "path", "init", "config", "undoStack", "redoStack", "MAX_HISTORY", "saveTimer", "scheduleSave", "save", "r", "rev", "warnings", "edit", "fn", "before", "next", "e", "dragBase", "dragStart", "dragUpdate", "dragEnd", "undo", "prev", "redo", "load", "fromDisk", "project", "comp", "c", "layer", "connectEvents", "es", "startRender", "currentComp", "selectedLayer", "animatedPaths", "out", "walk", "v", "x", "i", "isAnimated", "k", "getPath", "obj", "o", "snap", "t", "fps", "Prop", "layer", "path", "label", "kind", "fallback", "step", "min", "max", "time", "useStore", "s", "comp", "currentComp", "raw", "getPath", "animated", "isAnimated", "value", "val", "t", "snap", "apply", "p", "v", "setKeyframe", "setProperty", "onChange", "dragging", "dragUpdate", "edit", "keys", "k", "onKey", "prev", "next", "toggleWatch", "toggleKey", "removeKeyframe", "u", "NumberField", "dragStart", "dragEnd", "VecField", "ColorField", "setState", "Field", "children", "set", "patch", "updateLayer", "num", "key", "d", "Section", "title", "open", "JsonEditor", "onApply", "rows", "text", "draft", "setDraft", "error", "setError", "A", "e", "KeyPanel", "project", "findLayer", "x", "ease", "mode", "setE", "setEase", "Select", "EASE_NAMES", "m", "EaseGraph", "pts", "i", "y", "applyEase", "defaultAnchor", "c", "getState", "LayerPanel", "others", "l", "idx", "fonts", "TextField", "moveLayer", "duplicateLayer", "removeLayer", "PRESETS", "pr", "name", "CompPanel", "up", "updateComp", "Inspector", "compId", "layerId", "LABEL_W", "TYPE_COLOR", "PROP_LABEL", "path", "ticks", "duration", "zoom", "step", "s", "out", "t", "trackPointer", "move", "done", "up", "keyShape", "k", "Timeline", "project", "useStore", "compId", "time", "sel", "key", "expanded", "tracks", "T", "comp", "c", "u", "width", "fps", "xToTime", "clientX", "r", "snapT", "ct", "getState", "snap", "scrub", "e", "setState", "scrubMove", "barDrag", "layer", "mode", "x0", "inP", "outP", "started", "ev", "dt", "dragStart", "dragUpdate", "p", "target", "shiftLayer", "updateLayer", "dragEnd", "keyDrag", "t0", "to", "moveKeyframe", "addKeyAt", "cur", "getPath", "v", "val", "edit", "setKeyframe", "tickList", "m", "idx", "props", "animatedPaths", "open", "pr", "i", "next", "ki", "active", "keyTimes", "layerId", "findLayer", "a", "b", "segmenter", "graphemes", "s", "g", "fontString", "layer", "size", "fallbackFamily", "layoutCache", "layoutText", "ctx", "tracking", "font", "key", "hit", "sentinel", "advance", "measure", "lineHeight", "rawLines", "para", "cur", "word", "next", "align", "top", "out", "gi", "wi", "line", "li", "w", "x0", "y", "gs", "prefix", "wordStart", "wordText", "flushWord", "endX", "i", "x", "gw", "rank", "n", "order", "seed", "a", "b", "unitState", "animators", "unitIndex", "counts", "lt", "layerDur", "baseColor", "stagger", "dur", "delay", "r", "maxRank", "p", "start", "applyEase", "q", "f", "c0", "parseColor", "c1", "rgbaString", "v", "k", "roundRect", "h", "drawText", "t", "inPoint", "outPoint", "val", "color", "L", "px", "py", "reveal", "l", "bw", "bh", "paint", "fill", "finest", "units", "clip", "lineCounts", "u", "lineIdx", "idxInLine", "st", "spread", "cx", "cy", "mul", "m", "n", "BLEND", "Renderer", "project", "host", "id", "c", "w", "h", "ctx", "k", "layer", "comp", "t", "depth", "tr", "size", "anchor", "val", "pos", "sx", "sy", "rot", "skew", "cos", "sin", "p", "l", "withBackground", "matteSources", "i", "target", "opacity", "baked", "effects", "e", "DIRECT_EFFECTS", "filters", "filterString", "buf", "b", "span", "st", "mask", "x", "src", "mb", "glow", "strength", "gc", "shadow", "dist", "ang", "parseColor", "rgbaString", "inP", "drawShape", "drawText", "img", "drawFitted", "srcTime", "frame", "child", "ct", "r", "fit", "s", "dw", "dh", "outline", "a", "start", "end", "pts", "closed", "all", "lens", "total", "z", "acc", "started", "s0", "s1", "d", "from", "to", "trimmed", "g", "o", "apply", "m", "x", "y", "invert", "det", "layerRect", "layer", "comp", "t", "r", "ctx", "w", "h", "val", "rad", "pts", "xs", "p", "ys", "pad", "size", "L", "layoutText", "fontString", "l", "layerQuad", "rect", "hitTest", "pt", "inv", "lx", "ly", "host", "BrowserHost", "renderer", "back", "Viewer", "project", "useStore", "s", "time", "compId", "selected", "playing", "wrap", "T", "canvas", "overlay", "box", "setBox", "d", "renderMs", "setRenderMs", "busy", "pending", "comp", "c", "A", "el", "ro", "scale", "draw", "getState", "currentComp", "Renderer", "ctx", "t0", "drawOverlay", "e", "setState", "o", "layer", "l", "quad", "layerQuad", "lw", "p", "i", "px", "py", "val", "toComp", "r", "drag", "onDown", "pt", "target", "hitTest", "onMove", "dx", "dy", "dragStart", "t", "snap", "next", "dragUpdate", "isAnimated", "setKeyframe", "setProperty", "onUp", "dragEnd", "u", "style", "audio", "AudioPreview", "raf", "play", "comp", "currentComp", "getState", "setState", "start", "tick", "now", "s", "c", "t", "stop", "snap", "host", "toggle", "addAndSelect", "layer", "id", "edit", "p", "addLayer", "ADD", "src", "type", "addComp", "PresetDialog", "onClose", "selectedLayer", "name", "setName", "d", "preset", "PRESETS", "defaults", "n", "params", "setParams", "error", "setError", "u", "e", "g", "parsed", "created", "before", "onKey", "mod", "frame", "go", "redo", "undo", "duplicateLayer", "ts", "keyTimes", "x", "l", "shiftLayer", "updateLayer", "removeKeyframe", "removeLayer", "fmtTime", "fps", "f", "sec", "Transport", "time", "useStore", "playing", "loop", "zoom", "TopBar", "onPresets", "project", "compId", "status", "message", "warnings", "rend", "menu", "setMenu", "config", "k", "fn", "startRender", "App", "presets", "setPresets", "A", "Viewer", "Inspector", "Timeline", "load", "loadFonts", "connectEvents", "J"]
3
+ "sources": ["../../node_modules/preact/src/constants.js", "../../node_modules/preact/src/options.js", "../../node_modules/preact/src/create-element.js", "../../node_modules/preact/src/component.js", "../../node_modules/preact/src/diff/props.js", "../../node_modules/preact/src/create-context.js", "../../node_modules/preact/src/util.js", "../../node_modules/preact/src/diff/children.js", "../../node_modules/preact/src/diff/index.js", "../../node_modules/preact/src/render.js", "../../node_modules/preact/src/create-portal.js", "../../node_modules/preact/src/diff/catch-error.js", "../../node_modules/preact/hooks/src/index.js", "../../src/core/model.ts", "../../src/core/color.ts", "../../src/core/path.ts", "../../src/core/svg.ts", "../../src/ops/ops.ts", "../../src/presets/text.ts", "../../src/presets/charts.ts", "../../src/presets/app.ts", "../../src/core/captions.ts", "../../src/presets/captions.ts", "../../src/core/geo.ts", "../../src/presets/maps.ts", "../../src/presets/index.ts", "../../src/studio/app/config.ts", "../../src/core/ease.ts", "../../src/core/anim.ts", "../../src/studio/app/host.ts", "../../node_modules/preact/jsx-runtime/src/utils.js", "../../node_modules/preact/jsx-runtime/src/index.js", "../../src/studio/app/fields.tsx", "../../src/studio/app/store.ts", "../../src/studio/app/Inspector.tsx", "../../src/studio/app/Timeline.tsx", "../../src/core/text.ts", "../../src/render/shapes.ts", "../../src/render/fx.ts", "../../src/render/grade.ts", "../../src/render/perspective.ts", "../../src/render/lottie.ts", "../../src/render/renderer.ts", "../../src/studio/app/geometry.ts", "../../src/studio/app/Viewer.tsx", "../../src/studio/app/main.tsx"],
4
+ "sourcesContent": ["// Vnode._flags\n/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n/** Indicates that this vnode has been unmounted before indicating the loss of event listeners */\nexport const FORCE_PROPS_REVALIDATE = 1 << 0;\n/** The vnode's ref was detached while its subtree was parked by Suspense */\nexport const REF_DETACHED = 1 << 3;\n\n// component._bits\n/** Component is processing an exception */\nexport const COMPONENT_PROCESSING_EXCEPTION = 1 << 0;\n/** Component has a pending error */\nexport const COMPONENT_PENDING_ERROR = 1 << 1;\n/** Component should force update (skip shouldComponentUpdate) */\nexport const COMPONENT_FORCE = 1 << 2;\n/** Component is queued for update */\nexport const COMPONENT_DIRTY = 1 << 3;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\n\nexport const MATHML_TOKEN_ELEMENTS = /^m(i|n|o|s|text|space)$/;\n\n/** Matched new vnode eligible for the longest increasing subsequence. */\nexport const LIS_CANDIDATE = 1 << 4;\n", "import { _catchError } from './diff/catch-error';\n\n/**\n * The `option` object can potentially contain callback functions\n * that are called during various stages of our renderer. This is the\n * foundation on which all our addons like `preact/debug`, `preact/compat`,\n * and `preact/hooks` are based on. See the `Options` type in `internal.d.ts`\n * for a full list of available option hooks (most editors/IDEs allow you to\n * ctrl+click or cmd+click on mac the type definition below).\n * @type {import('./internal').Options}\n */\nconst options = {\n\t_catchError\n};\n\nexport default options;\n", "import { assign, slice } from './util';\nimport options from './options';\nimport { NULL, UNDEFINED } from './constants';\n\nlet vnodeId = 0;\n\n/**\n * Create an virtual node (used for JSX)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor for this\n * virtual node\n * @param {object | null | undefined} [props] The properties of the virtual node\n * @param {Array<import('.').ComponentChildren>} [children] The children of the\n * virtual node\n * @returns {import('./internal').VNode}\n */\nexport function createElement(type, props, children) {\n\tlet normalizedProps = {},\n\t\tkey,\n\t\tref,\n\t\ti,\n\t\tlength = arguments.length;\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref' && typeof type != 'function') ref = props[i];\n\t\telse normalizedProps[i] = props[i];\n\t}\n\n\tif (length > 2) {\n\t\tnormalizedProps.children = length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\treturn createVNode(type, normalizedProps, key, ref, NULL);\n}\n\n/**\n * Clones the given VNode, optionally adding attributes/props and replacing its\n * children.\n * @param {import('./internal').VNode} vnode The virtual DOM element to clone\n * @param {object} props Attributes/props to add when cloning\n * @param {Array<import('./internal').ComponentChildren>} children Any additional arguments will be used\n * as replacement children.\n * @returns {import('./internal').VNode}\n */\nexport function cloneElement(vnode, props, children) {\n\tlet normalizedProps = assign({}, vnode.props),\n\t\tkey,\n\t\tref,\n\t\ti,\n\t\tlength = arguments.length;\n\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref' && typeof vnode.type != 'function') ref = props[i];\n\t\telse normalizedProps[i] = props[i];\n\t}\n\n\tif (length > 2) {\n\t\tnormalizedProps.children = length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\treturn createVNode(\n\t\tvnode.type,\n\t\tnormalizedProps,\n\t\tkey !== UNDEFINED ? key : vnode.key,\n\t\tref !== UNDEFINED ? ref : vnode.ref,\n\t\tNULL\n\t);\n}\n\n/**\n * Create a VNode (used internally by Preact)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * Constructor for this virtual node\n * @param {object | string | number | null} props The properties of this virtual node.\n * If this virtual node represents a text node, this is the text of the node (string or number).\n * @param {string | number | null} key The key for this virtual node, used when\n * diffing it against its children\n * @param {import('./internal').VNode[\"ref\"]} ref The ref property that will\n * receive a reference to its created child\n * @returns {import('./internal').VNode}\n */\nexport function createVNode(type, props, key, ref, original) {\n\t// V8 seems to be better at detecting type shapes if the object is allocated from the same call site\n\t// Do not inline into createElement and coerceToVNode!\n\t/** @type {import('./internal').VNode} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops,\n\t\tkey,\n\t\tref,\n\t\t_children: NULL,\n\t\t_parent: NULL,\n\t\t_depth: 0,\n\t\t_dom: NULL,\n\t\t_component: NULL,\n\t\tconstructor: UNDEFINED,\n\t\t_original: original || ++vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0\n\t};\n\n\t// Only invoke the vnode hook if this was *not* a direct copy:\n\tif (!original && options.vnode) options.vnode(vnode);\n\n\treturn vnode;\n}\n\nexport function createRef() {\n\treturn { current: NULL };\n}\n\nexport function Fragment(props) {\n\treturn props.children;\n}\n\n/**\n * Check if a the argument is a valid Preact VNode.\n * @param {*} vnode\n * @returns {vnode is VNode}\n */\nexport const isValidElement = vnode =>\n\tvnode != NULL && vnode.constructor === UNDEFINED;\n", "import {\n\tCOMPONENT_DIRTY,\n\tCOMPONENT_FORCE,\n\tMODE_HYDRATE,\n\tNULL,\n\tUNDEFINED\n} from './constants';\nimport { Fragment } from './create-element';\nimport { commitRoot, diff } from './diff/index';\nimport options from './options';\nimport { assign } from './util';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function BaseComponent(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n\tthis._bits = 0;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @this {import('./internal').Component}\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nBaseComponent.prototype.setState = function (update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s = this._nextState;\n\tif (!s || s == this.state) {\n\t\ts = this._nextState = assign({}, this.state);\n\t}\n\n\tif (typeof update == 'function') {\n\t\t// Some libraries like `immer` mark the current state as readonly,\n\t\t// preventing us from mutating it, so we need to clone it. See #2716\n\t\tupdate = update(assign({}, s), this.props);\n\t}\n\n\tif (update) {\n\t\tassign(s, update);\n\t} else {\n\t\treturn;\n\t}\n\n\tif (this._vnode) {\n\t\tif (callback) {\n\t\t\tthis._stateCallbacks.push(callback);\n\t\t}\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @this {import('./internal').Component}\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nBaseComponent.prototype.forceUpdate = function (callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._bits |= COMPONENT_FORCE;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](https://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {ComponentChildren | void}\n */\nBaseComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == NULL) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent && getDomSibling(vnode._parent, vnode._index + 1);\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling && sibling._dom) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search). New roots (_parentDom) are a DOM boundary too.\n\treturn typeof vnode.type == 'function' && !vnode.props._parentDom\n\t\t? getDomSibling(vnode)\n\t\t: NULL;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} component The component to rerender\n */\nfunction renderComponent(component) {\n\tconst oldVNode = component._vnode,\n\t\toldDom = oldVNode._dom,\n\t\tcommitQueue = [],\n\t\trefQueue = [];\n\n\tconst parentDom = component._parentDom;\n\tif (parentDom) {\n\t\tconst newVNode = assign({ constructor: UNDEFINED }, oldVNode);\n\t\tnewVNode._original = oldVNode._original + 1;\n\t\tif (options.vnode) options.vnode(newVNode);\n\n\t\tdiff(\n\t\t\tparentDom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tcomponent._globalContext,\n\t\t\tparentDom.namespaceURI,\n\t\t\toldVNode._flags & MODE_HYDRATE ? [oldDom] : NULL,\n\t\t\tcommitQueue,\n\t\t\toldDom || getDomSibling(oldVNode),\n\t\t\toldVNode._flags & MODE_HYDRATE,\n\t\t\trefQueue\n\t\t);\n\n\t\tnewVNode._original = oldVNode._original;\n\t\tnewVNode._parent._children[newVNode._index] = newVNode;\n\t\tcommitRoot(commitQueue, newVNode, refQueue);\n\t\toldVNode._parent = oldVNode._dom = NULL;\n\n\t\tif (newVNode._dom != oldDom) {\n\t\t\tupdateParentDomPointers(newVNode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\t// Stop at root boundaries (_parentDom)\n\tif ((vnode = vnode._parent) && vnode._component && !vnode.props._parentDom) {\n\t\t// _dom starts nulled, so re-assigning a null child._dom is a no-op and\n\t\t// the first truthy _dom stops the walk.\n\t\tvnode._dom = NULL;\n\t\tvnode._children.some(child => child && (vnode._dom = child._dom));\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array<import('./internal').Component>}\n */\nconst rerenderQueue = [];\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce,\n\trerenderCount = 0;\n\nexport function resetRenderCount() {\n\trerenderCount = 0;\n}\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif (\n\t\t(!(c._bits & COMPONENT_DIRTY) &&\n\t\t\t((c._bits |= COMPONENT_DIRTY),\n\t\t\trerenderQueue.push(c),\n\t\t\t!rerenderCount++)) ||\n\t\tprevDebounce != options.debounceRendering\n\t) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(prevDebounce || queueMicrotask)(process);\n\t}\n}\n\n/**\n * @param {import('./internal').Component} a\n * @param {import('./internal').Component} b\n */\nconst depthSort = (a, b) => a._vnode._depth - b._vnode._depth;\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\ttry {\n\t\tlet c,\n\t\t\tl = 1;\n\n\t\t// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary\n\t\t// process() calls from getting scheduled while `queue` is still being consumed.\n\t\twhile (rerenderQueue.length) {\n\t\t\t// Keep the rerender queue sorted by (depth, insertion order). The queue\n\t\t\t// will initially be sorted on the first iteration only if it has more than 1 item.\n\t\t\t//\n\t\t\t// New items can be added to the queue e.g. when rerendering a provider, so we want to\n\t\t\t// keep the order from top to bottom with those new items so we can handle them in a\n\t\t\t// single pass\n\t\t\tif (rerenderQueue.length > l) {\n\t\t\t\trerenderQueue.sort(depthSort);\n\t\t\t}\n\n\t\t\tc = rerenderQueue.shift();\n\t\t\tl = rerenderQueue.length;\n\n\t\t\tif (c._bits & COMPONENT_DIRTY) {\n\t\t\t\trenderComponent(c);\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tif ((rerenderCount = rerenderQueue.length)) {\n\t\t\t(prevDebounce || queueMicrotask)(process);\n\t\t}\n\t}\n}\n", "import { NULL, SVG_NAMESPACE } from '../constants';\nimport options from '../options';\n\n// Per-instance unique key for the event clock stamp. Each Preact copy on the\n// page gets its own Symbol so that stamps on shared event objects can never\n// collide across instances.\nlet EVENT_DISPATCHED = Symbol();\n\nfunction setStyle(style, key, value) {\n\tif (value == NULL) value = '';\n\tif (key[0] == '-') {\n\t\tstyle.setProperty(key, value);\n\t} else {\n\t\tstyle[key] = value;\n\t}\n}\n\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\n\n// A logical clock to solve issues like https://github.com/preactjs/preact/issues/3927.\n// When the DOM performs an event it leaves micro-ticks in between bubbling up which means that\n// an event can trigger on a newly reated DOM-node while the event bubbles up.\n//\n// Originally inspired by Vue\n// (https://github.com/vuejs/core/blob/caeb8a68811a1b0f79/packages/runtime-dom/src/modules/events.ts#L90-L101),\n// but modified to use a logical clock instead of Date.now() in case event handlers get attached\n// and events get dispatched during the same millisecond.\n//\n// The clock is incremented after each new event dispatch. This allows 1 000 000 new events\n// per second for over 280 years before the value reaches Number.MAX_SAFE_INTEGER (2**53 - 1).\nlet eventClock = 0;\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {string} namespace Whether or not this DOM node is an SVG node or not\n */\nexport function setProperty(dom, name, value, oldValue, namespace) {\n\tlet useCapture;\n\n\tif (name == 'style') {\n\t\tif (typeof value == 'string') {\n\t\t\tdom.style.cssText = value;\n\t\t} else {\n\t\t\tif (typeof oldValue == 'string') {\n\t\t\t\tdom.style.cssText = oldValue = '';\n\t\t\t}\n\n\t\t\tif (oldValue) {\n\t\t\t\tfor (name in oldValue) {\n\t\t\t\t\tif (!(value && name in value)) {\n\t\t\t\t\t\tsetStyle(dom.style, name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tfor (name in value) {\n\t\t\t\t\tif (!oldValue || value[name] != oldValue[name]) {\n\t\t\t\t\t\tsetStyle(dom.style, name, value[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0] == 'o' && name[1] == 'n') {\n\t\t// Handlers are keyed by prop name and every prop name gets its own proxy,\n\t\t// so swapping one (e.g. an inline arrow function on every render) is a\n\t\t// single store. The event name is only derived to attach or remove it.\n\t\t(dom._listeners || (dom._listeners = {}))[name] = value;\n\n\t\tif (!value || !oldValue) {\n\t\t\tconst proxy =\n\t\t\t\teventProxies[name] || (eventProxies[name] = createEventProxy(name));\n\t\t\t// The attach time belongs to the listener, not to the handler: one\n\t\t\t// function can back several listeners that were attached at different\n\t\t\t// times. It lives outside `_listeners`, which unmount resets even when\n\t\t\t// a re-suspended Suspense boundary keeps the DOM and its listeners.\n\t\t\t(dom._attached || (dom._attached = {}))[name] = eventClock;\n\t\t\tuseCapture = name != (name = name.replace(CAPTURE_REGEX, '$1'));\n\n\t\t\t// Infer correct casing for DOM built-in events: `onClick` -> `click`.\n\t\t\t// Only names starting with an uppercase letter are lowercased, so\n\t\t\t// camelCase custom events keep their casing: `onionChange` -> `ionChange`.\n\t\t\tname = name.slice(2);\n\t\t\tif (name[0] < 'a') name = name.toLowerCase();\n\n\t\t\tif (value) {\n\t\t\t\tdom.addEventListener(name, proxy, useCapture);\n\t\t\t} else {\n\t\t\t\tdom.removeEventListener(name, proxy, useCapture);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (namespace == SVG_NAMESPACE) {\n\t\t\t// Normalize incorrect prop usage for SVG:\n\t\t\t// - xlink:href / xlinkHref --> href (xlink:href was removed from SVG and isn't needed)\n\t\t\t// - className --> class\n\t\t\tname = name.replace(/xlink(H|:h)/, 'h').replace(/sName$/, 's');\n\t\t} else if (\n\t\t\tname != 'width' &&\n\t\t\tname != 'height' &&\n\t\t\tname != 'href' &&\n\t\t\tname != 'list' &&\n\t\t\tname != 'form' &&\n\t\t\t// Default value in browsers is `-1` and an empty string is\n\t\t\t// cast to `0` instead\n\t\t\tname != 'tabIndex' &&\n\t\t\tname != 'download' &&\n\t\t\tname != 'rowSpan' &&\n\t\t\tname != 'colSpan' &&\n\t\t\tname != 'role' &&\n\t\t\tname != 'popover' &&\n\t\t\tname in dom\n\t\t) {\n\t\t\ttry {\n\t\t\t\tdom[name] = value == NULL ? '' : value;\n\t\t\t\treturn;\n\t\t\t} catch (e) {}\n\t\t}\n\n\t\t// aria- and data- attributes have no boolean representation.\n\t\t// A `false` value is different from the attribute not being\n\t\t// present, so we can't remove it. For non-boolean aria\n\t\t// attributes we could treat false as a removal, but the\n\t\t// amount of exceptions would cost too many bytes. On top of\n\t\t// that other frameworks generally stringify `false`.\n\n\t\t// Never serialize functions as attribute values.\n\t\tif (typeof value == 'function') return;\n\t\tif (value != NULL && (value !== false || name[4] == '-')) {\n\t\t\tdom.setAttribute(name, name == 'popover' && value == true ? '' : value);\n\t\t} else {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t}\n}\n\n/**\n * Create an event proxy function.\n * @param {string} name The prop name the handler is stored under.\n * @private\n */\nfunction createEventProxy(name) {\n\t/**\n\t * Proxy an event to hooked event handlers\n\t * @param {import('../internal').PreactEvent} e The event object from the browser\n\t * @private\n\t */\n\treturn function (e) {\n\t\tlet eventHandler = this._listeners;\n\t\tif (eventHandler) {\n\t\t\teventHandler = eventHandler[name];\n\t\t\tif (e[EVENT_DISPATCHED] == NULL) {\n\t\t\t\te[EVENT_DISPATCHED] = eventClock++;\n\n\t\t\t\t// When `e[EVENT_DISPATCHED]` is smaller than the time when the targeted event\n\t\t\t\t// listener was attached we know we have bubbled up to an element that was added\n\t\t\t\t// during patching the DOM.\n\t\t\t} else if (e[EVENT_DISPATCHED] < this._attached[name]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn eventHandler(options.event ? options.event(e) : e);\n\t\t}\n\t};\n}\n\n/** @type {Record<string, (e: Event) => any>} */\nconst eventProxies = {};\n", "import { enqueueRender } from './component';\nimport { COMPONENT_FORCE } from './constants';\n\nexport let i = 0;\n\nexport function createContext(defaultValue) {\n\tfunction Context(props) {\n\t\tif (!this.getChildContext) {\n\t\t\t/** @type {Set<import('./internal').Component> | null} */\n\t\t\tlet subs = new Set();\n\t\t\tlet ctx = {};\n\t\t\tctx[Context._id] = this;\n\n\t\t\tthis.getChildContext = () => ctx;\n\n\t\t\tthis.shouldComponentUpdate = function (_props) {\n\t\t\t\t// @ts-expect-error even\n\t\t\t\tif (this.props.value != _props.value) {\n\t\t\t\t\tsubs.forEach(c => {\n\t\t\t\t\t\tc._bits |= COMPONENT_FORCE;\n\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.sub = c => {\n\t\t\t\tsubs.add(c);\n\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\tsubs.delete(c);\n\t\t\t\t\tif (old) old.call(c);\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\n\t\treturn props.children;\n\t}\n\n\tContext._id = '__cC' + i++;\n\tContext._defaultValue = defaultValue;\n\n\t/** @type {import('./internal').FunctionComponent} */\n\tContext.Consumer = (props, contextValue) => {\n\t\treturn props.children(contextValue);\n\t};\n\n\tContext.Provider = Context.Consumer.contextType = Context;\n\n\treturn Context;\n}\n", "import { EMPTY_ARR } from './constants';\n\nexport const isArray = Array.isArray;\nexport const slice = EMPTY_ARR.slice;\nexport const assign = Object.assign;\n\n/**\n * Remove a child node from its parent if attached.\n * @param {import('./internal').PreactElement | null} node The node to remove\n */\nexport function removeNode(node) {\n\tif (node && node.parentNode) node.remove();\n}\n", "import { diff, unmount, applyRef } from './index';\nimport { createVNode, Fragment } from '../create-element';\nimport {\n\tEMPTY_OBJ,\n\tEMPTY_ARR,\n\tINSERT_VNODE,\n\tMATCHED,\n\tLIS_CANDIDATE,\n\tREF_DETACHED,\n\tUNDEFINED,\n\tNULL\n} from '../constants';\nimport { isArray } from '../util';\nimport { getDomSibling } from '../component';\n\n/**\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * Diff the children of a virtual node\n * @param {PreactElement} parentDom The DOM element whose children are being\n * diffed\n * @param {ComponentChildren[]} renderResult\n * @param {VNode} newParentVNode The new virtual node whose children should be\n * diff'ed against oldParentVNode\n * @param {VNode} oldParentVNode The old virtual node whose children should be\n * diff'ed against newParentVNode\n * @param {object} globalContext The current context object - modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n * @returns {PreactElement} The next sibling DOM element to insert new elements\n */\nexport function diffChildren(\n\tparentDom,\n\trenderResult,\n\tnewParentVNode,\n\toldParentVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\tlet i,\n\t\t/** @type {VNode} */\n\t\toldVNode,\n\t\t/** @type {VNode} */\n\t\tchildVNode,\n\t\t/** @type {PreactElement} */\n\t\tnewDom,\n\t\t/** @type {PreactElement} */\n\t\tfirstChildDom;\n\n\t// This is a compression of oldParentVNode != EMPTY_OBJ && oldParentVNode._children || EMPTY_ARR\n\t// as EMPTY_OBJ._children should be `undefined`. Callers always pass at\n\t// least EMPTY_OBJ, so a null check isn't needed.\n\t/** @type {VNode[]} */\n\tlet oldChildren = oldParentVNode._children || EMPTY_ARR;\n\n\tlet newChildrenLength = renderResult.length;\n\n\toldDom = constructNewChildrenArray(\n\t\tnewParentVNode,\n\t\trenderResult,\n\t\toldChildren,\n\t\toldDom,\n\t\tnewChildrenLength\n\t);\n\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\tchildVNode = newParentVNode._children[i];\n\t\tif (childVNode == NULL) continue;\n\n\t\t// At this point, constructNewChildrenArray has assigned _index to be the\n\t\t// matchingIndex for this VNode's oldVNode (or -1 if there is no oldVNode).\n\t\t// ~_index guards the -1 case: a negative array index is a named property\n\t\t// access which V8 can't serve from the fast elements path.\n\t\toldVNode =\n\t\t\t(~childVNode._index && oldChildren[childVNode._index]) || EMPTY_OBJ;\n\n\t\t// Update childVNode._index to its final index\n\t\tchildVNode._index = i;\n\n\t\t// Morph the old element into the new one, but don't append it to the dom yet\n\t\tlet result = diff(\n\t\t\tparentDom,\n\t\t\tchildVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\toldDom,\n\t\t\tisHydrating,\n\t\t\trefQueue\n\t\t);\n\n\t\t// Adjust DOM nodes\n\t\tnewDom = childVNode._dom;\n\t\t// A ref detached while its subtree was parked by Suspense is attached\n\t\t// again on reveal.\n\t\tif (oldVNode.ref != childVNode.ref || oldVNode._flags & REF_DETACHED) {\n\t\t\tif (oldVNode.ref) applyRef(oldVNode.ref, NULL, childVNode, oldVNode);\n\t\t\tif (childVNode.ref) {\n\t\t\t\trefQueue.push(\n\t\t\t\t\tchildVNode.ref,\n\t\t\t\t\tchildVNode._component || newDom,\n\t\t\t\t\tchildVNode\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfirstChildDom = firstChildDom || newDom;\n\n\t\tif (childVNode._flags & INSERT_VNODE) {\n\t\t\toldDom = insert(childVNode, oldDom, parentDom, !oldVNode._original);\n\n\t\t\t// When a matched VNode is physically moved via INSERT_VNODE, its old\n\t\t\t// _dom pointer becomes a stale positional reference. Clear it so that\n\t\t\t// getDomSibling (called from nested diffs) won't return this stale\n\t\t\t// reference and mis-place subsequent DOM nodes. See #5065.\n\t\t\tif (oldVNode._dom) {\n\t\t\t\toldVNode._dom = NULL;\n\t\t\t}\n\t\t} else if (typeof childVNode.type == 'function' && result !== UNDEFINED) {\n\t\t\toldDom = result;\n\t\t} else if (newDom) {\n\t\t\toldDom = newDom.nextSibling;\n\t\t}\n\n\t\t// Clear placement and LIS flags; MATCHED only belongs to old vnodes.\n\t\tchildVNode._flags &= ~(INSERT_VNODE | LIS_CANDIDATE);\n\t}\n\n\tnewParentVNode._dom = firstChildDom;\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} newParentVNode\n * @param {ComponentChildren[]} renderResult\n * @param {VNode[]} oldChildren\n */\nfunction constructNewChildrenArray(\n\tnewParentVNode,\n\trenderResult,\n\toldChildren,\n\toldDom,\n\tnewChildrenLength\n) {\n\t/** @type {number} */\n\tlet i;\n\t/** @type {VNode} */\n\tlet childVNode;\n\t/** @type {VNode} */\n\tlet oldVNode;\n\n\tlet oldChildrenLength = oldChildren.length,\n\t\tremainingOldChildren = oldChildrenLength;\n\n\tlet skew = 0;\n\n\t/** Whether any matched child was found far from its skewed index, i.e. a\n\t * real reorder happened and we need to compute the minimal set of moves. */\n\tlet moved = 0;\n\n\t// Hoisted: every normalization branch below writes through this array, so\n\t// reading `_children` off the vnode each time is a wasted property load.\n\t/** @type {VNode[]} */\n\tlet newChildren = (newParentVNode._children = Array(newChildrenLength));\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\t// @ts-expect-error We are reusing the childVNode variable to hold both the\n\t\t// pre and post normalized childVNode\n\t\tchildVNode = renderResult[i];\n\n\t\tif (\n\t\t\tchildVNode == NULL ||\n\t\t\ttypeof childVNode == 'boolean' ||\n\t\t\ttypeof childVNode == 'function'\n\t\t) {\n\t\t\tnewChildren[i] = NULL;\n\t\t\tcontinue;\n\t\t}\n\t\t// If this newVNode is being reused (e.g. <div>{reuse}{reuse}</div>) in the same diff,\n\t\t// or we are rendering a component (e.g. setState) copy the oldVNodes so it can have\n\t\t// it's own DOM & etc. pointers\n\t\t// Anything that isn't an object at this point is a string, number or\n\t\t// bigint (null, booleans and functions are handled above), String\n\t\t// objects are the lone object type rendered as text.\n\t\telse if (\n\t\t\ttypeof childVNode != 'object' ||\n\t\t\tchildVNode.constructor == String\n\t\t) {\n\t\t\tchildVNode = newChildren[i] = createVNode(NULL, childVNode);\n\t\t} else if (isArray(childVNode)) {\n\t\t\tchildVNode = newChildren[i] = createVNode(Fragment, {\n\t\t\t\tchildren: childVNode\n\t\t\t});\n\t\t} else if (childVNode.constructor === UNDEFINED && childVNode._depth) {\n\t\t\t// VNode is already in use, clone it. This can happen in the following\n\t\t\t// scenario:\n\t\t\t// const reuse = <div />\n\t\t\t// <div>{reuse}<span />{reuse}</div>\n\t\t\tchildVNode = newChildren[i] = createVNode(\n\t\t\t\tchildVNode.type,\n\t\t\t\tchildVNode.props,\n\t\t\t\tchildVNode.key,\n\t\t\t\tchildVNode.ref,\n\t\t\t\tchildVNode._original\n\t\t\t);\n\t\t} else {\n\t\t\tnewChildren[i] = childVNode;\n\t\t}\n\n\t\tconst skewedIndex = i + skew;\n\t\tchildVNode._parent = newParentVNode;\n\t\tchildVNode._depth = newParentVNode._depth + 1;\n\n\t\t// Temporarily store the matchingIndex on the _index property so we can pull\n\t\t// out the oldVNode in diffChildren. We'll override this to the VNode's\n\t\t// final index after using this property to get the oldVNode\n\t\tconst matchingIndex = (childVNode._index = findMatchingIndex(\n\t\t\tchildVNode,\n\t\t\toldChildren,\n\t\t\tskewedIndex,\n\t\t\tremainingOldChildren\n\t\t));\n\n\t\toldVNode = NULL;\n\t\t// ~matchingIndex is only falsy for -1, i.e. when no match was found\n\t\tif (~matchingIndex) {\n\t\t\toldVNode = oldChildren[matchingIndex];\n\t\t\tremainingOldChildren--;\n\t\t\tif (oldVNode) {\n\t\t\t\toldVNode._flags |= MATCHED;\n\t\t\t}\n\t\t}\n\n\t\t// Here, we define isMounting for the purposes of the skew diffing\n\t\t// algorithm. Nodes that are unsuspending are considered mounting and we detect\n\t\t// this by checking if oldVNode._original == null\n\t\tif (!oldVNode || !oldVNode._original) {\n\t\t\tif (!~matchingIndex) {\n\t\t\t\t// When the array of children is growing we need to decrease the skew\n\t\t\t\t// as we are adding a new element to the array.\n\t\t\t\t// Example:\n\t\t\t\t// [1, 2, 3] --> [0, 1, 2, 3]\n\t\t\t\t// oldChildren newChildren\n\t\t\t\t//\n\t\t\t\t// The new element is at index 0, so our skew is 0,\n\t\t\t\t// we need to decrease the skew as we are adding a new element.\n\t\t\t\t// The decrease will cause us to compare the element at position 1\n\t\t\t\t// with value 1 with the element at position 0 with value 0.\n\t\t\t\t//\n\t\t\t\t// A linear concept is applied when the array is shrinking,\n\t\t\t\t// if the length is unchanged we can assume that no skew\n\t\t\t\t// changes are needed.\n\t\t\t\tif (newChildrenLength > oldChildrenLength) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else if (newChildrenLength < oldChildrenLength) {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we are mounting a DOM VNode, mark it for insertion\n\t\t\tif (typeof childVNode.type != 'function') {\n\t\t\t\tchildVNode._flags |= INSERT_VNODE;\n\t\t\t}\n\t\t} else {\n\t\t\t// Keep LIS eligibility separate from MATCHED on old vnodes: if a child\n\t\t\t// throws, uncleared new-vnode flags must not prevent the next match.\n\t\t\tchildVNode._flags |= LIS_CANDIDATE;\n\n\t\t\t// Center the next search for shifts. Only matches farther than one\n\t\t\t// position away require the minimal-move pass.\n\t\t\tif (matchingIndex == skewedIndex - 1) {\n\t\t\t\tskew--;\n\t\t\t} else if (matchingIndex == skewedIndex + 1) {\n\t\t\t\tskew++;\n\t\t\t} else if (matchingIndex != skewedIndex) {\n\t\t\t\tif (matchingIndex > skewedIndex) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\n\t\t\t\tmoved = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (moved) {\n\t\t// Children were reordered: mark the minimal set of matched (LIS_CANDIDATE flag)\n\t\t// children for insertion by finding the longest increasing subsequence of\n\t\t// old indices (patience sorting). Children on the subsequence stay in\n\t\t// place, all others get INSERT_VNODE. `_index` still holds the\n\t\t// matchingIndex here.\n\t\t/** @type {number[]} tails[x] is the smallest old index ending an increasing subsequence of length x+1 */\n\t\tlet tails = [];\n\t\t/** @type {number[]} length of the longest increasing subsequence ending at child i */\n\t\tlet lisLengths = [];\n\t\tfor (i = 0; i < newChildrenLength; i++) {\n\t\t\tchildVNode = newChildren[i];\n\t\t\tif (childVNode && childVNode._flags & LIS_CANDIDATE) {\n\t\t\t\t// Binary search for the insertion point, keeping the pass at\n\t\t\t\t// O(n log n) even for pathological reorders.\n\t\t\t\tskew = 0;\n\t\t\t\tlet hi = tails.length;\n\t\t\t\twhile (skew < hi) {\n\t\t\t\t\tconst mid = (skew + hi) >> 1;\n\t\t\t\t\tif (tails[mid] < childVNode._index) {\n\t\t\t\t\t\tskew = mid + 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thi = mid;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttails[skew] = childVNode._index;\n\t\t\t\tlisLengths[i] = skew + 1;\n\t\t\t}\n\t\t}\n\n\t\t// `skew` is dead after the main loop; reuse it as the remaining\n\t\t// subsequence length while walking backwards. Likewise `i` is left at\n\t\t// newChildrenLength by the loop above.\n\t\tskew = tails.length;\n\t\twhile (i--) {\n\t\t\tif (lisLengths[i]) {\n\t\t\t\tif (lisLengths[i] == skew) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else {\n\t\t\t\t\tnewChildren[i]._flags |= INSERT_VNODE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove remaining oldChildren if there are any. Loop forwards so that as we\n\t// unmount DOM from the beginning of the oldChildren, we can adjust oldDom to\n\t// point to the next child, which needs to be the first DOM node that won't be\n\t// unmounted. Keep this a plain loop: an arrow function here would capture\n\t// `oldDom`, forcing V8 to context-allocate it on every call to this function.\n\tif (remainingOldChildren) {\n\t\tfor (i = 0; i < oldChildrenLength; i++) {\n\t\t\toldVNode = oldChildren[i];\n\t\t\tif (oldVNode && !(oldVNode._flags & MATCHED)) {\n\t\t\t\tif (oldVNode._dom == oldDom) {\n\t\t\t\t\toldDom = getDomSibling(oldVNode);\n\t\t\t\t}\n\n\t\t\t\tunmount(oldVNode, oldVNode);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} parentVNode\n * @param {PreactElement} oldDom\n * @param {PreactElement} parentDom\n * @param {boolean} isMounting\n * @returns {PreactElement}\n */\nfunction insert(parentVNode, oldDom, parentDom, isMounting) {\n\t// Note: VNodes in nested suspended trees may be missing _children.\n\tif (typeof parentVNode.type == 'function') {\n\t\t// Root children live in another container, they never move with the\n\t\t// host tree and contribute nothing to the host insertion cursor.\n\t\tif (parentVNode.props._parentDom) return oldDom;\n\t\tlet children = parentVNode._children;\n\t\tif (children) {\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tif (children[i]) {\n\t\t\t\t\t// If we enter this code path on sCU bailout, where we copy\n\t\t\t\t\t// oldVNode._children to newVNode._children, we need to update the old\n\t\t\t\t\t// children's _parent pointer to point to the newVNode (parentVNode\n\t\t\t\t\t// here).\n\t\t\t\t\tchildren[i]._parent = parentVNode;\n\t\t\t\t\toldDom = insert(children[i], oldDom, parentDom, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn oldDom;\n\t} else {\n\t\t// A cursor a parked Suspense subtree detached can't be a reference node:\n\t\t// retry from the vnode tree, then give up and append.\n\t\tif (oldDom && !oldDom.parentNode) {\n\t\t\toldDom = getDomSibling(parentVNode);\n\t\t\tif (oldDom && !oldDom.parentNode) oldDom = NULL;\n\t\t}\n\n\t\t// Comments (e.g. server `$s` markers) are never ours: a node right after\n\t\t// them is already in place.\n\t\tlet dom = parentVNode._dom;\n\t\tlet next = oldDom;\n\t\twhile (next && next.nodeType == 8) next = next.nextSibling;\n\n\t\tif (dom != next) {\n\t\t\t// Containers that aren't DOM nodes may not implement moveBefore()\n\t\t\tif (!isMounting && parentDom.moveBefore && dom.parentNode) {\n\t\t\t\t// @ts-expect-error This isn't added to TypeScript lib.d.ts yet\n\t\t\t\tparentDom.moveBefore(dom, oldDom);\n\t\t\t} else {\n\t\t\t\tparentDom.insertBefore(dom, oldDom || NULL);\n\t\t\t}\n\t\t}\n\t\toldDom = dom;\n\t}\n\n\twhile (\n\t\t(oldDom = oldDom && oldDom.nextSibling) &&\n\t\toldDom.nodeType == 8 &&\n\t\t!oldDom.data.startsWith('$s')\n\t);\n\n\treturn oldDom;\n}\n\n/**\n * Flatten and loop through the children of a virtual node\n * @param {ComponentChildren} children The unflattened children of a virtual\n * node\n * @returns {VNode[]}\n */\nexport function toChildArray(children, out) {\n\tout = out || [];\n\tif (children != NULL && typeof children != 'boolean') {\n\t\tif (isArray(children)) {\n\t\t\tchildren.some(child => {\n\t\t\t\ttoChildArray(child, out);\n\t\t\t});\n\t\t} else {\n\t\t\tout.push(children);\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * @param {VNode} childVNode\n * @param {VNode[]} oldChildren\n * @param {number} skewedIndex\n * @param {number} remainingOldChildren\n * @returns {number}\n */\nfunction findMatchingIndex(\n\tchildVNode,\n\toldChildren,\n\tskewedIndex,\n\tremainingOldChildren\n) {\n\tconst key = childVNode.key;\n\tconst type = childVNode.type;\n\tlet oldVNode = oldChildren[skewedIndex];\n\tconst matched = oldVNode && !(oldVNode._flags & MATCHED);\n\n\t// We only need to perform a search if there are more children\n\t// (remainingOldChildren) to search. However, if the oldVNode we just looked\n\t// at skewedIndex was not already used in this diff, then there must be at\n\t// least 1 other (so greater than 1) remainingOldChildren to attempt to match\n\t// against. So the following condition checks that ensuring\n\t// remainingOldChildren > 1 if the oldVNode is not already used/matched. Else\n\t// if the oldVNode was null or matched, then there could needs to be at least\n\t// 1 (aka `remainingOldChildren > 0`) children to find and compare against.\n\t//\n\t// If there is an unkeyed functional VNode, that isn't a built-in like our Fragment,\n\t// we should not search as we risk re-using state of an unrelated VNode. (reverted for now)\n\tlet shouldSearch =\n\t\t// (typeof type != 'function' || type === Fragment || key) &&\n\t\t// The ternary keeps this a Smi comparison; `> matched` would compare\n\t\t// number to boolean which V8 can't serve from the fast path.\n\t\tremainingOldChildren > (matched ? 1 : 0);\n\n\tif (\n\t\t(oldVNode === NULL && key == NULL) ||\n\t\t(matched && key == oldVNode.key && type == oldVNode.type)\n\t) {\n\t\treturn skewedIndex;\n\t} else if (shouldSearch) {\n\t\tlet x;\n\t\tfor (x = skewedIndex - 1; x >= 0; x--) {\n\t\t\toldVNode = oldChildren[x];\n\t\t\tif (\n\t\t\t\toldVNode &&\n\t\t\t\t!(oldVNode._flags & MATCHED) &&\n\t\t\t\tkey == oldVNode.key &&\n\t\t\t\ttype == oldVNode.type\n\t\t\t)\n\t\t\t\treturn x;\n\t\t}\n\t\tfor (x = skewedIndex + 1; x < oldChildren.length; x++) {\n\t\t\toldVNode = oldChildren[x];\n\t\t\tif (\n\t\t\t\toldVNode &&\n\t\t\t\t!(oldVNode._flags & MATCHED) &&\n\t\t\t\tkey == oldVNode.key &&\n\t\t\t\ttype == oldVNode.type\n\t\t\t)\n\t\t\t\treturn x;\n\t\t}\n\t}\n\n\treturn -1;\n}\n", "import { BaseComponent, getDomSibling } from '../component';\nimport {\n\tCOMPONENT_DIRTY,\n\tCOMPONENT_FORCE,\n\tCOMPONENT_PENDING_ERROR,\n\tCOMPONENT_PROCESSING_EXCEPTION,\n\tEMPTY_ARR,\n\tEMPTY_OBJ,\n\tFORCE_PROPS_REVALIDATE,\n\tMATHML_TOKEN_ELEMENTS,\n\tMATH_NAMESPACE,\n\tMODE_HYDRATE,\n\tMODE_SUSPENDED,\n\tNULL,\n\tRESET_MODE,\n\tSVG_NAMESPACE,\n\tUNDEFINED,\n\tXHTML_NAMESPACE\n} from '../constants';\nimport { Fragment } from '../create-element';\nimport options from '../options';\nimport { assign, isArray, removeNode, slice } from '../util';\nimport { diffChildren } from './children';\nimport { setProperty } from './props';\n\n/**\n * @typedef {import('../internal').ComponentType} ComponentType\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * @template {any} T\n * @typedef {import('../internal').Ref<T>} Ref<T>\n */\n\n/**\n * Diff two virtual nodes and apply proper changes to the DOM\n * @param {PreactElement} parentDom The parent of the DOM element\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object. Modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n */\nexport function diff(\n\tparentDom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\t/** @type {any} */\n\tlet tmp,\n\t\tresumed,\n\t\tnewType = newVNode.type;\n\n\t// When passing through createElement it assigns the object\n\t// constructor as undefined. This to prevent JSON-injection.\n\tif (newVNode.constructor !== UNDEFINED) return NULL;\n\n\t// If the previous diff bailed out, resume creating/hydrating into the DOM\n\t// that was kept while suspended (server-rendered, or already in the\n\t// container we rendered into). `tmp` holds the stored excess node until the\n\t// options._diff call below.\n\tif (\n\t\toldVNode._flags & MODE_SUSPENDED &&\n\t\t// @ts-expect-error This is MODE_HYDRATE or 0\n\t\t((isHydrating = oldVNode._flags & MODE_HYDRATE),\n\t\t(tmp = oldVNode._component._excess))\n\t) {\n\t\tnewVNode._flags |= isHydrating;\n\t\tresumed = excessDomChildren = [];\n\t\tif (tmp.nodeType == 8) {\n\t\t\t// Re-scan DOM from stored start marker for streamed hydration.\n\t\t\toldDom = rangeEnd(tmp, excessDomChildren);\n\t\t} else {\n\t\t\texcessDomChildren.push(tmp);\n\t\t}\n\t\toldDom = excessDomChildren[0] || oldDom;\n\t}\n\n\tif ((tmp = options._diff)) tmp(newVNode);\n\n\touter: if (typeof newType == 'function') {\n\t\tlet oldCommitQueueLength = commitQueue.length;\n\t\ttry {\n\t\t\tlet c,\n\t\t\t\toldProps,\n\t\t\t\toldState,\n\t\t\t\tsnapshot,\n\t\t\t\tnewProps = newVNode.props;\n\t\t\tconst isClassComponent = (tmp = newType.prototype) && tmp.render;\n\n\t\t\t// Necessary for createContext api. Setting this property will pass\n\t\t\t// the context value as `this.context` just for this component.\n\t\t\ttmp = newType.contextType;\n\t\t\tconst provider = tmp && globalContext[tmp._id];\n\t\t\tconst componentContext = tmp\n\t\t\t\t? provider\n\t\t\t\t\t? provider.props.value\n\t\t\t\t\t: tmp._defaultValue\n\t\t\t\t: globalContext;\n\n\t\t\t// Get component and set it to `c`\n\t\t\tif ((c = oldVNode._component)) {\n\t\t\t\tnewVNode._component = c;\n\t\t\t\tif (c._bits & COMPONENT_PENDING_ERROR) {\n\t\t\t\t\tc._bits |= COMPONENT_PROCESSING_EXCEPTION;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Instantiate the new component\n\t\t\t\tif (isClassComponent) {\n\t\t\t\t\t// @ts-expect-error Trust me, Component implements the interface we want\n\t\t\t\t\tnewVNode._component = c = new newType(newProps, componentContext); // eslint-disable-line new-cap\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-expect-error Trust me, Component implements the interface we want\n\t\t\t\t\tnewVNode._component = c = new BaseComponent(\n\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t);\n\n\t\t\t\t\tc.constructor = newType;\n\t\t\t\t\tc.render = doRender;\n\t\t\t\t}\n\t\t\t\tif (provider) provider.sub(c);\n\n\t\t\t\tif (!c.state) c.state = {};\n\t\t\t\tc._globalContext = globalContext;\n\t\t\t\tc._bits |= COMPONENT_DIRTY;\n\t\t\t\tc._renderCallbacks = [];\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t}\n\n\t\t\tif (isClassComponent) {\n\t\t\t\tif (!c._nextState) c._nextState = c.state;\n\n\t\t\t\t// Invoke getDerivedStateFromProps\n\t\t\t\tif (newType.getDerivedStateFromProps) {\n\t\t\t\t\tif (c._nextState == c.state) {\n\t\t\t\t\t\tc._nextState = assign({}, c._nextState);\n\t\t\t\t\t}\n\n\t\t\t\t\tassign(\n\t\t\t\t\t\tc._nextState,\n\t\t\t\t\t\tnewType.getDerivedStateFromProps(newProps, c._nextState)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toldProps = c.props;\n\t\t\toldState = c.state;\n\t\t\tc._vnode = newVNode;\n\n\t\t\t// Invoke pre-render lifecycle methods\n\t\t\tif (!oldVNode._component) {\n\t\t\t\tif (\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\t!newType.getDerivedStateFromProps &&\n\t\t\t\t\tc.componentWillMount\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillMount();\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidMount) {\n\t\t\t\t\tc._renderCallbacks.push(c.componentDidMount);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tnewProps !== oldProps &&\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\t!newType.getDerivedStateFromProps &&\n\t\t\t\t\tc.componentWillReceiveProps\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillReceiveProps(newProps, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(newVNode._original == oldVNode._original &&\n\t\t\t\t\t\t!(c._bits & COMPONENT_DIRTY)) ||\n\t\t\t\t\t(!(c._bits & COMPONENT_FORCE) &&\n\t\t\t\t\t\tc.shouldComponentUpdate &&\n\t\t\t\t\t\tc.shouldComponentUpdate(\n\t\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\t\tc._nextState,\n\t\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t\t) === false)\n\t\t\t\t) {\n\t\t\t\t\t// More info about this here: https://gist.github.com/JoviDeCroock/bec5f2ce93544d2e6070ef8e0036e4e8\n\t\t\t\t\tif (newVNode._original != oldVNode._original) {\n\t\t\t\t\t\t// When we are dealing with a bail because of sCU we have to update\n\t\t\t\t\t\t// the props, state and dirty-state.\n\t\t\t\t\t\t// when we are dealing with strict-equality we don't as the child could still\n\t\t\t\t\t\t// be dirtied see #3883\n\t\t\t\t\t\tc.props = newProps;\n\t\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t\t\tc._bits &= ~COMPONENT_DIRTY;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t\tnewVNode._children.some(vnode => {\n\t\t\t\t\t\tif (vnode) vnode._parent = newVNode;\n\t\t\t\t\t});\n\n\t\t\t\t\tEMPTY_ARR.push.apply(c._renderCallbacks, c._stateCallbacks);\n\t\t\t\t\tc._stateCallbacks = [];\n\n\t\t\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\t\t\tcommitQueue.push(c);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Skip over the retained subtree without traversing it; the\n\t\t\t\t\t// `result` branch in diffChildren picks this up as the next\n\t\t\t\t\t// oldDom.\n\t\t\t\t\toldDom = getDomSibling(oldVNode);\n\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\n\t\t\t\tif (c.componentWillUpdate) {\n\t\t\t\t\tc.componentWillUpdate(newProps, c._nextState, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidUpdate) {\n\t\t\t\t\tc._renderCallbacks.push(() => {\n\t\t\t\t\t\tc.componentDidUpdate(oldProps, oldState, snapshot);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tc.context = componentContext;\n\t\t\tc.props = newProps;\n\t\t\tc._parentDom = parentDom;\n\t\t\tc._bits &= ~COMPONENT_FORCE;\n\n\t\t\tlet renderHook = options._render,\n\t\t\t\tcount = 0;\n\t\t\tif (isClassComponent) {\n\t\t\t\tc.state = c._nextState;\n\t\t\t\tc._bits &= ~COMPONENT_DIRTY;\n\n\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\tEMPTY_ARR.push.apply(c._renderCallbacks, c._stateCallbacks);\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t} else {\n\t\t\t\tdo {\n\t\t\t\t\tc._bits &= ~COMPONENT_DIRTY;\n\t\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\t\t// Handle setState called in render, see #2553\n\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t} while (c._bits & COMPONENT_DIRTY && ++count < 25);\n\t\t\t}\n\n\t\t\t// Handle setState called in render, see #2553\n\t\t\tc.state = c._nextState;\n\n\t\t\tif (c.getChildContext) {\n\t\t\t\tglobalContext = assign({}, globalContext, c.getChildContext());\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tisClassComponent &&\n\t\t\t\toldVNode._component &&\n\t\t\t\tc.getSnapshotBeforeUpdate\n\t\t\t) {\n\t\t\t\tsnapshot = c.getSnapshotBeforeUpdate(oldProps, oldState);\n\t\t\t}\n\n\t\t\tconst renderResult =\n\t\t\t\ttmp && tmp.type === Fragment && tmp.key == NULL\n\t\t\t\t\t? tmp.props.children\n\t\t\t\t\t: tmp;\n\n\t\t\t// A vnode carrying a `_parentDom` prop, considered a new root,\n\t\t\t// continues rendering into that container. The subtree must stay\n\t\t\t// invisible to the host tree's DOM bookkeeping: the portal vnode\n\t\t\t// keeps a `null` `_dom` and the host insertion cursor (`oldDom`)\n\t\t\t// passes through unchanged.\n\t\t\t// `tmp` (the raw render result, already unwrapped into renderResult)\n\t\t\t// doubles as the saved host insertion cursor while we render into\n\t\t\t// the portal's container.\n\t\t\tif (newProps._parentDom) {\n\t\t\t\ttmp = oldDom;\n\t\t\t\tparentDom = newProps._parentDom;\n\t\t\t\t// If we portal into a math or svg element we need\n\t\t\t\t// to swap the namespace (chart libraries often do this).\n\t\t\t\t// The document follows the container too (e.g. iframes) as\n\t\t\t\t// diffElementNodes derives it from its parentDom.\n\t\t\t\tnamespace = parentDom.namespaceURI;\n\t\t\t\t// Portals are never server-rendered: hydration must not claim the\n\t\t\t\t// host parent's excess nodes for the container's children.\n\t\t\t\tisHydrating = excessDomChildren = NULL;\n\n\t\t\t\t// Changing the container remounts the children into the new one\n\t\t\t\tif (oldVNode.props && oldVNode.props._parentDom != parentDom) {\n\t\t\t\t\t/** @type {VNode[]} */ (oldVNode._children).some(child => {\n\t\t\t\t\t\tif (child) unmount(child, child);\n\t\t\t\t\t});\n\t\t\t\t\toldVNode._children = NULL;\n\t\t\t\t}\n\n\t\t\t\toldDom = oldVNode._children ? getDomSibling(oldVNode, 0) : NULL;\n\t\t\t}\n\n\t\t\toldDom = diffChildren(\n\t\t\t\tparentDom,\n\t\t\t\tisArray(renderResult) ? renderResult : [renderResult],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnamespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\toldDom,\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\t// When we exit a portal we\n\t\t\t// change up the oldDom\n\t\t\tif (newProps._parentDom) {\n\t\t\t\tnewVNode._dom = NULL;\n\t\t\t\toldDom = tmp;\n\t\t\t}\n\n\t\t\t// Keep `_excess` so unmount can remove the range markers.\n\t\t\tnewVNode._flags &= RESET_MODE;\n\n\t\t\t// Remove the kept DOM this resumed render didn't claim\n\t\t\tif (resumed) resumed.some(removeNode);\n\n\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\tcommitQueue.push(c);\n\t\t\t}\n\n\t\t\t// Only clear when this render was the retry; PENDING_ERROR set by a\n\t\t\t// descendant during this render must survive until then.\n\t\t\tif (c._bits & COMPONENT_PROCESSING_EXCEPTION) {\n\t\t\t\tc._bits &= ~(COMPONENT_PROCESSING_EXCEPTION | COMPONENT_PENDING_ERROR);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// We remove any componentDidMount, ...\n\t\t\t// that have been invalidated by us\n\t\t\t// intercepting the error.\n\t\t\tcommitQueue.length = oldCommitQueueLength;\n\t\t\tnewVNode._original = NULL;\n\t\t\t// if hydrating or creating initial tree, bailout preserves DOM:\n\t\t\tif (isHydrating || excessDomChildren) {\n\t\t\t\tif (e.then) {\n\t\t\t\t\tlet commentMarkersToFind = 0,\n\t\t\t\t\t\tstartMarker;\n\n\t\t\t\t\t// isHydrating is MODE_HYDRATE or falsy\n\t\t\t\t\tnewVNode._flags |= MODE_SUSPENDED | isHydrating;\n\n\t\t\t\t\tif (excessDomChildren) {\n\t\t\t\t\t\tlet i = excessDomChildren.indexOf(oldDom || UNDEFINED),\n\t\t\t\t\t\t\tchild;\n\t\t\t\t\t\tif (!~i) i = excessDomChildren.length;\n\n\t\t\t\t\t\t// The cursor skips comments: step back to this component's markers.\n\t\t\t\t\t\twhile ((child = excessDomChildren[i - 1]) && child.nodeType == 8) {\n\t\t\t\t\t\t\ti--;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (; i < excessDomChildren.length; i++) {\n\t\t\t\t\t\t\tchild = excessDomChildren[i];\n\t\t\t\t\t\t\tif (!child) continue;\n\t\t\t\t\t\t\texcessDomChildren[i] = NULL;\n\n\t\t\t\t\t\t\tif (child.nodeType == 8) {\n\t\t\t\t\t\t\t\tif (child.data.startsWith('$s')) {\n\t\t\t\t\t\t\t\t\tif (!commentMarkersToFind++) startMarker = child;\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tcommentMarkersToFind &&\n\t\t\t\t\t\t\t\t\tchild.data.startsWith('/$s') &&\n\t\t\t\t\t\t\t\t\t!--commentMarkersToFind\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (!commentMarkersToFind) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!startMarker) {\n\t\t\t\t\t\twhile (oldDom && oldDom.nodeType == 8 && oldDom.nextSibling) {\n\t\t\t\t\t\t\toldDom = oldDom.nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstartMarker = oldDom;\n\t\t\t\t\t}\n\t\t\t\t\t// Preserve the original range when re-suspending.\n\t\t\t\t\tstartMarker =\n\t\t\t\t\t\tnewVNode._component._excess ||\n\t\t\t\t\t\t(newVNode._component._excess = startMarker);\n\t\t\t\t\t// Insert before the range; continue diffing after it.\n\t\t\t\t\tif ((tmp = rangeEnd(startMarker))) {\n\t\t\t\t\t\tnewVNode._dom = startMarker;\n\t\t\t\t\t\toldDom = tmp;\n\t\t\t\t\t} else newVNode._dom = oldDom;\n\t\t\t\t\toldDom = oldDom && oldDom.nextSibling;\n\t\t\t\t} else if (excessDomChildren) {\n\t\t\t\t\texcessDomChildren.some(removeNode);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t}\n\n\t\t\tif (!newVNode._children) {\n\t\t\t\tnewVNode._children = oldVNode._children || [];\n\t\t\t}\n\n\t\t\tif (!e.then) markAsForce(newVNode);\n\t\t\toptions._catchError(e, newVNode, oldVNode);\n\t\t}\n\t} else {\n\t\toldDom = newVNode._dom = diffElementNodes(\n\t\t\toldVNode._dom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\tisHydrating,\n\t\t\trefQueue,\n\t\t\tparentDom\n\t\t);\n\t}\n\n\tif ((tmp = options.diffed)) tmp(newVNode);\n\n\treturn oldDom;\n}\n\n/**\n * Find the closing marker of a streamed range.\n * @param {PreactElement} start A `$s` marker opening a range\n * @param {PreactElement[]} [nodes] Collects the nodes inside the range\n * @returns {PreactElement} The closing marker, or undefined when `start` doesn't\n * open a range or the range is unclosed\n */\nfunction rangeEnd(start, nodes) {\n\tif (start && start.nodeType == 8 && start.data.startsWith('$s')) {\n\t\tfor (let depth = 1; (start = start.nextSibling); ) {\n\t\t\tif (start.nodeType == 8) {\n\t\t\t\tif (start.data.startsWith('$s')) depth++;\n\t\t\t\telse if (start.data.startsWith('/$s') && !--depth) return start;\n\t\t\t}\n\t\t\tif (nodes) nodes.push(start);\n\t\t}\n\t}\n}\n\nfunction markAsForce(vnode) {\n\tif (vnode) {\n\t\tif (vnode._component) vnode._component._bits |= COMPONENT_FORCE;\n\t\tif (vnode._children) vnode._children.some(markAsForce);\n\t}\n}\n\n/**\n * @param {Array<Component>} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {VNode} root\n */\nexport function commitRoot(commitQueue, root, refQueue) {\n\tfor (let i = 0; i < refQueue.length; ) {\n\t\tapplyRef(refQueue[i++], refQueue[i++], refQueue[i++]);\n\t}\n\n\tif (options._commit) options._commit(root, commitQueue);\n\n\tcommitQueue.some(c => {\n\t\ttry {\n\t\t\t// @ts-expect-error Reuse the commitQueue variable here so the type changes\n\t\t\tcommitQueue = c._renderCallbacks;\n\t\t\tc._renderCallbacks = [];\n\t\t\tcommitQueue.some(cb => {\n\t\t\t\t// @ts-expect-error See above comment on commitQueue\n\t\t\t\tcb.call(c);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t});\n}\n\n/**\n * Diff two virtual nodes representing DOM element\n * @param {PreactElement} dom The DOM element representing the virtual nodes\n * being diffed\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n * @param {PreactElement} parentDom The parent this element will be inserted\n * into; new nodes are created from its ownerDocument (e.g. iframes), or from\n * the global document for containers that don't have one\n * @returns {PreactElement}\n */\nfunction diffElementNodes(\n\tdom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\tisHydrating,\n\trefQueue,\n\tparentDom\n) {\n\tlet oldProps = oldVNode.props || EMPTY_OBJ;\n\tconst newProps = newVNode.props;\n\tconst nodeType = /** @type {string} */ (newVNode.type);\n\t/** @type {any} */\n\tlet i;\n\t/** @type {{ __html?: string }} */\n\tlet newHtml;\n\t/** @type {{ __html?: string }} */\n\tlet oldHtml;\n\t/** @type {ComponentChildren} */\n\tlet newChildren;\n\tlet value;\n\tlet inputValue;\n\tlet checked;\n\n\t// Tracks entering and exiting namespaces when descending through the tree.\n\tif (nodeType == 'svg') namespace = SVG_NAMESPACE;\n\telse if (nodeType == 'math') namespace = MATH_NAMESPACE;\n\telse if (!namespace) namespace = XHTML_NAMESPACE;\n\n\tif (excessDomChildren) {\n\t\tfor (i = 0; i < excessDomChildren.length; i++) {\n\t\t\tvalue = excessDomChildren[i];\n\n\t\t\t// if newVNode matches an element in excessDomChildren or the `dom`\n\t\t\t// argument matches an element in excessDomChildren, remove it from\n\t\t\t// excessDomChildren so it isn't later removed in diffChildren.\n\t\t\t// `localName` is only present on elements, so it doubles as the\n\t\t\t// element check for the non-text branch.\n\t\t\tif (\n\t\t\t\tvalue &&\n\t\t\t\t(nodeType ? value.localName == nodeType : value.nodeType == 3)\n\t\t\t) {\n\t\t\t\tdom = value;\n\t\t\t\texcessDomChildren[i] = NULL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!dom) {\n\t\tconst doc = parentDom.ownerDocument || document;\n\t\tif (!nodeType) {\n\t\t\treturn doc.createTextNode(newProps);\n\t\t}\n\n\t\tdom = doc.createElementNS(namespace, nodeType, newProps.is && newProps);\n\n\t\t// we are creating a new node, so we can assume this is a new subtree (in\n\t\t// case we are hydrating), this deopts the hydrate\n\t\tif (isHydrating) {\n\t\t\tif (options._hydrationMismatch)\n\t\t\t\toptions._hydrationMismatch(newVNode, excessDomChildren);\n\t\t\tisHydrating = false;\n\t\t}\n\t\t// we created a new parent, so none of the previously attached children can be reused:\n\t\texcessDomChildren = NULL;\n\t}\n\n\tif (!nodeType) {\n\t\t// During hydration, we still have to split merged text from SSR'd HTML.\n\t\tif (oldProps !== newProps && (!isHydrating || dom.data != newProps)) {\n\t\t\tdom.data = newProps;\n\t\t}\n\t} else {\n\t\t// A <template> holds its children in a separate document-fragment, both\n\t\t// when reading existing DOM and when inserting new nodes. `parentDom` is\n\t\t// unused from here on, so we reuse it as the container for our children.\n\t\t// @ts-expect-error\n\t\tparentDom = nodeType == 'template' ? dom.content : dom;\n\n\t\t// If excessDomChildren was not null, repopulate it with the current element's children:\n\t\texcessDomChildren =\n\t\t\tnodeType == 'textarea' && newProps.defaultValue != NULL\n\t\t\t\t? NULL\n\t\t\t\t: excessDomChildren && slice.call(parentDom.childNodes);\n\n\t\t// If we are in a situation where we are not hydrating but are using\n\t\t// existing DOM (e.g. replaceNode) we should read the existing DOM\n\t\t// attributes to diff them\n\t\tif (!isHydrating && excessDomChildren) {\n\t\t\t// Keep this a plain loop: an arrow function here would capture\n\t\t\t// `oldProps`, forcing V8 to context-allocate it and slowing down the\n\t\t\t// hot `for (i in oldProps)` loop below for every element we diff.\n\t\t\toldProps = {};\n\t\t\tfor (i = 0; i < dom.attributes.length; i++) {\n\t\t\t\tvalue = dom.attributes[i];\n\t\t\t\toldProps[value.name] = value.value;\n\t\t\t}\n\t\t}\n\n\t\tfor (i in oldProps) {\n\t\t\tvalue = oldProps[i];\n\t\t\tif (i == 'dangerouslySetInnerHTML') {\n\t\t\t\toldHtml = value;\n\t\t\t} else if (\n\t\t\t\ti != 'children' &&\n\t\t\t\t!(i in newProps) &&\n\t\t\t\t!(i == 'value' && 'defaultValue' in newProps) &&\n\t\t\t\t!(i == 'checked' && 'defaultChecked' in newProps)\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, NULL, value, namespace);\n\t\t\t}\n\t\t}\n\n\t\t// During hydration, props are not diffed at all (including dangerouslySetInnerHTML)\n\t\t// @TODO we should warn in debug mode when props don't match here.\n\t\tconst shouldRevalidateProps = oldVNode._flags & FORCE_PROPS_REVALIDATE;\n\t\tfor (i in newProps) {\n\t\t\tvalue = newProps[i];\n\t\t\tif (i == 'children') {\n\t\t\t\tnewChildren = value;\n\t\t\t} else if (i == 'dangerouslySetInnerHTML') {\n\t\t\t\tnewHtml = value;\n\t\t\t} else if (i == 'value') {\n\t\t\t\tinputValue = value;\n\t\t\t} else if (i == 'checked') {\n\t\t\t\tchecked = value;\n\t\t\t} else if (\n\t\t\t\t(!isHydrating || typeof value == 'function') &&\n\t\t\t\t(oldProps[i] !== value || (shouldRevalidateProps && value != NULL))\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, value, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\n\t\t// If the new vnode didn't have dangerouslySetInnerHTML, diff its children\n\t\tif (newHtml) {\n\t\t\t// Avoid re-applying the same '__html' if it did not changed between re-render\n\t\t\tif (\n\t\t\t\t!isHydrating &&\n\t\t\t\t(!oldHtml ||\n\t\t\t\t\t(newHtml.__html != oldHtml.__html && newHtml.__html != dom.innerHTML))\n\t\t\t) {\n\t\t\t\tdom.innerHTML = newHtml.__html;\n\t\t\t}\n\n\t\t\tnewVNode._children = [];\n\t\t} else {\n\t\t\tif (oldHtml) dom.textContent = '';\n\n\t\t\tif (\n\t\t\t\tnodeType == 'foreignObject' ||\n\t\t\t\t(namespace == MATH_NAMESPACE && MATHML_TOKEN_ELEMENTS.test(nodeType))\n\t\t\t) {\n\t\t\t\tnamespace = XHTML_NAMESPACE;\n\t\t\t}\n\n\t\t\tdiffChildren(\n\t\t\t\tparentDom,\n\t\t\t\tisArray(newChildren) ? newChildren : [newChildren],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnamespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\texcessDomChildren\n\t\t\t\t\t? excessDomChildren[0]\n\t\t\t\t\t: oldVNode._children && getDomSibling(oldVNode, 0),\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\t// Remove children that are not part of any vnode.\n\t\t\tif (excessDomChildren) excessDomChildren.some(removeNode);\n\t\t}\n\n\t\t// As above, don't diff props during hydration\n\t\tif (!isHydrating || nodeType == 'textarea') {\n\t\t\ti = 'value';\n\t\t\tif (nodeType == 'progress' && inputValue == NULL) {\n\t\t\t\tdom.removeAttribute(i);\n\t\t\t} else if (\n\t\t\t\tinputValue != UNDEFINED &&\n\t\t\t\t// #2756 For the <progress>-element the initial value is 0,\n\t\t\t\t// despite the attribute not being present. When the attribute\n\t\t\t\t// is missing the progress bar is treated as indeterminate.\n\t\t\t\t// To fix that we'll always update it when it is 0 for progress elements\n\t\t\t\t(inputValue !== dom[i] || (nodeType == 'progress' && !inputValue))\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, inputValue, oldProps[i], namespace);\n\t\t\t}\n\n\t\t\ti = 'checked';\n\t\t\tif (checked != UNDEFINED && checked != dom[i]) {\n\t\t\t\tsetProperty(dom, i, checked, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn dom;\n}\n\n/**\n * Invoke or update a ref, depending on whether it is a function or object ref.\n * @param {Ref<any>} ref\n * @param {any} value The element or component to attach, or `null` to detach\n * @param {VNode} vnode\n * @param {any} [owner] The vnode the ref is detached from\n */\nexport function applyRef(ref, value, vnode, owner) {\n\ttry {\n\t\tif (typeof ref == 'function') {\n\t\t\t// Store the cleanup on the element or component rather than on the\n\t\t\t// ref function, which can be shared between several of them. The\n\t\t\t// slot is cleared on detach, so detaching twice is a no-op.\n\t\t\tif (value) value._refCleanup = ref(value) || 1;\n\t\t\telse if (\n\t\t\t\towner &&\n\t\t\t\t(owner = owner._component || owner._dom) &&\n\t\t\t\t(value = owner._refCleanup)\n\t\t\t) {\n\t\t\t\towner._refCleanup = NULL;\n\t\t\t\tif (typeof value == 'function') value();\n\t\t\t\telse ref(NULL);\n\t\t\t}\n\t\t} else ref.current = value;\n\t} catch (e) {\n\t\toptions._catchError(e, vnode);\n\t}\n}\n\n/**\n * Unmount a virtual node from the tree and apply DOM changes\n * @param {VNode} vnode The virtual node to unmount\n * @param {VNode} parentVNode The parent of the VNode that initiated the unmount\n * @param {boolean} [skipRemove] Flag that indicates that a parent node of the\n * current element is already detached from the DOM.\n */\nexport function unmount(vnode, parentVNode, skipRemove) {\n\tlet r, end, nodes;\n\tif (options.unmount) options.unmount(vnode);\n\n\tif ((r = vnode.ref) && (!r.current || r.current == vnode._dom)) {\n\t\tapplyRef(r, NULL, parentVNode, vnode);\n\t}\n\n\tif ((r = vnode._component)) {\n\t\tif (r.componentWillUnmount) {\n\t\t\ttry {\n\t\t\t\tr.componentWillUnmount();\n\t\t\t} catch (e) {\n\t\t\t\toptions._catchError(e, parentVNode);\n\t\t\t}\n\t\t}\n\n\t\tr._parentDom = r._globalContext = NULL;\n\t}\n\n\tif ((r = vnode._children)) {\n\t\tfor (let i = 0; i < r.length; i++) {\n\t\t\tif (r[i]) {\n\t\t\t\tunmount(\n\t\t\t\t\tr[i],\n\t\t\t\t\tparentVNode,\n\t\t\t\t\t// A portal's children live in another container, so a removed\n\t\t\t\t\t// host ancestor doesn't detach them; always remove them.\n\t\t\t\t\ttypeof vnode.type == 'function'\n\t\t\t\t\t\t? skipRemove && !vnode.props._parentDom\n\t\t\t\t\t\t: true\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// A component that suspended while hydrating owns its range's markers,\n\t// and its content too while still pending.\n\tif (\n\t\t!skipRemove &&\n\t\t(r = vnode._component) &&\n\t\t(r = r._excess) &&\n\t\t(end = rangeEnd(r, (nodes = [])))\n\t) {\n\t\tif (r == vnode._dom) nodes.some(removeNode);\n\t\tremoveNode(end);\n\t\tremoveNode(r);\n\t}\n\n\tif ((r = vnode._dom)) {\n\t\tif (!skipRemove) removeNode(r);\n\t\tif (r._listeners) r._listeners = NULL;\n\t}\n\n\tvnode._dom = vnode._component = vnode._parent = NULL;\n}\n\n/** The `.render()` method for a PFC backing instance. */\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n", "import { EMPTY_OBJ, MODE_HYDRATE, NULL } from './constants';\nimport { commitRoot, diff } from './diff/index';\nimport { createVNode, Fragment } from './create-element';\nimport options from './options';\nimport { slice } from './util';\n\n/**\n * Render a Preact virtual node into a DOM element\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to render into\n */\nexport function render(vnode, parentDom) {\n\tif (options._root) options._root(vnode, parentDom);\n\n\t// https://github.com/preactjs/preact/issues/3794\n\t// https://github.com/preactjs/preact/issues/5118\n\tif (parentDom.nodeType == 9) {\n\t\tparentDom = parentDom.documentElement;\n\t}\n\n\t// @ts-expect-error\n\tlet isHydrating = vnode && vnode._flags & MODE_HYDRATE;\n\n\t// To be able to support calling `render()` multiple times on the same\n\t// DOM node, we need to obtain a reference to the previous tree. We do\n\t// this by assigning a new `_children` property to DOM nodes which points\n\t// to the last rendered tree. By default this property is not present, which\n\t// means that we are mounting a new tree for the first time.\n\tlet oldVNode = isHydrating ? NULL : parentDom._children;\n\n\tparentDom._children = createVNode(Fragment, { children: [vnode] });\n\n\t// List of effects that need to be called after diffing.\n\tlet commitQueue = [],\n\t\trefQueue = [];\n\n\tdiff(\n\t\tparentDom,\n\t\t// Determine the new vnode tree and store it on the DOM element on\n\t\t// our custom `_children` property.\n\t\tparentDom._children,\n\t\toldVNode || EMPTY_OBJ,\n\t\tEMPTY_OBJ,\n\t\tparentDom.namespaceURI,\n\t\toldVNode\n\t\t\t? NULL\n\t\t\t: parentDom.firstChild\n\t\t\t\t? slice.call(parentDom.childNodes)\n\t\t\t\t: NULL,\n\t\tcommitQueue,\n\t\toldVNode ? oldVNode._dom : parentDom.firstChild,\n\t\t// @ts-expect-error we are doing a bit-wise operation so it's either 0 or true\n\t\tisHydrating,\n\t\trefQueue\n\t);\n\n\t// Flush all queued effects\n\tcommitRoot(commitQueue, parentDom._children, refQueue);\n\n\t// The live children are tracked on _children after diffing.\n\tparentDom._children.props.children = NULL;\n}\n\n/**\n * Update an existing DOM element with data from a Preact virtual node\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to update\n */\nexport function hydrate(vnode, parentDom) {\n\t// Only objects can carry the flag. Primitives (null, strings, numbers,\n\t// booleans) render into the existing DOM the same way hydrating would.\n\tif (vnode && typeof vnode == 'object') {\n\t\t// @ts-expect-error\n\t\tvnode._flags |= MODE_HYDRATE;\n\t}\n\trender(vnode, parentDom);\n}\n", "import { createVNode } from './create-element';\n\n/**\n * Portal component. A unique type is used instead of Fragment so that a\n * portal returned directly from a component isn't collapsed into the\n * component's children array by the Fragment unwrapping in `diff()`.\n * @param {object} props\n */\nfunction Portal(props) {\n\treturn props.children;\n}\n\n/**\n * Create a `Portal` to continue rendering the vnode tree at a different DOM node\n * @param {import('./internal').ComponentChildren} vnode The vnode to render\n * @param {import('./internal').PreactElement} container The DOM node to continue rendering in to\n */\nexport function createPortal(vnode, container) {\n\treturn createVNode(Portal, { _parentDom: container, children: vnode });\n}\n", "import { resetRenderCount } from '../component';\nimport {\n\tCOMPONENT_DIRTY,\n\tCOMPONENT_PENDING_ERROR,\n\tCOMPONENT_PROCESSING_EXCEPTION,\n\tCOMPONENT_FORCE\n} from '../constants';\n\n/**\n * Find the closest error boundary to a thrown error and call it\n * @param {object} error The thrown value\n * @param {import('../internal').VNode} vnode The vnode that threw the error that was caught (except\n * for unmounting when this parameter is the highest parent that was being\n * unmounted)\n * @param {import('../internal').VNode} [oldVNode]\n * @param {import('../internal').ErrorInfo} [errorInfo]\n */\nexport function _catchError(error, vnode, oldVNode, errorInfo) {\n\t/** @type {import('../internal').Component} */\n\tlet component,\n\t\t/** @type {import('../internal').ComponentType} */\n\t\tctor,\n\t\t/** @type {number} */\n\t\thandled;\n\n\tfor (; (vnode = vnode._parent); ) {\n\t\tif (\n\t\t\t(component = vnode._component) &&\n\t\t\t!(component._bits & COMPONENT_PROCESSING_EXCEPTION)\n\t\t) {\n\t\t\tcomponent._bits |= COMPONENT_FORCE;\n\t\t\ttry {\n\t\t\t\tctor = component.constructor;\n\n\t\t\t\t// `handled` is reassigned before any read on every boundary\n\t\t\t\t// candidate, so nothing carries over to the next ancestor.\n\t\t\t\tif ((handled = ctor && ctor.getDerivedStateFromError)) {\n\t\t\t\t\tcomponent.setState(ctor.getDerivedStateFromError(error));\n\t\t\t\t}\n\n\t\t\t\tif (component.componentDidCatch) {\n\t\t\t\t\tcomponent.componentDidCatch(error, errorInfo || {});\n\t\t\t\t\thandled = 1;\n\t\t\t\t}\n\n\t\t\t\t// This is an error boundary. Mark it as having bailed out, and whether it was mid-hydration.\n\t\t\t\tif (handled && component._bits & COMPONENT_DIRTY) {\n\t\t\t\t\tcomponent._bits |= COMPONENT_PENDING_ERROR;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Reset rerender count to 0, so that the next render will not be skipped\n\t// when we leverage prefresh\n\tresetRenderCount();\n\tthrow error;\n}\n", "import { options as _options } from 'preact';\n\nconst ObjectIs = Object.is;\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n\n/** @type {import('./internal').Component} */\nlet previousComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\n/**\n * Passive (useEffect) hook states of unmounted components whose cleanup is\n * still pending. Deferred to the after-paint flush to match React, which runs\n * passive destroys after the commit has painted. Each state's `_passive` holds\n * the surviving component its errors should be routed to.\n * @type {Array<import('./internal').EffectHookState>}\n */\nlet unmountCleanups = [];\n\n// Cast to use internal Options type\nconst options = /** @type {import('./internal').Options} */ (_options);\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\nlet oldRoot = options._root;\n\n// We take the minimum timeout for requestAnimationFrame to ensure that\n// the callback is invoked after the next frame. 35ms is based on a 30hz\n// refresh rate, which is the minimum rate for a smooth user experience.\nconst RAF_TIMEOUT = 35;\nlet prevRaf;\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._root = (vnode, parentDom) => {\n\tif (vnode && parentDom._children && parentDom._children._mask) {\n\t\tvnode._mask = parentDom._children._mask;\n\t}\n\n\tif (oldRoot) oldRoot(vnode, parentDom);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\tif (previousComponent == currentComponent) {\n\t\t\tcurrentComponent._renderCallbacks = [];\n\t\t} else {\n\t\t\thooks._pendingEffects.some(invokeCleanup);\n\t\t\thooks._pendingEffects.some(invokeEffect);\n\t\t\tcurrentIndex = 0;\n\t\t}\n\t\thooks._pendingEffects = [];\n\n\t\t// Runs before every render, forced or not, so `shouldComponentUpdate`\n\t\t// never has to apply these itself.\n\t\thooks._list.some(hookItem => {\n\t\t\tif (hookItem._nextValue) {\n\t\t\t\thookItem._value = hookItem._nextValue;\n\t\t\t}\n\t\t\thookItem._pendingArgs = hookItem._nextValue = undefined;\n\t\t});\n\t}\n\tpreviousComponent = currentComponent;\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tif (c.__hooks._pendingEffects.length) afterPaint(afterPaintEffects.push(c));\n\t\t// `_pendingArgs` is cleared again by `options._render` before anything\n\t\t// can read it, so committing it here is enough.\n\t\tc.__hooks._list.some(hookItem => {\n\t\t\tif (hookItem._pendingArgs) hookItem._args = hookItem._pendingArgs;\n\t\t});\n\t}\n\tpreviousComponent = currentComponent = null;\n};\n\n// TODO: Improve typing of commitQueue parameter\n/** @type {(vnode: import('./internal').VNode, commitQueue: any) => void} */\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.some(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tlet hasErrored, errorParent;\n\t\tc.__hooks._list.some(s => {\n\t\t\ttry {\n\t\t\t\t// Layout cleanups have to run before the new DOM is in place, so\n\t\t\t\t// they stay in the commit phase (see #1886). Passive cleanups run\n\t\t\t\t// after paint, before any new passive effect (see #4299), with\n\t\t\t\t// `_passive` repurposed to hold the error-routing component.\n\t\t\t\tif (s._passive && s._cleanup) {\n\t\t\t\t\tif (errorParent === undefined) {\n\t\t\t\t\t\terrorParent = vnode._parent;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\terrorParent &&\n\t\t\t\t\t\t\t!(errorParent._component && errorParent._component._parentDom)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\terrorParent = errorParent._parent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorParent = errorParent && errorParent._component;\n\t\t\t\t\t}\n\t\t\t\t\ts._passive = errorParent;\n\t\t\t\t\tafterPaint(unmountCleanups.push(s));\n\t\t\t\t} else {\n\t\t\t\t\tinvokeCleanup(s);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tc.__hooks = undefined;\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The type of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\n\treturn hooks._list[index];\n}\n\n/**\n * @template {unknown} S\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} [initialState]\n * @returns {[S, (state: S) => void]}\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @template {unknown} S\n * @template {unknown} A\n * @param {import('./index').Reducer<S, A>} reducer\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ S, (state: S) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst currentValue = hookState._nextValue\n\t\t\t\t\t? hookState._nextValue[0]\n\t\t\t\t\t: hookState._value[0];\n\t\t\t\tconst nextValue = hookState._reducer(currentValue, action);\n\n\t\t\t\tif (!ObjectIs(currentValue, nextValue)) {\n\t\t\t\t\thookState._nextValue = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\n\t\tif (!currentComponent._hasScuFromHooks) {\n\t\t\tcurrentComponent._hasScuFromHooks = true;\n\t\t\tconst prevScu = currentComponent.shouldComponentUpdate;\n\n\t\t\t// This SCU has the purpose of bailing out after repeated updates\n\t\t\t// to stateful hooks. We store the next value in `_nextValue[0]` and\n\t\t\t// keep doing that for all state setters; if we have next states and\n\t\t\t// all next states within a component end up being equal to their\n\t\t\t// original state we are safe to bail out for this specific component.\n\t\t\tcurrentComponent.shouldComponentUpdate = function (p, s, c) {\n\t\t\t\tconst hooks = this.__hooks;\n\t\t\t\tif (!hooks) return true;\n\n\t\t\t\t// We check whether we have components with a nextValue set that\n\t\t\t\t// have values that aren't equal to one another this pushes\n\t\t\t\t// us to update further down the tree\n\t\t\t\tlet updatedHook = false;\n\t\t\t\tlet shouldUpdate = this.props != p;\n\t\t\t\thooks._list.some(hookItem => {\n\t\t\t\t\tif (hookItem._nextValue) {\n\t\t\t\t\t\tupdatedHook = true;\n\t\t\t\t\t\tif (!ObjectIs(hookItem._value[0], hookItem._nextValue[0])) {\n\t\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (prevScu) {\n\t\t\t\t\tconst result = prevScu.call(this, p, s, c);\n\t\t\t\t\treturn updatedHook ? result || shouldUpdate : result;\n\t\t\t\t}\n\n\t\t\t\treturn !updatedHook || shouldUpdate;\n\t\t\t};\n\t\t}\n\t}\n\n\treturn hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._passive = true;\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._passive = false;\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\n/** @type {(initialValue: unknown) => unknown} */\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') {\n\t\t\t\tconst result = ref(createHandle());\n\t\t\t\treturn () => {\n\t\t\t\t\tref(null);\n\t\t\t\t\tif (result && typeof result == 'function') result();\n\t\t\t\t};\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => (ref.current = null);\n\t\t\t}\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @template {unknown} T\n * @param {() => T} factory\n * @param {unknown[]} args\n * @returns {T}\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState<T>} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {unknown[]} args\n * @returns {() => void}\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(\n\t\t\tformatter ? formatter(value) : /** @type {any}*/ (value)\n\t\t);\n\t}\n}\n\n/**\n * @param {(error: unknown, errorInfo: import('preact').ErrorInfo) => void} cb\n * @returns {[unknown, () => void]}\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = (err, errorInfo) => {\n\t\t\tif (state._value) state._value(err, errorInfo);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/** @type {() => string} */\nexport function useId() {\n\t/** @type {import('./internal').IdHookState} */\n\tconst state = getHookState(currentIndex++, 11);\n\tif (!state._value) {\n\t\t// Grab either the root node or the nearest async boundary node.\n\t\t/** @type {import('./internal').VNode} */\n\t\tlet root = currentComponent._vnode;\n\t\twhile (!root._mask && root._parent) {\n\t\t\troot = root._parent;\n\t\t}\n\n\t\tlet mask = root._mask || (root._mask = [0, 0]);\n\t\tstate._value = 'P' + mask[0] + '-' + mask[1]++;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tlet component;\n\t// The loop picks up components unmounted by an effect we just invoked, which\n\t// don't necessarily schedule a flush of their own.\n\tdo {\n\t\t// Unmounted components' passive cleanups run before any new passive\n\t\t// effect, mirroring React running all destroys before any create.\n\t\twhile ((component = unmountCleanups.shift())) {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(component);\n\t\t\t} catch (e) {\n\t\t\t\tcomponent = /** @type {any} */ (component._passive);\n\t\t\t\toptions._catchError(e, { _parent: component && component._vnode });\n\t\t\t}\n\t\t}\n\n\t\twhile ((component = afterPaintEffects.shift())) {\n\t\t\tconst hooks = component.__hooks;\n\t\t\tif (!component._parentDom || !hooks) continue;\n\t\t\ttry {\n\t\t\t\thooks._pendingEffects.some(invokeCleanup);\n\t\t\t\thooks._pendingEffects.some(invokeEffect);\n\t\t\t\thooks._pendingEffects = [];\n\t\t\t} catch (e) {\n\t\t\t\thooks._pendingEffects = [];\n\t\t\t\toptions._catchError(e, component._vnode);\n\t\t\t}\n\t\t}\n\t} while (unmountCleanups.length);\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n * @returns {void}\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength == 1 || prevRaf != options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').HookState} hook\n * @returns {void}\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\n\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n * @returns {void}\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {unknown[]} oldArgs\n * @param {unknown[]} newArgs\n * @returns {boolean}\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length != newArgs.length ||\n\t\tnewArgs.some((arg, index) => !ObjectIs(arg, oldArgs[index]))\n\t);\n}\n\n/**\n * @template Arg\n * @param {Arg} arg\n * @param {(arg: Arg) => any} f\n * @returns {any}\n */\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n", "// DT.ly document model \u2014 an After Effects-style project as plain JSON.\n// Units follow AE: time in seconds, scale and opacity in percent, rotation in degrees.\n\nexport type Vec2 = [number, number];\nexport type Color = string; // any CSS color: '#E8692A', 'rgba(0,0,0,.5)'\n\nexport type EaseName =\n | 'linear' | 'hold'\n | 'easeIn' | 'easeOut' | 'easyEase'\n | 'quadOut' | 'cubicOut' | 'expoIn' | 'expoOut' | 'expoInOut' | 'backOut' | 'backIn' | 'elasticOut' | 'bounceOut';\n// A named curve, a cubic-bezier [x1, y1, x2, y2], or a damped spring.\nexport type Ease = EaseName | [number, number, number, number] | {spring: {stiffness?: number; damping?: number; mass?: number}};\n\n// `ease` shapes the segment that LEAVES this keyframe (towards the next one).\nexport interface Keyframe<T> { t: number; v: T; ease?: Ease }\nexport interface Wiggle { freq: number; amp: number; seed?: number }\nexport interface Animated<T> { keyframes: Keyframe<T>[]; wiggle?: Wiggle }\nexport type Prop<T> = T | Animated<T>;\n\nexport interface Transform {\n anchor?: Prop<Vec2>;\n position?: Prop<Vec2>;\n scale?: Prop<Vec2>; // percent\n rotation?: Prop<number>; // degrees\n opacity?: Prop<number>; // percent\n skew?: Prop<number>; // degrees, along X\n}\n\nexport type Effect =\n | {type: 'blur'; radius: Prop<number>}\n | {type: 'dropShadow'; color?: Color; blur?: Prop<number>; distance?: Prop<number>; angle?: number; opacity?: Prop<number>}\n | {type: 'glow'; color?: Color; radius?: Prop<number>; strength?: Prop<number>}\n | {type: 'fill'; color: Color; opacity?: Prop<number>}\n | {type: 'brightness'; amount: Prop<number>} // percent, 100 = unchanged\n | {type: 'saturate'; amount: Prop<number>}\n | {type: 'contrast'; amount: Prop<number>}\n // True perspective: the layer's corners (top-left, top-right, bottom-right, bottom-left, layer space).\n | {type: 'cornerPin'; corners: Prop<[Vec2, Vec2, Vec2, Vec2]>}\n // 3D tilt of a flat layer about its centre (device mockups, cards); degrees, perspective in px.\n | {type: 'tilt'; rotateX?: Prop<number>; rotateY?: Prop<number>; rotateZ?: Prop<number>; perspective?: number}\n // Stylised: chromatic aberration, digital glitch slices, wavy warp.\n | {type: 'rgbSplit'; amount: Prop<number>; angle?: number}\n | {type: 'glitch'; amount: Prop<number>; seed?: number; hold?: number; rgb?: boolean}\n | {type: 'wave'; amplitude: Prop<number>; wavelength?: number; speed?: number; direction?: 'horizontal' | 'vertical'}\n // Colour grading. Curves points are [in, out] pairs in 0..1.\n | {type: 'curves'; master?: [number, number][]; r?: [number, number][]; g?: [number, number][]; b?: [number, number][]}\n | {type: 'colorBalance'; shadows?: [number, number, number]; midtones?: [number, number, number]; highlights?: [number, number, number]} // each -1..1\n | {type: 'exposure'; stops: Prop<number>}\n | {type: 'temperature'; amount: Prop<number>} // -100 cool \u2026 +100 warm\n | {type: 'lut'; src: string; intensity?: Prop<number>} // .cube 3D LUT\n | {type: 'vignette'; amount: Prop<number>; softness?: number; color?: Color};\n\nexport interface Mask {\n shape: 'rect' | 'ellipse' | 'path';\n // rect/ellipse: [x, y, w, h] in layer space; path: list of points\n rect?: Prop<[number, number, number, number]>;\n points?: Vec2[];\n path?: Prop<string>; // SVG path data for shape \"path\" (animatable, morphs)\n radius?: number;\n inverted?: boolean;\n}\n\nexport interface Matte { layer: string; mode: 'alpha' | 'alphaInverted' }\n\nexport type BlendMode = 'normal' | 'multiply' | 'screen' | 'overlay' | 'add' | 'darken' | 'lighten' | 'softLight' | 'difference';\n\n// Text animators: AE-style per-unit animation with a stagger, so every grapheme/word/line\n// starts `stagger` seconds after the previous one, moving FROM the given offsets to rest.\nexport interface TextAnimator {\n unit: 'grapheme' | 'word' | 'line';\n mode?: 'in' | 'out'; // 'out' animates from rest TO the offsets, ending at `delay + ...`\n delay?: number; // seconds from layer inPoint (for 'out': seconds before layer outPoint)\n stagger?: number;\n duration?: number;\n order?: 'forward' | 'reverse' | 'center' | 'edges' | 'random';\n ease?: Ease;\n seed?: number;\n clip?: boolean; // reveal each line through its own box (classic masked line reveal)\n from: {opacity?: number; x?: number; y?: number; scale?: number; rotation?: number; blur?: number; tracking?: number; color?: Color};\n}\n\ninterface LayerBase {\n id: string;\n name?: string;\n inPoint?: number; // seconds, default 0\n outPoint?: number; // seconds, default comp duration\n parent?: string; // layer id \u2014 inherits transform (not opacity), like AE parenting\n transform?: Transform;\n blendMode?: BlendMode;\n effects?: Effect[];\n masks?: Mask[];\n matte?: Matte; // track matte: this layer is shown through another layer\n hidden?: boolean; // e.g. layers used only as mattes\n motionBlur?: {samples?: number; shutter?: number}; // shutter in degrees, AE default 180\n}\n\nexport interface SolidLayer extends LayerBase { type: 'solid'; color: Prop<Color>; size?: Vec2 }\nexport interface NullLayer extends LayerBase { type: 'null' }\nexport type Gradient =\n | {linear: {from: Vec2; to: Vec2; stops: [number, Color][]}}\n | {radial: {center: Vec2; radius: number; stops: [number, Color][]}};\n\n// AE-style repeater: draws `copies` of the shape, each offset by the transform below.\nexport interface Repeater {\n copies: Prop<number>;\n offset?: number;\n position?: Vec2; // per copy\n rotation?: number; // degrees per copy\n scale?: Vec2; // percent per copy, e.g. [90, 90]\n anchor?: Vec2;\n startOpacity?: number; // percent, first copy\n endOpacity?: number; // percent, last copy\n}\n\nexport interface ShapeLayer extends LayerBase {\n type: 'shape';\n shape: 'rect' | 'ellipse' | 'polygon' | 'star' | 'path' | 'line';\n size?: Prop<Vec2>; // rect/ellipse\n radius?: Prop<number>; // rect corner radius / polygon & star outer radius\n innerRadius?: Prop<number>; // star\n sides?: number; // polygon / star points\n path?: Prop<string>; // SVG path data; keyframing different paths morphs between them\n points?: Vec2[]; // simple polyline alternative to `path`\n closed?: boolean;\n fill?: Prop<Color> | Gradient;\n fillRule?: 'nonzero' | 'evenodd';\n stroke?: Prop<Color>;\n strokeWidth?: Prop<number>;\n lineCap?: 'butt' | 'round' | 'square';\n lineJoin?: 'miter' | 'round' | 'bevel';\n dash?: number[];\n trim?: {start?: Prop<number>; end?: Prop<number>; offset?: Prop<number>}; // percent of path length\n repeater?: Repeater;\n}\nexport interface TextLayer extends LayerBase {\n type: 'text';\n text: string;\n font?: string; // family registered in project.fonts\n weight?: number;\n size?: Prop<number>;\n color?: Prop<Color>;\n align?: 'left' | 'center' | 'right';\n lineHeight?: number; // multiple of size\n tracking?: Prop<number>; // extra px between graphemes\n maxWidth?: number; // wrap width in px\n stroke?: {color: Color; width: number};\n shadow?: {color: Color; blur: number; x?: number; y?: number};\n box?: {color: Prop<Color>; padding?: [number, number]; radius?: number; reveal?: Prop<number>}; // background plate; reveal 0-100 wipes it in\n // Counters: `{value}` in `text` shows this number (animate it to count), formatted below.\n value?: Prop<number>;\n format?: {decimals?: number; prefix?: string; suffix?: string; locale?: string; grouping?: boolean};\n // Word-by-word highlight (captions): one [start, end] per word of `text`, in comp seconds.\n karaoke?: {words: [number, number][]; color?: Color; mode?: 'current' | 'spoken'; scale?: number; box?: Color};\n animators?: TextAnimator[];\n}\nexport interface ImageLayer extends LayerBase { type: 'image'; src: string; size?: Vec2; fit?: 'cover' | 'contain' | 'fill' }\nexport interface VideoLayer extends LayerBase {\n type: 'video';\n src: string;\n size?: Vec2;\n fit?: 'cover' | 'contain' | 'fill';\n trimIn?: number; // seconds into the source\n speed?: number; // 0.5 = half speed\n volume?: Prop<number>; // 0-1, default 0 (muted)\n}\nexport interface AudioLayer extends LayerBase {\n type: 'audio';\n src: string;\n trimIn?: number;\n volume?: Prop<number>; // 0-1\n fadeIn?: number;\n fadeOut?: number;\n}\n// A Lottie (Bodymovin JSON) animation played as a layer. `size` is the box it fits into (contain).\nexport interface LottieLayer extends LayerBase {\n type: 'lottie';\n src: string;\n size?: Vec2;\n loop?: boolean; // default true\n speed?: number;\n timeOffset?: number; // seconds into the animation at the layer's inPoint\n frames?: [number, number]; // play only this Lottie frame range\n}\n// Adjustment layer: its effects apply to everything below it in the comp (within its in/out and masks).\nexport interface AdjustmentLayer extends LayerBase { type: 'adjustment' }\nexport interface PrecompLayer extends LayerBase { type: 'precomp'; comp: string; timeOffset?: number; speed?: number }\n\nexport type Layer = SolidLayer | NullLayer | ShapeLayer | TextLayer | ImageLayer | VideoLayer | AudioLayer | PrecompLayer | LottieLayer | AdjustmentLayer;\nexport type LayerType = Layer['type'];\n// A layer before it has an id (Omit distributed over the union).\nexport type NewLayer = Layer extends infer L ? (L extends Layer ? Omit<L, 'id'> & {id?: string} : never) : never;\n\nexport interface Composition {\n id: string;\n name?: string;\n width: number;\n height: number;\n fps: number;\n duration: number;\n background?: Color;\n layers: Layer[]; // index 0 is the TOP layer, as in After Effects\n markers?: {t: number; label: string}[];\n}\n\nexport interface Project {\n dtly: 1;\n name: string;\n root: string; // id of the comp that gets rendered\n fonts?: Record<string, string[]>; // family -> font file paths (relative to the project file)\n comps: Composition[];\n}\n\nexport const isAnimated = <T>(p: Prop<T> | undefined): p is Animated<T> =>\n typeof p === 'object' && p !== null && !Array.isArray(p) && 'keyframes' in p;\n", "export type RGBA = [number, number, number, number];\n\nconst NAMED: Record<string, string> = {\n white: '#ffffff', black: '#000000', red: '#ff0000', green: '#008000', blue: '#0000ff',\n yellow: '#ffff00', orange: '#ffa500', transparent: '#00000000', gray: '#808080', grey: '#808080',\n};\n\nexport const parseColor = (c: string): RGBA | null => {\n const s = (NAMED[c.trim().toLowerCase()] ?? c).trim();\n if (s.startsWith('#')) {\n let h = s.slice(1);\n if (h.length === 3 || h.length === 4) h = [...h].map((ch) => ch + ch).join('');\n if (h.length !== 6 && h.length !== 8) return null;\n const n = (i: number) => parseInt(h.slice(i, i + 2), 16);\n return [n(0), n(2), n(4), h.length === 8 ? n(6) / 255 : 1];\n }\n const m = s.match(/^rgba?\\(([^)]+)\\)$/i);\n if (m) {\n const p = m[1].split(/[\\s,\\/]+/).filter(Boolean).map(Number);\n return [p[0], p[1], p[2], p[3] ?? 1];\n }\n return null;\n};\n\nexport const rgbaString = ([r, g, b, a]: RGBA) =>\n `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${Math.max(0, Math.min(1, a)).toFixed(4)})`;\n\nexport const withAlpha = (c: string, alpha: number) => {\n const p = parseColor(c);\n return p ? rgbaString([p[0], p[1], p[2], p[3] * alpha]) : c;\n};\n", "// Vector paths: SVG path data \u2192 cubic segments \u2192 polylines, lengths, trims, morphs.\n// Shared by shape layers, SVG import, Lottie and map routes.\nimport type {Vec2} from './model.js';\n\nexport type Seg = {kind: 'M'; p: Vec2} | {kind: 'L'; p: Vec2} | {kind: 'C'; c1: Vec2; c2: Vec2; p: Vec2} | {kind: 'Z'};\nexport type Path = Seg[];\n\n// Parses SVG path data into absolute M/L/C/Z segments (H, V, S, Q, T and A are converted).\nexport const parsePath = (d: string): Path => {\n const out: Path = [];\n const tokens = d.match(/[a-df-z]|-?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?/gi) ?? [];\n let i = 0, cmd = '', cur: Vec2 = [0, 0], start: Vec2 = [0, 0], lastC: Vec2 | null = null, lastQ: Vec2 | null = null;\n const num = () => Number(tokens[i++]);\n const isNum = () => i < tokens.length && !/^[a-z]$/i.test(tokens[i]);\n while (i < tokens.length) {\n if (/^[a-z]$/i.test(tokens[i])) cmd = tokens[i++];\n else if (!cmd) { i++; continue; }\n const rel = cmd === cmd.toLowerCase();\n const R = (p: Vec2): Vec2 => (rel ? [cur[0] + p[0], cur[1] + p[1]] : p);\n const C = cmd.toUpperCase();\n if (C === 'Z') { out.push({kind: 'Z'}); cur = start; lastC = lastQ = null; if (!isNum()) continue; }\n do {\n if (C === 'M') { cur = R([num(), num()]); start = cur; out.push({kind: 'M', p: cur}); cmd = rel ? 'l' : 'L'; lastC = lastQ = null; break; }\n if (C === 'L') { cur = R([num(), num()]); out.push({kind: 'L', p: cur}); lastC = lastQ = null; }\n else if (C === 'H') { const x = num(); cur = [rel ? cur[0] + x : x, cur[1]]; out.push({kind: 'L', p: cur}); lastC = lastQ = null; }\n else if (C === 'V') { const y = num(); cur = [cur[0], rel ? cur[1] + y : y]; out.push({kind: 'L', p: cur}); lastC = lastQ = null; }\n else if (C === 'C') { const c1 = R([num(), num()]), c2 = R([num(), num()]), p = R([num(), num()]); out.push({kind: 'C', c1, c2, p}); cur = p; lastC = c2; lastQ = null; }\n else if (C === 'S') { const c1: Vec2 = lastC ? [2 * cur[0] - lastC[0], 2 * cur[1] - lastC[1]] : cur; const c2 = R([num(), num()]), p = R([num(), num()]); out.push({kind: 'C', c1, c2, p}); cur = p; lastC = c2; lastQ = null; }\n else if (C === 'Q' || C === 'T') {\n const q: Vec2 = C === 'Q' ? R([num(), num()]) : lastQ ? [2 * cur[0] - lastQ[0], 2 * cur[1] - lastQ[1]] : cur;\n const p = R([num(), num()]);\n out.push({kind: 'C', c1: [cur[0] + (2 / 3) * (q[0] - cur[0]), cur[1] + (2 / 3) * (q[1] - cur[1])], c2: [p[0] + (2 / 3) * (q[0] - p[0]), p[1] + (2 / 3) * (q[1] - p[1])], p});\n cur = p; lastQ = q; lastC = null;\n } else if (C === 'A') {\n const rx = num(), ry = num(), rot = num(), large = num(), sweep = num(), p = R([num(), num()]);\n for (const s of arcToCubics(cur, p, rx, ry, rot, !!large, !!sweep)) out.push(s);\n cur = p; lastC = lastQ = null;\n } else { i++; break; }\n } while (isNum());\n }\n return out;\n};\n\n// SVG elliptical arc \u2192 cubic beziers (SVG spec F.6).\nconst arcToCubics = (p0: Vec2, p1: Vec2, rx: number, ry: number, deg: number, large: boolean, sweep: boolean): Seg[] => {\n if (!rx || !ry) return [{kind: 'L', p: p1}];\n rx = Math.abs(rx); ry = Math.abs(ry);\n const phi = (deg * Math.PI) / 180, cos = Math.cos(phi), sin = Math.sin(phi);\n const dx = (p0[0] - p1[0]) / 2, dy = (p0[1] - p1[1]) / 2;\n const x1 = cos * dx + sin * dy, y1 = -sin * dx + cos * dy;\n const lam = (x1 * x1) / (rx * rx) + (y1 * y1) / (ry * ry);\n if (lam > 1) { rx *= Math.sqrt(lam); ry *= Math.sqrt(lam); }\n const sign = large === sweep ? -1 : 1;\n const num = rx * rx * ry * ry - rx * rx * y1 * y1 - ry * ry * x1 * x1;\n const co = sign * Math.sqrt(Math.max(0, num / (rx * rx * y1 * y1 + ry * ry * x1 * x1)));\n const cx1 = (co * rx * y1) / ry, cy1 = (-co * ry * x1) / rx;\n const cx = cos * cx1 - sin * cy1 + (p0[0] + p1[0]) / 2, cy = sin * cx1 + cos * cy1 + (p0[1] + p1[1]) / 2;\n const ang = (ux: number, uy: number, vx: number, vy: number) => { const a = Math.atan2(ux * vy - uy * vx, ux * vx + uy * vy); return a; };\n let t1 = ang(1, 0, (x1 - cx1) / rx, (y1 - cy1) / ry);\n let dt = ang((x1 - cx1) / rx, (y1 - cy1) / ry, (-x1 - cx1) / rx, (-y1 - cy1) / ry);\n if (!sweep && dt > 0) dt -= Math.PI * 2;\n if (sweep && dt < 0) dt += Math.PI * 2;\n const n = Math.ceil(Math.abs(dt) / (Math.PI / 2));\n const segs: Seg[] = [];\n const step = dt / n, k = (4 / 3) * Math.tan(step / 4);\n const pt = (a: number): Vec2 => [cx + rx * Math.cos(a) * cos - ry * Math.sin(a) * sin, cy + rx * Math.cos(a) * sin + ry * Math.sin(a) * cos];\n const der = (a: number): Vec2 => [-rx * Math.sin(a) * cos - ry * Math.cos(a) * sin, -rx * Math.sin(a) * sin + ry * Math.cos(a) * cos];\n for (let j = 0; j < n; j++) {\n const a0 = t1, a1 = t1 + step;\n const s = pt(a0), e = pt(a1), d0 = der(a0), d1 = der(a1);\n segs.push({kind: 'C', c1: [s[0] + k * d0[0], s[1] + k * d0[1]], c2: [e[0] - k * d1[0], e[1] - k * d1[1]], p: j === n - 1 ? p1 : e});\n t1 = a1;\n }\n return segs;\n};\n\nexport const pathToString = (path: Path) =>\n path.map((s) => {\n const f = (v: Vec2) => `${+v[0].toFixed(2)} ${+v[1].toFixed(2)}`;\n if (s.kind === 'Z') return 'Z';\n if (s.kind === 'C') return `C${f(s.c1)} ${f(s.c2)} ${f(s.p)}`;\n return `${s.kind}${f(s.p)}`;\n }).join(' ');\n\nexport const transformPath = (path: Path, m: [number, number, number, number, number, number]): Path => {\n const T = ([x, y]: Vec2): Vec2 => [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n return path.map((s) => (s.kind === 'Z' ? s : s.kind === 'C' ? {kind: 'C', c1: T(s.c1), c2: T(s.c2), p: T(s.p)} : {kind: s.kind, p: T(s.p)}));\n};\n\nexport const tracePath = (ctx: CanvasRenderingContext2D, path: Path) => {\n for (const s of path) {\n if (s.kind === 'M') ctx.moveTo(...s.p);\n else if (s.kind === 'L') ctx.lineTo(...s.p);\n else if (s.kind === 'C') ctx.bezierCurveTo(...s.c1, ...s.c2, ...s.p);\n else ctx.closePath();\n }\n};\n\nconst bez = (a: Vec2, b: Vec2, c: Vec2, d: Vec2, t: number): Vec2 => {\n const u = 1 - t;\n return [u * u * u * a[0] + 3 * u * u * t * b[0] + 3 * u * t * t * c[0] + t * t * t * d[0], u * u * u * a[1] + 3 * u * u * t * b[1] + 3 * u * t * t * c[1] + t * t * t * d[1]];\n};\n\n// Subpaths flattened into polylines (curves sampled finely enough for trims and morphs).\nexport const flatten = (path: Path, tolerance = 0.75): {pts: Vec2[]; closed: boolean}[] => {\n const subs: {pts: Vec2[]; closed: boolean}[] = [];\n let cur: {pts: Vec2[]; closed: boolean} | null = null;\n let last: Vec2 = [0, 0], start: Vec2 = [0, 0];\n for (const s of path) {\n if (s.kind === 'M') { cur = {pts: [s.p], closed: false}; subs.push(cur); last = start = s.p; continue; }\n if (!cur) { cur = {pts: [last], closed: false}; subs.push(cur); }\n if (s.kind === 'L') { cur.pts.push(s.p); last = s.p; }\n else if (s.kind === 'C') {\n const len = Math.hypot(s.c1[0] - last[0], s.c1[1] - last[1]) + Math.hypot(s.c2[0] - s.c1[0], s.c2[1] - s.c1[1]) + Math.hypot(s.p[0] - s.c2[0], s.p[1] - s.c2[1]);\n const n = Math.max(4, Math.min(200, Math.ceil(Math.sqrt(len / tolerance) * 2)));\n for (let k = 1; k <= n; k++) cur.pts.push(bez(last, s.c1, s.c2, s.p, k / n));\n last = s.p;\n } else { cur.closed = true; last = start; cur = null; }\n }\n return subs.filter((s) => s.pts.length > 1);\n};\n\nconst polyLen = (pts: Vec2[], closed: boolean) => {\n let l = 0;\n const n = closed ? pts.length : pts.length - 1;\n for (let i = 0; i < n; i++) { const a = pts[i], b = pts[(i + 1) % pts.length]; l += Math.hypot(b[0] - a[0], b[1] - a[1]); }\n return l;\n};\n\n// Evenly spaced points along a polyline (used for morphing paths with different structures).\nexport const resample = (pts: Vec2[], closed: boolean, n: number): Vec2[] => {\n const all = closed ? [...pts, pts[0]] : pts;\n const lens = all.slice(1).map((p, i) => Math.hypot(p[0] - all[i][0], p[1] - all[i][1]));\n const total = lens.reduce((a, b) => a + b, 0) || 1;\n const out: Vec2[] = [];\n let seg = 0, acc = 0;\n for (let k = 0; k < n; k++) {\n const d = (closed ? k / n : k / (n - 1)) * total;\n while (seg < lens.length - 1 && acc + lens[seg] < d) { acc += lens[seg]; seg++; }\n const f = lens[seg] ? (d - acc) / lens[seg] : 0;\n out.push([all[seg][0] + (all[seg + 1][0] - all[seg][0]) * f, all[seg][1] + (all[seg + 1][1] - all[seg][1]) * f]);\n }\n return out;\n};\n\n// Trim paths (AE \"Trim Paths\"): the part of the outline between start% and end%, across subpaths.\nexport const trimPolylines = (subs: {pts: Vec2[]; closed: boolean}[], start: number, end: number, offset = 0): Vec2[][] => {\n const total = subs.reduce((a, s) => a + polyLen(s.pts, s.closed), 0);\n if (!total) return [];\n let a = Math.min(start, end) + offset, b = Math.max(start, end) + offset;\n const ranges: [number, number][] = [];\n const shift = Math.floor(a);\n a -= shift; b -= shift;\n if (b <= 1) ranges.push([a, b]); else { ranges.push([a, 1]); ranges.push([0, Math.min(1, b - 1)]); }\n const out: Vec2[][] = [];\n for (const [ra, rb] of ranges) {\n const from = ra * total, to = rb * total;\n let acc = 0;\n for (const s of subs) {\n const all = s.closed ? [...s.pts, s.pts[0]] : s.pts;\n let line: Vec2[] | null = null;\n for (let i = 0; i < all.length - 1; i++) {\n const p = all[i], q = all[i + 1];\n const l = Math.hypot(q[0] - p[0], q[1] - p[1]);\n const s0 = acc, s1 = acc + l;\n acc = s1;\n if (s1 < from || s0 > to || !l) { if (line && s0 > to) break; continue; }\n const at = (d: number): Vec2 => { const f = (d - s0) / l; return [p[0] + (q[0] - p[0]) * f, p[1] + (q[1] - p[1]) * f]; };\n if (!line) { line = [at(Math.max(from, s0))]; out.push(line); }\n line.push(at(Math.min(to, s1)));\n }\n }\n }\n return out;\n};\n\nconst area = (pts: Vec2[]) => pts.reduce((a, p, i) => { const q = pts[(i + 1) % pts.length]; return a + p[0] * q[1] - q[0] * p[1]; }, 0) / 2;\n\n// Shape morphing: both paths resampled to the same point count, rotated to the best start point, blended.\nconst MORPH_POINTS = 160;\nexport const morph = (a: Path, b: Path, p: number): Path => {\n const sa = flatten(a), sb = flatten(b);\n const n = Math.max(sa.length, sb.length);\n const out: Path = [];\n for (let k = 0; k < n; k++) {\n const A = sa[k] ?? sa[sa.length - 1], B = sb[k] ?? sb[sb.length - 1];\n if (!A || !B) continue;\n const closed = A.closed || B.closed;\n const pa = resample(A.pts, closed, MORPH_POINTS);\n let pb = resample(B.pts, closed, MORPH_POINTS);\n if (closed) {\n // Same winding direction, then the rotation that pairs points with the least travel.\n if (Math.sign(area(pa)) !== Math.sign(area(pb))) pb = pb.reverse();\n let best = 0, bestD = Infinity;\n for (let r = 0; r < MORPH_POINTS; r++) {\n let d = 0;\n for (let i = 0; i < MORPH_POINTS; i += 4) { const q = pb[(i + r) % MORPH_POINTS]; d += (pa[i][0] - q[0]) ** 2 + (pa[i][1] - q[1]) ** 2; }\n if (d < bestD) { bestD = d; best = r; }\n }\n const rotated = pb;\n pb = rotated.map((_, i) => rotated[(i + best) % MORPH_POINTS]);\n }\n pa.forEach((q, i) => out.push({kind: i ? 'L' : 'M', p: [q[0] + (pb[i][0] - q[0]) * p, q[1] + (pb[i][1] - q[1]) * p]}));\n if (closed) out.push({kind: 'Z'});\n }\n return out;\n};\n\nexport const pathBounds = (path: Path): [number, number, number, number] | null => {\n const pts = flatten(path).flatMap((s) => s.pts);\n if (!pts.length) return null;\n const xs = pts.map((p) => p[0]), ys = pts.map((p) => p[1]);\n const x = Math.min(...xs), y = Math.min(...ys);\n return [x, y, Math.max(...xs) - x, Math.max(...ys) - y];\n};\n\n// Point and direction at a fraction of the path's length (motion along a path, map markers).\nexport const pointAt = (path: Path, f: number): {p: Vec2; angle: number} => {\n const pts = flatten(path).flatMap((s) => s.pts);\n if (pts.length < 2) return {p: pts[0] ?? [0, 0], angle: 0};\n const lens = pts.slice(1).map((p, i) => Math.hypot(p[0] - pts[i][0], p[1] - pts[i][1]));\n const total = lens.reduce((a, b) => a + b, 0);\n let d = Math.max(0, Math.min(1, f)) * total, i = 0;\n while (i < lens.length - 1 && d > lens[i]) { d -= lens[i]; i++; }\n const a = pts[i], b = pts[i + 1], k = lens[i] ? d / lens[i] : 0;\n return {p: [a[0] + (b[0] - a[0]) * k, a[1] + (b[1] - a[1]) * k], angle: (Math.atan2(b[1] - a[1], b[0] - a[0]) * 180) / Math.PI};\n};\n\n", "// SVG import: turns an SVG (logo, icon, illustration) into editable DT.ly shape layers.\n// Handles path/rect/circle/ellipse/line/polyline/polygon, nested <g> transforms, viewBox,\n// fill/stroke/opacity from attributes, inline style and simple <style> class rules,\n// and linear/radial gradients (approximated in user space).\nimport type {Gradient, NewLayer, Vec2} from './model.js';\nimport {parseColor, rgbaString} from './color.js';\nimport {flatten, parsePath, pathBounds, pathToString, transformPath, type Path} from './path.js';\n\ntype M = [number, number, number, number, number, number];\ninterface El { tag: string; attrs: Record<string, string>; children: El[]; text: string }\n\nconst mul = (m: M, n: M): M => [m[0] * n[0] + m[2] * n[1], m[1] * n[0] + m[3] * n[1], m[0] * n[2] + m[2] * n[3], m[1] * n[2] + m[3] * n[3], m[0] * n[4] + m[2] * n[5] + m[4], m[1] * n[4] + m[3] * n[5] + m[5]];\nconst I: M = [1, 0, 0, 1, 0, 0];\n\n// A small, forgiving XML parser (SVGs from design tools and icon sets).\nexport const parseXml = (src: string): El => {\n const root: El = {tag: '#root', attrs: {}, children: [], text: ''};\n const stack = [root];\n const re = /<!--[\\s\\S]*?-->|<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>|<\\?[\\s\\S]*?\\?>|<!DOCTYPE[\\s\\S]*?>|<\\/([\\w:-]+)\\s*>|<([\\w:-]+)((?:\\s+[\\w:.-]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'))*)\\s*(\\/?)>|([^<]+)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(src))) {\n const top = stack[stack.length - 1];\n if (m[1] !== undefined) top.text += m[1];\n else if (m[2]) { if (stack.length > 1) stack.pop(); }\n else if (m[3]) {\n const attrs: Record<string, string> = {};\n for (const a of m[4].matchAll(/([\\w:.-]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g)) attrs[a[1]] = (a[2] ?? a[3]).replace(/&quot;/g, '\"').replace(/&amp;/g, '&');\n const el: El = {tag: m[3].replace(/^svg:/, ''), attrs, children: [], text: ''};\n top.children.push(el);\n if (!m[5]) stack.push(el);\n } else if (m[6]) top.text += m[6];\n }\n return root;\n};\n\nconst parseTransform = (s: string | undefined): M => {\n if (!s) return I;\n let m = I;\n for (const [, fn, args] of s.matchAll(/(\\w+)\\s*\\(([^)]*)\\)/g)) {\n const a = args.split(/[\\s,]+/).filter(Boolean).map(Number);\n let n: M = I;\n if (fn === 'matrix') n = a as M;\n else if (fn === 'translate') n = [1, 0, 0, 1, a[0] ?? 0, a[1] ?? 0];\n else if (fn === 'scale') n = [a[0], 0, 0, a[1] ?? a[0], 0, 0];\n else if (fn === 'rotate') {\n const r = ((a[0] ?? 0) * Math.PI) / 180, c = Math.cos(r), s2 = Math.sin(r);\n n = [c, s2, -s2, c, 0, 0];\n if (a.length >= 3) n = mul(mul([1, 0, 0, 1, a[1], a[2]], n), [1, 0, 0, 1, -a[1], -a[2]]);\n } else if (fn === 'skewX') n = [1, 0, Math.tan(((a[0] ?? 0) * Math.PI) / 180), 1, 0, 0];\n else if (fn === 'skewY') n = [1, Math.tan(((a[0] ?? 0) * Math.PI) / 180), 0, 1, 0, 0];\n m = mul(m, n);\n }\n return m;\n};\n\nconst num = (v: string | undefined, d = 0) => (v === undefined || v === '' ? d : v.trim().endsWith('%') ? parseFloat(v) / 100 : parseFloat(v));\n\nconst elementPath = (el: El): Path | null => {\n const a = el.attrs;\n switch (el.tag) {\n case 'path': return a.d ? parsePath(a.d) : null;\n case 'rect': {\n const x = num(a.x), y = num(a.y), w = num(a.width), h = num(a.height);\n let rx = num(a.rx, NaN), ry = num(a.ry, NaN);\n if (isNaN(rx)) rx = isNaN(ry) ? 0 : ry;\n if (isNaN(ry)) ry = rx;\n rx = Math.min(rx, w / 2); ry = Math.min(ry, h / 2);\n if (!rx) return parsePath(`M${x} ${y}H${x + w}V${y + h}H${x}Z`);\n return parsePath(`M${x + rx} ${y}H${x + w - rx}A${rx} ${ry} 0 0 1 ${x + w} ${y + ry}V${y + h - ry}A${rx} ${ry} 0 0 1 ${x + w - rx} ${y + h}H${x + rx}A${rx} ${ry} 0 0 1 ${x} ${y + h - ry}V${y + ry}A${rx} ${ry} 0 0 1 ${x + rx} ${y}Z`);\n }\n case 'circle': case 'ellipse': {\n const cx = num(a.cx), cy = num(a.cy), rx = el.tag === 'circle' ? num(a.r) : num(a.rx), ry = el.tag === 'circle' ? num(a.r) : num(a.ry);\n return parsePath(`M${cx} ${cy - ry}A${rx} ${ry} 0 1 1 ${cx} ${cy + ry}A${rx} ${ry} 0 1 1 ${cx} ${cy - ry}Z`);\n }\n case 'line': return parsePath(`M${num(a.x1)} ${num(a.y1)}L${num(a.x2)} ${num(a.y2)}`);\n case 'polyline': case 'polygon': {\n const n = (a.points ?? '').trim().split(/[\\s,]+/).map(Number);\n if (n.length < 4) return null;\n return parsePath(`M${n[0]} ${n[1]}${Array.from({length: n.length / 2 - 1}, (_, i) => `L${n[2 * i + 2]} ${n[2 * i + 3]}`).join('')}${el.tag === 'polygon' ? 'Z' : ''}`);\n }\n default: return null;\n }\n};\n\ninterface Style { fill: string; stroke: string; strokeWidth: number; opacity: number; fillOpacity: number; strokeOpacity: number; fillRule?: string; lineCap?: string; lineJoin?: string; display?: string }\n\nconst PAINT_PROPS = ['fill', 'stroke', 'stroke-width', 'opacity', 'fill-opacity', 'stroke-opacity', 'fill-rule', 'stroke-linecap', 'stroke-linejoin', 'display', 'visibility'];\n\nexport interface SvgImportOptions { name?: string; width?: number; position?: Vec2; color?: string; inPoint?: number }\n\nexport interface SvgImportResult { layers: NewLayer[]; size: Vec2; parts: number }\n\n// Converts SVG text into layers: one null \"group\" layer plus one shape layer per drawable element.\nexport const importSvg = (svg: string, opts: SvgImportOptions = {}): SvgImportResult => {\n const root = parseXml(svg).children.find((c) => c.tag === 'svg');\n if (!root) throw new Error('Not an SVG file');\n const vb = (root.attrs.viewBox ?? '').split(/[\\s,]+/).map(Number);\n const vbW = vb.length === 4 ? vb[2] : num(root.attrs.width, 100), vbH = vb.length === 4 ? vb[3] : num(root.attrs.height, 100);\n const vbX = vb.length === 4 ? vb[0] : 0, vbY = vb.length === 4 ? vb[1] : 0;\n const targetW = opts.width ?? 600;\n const k = targetW / vbW;\n const size: Vec2 = [targetW, vbH * k];\n // viewBox \u2192 layer space centred on the group's origin.\n const base: M = [k, 0, 0, k, -vbX * k - size[0] / 2, -vbY * k - size[1] / 2];\n\n // Class rules from <style> blocks (\".a{fill:#f00}\" / \".a,.b{...}\").\n const classes: Record<string, Record<string, string>> = {};\n const gradients: Record<string, El> = {};\n const walkDefs = (el: El) => {\n if (el.tag === 'style') for (const [, sel, body] of el.text.matchAll(/([^{}]+)\\{([^}]*)\\}/g)) {\n const decl = Object.fromEntries(body.split(';').map((d) => d.split(':').map((x) => x.trim())).filter((d) => d.length === 2 && d[0]));\n for (const s of sel.split(',')) { const c = s.trim().match(/^\\.([\\w-]+)$/); if (c) classes[c[1]] = {...classes[c[1]], ...decl}; }\n }\n if ((el.tag === 'linearGradient' || el.tag === 'radialGradient') && el.attrs.id) gradients[el.attrs.id] = el;\n el.children.forEach(walkDefs);\n };\n walkDefs(root);\n\n const props = (el: El) => {\n const out: Record<string, string> = {};\n for (const c of (el.attrs.class ?? '').split(/\\s+/)) Object.assign(out, classes[c] ?? {});\n for (const p of PAINT_PROPS) if (el.attrs[p] !== undefined) out[p] = el.attrs[p];\n for (const d of (el.attrs.style ?? '').split(';')) { const [kk, v] = d.split(':').map((x) => x?.trim()); if (kk && v) out[kk] = v; }\n return out;\n };\n\n const color = (v: string, opacity: number, m: M, bbox: [number, number, number, number] | null): string | Gradient | undefined => {\n if (!v || v === 'none' || v === 'transparent') return undefined;\n if (v === 'currentColor') v = opts.color ?? '#000000';\n const ref = v.match(/url\\(#([^)]+)\\)/);\n if (ref) {\n const g = gradients[ref[1]];\n const stops: [number, string][] = (g?.children ?? []).filter((c) => c.tag === 'stop').map((st) => {\n const sp = {...Object.fromEntries((st.attrs.style ?? '').split(';').map((d) => d.split(':').map((x) => x.trim())).filter((d) => d.length === 2)), ...st.attrs};\n const off = sp.offset?.endsWith('%') ? parseFloat(sp.offset) / 100 : num(sp.offset);\n const c = parseColor(sp['stop-color'] ?? '#000') ?? [0, 0, 0, 1];\n return [off, rgbaString([c[0], c[1], c[2], c[3] * num(sp['stop-opacity'], 1) * opacity])];\n });\n if (!g || !stops.length) return undefined;\n // Default gradientUnits is objectBoundingBox: 0..1 across the shape's own bounds.\n const box = g.attrs.gradientUnits === 'userSpaceOnUse' ? null : bbox;\n const U = (x: number, y: number): Vec2 => (box ? [box[0] + x * box[2], box[1] + y * box[3]] : [x, y]);\n const gt = parseTransform(g.attrs.gradientTransform);\n const T = (x: number, y: number): Vec2 => { const [ux, uy] = U(x, y); const gx = gt[0] * ux + gt[2] * uy + gt[4], gy = gt[1] * ux + gt[3] * uy + gt[5]; return [m[0] * gx + m[2] * gy + m[4], m[1] * gx + m[3] * gy + m[5]]; };\n if (g.tag === 'linearGradient') return {linear: {from: T(num(g.attrs.x1), num(g.attrs.y1)), to: T(num(g.attrs.x2, 1), num(g.attrs.y2)), stops}};\n const r = num(g.attrs.r, 0.5) * (box ? Math.max(box[2], box[3]) : 1) * Math.hypot(m[0], m[1]) * Math.hypot(gt[0], gt[1]);\n return {radial: {center: T(num(g.attrs.cx, 0.5), num(g.attrs.cy, 0.5)), radius: r, stops}};\n }\n const c = parseColor(v);\n if (!c) return v;\n return opacity < 1 || c[3] < 1 ? rgbaString([c[0], c[1], c[2], c[3] * opacity]) : v;\n };\n\n const groupName = opts.name ?? 'svg';\n const layers: NewLayer[] = [];\n const shapes: NewLayer[] = [];\n let index = 0;\n const visit = (el: El, m: M, inherited: Style) => {\n if (['defs', 'style', 'title', 'desc', 'metadata', 'clipPath', 'mask', 'symbol', 'linearGradient', 'radialGradient', 'pattern', 'filter'].includes(el.tag)) return;\n const p = props(el);\n const st: Style = {\n fill: p.fill ?? inherited.fill, stroke: p.stroke ?? inherited.stroke,\n strokeWidth: p['stroke-width'] !== undefined ? parseFloat(p['stroke-width']) : inherited.strokeWidth,\n opacity: inherited.opacity * num(p.opacity, 1), fillOpacity: p['fill-opacity'] !== undefined ? num(p['fill-opacity'], 1) : inherited.fillOpacity,\n strokeOpacity: p['stroke-opacity'] !== undefined ? num(p['stroke-opacity'], 1) : inherited.strokeOpacity,\n fillRule: p['fill-rule'] ?? inherited.fillRule, lineCap: p['stroke-linecap'] ?? inherited.lineCap, lineJoin: p['stroke-linejoin'] ?? inherited.lineJoin,\n display: p.display === 'none' || p.visibility === 'hidden' ? 'none' : inherited.display,\n };\n if (st.display === 'none') return;\n const mm = mul(m, parseTransform(el.attrs.transform));\n const path = elementPath(el);\n if (path && flatten(path).length) {\n const baked = transformPath(path, mm);\n const scale = Math.sqrt(Math.abs(mm[0] * mm[3] - mm[1] * mm[2]));\n const bbox = pathBounds(path);\n const fill = el.tag === 'line' || el.tag === 'polyline' ? undefined : color(st.fill, st.opacity * st.fillOpacity, mm, bbox);\n const stroke = color(st.stroke, st.opacity * st.strokeOpacity, mm, bbox);\n if (fill || stroke) {\n shapes.push({\n type: 'shape', name: el.attrs.id ?? `${groupName}-part-${++index}`, shape: 'path', path: pathToString(baked), parent: '__group__',\n transform: {anchor: [0, 0], position: [0, 0]},\n ...(fill ? {fill} : {}), ...(typeof stroke === 'string' ? {stroke, strokeWidth: +(st.strokeWidth * scale).toFixed(2)} : {}),\n ...(st.fillRule === 'evenodd' ? {fillRule: 'evenodd'} : {}),\n ...(st.lineCap ? {lineCap: st.lineCap} : {}), ...(st.lineJoin ? {lineJoin: st.lineJoin} : {}),\n ...(opts.inPoint !== undefined ? {inPoint: opts.inPoint} : {}),\n } as NewLayer);\n }\n }\n for (const c of el.children) visit(c, mm, st);\n };\n visit(root, base, {fill: '#000000', stroke: 'none', strokeWidth: 1, opacity: 1, fillOpacity: 1, strokeOpacity: 1});\n\n layers.push({type: 'null', name: groupName, transform: {position: opts.position ?? [540, 960]}, ...(opts.inPoint !== undefined ? {inPoint: opts.inPoint} : {})} as NewLayer);\n // Topmost SVG element = top layer (index 0), as in the drawing order of the file.\n layers.push(...shapes.reverse());\n return {layers, size, parts: shapes.length};\n};\n", "// Document operations: the fine-grained edits agents (via MCP) and tools make to a project.\n// Every op is a pure-ish mutation of a Project object; IO lives in ./store.ts.\nimport {isAnimated, type Composition, type Ease, type Keyframe, type Layer, type NewLayer, type Project} from '../core/model.js';\nimport {importSvg, type SvgImportOptions} from '../core/svg.js';\n\nexport class OpError extends Error {}\n\nexport const newProject = (o: {name: string; width?: number; height?: number; fps?: number; duration?: number; background?: string}): Project => ({\n dtly: 1,\n name: o.name,\n root: 'main',\n comps: [{id: 'main', name: 'Main', width: o.width ?? 1080, height: o.height ?? 1920, fps: o.fps ?? 30, duration: o.duration ?? 10, background: o.background ?? '#000000', layers: []}],\n});\n\nexport const getComp = (p: Project, id?: string): Composition => {\n const c = p.comps.find((c) => c.id === (id ?? p.root));\n if (!c) throw new OpError(`No composition \"${id}\". Comps: ${p.comps.map((c) => c.id).join(', ')}`);\n return c;\n};\n\nexport const findLayer = (p: Project, layerId: string): {comp: Composition; layer: Layer; index: number} => {\n for (const comp of p.comps) {\n const index = comp.layers.findIndex((l) => l.id === layerId);\n if (index >= 0) return {comp, layer: comp.layers[index], index};\n }\n throw new OpError(`No layer \"${layerId}\"`);\n};\n\nconst allIds = (p: Project) => new Set(p.comps.flatMap((c) => c.layers.map((l) => l.id)));\nexport const uniqueId = (p: Project, base: string) => {\n const ids = allIds(p);\n const clean = base.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-|-$/g, '') || 'layer';\n if (!ids.has(clean)) return clean;\n let i = 2;\n while (ids.has(`${clean}-${i}`)) i++;\n return `${clean}-${i}`;\n};\n\nexport const addComp = (p: Project, c: Partial<Composition> & {id: string}) => {\n if (p.comps.some((x) => x.id === c.id)) throw new OpError(`Composition \"${c.id}\" already exists`);\n const root = getComp(p);\n const comp: Composition = {width: root.width, height: root.height, fps: root.fps, duration: root.duration, layers: [], ...c};\n p.comps.push(comp);\n return comp;\n};\n\nexport const updateComp = (p: Project, id: string, patch: Partial<Omit<Composition, 'id' | 'layers'>>) => {\n Object.assign(getComp(p, id), patch);\n};\n\n// Adds a layer. index 0 = top of the stack (After Effects order).\nexport const addLayer = (p: Project, compId: string | undefined, layer: NewLayer, index = 0): Layer => {\n const comp = getComp(p, compId);\n const id = layer.id ? (allIds(p).has(layer.id) ? (() => { throw new OpError(`Layer id \"${layer.id}\" already used`); })() : layer.id) : uniqueId(p, (layer as Layer).name ?? layer.type);\n const full = {...layer, id} as Layer;\n comp.layers.splice(Math.max(0, Math.min(index, comp.layers.length)), 0, full);\n return full;\n};\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);\n\n// Deep merge; `null` deletes a key. Arrays and keyframe objects are replaced wholesale.\nexport const deepMerge = (target: Record<string, unknown>, patch: Record<string, unknown>) => {\n for (const [k, v] of Object.entries(patch)) {\n if (v === null) delete target[k];\n else if (isPlainObject(v) && isPlainObject(target[k]) && !('keyframes' in v)) deepMerge(target[k] as Record<string, unknown>, v);\n else target[k] = v;\n }\n return target;\n};\n\nexport const updateLayer = (p: Project, layerId: string, patch: Record<string, unknown>) => {\n if ('id' in patch) throw new OpError('Cannot change a layer id; duplicate it instead');\n const {layer} = findLayer(p, layerId);\n deepMerge(layer as unknown as Record<string, unknown>, patch);\n return layer;\n};\n\nexport const removeLayer = (p: Project, layerId: string) => {\n const {comp, index} = findLayer(p, layerId);\n comp.layers.splice(index, 1);\n for (const c of p.comps) for (const l of c.layers) {\n if (l.parent === layerId) delete l.parent;\n if (l.matte?.layer === layerId) delete l.matte;\n }\n};\n\nexport const moveLayer = (p: Project, layerId: string, toIndex: number) => {\n const {comp, index, layer} = findLayer(p, layerId);\n comp.layers.splice(index, 1);\n comp.layers.splice(Math.max(0, Math.min(toIndex, comp.layers.length)), 0, layer);\n};\n\n// Visits every keyframe list inside a value (for shifting/scaling time).\nconst eachKeyframes = (v: unknown, fn: (kfs: Keyframe<unknown>[]) => void) => {\n if (Array.isArray(v)) v.forEach((x) => eachKeyframes(x, fn));\n else if (isPlainObject(v)) {\n if (Array.isArray(v.keyframes)) fn(v.keyframes as Keyframe<unknown>[]);\n Object.values(v).forEach((x) => eachKeyframes(x, fn));\n }\n};\n\n// Slides a layer in time: in/out points and all its keyframes (like dragging the bar in AE).\nexport const shiftLayer = (p: Project, layerId: string, delta: number) => {\n const {layer} = findLayer(p, layerId);\n if (layer.inPoint !== undefined || delta) layer.inPoint = (layer.inPoint ?? 0) + delta;\n if (layer.outPoint !== undefined) layer.outPoint += delta;\n eachKeyframes(layer, (kfs) => kfs.forEach((k) => (k.t = +(k.t + delta).toFixed(4))));\n};\n\nexport const duplicateLayer = (p: Project, layerId: string, opts: {newId?: string; timeShift?: number} = {}) => {\n const {comp, index, layer} = findLayer(p, layerId);\n const copy = structuredClone(layer);\n copy.id = opts.newId ?? uniqueId(p, layer.id);\n comp.layers.splice(index, 0, copy);\n if (opts.timeShift) shiftLayer(p, copy.id, opts.timeShift);\n return copy;\n};\n\n// Property paths: \"transform.position\", \"trim.end\", \"box.reveal\", \"effects.0.radius\", \"size\".\nconst splitPath = (path: string) => path.split('.').map((s) => (/^\\d+$/.test(s) ? Number(s) : s));\nconst getAt = (obj: unknown, path: string) => splitPath(path).reduce<unknown>((o, k) => (o == null ? undefined : (o as Record<string | number, unknown>)[k]), obj);\nconst setAt = (obj: Record<string, unknown>, path: string, value: unknown) => {\n const keys = splitPath(path);\n let o: Record<string | number, unknown> = obj;\n keys.slice(0, -1).forEach((k, i) => {\n if (o[k] == null) o[k] = typeof keys[i + 1] === 'number' ? [] : {};\n o = o[k] as Record<string | number, unknown>;\n });\n o[keys[keys.length - 1]] = value;\n};\n\nconst TIME_EPS = 1e-3;\n\nexport const setProperty = (p: Project, layerId: string, path: string, value: unknown) => {\n const {layer} = findLayer(p, layerId);\n setAt(layer as unknown as Record<string, unknown>, path, value);\n};\n\n// Adds or replaces the keyframe at time t. A static property becomes animated\n// (its current value is kept as a keyframe at the layer's inPoint, like AE's stopwatch).\nexport const setKeyframe = (p: Project, layerId: string, path: string, t: number, v: unknown, ease?: Ease) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path);\n let kfs: Keyframe<unknown>[];\n if (isAnimated(cur as never)) kfs = (cur as {keyframes: Keyframe<unknown>[]}).keyframes;\n else {\n kfs = [];\n const anchorT = layer.inPoint ?? 0;\n if (cur !== undefined && Math.abs(anchorT - t) > TIME_EPS) kfs.push({t: anchorT, v: cur});\n setAt(layer as unknown as Record<string, unknown>, path, {keyframes: kfs});\n }\n const existing = kfs.find((k) => Math.abs(k.t - t) < TIME_EPS);\n if (existing) {\n existing.v = v;\n if (ease !== undefined) existing.ease = ease;\n } else kfs.push(ease !== undefined ? {t, v, ease} : {t, v});\n kfs.sort((a, b) => a.t - b.t);\n return kfs;\n};\n\nexport const removeKeyframe = (p: Project, layerId: string, path: string, t: number) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path) as {keyframes: Keyframe<unknown>[]} | undefined;\n if (!cur || !isAnimated(cur as never)) throw new OpError(`${layerId}.${path} is not animated`);\n const i = cur.keyframes.findIndex((k) => Math.abs(k.t - t) < TIME_EPS);\n if (i < 0) throw new OpError(`No keyframe at ${t}s on ${layerId}.${path}`);\n cur.keyframes.splice(i, 1);\n // One keyframe left = a static value again (AE behaviour when you delete down to one).\n if (cur.keyframes.length === 1 && !(cur as {wiggle?: unknown}).wiggle) setAt(layer as unknown as Record<string, unknown>, path, cur.keyframes[0].v);\n};\n\n// Retimes one keyframe, keeping its value and ease (dragging a key in the timeline).\nexport const moveKeyframe = (p: Project, layerId: string, path: string, from: number, to: number) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path) as {keyframes: Keyframe<unknown>[]} | undefined;\n const k = cur?.keyframes?.find((k) => Math.abs(k.t - from) < TIME_EPS);\n if (!cur || !k) throw new OpError(`No keyframe at ${from}s on ${layerId}.${path}`);\n const target = Math.round(to * 1000) / 1000;\n if (cur.keyframes.some((x) => x !== k && Math.abs(x.t - target) < TIME_EPS)) throw new OpError(`There is already a keyframe at ${target}s`);\n k.t = target;\n cur.keyframes.sort((a, b) => a.t - b.t);\n};\n\nexport const setEase = (p: Project, layerId: string, path: string, t: number, ease: Ease) => {\n const {layer} = findLayer(p, layerId);\n const cur = getAt(layer, path) as {keyframes: Keyframe<unknown>[]} | undefined;\n const k = cur?.keyframes?.find((k) => Math.abs(k.t - t) < TIME_EPS);\n if (!k) throw new OpError(`No keyframe at ${t}s on ${layerId}.${path}`);\n k.ease = ease;\n};\n\n// Adds an SVG as a group (null layer) of editable shape layers parented to it.\nexport const addSvg = (p: Project, compId: string | undefined, svg: string, opts: SvgImportOptions = {}) => {\n const {layers, size, parts} = importSvg(svg, opts);\n const [group, ...shapes] = layers;\n const g = addLayer(p, compId, group, 0);\n // Insert the parts below the group's position so their stacking matches the SVG.\n const ids = shapes.reverse().map((l) => addLayer(p, compId, {...l, parent: g.id} as NewLayer, 1).id);\n return {group: g.id, parts, size, ids};\n};\n\n// Static checks an agent should run before rendering.\nexport const validate = (p: Project): string[] => {\n const warnings: string[] = [];\n const ids = new Set<string>();\n for (const c of p.comps) {\n for (const l of c.layers) {\n if (ids.has(l.id)) warnings.push(`Duplicate layer id \"${l.id}\"`);\n ids.add(l.id);\n const inP = l.inPoint ?? 0, outP = l.outPoint ?? c.duration;\n if (outP <= inP) warnings.push(`${c.id}/${l.id}: outPoint (${outP}) is not after inPoint (${inP})`);\n if (inP >= c.duration) warnings.push(`${c.id}/${l.id}: starts after the comp ends (${c.duration}s)`);\n if (l.parent && !c.layers.some((x) => x.id === l.parent)) warnings.push(`${c.id}/${l.id}: parent \"${l.parent}\" not in the same comp`);\n if (l.matte && !c.layers.some((x) => x.id === l.matte!.layer)) warnings.push(`${c.id}/${l.id}: matte \"${l.matte.layer}\" not in the same comp`);\n if (l.type === 'precomp' && !p.comps.some((x) => x.id === l.comp)) warnings.push(`${c.id}/${l.id}: unknown comp \"${l.comp}\"`);\n eachKeyframes(l, (kfs) => {\n if (kfs.length === 0) warnings.push(`${c.id}/${l.id}: empty keyframe list`);\n kfs.forEach((k) => { if (k.t < 0 || k.t > c.duration + 1) warnings.push(`${c.id}/${l.id}: keyframe at ${k.t}s is outside the comp`); });\n });\n }\n }\n if (!p.comps.some((c) => c.id === p.root)) warnings.push(`Root comp \"${p.root}\" does not exist`);\n return warnings;\n};\n\n// Compact, agent-readable outline of the project.\nexport const describe = (p: Project): string => {\n const lines = [`Project \"${p.name}\" \u2014 root: ${p.root}`];\n for (const c of p.comps) {\n lines.push(`\\nComp ${c.id}${c.name ? ` (${c.name})` : ''}: ${c.width}x${c.height} @${c.fps}fps, ${c.duration}s, bg ${c.background ?? 'transparent'}`);\n if (c.markers?.length) lines.push(` markers: ${c.markers.map((m) => `${m.t}s ${m.label}`).join(', ')}`);\n c.layers.forEach((l, i) => {\n const animated: string[] = [];\n const walk = (v: unknown, path: string) => {\n if (isPlainObject(v)) {\n if (Array.isArray(v.keyframes)) animated.push(`${path}@[${(v.keyframes as Keyframe<unknown>[]).map((k) => k.t).join(',')}]`);\n else Object.entries(v).forEach(([k, x]) => walk(x, path ? `${path}.${k}` : k));\n } else if (Array.isArray(v)) v.forEach((x, j) => isPlainObject(x) && walk(x, `${path}.${j}`));\n };\n walk(l, '');\n const extra =\n l.type === 'text' ? ` \"${l.text.replace(/\\n/g, ' / ').slice(0, 60)}\"${l.animators?.length ? ` animators:${l.animators.map((a) => a.unit).join('+')}` : ''}`\n : l.type === 'video' || l.type === 'image' || l.type === 'audio' || l.type === 'lottie' ? ` ${l.src}`\n : l.type === 'precomp' ? ` \u2192 ${l.comp}`\n : l.type === 'shape' ? ` ${l.shape}` : '';\n lines.push(` [${i}] ${l.id} (${l.type})${extra} ${l.inPoint ?? 0}\u2013${l.outPoint ?? c.duration}s${l.parent ? ` parent:${l.parent}` : ''}${l.matte ? ` matte:${l.matte.layer}` : ''}${l.hidden ? ' hidden' : ''}${animated.length ? `\\n animated: ${animated.join(' ')}` : ''}`);\n });\n }\n return lines.join('\\n');\n};\n", "import type {TextAnimator} from '../core/model.js';\n\n// Text animator presets \u2014 the \"Animation Presets > Text\" folder of DT.ly.\nexport const TEXT_ANIMATORS: Record<string, {description: string; animators: TextAnimator[]}> = {\n typewriter: {description: 'Letters appear one by one with no motion.', animators: [{unit: 'grapheme', stagger: 0.05, duration: 0.01, ease: 'hold', from: {opacity: 0}}]},\n fadeUp: {description: 'Words fade in while rising slightly. Calm, readable default.', animators: [{unit: 'word', stagger: 0.08, duration: 0.6, ease: 'cubicOut', from: {opacity: 0, y: 40}}]},\n popIn: {description: 'Words scale up from zero with an overshoot. Playful, energetic.', animators: [{unit: 'word', stagger: 0.1, duration: 0.55, ease: 'backOut', from: {opacity: 0, scale: 0}}]},\n slam: {description: 'Words crash in from huge and blurred. Punchy kinetic typography.', animators: [{unit: 'word', stagger: 0.18, duration: 0.35, ease: 'expoOut', from: {opacity: 0, scale: 320, blur: 14}}]},\n blurIn: {description: 'Letters sharpen from a blur. Elegant, premium.', animators: [{unit: 'grapheme', stagger: 0.03, duration: 0.7, ease: 'cubicOut', from: {opacity: 0, blur: 18, x: -20}}]},\n maskedLines: {description: 'Each line slides up from behind its own mask. The classic title reveal.', animators: [{unit: 'line', stagger: 0.12, duration: 0.8, ease: 'expoOut', clip: true, from: {y: 120}}]},\n cascade: {description: 'Letters drop and rotate into place with an overshoot.', animators: [{unit: 'grapheme', stagger: 0.035, duration: 0.7, ease: 'backOut', from: {opacity: 0, y: -70, rotation: -25}}]},\n trackingIn: {description: 'Letter spacing collapses from wide to normal while fading in. Cinematic openers.', animators: [{unit: 'grapheme', stagger: 0, duration: 1.4, ease: 'expoOut', from: {opacity: 0, tracking: 60}}]},\n centerOut: {description: 'Letters grow outward from the middle of the word.', animators: [{unit: 'grapheme', order: 'center', stagger: 0.04, duration: 0.5, ease: 'backOut', from: {opacity: 0, scale: 0}}]},\n randomFlicker: {description: 'Letters switch on in random order.', animators: [{unit: 'grapheme', order: 'random', stagger: 0.03, duration: 0.08, ease: 'hold', from: {opacity: 0}}]},\n colorSweep: {description: 'A highlight colour sweeps through the letters, settling to the text colour.', animators: [{unit: 'grapheme', stagger: 0.04, duration: 0.5, ease: 'easeOut', from: {color: '#FFC93C', scale: 115}}]},\n // Exits (mode: out) end at the layer's outPoint.\n fadeOutDown: {description: 'Exit: words fade out while dropping.', animators: [{unit: 'word', mode: 'out', stagger: 0.05, duration: 0.4, ease: 'easeIn', from: {opacity: 0, y: 40}}]},\n blurOut: {description: 'Exit: letters blur away.', animators: [{unit: 'grapheme', mode: 'out', stagger: 0.02, duration: 0.45, ease: 'easeIn', from: {opacity: 0, blur: 16}}]},\n maskedLinesOut: {description: 'Exit: lines slide up out of their masks.', animators: [{unit: 'line', mode: 'out', stagger: 0.08, duration: 0.5, ease: 'expoInOut', clip: true, from: {y: -120}}]},\n};\n", "// Infographic presets: bar, line, donut and progress charts, and number counters.\n// Every chart is a group (null) of ordinary layers, so bars, lines, values and labels stay editable.\nimport type {Ease, NewLayer, Project, TextLayer, Vec2} from '../core/model.js';\nimport {addLayer, getComp} from '../ops/ops.js';\nimport type {Preset} from './index.js';\n\ntype Params = Record<string, unknown>;\ntype Datum = {label?: string; value: number; color?: string};\nconst PALETTE = ['#E8692A', '#FFC93C', '#4DA3FF', '#5FB3A0', '#C78BC0', '#E5534B', '#9BD35A', '#F28FB0'];\nconst r3 = (t: number) => Math.round(t * 1000) / 1000;\nconst kf = <T>(...k: [number, T, Ease?][]) => ({keyframes: k.map(([t, v, ease]) => (ease ? {t: r3(t), v, ease} : {t: r3(t), v}))});\nconst n = (v: unknown, d: number) => (typeof v === 'number' ? v : d);\nconst s = (v: unknown, d: string) => (typeof v === 'string' ? v : d);\nconst fmtOf = (o: Params): TextLayer['format'] => ({prefix: o.prefix as string | undefined, suffix: o.suffix as string | undefined, decimals: o.decimals as number | undefined, locale: o.locale as string | undefined});\n\n// Adds layers in stacking order (first = top) and returns their ids.\nconst build = (p: Project, compId: string | undefined, group: NewLayer, parts: NewLayer[]) => {\n const g = addLayer(p, compId, group, 0);\n const ids = [g.id];\n [...parts].reverse().forEach((l) => ids.push(addLayer(p, compId, {...l, parent: g.id} as NewLayer, 1).id));\n return ids;\n};\nconst data = (o: Params): Datum[] => ((o.data as Datum[]) ?? []).map((d) => (typeof d === 'number' ? {value: d} : d));\n\nexport const CHART_PRESETS: Record<string, Preset> = {\n 'chart.bar': {\n kind: 'chart',\n description: 'Bar chart: bars grow from the baseline one after another while their values count up; labels underneath.',\n params: '{data: [{label, value, color?}], position?: [x,y] (centre), size?: [w,h], start?: s, duration?: s, stagger?: s, color?, colors?: string[], max?, prefix?, suffix?, decimals?, locale? (en-IN), textColor?, showValues?: true, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const d = data(o), t0 = n(o.start, 0), dur = n(o.duration, 0.9), stg = n(o.stagger, 0.12);\n const [W, H] = (o.size as Vec2) ?? [comp.width * 0.8, comp.height * 0.3];\n const max = n(o.max, Math.max(...d.map((x) => x.value), 1));\n const gap = W / Math.max(1, d.length), barW = gap * 0.62, base = H / 2;\n const fs = Math.round(Math.min(gap * 0.32, comp.width / 22));\n const text = s(o.textColor, '#ffffff');\n const parts: NewLayer[] = [{type: 'shape', name: 'axis', shape: 'line', points: [[-W / 2, base], [W / 2, base]], stroke: text, strokeWidth: 3, transform: {anchor: [0, 0], position: [0, 0], opacity: 60}, inPoint: t0, trim: {end: kf([t0, 0, 'expoOut'], [t0 + 0.6, 100])}} as NewLayer];\n d.forEach((x, i) => {\n const h = (x.value / max) * H, cx = -W / 2 + gap * (i + 0.5), ts = t0 + 0.2 + i * stg;\n const color = x.color ?? (o.colors as string[] | undefined)?.[i] ?? s(o.color, PALETTE[i % PALETTE.length]);\n parts.push({type: 'shape', name: `bar-${i + 1}`, shape: 'rect', size: [barW, h], radius: Math.min(12, barW / 6), fill: color, inPoint: t0,\n transform: {anchor: [0, h / 2], position: [cx, base], scale: kf<Vec2>([ts, [100, 0], 'expoOut'], [ts + dur, [100, 100]])}} as NewLayer);\n if (o.showValues !== false) parts.push({type: 'text', name: `value-${i + 1}`, text: '{value}', value: kf([ts, 0, 'expoOut'], [ts + dur, x.value]), format: fmtOf(o), size: fs, weight: 800, color: text, inPoint: t0,\n transform: {position: [cx, base - h - fs * 0.8], opacity: kf([ts, 0], [ts + 0.25, 100])}} as NewLayer);\n if (x.label) parts.push({type: 'text', name: `label-${i + 1}`, text: x.label, size: Math.round(fs * 0.8), weight: 600, color: text, inPoint: t0, maxWidth: gap * 0.95,\n transform: {position: [cx, base + fs * 0.95]}, animators: [{unit: 'line', delay: ts - t0, duration: 0.5, ease: 'cubicOut', from: {opacity: 0, y: 20}}]} as NewLayer);\n });\n return {created: build(p, compId, {type: 'null', name: s(o.name, 'bar-chart'), inPoint: t0, transform: {position: (o.position as Vec2) ?? [comp.width / 2, comp.height / 2]}} as NewLayer, parts)};\n },\n },\n\n 'chart.line': {\n kind: 'chart',\n description: 'Line chart: a smooth line draws on across the points, dots pop in as it passes them, an area fill fades in underneath.',\n params: '{data: [{label?, value}] or numbers, position?, size?: [w,h], start?, duration?, color?, area?: true, showValues?: false, prefix?, suffix?, decimals?, locale?, textColor?, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const d = data(o), t0 = n(o.start, 0), dur = n(o.duration, 1.6), color = s(o.color, PALETTE[0]), text = s(o.textColor, '#ffffff');\n const [W, H] = (o.size as Vec2) ?? [comp.width * 0.8, comp.height * 0.28];\n const max = n(o.max, Math.max(...d.map((x) => x.value), 1)), min = n(o.min, Math.min(0, ...d.map((x) => x.value)));\n const pts: Vec2[] = d.map((x, i) => [-W / 2 + (W * i) / Math.max(1, d.length - 1), H / 2 - ((x.value - min) / (max - min || 1)) * H]);\n // Catmull-Rom \u2192 cubic bezier for a smooth line through every point.\n let path = `M${pts[0][0]} ${pts[0][1]}`;\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[i - 1] ?? pts[i], p1 = pts[i], p2 = pts[i + 1], p3 = pts[i + 2] ?? p2;\n path += ` C${p1[0] + (p2[0] - p0[0]) / 6} ${p1[1] + (p2[1] - p0[1]) / 6} ${p2[0] - (p3[0] - p1[0]) / 6} ${p2[1] - (p3[1] - p1[1]) / 6} ${p2[0]} ${p2[1]}`;\n }\n const fs = Math.round(comp.width / 30);\n const parts: NewLayer[] = [];\n pts.forEach((pt, i) => {\n const ts = t0 + (dur * i) / Math.max(1, pts.length - 1);\n parts.push({type: 'shape', name: `dot-${i + 1}`, shape: 'ellipse', size: [22, 22], fill: '#ffffff', stroke: color, strokeWidth: 6, inPoint: t0,\n transform: {position: pt, scale: kf<Vec2>([ts - 0.05, [0, 0], 'backOut'], [ts + 0.35, [100, 100]])}} as NewLayer);\n if (o.showValues) parts.push({type: 'text', name: `value-${i + 1}`, text: '{value}', value: d[i].value, format: fmtOf(o), size: fs, weight: 800, color: text, inPoint: r3(ts),\n transform: {position: [pt[0], pt[1] - fs * 1.1]}, animators: [{unit: 'line', duration: 0.4, ease: 'backOut', from: {opacity: 0, scale: 50}}]} as NewLayer);\n if (d[i].label) parts.push({type: 'text', name: `label-${i + 1}`, text: d[i].label!, size: Math.round(fs * 0.8), weight: 600, color: text, inPoint: t0,\n transform: {position: [pt[0], H / 2 + fs * 1.2], opacity: kf([ts - 0.1, 0], [ts + 0.2, 70])}} as NewLayer);\n });\n parts.push({type: 'shape', name: 'line', shape: 'path', path, stroke: color, strokeWidth: 8, transform: {anchor: [0, 0], position: [0, 0]}, inPoint: t0,\n trim: {end: kf([t0, 0, 'easyEase'], [t0 + dur, 100])}} as NewLayer);\n if (o.area !== false) parts.push({type: 'shape', name: 'area', shape: 'path', path: `${path} L${pts[pts.length - 1][0]} ${H / 2} L${pts[0][0]} ${H / 2} Z`, inPoint: t0,\n fill: {linear: {from: [0, -H / 2], to: [0, H / 2], stops: [[0, `${color}88`], [1, `${color}00`]]}}, transform: {anchor: [0, 0], position: [0, 0]},\n // Revealed left to right in step with the line drawing on.\n masks: [{shape: 'rect', rect: kf<[number, number, number, number]>([t0, [-W / 2 - 10, -H, 0, H * 2], 'easyEase'], [t0 + dur, [-W / 2 - 10, -H, W + 20, H * 2]])}]} as NewLayer);\n parts.push({type: 'shape', name: 'axis', shape: 'line', points: [[-W / 2, H / 2], [W / 2, H / 2]], stroke: text, strokeWidth: 3, inPoint: t0, transform: {anchor: [0, 0], position: [0, 0], opacity: 50}, trim: {end: kf([t0, 0, 'expoOut'], [t0 + 0.6, 100])}} as NewLayer);\n return {created: build(p, compId, {type: 'null', name: s(o.name, 'line-chart'), inPoint: t0, transform: {position: (o.position as Vec2) ?? [comp.width / 2, comp.height / 2]}} as NewLayer, parts)};\n },\n },\n\n 'chart.donut': {\n kind: 'chart',\n description: 'Donut / pie chart: segments sweep round one after another; the centre shows the total (or a title) and a legend lists each part.',\n params: '{data: [{label, value, color?}], position?, diameter?, thickness? (diameter/2 = pie), start?, duration?, stagger?, centerText?: string | \"total\", prefix?, suffix?, decimals?, locale?, legend?: true, textColor?, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const d = data(o), t0 = n(o.start, 0), dur = n(o.duration, 0.8), stg = n(o.stagger, 0.25), text = s(o.textColor, '#ffffff');\n const D = n(o.diameter, comp.width * 0.55), th = Math.min(n(o.thickness, D * 0.18), D / 2);\n const total = d.reduce((a, x) => a + x.value, 0) || 1;\n const parts: NewLayer[] = [];\n let acc = 0;\n d.forEach((x, i) => {\n const a0 = (acc / total) * 100, a1 = ((acc + x.value) / total) * 100, ts = t0 + i * stg;\n acc += x.value;\n parts.push({type: 'shape', name: `segment-${i + 1}`, shape: 'ellipse', size: [D - th, D - th], stroke: x.color ?? PALETTE[i % PALETTE.length], strokeWidth: th, lineCap: 'butt', inPoint: t0,\n trim: {start: a0, end: kf([ts, a0, 'cubicOut'], [ts + dur, a1])}, transform: {position: [0, 0]}} as NewLayer);\n });\n const centre = o.centerText ?? 'total';\n if (centre && th < D / 2) parts.unshift(centre === 'total'\n ? {type: 'text', name: 'total', text: '{value}', value: kf([t0, 0, 'expoOut'], [t0 + stg * d.length + dur, total]), format: fmtOf(o), size: Math.round(D * 0.16), weight: 800, color: text, inPoint: t0, transform: {position: [0, 0]}} as NewLayer\n : {type: 'text', name: 'center', text: String(centre), size: Math.round(D * 0.12), weight: 800, color: text, inPoint: t0, maxWidth: D - th * 2.2, transform: {position: [0, 0]}, animators: [{unit: 'word', stagger: 0.08, duration: 0.5, ease: 'backOut', from: {opacity: 0, scale: 60}}]} as NewLayer);\n if (o.legend !== false) {\n const fs = Math.round(comp.width / 30), rowH = fs * 1.6;\n d.forEach((x, i) => {\n const y = D / 2 + fs * 2 + i * rowH, ts = t0 + i * stg;\n parts.push({type: 'shape', name: `legend-dot-${i + 1}`, shape: 'ellipse', size: [fs * 0.7, fs * 0.7], fill: x.color ?? PALETTE[i % PALETTE.length], inPoint: t0, transform: {position: [-D * 0.42, y], opacity: kf([ts, 0], [ts + 0.3, 100])}} as NewLayer);\n parts.push({type: 'text', name: `legend-${i + 1}`, text: `${x.label ?? `Part ${i + 1}`} \u00B7 ${Math.round((x.value / total) * 100)}%`, size: fs, weight: 600, align: 'left', color: text, inPoint: t0,\n transform: {position: [-D * 0.42 + fs, y]}, animators: [{unit: 'line', delay: ts - t0, duration: 0.5, ease: 'cubicOut', from: {opacity: 0, x: -30}}]} as NewLayer);\n });\n }\n return {created: build(p, compId, {type: 'null', name: s(o.name, 'donut-chart'), inPoint: t0, transform: {position: (o.position as Vec2) ?? [comp.width / 2, comp.height * 0.42]}} as NewLayer, parts)};\n },\n },\n\n 'chart.progress': {\n kind: 'chart',\n description: 'Progress ring (or bar) that fills to a percentage while the number counts up in the middle.',\n params: '{value: 0-100, style?: \"ring\"|\"bar\", label?, position?, diameter? (ring) | size?: [w,h] (bar), thickness?, start?, duration?, color?, trackColor?, textColor?, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const v = n(o.value, 75), t0 = n(o.start, 0), dur = n(o.duration, 1.4), color = s(o.color, PALETTE[0]), track = s(o.trackColor, '#ffffff22'), text = s(o.textColor, '#ffffff');\n const parts: NewLayer[] = [];\n if (o.style === 'bar') {\n const [W, H] = (o.size as Vec2) ?? [comp.width * 0.75, 36];\n parts.push({type: 'text', name: 'percent', text: '{value}', value: kf([t0, 0, 'expoOut'], [t0 + dur, v]), format: {suffix: '%'}, size: Math.round(H * 1.6), weight: 800, align: 'right', color: text, inPoint: t0, transform: {position: [W / 2, -H * 1.6]}} as NewLayer);\n if (o.label) parts.push({type: 'text', name: 'label', text: String(o.label), size: Math.round(H * 1.1), weight: 600, align: 'left', color: text, inPoint: t0, transform: {position: [-W / 2, -H * 1.6]}} as NewLayer);\n parts.push({type: 'shape', name: 'fill', shape: 'rect', size: [W, H], radius: H / 2, fill: color, inPoint: t0, transform: {anchor: [-W / 2, 0], position: [-W / 2, 0], scale: kf<Vec2>([t0, [0, 100], 'expoOut'], [t0 + dur, [v, 100]])}} as NewLayer);\n parts.push({type: 'shape', name: 'track', shape: 'rect', size: [W, H], radius: H / 2, fill: track, inPoint: t0, transform: {position: [0, 0]}} as NewLayer);\n } else {\n const D = n(o.diameter, comp.width * 0.5), th = n(o.thickness, D * 0.09);\n parts.push({type: 'text', name: 'percent', text: '{value}', value: kf([t0, 0, 'expoOut'], [t0 + dur, v]), format: {suffix: '%'}, size: Math.round(D * 0.24), weight: 800, color: text, inPoint: t0, transform: {position: [0, o.label ? -D * 0.05 : 0]}} as NewLayer);\n if (o.label) parts.push({type: 'text', name: 'label', text: String(o.label), size: Math.round(D * 0.08), weight: 600, color: text, inPoint: t0, maxWidth: D * 0.7, transform: {position: [0, D * 0.15]}} as NewLayer);\n parts.push({type: 'shape', name: 'ring', shape: 'ellipse', size: [D, D], stroke: color, strokeWidth: th, inPoint: t0, trim: {end: kf([t0, 0, 'expoOut'], [t0 + dur, v])}, transform: {position: [0, 0]}} as NewLayer);\n parts.push({type: 'shape', name: 'track', shape: 'ellipse', size: [D, D], stroke: track, strokeWidth: th, inPoint: t0, transform: {position: [0, 0]}} as NewLayer);\n }\n return {created: build(p, compId, {type: 'null', name: s(o.name, 'progress'), inPoint: t0, transform: {position: (o.position as Vec2) ?? [comp.width / 2, comp.height / 2]}} as NewLayer, parts)};\n },\n },\n\n 'element.counter': {\n kind: 'element',\n description: 'A big number that counts up (\u20B94,999 \u00B7 10,000+ customers \u00B7 98%), with an optional caption under it.',\n params: '{to: number, from?: 0, start?, duration?, prefix?, suffix?, decimals?, locale? (en-IN groups as 1,00,000), label?, size?, color?, labelColor?, position?, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = n(o.start, 0), dur = n(o.duration, 1.5), size = n(o.size, Math.round(comp.width / 6));\n const parts: NewLayer[] = [{type: 'text', name: 'number', text: '{value}', value: kf([t0, n(o.from, 0), 'expoOut'], [t0 + dur, n(o.to, 100)]), format: fmtOf(o), size, weight: 800, color: s(o.color, '#ffffff'), inPoint: t0,\n transform: {position: [0, 0], scale: kf<Vec2>([t0, [70, 70], 'backOut'], [t0 + 0.5, [100, 100]])}, animators: [{unit: 'line', duration: 0.3, from: {opacity: 0}}]} as NewLayer];\n if (o.label) parts.push({type: 'text', name: 'caption', text: String(o.label), size: Math.round(size * 0.32), weight: 600, color: s(o.labelColor, '#ffffffcc'), inPoint: t0, maxWidth: comp.width * 0.8,\n transform: {position: [0, size * 0.85]}, animators: [{unit: 'word', delay: 0.3, stagger: 0.06, duration: 0.5, ease: 'cubicOut', from: {opacity: 0, y: 24}}]} as NewLayer);\n return {created: build(p, compId, {type: 'null', name: s(o.name, 'counter'), inPoint: t0, transform: {position: (o.position as Vec2) ?? [comp.width / 2, comp.height / 2]}} as NewLayer, parts)};\n },\n },\n};\n", "// App-promo presets: a phone mockup that tilts in 3D, and a cursor / finger that moves and taps.\nimport type {Ease, NewLayer, Vec2} from '../core/model.js';\nimport {addComp, addLayer, getComp, uniqueId} from '../ops/ops.js';\nimport type {Preset} from './index.js';\n\nconst r3 = (t: number) => Math.round(t * 1000) / 1000;\nconst kf = <T>(...k: [number, T, Ease?][]) => ({keyframes: k.map(([t, v, ease]) => (ease ? {t: r3(t), v, ease} : {t: r3(t), v}))});\nconst n = (v: unknown, d: number) => (typeof v === 'number' ? v : d);\nconst s = (v: unknown, d: string) => (typeof v === 'string' ? v : d);\n\nconst ARROW = 'M0 0 L0 34 L9 26 L15 40 L21 37 L15 24 L27 24 Z';\nconst FINGER = 'M14 0 C18 0 20 3 20 7 L20 24 C22 22 27 22 29 25 C31 23 36 24 37 28 C39 27 44 28 44 33 L44 48 C44 58 37 66 27 66 L22 66 C16 66 12 63 9 58 L1 44 C-1 40 2 36 6 38 L8 40 L8 7 C8 3 10 0 14 0 Z';\n\nexport const APP_PRESETS: Record<string, Preset> = {\n 'element.phoneMockup': {\n kind: 'element',\n description: 'Phone mockup around a screenshot or screen recording (image or video), tilted in 3D and settling flat \u2014 for app and website promos.',\n params: '{src: image or video path (the screen), position?: [x,y], height?: px (default 70% of comp), start?, duration?: s (tilt-in), from?: [rotateX, rotateY] (default [18,-28]), to?: [rx, ry] (default [0,0]), body?: colour, trimIn?, speed?, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const H = Math.round(n(o.height, comp.height * 0.7)), W = Math.round(H * 0.49);\n const bezel = Math.round(W * 0.045), radius = Math.round(W * 0.16);\n const sw = W - bezel * 2, sh = H - bezel * 2;\n const t0 = n(o.start, 0), dur = n(o.duration, 1.4);\n const id = uniqueId(p, s(o.name, 'phone'));\n const src = s(o.src, '');\n const isVideo = /\\.(mp4|mov|webm|m4v)$/i.test(src);\n addComp(p, {id, name: id, width: W, height: H, duration: comp.duration, fps: comp.fps});\n const inner: NewLayer[] = [\n {type: 'shape', name: 'sheen', shape: 'rect', size: [sw, sh], radius: radius - bezel, transform: {position: [W / 2, H / 2], opacity: 35}, blendMode: 'screen',\n fill: {linear: {from: [-sw / 2, -sh / 2], to: [sw / 2, sh / 2], stops: [[0, '#ffffff55'], [0.35, '#ffffff00'], [1, '#ffffff00']]}}} as NewLayer,\n {type: 'shape', name: 'notch', shape: 'rect', size: [Math.round(W * 0.28), Math.round(W * 0.075)], radius: Math.round(W * 0.04), fill: '#0b0b0d', transform: {position: [W / 2, bezel + Math.round(W * 0.06)]}} as NewLayer,\n {type: isVideo ? 'video' : 'image', name: 'screen', src, size: [sw, sh], fit: 'cover', transform: {position: [W / 2, H / 2]},\n masks: [{shape: 'rect', rect: [0, 0, sw, sh], radius: radius - bezel}], ...(isVideo ? {trimIn: n(o.trimIn, 0), speed: n(o.speed, 1)} : {})} as NewLayer,\n {type: 'shape', name: 'body', shape: 'rect', size: [W, H], radius, fill: s(o.body, '#16171b'), stroke: '#3a3d44', strokeWidth: Math.max(2, Math.round(W * 0.006)), transform: {position: [W / 2, H / 2]}} as NewLayer,\n ];\n for (const l of [...inner].reverse()) addLayer(p, id, l, 0);\n const [fx, fy] = (o.from as Vec2) ?? [18, -28], [tx, ty] = (o.to as Vec2) ?? [0, 0];\n const layer = addLayer(p, compId, {\n type: 'precomp', name: id, comp: id, inPoint: t0, transform: {position: (o.position as Vec2) ?? [comp.width / 2, comp.height / 2]},\n effects: [\n {type: 'tilt', rotateX: kf([t0, fx, 'expoOut'], [t0 + dur, tx]), rotateY: kf([t0, fy, 'expoOut'], [t0 + dur, ty]), perspective: H * 2.2},\n {type: 'dropShadow', blur: 60, distance: 30, angle: 160, opacity: 55},\n ],\n } as NewLayer, 0);\n return {created: [layer.id], note: `Phone comp \"${id}\" (${W}\u00D7${H}); its \"screen\" layer holds ${src || 'your image/video'} \u2014 open the comp to adjust`};\n },\n },\n\n 'element.cursor': {\n kind: 'element',\n description: 'Mouse pointer or finger that glides between points and taps, with a ripple on each tap \u2014 for app, website and UI demos.',\n params: '{points: [{t: s, x, y, tap?: boolean}], style?: \"pointer\"|\"finger\"|\"dot\", size?: px, color?, rippleColor?, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const pts = ((o.points as {t: number; x: number; y: number; tap?: boolean}[]) ?? []).sort((a, b) => a.t - b.t);\n if (!pts.length) throw new Error('cursor needs points: [{t, x, y, tap?}]');\n const style = s(o.style, 'pointer'), size = n(o.size, Math.round(comp.width / 10));\n const created: string[] = [];\n const position = {keyframes: pts.map((pt, i) => ({t: r3(pt.t), v: [pt.x, pt.y] as Vec2, ...(i < pts.length - 1 ? {ease: 'easyEase' as Ease} : {})}))};\n const scaleK: [number, Vec2, Ease?][] = [];\n for (const pt of pts.filter((q) => q.tap)) scaleK.push([pt.t, [100, 100], 'easeIn'], [pt.t + 0.08, [82, 82], 'backOut'], [pt.t + 0.28, [100, 100]]);\n const inP = Math.max(0, pts[0].t - 0.3);\n const common = {inPoint: r3(inP), effects: [{type: 'dropShadow', blur: 10, distance: 4, opacity: 45}]};\n let layer: NewLayer;\n if (style === 'dot') layer = {type: 'shape', name: s(o.name, 'cursor'), shape: 'ellipse', size: [size * 0.6, size * 0.6], fill: s(o.color, '#ffffffdd'), stroke: '#00000055', strokeWidth: 2, transform: {position, ...(scaleK.length ? {scale: kf(...scaleK)} : {}), opacity: kf([inP, 0], [inP + 0.25, 100])}, ...common} as NewLayer;\n else {\n const path = style === 'finger' ? FINGER : ARROW, k = style === 'finger' ? size / 66 : size / 40;\n layer = {type: 'shape', name: s(o.name, 'cursor'), shape: 'path', path, fill: s(o.color, '#ffffff'), stroke: '#111111', strokeWidth: 2.2, lineJoin: 'round',\n transform: {anchor: style === 'finger' ? [14, 2] : [1, 1], position, scale: scaleK.length ? kf(...scaleK.map(([t, v, e]) => [t, [v[0] * k, v[1] * k] as Vec2, e] as [number, Vec2, Ease?])) : [k * 100, k * 100], opacity: kf([inP, 0], [inP + 0.25, 100])}, ...common} as NewLayer;\n if (!scaleK.length) (layer.transform as {scale: Vec2}).scale = [k * 100, k * 100];\n }\n const c = addLayer(p, compId, layer, 0);\n created.push(c.id);\n pts.filter((q) => q.tap).forEach((pt, i) => {\n const r = addLayer(p, compId, {type: 'shape', name: `tap-${i + 1}`, shape: 'ellipse', size: [size * 1.6, size * 1.6], stroke: s(o.rippleColor, '#ffffff'), strokeWidth: 4, fill: `${s(o.rippleColor, '#ffffff')}33`,\n inPoint: r3(pt.t), outPoint: r3(pt.t + 0.6), transform: {position: [pt.x, pt.y], scale: kf<Vec2>([pt.t, [10, 10], 'cubicOut'], [pt.t + 0.55, [100, 100]]), opacity: kf([pt.t, 90], [pt.t + 0.55, 0])}} as NewLayer, 1);\n created.push(r.id);\n });\n return {created};\n },\n },\n};\n", "// Captions: SRT/VTT/JSON parsing, word timing and paging into short on-screen phrases.\nexport interface Cue { start: number; end: number; text: string }\nexport interface Word { text: string; start: number; end: number }\n\nconst time = (s: string) => {\n const m = s.trim().replace(',', '.').match(/(?:(\\d+):)?(\\d+):(\\d+(?:\\.\\d+)?)/);\n if (!m) return NaN;\n return (m[1] ? Number(m[1]) * 3600 : 0) + Number(m[2]) * 60 + Number(m[3]);\n};\n\n// Parses SRT or WebVTT into cues.\nexport const parseSubtitles = (src: string): Cue[] => {\n const cues: Cue[] = [];\n for (const block of src.replace(/\\r/g, '').split(/\\n\\s*\\n/)) {\n const lines = block.split('\\n').map((l) => l.trim()).filter(Boolean);\n const i = lines.findIndex((l) => l.includes('-->'));\n if (i < 0) continue;\n const [a, b] = lines[i].split('-->');\n const text = lines.slice(i + 1).join(' ').replace(/<[^>]+>/g, '').trim();\n if (text) cues.push({start: time(a), end: time(b.split(/\\s+/).filter(Boolean)[0] ?? b), text});\n }\n return cues.filter((c) => Number.isFinite(c.start) && Number.isFinite(c.end));\n};\n\n// Spreads each cue's time across its words, weighted by length (cues only have phrase timing).\nexport const cuesToWords = (cues: Cue[]): Word[] =>\n cues.flatMap((c) => {\n const words = c.text.split(/\\s+/).filter(Boolean);\n const weights = words.map((w) => Math.max(1, [...w].length) + 1);\n const total = weights.reduce((a, b) => a + b, 0);\n let t = c.start;\n return words.map((w, i) => {\n const d = ((c.end - c.start) * weights[i]) / total;\n const out = {text: w, start: +t.toFixed(3), end: +(t + d).toFixed(3)};\n t += d;\n return out;\n });\n });\n\n// Groups words into on-screen pages: at most `maxWords` / `maxChars`, breaking after punctuation\n// and on pauses, the way short-form video captions read.\nexport const paginate = (words: Word[], maxWords = 4, maxChars = 22): Word[][] => {\n const pages: Word[][] = [];\n let cur: Word[] = [];\n const len = (ws: Word[]) => ws.reduce((a, w) => a + [...w.text].length + 1, 0);\n for (const w of words) {\n const pause = cur.length && w.start - cur[cur.length - 1].end > 0.6;\n if (cur.length && (cur.length >= maxWords || len([...cur, w]) > maxChars || pause)) { pages.push(cur); cur = []; }\n cur.push(w);\n if (/[.!?\u0964,;:]$/.test(w.text) && cur.length >= 2) { pages.push(cur); cur = []; }\n }\n if (cur.length) pages.push(cur);\n return pages;\n};\n", "// Captions preset: short-form style captions with the spoken word highlighted.\nimport {cuesToWords, paginate, parseSubtitles, type Cue, type Word} from '../core/captions.js';\nimport type {NewLayer, Vec2} from '../core/model.js';\nimport {addLayer, getComp} from '../ops/ops.js';\nimport type {Preset} from './index.js';\n\nconst n = (v: unknown, d: number) => (typeof v === 'number' ? v : d);\nconst s = (v: unknown, d: string) => (typeof v === 'string' ? v : d);\nconst r3 = (t: number) => Math.round(t * 1000) / 1000;\n\nexport const CAPTION_PRESETS: Record<string, Preset> = {\n 'captions.add': {\n kind: 'captions',\n description: 'Captions with the current word highlighted (Reels/Shorts style), from word timings, cues or SRT/VTT text. Pages of a few words appear in sync; every page is an editable text layer.',\n params: '{words?: [{text, start, end}], cues?: [{start, end, text}], srt?: string (SRT or VTT text), offset?: s, maxWords?: 4, maxChars?: 22, position?: [x,y] (default lower third), size?, color?, highlight?: colour, mode?: \"current\"|\"spoken\", box?: highlight plate colour, plate?: colour behind the whole line, uppercase?: boolean, style?: \"pop\"|\"fade\"|\"none\", font?, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n let words: Word[] = (o.words as Word[]) ?? [];\n if (!words.length) {\n const cues: Cue[] = (o.cues as Cue[]) ?? (typeof o.srt === 'string' ? parseSubtitles(o.srt) : []);\n words = cuesToWords(cues);\n }\n if (!words.length) throw new Error('No captions: pass words, cues or srt');\n const off = n(o.offset, 0);\n const pages = paginate(words.map((w) => ({...w, start: w.start + off, end: w.end + off})), n(o.maxWords, 4), n(o.maxChars, 22));\n const pos = (o.position as Vec2) ?? [comp.width / 2, comp.height * 0.72];\n const size = n(o.size, Math.round(comp.width / 13));\n const style = s(o.style, 'pop');\n const created: string[] = [];\n pages.forEach((page, i) => {\n const start = page[0].start, next = pages[i + 1]?.[0].start;\n const end = Math.min(next ?? Infinity, page[page.length - 1].end + 0.35);\n const text = page.map((w) => (o.uppercase ? w.text.toUpperCase() : w.text)).join(' ');\n const layer = addLayer(p, comp.id, {\n type: 'text', name: `${s(o.name, 'caption')}-${i + 1}`, text, size, weight: 800, color: s(o.color, '#ffffff'), font: o.font as string | undefined,\n inPoint: r3(start), outPoint: r3(Math.max(end, start + 0.3)), maxWidth: comp.width * 0.86,\n transform: {position: pos},\n stroke: {color: '#000000', width: Math.max(4, Math.round(size * 0.1))},\n ...(o.plate ? {box: {color: s(o.plate, '#000000aa'), padding: [Math.round(size * 0.35), Math.round(size * 0.18)], radius: Math.round(size * 0.25)}} : {}),\n karaoke: {words: page.map((w) => [r3(w.start), r3(w.end)] as [number, number]), color: s(o.highlight, '#FFC93C'), mode: o.mode === 'spoken' ? 'spoken' : 'current', ...(o.box ? {box: s(o.box, '#E8692A')} : {})},\n animators: style === 'none' ? [] : style === 'fade'\n ? [{unit: 'line', duration: 0.18, ease: 'easeOut', from: {opacity: 0}}]\n : [{unit: 'word', stagger: 0.04, duration: 0.22, ease: 'backOut', from: {opacity: 0, scale: 70}}],\n } as NewLayer, 0);\n created.push(layer.id);\n });\n return {created, note: `${pages.length} caption pages from ${words.length} words`};\n },\n },\n};\n", "// Web Mercator helpers for map routes and tile backgrounds.\nexport type LatLon = [number, number];\n\n// Lat/lon \u2192 world pixel coordinates at zoom level z (256 px tiles).\nexport const project = ([lat, lon]: LatLon, z = 0): [number, number] => {\n const s = 256 * 2 ** z;\n const sin = Math.sin((Math.max(-85.05, Math.min(85.05, lat)) * Math.PI) / 180);\n return [((lon + 180) / 360) * s, (0.5 - Math.log((1 + sin) / (1 - sin)) / (4 * Math.PI)) * s];\n};\n\nexport const unproject = ([x, y]: [number, number], z = 0): LatLon => {\n const s = 256 * 2 ** z;\n const lon = (x / s) * 360 - 180;\n const n = Math.PI - (2 * Math.PI * y) / s;\n return [(180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))), lon];\n};\n\nexport interface MapView { bounds: [LatLon, LatLon]; size: [number, number] } // NW corner, SE corner\n\n// Fits coordinates into a w\u00D7h box with padding, keeping Mercator proportions.\nexport const fitView = (pts: LatLon[], w: number, h: number, pad = 0.12): {toPx: (p: LatLon) => [number, number]; view: MapView} => {\n const xy = pts.map((p) => project(p, 0));\n let x0 = Math.min(...xy.map((p) => p[0])), x1 = Math.max(...xy.map((p) => p[0]));\n let y0 = Math.min(...xy.map((p) => p[1])), y1 = Math.max(...xy.map((p) => p[1]));\n const cx = (x0 + x1) / 2, cy = (y0 + y1) / 2;\n let sw = Math.max(x1 - x0, 1e-6) / (1 - 2 * pad), sh = Math.max(y1 - y0, 1e-6) / (1 - 2 * pad);\n if (sw / sh > w / h) sh = (sw * h) / w; else sw = (sh * w) / h;\n x0 = cx - sw / 2; x1 = cx + sw / 2; y0 = cy - sh / 2; y1 = cy + sh / 2;\n const toPx = (p: LatLon): [number, number] => { const [x, y] = project(p, 0); return [((x - x0) / (x1 - x0)) * w, ((y - y0) / (y1 - y0)) * h]; };\n return {toPx, view: {bounds: [unproject([x0, y0]), unproject([x1, y1])], size: [w, h]}};\n};\n\n// Maps lat/lon into an existing view (a stitched map image of known bounds).\nexport const viewToPx = (view: MapView) => {\n const [a, b] = [project(view.bounds[0], 0), project(view.bounds[1], 0)];\n return (p: LatLon): [number, number] => { const [x, y] = project(p, 0); return [((x - a[0]) / (b[0] - a[0])) * view.size[0], ((y - a[1]) / (b[1] - a[1])) * view.size[1]]; };\n};\n\nexport const distanceKm = (a: LatLon, b: LatLon) => {\n const R = 6371, dLat = ((b[0] - a[0]) * Math.PI) / 180, dLon = ((b[1] - a[1]) * Math.PI) / 180;\n const h = Math.sin(dLat / 2) ** 2 + Math.cos((a[0] * Math.PI) / 180) * Math.cos((b[0] * Math.PI) / 180) * Math.sin(dLon / 2) ** 2;\n return 2 * R * Math.asin(Math.sqrt(h));\n};\n", "// Map presets: an animated route from real coordinates, with pins, labels and a travelling marker.\nimport {distanceKm, fitView, viewToPx, type LatLon, type MapView} from '../core/geo.js';\nimport type {Ease, NewLayer, Vec2} from '../core/model.js';\nimport {pointAt, parsePath} from '../core/path.js';\nimport {addLayer, getComp} from '../ops/ops.js';\nimport type {Preset} from './index.js';\n\nconst n = (v: unknown, d: number) => (typeof v === 'number' ? v : d);\nconst s = (v: unknown, d: string) => (typeof v === 'string' ? v : d);\nconst r3 = (t: number) => Math.round(t * 1000) / 1000;\nconst kf = <T>(...k: [number, T, Ease?][]) => ({keyframes: k.map(([t, v, ease]) => (ease ? {t: r3(t), v, ease} : {t: r3(t), v}))});\nconst PIN = 'M0 0 C-6 -10 -18 -16 -18 -28 C-18 -38 -10 -46 0 -46 C10 -46 18 -38 18 -28 C18 -16 6 -10 0 0 Z';\n\nexport const MAP_PRESETS: Record<string, Preset> = {\n 'map.route': {\n kind: 'map',\n description: 'Animated map route from real coordinates: the path draws on, a marker travels along it, start/end pins drop in with labels. Optional real map background (see `dtly map-tiles`).',\n params: '{route: [[lat, lon], ...], labels?: string[] (one per point, \"\" to skip), start?, duration?, color?, width?, dashed?: boolean, smooth?: true, marker?: \"dot\"|\"pin\"|\"none\", background?: {src, bounds: [[latNW, lonNW], [latSE, lonSE]]}, size?: [w,h], position?, pinColor?, labelColor?, showDistance?: boolean, name?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const route = (o.route as LatLon[]) ?? [];\n if (route.length < 2) throw new Error('map.route needs at least two [lat, lon] points');\n const bg = o.background as {src: string; bounds: [LatLon, LatLon]} | undefined;\n const [W, H] = (o.size as Vec2) ?? [comp.width, comp.height];\n const toPx = bg ? viewToPx({bounds: bg.bounds, size: [W, H]} as MapView) : fitView(route, W, H).toPx;\n const pts = route.map((ll) => { const [x, y] = toPx(ll); return [x - W / 2, y - H / 2] as Vec2; });\n const t0 = n(o.start, 0), dur = n(o.duration, 3), color = s(o.color, '#E8692A'), lw = n(o.width, Math.round(comp.width / 90));\n let d = `M${pts[0][0]} ${pts[0][1]}`;\n if (o.smooth !== false && pts.length > 2) {\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[i - 1] ?? pts[i], p1 = pts[i], p2 = pts[i + 1], p3 = pts[i + 2] ?? p2;\n d += ` C${p1[0] + (p2[0] - p0[0]) / 6} ${p1[1] + (p2[1] - p0[1]) / 6} ${p2[0] - (p3[0] - p1[0]) / 6} ${p2[1] - (p3[1] - p1[1]) / 6} ${p2[0]} ${p2[1]}`;\n }\n } else for (const q of pts.slice(1)) d += ` L${q[0]} ${q[1]}`;\n const created: string[] = [];\n const group = addLayer(p, compId, {type: 'null', name: s(o.name, 'route'), inPoint: t0, transform: {position: (o.position as Vec2) ?? [comp.width / 2, comp.height / 2]}} as NewLayer, 0);\n created.push(group.id);\n const groupIndex = getComp(p, compId).layers.indexOf(group);\n // Parts are added top-down, each directly below the previous one.\n const add = (l: NewLayer) => created.push(addLayer(p, compId, {...l, parent: group.id} as NewLayer, groupIndex + created.length).id);\n const labels = (o.labels as string[]) ?? [];\n const fs = Math.round(comp.width / 26);\n // Pins and labels at each named stop (top of stack, added first).\n pts.forEach((pt, i) => {\n const isEnd = i === 0 || i === pts.length - 1;\n if (!isEnd && !labels[i]) return;\n const at = t0 + (i === 0 ? 0 : (dur * i) / (pts.length - 1));\n if (labels[i]) add({type: 'text', name: `label-${i + 1}`, text: labels[i], size: fs, weight: 800, color: s(o.labelColor, '#ffffff'), inPoint: r3(at),\n box: {color: '#000000aa', padding: [Math.round(fs * 0.45), Math.round(fs * 0.2)], radius: Math.round(fs * 0.3)},\n transform: {position: [pt[0], pt[1] - fs * 2.6]}, animators: [{unit: 'line', duration: 0.4, ease: 'backOut', from: {opacity: 0, y: 30, scale: 80}}]} as NewLayer);\n add({type: 'shape', name: `pin-${i + 1}`, shape: 'path', path: PIN, fill: i === pts.length - 1 ? s(o.pinColor, color) : '#ffffff', stroke: '#00000066', strokeWidth: 2,\n inPoint: r3(at), transform: {anchor: [0, 0], position: pt, scale: kf<Vec2>([at, [0, 0], 'backOut'], [at + 0.45, [100 * fs / 30, 100 * fs / 30]])},\n effects: [{type: 'dropShadow', blur: 8, distance: 4, opacity: 40}]} as NewLayer);\n });\n // Travelling marker: position keyframes sampled along the path, in step with the draw-on.\n if (o.marker !== 'none') {\n const path = parsePath(d), N = 40;\n const keys = Array.from({length: N + 1}, (_, k) => ({t: r3(t0 + (dur * k) / N), v: pointAt(path, k / N).p}));\n add({type: 'shape', name: 'marker', shape: 'ellipse', size: [lw * 2.6, lw * 2.6], fill: '#ffffff', stroke: color, strokeWidth: lw * 0.6, inPoint: t0, outPoint: r3(t0 + dur + 0.2),\n transform: {position: {keyframes: keys}}, effects: [{type: 'glow', color, radius: 18, strength: 70}]} as NewLayer);\n }\n add({type: 'shape', name: 'route-line', shape: 'path', path: d, stroke: color, strokeWidth: lw, ...(o.dashed ? {dash: [lw * 2, lw * 1.6], lineCap: 'butt'} : {}), inPoint: t0,\n transform: {anchor: [0, 0], position: [0, 0]}, trim: {end: kf([t0, 0, 'linear'], [t0 + dur, 100])}} as NewLayer);\n add({type: 'shape', name: 'route-casing', shape: 'path', path: d, stroke: '#00000055', strokeWidth: lw * 1.9, inPoint: t0,\n transform: {anchor: [0, 0], position: [0, 0]}, trim: {end: kf([t0, 0, 'linear'], [t0 + dur, 100])}} as NewLayer);\n if (o.showDistance) {\n const km = route.slice(1).reduce((a, q, i) => a + distanceKm(route[i], q), 0);\n add({type: 'text', name: 'distance', text: '{value}', value: kf([t0, 0], [t0 + dur, Math.round(km)]), format: {suffix: ' km'}, size: Math.round(fs * 1.4), weight: 800, color: s(o.labelColor, '#ffffff'), inPoint: t0,\n box: {color: '#000000aa', padding: [fs * 0.5, fs * 0.25], radius: fs * 0.3}, transform: {position: [0, H / 2 - fs * 4]}} as NewLayer);\n }\n if (bg) add({type: 'image', name: 'map', src: bg.src, size: [W, H], fit: 'fill', inPoint: t0, transform: {position: [0, 0], anchor: [W / 2, H / 2]}} as NewLayer);\n return {created, note: bg ? 'Route drawn over the map image' : 'No background: add a map image (dtly map-tiles) or a solid underneath'};\n },\n },\n};\n", "// Preset catalogue: text animators, kinetic typography, openers, slides and transitions.\n// Each preset edits a project through the same ops an agent uses, and returns what it created.\nimport type {Ease, Effect, NewLayer, Project, Vec2} from '../core/model.js';\nimport {addLayer, findLayer, getComp, OpError, setKeyframe, updateLayer} from '../ops/ops.js';\nimport {TEXT_ANIMATORS} from './text.js';\nimport {CHART_PRESETS} from './charts.js';\nimport {APP_PRESETS} from './app.js';\nimport {CAPTION_PRESETS} from './captions.js';\nimport {MAP_PRESETS} from './maps.js';\n\ntype Params = Record<string, unknown>;\nexport interface Preset {\n kind: 'text' | 'kinetic' | 'opener' | 'slides' | 'transition' | 'element' | 'chart' | 'overlay' | 'map' | 'captions';\n description: string;\n params: string; // human-readable parameter reference\n apply: (p: Project, comp: string | undefined, params: Params) => {created: string[]; note?: string};\n}\n\nconst num = (v: unknown, d: number) => (typeof v === 'number' ? v : d);\nconst str = (v: unknown, d: string) => (typeof v === 'string' ? v : d);\nconst r3 = (t: number) => Math.round(t * 1000) / 1000;\nconst kf = <T>(...k: [number, T, Ease?][]) => ({keyframes: k.map(([t, v, ease]) => (ease ? {t: r3(t), v, ease} : {t: r3(t), v}))});\n\nexport const PRESETS: Record<string, Preset> = {};\n\nfor (const [name, def] of Object.entries(TEXT_ANIMATORS)) {\n PRESETS[`text.${name}`] = {\n kind: 'text',\n description: def.description,\n params: '{layer: textLayerId, delay?: s, stagger?: s, duration?: s, replace?: boolean}',\n apply: (p, _comp, o) => {\n const {layer} = findLayer(p, str(o.layer, ''));\n if (layer.type !== 'text') throw new OpError(`${layer.id} is not a text layer`);\n const anims = def.animators.map((a) => ({...a, ...(o.delay !== undefined && {delay: num(o.delay, 0)}), ...(o.stagger !== undefined && {stagger: num(o.stagger, 0)}), ...(o.duration !== undefined && {duration: num(o.duration, 0.5)})}));\n layer.animators = o.replace === false ? [...(layer.animators ?? []), ...anims] : [...(layer.animators ?? []).filter((a) => (a.mode === 'out') !== (anims[0].mode === 'out')), ...anims];\n return {created: [], note: `Applied ${name} to ${layer.id}`};\n },\n };\n}\n\nPRESETS['kinetic.sequence'] = {\n kind: 'kinetic',\n description: 'Classic kinetic typography: phrases appear one after another in the same spot, each with its own entrance, emphasis words bigger and coloured.',\n params: '{phrases: string[], start?: s, each?: s (default by length), position?: [x,y], size?: px, color?, accent?: color, emphasis?: string[] (words to highlight), style?: \"slam\"|\"popIn\"|\"fadeUp\"|\"blurIn\"|\"cascade\", font?, maxWidth?, holdLast?: boolean (default true: last phrase stays to the end of the comp)}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const phrases = (o.phrases as string[]) ?? [];\n const pos = (o.position as Vec2) ?? [comp.width / 2, comp.height / 2];\n const size = num(o.size, Math.round(comp.width / 9));\n const style = str(o.style, 'slam');\n const emphasis = new Set(((o.emphasis as string[]) ?? []).map((w) => w.toLowerCase()));\n let t = num(o.start, 0);\n const created: string[] = [];\n const holdLast = o.holdLast !== false;\n phrases.forEach((text, i) => {\n const words = text.split(/\\s+/).length;\n const each = num(o.each, Math.max(0.7, 0.35 + words * 0.32));\n const last = holdLast && i === phrases.length - 1;\n const outPoint = last ? Math.max(comp.duration, t + each) : t + each;\n const isEmph = text.split(/\\s+/).some((w) => emphasis.has(w.toLowerCase()));\n const layer = addLayer(p, comp.id, {\n type: 'text', name: `kinetic-${i + 1}`, text, inPoint: r3(t), outPoint: r3(outPoint),\n size: isEmph ? Math.round(size * 1.35) : size, weight: 800, font: o.font as string | undefined,\n color: isEmph ? str(o.accent, '#FFC93C') : str(o.color, '#ffffff'), maxWidth: num(o.maxWidth, comp.width * 0.86),\n transform: {position: pos, scale: kf<Vec2>([t, [100, 100]], [outPoint, [100 + 8 * ((outPoint - t) / each), 100 + 8 * ((outPoint - t) / each)]])},\n animators: [...TEXT_ANIMATORS[style in TEXT_ANIMATORS ? style : 'slam'].animators, ...(last ? [] : [{unit: 'word' as const, mode: 'out' as const, stagger: 0.03, duration: 0.18, ease: 'easeIn' as const, from: {opacity: 0, scale: 80}}])],\n } as NewLayer);\n created.push(layer.id);\n t = r3(t + each);\n });\n return {created, note: `Sequence ends at ${t.toFixed(2)}s`};\n },\n};\n\nPRESETS['opener.logoReveal'] = {\n kind: 'opener',\n description: 'Brand opener: a ring draws on and bursts, the title tracks in, an accent line draws, and a tagline reveals from a mask.',\n params: '{title: string, tagline?: string, start?: s, color?: brand colour, accent?: colour, textColor?, position?: [x,y], size?: px, font?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = num(o.start, 0);\n const [cx, cy] = (o.position as Vec2) ?? [comp.width / 2, comp.height / 2];\n const color = str(o.color, '#E8692A'), accent = str(o.accent, '#FFC93C');\n const size = num(o.size, Math.round(comp.width / 7.5));\n const r = Math.min(comp.width, comp.height) * 0.42;\n const created: string[] = [];\n const add = (l: NewLayer) => created.push(addLayer(p, comp.id, l).id);\n add({type: 'shape', name: 'reveal-ring', shape: 'ellipse', size: [r, r], stroke: color, strokeWidth: 10, inPoint: t0, outPoint: t0 + 1.6, motionBlur: {samples: 8},\n transform: {position: [cx, cy], rotation: kf([t0, -120, 'expoOut'], [t0 + 1, 0]), scale: kf<Vec2>([t0 + 0.7, [100, 100], 'expoOut'], [t0 + 1.4, [260, 260]]), opacity: kf([t0 + 0.9, 100], [t0 + 1.4, 0])},\n trim: {end: kf([t0, 0, 'expoOut'], [t0 + 0.8, 100])}} as NewLayer);\n add({type: 'shape', name: 'reveal-burst', shape: 'ellipse', size: [r * 0.9, r * 0.9], fill: color, inPoint: t0 + 0.7, outPoint: t0 + 1.5,\n transform: {position: [cx, cy], scale: kf<Vec2>([t0 + 0.7, [0, 0], 'expoOut'], [t0 + 1.2, [220, 220]]), opacity: kf([t0 + 0.9, 90], [t0 + 1.5, 0])}} as NewLayer);\n add({type: 'text', name: 'opener-title', text: str(o.title, 'TITLE'), size, weight: 800, color: str(o.textColor, '#ffffff'), font: o.font as string | undefined, inPoint: t0 + 0.8,\n maxWidth: comp.width * 0.88, transform: {position: [cx, cy]},\n animators: [{unit: 'grapheme', stagger: 0.025, duration: 1.1, ease: 'expoOut', from: {opacity: 0, tracking: 40, blur: 10}}],\n effects: [{type: 'dropShadow', blur: 30, distance: 0, opacity: 50}]} as NewLayer);\n add({type: 'shape', name: 'opener-line', shape: 'line', points: [[-comp.width * 0.3, 0], [comp.width * 0.3, 0]], stroke: accent, strokeWidth: 8, inPoint: t0 + 1.2,\n transform: {position: [cx, cy + size * 0.85]}, trim: {start: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 0]), end: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 100])}} as NewLayer);\n if (o.tagline) add({type: 'text', name: 'opener-tagline', text: str(o.tagline, ''), size: Math.round(size * 0.42), weight: 600, color: accent, font: o.font as string | undefined, inPoint: t0 + 1.5,\n transform: {position: [cx, cy + size * 1.4]}, animators: [{unit: 'line', clip: true, stagger: 0.1, duration: 0.8, ease: 'expoOut', from: {y: size * 0.6}}]} as NewLayer);\n return {created, note: `Opener settles at ${(t0 + 2.3).toFixed(1)}s`};\n },\n};\n\nPRESETS['opener.bars'] = {\n kind: 'opener',\n description: 'Coloured bars sweep across the frame in a stagger, uncovering a title that slams in.',\n params: '{title: string, start?: s, colors?: string[], textColor?, size?: px, font?, direction?: \"left\"|\"right\"}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = num(o.start, 0);\n const colors = (o.colors as string[]) ?? ['#E8692A', '#FFC93C', '#F6EEDF', '#1A1512'];\n const dir = o.direction === 'right' ? -1 : 1;\n const barH = comp.height / colors.length;\n const created: string[] = [];\n colors.forEach((c, i) => {\n const ts = t0 + i * 0.08;\n created.push(addLayer(p, comp.id, {type: 'solid', name: `bar-${i + 1}`, color: c, size: [comp.width, barH + 2], inPoint: t0, outPoint: t0 + 1.6,\n transform: {anchor: [0, 0], position: kf<Vec2>([ts, [-comp.width * dir, i * barH], 'expoInOut'], [ts + 0.6, [0, i * barH], 'expoInOut'], [ts + 0.85, [0, i * barH], 'expoInOut'], [ts + 1.4, [comp.width * dir, i * barH]])}} as NewLayer).id);\n });\n created.unshift(addLayer(p, comp.id, {type: 'text', name: 'bars-title', text: str(o.title, 'TITLE'), size: num(o.size, Math.round(comp.width / 8)), weight: 800, color: str(o.textColor, '#ffffff'),\n font: o.font as string | undefined, inPoint: t0 + 0.9, maxWidth: comp.width * 0.88,\n animators: TEXT_ANIMATORS.slam.animators}, 0).id);\n return {created};\n },\n};\n\nPRESETS['slides.slideshow'] = {\n kind: 'slides',\n description: 'Slider/slideshow from images and clips: each slide gets a slow Ken Burns move, an optional caption, and a transition into the next.',\n params: '{items: [{src, type?: \"image\"|\"video\", caption?, trimIn?, speed?}], start?: s, each?: s, transition?: type or list of types cycled per cut (\"push\"|\"crossfade\"|\"zoom\"|\"wipe\"|\"whip\"|\"slideUp\"), transitionDuration?: s, captionStyle?: text preset name, captionColor?, captionY?: px, plate?: colour, fitComp?: boolean (default true: comp duration = slideshow end)}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const items = (o.items as {src: string; type?: string; caption?: string; trimIn?: number; speed?: number}[]) ?? [];\n const each = num(o.each, 3), td = num(o.transitionDuration, 0.5), t0 = num(o.start, 0);\n const created: string[] = [];\n const ids: string[] = [];\n items.forEach((it, i) => {\n const start = t0 + i * (each - td);\n const end = start + each;\n const type = it.type ?? (/\\.(mp4|mov|webm|m4v)$/i.test(it.src) ? 'video' : 'image');\n const zoomIn = i % 2 === 0;\n const layer = addLayer(p, comp.id, {\n type, name: `slide-${i + 1}`, src: it.src, inPoint: +start.toFixed(3), outPoint: +end.toFixed(3),\n ...(type === 'video' ? {trimIn: it.trimIn ?? 0, speed: it.speed ?? 1} : {}),\n transform: {scale: kf<Vec2>([start, zoomIn ? [104, 104] : [118, 118]], [end, zoomIn ? [118, 118] : [104, 104]])},\n } as NewLayer, comp.layers.length);\n ids.push(layer.id);\n created.push(layer.id);\n if (it.caption) {\n created.push(addLayer(p, comp.id, {type: 'text', name: `caption-${i + 1}`, text: it.caption, size: Math.round(comp.width / 15), weight: 800, color: str(o.captionColor, '#ffffff'),\n inPoint: +(start + td * 0.6).toFixed(3), outPoint: +(end - td).toFixed(3), maxWidth: comp.width * 0.84,\n transform: {position: [comp.width / 2, num(o.captionY, comp.height * 0.78)]},\n box: o.plate ? {color: str(o.plate, '#000000'), padding: [32, 16], radius: 18, reveal: kf([start + td * 0.6, 0, 'expoOut'], [start + td * 0.6 + 0.5, 100])} : undefined,\n shadow: o.plate ? undefined : {color: 'rgba(0,0,0,0.7)', blur: 18, y: 4},\n animators: [...TEXT_ANIMATORS[str(o.captionStyle, 'fadeUp')]?.animators ?? TEXT_ANIMATORS.fadeUp.animators, ...TEXT_ANIMATORS.fadeOutDown.animators]} as NewLayer, 0).id);\n }\n });\n // Transitions between consecutive slides.\n const types = Array.isArray(o.transition) ? (o.transition as string[]) : [str(o.transition, 'push')];\n for (let i = 1; i < ids.length; i++) PRESETS['transition.between'].apply(p, comp.id, {from: ids[i - 1], to: ids[i], type: types[(i - 1) % types.length], duration: td});\n const end = r3(t0 + items.length * (each - td) + td);\n if (o.fitComp !== false) comp.duration = end;\n return {created, note: `Slideshow ends at ${end}s${o.fitComp !== false ? ' (comp duration set to match)' : ''}`};\n },\n};\n\nPRESETS['transition.between'] = {\n kind: 'transition',\n description: 'Animates two overlapping layers (clips, images or precomps) so one hands over to the other at the overlap.',\n params: '{from: layerId (outgoing), to: layerId (incoming, must start before `from` ends), type: \"push\"|\"crossfade\"|\"zoom\"|\"wipe\"|\"whip\"|\"slideUp\"|\"glitch\"|\"rgbWhip\"|\"warp\"|\"flash\", duration?: s}',\n apply: (p, compId, o) => {\n const a = findLayer(p, str(o.from, '')), b = findLayer(p, str(o.to, ''));\n const comp = a.comp;\n const d = num(o.duration, 0.5);\n const t1 = b.layer.inPoint ?? 0, t2 = t1 + d;\n const W = comp.width, H = comp.height;\n const center: Vec2 = [W / 2, H / 2];\n const type = str(o.type, 'push');\n const pos = (id: string, ...k: [number, Vec2, Ease?][]) => k.forEach(([t, v, e]) => setKeyframe(p, id, 'transform.position', t, v, e));\n // Incoming must sit above the outgoing layer for overlays like wipe/crossfade.\n if (b.index > a.index) { comp.layers.splice(b.index, 1); comp.layers.splice(a.index, 0, b.layer); }\n switch (type) {\n case 'crossfade':\n setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easyEase'); setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);\n break;\n case 'zoom':\n setKeyframe(p, a.layer.id, 'transform.opacity', t1, 100, 'easeIn'); setKeyframe(p, a.layer.id, 'transform.opacity', t2, 0);\n updateLayer(p, a.layer.id, {effects: [...(a.layer.effects ?? []), {type: 'blur', radius: kf([t1, 0, 'easeIn'], [t2, 25])}]});\n setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easeOut'); setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);\n break;\n case 'wipe':\n updateLayer(p, b.layer.id, {masks: [{shape: 'rect', rect: kf<[number, number, number, number]>([t1, [0, 0, 0, H], 'expoInOut'], [t2, [0, 0, W * 1.2, H]])}]});\n break;\n case 'slideUp':\n pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [W / 2, -H / 2]]);\n pos(b.layer.id, [t1, [W / 2, H * 1.5], 'expoInOut'], [t2, center]);\n break;\n case 'whip':\n pos(a.layer.id, [t1, center, 'expoIn'], [t2, [-W / 2, H / 2]]);\n pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoOut'], [t2, center]);\n for (const id of [a.layer.id, b.layer.id]) updateLayer(p, id, {motionBlur: {samples: 12, shutter: 360}});\n break;\n case 'glitch': {\n // Hard cut in the middle of a burst of digital glitching.\n const mid = r3(t1 + d / 2);\n addFx(p, a.layer.id, {type: 'glitch', amount: kf([t1, 0], [mid, 100])});\n addFx(p, b.layer.id, {type: 'glitch', amount: kf([mid, 100], [t2, 0])});\n setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'hold'); setKeyframe(p, b.layer.id, 'transform.opacity', mid, 100);\n break;\n }\n case 'rgbWhip':\n pos(a.layer.id, [t1, center, 'expoIn'], [t2, [-W / 2, H / 2]]);\n pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoOut'], [t2, center]);\n for (const id of [a.layer.id, b.layer.id]) { updateLayer(p, id, {motionBlur: {samples: 10, shutter: 270}}); addFx(p, id, {type: 'rgbSplit', amount: kf([t1, 0, 'easeIn'], [r3(t1 + d / 2), 40, 'easeOut'], [t2, 0])}); }\n break;\n case 'warp': {\n const mid = r3(t1 + d / 2);\n addFx(p, a.layer.id, {type: 'wave', amplitude: kf([t1, 0, 'easeIn'], [t2, 80]), wavelength: 260, speed: 2});\n addFx(p, b.layer.id, {type: 'wave', amplitude: kf([t1, 80, 'easeOut'], [t2, 0]), wavelength: 260, speed: 2});\n setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easyEase'); setKeyframe(p, b.layer.id, 'transform.opacity', mid, 100);\n break;\n }\n case 'flash':\n setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'hold'); setKeyframe(p, b.layer.id, 'transform.opacity', r3(t1 + d / 2), 100);\n PRESETS['overlay.lightLeak'].apply(p, comp.id, {start: t1 - d * 0.2, duration: d * 1.6, intensity: 100});\n break;\n default: // push\n pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [-W / 2, H / 2]]);\n pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoInOut'], [t2, center]);\n }\n return {created: [], note: `${type} from ${a.layer.id} to ${b.layer.id} at ${t1}s\u2013${t2}s`};\n },\n};\n\nconst addFx = (p: Project, id: string, e: Effect) => {\n const {layer} = findLayer(p, id);\n layer.effects = [...(layer.effects ?? []), e];\n};\n\nPRESETS['overlay.lightLeak'] = {\n kind: 'overlay',\n description: 'Warm film light leak: soft glowing colour blobs drift across the frame (screen blend) \u2014 on cuts, openers or to add warmth.',\n params: '{start?: s, duration?: s (default 1.2), colors?: string[], intensity?: 0-100 (default 80), direction?: \"left\"|\"right\"}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = Math.max(0, num(o.start, 0)), d = num(o.duration, 1.2), peak = num(o.intensity, 80);\n const colors = (o.colors as string[]) ?? ['#ff8a3d', '#ffd166', '#ff4f6d'];\n const dir = o.direction === 'left' ? -1 : 1, W = comp.width, H = comp.height;\n const created: string[] = [];\n colors.forEach((c, i) => {\n const r = Math.max(W, H) * (0.55 + i * 0.12);\n const y = H * (0.25 + 0.3 * i);\n created.push(addLayer(p, comp.id, {type: 'shape', name: `light-leak-${i + 1}`, shape: 'ellipse', size: [r * 2, r * 2], blendMode: 'screen',\n fill: {radial: {center: [0, 0], radius: r, stops: [[0, `${c}ee`], [0.45, `${c}66`], [1, `${c}00`]]}},\n inPoint: r3(t0), outPoint: r3(t0 + d),\n transform: {position: kf<Vec2>([t0, [W / 2 - dir * W * (0.8 + i * 0.2), y], 'easyEase'], [t0 + d, [W / 2 + dir * W * (0.6 + i * 0.15), y + H * 0.1]]),\n opacity: kf([t0, 0, 'easeOut'], [t0 + d * 0.4, peak, 'easeIn'], [t0 + d, 0])}} as NewLayer, 0).id);\n });\n return {created};\n },\n};\n\nPRESETS['element.lowerThird'] = {\n kind: 'element',\n description: 'Lower third: an accent bar wipes in, then name and title slide out from behind it.',\n params: '{name: string, title?: string, start?: s, duration?: s, color?, textColor?, y?: px, font?}',\n apply: (p, compId, o) => {\n const comp = getComp(p, compId);\n const t0 = num(o.start, 0), dur = num(o.duration, 4), y = num(o.y, comp.height * 0.72);\n const color = str(o.color, '#E8692A');\n const x = comp.width * 0.08;\n const created: string[] = [];\n const bar = addLayer(p, comp.id, {type: 'solid', name: 'lt-bar', color, size: [12, 170], inPoint: t0, outPoint: t0 + dur,\n transform: {anchor: [0, 0], position: [x, y], scale: kf<Vec2>([t0, [100, 0], 'expoOut'], [t0 + 0.5, [100, 100]], [t0 + dur - 0.5, [100, 100], 'expoIn'], [t0 + dur, [100, 0]])}} as NewLayer);\n created.push(bar.id);\n const mk = (text: string, size: number, dy: number, delay: number, c: string, name: string) =>\n created.push(addLayer(p, comp.id, {type: 'text', name, text, size, weight: 800, align: 'left', color: c, font: o.font as string | undefined, inPoint: t0 + delay, outPoint: t0 + dur,\n transform: {position: [x + 34, y + dy]}, masks: [{shape: 'rect', rect: [0, -200, comp.width, 400]}],\n animators: [{unit: 'line', duration: 0.7, ease: 'expoOut', from: {x: -comp.width * 0.6}}, {unit: 'line', mode: 'out', duration: 0.5, ease: 'expoIn', from: {x: -comp.width * 0.6}}]} as NewLayer).id);\n mk(str(o.name, 'Name'), Math.round(comp.width / 15), 55, 0.25, str(o.textColor, '#ffffff'), 'lt-name');\n if (o.title) mk(str(o.title, ''), Math.round(comp.width / 28), 125, 0.4, color, 'lt-title');\n return {created};\n },\n};\n\nPRESETS['element.highlightWord'] = {\n kind: 'element',\n description: 'Adds a background plate that wipes in behind an existing text layer (marker highlight).',\n params: '{layer: textLayerId, color?, at?: s, duration?: s, padding?: [x,y], radius?}',\n apply: (p, _c, o) => {\n const {layer} = findLayer(p, str(o.layer, ''));\n if (layer.type !== 'text') throw new OpError(`${layer.id} is not a text layer`);\n const at = num(o.at, layer.inPoint ?? 0), d = num(o.duration, 0.45);\n layer.box = {color: str(o.color, '#E8692A'), padding: (o.padding as [number, number]) ?? [26, 10], radius: num(o.radius, 14), reveal: kf([at, 0, 'expoOut'], [at + d, 100])};\n return {created: []};\n },\n};\n\nObject.assign(PRESETS, CHART_PRESETS, APP_PRESETS, CAPTION_PRESETS, MAP_PRESETS);\n\nexport const listPresets = () =>\n Object.entries(PRESETS).map(([name, p]) => `${name} [${p.kind}] \u2014 ${p.description}\\n params: ${p.params}`).join('\\n');\n", "// Injected by the studio server into index.html.\nexport const config = (window as unknown as {DTLY: {token: string; file: string; version: string; brand: string}}).DTLY;\n", "import type {Ease} from './model.js';\n\n// Cubic-bezier solver (same curve definition as CSS / AE's speed graph handles).\nconst bezier = (x1: number, y1: number, x2: number, y2: number) => {\n const cx = 3 * x1, bx = 3 * (x2 - x1) - cx, ax = 1 - cx - bx;\n const cy = 3 * y1, by = 3 * (y2 - y1) - cy, ay = 1 - cy - by;\n const sx = (t: number) => ((ax * t + bx) * t + cx) * t;\n const sy = (t: number) => ((ay * t + by) * t + cy) * t;\n const dx = (t: number) => (3 * ax * t + 2 * bx) * t + cx;\n return (x: number) => {\n let t = x;\n for (let i = 0; i < 8; i++) {\n const e = sx(t) - x;\n if (Math.abs(e) < 1e-6) return sy(t);\n const d = dx(t);\n if (Math.abs(d) < 1e-6) break;\n t -= e / d;\n }\n let lo = 0, hi = 1;\n t = x;\n for (let i = 0; i < 40; i++) {\n const v = sx(t);\n if (Math.abs(v - x) < 1e-6) break;\n if (v < x) lo = t; else hi = t;\n t = (lo + hi) / 2;\n }\n return sy(t);\n };\n};\n\nconst CURVES: Record<string, [number, number, number, number]> = {\n easeIn: [0.42, 0, 1, 1],\n easeOut: [0, 0, 0.58, 1],\n easyEase: [0.333, 0, 0.667, 1], // AE \"Easy Ease\" (33% influence both sides)\n quadOut: [0.25, 0.46, 0.45, 0.94],\n cubicOut: [0.215, 0.61, 0.355, 1],\n expoIn: [0.95, 0.05, 0.795, 0.035],\n expoOut: [0.19, 1, 0.22, 1],\n expoInOut: [1, 0, 0, 1],\n backOut: [0.175, 0.885, 0.32, 1.275],\n backIn: [0.6, -0.28, 0.735, 0.045],\n};\n\nconst cache = new Map<string, (x: number) => number>();\n\nconst elasticOut = (x: number) =>\n x === 0 || x === 1 ? x : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * ((2 * Math.PI) / 3)) + 1;\nconst bounceOut = (x: number) => {\n const n = 7.5625, d = 2.75;\n if (x < 1 / d) return n * x * x;\n if (x < 2 / d) return n * (x -= 1.5 / d) * x + 0.75;\n if (x < 2.5 / d) return n * (x -= 2.25 / d) * x + 0.9375;\n return n * (x -= 2.625 / d) * x + 0.984375;\n};\n\n// Damped spring from 0 to 1; `elapsed` in seconds so the motion is physical, not stretched.\nexport const spring = (elapsed: number, {stiffness = 170, damping = 18, mass = 1} = {}) => {\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n if (zeta < 1) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * elapsed) * (Math.cos(wd * elapsed) + ((zeta * w0) / wd) * Math.sin(wd * elapsed));\n }\n return 1 - Math.exp(-w0 * elapsed) * (1 + w0 * elapsed);\n};\n\n// Progress 0..1 (may overshoot) for a segment, given linear progress x and segment length in seconds.\nexport const applyEase = (ease: Ease | undefined, x: number, segSeconds = 1): number => {\n if (!ease || ease === 'linear') return x;\n if (ease === 'hold') return x >= 1 ? 1 : 0;\n if (ease === 'elasticOut') return elasticOut(x);\n if (ease === 'bounceOut') return bounceOut(x);\n if (typeof ease === 'object' && !Array.isArray(ease)) return x >= 1 ? 1 : spring(x * segSeconds, ease.spring);\n const pts = Array.isArray(ease) ? ease : CURVES[ease];\n if (!pts) return x;\n const key = pts.join(',');\n let fn = cache.get(key);\n if (!fn) cache.set(key, (fn = bezier(...pts)));\n return fn(x);\n};\n\nexport const EASE_NAMES = ['linear', 'hold', ...Object.keys(CURVES), 'elasticOut', 'bounceOut'];\n", "import {applyEase} from './ease.js';\nimport {parseColor, rgbaString} from './color.js';\nimport {morph, parsePath, pathToString, type Path} from './path.js';\n\nconst pathCache = new Map<string, Path>();\nconst parsed = (d: string) => {\n let p = pathCache.get(d);\n if (!p) { p = parsePath(d); if (pathCache.size > 200) pathCache.clear(); pathCache.set(d, p); }\n return p;\n};\nimport {isAnimated, type Keyframe, type Prop, type Wiggle} from './model.js';\n\nconst lerp = (a: number, b: number, p: number) => a + (b - a) * p;\n\nconst interpolate = (a: unknown, b: unknown, p: number): unknown => {\n if (typeof a === 'number' && typeof b === 'number') return lerp(a, b, p);\n if (Array.isArray(a) && Array.isArray(b)) return a.map((v, i) => lerp(v as number, (b[i] as number) ?? (v as number), p));\n if (typeof a === 'string' && typeof b === 'string') {\n const ca = parseColor(a), cb = parseColor(b);\n if (ca && cb) return rgbaString(ca.map((v, i) => lerp(v, cb[i], p)) as [number, number, number, number]);\n // Two SVG paths: morph between them.\n if (/^\\s*[Mm]/.test(a) && /^\\s*[Mm]/.test(b)) {\n if (p <= 0) return a;\n if (p >= 1) return b;\n return pathToString(morph(parsed(a), parsed(b), p));\n }\n }\n return p < 1 ? a : b;\n};\n\n// Smooth 1D value noise for wiggle(); deterministic per seed so renders are repeatable.\nconst hash = (n: number) => {\n const x = Math.sin(n * 127.1 + 311.7) * 43758.5453;\n return x - Math.floor(x);\n};\nconst noise = (x: number, seed: number) => {\n const i = Math.floor(x), f = x - i;\n const u = f * f * (3 - 2 * f);\n return lerp(hash(i + seed * 1000) * 2 - 1, hash(i + 1 + seed * 1000) * 2 - 1, u);\n};\nconst wiggle = (value: unknown, t: number, w: Wiggle): unknown => {\n const off = (dim: number) => noise(t * w.freq, (w.seed ?? 1) + dim * 17.3) * w.amp;\n if (typeof value === 'number') return value + off(0);\n if (Array.isArray(value)) return value.map((v, i) => (v as number) + off(i));\n return value;\n};\n\nexport const evalKeyframes = <T>(kfs: Keyframe<T>[], t: number): T => {\n if (kfs.length === 0) throw new Error('empty keyframes');\n if (t <= kfs[0].t) return kfs[0].v;\n const last = kfs[kfs.length - 1];\n if (t >= last.t) return last.v;\n let i = 0;\n while (i < kfs.length - 2 && t >= kfs[i + 1].t) i++;\n const a = kfs[i], b = kfs[i + 1];\n const seg = b.t - a.t;\n const p = applyEase(a.ease, seg <= 0 ? 1 : (t - a.t) / seg, seg);\n return interpolate(a.v, b.v, p) as T;\n};\n\n// Evaluate any property at time t (seconds, in the layer's composition time).\nexport function val<T>(p: Prop<T> | undefined, t: number, fallback: T): T {\n if (p === undefined || p === null) return fallback;\n if (!isAnimated(p)) return p as T;\n const sorted = [...p.keyframes].sort((a, b) => a.t - b.t);\n const v = evalKeyframes(sorted, t);\n return (p.wiggle ? wiggle(v, t, p.wiggle) : v) as T;\n}\n", "// Browser host for the shared Renderer: <canvas> for drawing, <video>/<img> for media.\nimport {val} from '../../core/anim.js';\nimport type {AudioLayer, Composition, Project, VideoLayer} from '../../core/model.js';\nimport type {CanvasLike, Drawable, Host} from '../../render/renderer.js';\nimport {config} from './config.js';\n\nexport const mediaUrl = (src: string) => (src.startsWith('data:') ? src : `/api/media?src=${encodeURIComponent(src)}&token=${config.token}`);\n\nconst waitFor = (el: HTMLMediaElement, event: string, ms = 2000) =>\n new Promise<void>((resolve) => {\n const done = () => { clearTimeout(timer); el.removeEventListener(event, done); resolve(); };\n const timer = setTimeout(done, ms);\n el.addEventListener(event, done, {once: true});\n });\n\ninterface VideoEntry { el: HTMLVideoElement; canvas: HTMLCanvasElement; used: number }\n\nexport class BrowserHost implements Host {\n defaultFont = 'Baloo 2';\n playing = false;\n private images = new Map<string, Promise<Drawable>>();\n private videos = new Map<string, VideoEntry>();\n private frameNo = 0;\n\n createCanvas(w: number, h: number): CanvasLike {\n const c = document.createElement('canvas');\n c.width = w;\n c.height = h;\n return c as unknown as CanvasLike;\n }\n\n async data(src: string) {\n const r = await fetch(mediaUrl(src));\n if (!r.ok) throw new Error(`Could not load ${src}`);\n return r.text();\n }\n\n image(src: string) {\n if (!this.images.has(src)) {\n this.images.set(src, new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`Could not load ${src}`));\n img.src = mediaUrl(src);\n }));\n }\n return this.images.get(src)!;\n }\n\n // Scrubbing seeks exactly; playback lets the element play and only corrects drift.\n async videoFrame(layer: VideoLayer, sourceTime: number, w: number, h: number, fps: number): Promise<Drawable> {\n const key = `${layer.id}|${layer.src}`;\n let v = this.videos.get(key);\n if (!v) {\n const el = document.createElement('video');\n el.muted = true;\n el.playsInline = true;\n el.preload = 'auto';\n el.crossOrigin = 'anonymous';\n el.src = mediaUrl(layer.src);\n v = {el, canvas: document.createElement('canvas'), used: 0};\n this.videos.set(key, v);\n await waitFor(el, 'loadeddata', 5000);\n }\n v.used = this.frameNo;\n const el = v.el;\n const t = Math.max(0, Math.min(sourceTime, (el.duration || Infinity) - 0.001));\n if (this.playing) {\n el.playbackRate = layer.speed ?? 1;\n if (Math.abs(el.currentTime - t) > 0.25) el.currentTime = t;\n if (el.paused) el.play().catch(() => {});\n } else {\n if (!el.paused) el.pause();\n if (Math.abs(el.currentTime - t) > 0.5 / fps) {\n el.currentTime = t;\n await waitFor(el, 'seeked');\n }\n }\n // Fit into the layer box the same way the FFmpeg path does (cover/contain/fill).\n const c = v.canvas;\n if (c.width !== w || c.height !== h) { c.width = w; c.height = h; }\n const ctx = c.getContext('2d')!;\n ctx.clearRect(0, 0, w, h);\n const vw = el.videoWidth || w, vh = el.videoHeight || h;\n const fit = layer.fit ?? 'cover';\n if (fit === 'fill') ctx.drawImage(el, 0, 0, w, h);\n else {\n const s = fit === 'cover' ? Math.max(w / vw, h / vh) : Math.min(w / vw, h / vh);\n ctx.drawImage(el, (w - vw * s) / 2, (h - vh * s) / 2, vw * s, vh * s);\n }\n return c;\n }\n\n // Call after each rendered frame: pauses videos whose layers are no longer on screen.\n endFrame() {\n for (const v of this.videos.values()) if (v.used !== this.frameNo && !v.el.paused) v.el.pause();\n this.frameNo++;\n }\n\n stopAll() { for (const v of this.videos.values()) v.el.pause(); }\n}\n\n// Preview audio for audio layers and un-muted video layers of the shown comp (not nested comps).\nexport class AudioPreview {\n private els = new Map<string, HTMLAudioElement>();\n\n sync(project: Project, comp: Composition, t: number, playing: boolean) {\n const live = new Set<string>();\n for (const l of comp.layers) {\n if (l.type !== 'audio' && !(l.type === 'video' && l.volume)) continue;\n const layer = l as AudioLayer | VideoLayer;\n const key = `${layer.id}|${layer.src}`;\n let el = this.els.get(key);\n if (!el) {\n el = new Audio(mediaUrl(layer.src));\n el.preload = 'auto';\n this.els.set(key, el);\n }\n live.add(key);\n const inP = layer.inPoint ?? 0, outP = layer.outPoint ?? comp.duration;\n const active = playing && t >= inP && t < outP;\n if (!active) { if (!el.paused) el.pause(); continue; }\n const speed = layer.type === 'video' ? layer.speed ?? 1 : 1;\n const src = (layer.trimIn ?? 0) + (t - inP) * speed;\n let vol = Math.max(0, Math.min(1, val(layer.volume, t, 1)));\n if (layer.type === 'audio') {\n if (layer.fadeIn && t - inP < layer.fadeIn) vol *= (t - inP) / layer.fadeIn;\n if (layer.fadeOut && outP - t < layer.fadeOut) vol *= (outP - t) / layer.fadeOut;\n }\n el.volume = vol;\n el.playbackRate = speed;\n if (Math.abs(el.currentTime - src) > 0.2) el.currentTime = src;\n if (el.paused) el.play().catch(() => {});\n }\n for (const [k, el] of this.els) if (!live.has(k) && !el.paused) el.pause();\n void project;\n }\n\n stop() { for (const el of this.els.values()) el.pause(); }\n}\n\n// Fonts: the bundled families plus any the project registers.\nexport const loadFonts = async (project: Project) => {\n const faces: FontFace[] = [\n new FontFace('Baloo 2', 'url(/fonts/Baloo2.ttf)', {weight: '400 800'}),\n new FontFace('Mukta', 'url(/fonts/Mukta-Bold.ttf)', {weight: '400 800'}),\n ];\n for (const [family, files] of Object.entries(project.fonts ?? {})) for (const f of files) faces.push(new FontFace(family, `url(${mediaUrl(f)})`));\n await Promise.all(faces.map(async (f) => { try { document.fonts.add(await f.load()); } catch { /* missing font: fall back */ } }));\n};\n", "const ENCODED_ENTITIES = /[\"&<]/;\n\n/** @param {string} str */\nexport function encodeEntities(str) {\n\t// Skip all work for strings with no entities needing encoding:\n\tif (!str.length || !ENCODED_ENTITIES.test(str)) return str;\n\n\tlet last = 0,\n\t\ti = 0,\n\t\tout = '',\n\t\tch = '';\n\n\t// Seek forward in str until the next entity char:\n\tfor (; i < str.length; i++) {\n\t\tswitch (str.charCodeAt(i)) {\n\t\t\tcase 34:\n\t\t\t\tch = '&quot;';\n\t\t\t\tbreak;\n\t\t\tcase 38:\n\t\t\t\tch = '&amp;';\n\t\t\t\tbreak;\n\t\t\tcase 60:\n\t\t\t\tch = '&lt;';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcontinue;\n\t\t}\n\t\t// Append skipped/buffered characters and the encoded entity:\n\t\tif (i != last) out += str.slice(last, i);\n\t\tout += ch;\n\t\t// Start the next seek/buffer after the entity's offset:\n\t\tlast = i + 1;\n\t}\n\tif (i != last) out += str.slice(last, i);\n\treturn out;\n}\n", "import { options, Fragment } from 'preact';\nimport { encodeEntities } from './utils';\n\nlet vnodeId = 0;\n\nconst isArray = Array.isArray;\n\n/**\n * @fileoverview\n * This file exports various methods that implement Babel's \"automatic\" JSX runtime API:\n * - jsx(type, props, key)\n * - jsxs(type, props, key)\n * - jsxDEV(type, props, key, __source, __self)\n *\n * The implementation of createVNode here is optimized for performance.\n * Benchmarks: https://esbench.com/bench/5f6b54a0b4632100a7dcd2b3\n */\n\n/**\n * JSX.Element factory used by Babel's {runtime:\"automatic\"} JSX transform\n * @param {import('../../src/internal').VNode['type']} type\n * @param {import('preact').VNode['props']} props\n * @param {import('preact').VNode['key']} [key]\n * @param {unknown} [isStaticChildren]\n * @param {unknown} [__source]\n * @param {unknown} [__self]\n */\nfunction createVNode(type, props, key, isStaticChildren, __source, __self) {\n\tif (!props) props = {};\n\t// We'll want to preserve `ref` in props to get rid of the need for\n\t// forwardRef components in the future, but that should happen via\n\t// a separate PR.\n\tlet normalizedProps = props,\n\t\tref,\n\t\ti;\n\n\tif ('ref' in normalizedProps && typeof type != 'function') {\n\t\tnormalizedProps = {};\n\t\tfor (i in props) {\n\t\t\tif (i == 'ref') {\n\t\t\t\tref = props[i];\n\t\t\t} else {\n\t\t\t\tnormalizedProps[i] = props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @type {import('../../src/internal').VNode & { __source?: any; __self?: any }} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops: normalizedProps,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t_component: null,\n\t\tconstructor: undefined,\n\t\t_original: --vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0\n\t};\n\n\tif (__source || __self) {\n\t\tvnode.__source = __source;\n\t\tvnode.__self = __self;\n\t}\n\n\tif (options.vnode) options.vnode(vnode);\n\treturn vnode;\n}\n\n/**\n * Create a template vnode. This function is not expected to be\n * used directly, but rather through a precompile JSX transform\n * @param {string[]} templates\n * @param {Array<string | null | import('preact').VNode>} exprs\n * @returns {import('preact').VNode}\n */\nfunction jsxTemplate(templates, ...exprs) {\n\tconst vnode = createVNode(Fragment, { tpl: templates, exprs });\n\t// Bypass render to string top level Fragment optimization\n\t// @ts-ignore\n\tvnode.key = vnode._vnode;\n\treturn vnode;\n}\n\nconst JS_TO_CSS = {};\nconst CSS_REGEX = /[A-Z]/g;\n\n/**\n * Unwrap potential signals.\n * @param {*} value\n * @returns {*}\n */\nfunction normalizeAttrValue(value) {\n\treturn value != null &&\n\t\ttypeof value == 'object' &&\n\t\ttypeof value.valueOf == 'function'\n\t\t? value.valueOf()\n\t\t: value;\n}\n\n/**\n * Serialize an HTML attribute to a string. This function is not\n * expected to be used directly, but rather through a precompile\n * JSX transform\n * @param {string} name The attribute name\n * @param {*} value The attribute value\n * @returns {string}\n */\nfunction jsxAttr(name, value) {\n\tif (options.attr) {\n\t\tconst result = options.attr(name, value);\n\t\tif (typeof result == 'string') return result;\n\t}\n\n\tvalue = normalizeAttrValue(value);\n\n\tif (name == 'ref' || name == 'key') return '';\n\tif (name == 'style' && typeof value == 'object') {\n\t\tlet str = '';\n\t\tfor (let prop in value) {\n\t\t\tlet val = value[prop];\n\t\t\tif (val != null && val !== '') {\n\t\t\t\tconst name =\n\t\t\t\t\tprop[0] == '-'\n\t\t\t\t\t\t? prop\n\t\t\t\t\t\t: JS_TO_CSS[prop] ||\n\t\t\t\t\t\t\t(JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$&').toLowerCase());\n\n\t\t\t\tstr = str + name + ':' + val + ';';\n\t\t\t}\n\t\t}\n\t\treturn name + '=\"' + encodeEntities(str) + '\"';\n\t}\n\n\tif (\n\t\tvalue == null ||\n\t\tvalue === false ||\n\t\ttypeof value == 'function' ||\n\t\ttypeof value == 'object'\n\t) {\n\t\treturn '';\n\t} else if (value === true) return name;\n\n\treturn name + '=\"' + encodeEntities('' + value) + '\"';\n}\n\n/**\n * Escape a dynamic child passed to `jsxTemplate`. This function\n * is not expected to be used directly, but rather through a\n * precompile JSX transform\n * @param {*} value\n * @returns {string | null | import('preact').VNode | Array<string | null | import('preact').VNode>}\n */\nfunction jsxEscape(value) {\n\tif (\n\t\tvalue == null ||\n\t\ttypeof value == 'boolean' ||\n\t\ttypeof value == 'function'\n\t) {\n\t\treturn null;\n\t}\n\n\tif (typeof value == 'object') {\n\t\t// Check for VNode\n\t\tif (value.constructor === undefined) return value;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tvalue[i] = jsxEscape(value[i]);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t}\n\n\treturn encodeEntities('' + value);\n}\n\nexport {\n\tcreateVNode as jsx,\n\tcreateVNode as jsxs,\n\tcreateVNode as jsxDEV,\n\tFragment,\n\t// precompiled JSX transform\n\tjsxTemplate,\n\tjsxAttr,\n\tjsxEscape\n};\n", "// Inspector inputs. Numbers are \"scrubby\" like After Effects: drag the value sideways to change it.\nimport {useRef, useState} from 'preact/hooks';\n\nconst fmt = (n: number) => (Number.isInteger(n) ? String(n) : n.toFixed(Math.abs(n) < 10 ? 2 : 1));\n\nexport const NumberField = ({value, onChange, onDragStart, onDragEnd, step = 1, min, max, title}: {\n value: number; onChange: (v: number, dragging: boolean) => void; onDragStart?: () => void; onDragEnd?: () => void; step?: number; min?: number; max?: number; title?: string;\n}) => {\n const [editing, setEditing] = useState<string | null>(null);\n const drag = useRef<{x: number; v: number; moved: boolean} | null>(null);\n const clamp = (v: number) => Math.min(max ?? Infinity, Math.max(min ?? -Infinity, v));\n if (editing !== null) {\n return (\n <input class=\"num editing\" value={editing} autoFocus title={title}\n onInput={(e) => setEditing((e.target as HTMLInputElement).value)}\n onBlur={() => { const n = Number(editing); if (Number.isFinite(n)) onChange(clamp(n), false); setEditing(null); }}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.target as HTMLInputElement).blur(); if (e.key === 'Escape') setEditing(null); e.stopPropagation(); }} />\n );\n }\n return (\n <span class=\"num\" title={title ?? 'Drag to scrub, click to type'}\n onPointerDown={(e) => {\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n drag.current = {x: e.clientX, v: value, moved: false};\n }}\n onPointerMove={(e) => {\n const d = drag.current;\n if (!d) return;\n const dx = e.clientX - d.x;\n if (!d.moved && Math.abs(dx) > 2) { d.moved = true; onDragStart?.(); }\n if (d.moved) onChange(clamp(+(d.v + dx * step * (e.shiftKey ? 10 : e.altKey ? 0.1 : 1)).toFixed(4)), true);\n }}\n onPointerUp={() => {\n const d = drag.current;\n drag.current = null;\n if (d?.moved) onDragEnd?.();\n else setEditing(fmt(value));\n }}>\n {fmt(value)}\n </span>\n );\n};\n\nexport const VecField = ({value, onChange, onDragStart, onDragEnd, step = 1, labels = ['x', 'y']}: {\n value: number[]; onChange: (v: number[], dragging: boolean) => void; onDragStart?: () => void; onDragEnd?: () => void; step?: number; labels?: string[];\n}) => (\n <span class=\"vec\">\n {value.map((n, i) => (\n <span class=\"vec-item\" key={i}>\n <label>{labels[i]}</label>\n <NumberField value={n} step={step} onDragStart={onDragStart} onDragEnd={onDragEnd} onChange={(v, d) => onChange(value.map((x, j) => (j === i ? v : x)), d)} />\n </span>\n ))}\n </span>\n);\n\nconst toHex = (c: string) => {\n if (/^#[0-9a-f]{6}$/i.test(c)) return c;\n if (/^#[0-9a-f]{3}$/i.test(c)) return `#${[...c.slice(1)].map((x) => x + x).join('')}`;\n const m = c.match(/rgba?\\(([^)]+)\\)/);\n if (m) return `#${m[1].split(',').slice(0, 3).map((x) => Math.round(Number(x)).toString(16).padStart(2, '0')).join('')}`;\n return '#ffffff';\n};\n\nexport const ColorField = ({value, onChange}: {value: string; onChange: (v: string) => void}) => (\n <span class=\"color\">\n <input type=\"color\" value={toHex(value)} onInput={(e) => onChange((e.target as HTMLInputElement).value)} />\n <input class=\"text\" value={value} onChange={(e) => onChange((e.target as HTMLInputElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n </span>\n);\n\nexport const TextField = ({value, onChange, multiline}: {value: string; onChange: (v: string) => void; multiline?: boolean}) =>\n multiline ? (\n <textarea class=\"text\" value={value} rows={3} onChange={(e) => onChange((e.target as HTMLTextAreaElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n ) : (\n <input class=\"text\" value={value} onChange={(e) => onChange((e.target as HTMLInputElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n );\n\nexport const Select = ({value, options, onChange}: {value: string; options: string[]; onChange: (v: string) => void}) => (\n <select value={value} onChange={(e) => onChange((e.target as HTMLSelectElement).value)}>\n {options.map((o) => <option key={o} value={o}>{o}</option>)}\n </select>\n);\n", "// Editor state: one project, history, autosave and live reload from disk.\nimport {useEffect, useState} from 'preact/hooks';\nimport {isAnimated, type Keyframe, type Layer, type Project} from '../../core/model.js';\nimport {config} from './config.js';\n\nexport interface KeySel { layer: string; path: string; t: number }\nexport interface State {\n project: Project | null;\n rev: number;\n comp: string;\n time: number;\n playing: boolean;\n loop: boolean;\n layer: string | null;\n key: KeySel | null;\n expanded: Record<string, boolean>;\n zoom: number; // timeline px per second\n status: 'loading' | 'saved' | 'saving' | 'error' | 'reloaded';\n message: string;\n warnings: string[];\n render: {active: boolean; done?: number; total?: number; out?: string; error?: string};\n}\n\nlet state: State = {\n project: null, rev: 0, comp: 'main', time: 0, playing: false, loop: true, layer: null, key: null, expanded: {},\n zoom: 120, status: 'loading', message: '', warnings: [], render: {active: false},\n};\nconst listeners = new Set<() => void>();\nexport const getState = () => state;\nexport const setState = (patch: Partial<State>) => {\n state = {...state, ...patch};\n listeners.forEach((l) => l());\n};\nexport const useStore = <T,>(select: (s: State) => T): T => {\n const [, force] = useState(0);\n useEffect(() => {\n const l = () => force((n) => n + 1);\n listeners.add(l);\n return () => { listeners.delete(l); };\n }, []);\n return select(state);\n};\n\nconst api = (path: string, init: RequestInit = {}) =>\n fetch(path, {...init, headers: {'Content-Type': 'application/json', 'X-DTLY-Token': config.token, ...(init.headers ?? {})}});\n\n// --- history -----------------------------------------------------------------------------\nconst undoStack: string[] = [];\nconst redoStack: string[] = [];\nconst MAX_HISTORY = 200;\n\nlet saveTimer: number | undefined;\nconst scheduleSave = () => {\n setState({status: 'saving'});\n clearTimeout(saveTimer);\n saveTimer = window.setTimeout(save, 250);\n};\nconst save = async () => {\n if (!state.project) return;\n try {\n const r = await api('/api/project', {method: 'PUT', body: JSON.stringify({project: state.project})});\n if (!r.ok) throw new Error(await r.text());\n const {rev, warnings} = (await r.json()) as {rev: number; warnings: string[]};\n setState({rev, warnings, status: 'saved', message: ''});\n } catch (e) {\n setState({status: 'error', message: `Save failed: ${(e as Error).message}`});\n }\n};\n\n// Apply an edit (usually a DT.ly op) to a copy of the project, as one undo step.\nexport const edit = (fn: (p: Project) => void) => {\n if (!state.project) return;\n const before = JSON.stringify(state.project);\n const next = JSON.parse(before) as Project;\n try {\n fn(next);\n } catch (e) {\n setState({message: (e as Error).message});\n return;\n }\n undoStack.push(before);\n if (undoStack.length > MAX_HISTORY) undoStack.shift();\n redoStack.length = 0;\n setState({project: next, message: ''});\n scheduleSave();\n};\n\n// Drags re-apply from the snapshot on every move, then commit as a single undo step.\nlet dragBase: string | null = null;\nexport const dragStart = () => { dragBase = state.project ? JSON.stringify(state.project) : null; };\nexport const dragUpdate = (fn: (p: Project) => void) => {\n if (!dragBase) return;\n const next = JSON.parse(dragBase) as Project;\n try { fn(next); } catch { return; }\n setState({project: next});\n};\nexport const dragEnd = () => {\n if (dragBase && JSON.stringify(state.project) !== dragBase) {\n undoStack.push(dragBase);\n redoStack.length = 0;\n scheduleSave();\n }\n dragBase = null;\n};\n\nexport const undo = () => {\n const prev = undoStack.pop();\n if (!prev || !state.project) return;\n redoStack.push(JSON.stringify(state.project));\n setState({project: JSON.parse(prev)});\n scheduleSave();\n};\nexport const redo = () => {\n const next = redoStack.pop();\n if (!next || !state.project) return;\n undoStack.push(JSON.stringify(state.project));\n setState({project: JSON.parse(next)});\n scheduleSave();\n};\n\n// --- loading & live reload ----------------------------------------------------------------\nexport const load = async (fromDisk = false) => {\n const r = await api('/api/project');\n const {rev, project} = (await r.json()) as {rev: number; project: Project};\n if (fromDisk && state.project) {\n undoStack.push(JSON.stringify(state.project)); // an external edit can be undone here too\n redoStack.length = 0;\n }\n const comp = project.comps.some((c) => c.id === state.comp) ? state.comp : project.root;\n const layer = state.layer && project.comps.some((c) => c.layers.some((l) => l.id === state.layer)) ? state.layer : null;\n setState({project, rev, comp, layer, key: layer ? state.key : null, status: fromDisk ? 'reloaded' : 'saved', message: fromDisk ? 'Reloaded: the file changed on disk' : ''});\n};\n\nexport const connectEvents = () => {\n const es = new EventSource(`/api/events?token=${config.token}`);\n es.addEventListener('project', (e) => {\n const {rev} = JSON.parse((e as MessageEvent).data) as {rev: number};\n if (rev > state.rev) load(true);\n });\n es.addEventListener('render', (e) => {\n const d = JSON.parse((e as MessageEvent).data) as {done?: number; total?: number; finished?: boolean; out?: string; error?: string; took?: number};\n if (d.error) setState({render: {active: false, error: d.error}});\n else if (d.finished) setState({render: {active: false, out: d.out}, message: `Rendered ${d.out} in ${d.took?.toFixed(1)}s`});\n else setState({render: {active: true, done: d.done, total: d.total}});\n });\n};\n\nexport const startRender = async () => {\n setState({render: {active: true, done: 0}});\n const r = await api('/api/render', {method: 'POST', body: JSON.stringify({comp: state.comp})});\n if (!r.ok) setState({render: {active: false, error: await r.text()}});\n};\n\n// --- helpers --------------------------------------------------------------------------------\nexport const currentComp = () => state.project?.comps.find((c) => c.id === state.comp) ?? state.project?.comps[0];\nexport const selectedLayer = (): Layer | undefined => currentComp()?.layers.find((l) => l.id === state.layer);\n\n// Every animated property on a layer, as dot paths (\"transform.position\", \"effects.0.radius\").\nexport const animatedPaths = (layer: Layer): {path: string; keyframes: Keyframe<unknown>[]}[] => {\n const out: {path: string; keyframes: Keyframe<unknown>[]}[] = [];\n const walk = (v: unknown, path: string) => {\n if (Array.isArray(v)) v.forEach((x, i) => typeof x === 'object' && x !== null && walk(x, `${path}.${i}`));\n else if (typeof v === 'object' && v !== null) {\n if (isAnimated(v as never)) out.push({path, keyframes: (v as {keyframes: Keyframe<unknown>[]}).keyframes});\n else for (const [k, x] of Object.entries(v)) if (k !== 'animators') walk(x, path ? `${path}.${k}` : k);\n }\n };\n walk(layer, '');\n return out;\n};\n\nexport const getPath = (obj: unknown, path: string): unknown =>\n path.split('.').reduce<unknown>((o, k) => (o == null ? undefined : (o as Record<string, unknown>)[k]), obj);\n\n// Snap to the frame grid, stored to the millisecond (avoids values like -1.7000000000000002).\nexport const snap = (t: number, fps: number) => Math.round((Math.round(t * fps) / fps) * 1000) / 1000;\n", "// Properties panel: composition settings, layer properties with stopwatches, keyframe easing, raw JSON.\nimport {useEffect, useState} from 'preact/hooks';\nimport {val} from '../../core/anim.js';\nimport {applyEase, EASE_NAMES} from '../../core/ease.js';\nimport {isAnimated, type Composition, type Ease, type Layer, type Project} from '../../core/model.js';\nimport {duplicateLayer, findLayer, moveLayer, removeLayer, removeKeyframe, setEase, setKeyframe, setProperty, updateComp, updateLayer} from '../../ops/ops.js';\nimport {PRESETS} from '../../presets/index.js';\nimport {ColorField, NumberField, Select, TextField, VecField} from './fields.js';\nimport {currentComp, dragEnd, dragStart, dragUpdate, edit, getPath, getState, setState, snap, useStore} from './store.js';\n\ntype Kind = 'num' | 'vec' | 'color';\n\n// One animatable property: value at the playhead, stopwatch, and keyframe navigation.\nconst Prop = ({layer, path, label, kind, fallback, step = 1, min, max}: {layer: Layer; path: string; label: string; kind: Kind; fallback: unknown; step?: number; min?: number; max?: number}) => {\n const time = useStore((s) => s.time);\n const comp = currentComp()!;\n const raw = getPath(layer, path);\n const animated = isAnimated(raw as never);\n const value = val(raw as never, time, fallback as never) as unknown;\n const t = snap(time, comp.fps);\n const apply = (p: Project, v: unknown) => (animated ? setKeyframe(p, layer.id, path, t, v) : setProperty(p, layer.id, path, v));\n const onChange = (v: unknown, dragging: boolean) => (dragging ? dragUpdate((p) => apply(p, v)) : edit((p) => apply(p, v)));\n const keys = animated ? (raw as {keyframes: {t: number}[]}).keyframes.map((k) => k.t) : [];\n const onKey = keys.some((k) => Math.abs(k - t) < 1e-3);\n const prev = [...keys].reverse().find((k) => k < t - 1e-3);\n const next = keys.find((k) => k > t + 1e-3);\n const toggleWatch = () => edit((p) => (animated ? setProperty(p, layer.id, path, value) : setKeyframe(p, layer.id, path, t, value)));\n const toggleKey = () => edit((p) => (onKey ? removeKeyframe(p, layer.id, path, t) : setKeyframe(p, layer.id, path, t, value)));\n return (\n <div class=\"prop\">\n <button class={`watch ${animated ? 'on' : ''}`} title={animated ? 'Stop animating (keep current value)' : 'Animate: add a keyframe at the playhead'} onClick={toggleWatch}>\u23F1</button>\n <label>{label}</label>\n <span class=\"prop-value\">\n {kind === 'num' && <NumberField value={Number(value ?? 0)} step={step} min={min} max={max} onChange={onChange} onDragStart={dragStart} onDragEnd={dragEnd} />}\n {kind === 'vec' && <VecField value={(value as number[]) ?? [0, 0]} step={step} onChange={onChange} onDragStart={dragStart} onDragEnd={dragEnd} />}\n {kind === 'color' && <ColorField value={String(value ?? '#ffffff')} onChange={(v) => onChange(v, false)} />}\n </span>\n {animated && (\n <span class=\"keynav\">\n <button disabled={prev === undefined} onClick={() => setState({time: prev!})}>\u25C0</button>\n <button class={onKey ? 'on' : ''} title={onKey ? 'Remove keyframe here' : 'Add keyframe here'} onClick={toggleKey}>\u25C6</button>\n <button disabled={next === undefined} onClick={() => setState({time: next!})}>\u25B6</button>\n </span>\n )}\n </div>\n );\n};\n\nconst Field = ({label, children}: {label: string; children: preact.ComponentChildren}) => (\n <div class=\"prop\"><span class=\"watch-space\" /><label>{label}</label><span class=\"prop-value\">{children}</span></div>\n);\n\nconst set = (layer: Layer, patch: Record<string, unknown>) => edit((p) => updateLayer(p, layer.id, patch));\nconst num = (layer: Layer, label: string, key: string, value: number | undefined, fallback: number, step = 1) => (\n <Field label={label}><NumberField value={value ?? fallback} step={step} onChange={(v, d) => (d ? dragUpdate((p) => updateLayer(p, layer.id, {[key]: v})) : set(layer, {[key]: v}))} onDragStart={dragStart} onDragEnd={dragEnd} /></Field>\n);\n\nconst Section = ({title, children, open = true}: {title: string; children: preact.ComponentChildren; open?: boolean}) => (\n <details class=\"section\" open={open}><summary>{title}</summary>{children}</details>\n);\n\nconst JsonEditor = ({value, onApply, rows = 8}: {value: unknown; onApply: (v: unknown) => void; rows?: number}) => {\n const text = JSON.stringify(value, null, 2);\n const [draft, setDraft] = useState(text);\n const [error, setError] = useState('');\n useEffect(() => { setDraft(text); setError(''); }, [text]);\n return (\n <div class=\"json\">\n <textarea rows={rows} value={draft} spellcheck={false} onInput={(e) => setDraft((e.target as HTMLTextAreaElement).value)} onKeyDown={(e) => e.stopPropagation()} />\n <div class=\"row\">\n {error && <span class=\"error\">{error}</span>}\n <button disabled={draft === text} onClick={() => { try { onApply(JSON.parse(draft)); setError(''); } catch (e) { setError((e as Error).message); } }}>Apply</button>\n </div>\n </div>\n );\n};\n\nconst KeyPanel = () => {\n const key = useStore((s) => s.key);\n const project = useStore((s) => s.project);\n if (!key || !project) return null;\n let k: {t: number; v: unknown; ease?: Ease} | undefined;\n try {\n const {layer} = findLayer(project, key.layer);\n k = (getPath(layer, key.path) as {keyframes: {t: number; v: unknown; ease?: Ease}[]})?.keyframes?.find((x) => Math.abs(x.t - key.t) < 1e-3);\n } catch { /* layer gone */ }\n if (!k) return null;\n const ease = k.ease ?? 'linear';\n const mode = typeof ease === 'string' ? ease : Array.isArray(ease) ? 'bezier' : 'spring';\n const setE = (e: Ease) => edit((p) => setEase(p, key.layer, key.path, key.t, e));\n return (\n <Section title={`Keyframe \u00B7 ${key.path} @ ${key.t}s`}>\n <Field label=\"Ease out\">\n <Select value={mode} options={[...EASE_NAMES, 'bezier', 'spring']} onChange={(m) => setE(m === 'bezier' ? [0.25, 0.1, 0.25, 1] : m === 'spring' ? {spring: {stiffness: 170, damping: 18}} : (m as Ease))} />\n </Field>\n {Array.isArray(ease) && (\n <Field label=\"Bezier\"><VecField value={ease} step={0.01} labels={['x1', 'y1', 'x2', 'y2']} onChange={(v, d) => (d ? dragUpdate((p) => setEase(p, key.layer, key.path, key.t, v as Ease)) : setE(v as Ease))} onDragStart={dragStart} onDragEnd={dragEnd} /></Field>\n )}\n {mode === 'spring' && typeof ease === 'object' && !Array.isArray(ease) && (\n <Field label=\"Spring\"><VecField value={[ease.spring.stiffness ?? 170, ease.spring.damping ?? 18]} labels={['stiff', 'damp']} onChange={(v) => setE({spring: {stiffness: v[0], damping: v[1]}})} /></Field>\n )}\n <EaseGraph ease={ease} />\n <Field label=\"Value\"><JsonEditor value={k.v} rows={2} onApply={(v) => edit((p) => setKeyframe(p, key.layer, key.path, key.t, v))} /></Field>\n <div class=\"row\"><button onClick={() => { edit((p) => removeKeyframe(p, key.layer, key.path, key.t)); setState({key: null}); }}>Delete keyframe</button></div>\n </Section>\n );\n};\n\n// Small speed-graph style preview of the ease curve.\nconst EaseGraph = ({ease}: {ease: Ease}) => {\n const pts: string[] = [];\n for (let i = 0; i <= 40; i++) {\n const x = i / 40;\n const y = applyEase(ease, x);\n pts.push(`${(x * 180 + 10).toFixed(1)},${(110 - y * 90).toFixed(1)}`);\n }\n return (\n <svg class=\"ease-graph\" viewBox=\"0 0 200 130\">\n <line x1=\"10\" y1=\"110\" x2=\"190\" y2=\"110\" /><line x1=\"10\" y1=\"20\" x2=\"190\" y2=\"20\" class=\"guide\" />\n <polyline points={pts.join(' ')} />\n </svg>\n );\n};\n\n// Matches Renderer.layerSize: boxed layers anchor at their centre, others at the origin.\nconst defaultAnchor = (layer: Layer, comp: Composition): number[] => {\n if (layer.type === 'solid' || layer.type === 'image' || layer.type === 'video') return [(layer.size?.[0] ?? comp.width) / 2, (layer.size?.[1] ?? comp.height) / 2];\n if (layer.type === 'precomp') {\n const c = getState().project?.comps.find((x) => x.id === layer.comp);\n return [(c?.width ?? comp.width) / 2, (c?.height ?? comp.height) / 2];\n }\n return [0, 0];\n};\n\nconst LayerPanel = ({layer, comp}: {layer: Layer; comp: Composition}) => {\n const others = comp.layers.filter((l) => l.id !== layer.id);\n const idx = comp.layers.indexOf(layer);\n const fonts = ['Baloo 2', 'Mukta', ...Object.keys(getState().project?.fonts ?? {})];\n return (\n <>\n <Section title={`${layer.type} \u00B7 ${layer.id}`}>\n <Field label=\"Name\"><TextField value={layer.name ?? ''} onChange={(v) => set(layer, {name: v || null})} /></Field>\n {num(layer, 'In', 'inPoint', layer.inPoint, 0, 1 / comp.fps)}\n {num(layer, 'Out', 'outPoint', layer.outPoint, comp.duration, 1 / comp.fps)}\n <Field label=\"Parent\"><Select value={layer.parent ?? '(none)'} options={['(none)', ...others.map((l) => l.id)]} onChange={(v) => set(layer, {parent: v === '(none)' ? null : v})} /></Field>\n <Field label=\"Blend\"><Select value={layer.blendMode ?? 'normal'} options={['normal', 'multiply', 'screen', 'overlay', 'add', 'darken', 'lighten', 'softLight', 'difference']} onChange={(v) => set(layer, {blendMode: v === 'normal' ? null : v})} /></Field>\n <Field label=\"Motion blur\"><input type=\"checkbox\" checked={!!layer.motionBlur} onChange={(e) => set(layer, {motionBlur: (e.target as HTMLInputElement).checked ? {samples: 8} : null})} /></Field>\n <div class=\"row\">\n <button disabled={idx <= 0} onClick={() => edit((p) => moveLayer(p, layer.id, idx - 1))}>Up</button>\n <button disabled={idx >= comp.layers.length - 1} onClick={() => edit((p) => moveLayer(p, layer.id, idx + 1))}>Down</button>\n <button onClick={() => edit((p) => { const c = duplicateLayer(p, layer.id); setState({layer: c.id}); })}>Duplicate</button>\n <button class=\"danger\" onClick={() => { edit((p) => removeLayer(p, layer.id)); setState({layer: null, key: null}); }}>Delete</button>\n </div>\n </Section>\n\n {layer.type !== 'audio' && (\n <Section title=\"Transform\">\n <Prop layer={layer} path=\"transform.position\" label=\"Position\" kind=\"vec\" fallback={[comp.width / 2, comp.height / 2]} />\n <Prop layer={layer} path=\"transform.scale\" label=\"Scale %\" kind=\"vec\" fallback={[100, 100]} />\n <Prop layer={layer} path=\"transform.rotation\" label=\"Rotation \u00B0\" kind=\"num\" fallback={0} />\n <Prop layer={layer} path=\"transform.opacity\" label=\"Opacity %\" kind=\"num\" fallback={100} min={0} max={100} />\n <Prop layer={layer} path=\"transform.anchor\" label=\"Anchor\" kind=\"vec\" fallback={defaultAnchor(layer, comp)} />\n <Prop layer={layer} path=\"transform.skew\" label=\"Skew \u00B0\" kind=\"num\" fallback={0} />\n </Section>\n )}\n\n {layer.type === 'text' && (\n <Section title=\"Text\">\n <Field label=\"Text\"><TextField multiline value={layer.text} onChange={(v) => set(layer, {text: v})} /></Field>\n <Prop layer={layer} path=\"size\" label=\"Size\" kind=\"num\" fallback={72} min={1} />\n <Prop layer={layer} path=\"color\" label=\"Color\" kind=\"color\" fallback=\"#ffffff\" />\n <Prop layer={layer} path=\"tracking\" label=\"Tracking\" kind=\"num\" fallback={0} />\n <Field label=\"Font\"><Select value={layer.font ?? 'Baloo 2'} options={fonts} onChange={(v) => set(layer, {font: v})} /></Field>\n <Field label=\"Weight\"><Select value={String(layer.weight ?? 700)} options={['400', '500', '600', '700', '800']} onChange={(v) => set(layer, {weight: Number(v)})} /></Field>\n <Field label=\"Align\"><Select value={layer.align ?? 'center'} options={['left', 'center', 'right']} onChange={(v) => set(layer, {align: v})} /></Field>\n {num(layer, 'Max width', 'maxWidth', layer.maxWidth, 0, 5)}\n {num(layer, 'Line height', 'lineHeight', layer.lineHeight, 1.25, 0.01)}\n <Field label=\"Animators\"><JsonEditor value={layer.animators ?? []} rows={6} onApply={(v) => set(layer, {animators: v})} /></Field>\n <div class=\"presets\">\n {Object.entries(PRESETS).filter(([, pr]) => pr.kind === 'text').map(([name]) => (\n <button key={name} title={PRESETS[name].description} onClick={() => edit((p) => PRESETS[name].apply(p, comp.id, {layer: layer.id}))}>{name.slice(5)}</button>\n ))}\n </div>\n </Section>\n )}\n\n {layer.type === 'shape' && (\n <Section title=\"Shape\">\n <Field label=\"Shape\"><Select value={layer.shape} options={['rect', 'ellipse', 'polygon', 'path', 'line']} onChange={(v) => set(layer, {shape: v})} /></Field>\n {(layer.shape === 'rect' || layer.shape === 'ellipse') && <Prop layer={layer} path=\"size\" label=\"Size\" kind=\"vec\" fallback={[200, 200]} />}\n {(layer.shape === 'rect' || layer.shape === 'polygon') && <Prop layer={layer} path=\"radius\" label=\"Radius\" kind=\"num\" fallback={layer.shape === 'rect' ? 0 : 100} />}\n {(typeof layer.fill === 'string' || isAnimated(layer.fill as never) || layer.fill === undefined) && <Prop layer={layer} path=\"fill\" label=\"Fill\" kind=\"color\" fallback=\"#ffffff\" />}\n <Prop layer={layer} path=\"stroke\" label=\"Stroke\" kind=\"color\" fallback=\"#ffffff\" />\n <Prop layer={layer} path=\"strokeWidth\" label=\"Stroke width\" kind=\"num\" fallback={4} min={0} />\n <Prop layer={layer} path=\"trim.start\" label=\"Trim start %\" kind=\"num\" fallback={0} min={0} max={100} />\n <Prop layer={layer} path=\"trim.end\" label=\"Trim end %\" kind=\"num\" fallback={100} min={0} max={100} />\n </Section>\n )}\n\n {layer.type === 'solid' && (\n <Section title=\"Solid\"><Prop layer={layer} path=\"color\" label=\"Color\" kind=\"color\" fallback=\"#000000\" /></Section>\n )}\n\n {(layer.type === 'image' || layer.type === 'video') && (\n <Section title={layer.type === 'video' ? 'Video' : 'Image'}>\n <Field label=\"Source\"><TextField value={layer.src} onChange={(v) => set(layer, {src: v})} /></Field>\n <Field label=\"Fit\"><Select value={layer.fit ?? 'cover'} options={['cover', 'contain', 'fill']} onChange={(v) => set(layer, {fit: v})} /></Field>\n {layer.type === 'video' && num(layer, 'Trim in (s)', 'trimIn', layer.trimIn, 0, 0.05)}\n {layer.type === 'video' && num(layer, 'Speed', 'speed', layer.speed, 1, 0.01)}\n {layer.type === 'video' && <Prop layer={layer} path=\"volume\" label=\"Volume\" kind=\"num\" fallback={0} step={0.01} min={0} max={1} />}\n </Section>\n )}\n\n {layer.type === 'lottie' && (\n <Section title=\"Lottie\">\n <Field label=\"Source\"><TextField value={layer.src} onChange={(v) => set(layer, {src: v})} /></Field>\n <Field label=\"Loop\"><input type=\"checkbox\" checked={layer.loop !== false} onChange={(e) => set(layer, {loop: (e.target as HTMLInputElement).checked ? null : false})} /></Field>\n {num(layer, 'Speed', 'speed', layer.speed, 1, 0.01)}\n {num(layer, 'Time offset (s)', 'timeOffset', layer.timeOffset, 0, 0.05)}\n <Field label=\"Box size\"><JsonEditor value={layer.size ?? null} rows={1} onApply={(v) => set(layer, {size: v})} /></Field>\n </Section>\n )}\n\n {layer.type === 'audio' && (\n <Section title=\"Audio\">\n <Field label=\"Source\"><TextField value={layer.src} onChange={(v) => set(layer, {src: v})} /></Field>\n {num(layer, 'Trim in (s)', 'trimIn', layer.trimIn, 0, 0.05)}\n <Prop layer={layer} path=\"volume\" label=\"Volume\" kind=\"num\" fallback={1} step={0.01} min={0} max={1} />\n {num(layer, 'Fade in (s)', 'fadeIn', layer.fadeIn, 0, 0.05)}\n {num(layer, 'Fade out (s)', 'fadeOut', layer.fadeOut, 0, 0.05)}\n </Section>\n )}\n\n {layer.type === 'precomp' && (\n <Section title=\"Precomp\">\n <Field label=\"Comp\"><Select value={layer.comp} options={getState().project!.comps.filter((c) => c.id !== comp.id).map((c) => c.id)} onChange={(v) => set(layer, {comp: v})} /></Field>\n {num(layer, 'Time offset', 'timeOffset', layer.timeOffset, 0, 0.05)}\n <div class=\"row\"><button onClick={() => setState({comp: layer.comp, layer: null, key: null, time: 0})}>Open comp</button></div>\n </Section>\n )}\n\n <Section title=\"Effects, masks & matte (JSON)\" open={false}>\n <Field label=\"Effects\"><JsonEditor value={layer.effects ?? []} rows={5} onApply={(v) => set(layer, {effects: v})} /></Field>\n <Field label=\"Masks\"><JsonEditor value={layer.masks ?? []} rows={4} onApply={(v) => set(layer, {masks: v})} /></Field>\n <Field label=\"Matte\"><JsonEditor value={layer.matte ?? null} rows={2} onApply={(v) => set(layer, {matte: v})} /></Field>\n </Section>\n <Section title=\"Layer JSON\" open={false}>\n <JsonEditor value={layer} rows={16} onApply={(v) => edit((p) => {\n const next = v as Layer;\n if (next.id !== layer.id) throw new Error('The id cannot change here');\n const c = p.comps.find((x) => x.id === comp.id)!;\n c.layers[c.layers.findIndex((l) => l.id === layer.id)] = next;\n })} />\n </Section>\n </>\n );\n};\n\nconst CompPanel = ({comp}: {comp: Composition}) => {\n const project = getState().project!;\n const up = (patch: Partial<Composition>) => edit((p) => updateComp(p, comp.id, patch));\n return (\n <Section title={`Composition \u00B7 ${comp.id}`}>\n <Field label=\"Name\"><TextField value={comp.name ?? ''} onChange={(v) => up({name: v || undefined})} /></Field>\n <Field label=\"Size\"><VecField value={[comp.width, comp.height]} labels={['w', 'h']} onChange={(v) => up({width: Math.round(v[0]), height: Math.round(v[1])})} /></Field>\n <Field label=\"FPS\"><NumberField value={comp.fps} onChange={(v) => up({fps: Math.max(1, Math.round(v))})} /></Field>\n <Field label=\"Duration (s)\"><NumberField value={comp.duration} step={0.1} min={0.1} onChange={(v) => up({duration: v})} /></Field>\n <Field label=\"Background\"><ColorField value={comp.background ?? '#000000'} onChange={(v) => up({background: v})} /></Field>\n <Field label=\"Markers\"><JsonEditor value={comp.markers ?? []} rows={3} onApply={(v) => up({markers: v as Composition['markers']})} /></Field>\n {project.root !== comp.id && <div class=\"row\"><button onClick={() => edit((p) => { p.root = comp.id; })}>Render this comp</button></div>}\n </Section>\n );\n};\n\nexport const Inspector = () => {\n const project = useStore((s) => s.project);\n const compId = useStore((s) => s.comp);\n const layerId = useStore((s) => s.layer);\n const comp = project?.comps.find((c) => c.id === compId);\n if (!comp) return <aside class=\"inspector\" />;\n const layer = comp.layers.find((l) => l.id === layerId);\n return (\n <aside class=\"inspector\">\n <KeyPanel />\n {layer ? <LayerPanel key={layer.id} layer={layer} comp={comp} /> : <CompPanel comp={comp} />}\n </aside>\n );\n};\n", "// Timeline: ruler, layer bars (move / trim), keyframe rows (drag to retime, click to edit).\nimport {useRef} from 'preact/hooks';\nimport {val} from '../../core/anim.js';\nimport type {Keyframe, Layer} from '../../core/model.js';\nimport {findLayer, moveKeyframe, setKeyframe, shiftLayer, updateLayer} from '../../ops/ops.js';\nimport {animatedPaths, dragEnd, dragStart, dragUpdate, edit, getPath, getState, setState, snap, useStore} from './store.js';\n\nconst LABEL_W = 230;\nconst TYPE_COLOR: Record<string, string> = {text: '#e0a84a', shape: '#5fb3a0', solid: '#9b7fd1', image: '#5b9bd5', video: '#d36c6c', audio: '#7fb35f', precomp: '#c78bc0', lottie: '#4fc1c9', adjustment: '#b0b0b0', null: '#888'};\nconst PROP_LABEL = (path: string) => path.replace(/^transform\\./, '').replace(/\\.(\\d+)\\./g, '[$1].');\n\nconst ticks = (duration: number, zoom: number) => {\n const steps = [0.1, 0.25, 0.5, 1, 2, 5, 10, 30, 60];\n const step = steps.find((s) => s * zoom >= 60) ?? 60;\n const out: number[] = [];\n for (let t = 0; t <= duration + 1e-6; t += step) out.push(+t.toFixed(3));\n return {out, step};\n};\n\n// Follows a drag on window, so re-renders of the dragged element can't interrupt it.\nconst trackPointer = (move: (e: PointerEvent) => void, done: () => void) => {\n const up = () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); done(); };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n};\n\nconst keyShape = (k: Keyframe<unknown>) => (k.ease === 'hold' ? 'hold' : !k.ease || k.ease === 'linear' ? 'linear' : 'eased');\n\nexport const Timeline = () => {\n const project = useStore((s) => s.project);\n const compId = useStore((s) => s.comp);\n const time = useStore((s) => s.time);\n const zoom = useStore((s) => s.zoom);\n const sel = useStore((s) => s.layer);\n const key = useStore((s) => s.key);\n const expanded = useStore((s) => s.expanded);\n const tracks = useRef<HTMLDivElement>(null);\n const comp = project?.comps.find((c) => c.id === compId);\n if (!comp) return <div class=\"timeline\" />;\n\n const width = comp.duration * zoom + 120;\n const fps = comp.fps;\n const xToTime = (clientX: number) => {\n const r = tracks.current!.getBoundingClientRect();\n return Math.max(0, Math.min(comp.duration, (clientX - r.left - LABEL_W + tracks.current!.scrollLeft) / zoom));\n };\n // Snap to frames, and to the playhead when close.\n const snapT = (t: number) => {\n const ct = getState().time;\n return Math.abs(t - ct) * zoom < 6 ? ct : snap(t, fps);\n };\n\n const scrub = (e: PointerEvent) => {\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n setState({time: snap(xToTime(e.clientX), fps), playing: false});\n };\n const scrubMove = (e: PointerEvent) => {\n if ((e.buttons & 1) === 0) return;\n setState({time: snap(xToTime(e.clientX), fps)});\n };\n\n const barDrag = (e: PointerEvent, layer: Layer, mode: 'move' | 'in' | 'out') => {\n e.stopPropagation();\n setState({layer: layer.id, key: null});\n const x0 = e.clientX;\n const inP = layer.inPoint ?? 0, outP = layer.outPoint ?? comp.duration;\n let started = false;\n const move = (ev: PointerEvent) => {\n const dt = (ev.clientX - x0) / zoom;\n if (!started) { if (Math.abs(ev.clientX - x0) < 3) return; started = true; dragStart(); }\n dragUpdate((p) => {\n if (mode === 'move') {\n const target = snapT(inP + dt);\n shiftLayer(p, layer.id, target - inP);\n } else if (mode === 'in') updateLayer(p, layer.id, {inPoint: Math.min(outP - 1 / fps, Math.max(0, snapT(inP + dt)))});\n else updateLayer(p, layer.id, {outPoint: Math.max(inP + 1 / fps, snapT(outP + dt))});\n });\n };\n trackPointer(move, () => { if (started) dragEnd(); });\n };\n\n const keyDrag = (e: PointerEvent, layer: Layer, path: string, k: Keyframe<unknown>) => {\n e.stopPropagation();\n setState({layer: layer.id, key: {layer: layer.id, path, t: k.t}, time: e.altKey ? getState().time : k.t, playing: false});\n const x0 = e.clientX, t0 = k.t;\n let started = false;\n const move = (ev: PointerEvent) => {\n if (!started) { if (Math.abs(ev.clientX - x0) < 3) return; started = true; dragStart(); }\n const to = Math.max(0, snapT(t0 + (ev.clientX - x0) / zoom));\n dragUpdate((p) => moveKeyframe(p, layer.id, path, t0, to));\n setState({key: {layer: layer.id, path, t: to}, time: to});\n };\n trackPointer(move, () => { if (started) dragEnd(); });\n };\n\n // Double-click a property row: add a keyframe there with the value the property has at that time.\n const addKeyAt = (e: MouseEvent, layer: Layer, path: string) => {\n const t = snap(xToTime(e.clientX), fps);\n const cur = getPath(layer, path);\n const v = val(cur as never, t, undefined as never);\n edit((p) => setKeyframe(p, layer.id, path, t, v));\n setState({key: {layer: layer.id, path, t}, time: t});\n };\n\n const {out: tickList} = ticks(comp.duration, zoom);\n const onWheel = (e: WheelEvent) => {\n if (!(e.ctrlKey || e.metaKey)) return;\n e.preventDefault();\n setState({zoom: Math.min(2000, Math.max(10, zoom * (e.deltaY < 0 ? 1.15 : 1 / 1.15)))});\n };\n\n return (\n <div class=\"timeline\">\n <div class=\"tl-scroll\" ref={tracks} onWheel={onWheel}>\n <div class=\"tl-inner\" style={{width: `${LABEL_W + width}px`}}>\n <div class=\"tl-ruler-row\">\n <div class=\"tl-label tl-corner\">{comp.name ?? comp.id} \u00B7 {comp.fps} fps</div>\n <div class=\"tl-ruler\" style={{width: `${width}px`}} onPointerDown={scrub} onPointerMove={scrubMove}>\n {tickList.map((t) => <div key={t} class=\"tick\" style={{left: `${t * zoom}px`}}><span>{t}s</span></div>)}\n {(comp.markers ?? []).map((m) => <div key={m.t} class=\"marker\" style={{left: `${m.t * zoom}px`}} title={m.label} />)}\n <div class=\"tl-end\" style={{left: `${comp.duration * zoom}px`}} />\n </div>\n </div>\n {comp.layers.map((layer, idx) => {\n const inP = layer.inPoint ?? 0, outP = layer.outPoint ?? comp.duration;\n const props = animatedPaths(layer);\n const open = expanded[layer.id];\n return (\n <div key={layer.id} class={`tl-group ${sel === layer.id ? 'selected' : ''}`}>\n <div class=\"tl-row layer-row\">\n <div class=\"tl-label\" onPointerDown={() => setState({layer: layer.id, key: null})}>\n <button class={`twirl ${open ? 'open' : ''} ${props.length ? '' : 'empty'}`} onClick={(e) => { e.stopPropagation(); setState({expanded: {...expanded, [layer.id]: !open}}); }}>\u25B8</button>\n <button class={`eye ${layer.hidden ? 'off' : ''}`} title=\"Show/hide\" onClick={(e) => { e.stopPropagation(); edit((p) => updateLayer(p, layer.id, {hidden: layer.hidden ? null : true})); }}>\u25CF</button>\n <span class=\"idx\">{idx + 1}</span>\n <span class=\"chip\" style={{background: TYPE_COLOR[layer.type]}} />\n <span class=\"name\" title={layer.id}>{layer.name ?? layer.id}</span>\n </div>\n <div class=\"tl-track\" style={{width: `${width}px`}} onPointerDown={scrub} onPointerMove={scrubMove}>\n <div class={`bar ${layer.hidden ? 'hidden' : ''}`} style={{left: `${inP * zoom}px`, width: `${Math.max(2, (outP - inP) * zoom)}px`, background: TYPE_COLOR[layer.type]}}\n onPointerDown={(e) => barDrag(e, layer, 'move')}>\n <span class=\"handle in\" onPointerDown={(e) => barDrag(e, layer, 'in')} />\n <span class=\"bar-name\">{layer.type === 'text' ? layer.text.split('\\n')[0] : layer.name ?? layer.id}</span>\n <span class=\"handle out\" onPointerDown={(e) => barDrag(e, layer, 'out')} />\n </div>\n {!open && props.flatMap((pr) => pr.keyframes.map((k) => <span key={`${pr.path}${k.t}`} class=\"mini-key\" style={{left: `${k.t * zoom}px`}} />))}\n </div>\n </div>\n {open && props.map((pr) => (\n <div key={pr.path} class=\"tl-row prop-row\">\n <div class=\"tl-label prop-label\" title={pr.path}>{PROP_LABEL(pr.path)}</div>\n <div class=\"tl-track\" style={{width: `${width}px`}} onPointerDown={scrub} onPointerMove={scrubMove} onDblClick={(e) => addKeyAt(e, layer, pr.path)}>\n {pr.keyframes.map((k, i) => {\n const next = pr.keyframes[i + 1];\n return next ? <span key={`seg${k.t}`} class={`seg ${keyShape(k)}`} style={{left: `${k.t * zoom}px`, width: `${(next.t - k.t) * zoom}px`}} /> : null;\n })}\n {pr.keyframes.map((k, ki) => {\n const active = key && key.layer === layer.id && key.path === pr.path && Math.abs(key.t - k.t) < 1e-3;\n return <span key={ki} class={`key ${keyShape(k)} ${active ? 'active' : ''}`} style={{left: `${k.t * zoom}px`}} title={`${k.t}s = ${JSON.stringify(k.v)}${k.ease ? ` \u00B7 ${typeof k.ease === 'string' ? k.ease : JSON.stringify(k.ease)}` : ''}`}\n onPointerDown={(e) => keyDrag(e, layer, pr.path, k)} />;\n })}\n </div>\n </div>\n ))}\n </div>\n );\n })}\n <div class=\"playhead\" style={{left: `${LABEL_W + time * zoom}px`}} />\n </div>\n </div>\n </div>\n );\n};\n\n// Helpers used by keyboard shortcuts.\nexport const keyTimes = (layerId: string) => {\n const s = getState();\n if (!s.project) return [];\n const {layer} = findLayer(s.project, layerId);\n return [...new Set(animatedPaths(layer).flatMap((p) => p.keyframes.map((k) => k.t)))].sort((a, b) => a - b);\n};\n", "import {applyEase} from './ease.js';\nimport {parseColor, rgbaString} from './color.js';\nimport type {TextAnimator, TextLayer} from './model.js';\nimport {val} from './anim.js';\n\ntype Ctx = CanvasRenderingContext2D;\n\nexport interface Unit {\n text: string;\n x: number; // left edge, relative to block origin\n y: number; // baseline\n w: number;\n line: number;\n word: number;\n grapheme: number; // index of first grapheme\n}\nexport interface TextLayout {\n lines: {text: string; x: number; y: number; w: number}[];\n graphemes: Unit[];\n words: Unit[];\n width: number;\n height: number;\n top: number; // block top relative to origin\n size: number;\n}\n\nconst segmenter = new Intl.Segmenter(undefined, {granularity: 'grapheme'});\nexport const graphemes = (s: string) => [...segmenter.segment(s)].map((g) => g.segment);\n\nexport const fontString = (layer: TextLayer, size: number, fallbackFamily: string) =>\n `${layer.weight ?? 700} ${size}px \"${layer.font ?? fallbackFamily}\"`;\n\nconst layoutCache = new Map<string, TextLayout>();\n\n// Lays text out once, measuring each grapheme at its position inside the shaped line,\n// so per-letter animation of Devanagari keeps conjuncts and matras in place.\nexport const layoutText = (ctx: Ctx, layer: TextLayer, size: number, tracking: number, font: string): TextLayout => {\n const key = [layer.text, font, tracking, layer.maxWidth, layer.align, layer.lineHeight].join('|');\n const hit = layoutCache.get(key);\n if (hit) return hit;\n ctx.font = font;\n // skia (and some browsers) drop trailing whitespace from measureText, so measure with a sentinel.\n const sentinel = ctx.measureText('|').width;\n const advance = (s: string) => (/\\s$/.test(s) ? ctx.measureText(`${s}|`).width - sentinel : ctx.measureText(s).width);\n const measure = (s: string) => advance(s) + tracking * Math.max(0, graphemes(s).length - 1);\n const lineHeight = (layer.lineHeight ?? 1.25) * size;\n\n const rawLines: string[] = [];\n for (const para of layer.text.split('\\n')) {\n if (!layer.maxWidth) {\n rawLines.push(para);\n continue;\n }\n let cur = '';\n for (const word of para.split(' ')) {\n const next = cur ? `${cur} ${word}` : word;\n if (cur && measure(next) > layer.maxWidth) {\n rawLines.push(cur);\n cur = word;\n } else cur = next;\n }\n rawLines.push(cur);\n }\n\n const align = layer.align ?? 'center';\n const top = -(rawLines.length * lineHeight) / 2;\n const out: TextLayout = {lines: [], graphemes: [], words: [], width: 0, height: rawLines.length * lineHeight, top, size};\n let gi = 0, wi = 0;\n rawLines.forEach((line, li) => {\n const w = measure(line);\n out.width = Math.max(out.width, w);\n const x0 = align === 'left' ? 0 : align === 'right' ? -w : -w / 2;\n // Baseline sits ~78% down the line box, which centres Latin and Devanagari well.\n const y = top + li * lineHeight + lineHeight * 0.5 + size * 0.32;\n out.lines.push({text: line, x: x0, y, w});\n const gs = graphemes(line);\n let prefix = '';\n let wordStart: number | null = null, wordText = '';\n const flushWord = (endX: number) => {\n if (wordStart !== null) out.words.push({text: wordText, x: wordStart, y, w: endX - wordStart, line: li, word: wi++, grapheme: gi});\n wordStart = null;\n wordText = '';\n };\n gs.forEach((g, i) => {\n const x = x0 + (prefix ? advance(prefix) : 0) + tracking * i;\n const gw = ctx.measureText(g).width;\n if (g === ' ') flushWord(x);\n else {\n if (wordStart === null) wordStart = x;\n wordText += g;\n out.graphemes.push({text: g, x, y, w: gw, line: li, word: wi, grapheme: gi++});\n }\n prefix += g;\n });\n flushWord(x0 + w);\n });\n if (layoutCache.size > 500) layoutCache.clear();\n layoutCache.set(key, out);\n return out;\n};\n\nconst rank = (i: number, n: number, order: TextAnimator['order'], seed = 1) => {\n switch (order) {\n case 'reverse': return n - 1 - i;\n case 'center': return Math.abs(i - (n - 1) / 2);\n case 'edges': return (n - 1) / 2 - Math.abs(i - (n - 1) / 2);\n case 'random': {\n const ids = [...Array(n).keys()].sort((a, b) => Math.sin(a * 91.7 + seed) - Math.sin(b * 91.7 + seed));\n return ids.indexOf(i);\n }\n default: return i;\n }\n};\n\nexport interface UnitState { opacity: number; x: number; y: number; scale: number; rotation: number; blur: number; tracking: number; color?: string }\n\n// Combined animator state for one unit at local layer time `lt` (seconds since inPoint).\nexport const unitState = (animators: TextAnimator[], unitIndex: Record<TextAnimator['unit'], number>, counts: Record<TextAnimator['unit'], number>, lt: number, layerDur: number, baseColor: string): UnitState => {\n const s: UnitState = {opacity: 1, x: 0, y: 0, scale: 1, rotation: 0, blur: 0, tracking: 0};\n for (const a of animators) {\n const n = counts[a.unit], i = unitIndex[a.unit];\n const stagger = a.stagger ?? 0.05, dur = a.duration ?? 0.5, delay = a.delay ?? 0;\n const r = rank(i, n, a.order, a.seed);\n const maxRank = a.order === 'center' || a.order === 'edges' ? (n - 1) / 2 : n - 1;\n let p: number;\n if (a.mode === 'out') {\n const start = layerDur - delay - dur - (maxRank - r) * stagger;\n p = 1 - applyEase(a.ease ?? 'easeIn', Math.min(1, Math.max(0, (lt - start) / dur)), dur);\n } else {\n const start = delay + r * stagger;\n p = applyEase(a.ease ?? 'cubicOut', Math.min(1, Math.max(0, (lt - start) / dur)), dur);\n }\n const q = 1 - p; // amount of the \"from\" offset still applied\n const f = a.from;\n if (f.opacity !== undefined) s.opacity *= (f.opacity + (100 - f.opacity) * p) / 100;\n if (f.x) s.x += f.x * q;\n if (f.y) s.y += f.y * q;\n if (f.scale !== undefined) s.scale *= (f.scale + (100 - f.scale) * p) / 100;\n if (f.rotation) s.rotation += f.rotation * q;\n if (f.blur) s.blur += f.blur * q;\n if (f.tracking) s.tracking += f.tracking * q;\n if (f.color) {\n const c0 = parseColor(f.color), c1 = parseColor(baseColor);\n if (c0 && c1) s.color = rgbaString(c0.map((v, k) => v + (c1[k] - v) * p) as [number, number, number, number]);\n }\n }\n return s;\n};\n\nconst roundRect = (ctx: Ctx, x: number, y: number, w: number, h: number, r: number) => {\n ctx.beginPath();\n ctx.roundRect(x, y, w, h, r);\n};\n\nconst formatters = new Map<string, Intl.NumberFormat>();\n// Number shown by a counter, e.g. 1234567 \u2192 \"12,34,567\" (en-IN) or \"1,234,567\" (en-US).\nexport const formatValue = (v: number, f: TextLayer['format'] = {}) => {\n const decimals = f.decimals ?? 0;\n const key = `${f.locale ?? 'en-IN'}|${decimals}|${f.grouping !== false}`;\n let fmt = formatters.get(key);\n if (!fmt) formatters.set(key, (fmt = new Intl.NumberFormat(f.locale ?? 'en-IN', {minimumFractionDigits: decimals, maximumFractionDigits: decimals, useGrouping: f.grouping !== false})));\n return `${f.prefix ?? ''}${fmt.format(v)}${f.suffix ?? ''}`;\n};\n\n// The text a layer shows at time t (counters substitute their animated value).\nexport const displayText = (layer: TextLayer, t: number) => {\n if (layer.value === undefined) return layer.text;\n const v = formatValue(val(layer.value, t, 0), layer.format);\n return layer.text.includes('{value}') ? layer.text.replace(/\\{value\\}/g, v) : v;\n};\n\n// Draws a text layer in its own layer space (origin = alignment point, vertically centred).\nexport const drawText = (ctx: Ctx, source: TextLayer, t: number, inPoint: number, outPoint: number, fallbackFamily: string) => {\n const layer = source.value === undefined ? source : {...source, text: displayText(source, t)};\n const size = val(layer.size, t, 72);\n const tracking = val(layer.tracking, t, 0);\n const color = val(layer.color, t, '#ffffff');\n const font = fontString(layer, size, fallbackFamily);\n const L = layoutText(ctx, layer, size, tracking, font);\n ctx.font = font;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'alphabetic';\n\n if (layer.box) {\n const [px, py] = layer.box.padding ?? [24, 12];\n const reveal = val(layer.box.reveal, t, 100) / 100;\n const x0 = Math.min(...L.lines.map((l) => l.x)) - px;\n const bw = L.width + px * 2, bh = L.height + py * 2;\n if (reveal > 0) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x0, L.top - py, bw * reveal, bh);\n ctx.clip();\n ctx.fillStyle = val(layer.box.color, t, '#000');\n roundRect(ctx, x0, L.top - py, bw, bh, layer.box.radius ?? 12);\n ctx.fill();\n ctx.restore();\n }\n }\n\n if (layer.shadow) {\n ctx.shadowColor = layer.shadow.color;\n ctx.shadowBlur = layer.shadow.blur;\n ctx.shadowOffsetX = layer.shadow.x ?? 0;\n ctx.shadowOffsetY = layer.shadow.y ?? 0;\n }\n const paint = (s: string, x: number, y: number, fill: string) => {\n if (layer.stroke) {\n ctx.lineJoin = 'round';\n ctx.lineWidth = layer.stroke.width;\n ctx.strokeStyle = layer.stroke.color;\n ctx.strokeText(s, x, y);\n }\n ctx.fillStyle = fill;\n ctx.fillText(s, x, y);\n };\n\n const animators = layer.animators ?? [];\n const kara = layer.karaoke;\n if (animators.length === 0 && !kara) {\n for (const l of L.lines) paint(l.text, l.x, l.y, color);\n return;\n }\n // Highlight state per word (captions): current word (or every word spoken so far) changes colour and pops.\n const wordState = (w: number) => {\n if (!kara) return null;\n const span = kara.words[w];\n if (!span) return null;\n const on = kara.mode === 'spoken' ? t >= span[0] : t >= span[0] && t < span[1];\n if (!on) return null;\n const k = Math.min(1, (t - span[0]) / 0.12);\n return {color: kara.color ?? '#FFC93C', scale: 1 + ((kara.scale ?? 100) / 100 - 1) * (kara.mode === 'spoken' ? 0 : 1 - (1 - k) * (1 - k)), box: kara.box};\n };\n\n // Draw at the finest unit any animator needs; coarser units keep whole-word shaping.\n const finest = animators.some((a) => a.unit === 'grapheme') ? 'grapheme' : animators.some((a) => a.unit === 'word') || kara ? 'word' : 'line';\n const units: Unit[] = finest === 'grapheme' ? L.graphemes : finest === 'word' ? L.words : L.lines.map((l, i) => ({...l, line: i, word: 0, grapheme: 0}));\n const counts = {grapheme: L.graphemes.length, word: L.words.length, line: L.lines.length};\n const lt = t - inPoint, dur = outPoint - inPoint;\n const clip = animators.some((a) => a.clip);\n const lineHeight = L.height / L.lines.length;\n const lineCounts = new Map<number, number>();\n for (const u of units) lineCounts.set(u.line, (lineCounts.get(u.line) ?? 0) + 1);\n const lineIdx = new Map<number, number>();\n\n for (const u of units) {\n const idxInLine = lineIdx.get(u.line) ?? 0;\n lineIdx.set(u.line, idxInLine + 1);\n const st = unitState(animators, {grapheme: u.grapheme, word: u.word, line: u.line}, counts, lt, dur, color);\n if (st.opacity <= 0.001) continue;\n const hl = finest === 'word' ? wordState(u.word) : null;\n if (hl) { st.color = hl.color; st.scale *= hl.scale; }\n ctx.save();\n if (clip) {\n ctx.beginPath();\n ctx.rect(-1e5, L.top + u.line * lineHeight, 2e5, lineHeight);\n ctx.clip();\n }\n const spread = st.tracking * (idxInLine - ((lineCounts.get(u.line) ?? 1) - 1) / 2);\n const cx = u.x + u.w / 2 + st.x + spread;\n const cy = u.y - size * 0.35 + st.y;\n ctx.translate(cx, cy);\n if (st.rotation) ctx.rotate((st.rotation * Math.PI) / 180);\n if (st.scale !== 1) ctx.scale(st.scale, st.scale);\n ctx.globalAlpha *= st.opacity;\n if (st.blur > 0.1) ctx.filter = `blur(${st.blur.toFixed(2)}px)`;\n if (hl?.box) {\n ctx.save();\n ctx.shadowColor = 'transparent';\n ctx.fillStyle = hl.box;\n ctx.beginPath();\n ctx.roundRect(-u.w / 2 - size * 0.12, -size * 0.62, u.w + size * 0.24, size * 1.2, size * 0.18);\n ctx.fill();\n ctx.restore();\n }\n paint(u.text, -u.w / 2, size * 0.35, st.color ?? color);\n ctx.restore();\n }\n};\n", "// Shape layers: builds the vector path, then fills/strokes it with trims, dashes, gradients and repeaters.\nimport {val} from '../core/anim.js';\nimport type {Gradient, ShapeLayer, Vec2} from '../core/model.js';\nimport {flatten, parsePath, tracePath, trimPolylines, type Path} from '../core/path.js';\n\ntype Ctx = CanvasRenderingContext2D;\nconst K = 0.5522847498; // circle \u2192 cubic handle length\n\nconst parsedCache = new Map<string, Path>();\nconst parse = (d: string) => {\n let p = parsedCache.get(d);\n if (!p) { p = parsePath(d); if (parsedCache.size > 300) parsedCache.clear(); parsedCache.set(d, p); }\n return p;\n};\n\n// The shape's outline as a path in layer space (centred on the origin for rect/ellipse/polygon/star).\nexport const shapePath = (s: ShapeLayer, t: number): Path => {\n switch (s.shape) {\n case 'rect': {\n const [w, h] = val(s.size, t, [200, 200] as Vec2);\n const r = Math.min(val(s.radius, t, 0), Math.abs(w) / 2, Math.abs(h) / 2);\n const x = -w / 2, y = -h / 2, k = r * (1 - K);\n if (r <= 0) return [{kind: 'M', p: [x, y]}, {kind: 'L', p: [x + w, y]}, {kind: 'L', p: [x + w, y + h]}, {kind: 'L', p: [x, y + h]}, {kind: 'Z'}];\n return [\n {kind: 'M', p: [x + r, y]}, {kind: 'L', p: [x + w - r, y]}, {kind: 'C', c1: [x + w - k, y], c2: [x + w, y + k], p: [x + w, y + r]},\n {kind: 'L', p: [x + w, y + h - r]}, {kind: 'C', c1: [x + w, y + h - k], c2: [x + w - k, y + h], p: [x + w - r, y + h]},\n {kind: 'L', p: [x + r, y + h]}, {kind: 'C', c1: [x + k, y + h], c2: [x, y + h - k], p: [x, y + h - r]},\n {kind: 'L', p: [x, y + r]}, {kind: 'C', c1: [x, y + k], c2: [x + k, y], p: [x + r, y]}, {kind: 'Z'},\n ];\n }\n case 'ellipse': {\n const [w, h] = val(s.size, t, [200, 200] as Vec2);\n const a = w / 2, b = h / 2;\n // Starts at the top and runs clockwise, so trim paths draw on like a clock hand (as in AE).\n return [\n {kind: 'M', p: [0, -b]},\n {kind: 'C', c1: [a * K, -b], c2: [a, -b * K], p: [a, 0]},\n {kind: 'C', c1: [a, b * K], c2: [a * K, b], p: [0, b]},\n {kind: 'C', c1: [-a * K, b], c2: [-a, b * K], p: [-a, 0]},\n {kind: 'C', c1: [-a, -b * K], c2: [-a * K, -b], p: [0, -b]},\n {kind: 'Z'},\n ];\n }\n case 'polygon': case 'star': {\n const n = Math.max(3, s.sides ?? (s.shape === 'star' ? 5 : 6));\n const ro = val(s.radius, t, 100), ri = val(s.innerRadius, t, ro * 0.45);\n const count = s.shape === 'star' ? n * 2 : n;\n const out: Path = [];\n for (let i = 0; i < count; i++) {\n const r = s.shape === 'star' && i % 2 ? ri : ro;\n const a = (i / count) * Math.PI * 2 - Math.PI / 2;\n out.push({kind: i ? 'L' : 'M', p: [Math.cos(a) * r, Math.sin(a) * r]});\n }\n out.push({kind: 'Z'});\n return out;\n }\n default: {\n if (s.path !== undefined) return parse(val(s.path, t, ''));\n const pts = s.points ?? [];\n const out: Path = pts.map((p, i) => ({kind: i ? 'L' : 'M', p}));\n if (s.closed ?? s.shape === 'path') out.push({kind: 'Z'});\n return out;\n }\n }\n};\n\nconst gradient = (ctx: Ctx, g: Gradient) => {\n const grad = 'linear' in g\n ? ctx.createLinearGradient(...g.linear.from, ...g.linear.to)\n : ctx.createRadialGradient(...g.radial.center, 0, ...g.radial.center, g.radial.radius);\n for (const [o, c] of 'linear' in g ? g.linear.stops : g.radial.stops) grad.addColorStop(o, c);\n return grad;\n};\n\nconst drawOnce = (ctx: Ctx, s: ShapeLayer, path: Path, t: number) => {\n const start = val(s.trim?.start, t, 0) / 100, end = val(s.trim?.end, t, 100) / 100, offset = val(s.trim?.offset, t, 0) / 100;\n const trimmed = !!s.trim && (start > 0 || end < 1 || offset !== 0);\n if (trimmed && Math.abs(end - start) < 1e-4) return;\n ctx.beginPath();\n if (trimmed) {\n for (const line of trimPolylines(flatten(path), start, end, offset)) line.forEach((p, i) => (i ? ctx.lineTo(...p) : ctx.moveTo(...p)));\n } else tracePath(ctx, path);\n if (s.fill && !trimmed && s.shape !== 'line') {\n ctx.fillStyle = typeof s.fill === 'object' && ('linear' in s.fill || 'radial' in s.fill) ? gradient(ctx, s.fill as Gradient) : val(s.fill as string, t, '#fff');\n ctx.fill(s.fillRule ?? 'nonzero');\n }\n if (s.stroke) {\n ctx.strokeStyle = val(s.stroke, t, '#fff');\n ctx.lineWidth = val(s.strokeWidth, t, 4);\n ctx.lineCap = s.lineCap ?? 'round';\n ctx.lineJoin = s.lineJoin ?? 'round';\n if (s.dash) ctx.setLineDash(s.dash);\n ctx.stroke();\n if (s.dash) ctx.setLineDash([]);\n }\n};\n\nexport const drawShape = (ctx: Ctx, s: ShapeLayer, t: number) => {\n const path = shapePath(s, t);\n const rep = s.repeater;\n if (!rep) return drawOnce(ctx, s, path, t);\n const copies = Math.max(1, Math.round(val(rep.copies, t, 3)));\n const [dx, dy] = rep.position ?? [100, 0];\n const [sx, sy] = rep.scale ?? [100, 100];\n const [ax, ay] = rep.anchor ?? [0, 0];\n const o0 = (rep.startOpacity ?? 100) / 100, o1 = (rep.endOpacity ?? 100) / 100;\n const base = ctx.globalAlpha;\n for (let i = 0; i < copies; i++) {\n const k = i + (rep.offset ?? 0);\n ctx.save();\n ctx.translate(dx * k + ax, dy * k + ay);\n ctx.rotate(((rep.rotation ?? 0) * k * Math.PI) / 180);\n ctx.scale(Math.pow(sx / 100, k), Math.pow(sy / 100, k));\n ctx.translate(-ax, -ay);\n ctx.globalAlpha = base * (copies > 1 ? o0 + ((o1 - o0) * i) / (copies - 1) : o0);\n drawOnce(ctx, s, path, t);\n ctx.restore();\n }\n};\n", "// Stylised compositing effects drawn from a layer's buffer: RGB split, glitch and wave.\n// All are strip/offset based (no per-pixel loops), so they stay cheap at 1080p.\nimport {val} from '../core/anim.js';\nimport type {Effect} from '../core/model.js';\n\ntype Ctx = CanvasRenderingContext2D;\ntype Canvasish = {width: number; height: number; getContext(t: '2d'): Ctx};\ntype Acquire = (w: number, h: number) => Canvasish;\n\nexport const FX_TYPES = new Set<Effect['type']>(['rgbSplit', 'glitch', 'wave']);\n\n// Deterministic noise so renders are repeatable.\nconst rand = (n: number) => { const x = Math.sin(n * 12.9898 + 78.233) * 43758.5453; return x - Math.floor(x); };\n\nconst channel = (src: Canvasish, acquire: Acquire, color: string) => {\n const c = acquire(src.width, src.height), g = c.getContext('2d');\n g.drawImage(src as unknown as CanvasImageSource, 0, 0);\n g.globalCompositeOperation = 'multiply';\n g.fillStyle = color;\n g.fillRect(0, 0, c.width, c.height);\n g.globalCompositeOperation = 'destination-in';\n g.drawImage(src as unknown as CanvasImageSource, 0, 0);\n return c;\n};\n\nconst rgbSplit = (target: Ctx, src: Canvasish, acquire: Acquire, release: (c: Canvasish) => void, dx: number, dy: number) => {\n if (Math.abs(dx) + Math.abs(dy) < 0.5) { target.drawImage(src as unknown as CanvasImageSource, 0, 0); return; }\n const r = channel(src, acquire, '#ff0000'), g = channel(src, acquire, '#00ff00'), b = channel(src, acquire, '#0000ff');\n target.save();\n target.globalCompositeOperation = 'lighter';\n target.drawImage(r as unknown as CanvasImageSource, dx, dy);\n target.drawImage(g as unknown as CanvasImageSource, 0, 0);\n target.drawImage(b as unknown as CanvasImageSource, -dx, -dy);\n target.restore();\n [r, g, b].forEach(release);\n};\n\n// Draws `src` onto `target` through any stylised effects; returns false if none apply.\nexport const drawWithFx = (target: Ctx, src: Canvasish, effects: Effect[], t: number, fps: number, acquire: Acquire, release: (c: Canvasish) => void): boolean => {\n const fx = effects.filter((e) => FX_TYPES.has(e.type));\n if (!fx.length) return false;\n let cur = src;\n const temps: Canvasish[] = [];\n const stage = () => { const c = acquire(src.width, src.height); temps.push(c); return c; };\n for (const e of fx) {\n const out = stage(), o = out.getContext('2d');\n const W = src.width, H = src.height;\n if (e.type === 'wave') {\n const amp = val(e.amplitude, t, 20), wl = e.wavelength ?? 240, ph = t * (e.speed ?? 1) * Math.PI * 2, strip = 4;\n if (Math.abs(amp) < 0.1) o.drawImage(cur as unknown as CanvasImageSource, 0, 0);\n else if ((e.direction ?? 'horizontal') === 'horizontal') for (let y = 0; y < H; y += strip) o.drawImage(cur as unknown as CanvasImageSource, 0, y, W, strip, Math.sin((y / wl) * Math.PI * 2 + ph) * amp, y, W, strip);\n else for (let x = 0; x < W; x += strip) o.drawImage(cur as unknown as CanvasImageSource, x, 0, strip, H, x, Math.sin((x / wl) * Math.PI * 2 + ph) * amp, strip, H);\n } else if (e.type === 'glitch') {\n const amount = val(e.amount, t, 50) / 100;\n const frame = Math.floor(t * fps / (e.hold ?? 2)), seed = (e.seed ?? 1) * 1000 + frame;\n if (amount <= 0.001) o.drawImage(cur as unknown as CanvasImageSource, 0, 0);\n else {\n // Horizontal slices pushed sideways by random amounts; some frames stay clean.\n let y = 0, k = 0;\n while (y < H) {\n const hgt = Math.max(4, Math.round((0.01 + rand(seed + k * 7.1) * 0.08) * H));\n const active = rand(seed + k * 3.3) < 0.35 + amount * 0.4;\n const dx = active ? (rand(seed + k * 5.7) - 0.5) * 2 * amount * W * 0.08 : 0;\n o.drawImage(cur as unknown as CanvasImageSource, 0, y, W, hgt, dx, y, W, hgt);\n y += hgt; k++;\n }\n if (e.rgb !== false) {\n const split = stage(), sg = split.getContext('2d');\n rgbSplit(sg, out, acquire, release, amount * 14 * (rand(seed) > 0.5 ? 1 : -1), 0);\n cur = split;\n continue;\n }\n }\n } else if (e.type === 'rgbSplit') {\n const amt = val(e.amount, t, 10), ang = ((e.angle ?? 0) * Math.PI) / 180;\n rgbSplit(o, cur, acquire, release, Math.cos(ang) * amt, Math.sin(ang) * amt);\n }\n cur = out;\n }\n target.drawImage(cur as unknown as CanvasImageSource, 0, 0);\n temps.forEach(release);\n return true;\n};\n", "// Colour grading: curves, colour wheels, exposure, temperature and 3D LUTs in one per-pixel pass,\n// plus a cheap vignette. Per-channel steps fold into three 256-entry tables; LUTs use a prebuilt\n// 33\u00B3 table with inline trilinear interpolation. Measured cost at 1080\u00D71920: ~25 ms (tables) and\n// ~60\u201390 ms (3D LUT) per frame on one CPU core.\nimport {val} from '../core/anim.js';\nimport type {Effect} from '../core/model.js';\n\ntype Ctx = CanvasRenderingContext2D;\ntype Grade = Extract<Effect, {type: 'curves' | 'colorBalance' | 'exposure' | 'temperature' | 'lut'}>;\nexport const GRADE_TYPES = new Set<Effect['type']>(['curves', 'colorBalance', 'exposure', 'temperature', 'lut']);\n\n// Monotone cubic interpolation through curve points (0..1), like the curves tool in most editors.\nconst curveTable = (pts: [number, number][] | undefined): Float32Array | null => {\n if (!pts || pts.length < 2) return null;\n const p = [...pts].sort((a, b) => a[0] - b[0]);\n const n = p.length, dx: number[] = [], m: number[] = [], sl: number[] = [];\n for (let i = 0; i < n - 1; i++) { dx.push(p[i + 1][0] - p[i][0] || 1e-6); sl.push((p[i + 1][1] - p[i][1]) / dx[i]); }\n m.push(sl[0]);\n for (let i = 1; i < n - 1; i++) m.push(sl[i - 1] * sl[i] <= 0 ? 0 : (sl[i - 1] + sl[i]) / 2);\n m.push(sl[n - 2]);\n const out = new Float32Array(256);\n for (let v = 0; v < 256; v++) {\n const x = v / 255;\n let i = 0;\n while (i < n - 2 && x > p[i + 1][0]) i++;\n if (x <= p[0][0]) { out[v] = p[0][1]; continue; }\n if (x >= p[n - 1][0]) { out[v] = p[n - 1][1]; continue; }\n const h = dx[i], t = (x - p[i][0]) / h, t2 = t * t, t3 = t2 * t;\n out[v] = (2 * t3 - 3 * t2 + 1) * p[i][1] + (t3 - 2 * t2 + t) * h * m[i] + (-2 * t3 + 3 * t2) * p[i + 1][1] + (t3 - t2) * h * m[i + 1];\n }\n return out;\n};\n\n// Parses an Adobe/Resolve .cube 3D LUT.\nexport interface Lut { size: number; data: Float32Array; min: number[]; max: number[] }\nconst lutCache = new Map<string, Lut>();\nexport const parseCube = (text: string): Lut => {\n let size = 0, min = [0, 0, 0], max = [1, 1, 1];\n const values: number[] = [];\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n if (/^LUT_3D_SIZE/i.test(line)) size = parseInt(line.split(/\\s+/)[1]);\n else if (/^DOMAIN_MIN/i.test(line)) min = line.split(/\\s+/).slice(1).map(Number);\n else if (/^DOMAIN_MAX/i.test(line)) max = line.split(/\\s+/).slice(1).map(Number);\n else if (/^[-\\d.]/.test(line)) { const v = line.split(/\\s+/).map(Number); if (v.length >= 3) values.push(v[0], v[1], v[2]); }\n }\n if (!size || values.length < size ** 3 * 3) throw new Error('Not a 3D .cube LUT');\n return {size, data: Float32Array.from(values), min, max};\n};\n\nexport interface GradeContext { loadText(src: string): Promise<string> }\n\nexport const preloadLuts = async (effects: Effect[], host: GradeContext) => {\n for (const e of effects) if (e.type === 'lut' && !lutCache.has(e.src)) lutCache.set(e.src, parseCube(await host.loadText(e.src)));\n};\n\nconst clamp255 = (v: number) => (v < 0 ? 0 : v > 255 ? 255 : v);\n\n// Applies all grade effects to the whole canvas in one pass.\nexport const applyGrade = (ctx: Ctx, w: number, h: number, effects: Grade[], t: number) => {\n if (!effects.length) return;\n // Per-channel tables: exposure \u2192 temperature \u2192 colour wheels \u2192 curves.\n const tables = [new Float32Array(256), new Float32Array(256), new Float32Array(256)];\n for (let c = 0; c < 3; c++) for (let v = 0; v < 256; v++) tables[c][v] = v / 255;\n let lut: Lut | undefined, lutMix = 1;\n for (const e of effects) {\n if (e.type === 'exposure') { const k = Math.pow(2, val(e.stops, t, 0)); for (const tb of tables) for (let v = 0; v < 256; v++) tb[v] *= k; }\n else if (e.type === 'temperature') {\n // -100 (cool) \u2026 +100 (warm): red up / blue down, gently.\n const a = val(e.amount, t, 0) / 100;\n for (let v = 0; v < 256; v++) { tables[0][v] *= 1 + 0.18 * a; tables[1][v] *= 1 + 0.03 * a; tables[2][v] *= 1 - 0.2 * a; }\n } else if (e.type === 'colorBalance') {\n // Lift/gamma/gain style: shift shadows, midtones and highlights per channel (-1..1).\n const sh = e.shadows ?? [0, 0, 0], mid = e.midtones ?? [0, 0, 0], hi = e.highlights ?? [0, 0, 0];\n for (let c = 0; c < 3; c++) for (let v = 0; v < 256; v++) {\n const x = tables[c][v];\n const ws = Math.max(0, 1 - x * 3), wh = Math.max(0, x * 3 - 2), wm = 1 - Math.abs(x - 0.5) * 2;\n tables[c][v] = x + sh[c] * 0.25 * ws + mid[c] * 0.25 * wm + hi[c] * 0.25 * wh;\n }\n } else if (e.type === 'curves') {\n const master = curveTable(e.master), per = [curveTable(e.r), curveTable(e.g), curveTable(e.b)];\n for (let c = 0; c < 3; c++) for (let v = 0; v < 256; v++) {\n let x = Math.min(1, Math.max(0, tables[c][v]));\n if (master) x = master[Math.round(x * 255)];\n if (per[c]) x = per[c]![Math.round(Math.min(1, Math.max(0, x)) * 255)];\n tables[c][v] = x;\n }\n } else if (e.type === 'lut') { lut = lutCache.get(e.src); lutMix = val(e.intensity, t, 100) / 100; }\n }\n const R = new Uint8ClampedArray(256), G = new Uint8ClampedArray(256), B = new Uint8ClampedArray(256);\n for (let v = 0; v < 256; v++) { R[v] = tables[0][v] * 255; G[v] = tables[1][v] * 255; B[v] = tables[2][v] * 255; }\n\n const img = ctx.getImageData(0, 0, w, h), d = img.data;\n if (!lut) {\n for (let i = 0; i < d.length; i += 4) { if (d[i + 3]) { d[i] = R[d[i]]; d[i + 1] = G[d[i + 1]]; d[i + 2] = B[d[i + 2]]; } }\n } else {\n const S = lut.size, S2 = S * S, L = lut.data, k = (S - 1) / 255, mix = lutMix, inv = 1 - lutMix;\n for (let i = 0; i < d.length; i += 4) {\n if (!d[i + 3]) continue;\n const r0v = R[d[i]], g0v = G[d[i + 1]], b0v = B[d[i + 2]];\n const r = r0v * k, g = g0v * k, b = b0v * k;\n const ri = r | 0, gi = g | 0, bi = b | 0;\n const r1 = ri < S - 1 ? ri + 1 : ri, g1 = gi < S - 1 ? gi + 1 : gi, b1 = bi < S - 1 ? bi + 1 : bi;\n const fr = r - ri, fg = g - gi, fb = b - bi;\n // .cube order: red changes fastest.\n const i000 = (ri + gi * S + bi * S2) * 3, i100 = (r1 + gi * S + bi * S2) * 3, i010 = (ri + g1 * S + bi * S2) * 3, i110 = (r1 + g1 * S + bi * S2) * 3;\n const i001 = (ri + gi * S + b1 * S2) * 3, i101 = (r1 + gi * S + b1 * S2) * 3, i011 = (ri + g1 * S + b1 * S2) * 3, i111 = (r1 + g1 * S + b1 * S2) * 3;\n for (let c = 0; c < 3; c++) {\n const c00 = L[i000 + c] + (L[i100 + c] - L[i000 + c]) * fr, c10 = L[i010 + c] + (L[i110 + c] - L[i010 + c]) * fr;\n const c01 = L[i001 + c] + (L[i101 + c] - L[i001 + c]) * fr, c11 = L[i011 + c] + (L[i111 + c] - L[i011 + c]) * fr;\n const out = ((c00 + (c10 - c00) * fg) * (1 - fb) + (c01 + (c11 - c01) * fg) * fb) * 255;\n const before = c === 0 ? r0v : c === 1 ? g0v : b0v;\n d[i + c] = clamp255(out * mix + before * inv);\n }\n }\n }\n ctx.putImageData(img, 0, 0);\n};\n\n// Vignette as a radial-gradient overlay (no per-pixel work).\nexport const drawVignette = (ctx: Ctx, w: number, h: number, amount: number, softness = 0.5, color = '#000') => {\n if (amount <= 0) return;\n const r = Math.hypot(w, h) / 2;\n const g = ctx.createRadialGradient(w / 2, h / 2, r * (1 - softness) * 0.75, w / 2, h / 2, r);\n g.addColorStop(0, 'rgba(0,0,0,0)');\n g.addColorStop(1, color.startsWith('#') && color.length === 7 ? `${color}${Math.round(Math.min(1, amount / 100) * 255).toString(16).padStart(2, '0')}` : color);\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.globalCompositeOperation = 'source-atop';\n ctx.fillStyle = g;\n ctx.fillRect(0, 0, w, h);\n ctx.restore();\n};\n", "// True perspective (corner pin) on Canvas2D: a homography sampled on a triangle mesh.\nimport type {Vec2} from '../core/model.js';\n\ntype Ctx = CanvasRenderingContext2D;\n\n// Homography mapping the unit square (0,0)-(1,1) to the quad tl, tr, br, bl.\nconst squareToQuad = ([x0, y0]: Vec2, [x1, y1]: Vec2, [x2, y2]: Vec2, [x3, y3]: Vec2) => {\n const dx1 = x1 - x2, dx2 = x3 - x2, dx3 = x0 - x1 + x2 - x3;\n const dy1 = y1 - y2, dy2 = y3 - y2, dy3 = y0 - y1 + y2 - y3;\n let a13 = 0, a23 = 0;\n const den = dx1 * dy2 - dx2 * dy1;\n if (Math.abs(den) > 1e-12) {\n a13 = (dx3 * dy2 - dx2 * dy3) / den;\n a23 = (dx1 * dy3 - dx3 * dy1) / den;\n }\n const a11 = x1 - x0 + a13 * x1, a21 = x3 - x0 + a23 * x3, a31 = x0;\n const a12 = y1 - y0 + a13 * y1, a22 = y3 - y0 + a23 * y3, a32 = y0;\n return (u: number, v: number): Vec2 => {\n const w = a13 * u + a23 * v + 1;\n return [(a11 * u + a21 * v + a31) / w, (a12 * u + a22 * v + a32) / w];\n };\n};\n\n// Draws `src` (w\u00D7h) so its corners land on the quad. `n` subdivisions per side (16 is seamless at 1080p).\nexport const drawPerspective = (ctx: Ctx, src: CanvasImageSource, w: number, h: number, quad: [Vec2, Vec2, Vec2, Vec2], n = 16) => {\n const map = squareToQuad(...quad);\n const tri = (s0: Vec2, s1: Vec2, s2: Vec2) => {\n const d0 = map(s0[0] / w, s0[1] / h), d1 = map(s1[0] / w, s1[1] / h), d2 = map(s2[0] / w, s2[1] / h);\n // Affine map taking the source triangle onto the destination triangle.\n const den = (s1[0] - s0[0]) * (s2[1] - s0[1]) - (s2[0] - s0[0]) * (s1[1] - s0[1]);\n if (Math.abs(den) < 1e-9) return;\n const a = ((d1[0] - d0[0]) * (s2[1] - s0[1]) - (d2[0] - d0[0]) * (s1[1] - s0[1])) / den;\n const b = ((d1[1] - d0[1]) * (s2[1] - s0[1]) - (d2[1] - d0[1]) * (s1[1] - s0[1])) / den;\n const c = ((d2[0] - d0[0]) * (s1[0] - s0[0]) - (d1[0] - d0[0]) * (s2[0] - s0[0])) / den;\n const d = ((d2[1] - d0[1]) * (s1[0] - s0[0]) - (d1[1] - d0[1]) * (s2[0] - s0[0])) / den;\n const e = d0[0] - a * s0[0] - c * s0[1], f = d0[1] - b * s0[0] - d * s0[1];\n // Grow the clip triangle slightly so neighbouring triangles overlap and leave no hairline seams.\n const cx = (d0[0] + d1[0] + d2[0]) / 3, cy = (d0[1] + d1[1] + d2[1]) / 3;\n const grow = (p: Vec2): Vec2 => { const vx = p[0] - cx, vy = p[1] - cy, l = Math.hypot(vx, vy) || 1; return [p[0] + (vx / l) * 0.6, p[1] + (vy / l) * 0.6]; };\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(...grow(d0)); ctx.lineTo(...grow(d1)); ctx.lineTo(...grow(d2));\n ctx.closePath();\n ctx.clip();\n ctx.transform(a, b, c, d, e, f);\n ctx.drawImage(src, 0, 0);\n ctx.restore();\n };\n for (let j = 0; j < n; j++) {\n for (let i = 0; i < n; i++) {\n const x0 = (w * i) / n, x1 = (w * (i + 1)) / n, y0 = (h * j) / n, y1 = (h * (j + 1)) / n;\n tri([x0, y0], [x1, y0], [x0, y1]);\n tri([x1, y0], [x1, y1], [x0, y1]);\n }\n }\n};\n\n// Corners of a w\u00D7h rectangle rotated in 3D about its centre and projected (for device tilts).\nexport const tiltCorners = (w: number, h: number, rotX: number, rotY: number, rotZ = 0, perspective = 2000): [Vec2, Vec2, Vec2, Vec2] => {\n const rx = (rotX * Math.PI) / 180, ry = (rotY * Math.PI) / 180, rz = (rotZ * Math.PI) / 180;\n const pts: [number, number][] = [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]];\n return pts.map(([x, y]) => {\n // rotate Z, then X, then Y\n let X = x * Math.cos(rz) - y * Math.sin(rz), Y = x * Math.sin(rz) + y * Math.cos(rz), Z = 0;\n const y1 = Y * Math.cos(rx) - Z * Math.sin(rx), z1 = Y * Math.sin(rx) + Z * Math.cos(rx);\n Y = y1; Z = z1;\n const x2 = X * Math.cos(ry) + Z * Math.sin(ry), z2 = -X * Math.sin(ry) + Z * Math.cos(ry);\n X = x2; Z = z2;\n const k = perspective / (perspective + Z);\n return [X * k + w / 2, Y * k + h / 2] as Vec2;\n }) as [Vec2, Vec2, Vec2, Vec2];\n};\n", "// A Lottie (Bodymovin) player on Canvas2D, so Lottie files render inside DT.ly in Node and in the browser.\n// Supports shape, solid, image, null, precomp and simple text layers; groups, paths, rects, ellipses,\n// polystars, fills, strokes (dashes), gradient fills/strokes, trim paths, repeaters; parenting,\n// masks (add/subtract/intersect), track mattes (alpha and luma), time stretch and time remap.\n// Not supported: expressions, layer effects, merge paths, round corners, 3D layers.\nimport {applyEase} from '../core/ease.js';\n\ntype Ctx = CanvasRenderingContext2D;\ntype V = number[];\ntype M = [number, number, number, number, number, number];\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype J = any;\n\nexport interface LottieHost { createCanvas(w: number, h: number): {width: number; height: number; getContext(t: '2d'): Ctx}; image(src: string): Promise<{width: number; height: number}> }\n\nconst I: M = [1, 0, 0, 1, 0, 0];\nconst mul = (m: M, n: M): M => [m[0] * n[0] + m[2] * n[1], m[1] * n[0] + m[3] * n[1], m[0] * n[2] + m[2] * n[3], m[1] * n[2] + m[3] * n[3], m[0] * n[4] + m[2] * n[5] + m[4], m[1] * n[4] + m[3] * n[5] + m[5]];\nconst apply = (m: M, x: number, y: number): [number, number] => [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n\n// ---- property evaluation ---------------------------------------------------------------------\nconst first = (v: V | number | undefined, d = 0) => (Array.isArray(v) ? v[0] ?? d : v ?? d);\nconst lerpAny = (a: J, b: J, p: number): J => {\n if (typeof a === 'number') return a + (b - a) * p;\n if (Array.isArray(a)) return a.map((x, i) => lerpAny(x, b?.[i] ?? x, p));\n if (a && typeof a === 'object' && a.v) return {c: a.c, i: lerpAny(a.i, b.i, p), o: lerpAny(a.o, b.o, p), v: lerpAny(a.v, b.v, p)}; // shape\n return p < 1 ? a : b;\n};\n\nconst evalProp = (prop: J, f: number): J => {\n if (!prop) return undefined;\n const k = prop.k;\n const animated = prop.a === 1 || (Array.isArray(k) && k.length && typeof k[0] === 'object' && k[0] !== null && 't' in k[0]);\n if (!animated) return k;\n const kfs = k as J[];\n if (f <= kfs[0].t) return kfs[0].s ?? kfs[0].e;\n let i = 0;\n while (i < kfs.length - 1 && f >= kfs[i + 1].t) i++;\n const a = kfs[i], b = kfs[i + 1];\n if (!b || a.s === undefined) return a.s ?? kfs[i - 1]?.e ?? kfs[i - 1]?.s;\n const start = a.s, end = a.e ?? b.s;\n if (a.h === 1 || end === undefined) return start;\n const x = (f - a.t) / (b.t - a.t);\n const ox = first(a.o?.x, 0), oy = first(a.o?.y, 0), ix = first(a.i?.x, 1), iy = first(a.i?.y, 1);\n const p = applyEase([ox, oy, ix, iy], Math.max(0, Math.min(1, x)));\n // Spatial bezier for positions (motion paths).\n if (a.to && a.ti && Array.isArray(start) && start.length >= 2 && (a.to.some((v: number) => v) || a.ti.some((v: number) => v))) {\n const c1 = start.map((v: number, d: number) => v + (a.to[d] ?? 0)), c2 = end.map((v: number, d: number) => v + (a.ti[d] ?? 0)), u = 1 - p;\n return start.map((v: number, d: number) => u * u * u * v + 3 * u * u * p * c1[d] + 3 * u * p * p * c2[d] + p * p * p * end[d]);\n }\n return lerpAny(start, end, p);\n};\nconst num = (prop: J, f: number, d = 0): number => { const v = evalProp(prop, f); return v === undefined ? d : first(v, d); };\nconst vec = (prop: J, f: number, d: V): V => { const v = evalProp(prop, f); return v === undefined ? d : Array.isArray(v) ? v : [v, v]; };\n\n// Colours are 0..1 in current Lottie files, 0..255 in files from Bodymovin 4.x and older.\nconst rgba = (c: V, alpha: number) => {\n const k = (c[0] ?? 0) > 1 || (c[1] ?? 0) > 1 || (c[2] ?? 0) > 1 || (c[3] ?? 0) > 1 ? 1 / 255 : 1;\n return `rgba(${Math.round((c[0] ?? 0) * k * 255)},${Math.round((c[1] ?? 0) * k * 255)},${Math.round((c[2] ?? 0) * k * 255)},${Math.max(0, Math.min(1, (c[3] ?? 1 / k) * k * alpha)).toFixed(4)})`;\n};\n\n// ---- transforms ------------------------------------------------------------------------------\nconst transformMatrix = (tr: J, f: number): M => {\n if (!tr) return I;\n const a = vec(tr.a, f, [0, 0]);\n let p: V;\n if (tr.p?.s) p = [num(tr.p.x, f), num(tr.p.y, f)];\n else p = vec(tr.p, f, [0, 0]);\n const s = vec(tr.s, f, [100, 100]);\n const r = ((tr.r ? num(tr.r, f) : num(tr.rz, f)) * Math.PI) / 180;\n const sk = (num(tr.sk, f) * Math.PI) / 180, sa = (num(tr.sa, f) * Math.PI) / 180;\n let m: M = [1, 0, 0, 1, p[0] ?? 0, p[1] ?? 0];\n m = mul(m, [Math.cos(r), Math.sin(r), -Math.sin(r), Math.cos(r), 0, 0]);\n if (sk) {\n const c = Math.cos(sa), si = Math.sin(sa);\n m = mul(m, mul(mul([c, si, -si, c, 0, 0], [1, 0, Math.tan(-sk), 1, 0, 0]), [c, -si, si, c, 0, 0]));\n }\n m = mul(m, [(s[0] ?? 100) / 100, 0, 0, (s[1] ?? 100) / 100, 0, 0]);\n return mul(m, [1, 0, 0, 1, -(a[0] ?? 0), -(a[1] ?? 0)]);\n};\nconst opacityOf = (tr: J, f: number) => (tr?.o ? num(tr.o, f, 100) / 100 : 1);\n\n// ---- geometry --------------------------------------------------------------------------------\ntype Sub = {pts: [number, number][]; segs: ([number, number] | null)[][]; closed: boolean}; // cubic segments in matrix space\ntype Geo = {subs: {start: [number, number]; cubics: [number, number, number, number, number, number][]; closed: boolean}[]};\n\nconst shapeToGeo = (sh: J, m: M, reverse = false): Geo => {\n if (Array.isArray(sh)) sh = sh[0]; // animated shapes keep their value wrapped in an array\n if (!sh?.v?.length) return {subs: []};\n let v: V[] = sh.v, ii: V[] = sh.i ?? [], oo: V[] = sh.o ?? [];\n if (reverse) { v = [...v].reverse(); const ni = [...oo].reverse(), no = [...ii].reverse(); ii = ni; oo = no; }\n const n = v.length, cubics: Geo['subs'][0]['cubics'] = [];\n const P = (j: number) => apply(m, v[j][0], v[j][1]);\n const segCount = sh.c ? n : n - 1;\n for (let j = 0; j < segCount; j++) {\n const k = (j + 1) % n;\n const c1 = apply(m, v[j][0] + (oo[j]?.[0] ?? 0), v[j][1] + (oo[j]?.[1] ?? 0));\n const c2 = apply(m, v[k][0] + (ii[k]?.[0] ?? 0), v[k][1] + (ii[k]?.[1] ?? 0));\n const e = P(k);\n cubics.push([c1[0], c1[1], c2[0], c2[1], e[0], e[1]]);\n }\n return {subs: [{start: P(0), cubics, closed: !!sh.c}]};\n};\n\nconst K = 0.5522847498;\nconst ellipseGeo = (it: J, f: number, m: M): Geo => {\n const [cx, cy] = vec(it.p, f, [0, 0]), [w, h] = vec(it.s, f, [0, 0]);\n const a = w / 2, b = h / 2;\n const sh = {c: true, v: [[cx, cy - b], [cx + a, cy], [cx, cy + b], [cx - a, cy]], o: [[a * K, 0], [0, b * K], [-a * K, 0], [0, -b * K]], i: [[-a * K, 0], [0, -b * K], [a * K, 0], [0, b * K]]};\n return shapeToGeo(sh, m, it.d === 3);\n};\nconst rectGeo = (it: J, f: number, m: M): Geo => {\n const [cx, cy] = vec(it.p, f, [0, 0]), [w, h] = vec(it.s, f, [0, 0]);\n const r = Math.min(num(it.r, f), w / 2, h / 2), x = cx - w / 2, y = cy - h / 2, k = r * K;\n const sh = r > 0\n ? {c: true, v: [[x + w, y + r], [x + w, y + h - r], [x + w - r, y + h], [x + r, y + h], [x, y + h - r], [x, y + r], [x + r, y], [x + w - r, y]], i: [[0, -k], [0, 0], [k, 0], [0, 0], [0, k], [0, 0], [-k, 0], [0, 0]], o: [[0, 0], [0, k], [0, 0], [-k, 0], [0, 0], [0, -k], [0, 0], [k, 0]]}\n : {c: true, v: [[x + w, y], [x + w, y + h], [x, y + h], [x, y]], i: [[0, 0], [0, 0], [0, 0], [0, 0]], o: [[0, 0], [0, 0], [0, 0], [0, 0]]};\n return shapeToGeo(sh, m, it.d === 3);\n};\nconst starGeo = (it: J, f: number, m: M): Geo => {\n const pts = Math.max(3, Math.round(num(it.pt, f, 5))), [cx, cy] = vec(it.p, f, [0, 0]);\n const rot = ((num(it.r, f) - 90) * Math.PI) / 180, or = num(it.or, f, 100), ir = num(it.ir, f, 50);\n const count = it.sy === 1 ? pts * 2 : pts, v: V[] = [];\n for (let i = 0; i < count; i++) { const rr = it.sy === 1 && i % 2 ? ir : or; const a = rot + (i / count) * Math.PI * 2; v.push([cx + Math.cos(a) * rr, cy + Math.sin(a) * rr]); }\n return shapeToGeo({c: true, v, i: v.map(() => [0, 0]), o: v.map(() => [0, 0])}, m, it.d === 3);\n};\n\nconst traceGeo = (ctx: Ctx, g: Geo) => {\n for (const s of g.subs) {\n ctx.moveTo(...s.start);\n for (const c of s.cubics) ctx.bezierCurveTo(c[0], c[1], c[2], c[3], c[4], c[5]);\n if (s.closed) ctx.closePath();\n }\n};\n\n// Trim paths on cubic geometry: flatten, then cut by length.\nconst trimGeo = (g: Geo, start: number, end: number, offset: number): Geo => {\n const subs = g.subs.map((s) => {\n const pts: [number, number][] = [s.start];\n let last = s.start;\n for (const c of s.cubics) {\n const n = 24;\n for (let k = 1; k <= n; k++) {\n const t = k / n, u = 1 - t;\n pts.push([u * u * u * last[0] + 3 * u * u * t * c[0] + 3 * u * t * t * c[2] + t * t * t * c[4], u * u * u * last[1] + 3 * u * u * t * c[1] + 3 * u * t * t * c[3] + t * t * t * c[5]]);\n }\n last = [c[4], c[5]];\n }\n return pts;\n });\n const lens = subs.map((pts) => pts.slice(1).reduce((a, p, i) => a + Math.hypot(p[0] - pts[i][0], p[1] - pts[i][1]), 0));\n const total = lens.reduce((a, b) => a + b, 0);\n if (!total) return {subs: []};\n let s0 = Math.min(start, end) + offset, s1 = Math.max(start, end) + offset;\n const shift = Math.floor(s0); s0 -= shift; s1 -= shift;\n const ranges: [number, number][] = s1 <= 1 ? [[s0, s1]] : [[s0, 1], [0, s1 - 1]];\n const out: Geo = {subs: []};\n for (const [ra, rb] of ranges) {\n const from = ra * total, to = rb * total;\n let acc = 0;\n subs.forEach((pts) => {\n let line: [number, number][] | null = null;\n for (let i = 0; i < pts.length - 1; i++) {\n const p = pts[i], q = pts[i + 1], l = Math.hypot(q[0] - p[0], q[1] - p[1]), a0 = acc, a1 = acc + l;\n acc = a1;\n if (a1 < from || a0 > to || !l) continue;\n const at = (d: number): [number, number] => { const k = (d - a0) / l; return [p[0] + (q[0] - p[0]) * k, p[1] + (q[1] - p[1]) * k]; };\n if (!line) line = [at(Math.max(from, a0))];\n line.push(at(Math.min(to, a1)));\n }\n if (line && line.length > 1) out.subs.push({start: line[0], cubics: line.slice(1).map((p, i) => { const a = line![i]; return [a[0], a[1], p[0], p[1], p[0], p[1]]; }), closed: false});\n });\n }\n return out;\n};\n\n// ---- shape item tree ---------------------------------------------------------------------------\ntype Paint = {kind: 'fill' | 'stroke'; it: J; geos: Geo[]; alpha: number; m: M};\n\nconst gradientStyle = (ctx: Ctx, it: J, f: number, m: M, alpha: number) => {\n const s = vec(it.s, f, [0, 0]), e = vec(it.e, f, [0, 0]);\n const [x0, y0] = apply(m, s[0], s[1]), [x1, y1] = apply(m, e[0], e[1]);\n const grad = it.t === 2 ? ctx.createRadialGradient(x0, y0, 0, x0, y0, Math.hypot(x1 - x0, y1 - y0)) : ctx.createLinearGradient(x0, y0, x1, y1);\n const n = it.g?.p ?? 0, raw: V = evalProp(it.g?.k, f) ?? [];\n const alphaAt = (pos: number) => {\n const op = raw.slice(n * 4);\n if (op.length < 2) return 1;\n for (let j = 0; j < op.length - 2; j += 2) if (pos >= op[j] && pos <= op[j + 2]) { const k = (pos - op[j]) / ((op[j + 2] - op[j]) || 1); return op[j + 1] + (op[j + 3] - op[j + 1]) * k; }\n return pos < op[0] ? op[1] : op[op.length - 1];\n };\n for (let j = 0; j < n; j++) { const pos = raw[j * 4]; grad.addColorStop(Math.max(0, Math.min(1, pos)), rgba([raw[j * 4 + 1], raw[j * 4 + 2], raw[j * 4 + 3], alphaAt(pos)], alpha)); }\n return grad;\n};\n\nconst paintAll = (ctx: Ctx, paints: Paint[], f: number) => {\n // Lower items render first (AE stacking): paints were collected top-down.\n for (let i = paints.length - 1; i >= 0; i--) {\n const {kind, it, geos, alpha, m} = paints[i];\n if (!geos.length || it.hd) continue;\n ctx.beginPath();\n for (const g of geos) traceGeo(ctx, g);\n const o = num(it.o, f, 100) / 100 * alpha;\n if (kind === 'fill') {\n ctx.fillStyle = it.ty === 'gf' ? gradientStyle(ctx, it, f, m, o) : rgba(vec(it.c, f, [0, 0, 0, 1]), o);\n ctx.fill(it.r === 2 ? 'evenodd' : 'nonzero');\n } else {\n ctx.strokeStyle = it.ty === 'gs' ? gradientStyle(ctx, it, f, m, o) : rgba(vec(it.c, f, [0, 0, 0, 1]), o);\n ctx.lineWidth = num(it.w, f, 1) * (paintScale.get(it) ?? 1);\n ctx.lineCap = (['butt', 'butt', 'round', 'square'] as const)[it.lc ?? 2] ?? 'round';\n ctx.lineJoin = (['miter', 'miter', 'round', 'bevel'] as const)[it.lj ?? 2] ?? 'round';\n ctx.miterLimit = it.ml ?? 4;\n if (it.d?.length) {\n const d = it.d.filter((x: J) => x.n !== 'o').map((x: J) => num(x.v, f) * (paintScale.get(it) ?? 1));\n ctx.setLineDash(d);\n const off = it.d.find((x: J) => x.n === 'o');\n ctx.lineDashOffset = off ? num(off.v, f) : 0;\n }\n ctx.stroke();\n ctx.setLineDash([]);\n }\n }\n};\n// Stroke widths and gradients are in shape space; geometry is already in layer pixels, so remember the scale.\nconst paintScale = new WeakMap<object, number>();\n\nconst collect = (items: J[], f: number, m: M, alpha: number, paints: Paint[], geos: Geo[]) => {\n const tr = items.find((it) => it.ty === 'tr');\n const gm = tr ? mul(m, transformMatrix(tr, f)) : m;\n const ga = alpha * (tr ? opacityOf(tr, f) : 1);\n const scale = Math.sqrt(Math.abs(gm[0] * gm[3] - gm[1] * gm[2]));\n const local: Geo[] = [];\n const localPaints: Paint[] = [];\n for (const it of items) {\n if (it.hd) continue;\n switch (it.ty) {\n case 'sh': local.push(shapeToGeo(evalProp(it.ks, f), gm, it.d === 3)); break;\n case 'el': local.push(ellipseGeo(it, f, gm)); break;\n case 'rc': local.push(rectGeo(it, f, gm)); break;\n case 'sr': local.push(starGeo(it, f, gm)); break;\n case 'gr': collect(it.it ?? [], f, gm, ga, localPaints, local); break;\n case 'fl': case 'gf': localPaints.push({kind: 'fill', it, geos: [...local], alpha: ga, m: gm}); break;\n case 'st': case 'gs': paintScale.set(it, scale); localPaints.push({kind: 'stroke', it, geos: [...local], alpha: ga, m: gm}); break;\n case 'tm': {\n const s = num(it.s, f) / 100, e = num(it.e, f, 100) / 100, o = num(it.o, f) / 360;\n const trimmed = local.map((g) => trimGeo(g, s, e, o));\n local.splice(0, local.length, ...trimmed);\n break;\n }\n case 'rp': {\n const copies = Math.round(num(it.c, f, 1)), off = num(it.o, f), rtr = it.tr;\n const base = [...local];\n const so = rtr?.so ? num(rtr.so, f, 100) / 100 : 1, eo = rtr?.eo ? num(rtr.eo, f, 100) / 100 : 1;\n local.length = 0;\n const step = transformMatrix(rtr, f);\n for (let c = 0; c < copies; c++) {\n let rm: M = I;\n for (let k = 0; k < c + off; k++) rm = mul(rm, step);\n const inv = invert(gm);\n const toGroup = inv ? mul(gm, mul(rm, inv)) : I;\n for (const g of base) local.push({subs: g.subs.map((s) => ({start: apply(toGroup, ...s.start), cubics: s.cubics.map((c3) => { const a = apply(toGroup, c3[0], c3[1]), b = apply(toGroup, c3[2], c3[3]), e = apply(toGroup, c3[4], c3[5]); return [a[0], a[1], b[0], b[1], e[0], e[1]] as [number, number, number, number, number, number]; }), closed: s.closed}))});\n void so; void eo;\n }\n break;\n }\n default: break; // tr handled above; mm/rd/op ignored\n }\n }\n // Paints apply to geometry above them in their group (and nested groups' geometry).\n paints.push(...localPaints);\n geos.push(...local);\n};\nconst invert = (m: M): M | null => {\n const det = m[0] * m[3] - m[1] * m[2];\n if (Math.abs(det) < 1e-12) return null;\n return [m[3] / det, -m[1] / det, -m[2] / det, m[0] / det, (m[2] * m[5] - m[3] * m[4]) / det, (m[1] * m[4] - m[0] * m[5]) / det];\n};\n\n// ---- player ----------------------------------------------------------------------------------\nexport class LottiePlayer {\n readonly w: number; readonly h: number; readonly fr: number; readonly ip: number; readonly op: number;\n private assets = new Map<string, J>();\n private images = new Map<string, {width: number; height: number}>();\n private pool: {width: number; height: number; getContext(t: '2d'): Ctx}[] = [];\n\n constructor(public data: J, private host: LottieHost) {\n this.w = data.w; this.h = data.h; this.fr = data.fr || 30; this.ip = data.ip ?? 0; this.op = data.op ?? 60;\n for (const a of data.assets ?? []) this.assets.set(a.id, a);\n }\n get duration() { return (this.op - this.ip) / this.fr; }\n\n async preload() {\n for (const a of this.data.assets ?? []) {\n if (!a.p || a.layers) continue;\n const src = a.e === 1 || String(a.p).startsWith('data:') ? a.p : `${a.u ?? ''}${a.p}`;\n try { this.images.set(a.id, await this.host.image(src)); } catch { /* missing image: skip */ }\n }\n }\n\n private buf(w: number, h: number) {\n const c = this.pool.find((x) => x.width === w && x.height === h);\n if (c) { this.pool.splice(this.pool.indexOf(c), 1); const ctx = c.getContext('2d'); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, w, h); return c; }\n return this.host.createCanvas(w, h);\n }\n private release(c: {width: number; height: number; getContext(t: '2d'): Ctx}) { if (this.pool.length < 8) this.pool.push(c); }\n\n // Draws frame `f` (Lottie frame number) into ctx, in the animation's own w\u00D7h space under the ctx transform.\n draw(ctx: Ctx, f: number) {\n this.drawLayers(ctx, this.data.layers ?? [], f, this.w, this.h);\n }\n\n private layerMatrix(layer: J, byInd: Map<number, J>, f: number, depth = 0): M {\n let m = transformMatrix(layer.ks, f);\n if (layer.parent !== undefined && depth < 30) {\n const p = byInd.get(layer.parent);\n if (p) m = mul(this.layerMatrix(p, byInd, f, depth + 1), m);\n }\n return m;\n }\n\n private drawLayers(ctx: Ctx, layers: J[], f: number, w: number, h: number) {\n const byInd = new Map<number, J>();\n for (const l of layers) if (l.ind !== undefined) byInd.set(l.ind, l);\n const base = ctx.getTransform();\n for (let i = layers.length - 1; i >= 0; i--) {\n const layer = layers[i];\n if (layer.td || layer.hd) continue; // matte sources draw only through the layer below them\n if (f < (layer.ip ?? -Infinity) || f >= (layer.op ?? Infinity)) continue;\n const matte = layer.tt ? layers[i - 1] : null;\n if (!layer.masksProperties?.length && !matte) {\n ctx.save();\n this.drawLayer(ctx, layer, byInd, f, base);\n ctx.restore();\n continue;\n }\n // Masks and mattes: render into full-size buffers in the current device space.\n const W = ctx.canvas.width, H = ctx.canvas.height;\n const b = this.buf(W, H), bc = b.getContext('2d');\n bc.setTransform(base);\n this.drawLayer(bc, layer, byInd, f, base);\n if (layer.masksProperties?.length) this.applyMasks(bc, layer, byInd, f, base, W, H);\n if (matte) {\n const mb = this.buf(W, H), mc = mb.getContext('2d');\n mc.setTransform(base);\n this.drawLayer(mc, matte, byInd, f, base);\n if (layer.tt === 3 || layer.tt === 4) lumaToAlpha(mc, W, H, layer.tt === 4);\n bc.setTransform(1, 0, 0, 1, 0, 0);\n bc.globalCompositeOperation = layer.tt === 2 ? 'destination-out' : 'destination-in';\n bc.drawImage(mb as unknown as CanvasImageSource, 0, 0);\n this.release(mb);\n }\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(b as unknown as CanvasImageSource, 0, 0);\n ctx.restore();\n this.release(b);\n }\n void w; void h;\n }\n\n private applyMasks(bc: Ctx, layer: J, byInd: Map<number, J>, f: number, base: DOMMatrix, W: number, H: number) {\n const m = this.layerMatrix(layer, byInd, f);\n const mk = this.buf(W, H), mc = mk.getContext('2d');\n const masks = layer.masksProperties.filter((x: J) => x.mode !== 'n');\n if (!masks.length) { this.release(mk); return; }\n if (masks[0].mode === 's') { mc.fillStyle = '#000'; mc.fillRect(0, 0, W, H); }\n for (const mask of masks) {\n mc.setTransform(base);\n mc.transform(...m);\n mc.beginPath();\n traceGeo(mc, shapeToGeo(evalProp(mask.pt, f), I));\n const o = num(mask.o, f, 100) / 100;\n mc.fillStyle = `rgba(0,0,0,${o})`;\n if (mask.inv) { mc.rect(-1e5, -1e5, 2e5, 2e5); }\n mc.globalCompositeOperation = mask.mode === 's' ? 'destination-out' : mask.mode === 'i' ? 'destination-in' : 'source-over';\n mc.fill(mask.inv ? 'evenodd' : 'nonzero');\n }\n bc.save();\n bc.setTransform(1, 0, 0, 1, 0, 0);\n bc.globalCompositeOperation = 'destination-in';\n bc.drawImage(mk as unknown as CanvasImageSource, 0, 0);\n bc.restore();\n this.release(mk);\n }\n\n private drawLayer(ctx: Ctx, layer: J, byInd: Map<number, J>, f: number, base: DOMMatrix) {\n const m = this.layerMatrix(layer, byInd, f);\n const alpha = opacityOf(layer.ks, f);\n if (alpha <= 0) return;\n ctx.setTransform(base);\n ctx.globalAlpha *= alpha;\n const lf = (f - (layer.st ?? 0)) / (layer.sr ?? 1);\n switch (layer.ty) {\n case 4: {\n const paints: Paint[] = [];\n collect(layer.shapes ?? [], lf, m, 1, paints, []);\n ctx.setTransform(base);\n paintAll(ctx, paints, lf);\n break;\n }\n case 1: {\n ctx.transform(...m);\n ctx.fillStyle = layer.sc ?? '#000';\n ctx.fillRect(0, 0, layer.sw ?? 0, layer.sh ?? 0);\n break;\n }\n case 2: {\n const img = this.images.get(layer.refId);\n if (img) { ctx.transform(...m); ctx.drawImage(img as unknown as CanvasImageSource, 0, 0); }\n break;\n }\n case 0: {\n const asset = this.assets.get(layer.refId);\n if (!asset?.layers) break;\n ctx.transform(...m);\n ctx.beginPath();\n ctx.rect(0, 0, layer.w ?? this.w, layer.h ?? this.h);\n ctx.clip();\n const tf = layer.tm ? num(layer.tm, lf) * this.fr : lf;\n this.drawLayers(ctx, asset.layers, tf, layer.w, layer.h);\n break;\n }\n case 5: {\n const v = evalProp(layer.t?.d, lf);\n const doc = v?.t !== undefined && typeof v.t === 'string' ? v : v?.s ?? layer.t?.d?.k?.[0]?.s;\n if (!doc?.t) break;\n ctx.transform(...m);\n const font = (this.data.fonts?.list ?? []).find((x: J) => x.fName === doc.f);\n ctx.font = `${font?.fWeight ?? (/bold/i.test(doc.f ?? '') ? 700 : 400)} ${doc.s ?? 24}px \"${font?.fFamily ?? 'Mukta'}\", \"Baloo 2\", sans-serif`;\n ctx.fillStyle = rgba(doc.fc ?? [0, 0, 0], 1);\n ctx.textAlign = (['left', 'right', 'center'] as const)[doc.j ?? 0] ?? 'left';\n // Tracking is in thousandths of an em.\n if ('letterSpacing' in ctx) (ctx as unknown as {letterSpacing: string}).letterSpacing = `${((doc.tr ?? 0) / 1000) * (doc.s ?? 24)}px`;\n const lh = doc.lh ?? (doc.s ?? 24) * 1.2;\n String(doc.t).split(/\\r|\\n/).forEach((line: string, i: number) => ctx.fillText(line, 0, i * lh));\n break;\n }\n default: break;\n }\n }\n}\n\nconst lumaToAlpha = (ctx: Ctx, w: number, h: number, invert: boolean) => {\n const img = ctx.getImageData(0, 0, w, h), d = img.data;\n for (let i = 0; i < d.length; i += 4) {\n const l = ((0.299 * d[i] + 0.587 * d[i + 1] + 0.114 * d[i + 2]) / 255) * (d[i + 3] / 255);\n d[i + 3] = Math.round((invert ? 1 - l : l) * 255);\n }\n ctx.putImageData(img, 0, 0);\n};\n", "// Environment-agnostic compositor: draws a composition at time t onto any Canvas2D context.\n// The same code runs in Node (skia-canvas) for export and in the browser for preview.\nimport {val} from '../core/anim.js';\nimport {parseColor, rgbaString} from '../core/color.js';\nimport type {Composition, Effect, Layer, Project, Vec2, VideoLayer} from '../core/model.js';\nimport {drawText} from '../core/text.js';\nimport {drawShape} from './shapes.js';\nimport {drawWithFx} from './fx.js';\nimport {applyGrade, drawVignette, GRADE_TYPES, preloadLuts} from './grade.js';\nimport {drawPerspective, tiltCorners} from './perspective.js';\nimport {parsePath, tracePath} from '../core/path.js';\nimport {LottiePlayer, type LottieHost} from './lottie.js';\n\ntype Ctx = CanvasRenderingContext2D;\nexport interface CanvasLike { width: number; height: number; getContext(type: '2d'): Ctx }\nexport interface Drawable { width: number; height: number }\n\nexport interface Host {\n createCanvas(w: number, h: number): CanvasLike;\n image(src: string): Promise<Drawable>;\n videoFrame(layer: VideoLayer, sourceTime: number, w: number, h: number, fps: number): Promise<Drawable>;\n // Effects the host applies while decoding video (e.g. static blur in FFmpeg); the renderer skips them.\n bakedVideoEffects?(layer: VideoLayer): Set<Effect>;\n // Text files referenced by layers (Lottie JSON, LUTs).\n data(src: string): Promise<string>;\n defaultFont: string;\n}\n\ntype M = [number, number, number, number, number, number]; // a b c d e f\nconst I: M = [1, 0, 0, 1, 0, 0];\nconst mul = (m: M, n: M): M => [\n m[0] * n[0] + m[2] * n[1], m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3], m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4], m[1] * n[4] + m[3] * n[5] + m[5],\n];\n\nconst BLEND: Record<string, GlobalCompositeOperation> = {\n normal: 'source-over', multiply: 'multiply', screen: 'screen', overlay: 'overlay', add: 'lighter',\n darken: 'darken', lighten: 'lighten', softLight: 'soft-light', difference: 'difference',\n};\n\nexport class Renderer {\n private pool = new Map<string, CanvasLike[]>();\n constructor(public project: Project, public host: Host) {}\n\n comp(id: string): Composition {\n const c = this.project.comps.find((c) => c.id === id);\n if (!c) throw new Error(`Unknown composition \"${id}\"`);\n return c;\n }\n\n private acquire(w: number, h: number): CanvasLike {\n const list = this.pool.get(`${w}x${h}`);\n const c = list?.pop() ?? this.host.createCanvas(w, h);\n const ctx = c.getContext('2d');\n // Pooled canvases come back with whatever state their last user left: reset all of it.\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = 1;\n ctx.filter = 'none';\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.setLineDash([]);\n ctx.clearRect(0, 0, w, h);\n return c;\n }\n private release(c: CanvasLike) {\n const k = `${c.width}x${c.height}`;\n if (!this.pool.has(k)) this.pool.set(k, []);\n this.pool.get(k)!.push(c);\n }\n\n // Natural size of a layer's content in layer space (used for default anchor points).\n layerSize(layer: Layer, comp: Composition, t: number): Vec2 {\n switch (layer.type) {\n case 'solid': return layer.size ?? [comp.width, comp.height];\n case 'image': case 'video': return layer.size ?? [comp.width, comp.height];\n case 'precomp': { const c = this.comp(layer.comp); return [c.width, c.height]; }\n case 'lottie': { const p = this.lotties.get(layer.src); return layer.size ?? (p ? [p.w, p.h] : [comp.width, comp.width]); }\n default: return [0, 0];\n }\n }\n\n // Layer-space \u2192 comp-space matrix, including parents (AE parenting: transform only).\n matrix(layer: Layer, comp: Composition, t: number, depth = 0): M {\n const tr = layer.transform ?? {};\n const size = this.layerSize(layer, comp, t);\n const anchor = val(tr.anchor, t, [size[0] / 2, size[1] / 2] as Vec2);\n const pos = val(tr.position, t, [comp.width / 2, comp.height / 2] as Vec2);\n const [sx, sy] = val(tr.scale, t, [100, 100] as Vec2);\n const rot = (val(tr.rotation, t, 0) * Math.PI) / 180;\n const skew = Math.tan((val(tr.skew, t, 0) * Math.PI) / 180);\n const cos = Math.cos(rot), sin = Math.sin(rot);\n let m: M = [1, 0, 0, 1, pos[0], pos[1]];\n m = mul(m, [cos, sin, -sin, cos, 0, 0]);\n m = mul(m, [1, 0, skew, 1, 0, 0]);\n m = mul(m, [sx / 100, 0, 0, sy / 100, 0, 0]);\n m = mul(m, [1, 0, 0, 1, -anchor[0], -anchor[1]]);\n if (layer.parent && depth < 20) {\n const p = comp.layers.find((l) => l.id === layer.parent);\n if (p) m = mul(this.matrix(p, comp, t, depth + 1), m);\n }\n return m;\n }\n\n // Lottie players, keyed by src; loaded before a frame draws so sizes are known synchronously.\n private lotties = new Map<string, LottiePlayer>();\n private async preload(comp: Composition) {\n for (const l of comp.layers) {\n if (l.type === 'lottie' && !this.lotties.has(l.src)) {\n const p = new LottiePlayer(JSON.parse(await this.host.data(l.src)), this.host as unknown as LottieHost);\n await p.preload();\n this.lotties.set(l.src, p);\n }\n if (l.type === 'precomp') await this.preload(this.comp(l.comp));\n if (l.effects?.some((e) => e.type === 'lut')) await preloadLuts(l.effects, {loadText: (src) => this.host.data(src)});\n }\n }\n\n async renderComp(ctx: Ctx, comp: Composition, t: number, withBackground = true) {\n await this.preload(comp);\n if (withBackground && comp.background) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.fillStyle = comp.background;\n ctx.fillRect(0, 0, comp.width, comp.height);\n ctx.restore();\n }\n const matteSources = new Set(comp.layers.map((l) => l.matte?.layer).filter(Boolean));\n for (let i = comp.layers.length - 1; i >= 0; i--) {\n const layer = comp.layers[i];\n if (layer.hidden || layer.type === 'audio' || layer.type === 'null') continue;\n if (matteSources.has(layer.id)) continue; // mattes only show through the layer that uses them\n if (layer.type === 'adjustment') { this.renderAdjustment(ctx, layer, comp, t); continue; }\n await this.renderLayer(ctx, layer, comp, t);\n }\n }\n\n isActive(layer: Layer, comp: Composition, t: number) {\n return t >= (layer.inPoint ?? 0) && t < (layer.outPoint ?? comp.duration);\n }\n\n async renderLayer(target: Ctx, layer: Layer, comp: Composition, t: number) {\n if (!this.isActive(layer, comp, t)) return;\n const tr = layer.transform ?? {};\n const opacity = val(tr.opacity, t, 100) / 100;\n if (opacity <= 0) return;\n const baked = layer.type === 'video' ? this.host.bakedVideoEffects?.(layer) : undefined;\n const effects = (layer.effects ?? []).filter((e) => !baked?.has(e));\n // Filters and drop shadows can be applied while drawing; only masks, mattes, motion blur,\n // glow and fill need the layer composited in a full-frame buffer first (much slower).\n const direct = !layer.masks?.length && !layer.matte && !layer.motionBlur && effects.every((e) => DIRECT_EFFECTS.has(e.type));\n\n if (direct) {\n target.save();\n target.globalAlpha *= opacity;\n target.globalCompositeOperation = BLEND[layer.blendMode ?? 'normal'];\n const filters = filterString(effects, t);\n if (filters) target.filter = filters;\n this.applyShadow(target, effects, t);\n target.setTransform(...this.matrix(layer, comp, t));\n await this.drawContent(target, layer, comp, t);\n target.restore();\n return;\n }\n\n const buf = this.acquire(comp.width, comp.height);\n const b = buf.getContext('2d');\n if (layer.motionBlur) {\n // Average sub-frame samples across the shutter (AE: 180\u00B0 shutter, ~8-16 samples).\n const n = Math.max(2, layer.motionBlur.samples ?? 8);\n const span = ((layer.motionBlur.shutter ?? 180) / 360) / comp.fps;\n for (let k = 0; k < n; k++) {\n const st = t - span / 2 + (span * k) / (n - 1);\n b.save();\n b.globalAlpha = 1 / (k + 1);\n b.setTransform(...this.matrix(layer, comp, st));\n await this.drawContent(b, layer, comp, st);\n b.restore();\n }\n } else if (effects.some((e) => e.type === 'cornerPin' || e.type === 'tilt')) {\n // Perspective: draw the content flat at its own size, then map it through the corner pin.\n const [w, h] = this.layerSize(layer, comp, t);\n if (w > 0 && h > 0) {\n const src = this.acquire(Math.ceil(w), Math.ceil(h));\n await this.drawContent(src.getContext('2d'), layer, comp, t);\n const pin = effects.find((e) => e.type === 'cornerPin') as Extract<Effect, {type: 'cornerPin'}> | undefined;\n const tilt = effects.find((e) => e.type === 'tilt') as Extract<Effect, {type: 'tilt'}> | undefined;\n const quad = pin\n ? val(pin.corners, t, [[0, 0], [w, 0], [w, h], [0, h]] as [Vec2, Vec2, Vec2, Vec2])\n : tiltCorners(w, h, val(tilt!.rotateX, t, 0), val(tilt!.rotateY, t, 0), val(tilt!.rotateZ, t, 0), tilt!.perspective ?? Math.max(w, h) * 2);\n b.save();\n b.setTransform(...this.matrix(layer, comp, t));\n drawPerspective(b, src as unknown as CanvasImageSource, w, h, quad);\n b.restore();\n this.release(src);\n }\n } else {\n b.save();\n b.setTransform(...this.matrix(layer, comp, t));\n await this.drawContent(b, layer, comp, t);\n b.restore();\n }\n\n if (layer.masks?.length) this.applyMasks(b, layer, comp, t);\n\n for (const e of effects) {\n if (e.type === 'fill') {\n b.save();\n b.globalCompositeOperation = 'source-in';\n b.globalAlpha = val(e.opacity, t, 100) / 100;\n b.fillStyle = e.color;\n b.fillRect(0, 0, comp.width, comp.height);\n b.restore();\n }\n }\n\n this.grade(b, effects, comp, t);\n\n if (layer.matte) {\n const src = comp.layers.find((l) => l.id === layer.matte!.layer);\n if (src) {\n const mb = this.acquire(comp.width, comp.height);\n await this.renderLayer(mb.getContext('2d'), {...src, hidden: false, matte: undefined}, comp, t);\n b.save();\n b.globalCompositeOperation = layer.matte.mode === 'alphaInverted' ? 'destination-out' : 'destination-in';\n b.drawImage(mb as unknown as CanvasImageSource, 0, 0);\n b.restore();\n this.release(mb);\n }\n }\n\n target.save();\n target.setTransform(1, 0, 0, 1, 0, 0);\n target.globalAlpha *= opacity;\n target.globalCompositeOperation = BLEND[layer.blendMode ?? 'normal'];\n const filters = filterString(effects, t);\n if (filters) target.filter = filters;\n this.applyShadow(target, effects, t);\n const glow = effects.find((e) => e.type === 'glow') as Extract<Effect, {type: 'glow'}> | undefined;\n if (glow) {\n const strength = val(glow.strength, t, 100) / 100;\n target.save();\n target.shadowColor = 'transparent';\n target.filter = `blur(${val(glow.radius, t, 24)}px)`;\n target.globalCompositeOperation = 'lighter';\n target.globalAlpha *= strength;\n if (glow.color) {\n const g = this.acquire(comp.width, comp.height);\n const gc = g.getContext('2d');\n gc.drawImage(buf as unknown as CanvasImageSource, 0, 0);\n gc.globalCompositeOperation = 'source-in';\n gc.fillStyle = glow.color;\n gc.fillRect(0, 0, comp.width, comp.height);\n target.drawImage(g as unknown as CanvasImageSource, 0, 0);\n this.release(g);\n } else target.drawImage(buf as unknown as CanvasImageSource, 0, 0);\n target.restore();\n }\n if (!drawWithFx(target, buf, effects, t, comp.fps, (w, h) => this.acquire(w, h), (c) => this.release(c as CanvasLike))) target.drawImage(buf as unknown as CanvasImageSource, 0, 0);\n target.restore();\n this.release(buf);\n }\n\n // Masks are drawn into their own full-frame buffer, then applied with one composite:\n // this also hides everything when a mask has zero size (some backends skip empty paths).\n private applyMasks(b: Ctx, layer: Layer, comp: Composition, t: number) {\n const masks = layer.masks ?? [];\n const m = this.matrix(layer, comp, t);\n const mk = this.acquire(comp.width, comp.height);\n const mc = mk.getContext('2d');\n masks.forEach((mask, i) => {\n mc.save();\n if (i === 0 && mask.inverted) { mc.fillStyle = '#000'; mc.fillRect(0, 0, comp.width, comp.height); }\n mc.setTransform(...m);\n mc.globalCompositeOperation = mask.inverted ? 'destination-out' : 'source-over';\n mc.beginPath();\n if (mask.shape === 'path' && mask.points?.length) {\n mask.points.forEach(([x, y], k) => (k ? mc.lineTo(x, y) : mc.moveTo(x, y)));\n mc.closePath();\n } else if (mask.shape === 'path' && mask.path) tracePath(mc, parsePath(val(mask.path, t, '')));\n else {\n const [x, y, w, h] = val(mask.rect, t, [0, 0, 0, 0] as [number, number, number, number]);\n if (Math.abs(w) > 0.01 && Math.abs(h) > 0.01) {\n if (mask.shape === 'ellipse') mc.ellipse(x + w / 2, y + h / 2, Math.abs(w / 2), Math.abs(h / 2), 0, 0, Math.PI * 2);\n else mc.roundRect(x, y, w, h, mask.radius ?? 0);\n }\n }\n mc.fillStyle = '#000';\n mc.fill();\n mc.restore();\n });\n b.save();\n b.setTransform(1, 0, 0, 1, 0, 0);\n b.globalCompositeOperation = 'destination-in';\n b.drawImage(mk as unknown as CanvasImageSource, 0, 0);\n b.restore();\n this.release(mk);\n }\n\n // Grade effects (curves, wheels, exposure, temperature, LUT) and vignette on a comp-size buffer.\n private grade(b: Ctx, effects: Effect[], comp: Composition, t: number) {\n const grades = effects.filter((e) => GRADE_TYPES.has(e.type)) as Parameters<typeof applyGrade>[3];\n if (grades.length) applyGrade(b, comp.width, comp.height, grades, t);\n for (const e of effects) if (e.type === 'vignette') drawVignette(b, comp.width, comp.height, val(e.amount, t, 50), e.softness, e.color);\n }\n\n // An adjustment layer re-renders everything already drawn below it through its effects.\n private renderAdjustment(target: Ctx, layer: Layer, comp: Composition, t: number) {\n if (!this.isActive(layer, comp, t)) return;\n const opacity = val(layer.transform?.opacity, t, 100) / 100;\n const effects = layer.effects ?? [];\n if (opacity <= 0 || !effects.length) return;\n const W = comp.width, H = comp.height;\n const buf = this.acquire(W, H), b = buf.getContext('2d');\n const filters = filterString(effects, t);\n if (filters) b.filter = filters;\n b.drawImage(target.canvas as unknown as CanvasImageSource, 0, 0);\n b.filter = 'none';\n this.grade(b, effects, comp, t);\n if (layer.masks?.length) this.applyMasks(b, layer, comp, t);\n target.save();\n target.setTransform(1, 0, 0, 1, 0, 0);\n target.globalAlpha *= opacity;\n if (!drawWithFx(target, buf, effects, t, comp.fps, (w, h) => this.acquire(w, h), (c) => this.release(c as CanvasLike))) target.drawImage(buf as unknown as CanvasImageSource, 0, 0);\n target.restore();\n this.release(buf);\n }\n\n private applyShadow(ctx: Ctx, effects: Effect[], t: number) {\n const shadow = effects.find((e) => e.type === 'dropShadow') as Extract<Effect, {type: 'dropShadow'}> | undefined;\n if (!shadow) return;\n const dist = val(shadow.distance, t, 8), ang = ((shadow.angle ?? 135) * Math.PI) / 180;\n const c = parseColor(shadow.color ?? '#000') ?? [0, 0, 0, 1];\n ctx.shadowColor = rgbaString([c[0], c[1], c[2], c[3] * (val(shadow.opacity, t, 60) / 100)]);\n ctx.shadowBlur = val(shadow.blur, t, 16);\n ctx.shadowOffsetX = Math.sin(ang) * dist;\n ctx.shadowOffsetY = -Math.cos(ang) * dist;\n }\n\n private async drawContent(ctx: Ctx, layer: Layer, comp: Composition, t: number) {\n const inP = layer.inPoint ?? 0;\n switch (layer.type) {\n case 'solid': {\n const [w, h] = layer.size ?? [comp.width, comp.height];\n ctx.fillStyle = val(layer.color, t, '#000');\n ctx.fillRect(0, 0, w, h);\n return;\n }\n case 'shape': return drawShape(ctx, layer, t);\n case 'text': return drawText(ctx, layer, t, inP, layer.outPoint ?? comp.duration, this.project.fonts ? Object.keys(this.project.fonts)[0] ?? this.host.defaultFont : this.host.defaultFont);\n case 'image': {\n const img = await this.host.image(layer.src);\n const [w, h] = layer.size ?? [comp.width, comp.height];\n drawFitted(ctx, img, w, h, layer.fit ?? 'cover');\n return;\n }\n case 'video': {\n const [w, h] = layer.size ?? [comp.width, comp.height];\n const srcTime = (layer.trimIn ?? 0) + (t - inP) * (layer.speed ?? 1);\n const frame = await this.host.videoFrame(layer, srcTime, w, h, comp.fps);\n ctx.drawImage(frame as unknown as CanvasImageSource, 0, 0, w, h);\n return;\n }\n case 'lottie': {\n const p = this.lotties.get(layer.src);\n if (!p) return;\n const [w, h] = layer.size ?? [p.w, p.h];\n const s = Math.min(w / p.w, h / p.h);\n const [f0, f1] = layer.frames ?? [p.ip, p.op];\n const span = Math.max(1, f1 - f0);\n let f = ((t - inP) * (layer.speed ?? 1) + (layer.timeOffset ?? 0)) * p.fr;\n f = layer.loop === false ? Math.min(f, span - 0.001) : ((f % span) + span) % span;\n ctx.save();\n ctx.translate((w - p.w * s) / 2, (h - p.h * s) / 2);\n ctx.scale(s, s);\n p.draw(ctx, f0 + f);\n ctx.restore();\n return;\n }\n case 'precomp': {\n const child = this.comp(layer.comp);\n const ct = (t - inP) * (layer.speed ?? 1) + (layer.timeOffset ?? 0);\n const c = this.acquire(child.width, child.height);\n await this.renderComp(c.getContext('2d'), child, ct, true);\n ctx.drawImage(c as unknown as CanvasImageSource, 0, 0);\n this.release(c);\n return;\n }\n }\n }\n}\n\nconst DIRECT_EFFECTS = new Set<Effect['type']>(['blur', 'brightness', 'saturate', 'contrast', 'dropShadow']);\n\nconst filterString = (effects: Effect[], t: number) =>\n effects\n .map((e) => {\n if (e.type === 'blur') { const r = val(e.radius, t, 0); return r > 0.05 ? `blur(${r}px)` : ''; }\n if (e.type === 'brightness') return `brightness(${val(e.amount, t, 100)}%)`;\n if (e.type === 'saturate') return `saturate(${val(e.amount, t, 100)}%)`;\n if (e.type === 'contrast') return `contrast(${val(e.amount, t, 100)}%)`;\n return '';\n })\n .filter(Boolean)\n .join(' ');\n\nconst drawFitted = (ctx: Ctx, img: Drawable, w: number, h: number, fit: 'cover' | 'contain' | 'fill') => {\n if (fit === 'fill') return ctx.drawImage(img as unknown as CanvasImageSource, 0, 0, w, h);\n const s = fit === 'cover' ? Math.max(w / img.width, h / img.height) : Math.min(w / img.width, h / img.height);\n const dw = img.width * s, dh = img.height * s;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, 0, w, h);\n ctx.clip();\n ctx.drawImage(img as unknown as CanvasImageSource, (w - dw) / 2, (h - dh) / 2, dw, dh);\n ctx.restore();\n};\n", "// Layer bounds for selection outlines and click-to-select in the viewer.\nimport {val} from '../../core/anim.js';\nimport type {Composition, Layer, Vec2} from '../../core/model.js';\nimport {displayText, fontString, layoutText} from '../../core/text.js';\nimport type {Renderer} from '../../render/renderer.js';\nimport {pathBounds} from '../../core/path.js';\nimport {shapePath} from '../../render/shapes.js';\n\ntype M = [number, number, number, number, number, number];\nexport const apply = (m: M, [x, y]: Vec2): Vec2 => [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\nexport const invert = (m: M): M | null => {\n const det = m[0] * m[3] - m[1] * m[2];\n if (Math.abs(det) < 1e-9) return null;\n return [m[3] / det, -m[1] / det, -m[2] / det, m[0] / det, (m[2] * m[5] - m[3] * m[4]) / det, (m[1] * m[4] - m[0] * m[5]) / det];\n};\n\n// Content rectangle [x, y, w, h] in layer space.\nexport const layerRect = (layer: Layer, comp: Composition, t: number, r: Renderer, ctx: CanvasRenderingContext2D): [number, number, number, number] | null => {\n switch (layer.type) {\n case 'solid': case 'image': case 'video': case 'precomp': {\n const [w, h] = r.layerSize(layer, comp, t);\n return [0, 0, w, h];\n }\n case 'shape': {\n const b = pathBounds(shapePath(layer, t));\n if (!b) return null;\n const pad = layer.stroke ? val(layer.strokeWidth, t, 4) / 2 + 2 : 0;\n return [b[0] - pad, b[1] - pad, b[2] + pad * 2, b[3] + pad * 2];\n }\n case 'text': {\n const size = val(layer.size, t, 72);\n const L = layoutText(ctx, {...layer, text: displayText(layer, t)}, size, val(layer.tracking, t, 0), fontString(layer, size, r.host.defaultFont));\n const x0 = Math.min(...L.lines.map((l) => l.x));\n return [x0, L.top, L.width, L.height];\n }\n default: return null;\n }\n};\n\nexport const layerQuad = (layer: Layer, comp: Composition, t: number, r: Renderer, ctx: CanvasRenderingContext2D): Vec2[] | null => {\n const rect = layerRect(layer, comp, t, r, ctx);\n if (!rect) return null;\n const m = r.matrix(layer, comp, t) as M;\n const [x, y, w, h] = rect;\n return [apply(m, [x, y]), apply(m, [x + w, y]), apply(m, [x + w, y + h]), apply(m, [x, y + h])];\n};\n\n// Topmost visible layer under a comp-space point.\nexport const hitTest = (pt: Vec2, comp: Composition, t: number, r: Renderer, ctx: CanvasRenderingContext2D): string | null => {\n for (const layer of comp.layers) {\n if (layer.hidden || layer.type === 'audio' || layer.type === 'null' || layer.type === 'adjustment' || !r.isActive(layer, comp, t)) continue;\n const rect = layerRect(layer, comp, t, r, ctx);\n const inv = invert(r.matrix(layer, comp, t) as M);\n if (!rect || !inv) continue;\n const [lx, ly] = apply(inv, pt);\n if (lx >= rect[0] && lx <= rect[0] + rect[2] && ly >= rect[1] && ly <= rect[1] + rect[3]) return layer.id;\n }\n return null;\n};\n", "// Live preview: the shared Renderer drawing into a <canvas>, plus a selection overlay.\nimport {useEffect, useRef, useState} from 'preact/hooks';\nimport {val} from '../../core/anim.js';\nimport {isAnimated, type Vec2} from '../../core/model.js';\nimport {setKeyframe, setProperty} from '../../ops/ops.js';\nimport {Renderer} from '../../render/renderer.js';\nimport {hitTest, layerQuad} from './geometry.js';\nimport {BrowserHost} from './host.js';\nimport {currentComp, dragEnd, dragStart, dragUpdate, getState, setState, snap, useStore} from './store.js';\n\nexport const host = new BrowserHost();\nlet renderer: Renderer | null = null;\n// Frames render off-screen and are shown only when complete (no half-drawn frames while seeking video).\nconst back = document.createElement('canvas');\n\nexport const Viewer = () => {\n const project = useStore((s) => s.project);\n const time = useStore((s) => s.time);\n const compId = useStore((s) => s.comp);\n const selected = useStore((s) => s.layer);\n const playing = useStore((s) => s.playing);\n const wrap = useRef<HTMLDivElement>(null);\n const canvas = useRef<HTMLCanvasElement>(null);\n const overlay = useRef<HTMLCanvasElement>(null);\n const [box, setBox] = useState({w: 400, h: 600});\n const [renderMs, setRenderMs] = useState(0);\n const busy = useRef(false);\n const pending = useRef(false);\n const comp = project?.comps.find((c) => c.id === compId);\n\n // Fit the comp into the available space.\n useEffect(() => {\n const el = wrap.current;\n if (!el) return;\n const ro = new ResizeObserver(() => setBox({w: el.clientWidth - 24, h: el.clientHeight - 24}));\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const scale = comp ? Math.min(box.w / comp.width, box.h / comp.height) : 1;\n\n const draw = async () => {\n if (busy.current) { pending.current = true; return; }\n const s = getState();\n const c = currentComp();\n if (!s.project || !c || !canvas.current) return;\n busy.current = true;\n try {\n if (!renderer) renderer = new Renderer(s.project, host);\n renderer.project = s.project;\n host.playing = s.playing;\n const el = canvas.current;\n if (back.width !== c.width || back.height !== c.height) { back.width = c.width; back.height = c.height; }\n const ctx = back.getContext('2d')!;\n const t0 = performance.now();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, c.width, c.height);\n if (!c.background) { ctx.fillStyle = '#000'; ctx.fillRect(0, 0, c.width, c.height); }\n await renderer.renderComp(ctx, c, s.time);\n host.endFrame();\n if (el.width !== c.width || el.height !== c.height) { el.width = c.width; el.height = c.height; }\n el.getContext('2d')!.drawImage(back, 0, 0);\n el.dataset.time = String(s.time);\n setRenderMs(performance.now() - t0);\n drawOverlay();\n } catch (e) {\n setState({message: `Preview error: ${(e as Error).message}`});\n } finally {\n busy.current = false;\n if (pending.current) { pending.current = false; draw(); }\n }\n };\n\n const drawOverlay = () => {\n const s = getState();\n const c = currentComp();\n const o = overlay.current;\n if (!o || !c || !renderer) return;\n if (o.width !== c.width || o.height !== c.height) { o.width = c.width; o.height = c.height; }\n const ctx = o.getContext('2d')!;\n ctx.clearRect(0, 0, o.width, o.height);\n const layer = c.layers.find((l) => l.id === s.layer);\n if (!layer || s.playing || !renderer.isActive(layer, c, s.time)) return;\n const quad = layerQuad(layer, c, s.time, renderer, ctx);\n const lw = 2 / scale;\n ctx.strokeStyle = '#4da3ff';\n ctx.lineWidth = lw;\n if (quad) {\n ctx.beginPath();\n quad.forEach((p, i) => (i ? ctx.lineTo(...p) : ctx.moveTo(...p)));\n ctx.closePath();\n ctx.stroke();\n }\n const [px, py] = val(layer.transform?.position, s.time, [c.width / 2, c.height / 2] as Vec2);\n ctx.beginPath();\n ctx.arc(px, py, 6 / scale, 0, Math.PI * 2);\n ctx.moveTo(px - 12 / scale, py); ctx.lineTo(px + 12 / scale, py);\n ctx.moveTo(px, py - 12 / scale); ctx.lineTo(px, py + 12 / scale);\n ctx.stroke();\n };\n\n useEffect(() => { draw(); }, [project, time, compId, playing]);\n useEffect(() => { drawOverlay(); }, [selected, scale]);\n\n // Click selects the topmost layer; dragging moves the selected layer (keyframing if animated).\n const toComp = (e: PointerEvent): Vec2 => {\n const r = overlay.current!.getBoundingClientRect();\n return [((e.clientX - r.left) / r.width) * comp!.width, ((e.clientY - r.top) / r.height) * comp!.height];\n };\n const drag = useRef<{start: Vec2; pos: Vec2; layer: string; moved: boolean} | null>(null);\n const onDown = (e: PointerEvent) => {\n if (!comp || !renderer) return;\n const pt = toComp(e);\n const s = getState();\n const ctx = overlay.current!.getContext('2d')!;\n const target = hitTest(pt, comp, s.time, renderer, ctx);\n setState({layer: target, key: null});\n if (!target) return;\n const layer = comp.layers.find((l) => l.id === target)!;\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n drag.current = {start: pt, pos: val(layer.transform?.position, s.time, [comp.width / 2, comp.height / 2] as Vec2), layer: target, moved: false};\n };\n const onMove = (e: PointerEvent) => {\n const d = drag.current;\n if (!d || !comp) return;\n const pt = toComp(e);\n const dx = pt[0] - d.start[0], dy = pt[1] - d.start[1];\n if (!d.moved && Math.hypot(dx, dy) * scale < 3) return;\n if (!d.moved) { d.moved = true; dragStart(); }\n const t = snap(getState().time, comp.fps);\n const next: Vec2 = [Math.round(d.pos[0] + dx), Math.round(d.pos[1] + (e.shiftKey ? 0 : dy))];\n dragUpdate((p) => {\n const layer = p.comps.find((c) => c.id === comp.id)!.layers.find((l) => l.id === d.layer)!;\n if (isAnimated(layer.transform?.position)) setKeyframe(p, d.layer, 'transform.position', t, next);\n else setProperty(p, d.layer, 'transform.position', next);\n });\n };\n const onUp = () => { if (drag.current?.moved) dragEnd(); drag.current = null; };\n\n if (!comp) return <div class=\"viewer\" ref={wrap} />;\n const style = {width: `${comp.width * scale}px`, height: `${comp.height * scale}px`};\n return (\n <div class=\"viewer\" ref={wrap}>\n <div class=\"stage\" style={style}>\n <canvas ref={canvas} class=\"frame\" style={style} />\n <canvas ref={overlay} class=\"overlay\" style={style} onPointerDown={onDown} onPointerMove={onMove} onPointerUp={onUp} />\n </div>\n <div class=\"viewer-info\">{comp.width}\u00D7{comp.height} \u00B7 {Math.round(scale * 100)}% \u00B7 {renderMs.toFixed(0)} ms/frame</div>\n </div>\n );\n};\n", "// DT.ly Studio \u2014 browser preview and timeline editor.\nimport {render} from 'preact';\nimport {useEffect, useState} from 'preact/hooks';\nimport type {NewLayer} from '../../core/model.js';\nimport {addComp, addLayer, addSvg, removeKeyframe, removeLayer, shiftLayer, duplicateLayer, updateLayer} from '../../ops/ops.js';\nimport {PRESETS} from '../../presets/index.js';\nimport {config} from './config.js';\nimport {AudioPreview, loadFonts} from './host.js';\nimport {Inspector} from './Inspector.js';\nimport {connectEvents, currentComp, edit, getState, load, redo, selectedLayer, setState, snap, startRender, undo, useStore} from './store.js';\nimport {keyTimes, Timeline} from './Timeline.js';\nimport {host, Viewer} from './Viewer.js';\nimport './styles.css';\n\nconst audio = new AudioPreview();\n\n// --- playback -------------------------------------------------------------------------------\nlet raf = 0;\nconst play = () => {\n const comp = currentComp();\n if (!comp) return;\n if (getState().time >= comp.duration - 1 / comp.fps) setState({time: 0});\n const start = performance.now() - getState().time * 1000;\n setState({playing: true});\n const tick = (now: number) => {\n const s = getState();\n const c = currentComp();\n if (!s.playing || !c) return;\n let t = (now - start) / 1000;\n if (t >= c.duration) {\n if (s.loop) { t = 0; stop(); setState({time: 0}); play(); return; }\n stop();\n setState({time: snap(c.duration - 1 / c.fps, c.fps)});\n return;\n }\n setState({time: t});\n audio.sync(s.project!, c, t, true);\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n};\nconst stop = () => {\n cancelAnimationFrame(raf);\n const c = currentComp();\n setState({playing: false, time: c ? snap(getState().time, c.fps) : getState().time});\n audio.stop();\n host.stopAll();\n};\nconst toggle = () => (getState().playing ? stop() : play());\n\n// --- adding layers --------------------------------------------------------------------------\nconst addAndSelect = (layer: NewLayer) => {\n const comp = currentComp()!;\n let id = '';\n edit((p) => { id = addLayer(p, comp.id, {inPoint: snap(getState().time, comp.fps), ...layer} as NewLayer).id; });\n if (id) setState({layer: id, key: null});\n};\nconst ADD: Record<string, () => void> = {\n Text: () => addAndSelect({type: 'text', name: 'Text', text: 'Your text', size: Math.round(currentComp()!.width / 10), color: '#ffffff', weight: 800} as NewLayer),\n Shape: () => addAndSelect({type: 'shape', name: 'Shape', shape: 'ellipse', size: [300, 300], fill: '#E8692A'} as NewLayer),\n Solid: () => addAndSelect({type: 'solid', name: 'Solid', color: '#1f2933'} as NewLayer),\n Null: () => addAndSelect({type: 'null', name: 'Null'} as NewLayer),\n 'Adjustment layer (grade)': () => addAndSelect({type: 'adjustment', name: 'Grade', effects: [{type: 'curves', master: [[0, 0], [0.25, 0.2], [0.75, 0.82], [1, 1]]}, {type: 'vignette', amount: 40}]} as NewLayer),\n 'Image / video / audio\u2026': () => {\n const src = prompt('Path to the file, relative to the project file:');\n if (!src) return;\n const type = /\\.(mp4|mov|webm|m4v)$/i.test(src) ? 'video' : /\\.(mp3|wav|m4a|aac|ogg)$/i.test(src) ? 'audio' : 'image';\n addAndSelect({type, name: src.split('/').pop(), src} as NewLayer);\n },\n 'Lottie animation\u2026': () => {\n const src = prompt('Path to the Lottie .json file, relative to the project file:');\n if (src) addAndSelect({type: 'lottie', name: src.split('/').pop()!.replace(/\\.json$/i, ''), src} as NewLayer);\n },\n 'SVG as editable shapes\u2026': async () => {\n const src = prompt('Path to the .svg file, relative to the project file:');\n if (!src) return;\n const r = await fetch(`/api/svg?src=${encodeURIComponent(src)}&token=${config.token}`);\n if (!r.ok) { setState({message: await r.text()}); return; }\n const svg = await r.text();\n const comp = currentComp()!;\n let group = '';\n edit((p) => { group = addSvg(p, comp.id, svg, {name: src.split('/').pop()!.replace(/\\.svg$/i, ''), width: Math.round(comp.width * 0.5), position: [comp.width / 2, comp.height / 2], inPoint: snap(getState().time, comp.fps)}).group; });\n if (group) setState({layer: group, key: null});\n },\n 'New comp (precomp)\u2026': () => {\n const id = prompt('Id for the new composition:');\n if (!id) return;\n const comp = currentComp()!;\n edit((p) => { addComp(p, {id, name: id, duration: comp.duration, width: comp.width, height: comp.height, fps: comp.fps}); });\n addAndSelect({type: 'precomp', name: id, comp: id} as NewLayer);\n },\n};\n\n// --- presets dialog -------------------------------------------------------------------------\nconst PresetDialog = ({onClose}: {onClose: () => void}) => {\n const layer = selectedLayer();\n const [name, setName] = useState(layer?.type === 'text' ? 'text.fadeUp' : 'opener.logoReveal');\n const preset = PRESETS[name];\n const defaults = (n: string) => {\n const p = PRESETS[n];\n if (p.kind === 'text' || n === 'element.highlightWord') return {layer: getState().layer ?? ''};\n if (n === 'opener.logoReveal' || n === 'opener.bars') return {title: 'Your Brand', start: snap(getState().time, 30)};\n if (n === 'kinetic.sequence') return {phrases: ['Make', 'it', 'move'], start: snap(getState().time, 30), style: 'slam'};\n if (n === 'element.lowerThird') return {name: 'Your Name', title: 'Your title', start: snap(getState().time, 30)};\n if (n === 'transition.between') return {from: '', to: '', type: 'push', duration: 0.5};\n if (n === 'slides.slideshow') return {items: [{src: 'photo1.jpg', caption: 'Caption'}], each: 3, transition: 'push'};\n return {};\n };\n const [params, setParams] = useState(JSON.stringify(defaults(name), null, 2));\n const [error, setError] = useState('');\n const groups = ['text', 'kinetic', 'opener', 'slides', 'transition', 'element', 'chart', 'overlay', 'map', 'captions'];\n return (\n <div class=\"modal\" onClick={onClose}>\n <div class=\"dialog\" onClick={(e) => e.stopPropagation()} onKeyDown={(e) => e.stopPropagation()}>\n <div class=\"dialog-list\">\n {groups.map((g) => (\n <div key={g}>\n <div class=\"group\">{g}</div>\n {Object.entries(PRESETS).filter(([, p]) => p.kind === g).map(([n]) => (\n <button key={n} class={n === name ? 'active' : ''} onClick={() => { setName(n); setParams(JSON.stringify(defaults(n), null, 2)); setError(''); }}>{n.split('.')[1]}</button>\n ))}\n </div>\n ))}\n </div>\n <div class=\"dialog-body\">\n <h3>{name}</h3>\n <p>{preset.description}</p>\n <p class=\"hint\">Params: {preset.params}</p>\n <textarea rows={10} value={params} spellcheck={false} onInput={(e) => setParams((e.target as HTMLTextAreaElement).value)} />\n {error && <div class=\"error\">{error}</div>}\n <div class=\"row\">\n <button onClick={onClose}>Cancel</button>\n <button class=\"primary\" onClick={() => {\n try {\n const parsed = JSON.parse(params);\n let created: string[] = [];\n const before = getState().project;\n edit((p) => { created = preset.apply(p, getState().comp, parsed).created; });\n if (getState().project === before) throw new Error(getState().message || 'Preset failed');\n if (created[0]) setState({layer: created[0]});\n onClose();\n } catch (e) { setError((e as Error).message); }\n }}>Apply</button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// --- keyboard -------------------------------------------------------------------------------\nconst onKey = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if (target.closest?.('input, textarea, select')) return;\n const s = getState();\n const comp = currentComp();\n if (!comp) return;\n const mod = e.metaKey || e.ctrlKey;\n const frame = 1 / comp.fps;\n const go = (t: number) => setState({time: Math.max(0, Math.min(comp.duration, snap(t, comp.fps))), playing: false});\n if (e.code === 'Space') { e.preventDefault(); toggle(); }\n else if (mod && e.key.toLowerCase() === 'z') { e.preventDefault(); e.shiftKey ? redo() : undo(); }\n else if (mod && e.key.toLowerCase() === 'y') { e.preventDefault(); redo(); }\n else if (mod && e.key.toLowerCase() === 'd' && s.layer) { e.preventDefault(); edit((p) => { const c = duplicateLayer(p, s.layer!); setState({layer: c.id}); }); }\n else if (e.key === 'ArrowLeft') { e.preventDefault(); go(s.time - frame * (e.shiftKey ? 10 : 1)); }\n else if (e.key === 'ArrowRight') { e.preventDefault(); go(s.time + frame * (e.shiftKey ? 10 : 1)); }\n else if (e.key === 'Home') go(0);\n else if (e.key === 'End') go(comp.duration - frame);\n else if ((e.key === 'j' || e.key === 'k') && s.layer) {\n const ts = keyTimes(s.layer);\n const t = e.key === 'j' ? [...ts].reverse().find((x) => x < s.time - 1e-3) : ts.find((x) => x > s.time + 1e-3);\n if (t !== undefined) go(t);\n }\n else if (e.key === '[' && s.layer) edit((p) => { const l = p.comps.find((c) => c.id === comp.id)!.layers.find((x) => x.id === s.layer)!; shiftLayer(p, s.layer!, snap(s.time, comp.fps) - (l.inPoint ?? 0)); });\n else if (e.key === ']' && s.layer) edit((p) => updateLayer(p, s.layer!, {outPoint: snap(s.time, comp.fps)}));\n else if (e.key === 'Delete' || e.key === 'Backspace') {\n if (s.key) { edit((p) => removeKeyframe(p, s.key!.layer, s.key!.path, s.key!.t)); setState({key: null}); }\n else if (s.layer) { edit((p) => removeLayer(p, s.layer!)); setState({layer: null}); }\n }\n else if (e.key === 'Escape') setState({layer: null, key: null});\n else if (e.key === '=' || e.key === '+') setState({zoom: Math.min(2000, s.zoom * 1.25)});\n else if (e.key === '-') setState({zoom: Math.max(10, s.zoom / 1.25)});\n};\n\n// --- layout ---------------------------------------------------------------------------------\nconst fmtTime = (t: number, fps: number) => {\n const f = Math.round(t * fps);\n const sec = Math.floor(f / fps);\n return `${String(Math.floor(sec / 60)).padStart(2, '0')}:${String(sec % 60).padStart(2, '0')}:${String(f % fps).padStart(2, '0')}`;\n};\n\nconst Transport = () => {\n const time = useStore((s) => s.time);\n const playing = useStore((s) => s.playing);\n const loop = useStore((s) => s.loop);\n const zoom = useStore((s) => s.zoom);\n const comp = currentComp();\n if (!comp) return null;\n return (\n <div class=\"transport\">\n <button title=\"Start (Home)\" onClick={() => setState({time: 0})}>\u23EE</button>\n <button title=\"Previous frame (\u2190)\" onClick={() => setState({time: Math.max(0, snap(time - 1 / comp.fps, comp.fps))})}>\u25C0\uFE0E</button>\n <button class=\"play\" title=\"Play / pause (Space)\" onClick={toggle}>{playing ? '\u275A\u275A' : '\u25B6'}</button>\n <button title=\"Next frame (\u2192)\" onClick={() => setState({time: Math.min(comp.duration, snap(time + 1 / comp.fps, comp.fps))})}>\u25B6\uFE0E</button>\n <button class={loop ? 'on' : ''} title=\"Loop\" onClick={() => setState({loop: !loop})}>\u27F2</button>\n <span class=\"timecode\">{fmtTime(time, comp.fps)}</span>\n <span class=\"muted\">{time.toFixed(2)}s / {comp.duration}s</span>\n <span class=\"spacer\" />\n <span class=\"muted\">Zoom</span>\n <button onClick={() => setState({zoom: Math.max(10, zoom / 1.25)})}>\u2212</button>\n <button onClick={() => setState({zoom: Math.min(2000, zoom * 1.25)})}>+</button>\n </div>\n );\n};\n\nconst TopBar = ({onPresets}: {onPresets: () => void}) => {\n const project = useStore((s) => s.project);\n const compId = useStore((s) => s.comp);\n const status = useStore((s) => s.status);\n const message = useStore((s) => s.message);\n const warnings = useStore((s) => s.warnings);\n const rend = useStore((s) => s.render);\n const [menu, setMenu] = useState(false);\n return (\n <header class=\"topbar\">\n <div class=\"brand\"><b>DT.ly</b> Studio <span class=\"muted\">\u00B7 {config.file}</span></div>\n <nav class=\"comps\">\n {project?.comps.map((c) => (\n <button key={c.id} class={c.id === compId ? 'active' : ''} onClick={() => { stop(); setState({comp: c.id, layer: null, key: null, time: 0}); }}>\n {c.name ?? c.id}{project.root === c.id ? ' \u2605' : ''}\n </button>\n ))}\n </nav>\n <div class=\"actions\">\n <div class=\"menu-wrap\">\n <button onClick={() => setMenu(!menu)}>+ Layer \u25BE</button>\n {menu && <div class=\"menu\" onMouseLeave={() => setMenu(false)}>{Object.entries(ADD).map(([k, fn]) => <button key={k} onClick={() => { setMenu(false); fn(); }}>{k}</button>)}</div>}\n </div>\n <button onClick={onPresets}>Presets\u2026</button>\n <button title=\"Undo (\u2318Z)\" onClick={undo}>\u21B6</button>\n <button title=\"Redo (\u21E7\u2318Z)\" onClick={redo}>\u21B7</button>\n <button class=\"primary\" disabled={rend.active} onClick={() => { stop(); startRender(); }}>\n {rend.active ? `Rendering ${rend.total ? Math.round(((rend.done ?? 0) / rend.total) * 100) : 0}%` : 'Render MP4'}\n </button>\n </div>\n <div class={`status ${status}`} title={warnings.join('\\n')}>\n {message || (status === 'saving' ? 'Saving\u2026' : status === 'error' ? 'Save failed' : status === 'reloaded' ? 'Reloaded from disk' : 'Saved')}\n {warnings.length > 0 && <span class=\"warn\"> \u00B7 {warnings.length} warning{warnings.length > 1 ? 's' : ''}</span>}\n {rend.out && !rend.active && <a href={`/api/media?src=${encodeURIComponent(rend.out)}&token=${config.token}`} target=\"_blank\"> \u00B7 open {rend.out}</a>}\n {rend.error && <span class=\"error\"> \u00B7 render failed: {rend.error}</span>}\n </div>\n </header>\n );\n};\n\nconst App = () => {\n const project = useStore((s) => s.project);\n const [presets, setPresets] = useState(false);\n useEffect(() => {\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n if (!project) return <div class=\"loading\">Loading project\u2026</div>;\n return (\n <div class=\"app\">\n <TopBar onPresets={() => setPresets(true)} />\n <main class=\"workspace\">\n <Viewer />\n <Inspector />\n </main>\n <section class=\"bottom\">\n <Transport />\n <Timeline />\n </section>\n {presets && <PresetDialog onClose={() => setPresets(false)} />}\n </div>\n );\n};\n\n(async () => {\n document.title = `${config.file} \u2014 DT.ly Studio`;\n await load();\n // Fit the whole comp into the timeline width on open.\n const c = currentComp();\n if (c) setState({zoom: Math.max(20, Math.min(400, (window.innerWidth - 260) / c.duration))});\n await loadFonts(getState().project!);\n connectEvents();\n render(<App />, document.getElementById('root')!);\n})();\n\n"],
5
+ "mappings": "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",
6
+ "names": ["options", "vnodeId", "isValidElement", "rerenderQueue", "prevDebounce", "rerenderCount", "depthSort", "EVENT_DISPATCHED", "CAPTURE_REGEX", "eventClock", "eventProxies", "i", "EMPTY_OBJ", "EMPTY_ARR", "MATHML_TOKEN_ELEMENTS", "isArray", "Array", "slice", "assign", "Object", "removeNode", "node", "parentNode", "remove", "createVNode", "type", "props", "key", "ref", "original", "vnode", "__k", "__", "__b", "__e", "__c", "constructor", "__v", "vnodeId", "__i", "__u", "options", "Fragment", "props", "children", "BaseComponent", "context", "this", "__g", "getDomSibling", "vnode", "childIndex", "__", "__i", "sibling", "__k", "length", "__e", "type", "__P", "updateParentDomPointers", "__c", "some", "child", "enqueueRender", "c", "rerenderQueue", "push", "rerenderCount", "prevDebounce", "options", "debounceRendering", "queueMicrotask", "process", "l", "component", "newVNode", "oldVNode", "oldDom", "commitQueue", "refQueue", "parentDom", "sort", "depthSort", "shift", "__v", "assign", "constructor", "undefined", "diff", "__n", "namespaceURI", "__u", "commitRoot", "diffChildren", "renderResult", "newParentVNode", "oldParentVNode", "globalContext", "namespace", "excessDomChildren", "isHydrating", "i", "childVNode", "newDom", "firstChildDom", "result", "oldChildren", "EMPTY_ARR", "newChildrenLength", "constructNewChildrenArray", "EMPTY_OBJ", "ref", "applyRef", "insert", "nextSibling", "skewedIndex", "matchingIndex", "tails", "lisLengths", "hi", "mid", "oldChildrenLength", "remainingOldChildren", "skew", "moved", "newChildren", "Array", "String", "createVNode", "isArray", "__b", "key", "findMatchingIndex", "unmount", "parentVNode", "isMounting", "dom", "next", "parentNode", "nodeType", "moveBefore", "insertBefore", "data", "startsWith", "findMatchingIndex", "childVNode", "oldChildren", "skewedIndex", "remainingOldChildren", "x", "key", "type", "oldVNode", "matched", "__u", "length", "setStyle", "style", "value", "setProperty", "dom", "name", "oldValue", "namespace", "useCapture", "proxy", "cssText", "__e", "eventProxies", "createEventProxy", "__a", "eventClock", "replace", "CAPTURE_REGEX", "slice", "toLowerCase", "addEventListener", "removeEventListener", "e", "removeAttribute", "setAttribute", "eventHandler", "this", "EVENT_DISPATCHED", "options", "event", "diff", "parentDom", "newVNode", "globalContext", "excessDomChildren", "commitQueue", "oldDom", "isHydrating", "refQueue", "tmp", "resumed", "oldCommitQueueLength", "c", "oldProps", "oldState", "snapshot", "newProps", "isClassComponent", "provider", "componentContext", "renderHook", "count", "renderResult", "commentMarkersToFind", "startMarker", "i", "child", "newType", "constructor", "__c", "__z", "nodeType", "rangeEnd", "push", "__b", "outer", "props", "prototype", "render", "contextType", "__", "__g", "BaseComponent", "doRender", "sub", "state", "__n", "__h", "__k", "__s", "getDerivedStateFromProps", "assign", "__v", "componentWillReceiveProps", "shouldComponentUpdate", "some", "vnode", "EMPTY_ARR", "apply", "getDomSibling", "componentWillUpdate", "componentDidUpdate", "componentWillMount", "componentDidMount", "context", "__P", "__r", "getChildContext", "getSnapshotBeforeUpdate", "Fragment", "children", "namespaceURI", "unmount", "diffChildren", "isArray", "removeNode", "then", "indexOf", "undefined", "data", "startsWith", "nextSibling", "markAsForce", "diffElementNodes", "diffed", "start", "nodes", "depth", "commitRoot", "root", "applyRef", "cb", "call", "newHtml", "oldHtml", "newChildren", "inputValue", "checked", "doc", "shouldRevalidateProps", "EMPTY_OBJ", "localName", "ownerDocument", "document", "createTextNode", "createElementNS", "is", "__m", "content", "defaultValue", "childNodes", "attributes", "__html", "innerHTML", "textContent", "MATHML_TOKEN_ELEMENTS", "test", "ref", "owner", "__x", "current", "parentVNode", "skipRemove", "r", "end", "componentWillUnmount", "documentElement", "createVNode", "firstChild", "options", "__e", "error", "vnode", "oldVNode", "errorInfo", "component", "ctor", "handled", "__", "__c", "__g", "constructor", "getDerivedStateFromError", "setState", "componentDidCatch", "e", "rerenderCount", "vnodeId", "isValidElement", "BaseComponent", "prototype", "update", "callback", "s", "this", "__s", "state", "assign", "props", "__v", "__k", "push", "enqueueRender", "forceUpdate", "__h", "render", "Fragment", "rerenderQueue", "depthSort", "a", "b", "__b", "EVENT_DISPATCHED", "Symbol", "CAPTURE_REGEX", "eventClock", "eventProxies", "i", "currentIndex", "currentComponent", "previousComponent", "prevRaf", "ObjectIs", "Object", "is", "currentHook", "afterPaintEffects", "unmountCleanups", "options", "_options", "oldBeforeDiff", "__b", "oldBeforeRender", "__r", "oldAfterDiff", "diffed", "oldCommit", "__c", "oldBeforeUnmount", "unmount", "oldRoot", "__", "getHookState", "index", "type", "__h", "hooks", "__H", "length", "push", "useState", "initialState", "useReducer", "invokeOrReturn", "reducer", "init", "hookState", "_reducer", "action", "currentValue", "__N", "nextValue", "setState", "__f", "prevScu", "shouldComponentUpdate", "p", "s", "c", "this", "updatedHook", "shouldUpdate", "props", "some", "hookItem", "result", "call", "useEffect", "callback", "args", "state", "__s", "argsChanged", "__P", "_pendingArgs", "useRef", "initialValue", "currentHook", "useMemo", "current", "useMemo", "factory", "args", "state", "getHookState", "currentIndex", "argsChanged", "__H", "__", "flushAfterPaintEffects", "component", "unmountCleanups", "shift", "invokeCleanup", "e", "options", "__e", "__", "__P", "__v", "afterPaintEffects", "hooks", "__H", "__h", "some", "invokeEffect", "length", "__b", "vnode", "currentComponent", "oldBeforeDiff", "parentDom", "__k", "__m", "oldRoot", "__r", "oldBeforeRender", "currentIndex", "__c", "previousComponent", "hookItem", "__N", "_pendingArgs", "diffed", "oldAfterDiff", "c", "afterPaint", "push", "commitQueue", "filter", "cb", "oldCommit", "unmount", "oldBeforeUnmount", "hasErrored", "errorParent", "s", "HAS_RAF", "requestAnimationFrame", "afterNextFrame", "callback", "raf", "done", "clearTimeout", "timeout", "cancelAnimationFrame", "setTimeout", "newQueueLength", "prevRaf", "hook", "comp", "cleanup", "argsChanged", "oldArgs", "newArgs", "arg", "index", "ObjectIs", "invokeOrReturn", "f", "isAnimated", "p", "NAMED", "parseColor", "c", "s", "h", "ch", "n", "i", "m", "p", "rgbaString", "r", "g", "b", "a", "parsePath", "d", "out", "tokens", "i", "cmd", "cur", "start", "lastC", "lastQ", "num", "isNum", "rel", "R", "p", "C", "x", "y", "c1", "c2", "q", "rx", "ry", "rot", "large", "sweep", "s", "arcToCubics", "p0", "p1", "deg", "phi", "cos", "sin", "dx", "dy", "x1", "y1", "lam", "sign", "co", "cx1", "cy1", "cx", "cy", "ang", "ux", "uy", "vx", "vy", "t1", "dt", "n", "segs", "step", "k", "pt", "a", "der", "j", "a0", "a1", "e", "d0", "d1", "pathToString", "path", "f", "v", "transformPath", "m", "T", "tracePath", "ctx", "bez", "b", "c", "t", "u", "flatten", "tolerance", "subs", "last", "len", "polyLen", "pts", "closed", "l", "resample", "all", "lens", "total", "seg", "acc", "trimPolylines", "end", "offset", "ranges", "shift", "ra", "rb", "from", "to", "line", "s0", "s1", "at", "area", "morph", "a", "b", "p", "sa", "flatten", "sb", "n", "out", "k", "A", "B", "closed", "pa", "resample", "pb", "area", "best", "bestD", "r", "d", "i", "q", "rotated", "_", "pathBounds", "path", "pts", "s", "xs", "ys", "x", "y", "pointAt", "f", "lens", "total", "mul", "m", "n", "I", "parseXml", "src", "root", "stack", "re", "top", "attrs", "a", "el", "parseTransform", "s", "fn", "args", "r", "c", "s2", "num", "v", "d", "elementPath", "parsePath", "x", "y", "w", "h", "rx", "ry", "cx", "cy", "_", "i", "PAINT_PROPS", "importSvg", "svg", "opts", "vb", "vbW", "vbH", "vbX", "vbY", "targetW", "k", "size", "base", "classes", "gradients", "walkDefs", "sel", "body", "decl", "props", "out", "p", "kk", "color", "opacity", "bbox", "ref", "g", "stops", "st", "sp", "off", "parseColor", "rgbaString", "box", "U", "gt", "T", "ux", "uy", "gx", "gy", "groupName", "layers", "shapes", "index", "visit", "inherited", "mm", "path", "flatten", "baked", "transformPath", "scale", "pathBounds", "fill", "stroke", "pathToString", "OpError", "getComp", "p", "id", "c", "OpError", "findLayer", "layerId", "comp", "index", "l", "allIds", "uniqueId", "base", "ids", "clean", "i", "addComp", "x", "root", "updateComp", "patch", "addLayer", "compId", "layer", "full", "isPlainObject", "v", "deepMerge", "target", "k", "updateLayer", "removeLayer", "moveLayer", "toIndex", "eachKeyframes", "fn", "shiftLayer", "delta", "kfs", "duplicateLayer", "opts", "copy", "splitPath", "path", "s", "getAt", "obj", "o", "setAt", "value", "keys", "TIME_EPS", "setProperty", "setKeyframe", "t", "ease", "cur", "isAnimated", "anchorT", "existing", "a", "b", "removeKeyframe", "moveKeyframe", "from", "to", "setEase", "addSvg", "svg", "layers", "size", "parts", "importSvg", "group", "shapes", "g", "TEXT_ANIMATORS", "PALETTE", "r3", "t", "kf", "k", "v", "ease", "n", "d", "s", "fmtOf", "o", "build", "p", "compId", "group", "parts", "g", "addLayer", "ids", "l", "data", "CHART_PRESETS", "comp", "getComp", "t0", "dur", "stg", "W", "H", "max", "x", "gap", "barW", "base", "fs", "text", "i", "h", "cx", "ts", "color", "min", "pts", "path", "p0", "p1", "p2", "p3", "pt", "D", "th", "total", "a", "acc", "a0", "a1", "centre", "rowH", "y", "track", "size", "r3", "t", "kf", "k", "v", "ease", "n", "d", "s", "ARROW", "FINGER", "APP_PRESETS", "p", "compId", "o", "comp", "getComp", "H", "W", "bezel", "radius", "sw", "sh", "t0", "dur", "id", "uniqueId", "src", "isVideo", "addComp", "inner", "l", "addLayer", "fx", "fy", "tx", "ty", "pts", "a", "b", "style", "size", "created", "position", "pt", "i", "scaleK", "q", "inP", "common", "layer", "path", "e", "c", "r", "time", "s", "m", "parseSubtitles", "src", "cues", "block", "lines", "l", "i", "a", "b", "text", "c", "cuesToWords", "words", "weights", "w", "total", "t", "d", "out", "paginate", "maxWords", "maxChars", "pages", "cur", "len", "ws", "pause", "n", "v", "d", "s", "r3", "t", "CAPTION_PRESETS", "p", "compId", "o", "comp", "getComp", "words", "cues", "parseSubtitles", "cuesToWords", "off", "pages", "paginate", "w", "pos", "size", "style", "created", "page", "i", "start", "next", "end", "text", "layer", "addLayer", "project", "lat", "lon", "z", "s", "sin", "unproject", "x", "y", "n", "fitView", "pts", "w", "h", "pad", "xy", "p", "x0", "x1", "y0", "y1", "cx", "cy", "sw", "sh", "viewToPx", "view", "a", "b", "distanceKm", "dLat", "dLon", "n", "v", "d", "s", "r3", "t", "kf", "k", "ease", "PIN", "MAP_PRESETS", "p", "compId", "o", "comp", "getComp", "route", "bg", "W", "H", "toPx", "viewToPx", "fitView", "pts", "ll", "x", "y", "t0", "dur", "color", "lw", "i", "p0", "p1", "p2", "p3", "q", "created", "group", "addLayer", "groupIndex", "add", "l", "labels", "fs", "pt", "at", "path", "parsePath", "N", "keys", "pointAt", "km", "a", "distanceKm", "num", "v", "d", "str", "r3", "t", "kf", "k", "ease", "PRESETS", "name", "def", "TEXT_ANIMATORS", "p", "_comp", "o", "layer", "findLayer", "OpError", "anims", "a", "compId", "comp", "getComp", "phrases", "pos", "size", "style", "emphasis", "w", "created", "holdLast", "text", "i", "words", "each", "last", "outPoint", "isEmph", "addLayer", "t0", "cx", "cy", "color", "accent", "r", "add", "l", "colors", "dir", "barH", "c", "ts", "items", "td", "ids", "it", "start", "end", "type", "zoomIn", "types", "b", "t1", "t2", "W", "H", "center", "id", "e", "setKeyframe", "updateLayer", "mid", "addFx", "peak", "y", "dur", "x", "bar", "mk", "dy", "delay", "_c", "at", "CHART_PRESETS", "APP_PRESETS", "CAPTION_PRESETS", "MAP_PRESETS", "config", "bezier", "x1", "y1", "x2", "y2", "cx", "bx", "ax", "cy", "by", "ay", "sx", "t", "sy", "dx", "x", "i", "e", "d", "lo", "hi", "CURVES", "cache", "elasticOut", "bounceOut", "spring", "elapsed", "stiffness", "damping", "mass", "w0", "zeta", "wd", "applyEase", "ease", "segSeconds", "pts", "key", "fn", "EASE_NAMES", "pathCache", "parsed", "d", "p", "parsePath", "lerp", "a", "b", "interpolate", "v", "i", "ca", "parseColor", "cb", "rgbaString", "pathToString", "morph", "hash", "n", "x", "noise", "seed", "f", "u", "wiggle", "value", "w", "off", "dim", "evalKeyframes", "kfs", "last", "seg", "applyEase", "val", "fallback", "isAnimated", "sorted", "mediaUrl", "src", "config", "waitFor", "el", "event", "ms", "resolve", "done", "timer", "BrowserHost", "w", "h", "c", "r", "reject", "img", "layer", "sourceTime", "fps", "key", "v", "t", "ctx", "vw", "vh", "fit", "s", "AudioPreview", "project", "comp", "playing", "live", "l", "inP", "outP", "speed", "vol", "val", "k", "loadFonts", "faces", "family", "files", "f", "vnodeId", "createVNode", "type", "props", "key", "isStaticChildren", "__source", "__self", "ref", "i", "normalizedProps", "vnode", "__k", "__", "__b", "__e", "__c", "constructor", "__v", "vnodeId", "__i", "__u", "options", "fmt", "n", "NumberField", "value", "onChange", "onDragStart", "onDragEnd", "step", "min", "max", "title", "editing", "setEditing", "d", "drag", "T", "clamp", "v", "u", "e", "dx", "VecField", "labels", "x", "j", "toHex", "c", "m", "ColorField", "TextField", "multiline", "Select", "options", "state", "listeners", "getState", "setState", "patch", "l", "useStore", "select", "force", "d", "A", "n", "api", "path", "init", "config", "undoStack", "redoStack", "MAX_HISTORY", "saveTimer", "scheduleSave", "save", "r", "rev", "warnings", "edit", "fn", "before", "next", "e", "dragBase", "dragStart", "dragUpdate", "dragEnd", "undo", "prev", "redo", "load", "fromDisk", "project", "comp", "c", "layer", "connectEvents", "es", "startRender", "currentComp", "selectedLayer", "animatedPaths", "out", "walk", "v", "x", "i", "isAnimated", "k", "getPath", "obj", "o", "snap", "t", "fps", "Prop", "layer", "path", "label", "kind", "fallback", "step", "min", "max", "time", "useStore", "s", "comp", "currentComp", "raw", "getPath", "animated", "isAnimated", "value", "val", "t", "snap", "apply", "p", "v", "setKeyframe", "setProperty", "onChange", "dragging", "dragUpdate", "edit", "keys", "k", "onKey", "prev", "next", "toggleWatch", "toggleKey", "removeKeyframe", "u", "NumberField", "dragStart", "dragEnd", "VecField", "ColorField", "setState", "Field", "children", "set", "patch", "updateLayer", "num", "key", "d", "Section", "title", "open", "JsonEditor", "onApply", "rows", "text", "draft", "setDraft", "error", "setError", "A", "e", "KeyPanel", "project", "findLayer", "x", "ease", "mode", "setE", "setEase", "Select", "EASE_NAMES", "m", "EaseGraph", "pts", "i", "y", "applyEase", "defaultAnchor", "c", "getState", "LayerPanel", "others", "l", "idx", "fonts", "TextField", "moveLayer", "duplicateLayer", "removeLayer", "PRESETS", "pr", "name", "CompPanel", "up", "updateComp", "Inspector", "compId", "layerId", "LABEL_W", "TYPE_COLOR", "PROP_LABEL", "path", "ticks", "duration", "zoom", "step", "s", "out", "t", "trackPointer", "move", "done", "up", "keyShape", "k", "Timeline", "project", "useStore", "compId", "time", "sel", "key", "expanded", "tracks", "T", "comp", "c", "u", "width", "fps", "xToTime", "clientX", "r", "snapT", "ct", "getState", "snap", "scrub", "e", "setState", "scrubMove", "barDrag", "layer", "mode", "x0", "inP", "outP", "started", "ev", "dt", "dragStart", "dragUpdate", "p", "target", "shiftLayer", "updateLayer", "dragEnd", "keyDrag", "t0", "to", "moveKeyframe", "addKeyAt", "cur", "getPath", "v", "val", "edit", "setKeyframe", "tickList", "m", "idx", "props", "animatedPaths", "open", "pr", "i", "next", "ki", "active", "keyTimes", "layerId", "findLayer", "a", "b", "segmenter", "graphemes", "s", "g", "fontString", "layer", "size", "fallbackFamily", "layoutCache", "layoutText", "ctx", "tracking", "font", "key", "hit", "sentinel", "advance", "measure", "lineHeight", "rawLines", "para", "cur", "word", "next", "align", "top", "out", "gi", "wi", "line", "li", "w", "x0", "y", "gs", "prefix", "wordStart", "wordText", "flushWord", "endX", "i", "x", "gw", "rank", "n", "order", "seed", "a", "b", "unitState", "animators", "unitIndex", "counts", "lt", "layerDur", "baseColor", "stagger", "dur", "delay", "r", "maxRank", "p", "start", "applyEase", "q", "f", "c0", "parseColor", "c1", "rgbaString", "v", "k", "roundRect", "h", "formatters", "formatValue", "decimals", "fmt", "displayText", "val", "drawText", "source", "t", "inPoint", "outPoint", "color", "L", "px", "py", "reveal", "l", "bw", "bh", "paint", "fill", "kara", "wordState", "span", "finest", "units", "clip", "lineCounts", "u", "lineIdx", "idxInLine", "st", "hl", "spread", "cx", "cy", "K", "parsedCache", "parse", "d", "p", "parsePath", "shapePath", "s", "w", "h", "val", "r", "x", "y", "k", "a", "b", "ro", "ri", "count", "out", "i", "gradient", "ctx", "g", "grad", "c", "drawOnce", "path", "t", "start", "end", "offset", "trimmed", "line", "trimPolylines", "flatten", "tracePath", "drawShape", "rep", "copies", "dx", "dy", "sx", "sy", "ax", "ay", "o0", "o1", "base", "FX_TYPES", "rand", "n", "x", "channel", "src", "acquire", "color", "c", "g", "rgbSplit", "target", "release", "dx", "dy", "r", "b", "drawWithFx", "effects", "t", "fps", "fx", "e", "cur", "temps", "stage", "out", "o", "W", "H", "amp", "val", "wl", "ph", "strip", "y", "amount", "frame", "seed", "k", "hgt", "split", "sg", "amt", "ang", "GRADE_TYPES", "curveTable", "pts", "p", "a", "b", "dx", "m", "sl", "out", "v", "x", "i", "h", "t", "t2", "t3", "lutCache", "parseCube", "text", "size", "min", "max", "values", "raw", "line", "preloadLuts", "effects", "host", "e", "clamp255", "applyGrade", "ctx", "w", "tables", "c", "lut", "lutMix", "k", "val", "tb", "sh", "mid", "hi", "ws", "wh", "wm", "master", "per", "R", "G", "B", "img", "d", "S", "S2", "L", "mix", "inv", "r0v", "g0v", "b0v", "r", "g", "ri", "gi", "bi", "r1", "g1", "b1", "fr", "fg", "fb", "i000", "i100", "i010", "i110", "i001", "i101", "i011", "i111", "c00", "c10", "c01", "c11", "before", "drawVignette", "amount", "softness", "color", "squareToQuad", "x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", "dx1", "dx2", "dx3", "dy1", "dy2", "dy3", "a13", "a23", "den", "a11", "a21", "a31", "a12", "a22", "a32", "u", "v", "w", "drawPerspective", "ctx", "src", "h", "quad", "n", "map", "tri", "s0", "s1", "s2", "d0", "d1", "d2", "a", "c", "d", "e", "f", "cx", "cy", "grow", "p", "vx", "vy", "l", "j", "i", "tiltCorners", "rotX", "rotY", "rotZ", "perspective", "rx", "ry", "rz", "x", "y", "X", "Y", "Z", "z1", "z2", "I", "mul", "m", "n", "apply", "x", "y", "first", "v", "d", "lerpAny", "a", "b", "p", "i", "evalProp", "prop", "f", "k", "kfs", "start", "end", "ox", "oy", "ix", "iy", "applyEase", "c1", "c2", "u", "num", "vec", "rgba", "c", "alpha", "transformMatrix", "tr", "sk", "sa", "si", "opacityOf", "shapeToGeo", "sh", "reverse", "ii", "oo", "ni", "no", "cubics", "P", "j", "segCount", "e", "K", "ellipseGeo", "it", "cx", "cy", "w", "h", "rectGeo", "r", "starGeo", "pts", "rot", "or", "ir", "count", "rr", "traceGeo", "ctx", "g", "s", "trimGeo", "offset", "subs", "last", "t", "total", "s0", "s1", "shift", "ranges", "out", "ra", "rb", "from", "to", "acc", "line", "q", "l", "a0", "a1", "at", "gradientStyle", "x0", "y0", "x1", "y1", "grad", "raw", "alphaAt", "pos", "op", "paintAll", "paints", "kind", "geos", "o", "paintScale", "off", "collect", "items", "gm", "ga", "scale", "local", "localPaints", "trimmed", "copies", "rtr", "base", "so", "eo", "step", "rm", "inv", "invert", "toGroup", "c3", "det", "LottiePlayer", "data", "host", "src", "layer", "byInd", "depth", "layers", "matte", "W", "H", "bc", "mb", "mc", "lumaToAlpha", "mk", "masks", "mask", "lf", "img", "asset", "tf", "doc", "font", "lh", "mul", "m", "n", "BLEND", "Renderer", "project", "host", "id", "c", "w", "h", "ctx", "k", "layer", "comp", "t", "p", "depth", "tr", "size", "anchor", "val", "pos", "sx", "sy", "rot", "skew", "cos", "sin", "l", "LottiePlayer", "e", "preloadLuts", "src", "withBackground", "matteSources", "i", "target", "opacity", "baked", "effects", "DIRECT_EFFECTS", "filters", "filterString", "buf", "b", "span", "st", "pin", "tilt", "quad", "tiltCorners", "drawPerspective", "mb", "glow", "strength", "g", "gc", "drawWithFx", "masks", "mk", "mc", "mask", "x", "y", "tracePath", "parsePath", "grades", "GRADE_TYPES", "applyGrade", "drawVignette", "W", "H", "shadow", "dist", "ang", "parseColor", "rgbaString", "inP", "drawShape", "drawText", "img", "drawFitted", "srcTime", "frame", "s", "f0", "f1", "f", "child", "ct", "r", "fit", "dw", "dh", "apply", "m", "x", "y", "invert", "det", "layerRect", "layer", "comp", "t", "r", "ctx", "w", "h", "b", "pathBounds", "shapePath", "pad", "val", "size", "L", "layoutText", "displayText", "fontString", "l", "layerQuad", "rect", "hitTest", "pt", "inv", "lx", "ly", "host", "BrowserHost", "renderer", "back", "Viewer", "project", "useStore", "s", "time", "compId", "selected", "playing", "wrap", "T", "canvas", "overlay", "box", "setBox", "d", "renderMs", "setRenderMs", "busy", "pending", "comp", "c", "A", "el", "ro", "scale", "draw", "getState", "currentComp", "Renderer", "ctx", "t0", "drawOverlay", "e", "setState", "o", "layer", "l", "quad", "layerQuad", "lw", "p", "i", "px", "py", "val", "toComp", "r", "drag", "onDown", "pt", "target", "hitTest", "onMove", "dx", "dy", "dragStart", "t", "snap", "next", "dragUpdate", "isAnimated", "setKeyframe", "setProperty", "onUp", "dragEnd", "u", "style", "audio", "AudioPreview", "raf", "play", "comp", "currentComp", "getState", "setState", "start", "tick", "now", "c", "t", "stop", "snap", "host", "toggle", "addAndSelect", "layer", "id", "edit", "p", "addLayer", "ADD", "src", "type", "r", "config", "svg", "group", "addSvg", "addComp", "PresetDialog", "onClose", "selectedLayer", "name", "setName", "d", "preset", "PRESETS", "defaults", "n", "params", "setParams", "error", "setError", "u", "e", "g", "parsed", "created", "before", "onKey", "s", "mod", "frame", "go", "redo", "undo", "duplicateLayer", "ts", "keyTimes", "x", "l", "shiftLayer", "updateLayer", "removeKeyframe", "removeLayer", "fmtTime", "fps", "f", "sec", "Transport", "time", "useStore", "playing", "loop", "zoom", "TopBar", "onPresets", "project", "compId", "status", "message", "warnings", "rend", "menu", "setMenu", "k", "fn", "startRender", "App", "presets", "setPresets", "A", "Viewer", "Inspector", "Timeline", "load", "loadFonts", "connectEvents", "J"]
7
7
  }