@rool-dev/app 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.
- package/README.md +306 -0
- package/dist/cli/dev.d.ts +10 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +241 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +22 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +108 -0
- package/dist/cli/publish.d.ts +9 -0
- package/dist/cli/publish.d.ts.map +1 -0
- package/dist/cli/publish.js +213 -0
- package/dist/cli/vite-utils.d.ts +22 -0
- package/dist/cli/vite-utils.d.ts.map +1 -0
- package/dist/cli/vite-utils.js +96 -0
- package/dist/client.d.ts +79 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +235 -0
- package/dist/dev/AppGrid.svelte +246 -0
- package/dist/dev/AppGrid.svelte.d.ts +14 -0
- package/dist/dev/AppGrid.svelte.d.ts.map +1 -0
- package/dist/dev/DevHostController.d.ts +86 -0
- package/dist/dev/DevHostController.d.ts.map +1 -0
- package/dist/dev/DevHostController.js +395 -0
- package/dist/dev/HostShell.svelte +110 -0
- package/dist/dev/HostShell.svelte.d.ts +11 -0
- package/dist/dev/HostShell.svelte.d.ts.map +1 -0
- package/dist/dev/Sidebar.svelte +223 -0
- package/dist/dev/Sidebar.svelte.d.ts +19 -0
- package/dist/dev/Sidebar.svelte.d.ts.map +1 -0
- package/dist/dev/TabBar.svelte +83 -0
- package/dist/dev/TabBar.svelte.d.ts +14 -0
- package/dist/dev/TabBar.svelte.d.ts.map +1 -0
- package/dist/dev/app.css +1 -0
- package/dist/dev/host-shell.d.ts +8 -0
- package/dist/dev/host-shell.d.ts.map +1 -0
- package/dist/dev/host-shell.js +14807 -0
- package/dist/dev/host-shell.js.map +1 -0
- package/dist/dev/vite-env.d.ts +4 -0
- package/dist/host.d.ts +54 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +171 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/manifest.d.ts +35 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +10 -0
- package/dist/protocol.d.ts +46 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +14 -0
- package/dist/reactive.svelte.d.ts +100 -0
- package/dist/reactive.svelte.d.ts.map +1 -0
- package/dist/reactive.svelte.js +267 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-shell.js","sources":["../../../../node_modules/.pnpm/esm-env@1.2.2/node_modules/esm-env/false.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/shared/utils.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/constants.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/shared/errors.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/errors.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/constants.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/warnings.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/equality.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/flags/index.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/context.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/task.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/error-handling.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/status.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/utils.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/batch.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/reactivity/create-subscriber.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/blocks/boundary.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/async.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/deriveds.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/sources.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/proxy.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/operations.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/elements/bindings/shared.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/effects.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/runtime.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/utils.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/elements/events.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/reconciler.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/template.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/render.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/blocks/branches.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/blocks/if.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/blocks/each.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/css.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/shared/attributes.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/elements/class.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/elements/attributes.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/dom/elements/bindings/this.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/store.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/client/reactivity/props.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/index-client.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/version.js","../../../../node_modules/.pnpm/svelte@5.49.1/node_modules/svelte/src/internal/disclose-version.js","../../../sdk/src/event-emitter.ts","../../../sdk/src/auth-browser.ts","../../../sdk/src/auth.ts","../../../../node_modules/.pnpm/fflate@0.8.2/node_modules/fflate/esm/browser.js","../../../sdk/src/graphql.ts","../../../../node_modules/.pnpm/graphql-sse@2.6.0_graphql@16.12.0/node_modules/graphql-sse/lib/utils.mjs","../../../../node_modules/.pnpm/graphql-sse@2.6.0_graphql@16.12.0/node_modules/graphql-sse/lib/common.mjs","../../../../node_modules/.pnpm/graphql-sse@2.6.0_graphql@16.12.0/node_modules/graphql-sse/lib/parser.mjs","../../../../node_modules/.pnpm/graphql-sse@2.6.0_graphql@16.12.0/node_modules/graphql-sse/lib/client.mjs","../../../sdk/src/subscription.ts","../../../sdk/src/media.ts","../../../sdk/src/apps.ts","../../../sdk/src/channel.ts","../../../sdk/src/space.ts","../../../sdk/src/logger.ts","../../../sdk/src/client.ts","../../src/protocol.ts","../../src/host.ts","../../src/manifest.ts","../../src/dev/DevHostController.ts","../../src/dev/Sidebar.svelte","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/utils.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/gridstack-engine.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/types.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-manager.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-touch.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-resizable-handle.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-base-impl.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-resizable.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-draggable.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-droppable.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-element.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/dd-gridstack.js","../../../../node_modules/.pnpm/gridstack@12.4.2/node_modules/gridstack/dist/gridstack.js","../../src/dev/AppGrid.svelte","../../src/dev/HostShell.svelte","../../src/dev/host-shell.ts"],"sourcesContent":["export default false;\n","// Store the references to globals in case someone tries to monkey patch these, causing the below\n// to de-opt (this occurs often when using popular extensions).\nexport var is_array = Array.isArray;\nexport var index_of = Array.prototype.indexOf;\nexport var includes = Array.prototype.includes;\nexport var array_from = Array.from;\nexport var object_keys = Object.keys;\nexport var define_property = Object.defineProperty;\nexport var get_descriptor = Object.getOwnPropertyDescriptor;\nexport var get_descriptors = Object.getOwnPropertyDescriptors;\nexport var object_prototype = Object.prototype;\nexport var array_prototype = Array.prototype;\nexport var get_prototype_of = Object.getPrototypeOf;\nexport var is_extensible = Object.isExtensible;\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\nexport const noop = () => {};\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n\n/**\n * @template [T=any]\n * @param {any} value\n * @returns {value is PromiseLike<T>}\n */\nexport function is_promise(value) {\n\treturn typeof value?.then === 'function';\n}\n\n/** @param {Function} fn */\nexport function run(fn) {\n\treturn fn();\n}\n\n/** @param {Array<() => void>} arr */\nexport function run_all(arr) {\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tarr[i]();\n\t}\n}\n\n/**\n * TODO replace with Promise.withResolvers once supported widely enough\n * @template [T=void]\n */\nexport function deferred() {\n\t/** @type {(value: T) => void} */\n\tvar resolve;\n\n\t/** @type {(reason: any) => void} */\n\tvar reject;\n\n\t/** @type {Promise<T>} */\n\tvar promise = new Promise((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\n\t// @ts-expect-error\n\treturn { promise, resolve, reject };\n}\n\n/**\n * @template V\n * @param {V} value\n * @param {V | (() => V)} fallback\n * @param {boolean} [lazy]\n * @returns {V}\n */\nexport function fallback(value, fallback, lazy = false) {\n\treturn value === undefined\n\t\t? lazy\n\t\t\t? /** @type {() => V} */ (fallback)()\n\t\t\t: /** @type {V} */ (fallback)\n\t\t: value;\n}\n\n/**\n * When encountering a situation like `let [a, b, c] = $derived(blah())`,\n * we need to stash an intermediate value that `a`, `b`, and `c` derive\n * from, in case it's an iterable\n * @template T\n * @param {ArrayLike<T> | Iterable<T>} value\n * @param {number} [n]\n * @returns {Array<T>}\n */\nexport function to_array(value, n) {\n\t// return arrays unchanged\n\tif (Array.isArray(value)) {\n\t\treturn value;\n\t}\n\n\t// if value is not iterable, or `n` is unspecified (indicates a rest\n\t// element, which means we're not concerned about unbounded iterables)\n\t// convert to an array with `Array.from`\n\tif (n === undefined || !(Symbol.iterator in value)) {\n\t\treturn Array.from(value);\n\t}\n\n\t// otherwise, populate an array with `n` values\n\n\t/** @type {T[]} */\n\tconst array = [];\n\n\tfor (const element of value) {\n\t\tarray.push(element);\n\t\tif (array.length === n) break;\n\t}\n\n\treturn array;\n}\n","// General flags\nexport const DERIVED = 1 << 1;\nexport const EFFECT = 1 << 2;\nexport const RENDER_EFFECT = 1 << 3;\n/**\n * An effect that does not destroy its child effects when it reruns.\n * Runs as part of render effects, i.e. not eagerly as part of tree traversal or effect flushing.\n */\nexport const MANAGED_EFFECT = 1 << 24;\n/**\n * An effect that does not destroy its child effects when it reruns (like MANAGED_EFFECT).\n * Runs eagerly as part of tree traversal or effect flushing.\n */\nexport const BLOCK_EFFECT = 1 << 4;\nexport const BRANCH_EFFECT = 1 << 5;\nexport const ROOT_EFFECT = 1 << 6;\nexport const BOUNDARY_EFFECT = 1 << 7;\n/**\n * Indicates that a reaction is connected to an effect root — either it is an effect,\n * or it is a derived that is depended on by at least one effect. If a derived has\n * no dependents, we can disconnect it from the graph, allowing it to either be\n * GC'd or reconnected later if an effect comes to depend on it again\n */\nexport const CONNECTED = 1 << 9;\nexport const CLEAN = 1 << 10;\nexport const DIRTY = 1 << 11;\nexport const MAYBE_DIRTY = 1 << 12;\nexport const INERT = 1 << 13;\nexport const DESTROYED = 1 << 14;\n\n// Flags exclusive to effects\n/** Set once an effect that should run synchronously has run */\nexport const EFFECT_RAN = 1 << 15;\n/**\n * 'Transparent' effects do not create a transition boundary.\n * This is on a block effect 99% of the time but may also be on a branch effect if its parent block effect was pruned\n */\nexport const EFFECT_TRANSPARENT = 1 << 16;\nexport const EAGER_EFFECT = 1 << 17;\nexport const HEAD_EFFECT = 1 << 18;\nexport const EFFECT_PRESERVED = 1 << 19;\nexport const USER_EFFECT = 1 << 20;\nexport const EFFECT_OFFSCREEN = 1 << 25;\n\n// Flags exclusive to deriveds\n/**\n * Tells that we marked this derived and its reactions as visited during the \"mark as (maybe) dirty\"-phase.\n * Will be lifted during execution of the derived and during checking its dirty state (both are necessary\n * because a derived might be checked but not executed).\n */\nexport const WAS_MARKED = 1 << 15;\n\n// Flags used for async\nexport const REACTION_IS_UPDATING = 1 << 21;\nexport const ASYNC = 1 << 22;\n\nexport const ERROR_VALUE = 1 << 23;\n\nexport const STATE_SYMBOL = Symbol('$state');\nexport const LEGACY_PROPS = Symbol('legacy props');\nexport const LOADING_ATTR_SYMBOL = Symbol('');\nexport const PROXY_PATH_SYMBOL = Symbol('proxy path');\n\n/** allow users to ignore aborted signal errors if `reason.name === 'StaleReactionError` */\nexport const STALE_REACTION = new (class StaleReactionError extends Error {\n\tname = 'StaleReactionError';\n\tmessage = 'The reaction that called `getAbortSignal()` was re-run or destroyed';\n})();\n\nexport const ELEMENT_NODE = 1;\nexport const TEXT_NODE = 3;\nexport const COMMENT_NODE = 8;\nexport const DOCUMENT_FRAGMENT_NODE = 11;\n","/* This file is generated by scripts/process-messages/index.js. Do not edit! */\n\nimport { DEV } from 'esm-env';\n\n/**\n * Cannot use `%name%(...)` unless the `experimental.async` compiler option is `true`\n * @param {string} name\n * @returns {never}\n */\nexport function experimental_async_required(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`experimental_async_required\\nCannot use \\`${name}(...)\\` unless the \\`experimental.async\\` compiler option is \\`true\\`\\nhttps://svelte.dev/e/experimental_async_required`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/experimental_async_required`);\n\t}\n}\n\n/**\n * Cannot use `{@render children(...)}` if the parent component uses `let:` directives. Consider using a named snippet instead\n * @returns {never}\n */\nexport function invalid_default_snippet() {\n\tif (DEV) {\n\t\tconst error = new Error(`invalid_default_snippet\\nCannot use \\`{@render children(...)}\\` if the parent component uses \\`let:\\` directives. Consider using a named snippet instead\\nhttps://svelte.dev/e/invalid_default_snippet`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/invalid_default_snippet`);\n\t}\n}\n\n/**\n * A snippet function was passed invalid arguments. Snippets should only be instantiated via `{@render ...}`\n * @returns {never}\n */\nexport function invalid_snippet_arguments() {\n\tif (DEV) {\n\t\tconst error = new Error(`invalid_snippet_arguments\\nA snippet function was passed invalid arguments. Snippets should only be instantiated via \\`{@render ...}\\`\\nhttps://svelte.dev/e/invalid_snippet_arguments`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/invalid_snippet_arguments`);\n\t}\n}\n\n/**\n * `%name%(...)` can only be used during component initialisation\n * @param {string} name\n * @returns {never}\n */\nexport function lifecycle_outside_component(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`lifecycle_outside_component\\n\\`${name}(...)\\` can only be used during component initialisation\\nhttps://svelte.dev/e/lifecycle_outside_component`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/lifecycle_outside_component`);\n\t}\n}\n\n/**\n * Context was not set in a parent component\n * @returns {never}\n */\nexport function missing_context() {\n\tif (DEV) {\n\t\tconst error = new Error(`missing_context\\nContext was not set in a parent component\\nhttps://svelte.dev/e/missing_context`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/missing_context`);\n\t}\n}\n\n/**\n * Attempted to render a snippet without a `{@render}` block. This would cause the snippet code to be stringified instead of its content being rendered to the DOM. To fix this, change `{snippet}` to `{@render snippet()}`.\n * @returns {never}\n */\nexport function snippet_without_render_tag() {\n\tif (DEV) {\n\t\tconst error = new Error(`snippet_without_render_tag\\nAttempted to render a snippet without a \\`{@render}\\` block. This would cause the snippet code to be stringified instead of its content being rendered to the DOM. To fix this, change \\`{snippet}\\` to \\`{@render snippet()}\\`.\\nhttps://svelte.dev/e/snippet_without_render_tag`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/snippet_without_render_tag`);\n\t}\n}\n\n/**\n * `%name%` is not a store with a `subscribe` method\n * @param {string} name\n * @returns {never}\n */\nexport function store_invalid_shape(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`store_invalid_shape\\n\\`${name}\\` is not a store with a \\`subscribe\\` method\\nhttps://svelte.dev/e/store_invalid_shape`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/store_invalid_shape`);\n\t}\n}\n\n/**\n * The `this` prop on `<svelte:element>` must be a string, if defined\n * @returns {never}\n */\nexport function svelte_element_invalid_this_value() {\n\tif (DEV) {\n\t\tconst error = new Error(`svelte_element_invalid_this_value\\nThe \\`this\\` prop on \\`<svelte:element>\\` must be a string, if defined\\nhttps://svelte.dev/e/svelte_element_invalid_this_value`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/svelte_element_invalid_this_value`);\n\t}\n}","/* This file is generated by scripts/process-messages/index.js. Do not edit! */\n\nimport { DEV } from 'esm-env';\n\nexport * from '../shared/errors.js';\n\n/**\n * Cannot create a `$derived(...)` with an `await` expression outside of an effect tree\n * @returns {never}\n */\nexport function async_derived_orphan() {\n\tif (DEV) {\n\t\tconst error = new Error(`async_derived_orphan\\nCannot create a \\`$derived(...)\\` with an \\`await\\` expression outside of an effect tree\\nhttps://svelte.dev/e/async_derived_orphan`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/async_derived_orphan`);\n\t}\n}\n\n/**\n * Using `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\n * @returns {never}\n */\nexport function bind_invalid_checkbox_value() {\n\tif (DEV) {\n\t\tconst error = new Error(`bind_invalid_checkbox_value\\nUsing \\`bind:value\\` together with a checkbox input is not allowed. Use \\`bind:checked\\` instead\\nhttps://svelte.dev/e/bind_invalid_checkbox_value`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/bind_invalid_checkbox_value`);\n\t}\n}\n\n/**\n * Component %component% has an export named `%key%` that a consumer component is trying to access using `bind:%key%`, which is disallowed. Instead, use `bind:this` (e.g. `<%name% bind:this={component} />`) and then access the property on the bound component instance (e.g. `component.%key%`)\n * @param {string} component\n * @param {string} key\n * @param {string} name\n * @returns {never}\n */\nexport function bind_invalid_export(component, key, name) {\n\tif (DEV) {\n\t\tconst error = new Error(`bind_invalid_export\\nComponent ${component} has an export named \\`${key}\\` that a consumer component is trying to access using \\`bind:${key}\\`, which is disallowed. Instead, use \\`bind:this\\` (e.g. \\`<${name} bind:this={component} />\\`) and then access the property on the bound component instance (e.g. \\`component.${key}\\`)\\nhttps://svelte.dev/e/bind_invalid_export`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/bind_invalid_export`);\n\t}\n}\n\n/**\n * A component is attempting to bind to a non-bindable property `%key%` belonging to %component% (i.e. `<%name% bind:%key%={...}>`). To mark a property as bindable: `let { %key% = $bindable() } = $props()`\n * @param {string} key\n * @param {string} component\n * @param {string} name\n * @returns {never}\n */\nexport function bind_not_bindable(key, component, name) {\n\tif (DEV) {\n\t\tconst error = new Error(`bind_not_bindable\\nA component is attempting to bind to a non-bindable property \\`${key}\\` belonging to ${component} (i.e. \\`<${name} bind:${key}={...}>\\`). To mark a property as bindable: \\`let { ${key} = $bindable() } = $props()\\`\\nhttps://svelte.dev/e/bind_not_bindable`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/bind_not_bindable`);\n\t}\n}\n\n/**\n * Calling `%method%` on a component instance (of %component%) is no longer valid in Svelte 5\n * @param {string} method\n * @param {string} component\n * @returns {never}\n */\nexport function component_api_changed(method, component) {\n\tif (DEV) {\n\t\tconst error = new Error(`component_api_changed\\nCalling \\`${method}\\` on a component instance (of ${component}) is no longer valid in Svelte 5\\nhttps://svelte.dev/e/component_api_changed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/component_api_changed`);\n\t}\n}\n\n/**\n * Attempted to instantiate %component% with `new %name%`, which is no longer valid in Svelte 5. If this component is not under your control, set the `compatibility.componentApi` compiler option to `4` to keep it working.\n * @param {string} component\n * @param {string} name\n * @returns {never}\n */\nexport function component_api_invalid_new(component, name) {\n\tif (DEV) {\n\t\tconst error = new Error(`component_api_invalid_new\\nAttempted to instantiate ${component} with \\`new ${name}\\`, which is no longer valid in Svelte 5. If this component is not under your control, set the \\`compatibility.componentApi\\` compiler option to \\`4\\` to keep it working.\\nhttps://svelte.dev/e/component_api_invalid_new`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/component_api_invalid_new`);\n\t}\n}\n\n/**\n * A derived value cannot reference itself recursively\n * @returns {never}\n */\nexport function derived_references_self() {\n\tif (DEV) {\n\t\tconst error = new Error(`derived_references_self\\nA derived value cannot reference itself recursively\\nhttps://svelte.dev/e/derived_references_self`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/derived_references_self`);\n\t}\n}\n\n/**\n * Keyed each block has duplicate key `%value%` at indexes %a% and %b%\n * @param {string} a\n * @param {string} b\n * @param {string | undefined | null} [value]\n * @returns {never}\n */\nexport function each_key_duplicate(a, b, value) {\n\tif (DEV) {\n\t\tconst error = new Error(`each_key_duplicate\\n${value\n\t\t\t? `Keyed each block has duplicate key \\`${value}\\` at indexes ${a} and ${b}`\n\t\t\t: `Keyed each block has duplicate key at indexes ${a} and ${b}`}\\nhttps://svelte.dev/e/each_key_duplicate`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/each_key_duplicate`);\n\t}\n}\n\n/**\n * `%rune%` cannot be used inside an effect cleanup function\n * @param {string} rune\n * @returns {never}\n */\nexport function effect_in_teardown(rune) {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_in_teardown\\n\\`${rune}\\` cannot be used inside an effect cleanup function\\nhttps://svelte.dev/e/effect_in_teardown`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_in_teardown`);\n\t}\n}\n\n/**\n * Effect cannot be created inside a `$derived` value that was not itself created inside an effect\n * @returns {never}\n */\nexport function effect_in_unowned_derived() {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_in_unowned_derived\\nEffect cannot be created inside a \\`$derived\\` value that was not itself created inside an effect\\nhttps://svelte.dev/e/effect_in_unowned_derived`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_in_unowned_derived`);\n\t}\n}\n\n/**\n * `%rune%` can only be used inside an effect (e.g. during component initialisation)\n * @param {string} rune\n * @returns {never}\n */\nexport function effect_orphan(rune) {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_orphan\\n\\`${rune}\\` can only be used inside an effect (e.g. during component initialisation)\\nhttps://svelte.dev/e/effect_orphan`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_orphan`);\n\t}\n}\n\n/**\n * `$effect.pending()` can only be called inside an effect or derived\n * @returns {never}\n */\nexport function effect_pending_outside_reaction() {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_pending_outside_reaction\\n\\`$effect.pending()\\` can only be called inside an effect or derived\\nhttps://svelte.dev/e/effect_pending_outside_reaction`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_pending_outside_reaction`);\n\t}\n}\n\n/**\n * Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state\n * @returns {never}\n */\nexport function effect_update_depth_exceeded() {\n\tif (DEV) {\n\t\tconst error = new Error(`effect_update_depth_exceeded\\nMaximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state\\nhttps://svelte.dev/e/effect_update_depth_exceeded`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/effect_update_depth_exceeded`);\n\t}\n}\n\n/**\n * Cannot use `flushSync` inside an effect\n * @returns {never}\n */\nexport function flush_sync_in_effect() {\n\tif (DEV) {\n\t\tconst error = new Error(`flush_sync_in_effect\\nCannot use \\`flushSync\\` inside an effect\\nhttps://svelte.dev/e/flush_sync_in_effect`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/flush_sync_in_effect`);\n\t}\n}\n\n/**\n * Cannot commit a fork that was already discarded\n * @returns {never}\n */\nexport function fork_discarded() {\n\tif (DEV) {\n\t\tconst error = new Error(`fork_discarded\\nCannot commit a fork that was already discarded\\nhttps://svelte.dev/e/fork_discarded`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/fork_discarded`);\n\t}\n}\n\n/**\n * Cannot create a fork inside an effect or when state changes are pending\n * @returns {never}\n */\nexport function fork_timing() {\n\tif (DEV) {\n\t\tconst error = new Error(`fork_timing\\nCannot create a fork inside an effect or when state changes are pending\\nhttps://svelte.dev/e/fork_timing`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/fork_timing`);\n\t}\n}\n\n/**\n * `getAbortSignal()` can only be called inside an effect or derived\n * @returns {never}\n */\nexport function get_abort_signal_outside_reaction() {\n\tif (DEV) {\n\t\tconst error = new Error(`get_abort_signal_outside_reaction\\n\\`getAbortSignal()\\` can only be called inside an effect or derived\\nhttps://svelte.dev/e/get_abort_signal_outside_reaction`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/get_abort_signal_outside_reaction`);\n\t}\n}\n\n/**\n * Expected to find a hydratable with key `%key%` during hydration, but did not.\n * @param {string} key\n * @returns {never}\n */\nexport function hydratable_missing_but_required(key) {\n\tif (DEV) {\n\t\tconst error = new Error(`hydratable_missing_but_required\\nExpected to find a hydratable with key \\`${key}\\` during hydration, but did not.\\nhttps://svelte.dev/e/hydratable_missing_but_required`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/hydratable_missing_but_required`);\n\t}\n}\n\n/**\n * Failed to hydrate the application\n * @returns {never}\n */\nexport function hydration_failed() {\n\tif (DEV) {\n\t\tconst error = new Error(`hydration_failed\\nFailed to hydrate the application\\nhttps://svelte.dev/e/hydration_failed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/hydration_failed`);\n\t}\n}\n\n/**\n * Could not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\n * @returns {never}\n */\nexport function invalid_snippet() {\n\tif (DEV) {\n\t\tconst error = new Error(`invalid_snippet\\nCould not \\`{@render}\\` snippet due to the expression being \\`null\\` or \\`undefined\\`. Consider using optional chaining \\`{@render snippet?.()}\\`\\nhttps://svelte.dev/e/invalid_snippet`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/invalid_snippet`);\n\t}\n}\n\n/**\n * `%name%(...)` cannot be used in runes mode\n * @param {string} name\n * @returns {never}\n */\nexport function lifecycle_legacy_only(name) {\n\tif (DEV) {\n\t\tconst error = new Error(`lifecycle_legacy_only\\n\\`${name}(...)\\` cannot be used in runes mode\\nhttps://svelte.dev/e/lifecycle_legacy_only`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/lifecycle_legacy_only`);\n\t}\n}\n\n/**\n * Cannot do `bind:%key%={undefined}` when `%key%` has a fallback value\n * @param {string} key\n * @returns {never}\n */\nexport function props_invalid_value(key) {\n\tif (DEV) {\n\t\tconst error = new Error(`props_invalid_value\\nCannot do \\`bind:${key}={undefined}\\` when \\`${key}\\` has a fallback value\\nhttps://svelte.dev/e/props_invalid_value`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/props_invalid_value`);\n\t}\n}\n\n/**\n * Rest element properties of `$props()` such as `%property%` are readonly\n * @param {string} property\n * @returns {never}\n */\nexport function props_rest_readonly(property) {\n\tif (DEV) {\n\t\tconst error = new Error(`props_rest_readonly\\nRest element properties of \\`$props()\\` such as \\`${property}\\` are readonly\\nhttps://svelte.dev/e/props_rest_readonly`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/props_rest_readonly`);\n\t}\n}\n\n/**\n * The `%rune%` rune is only available inside `.svelte` and `.svelte.js/ts` files\n * @param {string} rune\n * @returns {never}\n */\nexport function rune_outside_svelte(rune) {\n\tif (DEV) {\n\t\tconst error = new Error(`rune_outside_svelte\\nThe \\`${rune}\\` rune is only available inside \\`.svelte\\` and \\`.svelte.js/ts\\` files\\nhttps://svelte.dev/e/rune_outside_svelte`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/rune_outside_svelte`);\n\t}\n}\n\n/**\n * `setContext` must be called when a component first initializes, not in a subsequent effect or after an `await` expression\n * @returns {never}\n */\nexport function set_context_after_init() {\n\tif (DEV) {\n\t\tconst error = new Error(`set_context_after_init\\n\\`setContext\\` must be called when a component first initializes, not in a subsequent effect or after an \\`await\\` expression\\nhttps://svelte.dev/e/set_context_after_init`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/set_context_after_init`);\n\t}\n}\n\n/**\n * Property descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\n * @returns {never}\n */\nexport function state_descriptors_fixed() {\n\tif (DEV) {\n\t\tconst error = new Error(`state_descriptors_fixed\\nProperty descriptors defined on \\`$state\\` objects must contain \\`value\\` and always be \\`enumerable\\`, \\`configurable\\` and \\`writable\\`.\\nhttps://svelte.dev/e/state_descriptors_fixed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/state_descriptors_fixed`);\n\t}\n}\n\n/**\n * Cannot set prototype of `$state` object\n * @returns {never}\n */\nexport function state_prototype_fixed() {\n\tif (DEV) {\n\t\tconst error = new Error(`state_prototype_fixed\\nCannot set prototype of \\`$state\\` object\\nhttps://svelte.dev/e/state_prototype_fixed`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/state_prototype_fixed`);\n\t}\n}\n\n/**\n * Updating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\n * @returns {never}\n */\nexport function state_unsafe_mutation() {\n\tif (DEV) {\n\t\tconst error = new Error(`state_unsafe_mutation\\nUpdating state inside \\`$derived(...)\\`, \\`$inspect(...)\\` or a template expression is forbidden. If the value should not be reactive, declare it without \\`$state\\`\\nhttps://svelte.dev/e/state_unsafe_mutation`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/state_unsafe_mutation`);\n\t}\n}\n\n/**\n * A `<svelte:boundary>` `reset` function cannot be called while an error is still being handled\n * @returns {never}\n */\nexport function svelte_boundary_reset_onerror() {\n\tif (DEV) {\n\t\tconst error = new Error(`svelte_boundary_reset_onerror\\nA \\`<svelte:boundary>\\` \\`reset\\` function cannot be called while an error is still being handled\\nhttps://svelte.dev/e/svelte_boundary_reset_onerror`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`);\n\t}\n}","export const EACH_ITEM_REACTIVE = 1;\nexport const EACH_INDEX_REACTIVE = 1 << 1;\n/** See EachBlock interface metadata.is_controlled for an explanation what this is */\nexport const EACH_IS_CONTROLLED = 1 << 2;\nexport const EACH_IS_ANIMATED = 1 << 3;\nexport const EACH_ITEM_IMMUTABLE = 1 << 4;\n\nexport const PROPS_IS_IMMUTABLE = 1;\nexport const PROPS_IS_RUNES = 1 << 1;\nexport const PROPS_IS_UPDATED = 1 << 2;\nexport const PROPS_IS_BINDABLE = 1 << 3;\nexport const PROPS_IS_LAZY_INITIAL = 1 << 4;\n\nexport const TRANSITION_IN = 1;\nexport const TRANSITION_OUT = 1 << 1;\nexport const TRANSITION_GLOBAL = 1 << 2;\n\nexport const TEMPLATE_FRAGMENT = 1;\nexport const TEMPLATE_USE_IMPORT_NODE = 1 << 1;\nexport const TEMPLATE_USE_SVG = 1 << 2;\nexport const TEMPLATE_USE_MATHML = 1 << 3;\n\nexport const HYDRATION_START = '[';\n/** used to indicate that an `{:else}...` block was rendered */\nexport const HYDRATION_START_ELSE = '[!';\nexport const HYDRATION_END = ']';\nexport const HYDRATION_ERROR = {};\n\nexport const ELEMENT_IS_NAMESPACED = 1;\nexport const ELEMENT_PRESERVE_ATTRIBUTE_CASE = 1 << 1;\nexport const ELEMENT_IS_INPUT = 1 << 2;\n\nexport const UNINITIALIZED = Symbol();\n\n// Dev-time component properties\nexport const FILENAME = Symbol('filename');\nexport const HMR = Symbol('hmr');\n\nexport const NAMESPACE_HTML = 'http://www.w3.org/1999/xhtml';\nexport const NAMESPACE_SVG = 'http://www.w3.org/2000/svg';\nexport const NAMESPACE_MATHML = 'http://www.w3.org/1998/Math/MathML';\n\n// we use a list of ignorable runtime warnings because not every runtime warning\n// can be ignored and we want to keep the validation for svelte-ignore in place\nexport const IGNORABLE_RUNTIME_WARNINGS = /** @type {const} */ ([\n\t'await_waterfall',\n\t'await_reactivity_loss',\n\t'state_snapshot_uncloneable',\n\t'binding_property_non_reactive',\n\t'hydration_attribute_changed',\n\t'hydration_html_changed',\n\t'ownership_invalid_binding',\n\t'ownership_invalid_mutation'\n]);\n\n/**\n * Whitespace inside one of these elements will not result in\n * a whitespace node being created in any circumstances. (This\n * list is almost certainly very incomplete)\n * TODO this is currently unused\n */\nexport const ELEMENTS_WITHOUT_TEXT = ['audio', 'datalist', 'dl', 'optgroup', 'select', 'video'];\n\nexport const ATTACHMENT_KEY = '@attach';\n","/* This file is generated by scripts/process-messages/index.js. Do not edit! */\n\nimport { DEV } from 'esm-env';\n\nvar bold = 'font-weight: bold';\nvar normal = 'font-weight: normal';\n\n/**\n * Assignment to `%property%` property (%location%) will evaluate to the right-hand side, not the value of `%property%` following the assignment. This may result in unexpected behaviour.\n * @param {string} property\n * @param {string} location\n */\nexport function assignment_value_stale(property, location) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] assignment_value_stale\\n%cAssignment to \\`${property}\\` property (${location}) will evaluate to the right-hand side, not the value of \\`${property}\\` following the assignment. This may result in unexpected behaviour.\\nhttps://svelte.dev/e/assignment_value_stale`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/assignment_value_stale`);\n\t}\n}\n\n/**\n * Detected reactivity loss when reading `%name%`. This happens when state is read in an async function after an earlier `await`\n * @param {string} name\n */\nexport function await_reactivity_loss(name) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] await_reactivity_loss\\n%cDetected reactivity loss when reading \\`${name}\\`. This happens when state is read in an async function after an earlier \\`await\\`\\nhttps://svelte.dev/e/await_reactivity_loss`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/await_reactivity_loss`);\n\t}\n}\n\n/**\n * An async derived, `%name%` (%location%) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\n * @param {string} name\n * @param {string} location\n */\nexport function await_waterfall(name, location) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] await_waterfall\\n%cAn async derived, \\`${name}\\` (${location}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\\nhttps://svelte.dev/e/await_waterfall`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/await_waterfall`);\n\t}\n}\n\n/**\n * `%binding%` (%location%) is binding to a non-reactive property\n * @param {string} binding\n * @param {string | undefined | null} [location]\n */\nexport function binding_property_non_reactive(binding, location) {\n\tif (DEV) {\n\t\tconsole.warn(\n\t\t\t`%c[svelte] binding_property_non_reactive\\n%c${location\n\t\t\t\t? `\\`${binding}\\` (${location}) is binding to a non-reactive property`\n\t\t\t\t: `\\`${binding}\\` is binding to a non-reactive property`}\\nhttps://svelte.dev/e/binding_property_non_reactive`,\n\t\t\tbold,\n\t\t\tnormal\n\t\t);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/binding_property_non_reactive`);\n\t}\n}\n\n/**\n * Your `console.%method%` contained `$state` proxies. Consider using `$inspect(...)` or `$state.snapshot(...)` instead\n * @param {string} method\n */\nexport function console_log_state(method) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] console_log_state\\n%cYour \\`console.${method}\\` contained \\`$state\\` proxies. Consider using \\`$inspect(...)\\` or \\`$state.snapshot(...)\\` instead\\nhttps://svelte.dev/e/console_log_state`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/console_log_state`);\n\t}\n}\n\n/**\n * %handler% should be a function. Did you mean to %suggestion%?\n * @param {string} handler\n * @param {string} suggestion\n */\nexport function event_handler_invalid(handler, suggestion) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] event_handler_invalid\\n%c${handler} should be a function. Did you mean to ${suggestion}?\\nhttps://svelte.dev/e/event_handler_invalid`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/event_handler_invalid`);\n\t}\n}\n\n/**\n * Expected to find a hydratable with key `%key%` during hydration, but did not.\n * @param {string} key\n */\nexport function hydratable_missing_but_expected(key) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] hydratable_missing_but_expected\\n%cExpected to find a hydratable with key \\`${key}\\` during hydration, but did not.\\nhttps://svelte.dev/e/hydratable_missing_but_expected`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydratable_missing_but_expected`);\n\t}\n}\n\n/**\n * The `%attribute%` attribute on `%html%` changed its value between server and client renders. The client value, `%value%`, will be ignored in favour of the server value\n * @param {string} attribute\n * @param {string} html\n * @param {string} value\n */\nexport function hydration_attribute_changed(attribute, html, value) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] hydration_attribute_changed\\n%cThe \\`${attribute}\\` attribute on \\`${html}\\` changed its value between server and client renders. The client value, \\`${value}\\`, will be ignored in favour of the server value\\nhttps://svelte.dev/e/hydration_attribute_changed`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydration_attribute_changed`);\n\t}\n}\n\n/**\n * The value of an `{@html ...}` block %location% changed between server and client renders. The client value will be ignored in favour of the server value\n * @param {string | undefined | null} [location]\n */\nexport function hydration_html_changed(location) {\n\tif (DEV) {\n\t\tconsole.warn(\n\t\t\t`%c[svelte] hydration_html_changed\\n%c${location\n\t\t\t\t? `The value of an \\`{@html ...}\\` block ${location} changed between server and client renders. The client value will be ignored in favour of the server value`\n\t\t\t\t: 'The value of an `{@html ...}` block changed between server and client renders. The client value will be ignored in favour of the server value'}\\nhttps://svelte.dev/e/hydration_html_changed`,\n\t\t\tbold,\n\t\t\tnormal\n\t\t);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydration_html_changed`);\n\t}\n}\n\n/**\n * Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near %location%\n * @param {string | undefined | null} [location]\n */\nexport function hydration_mismatch(location) {\n\tif (DEV) {\n\t\tconsole.warn(\n\t\t\t`%c[svelte] hydration_mismatch\\n%c${location\n\t\t\t\t? `Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${location}`\n\t\t\t\t: 'Hydration failed because the initial UI does not match what was rendered on the server'}\\nhttps://svelte.dev/e/hydration_mismatch`,\n\t\t\tbold,\n\t\t\tnormal\n\t\t);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/hydration_mismatch`);\n\t}\n}\n\n/**\n * The `render` function passed to `createRawSnippet` should return HTML for a single element\n */\nexport function invalid_raw_snippet_render() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] invalid_raw_snippet_render\\n%cThe \\`render\\` function passed to \\`createRawSnippet\\` should return HTML for a single element\\nhttps://svelte.dev/e/invalid_raw_snippet_render`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/invalid_raw_snippet_render`);\n\t}\n}\n\n/**\n * Detected a migrated `$:` reactive block in `%filename%` that both accesses and updates the same reactive value. This may cause recursive updates when converted to an `$effect`.\n * @param {string} filename\n */\nexport function legacy_recursive_reactive_block(filename) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] legacy_recursive_reactive_block\\n%cDetected a migrated \\`$:\\` reactive block in \\`${filename}\\` that both accesses and updates the same reactive value. This may cause recursive updates when converted to an \\`$effect\\`.\\nhttps://svelte.dev/e/legacy_recursive_reactive_block`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/legacy_recursive_reactive_block`);\n\t}\n}\n\n/**\n * Tried to unmount a component that was not mounted\n */\nexport function lifecycle_double_unmount() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] lifecycle_double_unmount\\n%cTried to unmount a component that was not mounted\\nhttps://svelte.dev/e/lifecycle_double_unmount`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/lifecycle_double_unmount`);\n\t}\n}\n\n/**\n * %parent% passed property `%prop%` to %child% with `bind:`, but its parent component %owner% did not declare `%prop%` as a binding. Consider creating a binding between %owner% and %parent% (e.g. `bind:%prop%={...}` instead of `%prop%={...}`)\n * @param {string} parent\n * @param {string} prop\n * @param {string} child\n * @param {string} owner\n */\nexport function ownership_invalid_binding(parent, prop, child, owner) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] ownership_invalid_binding\\n%c${parent} passed property \\`${prop}\\` to ${child} with \\`bind:\\`, but its parent component ${owner} did not declare \\`${prop}\\` as a binding. Consider creating a binding between ${owner} and ${parent} (e.g. \\`bind:${prop}={...}\\` instead of \\`${prop}={...}\\`)\\nhttps://svelte.dev/e/ownership_invalid_binding`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/ownership_invalid_binding`);\n\t}\n}\n\n/**\n * Mutating unbound props (`%name%`, at %location%) is strongly discouraged. Consider using `bind:%prop%={...}` in %parent% (or using a callback) instead\n * @param {string} name\n * @param {string} location\n * @param {string} prop\n * @param {string} parent\n */\nexport function ownership_invalid_mutation(name, location, prop, parent) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] ownership_invalid_mutation\\n%cMutating unbound props (\\`${name}\\`, at ${location}) is strongly discouraged. Consider using \\`bind:${prop}={...}\\` in ${parent} (or using a callback) instead\\nhttps://svelte.dev/e/ownership_invalid_mutation`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/ownership_invalid_mutation`);\n\t}\n}\n\n/**\n * The `value` property of a `<select multiple>` element should be an array, but it received a non-array value. The selection will be kept as is.\n */\nexport function select_multiple_invalid_value() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] select_multiple_invalid_value\\n%cThe \\`value\\` property of a \\`<select multiple>\\` element should be an array, but it received a non-array value. The selection will be kept as is.\\nhttps://svelte.dev/e/select_multiple_invalid_value`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/select_multiple_invalid_value`);\n\t}\n}\n\n/**\n * Reactive `$state(...)` proxies and the values they proxy have different identities. Because of this, comparisons with `%operator%` will produce unexpected results\n * @param {string} operator\n */\nexport function state_proxy_equality_mismatch(operator) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] state_proxy_equality_mismatch\\n%cReactive \\`$state(...)\\` proxies and the values they proxy have different identities. Because of this, comparisons with \\`${operator}\\` will produce unexpected results\\nhttps://svelte.dev/e/state_proxy_equality_mismatch`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/state_proxy_equality_mismatch`);\n\t}\n}\n\n/**\n * Tried to unmount a state proxy, rather than a component\n */\nexport function state_proxy_unmount() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] state_proxy_unmount\\n%cTried to unmount a state proxy, rather than a component\\nhttps://svelte.dev/e/state_proxy_unmount`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/state_proxy_unmount`);\n\t}\n}\n\n/**\n * A `<svelte:boundary>` `reset` function only resets the boundary the first time it is called\n */\nexport function svelte_boundary_reset_noop() {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] svelte_boundary_reset_noop\\n%cA \\`<svelte:boundary>\\` \\`reset\\` function only resets the boundary the first time it is called\\nhttps://svelte.dev/e/svelte_boundary_reset_noop`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`);\n\t}\n}\n\n/**\n * The `slide` transition does not work correctly for elements with `display: %value%`\n * @param {string} value\n */\nexport function transition_slide_display(value) {\n\tif (DEV) {\n\t\tconsole.warn(`%c[svelte] transition_slide_display\\n%cThe \\`slide\\` transition does not work correctly for elements with \\`display: ${value}\\`\\nhttps://svelte.dev/e/transition_slide_display`, bold, normal);\n\t} else {\n\t\tconsole.warn(`https://svelte.dev/e/transition_slide_display`);\n\t}\n}","/** @import { Equals } from '#client' */\n\n/** @type {Equals} */\nexport function equals(value) {\n\treturn value === this.v;\n}\n\n/**\n * @param {unknown} a\n * @param {unknown} b\n * @returns {boolean}\n */\nexport function safe_not_equal(a, b) {\n\treturn a != a\n\t\t? b == b\n\t\t: a !== b || (a !== null && typeof a === 'object') || typeof a === 'function';\n}\n\n/**\n * @param {unknown} a\n * @param {unknown} b\n * @returns {boolean}\n */\nexport function not_equal(a, b) {\n\treturn a !== b;\n}\n\n/** @type {Equals} */\nexport function safe_equals(value) {\n\treturn !safe_not_equal(value, this.v);\n}\n","/** True if experimental.async=true */\nexport let async_mode_flag = false;\n/** True if we're not certain that we only have Svelte 5 code in the compilation */\nexport let legacy_mode_flag = false;\n/** True if $inspect.trace is used */\nexport let tracing_mode_flag = false;\n\nexport function enable_async_mode_flag() {\n\tasync_mode_flag = true;\n}\n\n/** ONLY USE THIS DURING TESTING */\nexport function disable_async_mode_flag() {\n\tasync_mode_flag = false;\n}\n\nexport function enable_legacy_mode_flag() {\n\tlegacy_mode_flag = true;\n}\n\nexport function enable_tracing_mode_flag() {\n\ttracing_mode_flag = true;\n}\n","/** @import { ComponentContext, DevStackEntry, Effect } from '#client' */\nimport { DEV } from 'esm-env';\nimport * as e from './errors.js';\nimport { active_effect, active_reaction } from './runtime.js';\nimport { create_user_effect } from './reactivity/effects.js';\nimport { async_mode_flag, legacy_mode_flag } from '../flags/index.js';\nimport { FILENAME } from '../../constants.js';\nimport { BRANCH_EFFECT, EFFECT_RAN } from './constants.js';\n\n/** @type {ComponentContext | null} */\nexport let component_context = null;\n\n/** @param {ComponentContext | null} context */\nexport function set_component_context(context) {\n\tcomponent_context = context;\n}\n\n/** @type {DevStackEntry | null} */\nexport let dev_stack = null;\n\n/** @param {DevStackEntry | null} stack */\nexport function set_dev_stack(stack) {\n\tdev_stack = stack;\n}\n\n/**\n * Execute a callback with a new dev stack entry\n * @param {() => any} callback - Function to execute\n * @param {DevStackEntry['type']} type - Type of block/component\n * @param {any} component - Component function\n * @param {number} line - Line number\n * @param {number} column - Column number\n * @param {Record<string, any>} [additional] - Any additional properties to add to the dev stack entry\n * @returns {any}\n */\nexport function add_svelte_meta(callback, type, component, line, column, additional) {\n\tconst parent = dev_stack;\n\n\tdev_stack = {\n\t\ttype,\n\t\tfile: component[FILENAME],\n\t\tline,\n\t\tcolumn,\n\t\tparent,\n\t\t...additional\n\t};\n\n\ttry {\n\t\treturn callback();\n\t} finally {\n\t\tdev_stack = parent;\n\t}\n}\n\n/**\n * The current component function. Different from current component context:\n * ```html\n * <!-- App.svelte -->\n * <Foo>\n * <Bar /> <!-- context == Foo.svelte, function == App.svelte -->\n * </Foo>\n * ```\n * @type {ComponentContext['function']}\n */\nexport let dev_current_component_function = null;\n\n/** @param {ComponentContext['function']} fn */\nexport function set_dev_current_component_function(fn) {\n\tdev_current_component_function = fn;\n}\n\n/**\n * Returns a `[get, set]` pair of functions for working with context in a type-safe way.\n *\n * `get` will throw an error if no parent component called `set`.\n *\n * @template T\n * @returns {[() => T, (context: T) => T]}\n * @since 5.40.0\n */\nexport function createContext() {\n\tconst key = {};\n\n\treturn [\n\t\t() => {\n\t\t\tif (!hasContext(key)) {\n\t\t\t\te.missing_context();\n\t\t\t}\n\n\t\t\treturn getContext(key);\n\t\t},\n\t\t(context) => setContext(key, context)\n\t];\n}\n\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * [`createContext`](https://svelte.dev/docs/svelte/svelte#createContext) is a type-safe alternative.\n *\n * @template T\n * @param {any} key\n * @returns {T}\n */\nexport function getContext(key) {\n\tconst context_map = get_or_init_context_map('getContext');\n\tconst result = /** @type {T} */ (context_map.get(key));\n\treturn result;\n}\n\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * [`createContext`](https://svelte.dev/docs/svelte/svelte#createContext) is a type-safe alternative.\n *\n * @template T\n * @param {any} key\n * @param {T} context\n * @returns {T}\n */\nexport function setContext(key, context) {\n\tconst context_map = get_or_init_context_map('setContext');\n\n\tif (async_mode_flag) {\n\t\tvar flags = /** @type {Effect} */ (active_effect).f;\n\t\tvar valid =\n\t\t\t!active_reaction &&\n\t\t\t(flags & BRANCH_EFFECT) !== 0 &&\n\t\t\t// pop() runs synchronously, so this indicates we're setting context after an await\n\t\t\t!(/** @type {ComponentContext} */ (component_context).i);\n\n\t\tif (!valid) {\n\t\t\te.set_context_after_init();\n\t\t}\n\t}\n\n\tcontext_map.set(key, context);\n\treturn context;\n}\n\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * @param {any} key\n * @returns {boolean}\n */\nexport function hasContext(key) {\n\tconst context_map = get_or_init_context_map('hasContext');\n\treturn context_map.has(key);\n}\n\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * @template {Map<any, any>} [T=Map<any, any>]\n * @returns {T}\n */\nexport function getAllContexts() {\n\tconst context_map = get_or_init_context_map('getAllContexts');\n\treturn /** @type {T} */ (context_map);\n}\n\n/**\n * @param {Record<string, unknown>} props\n * @param {any} runes\n * @param {Function} [fn]\n * @returns {void}\n */\nexport function push(props, runes = false, fn) {\n\tcomponent_context = {\n\t\tp: component_context,\n\t\ti: false,\n\t\tc: null,\n\t\te: null,\n\t\ts: props,\n\t\tx: null,\n\t\tl: legacy_mode_flag && !runes ? { s: null, u: null, $: [] } : null\n\t};\n\n\tif (DEV) {\n\t\t// component function\n\t\tcomponent_context.function = fn;\n\t\tdev_current_component_function = fn;\n\t}\n}\n\n/**\n * @template {Record<string, any>} T\n * @param {T} [component]\n * @returns {T}\n */\nexport function pop(component) {\n\tvar context = /** @type {ComponentContext} */ (component_context);\n\tvar effects = context.e;\n\n\tif (effects !== null) {\n\t\tcontext.e = null;\n\n\t\tfor (var fn of effects) {\n\t\t\tcreate_user_effect(fn);\n\t\t}\n\t}\n\n\tif (component !== undefined) {\n\t\tcontext.x = component;\n\t}\n\n\tcontext.i = true;\n\n\tcomponent_context = context.p;\n\n\tif (DEV) {\n\t\tdev_current_component_function = component_context?.function ?? null;\n\t}\n\n\treturn component ?? /** @type {T} */ ({});\n}\n\n/** @returns {boolean} */\nexport function is_runes() {\n\treturn !legacy_mode_flag || (component_context !== null && component_context.l === null);\n}\n\n/**\n * @param {string} name\n * @returns {Map<unknown, unknown>}\n */\nfunction get_or_init_context_map(name) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component(name);\n\t}\n\n\treturn (component_context.c ??= new Map(get_parent_context(component_context) || undefined));\n}\n\n/**\n * @param {ComponentContext} component_context\n * @returns {Map<unknown, unknown> | null}\n */\nfunction get_parent_context(component_context) {\n\tlet parent = component_context.p;\n\twhile (parent !== null) {\n\t\tconst context_map = parent.c;\n\t\tif (context_map !== null) {\n\t\t\treturn context_map;\n\t\t}\n\t\tparent = parent.p;\n\t}\n\treturn null;\n}\n","import { run_all } from '../../shared/utils.js';\nimport { is_flushing_sync } from '../reactivity/batch.js';\n\n/** @type {Array<() => void>} */\nlet micro_tasks = [];\n\nfunction run_micro_tasks() {\n\tvar tasks = micro_tasks;\n\tmicro_tasks = [];\n\trun_all(tasks);\n}\n\n/**\n * @param {() => void} fn\n */\nexport function queue_micro_task(fn) {\n\tif (micro_tasks.length === 0 && !is_flushing_sync) {\n\t\tvar tasks = micro_tasks;\n\t\tqueueMicrotask(() => {\n\t\t\t// If this is false, a flushSync happened in the meantime. Do _not_ run new scheduled microtasks in that case\n\t\t\t// as the ordering of microtasks would be broken at that point - consider this case:\n\t\t\t// - queue_micro_task schedules microtask A to flush task X\n\t\t\t// - synchronously after, flushSync runs, processing task X\n\t\t\t// - synchronously after, some other microtask B is scheduled, but not through queue_micro_task but for example a Promise.resolve() in user code\n\t\t\t// - synchronously after, queue_micro_task schedules microtask C to flush task Y\n\t\t\t// - one tick later, microtask A now resolves, flushing task Y before microtask B, which is incorrect\n\t\t\t// This if check prevents that race condition (that realistically will only happen in tests)\n\t\t\tif (tasks === micro_tasks) run_micro_tasks();\n\t\t});\n\t}\n\n\tmicro_tasks.push(fn);\n}\n\n/**\n * Synchronously run any queued tasks.\n */\nexport function flush_tasks() {\n\twhile (micro_tasks.length > 0) {\n\t\trun_micro_tasks();\n\t}\n}\n","/** @import { Derived, Effect } from '#client' */\n/** @import { Boundary } from './dom/blocks/boundary.js' */\nimport { DEV } from 'esm-env';\nimport { FILENAME } from '../../constants.js';\nimport { is_firefox } from './dom/operations.js';\nimport { ERROR_VALUE, BOUNDARY_EFFECT, EFFECT_RAN } from './constants.js';\nimport { define_property, get_descriptor } from '../shared/utils.js';\nimport { active_effect, active_reaction } from './runtime.js';\n\nconst adjustments = new WeakMap();\n\n/**\n * @param {unknown} error\n */\nexport function handle_error(error) {\n\tvar effect = active_effect;\n\n\t// for unowned deriveds, don't throw until we read the value\n\tif (effect === null) {\n\t\t/** @type {Derived} */ (active_reaction).f |= ERROR_VALUE;\n\t\treturn error;\n\t}\n\n\tif (DEV && error instanceof Error && !adjustments.has(error)) {\n\t\tadjustments.set(error, get_adjustments(error, effect));\n\t}\n\n\tif ((effect.f & EFFECT_RAN) === 0) {\n\t\t// if the error occurred while creating this subtree, we let it\n\t\t// bubble up until it hits a boundary that can handle it\n\t\tif ((effect.f & BOUNDARY_EFFECT) === 0) {\n\t\t\tif (DEV && !effect.parent && error instanceof Error) {\n\t\t\t\tapply_adjustments(error);\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\n\t\t/** @type {Boundary} */ (effect.b).error(error);\n\t} else {\n\t\t// otherwise we bubble up the effect tree ourselves\n\t\tinvoke_error_boundary(error, effect);\n\t}\n}\n\n/**\n * @param {unknown} error\n * @param {Effect | null} effect\n */\nexport function invoke_error_boundary(error, effect) {\n\twhile (effect !== null) {\n\t\tif ((effect.f & BOUNDARY_EFFECT) !== 0) {\n\t\t\ttry {\n\t\t\t\t/** @type {Boundary} */ (effect.b).error(error);\n\t\t\t\treturn;\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\n\t\teffect = effect.parent;\n\t}\n\n\tif (DEV && error instanceof Error) {\n\t\tapply_adjustments(error);\n\t}\n\n\tthrow error;\n}\n\n/**\n * Add useful information to the error message/stack in development\n * @param {Error} error\n * @param {Effect} effect\n */\nfunction get_adjustments(error, effect) {\n\tconst message_descriptor = get_descriptor(error, 'message');\n\n\t// if the message was already changed and it's not configurable we can't change it\n\t// or it will throw a different error swallowing the original error\n\tif (message_descriptor && !message_descriptor.configurable) return;\n\n\tvar indent = is_firefox ? ' ' : '\\t';\n\tvar component_stack = `\\n${indent}in ${effect.fn?.name || '<unknown>'}`;\n\tvar context = effect.ctx;\n\n\twhile (context !== null) {\n\t\tcomponent_stack += `\\n${indent}in ${context.function?.[FILENAME].split('/').pop()}`;\n\t\tcontext = context.p;\n\t}\n\n\treturn {\n\t\tmessage: error.message + `\\n${component_stack}\\n`,\n\t\tstack: error.stack\n\t\t\t?.split('\\n')\n\t\t\t.filter((line) => !line.includes('svelte/src/internal'))\n\t\t\t.join('\\n')\n\t};\n}\n\n/**\n * @param {Error} error\n */\nfunction apply_adjustments(error) {\n\tconst adjusted = adjustments.get(error);\n\n\tif (adjusted) {\n\t\tdefine_property(error, 'message', {\n\t\t\tvalue: adjusted.message\n\t\t});\n\n\t\tdefine_property(error, 'stack', {\n\t\t\tvalue: adjusted.stack\n\t\t});\n\t}\n}\n","/** @import { Derived, Signal } from '#client' */\nimport { CLEAN, CONNECTED, DIRTY, MAYBE_DIRTY } from '#client/constants';\n\nconst STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);\n\n/**\n * @param {Signal} signal\n * @param {number} status\n */\nexport function set_signal_status(signal, status) {\n\tsignal.f = (signal.f & STATUS_MASK) | status;\n}\n\n/**\n * Set a derived's status to CLEAN or MAYBE_DIRTY based on its connection state.\n * @param {Derived} derived\n */\nexport function update_derived_status(derived) {\n\t// Only mark as MAYBE_DIRTY if disconnected and has dependencies.\n\tif ((derived.f & CONNECTED) !== 0 || derived.deps === null) {\n\t\tset_signal_status(derived, CLEAN);\n\t} else {\n\t\tset_signal_status(derived, MAYBE_DIRTY);\n\t}\n}\n","/** @import { Derived, Effect, Value } from '#client' */\nimport { CLEAN, DERIVED, DIRTY, MAYBE_DIRTY, WAS_MARKED } from '#client/constants';\nimport { set_signal_status } from './status.js';\n\n/**\n * @param {Value[] | null} deps\n */\nfunction clear_marked(deps) {\n\tif (deps === null) return;\n\n\tfor (const dep of deps) {\n\t\tif ((dep.f & DERIVED) === 0 || (dep.f & WAS_MARKED) === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdep.f ^= WAS_MARKED;\n\n\t\tclear_marked(/** @type {Derived} */ (dep).deps);\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {Set<Effect>} dirty_effects\n * @param {Set<Effect>} maybe_dirty_effects\n */\nexport function defer_effect(effect, dirty_effects, maybe_dirty_effects) {\n\tif ((effect.f & DIRTY) !== 0) {\n\t\tdirty_effects.add(effect);\n\t} else if ((effect.f & MAYBE_DIRTY) !== 0) {\n\t\tmaybe_dirty_effects.add(effect);\n\t}\n\n\t// Since we're not executing these effects now, we need to clear any WAS_MARKED flags\n\t// so that other batches can correctly reach these effects during their own traversal\n\tclear_marked(effect.deps);\n\n\t// mark as clean so they get scheduled if they depend on pending async state\n\tset_signal_status(effect, CLEAN);\n}\n","/** @import { Fork } from 'svelte' */\n/** @import { Derived, Effect, Reaction, Source, Value } from '#client' */\n/** @import { Boundary } from '../dom/blocks/boundary' */\nimport {\n\tBLOCK_EFFECT,\n\tBRANCH_EFFECT,\n\tCLEAN,\n\tDESTROYED,\n\tDIRTY,\n\tEFFECT,\n\tASYNC,\n\tINERT,\n\tRENDER_EFFECT,\n\tROOT_EFFECT,\n\tMAYBE_DIRTY,\n\tDERIVED,\n\tBOUNDARY_EFFECT,\n\tEAGER_EFFECT,\n\tHEAD_EFFECT,\n\tERROR_VALUE,\n\tMANAGED_EFFECT\n} from '#client/constants';\nimport { async_mode_flag } from '../../flags/index.js';\nimport { deferred, define_property, includes } from '../../shared/utils.js';\nimport {\n\tactive_effect,\n\tget,\n\tincrement_write_version,\n\tis_dirty,\n\tupdate_effect\n} from '../runtime.js';\nimport * as e from '../errors.js';\nimport { flush_tasks, queue_micro_task } from '../dom/task.js';\nimport { DEV } from 'esm-env';\nimport { invoke_error_boundary } from '../error-handling.js';\nimport { flush_eager_effects, old_values, set_eager_effects, source, update } from './sources.js';\nimport { eager_effect, unlink_effect } from './effects.js';\nimport { defer_effect } from './utils.js';\nimport { UNINITIALIZED } from '../../../constants.js';\nimport { set_signal_status } from './status.js';\n\n/** @type {Set<Batch>} */\nconst batches = new Set();\n\n/** @type {Batch | null} */\nexport let current_batch = null;\n\n/**\n * This is needed to avoid overwriting inputs in non-async mode\n * TODO 6.0 remove this, as non-async mode will go away\n * @type {Batch | null}\n */\nexport let previous_batch = null;\n\n/**\n * When time travelling (i.e. working in one batch, while other batches\n * still have ongoing work), we ignore the real values of affected\n * signals in favour of their values within the batch\n * @type {Map<Value, any> | null}\n */\nexport let batch_values = null;\n\n// TODO this should really be a property of `batch`\n/** @type {Effect[]} */\nlet queued_root_effects = [];\n\n/** @type {Effect | null} */\nlet last_scheduled_effect = null;\n\nlet is_flushing = false;\nexport let is_flushing_sync = false;\n\nexport class Batch {\n\tcommitted = false;\n\n\t/**\n\t * The current values of any sources that are updated in this batch\n\t * They keys of this map are identical to `this.#previous`\n\t * @type {Map<Source, any>}\n\t */\n\tcurrent = new Map();\n\n\t/**\n\t * The values of any sources that are updated in this batch _before_ those updates took place.\n\t * They keys of this map are identical to `this.#current`\n\t * @type {Map<Source, any>}\n\t */\n\tprevious = new Map();\n\n\t/**\n\t * When the batch is committed (and the DOM is updated), we need to remove old branches\n\t * and append new ones by calling the functions added inside (if/each/key/etc) blocks\n\t * @type {Set<() => void>}\n\t */\n\t#commit_callbacks = new Set();\n\n\t/**\n\t * If a fork is discarded, we need to destroy any effects that are no longer needed\n\t * @type {Set<(batch: Batch) => void>}\n\t */\n\t#discard_callbacks = new Set();\n\n\t/**\n\t * The number of async effects that are currently in flight\n\t */\n\t#pending = 0;\n\n\t/**\n\t * The number of async effects that are currently in flight, _not_ inside a pending boundary\n\t */\n\t#blocking_pending = 0;\n\n\t/**\n\t * A deferred that resolves when the batch is committed, used with `settled()`\n\t * TODO replace with Promise.withResolvers once supported widely enough\n\t * @type {{ promise: Promise<void>, resolve: (value?: any) => void, reject: (reason: unknown) => void } | null}\n\t */\n\t#deferred = null;\n\n\t/**\n\t * Deferred effects (which run after async work has completed) that are DIRTY\n\t * @type {Set<Effect>}\n\t */\n\t#dirty_effects = new Set();\n\n\t/**\n\t * Deferred effects that are MAYBE_DIRTY\n\t * @type {Set<Effect>}\n\t */\n\t#maybe_dirty_effects = new Set();\n\n\t/**\n\t * A set of branches that still exist, but will be destroyed when this batch\n\t * is committed — we skip over these during `process`\n\t * @type {Set<Effect>}\n\t */\n\tskipped_effects = new Set();\n\n\tis_fork = false;\n\n\t#decrement_queued = false;\n\n\tis_deferred() {\n\t\treturn this.is_fork || this.#blocking_pending > 0;\n\t}\n\n\t/**\n\t *\n\t * @param {Effect[]} root_effects\n\t */\n\tprocess(root_effects) {\n\t\tqueued_root_effects = [];\n\n\t\tthis.apply();\n\n\t\t/** @type {Effect[]} */\n\t\tvar effects = [];\n\n\t\t/** @type {Effect[]} */\n\t\tvar render_effects = [];\n\n\t\tfor (const root of root_effects) {\n\t\t\tthis.#traverse_effect_tree(root, effects, render_effects);\n\t\t\t// Note: #traverse_effect_tree runs block effects eagerly, which can schedule effects,\n\t\t\t// which means queued_root_effects now may be filled again.\n\n\t\t\t// Helpful for debugging reactivity loss that has to do with branches being skipped:\n\t\t\t// log_inconsistent_branches(root);\n\t\t}\n\n\t\tif (this.is_deferred()) {\n\t\t\tthis.#defer_effects(render_effects);\n\t\t\tthis.#defer_effects(effects);\n\n\t\t\tfor (const e of this.skipped_effects) {\n\t\t\t\treset_branch(e);\n\t\t\t}\n\t\t} else {\n\t\t\t// append/remove branches\n\t\t\tfor (const fn of this.#commit_callbacks) fn();\n\t\t\tthis.#commit_callbacks.clear();\n\n\t\t\tif (this.#pending === 0) {\n\t\t\t\tthis.#commit();\n\t\t\t}\n\n\t\t\t// If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with\n\t\t\t// newly updated sources, which could lead to infinite loops when effects run over and over again.\n\t\t\tprevious_batch = this;\n\t\t\tcurrent_batch = null;\n\n\t\t\tflush_queued_effects(render_effects);\n\t\t\tflush_queued_effects(effects);\n\n\t\t\tprevious_batch = null;\n\n\t\t\tthis.#deferred?.resolve();\n\t\t}\n\n\t\tbatch_values = null;\n\t}\n\n\t/**\n\t * Traverse the effect tree, executing effects or stashing\n\t * them for later execution as appropriate\n\t * @param {Effect} root\n\t * @param {Effect[]} effects\n\t * @param {Effect[]} render_effects\n\t */\n\t#traverse_effect_tree(root, effects, render_effects) {\n\t\troot.f ^= CLEAN;\n\n\t\tvar effect = root.first;\n\n\t\t/** @type {Effect | null} */\n\t\tvar pending_boundary = null;\n\n\t\twhile (effect !== null) {\n\t\t\tvar flags = effect.f;\n\t\t\tvar is_branch = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0;\n\t\t\tvar is_skippable_branch = is_branch && (flags & CLEAN) !== 0;\n\n\t\t\tvar skip = is_skippable_branch || (flags & INERT) !== 0 || this.skipped_effects.has(effect);\n\n\t\t\t// Inside a `<svelte:boundary>` with a pending snippet,\n\t\t\t// all effects are deferred until the boundary resolves\n\t\t\t// (except block/async effects, which run immediately)\n\t\t\tif (\n\t\t\t\tasync_mode_flag &&\n\t\t\t\tpending_boundary === null &&\n\t\t\t\t(flags & BOUNDARY_EFFECT) !== 0 &&\n\t\t\t\teffect.b?.is_pending\n\t\t\t) {\n\t\t\t\tpending_boundary = effect;\n\t\t\t}\n\n\t\t\tif (!skip && effect.fn !== null) {\n\t\t\t\tif (is_branch) {\n\t\t\t\t\teffect.f ^= CLEAN;\n\t\t\t\t} else if (\n\t\t\t\t\tpending_boundary !== null &&\n\t\t\t\t\t(flags & (EFFECT | RENDER_EFFECT | MANAGED_EFFECT)) !== 0\n\t\t\t\t) {\n\t\t\t\t\t/** @type {Boundary} */ (pending_boundary.b).defer_effect(effect);\n\t\t\t\t} else if ((flags & EFFECT) !== 0) {\n\t\t\t\t\teffects.push(effect);\n\t\t\t\t} else if (async_mode_flag && (flags & (RENDER_EFFECT | MANAGED_EFFECT)) !== 0) {\n\t\t\t\t\trender_effects.push(effect);\n\t\t\t\t} else if (is_dirty(effect)) {\n\t\t\t\t\tif ((flags & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect);\n\t\t\t\t\tupdate_effect(effect);\n\t\t\t\t}\n\n\t\t\t\tvar child = effect.first;\n\n\t\t\t\tif (child !== null) {\n\t\t\t\t\teffect = child;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar parent = effect.parent;\n\t\t\teffect = effect.next;\n\n\t\t\twhile (effect === null && parent !== null) {\n\t\t\t\tif (parent === pending_boundary) {\n\t\t\t\t\tpending_boundary = null;\n\t\t\t\t}\n\n\t\t\t\teffect = parent.next;\n\t\t\t\tparent = parent.parent;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {Effect[]} effects\n\t */\n\t#defer_effects(effects) {\n\t\tfor (var i = 0; i < effects.length; i += 1) {\n\t\t\tdefer_effect(effects[i], this.#dirty_effects, this.#maybe_dirty_effects);\n\t\t}\n\t}\n\n\t/**\n\t * Associate a change to a given source with the current\n\t * batch, noting its previous and current values\n\t * @param {Source} source\n\t * @param {any} value\n\t */\n\tcapture(source, value) {\n\t\tif (value !== UNINITIALIZED && !this.previous.has(source)) {\n\t\t\tthis.previous.set(source, value);\n\t\t}\n\n\t\t// Don't save errors in `batch_values`, or they won't be thrown in `runtime.js#get`\n\t\tif ((source.f & ERROR_VALUE) === 0) {\n\t\t\tthis.current.set(source, source.v);\n\t\t\tbatch_values?.set(source, source.v);\n\t\t}\n\t}\n\n\tactivate() {\n\t\tcurrent_batch = this;\n\t\tthis.apply();\n\t}\n\n\tdeactivate() {\n\t\t// If we're not the current batch, don't deactivate,\n\t\t// else we could create zombie batches that are never flushed\n\t\tif (current_batch !== this) return;\n\n\t\tcurrent_batch = null;\n\t\tbatch_values = null;\n\t}\n\n\tflush() {\n\t\tthis.activate();\n\n\t\tif (queued_root_effects.length > 0) {\n\t\t\tflush_effects();\n\n\t\t\tif (current_batch !== null && current_batch !== this) {\n\t\t\t\t// this can happen if a new batch was created during `flush_effects()`\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (this.#pending === 0) {\n\t\t\tthis.process([]); // TODO this feels awkward\n\t\t}\n\n\t\tthis.deactivate();\n\t}\n\n\tdiscard() {\n\t\tfor (const fn of this.#discard_callbacks) fn(this);\n\t\tthis.#discard_callbacks.clear();\n\t}\n\n\t#commit() {\n\t\t// If there are other pending batches, they now need to be 'rebased' —\n\t\t// in other words, we re-run block/async effects with the newly\n\t\t// committed state, unless the batch in question has a more\n\t\t// recent value for a given source\n\t\tif (batches.size > 1) {\n\t\t\tthis.previous.clear();\n\n\t\t\tvar previous_batch_values = batch_values;\n\t\t\tvar is_earlier = true;\n\n\t\t\tfor (const batch of batches) {\n\t\t\t\tif (batch === this) {\n\t\t\t\t\tis_earlier = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/** @type {Source[]} */\n\t\t\t\tconst sources = [];\n\n\t\t\t\tfor (const [source, value] of this.current) {\n\t\t\t\t\tif (batch.current.has(source)) {\n\t\t\t\t\t\tif (is_earlier && value !== batch.current.get(source)) {\n\t\t\t\t\t\t\t// bring the value up to date\n\t\t\t\t\t\t\tbatch.current.set(source, value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// same value or later batch has more recent value,\n\t\t\t\t\t\t\t// no need to re-run these effects\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsources.push(source);\n\t\t\t\t}\n\n\t\t\t\tif (sources.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Re-run async/block effects that depend on distinct values changed in both batches\n\t\t\t\tconst others = [...batch.current.keys()].filter((s) => !this.current.has(s));\n\t\t\t\tif (others.length > 0) {\n\t\t\t\t\t// Avoid running queued root effects on the wrong branch\n\t\t\t\t\tvar prev_queued_root_effects = queued_root_effects;\n\t\t\t\t\tqueued_root_effects = [];\n\n\t\t\t\t\t/** @type {Set<Value>} */\n\t\t\t\t\tconst marked = new Set();\n\t\t\t\t\t/** @type {Map<Reaction, boolean>} */\n\t\t\t\t\tconst checked = new Map();\n\t\t\t\t\tfor (const source of sources) {\n\t\t\t\t\t\tmark_effects(source, others, marked, checked);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (queued_root_effects.length > 0) {\n\t\t\t\t\t\tcurrent_batch = batch;\n\t\t\t\t\t\tbatch.apply();\n\n\t\t\t\t\t\tfor (const root of queued_root_effects) {\n\t\t\t\t\t\t\tbatch.#traverse_effect_tree(root, [], []);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// TODO do we need to do anything with the dummy effect arrays?\n\n\t\t\t\t\t\tbatch.deactivate();\n\t\t\t\t\t}\n\n\t\t\t\t\tqueued_root_effects = prev_queued_root_effects;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent_batch = null;\n\t\t\tbatch_values = previous_batch_values;\n\t\t}\n\n\t\tthis.committed = true;\n\t\tbatches.delete(this);\n\t}\n\n\t/**\n\t *\n\t * @param {boolean} blocking\n\t */\n\tincrement(blocking) {\n\t\tthis.#pending += 1;\n\t\tif (blocking) this.#blocking_pending += 1;\n\t}\n\n\t/**\n\t *\n\t * @param {boolean} blocking\n\t */\n\tdecrement(blocking) {\n\t\tthis.#pending -= 1;\n\t\tif (blocking) this.#blocking_pending -= 1;\n\n\t\tif (this.#decrement_queued) return;\n\t\tthis.#decrement_queued = true;\n\n\t\tqueue_micro_task(() => {\n\t\t\tthis.#decrement_queued = false;\n\n\t\t\tif (!this.is_deferred()) {\n\t\t\t\t// we only reschedule previously-deferred effects if we expect\n\t\t\t\t// to be able to run them after processing the batch\n\t\t\t\tthis.revive();\n\t\t\t} else if (queued_root_effects.length > 0) {\n\t\t\t\t// if other effects are scheduled, process the batch _without_\n\t\t\t\t// rescheduling the previously-deferred effects\n\t\t\t\tthis.flush();\n\t\t\t}\n\t\t});\n\t}\n\n\trevive() {\n\t\tfor (const e of this.#dirty_effects) {\n\t\t\tthis.#maybe_dirty_effects.delete(e);\n\t\t\tset_signal_status(e, DIRTY);\n\t\t\tschedule_effect(e);\n\t\t}\n\n\t\tfor (const e of this.#maybe_dirty_effects) {\n\t\t\tset_signal_status(e, MAYBE_DIRTY);\n\t\t\tschedule_effect(e);\n\t\t}\n\n\t\tthis.flush();\n\t}\n\n\t/** @param {() => void} fn */\n\toncommit(fn) {\n\t\tthis.#commit_callbacks.add(fn);\n\t}\n\n\t/** @param {(batch: Batch) => void} fn */\n\tondiscard(fn) {\n\t\tthis.#discard_callbacks.add(fn);\n\t}\n\n\tsettled() {\n\t\treturn (this.#deferred ??= deferred()).promise;\n\t}\n\n\tstatic ensure() {\n\t\tif (current_batch === null) {\n\t\t\tconst batch = (current_batch = new Batch());\n\t\t\tbatches.add(current_batch);\n\n\t\t\tif (!is_flushing_sync) {\n\t\t\t\tqueue_micro_task(() => {\n\t\t\t\t\tif (current_batch !== batch) {\n\t\t\t\t\t\t// a flushSync happened in the meantime\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tbatch.flush();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn current_batch;\n\t}\n\n\tapply() {\n\t\tif (!async_mode_flag || (!this.is_fork && batches.size === 1)) return;\n\n\t\t// if there are multiple batches, we are 'time travelling' —\n\t\t// we need to override values with the ones in this batch...\n\t\tbatch_values = new Map(this.current);\n\n\t\t// ...and undo changes belonging to other batches\n\t\tfor (const batch of batches) {\n\t\t\tif (batch === this) continue;\n\n\t\t\tfor (const [source, previous] of batch.previous) {\n\t\t\t\tif (!batch_values.has(source)) {\n\t\t\t\t\tbatch_values.set(source, previous);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Synchronously flush any pending updates.\n * Returns void if no callback is provided, otherwise returns the result of calling the callback.\n * @template [T=void]\n * @param {(() => T) | undefined} [fn]\n * @returns {T}\n */\nexport function flushSync(fn) {\n\tvar was_flushing_sync = is_flushing_sync;\n\tis_flushing_sync = true;\n\n\ttry {\n\t\tvar result;\n\n\t\tif (fn) {\n\t\t\tif (current_batch !== null) {\n\t\t\t\tflush_effects();\n\t\t\t}\n\n\t\t\tresult = fn();\n\t\t}\n\n\t\twhile (true) {\n\t\t\tflush_tasks();\n\n\t\t\tif (queued_root_effects.length === 0) {\n\t\t\t\tcurrent_batch?.flush();\n\n\t\t\t\t// we need to check again, in case we just updated an `$effect.pending()`\n\t\t\t\tif (queued_root_effects.length === 0) {\n\t\t\t\t\t// this would be reset in `flush_effects()` but since we are early returning here,\n\t\t\t\t\t// we need to reset it here as well in case the first time there's 0 queued root effects\n\t\t\t\t\tlast_scheduled_effect = null;\n\n\t\t\t\t\treturn /** @type {T} */ (result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tflush_effects();\n\t\t}\n\t} finally {\n\t\tis_flushing_sync = was_flushing_sync;\n\t}\n}\n\nfunction flush_effects() {\n\tis_flushing = true;\n\n\tvar source_stacks = DEV ? new Set() : null;\n\n\ttry {\n\t\tvar flush_count = 0;\n\n\t\twhile (queued_root_effects.length > 0) {\n\t\t\tvar batch = Batch.ensure();\n\n\t\t\tif (flush_count++ > 1000) {\n\t\t\t\tif (DEV) {\n\t\t\t\t\tvar updates = new Map();\n\n\t\t\t\t\tfor (const source of batch.current.keys()) {\n\t\t\t\t\t\tfor (const [stack, update] of source.updated ?? []) {\n\t\t\t\t\t\t\tvar entry = updates.get(stack);\n\n\t\t\t\t\t\t\tif (!entry) {\n\t\t\t\t\t\t\t\tentry = { error: update.error, count: 0 };\n\t\t\t\t\t\t\t\tupdates.set(stack, entry);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tentry.count += update.count;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const update of updates.values()) {\n\t\t\t\t\t\tif (update.error) {\n\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\tconsole.error(update.error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tinfinite_loop_guard();\n\t\t\t}\n\n\t\t\tbatch.process(queued_root_effects);\n\t\t\told_values.clear();\n\n\t\t\tif (DEV) {\n\t\t\t\tfor (const source of batch.current.keys()) {\n\t\t\t\t\t/** @type {Set<Source>} */ (source_stacks).add(source);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tis_flushing = false;\n\n\t\tlast_scheduled_effect = null;\n\n\t\tif (DEV) {\n\t\t\tfor (const source of /** @type {Set<Source>} */ (source_stacks)) {\n\t\t\t\tsource.updated = null;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction infinite_loop_guard() {\n\ttry {\n\t\te.effect_update_depth_exceeded();\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\t// stack contains no useful information, replace it\n\t\t\tdefine_property(error, 'stack', { value: '' });\n\t\t}\n\n\t\t// Best effort: invoke the boundary nearest the most recent\n\t\t// effect and hope that it's relevant to the infinite loop\n\t\tinvoke_error_boundary(error, last_scheduled_effect);\n\t}\n}\n\n/** @type {Set<Effect> | null} */\nexport let eager_block_effects = null;\n\n/**\n * @param {Array<Effect>} effects\n * @returns {void}\n */\nfunction flush_queued_effects(effects) {\n\tvar length = effects.length;\n\tif (length === 0) return;\n\n\tvar i = 0;\n\n\twhile (i < length) {\n\t\tvar effect = effects[i++];\n\n\t\tif ((effect.f & (DESTROYED | INERT)) === 0 && is_dirty(effect)) {\n\t\t\teager_block_effects = new Set();\n\n\t\t\tupdate_effect(effect);\n\n\t\t\t// Effects with no dependencies or teardown do not get added to the effect tree.\n\t\t\t// Deferred effects (e.g. `$effect(...)`) _are_ added to the tree because we\n\t\t\t// don't know if we need to keep them until they are executed. Doing the check\n\t\t\t// here (rather than in `update_effect`) allows us to skip the work for\n\t\t\t// immediate effects.\n\t\t\tif (effect.deps === null && effect.first === null && effect.nodes === null) {\n\t\t\t\t// if there's no teardown or abort controller we completely unlink\n\t\t\t\t// the effect from the graph\n\t\t\t\tif (effect.teardown === null && effect.ac === null) {\n\t\t\t\t\t// remove this effect from the graph\n\t\t\t\t\tunlink_effect(effect);\n\t\t\t\t} else {\n\t\t\t\t\t// keep the effect in the graph, but free up some memory\n\t\t\t\t\teffect.fn = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If update_effect() has a flushSync() in it, we may have flushed another flush_queued_effects(),\n\t\t\t// which already handled this logic and did set eager_block_effects to null.\n\t\t\tif (eager_block_effects?.size > 0) {\n\t\t\t\told_values.clear();\n\n\t\t\t\tfor (const e of eager_block_effects) {\n\t\t\t\t\t// Skip eager effects that have already been unmounted\n\t\t\t\t\tif ((e.f & (DESTROYED | INERT)) !== 0) continue;\n\n\t\t\t\t\t// Run effects in order from ancestor to descendant, else we could run into nullpointers\n\t\t\t\t\t/** @type {Effect[]} */\n\t\t\t\t\tconst ordered_effects = [e];\n\t\t\t\t\tlet ancestor = e.parent;\n\t\t\t\t\twhile (ancestor !== null) {\n\t\t\t\t\t\tif (eager_block_effects.has(ancestor)) {\n\t\t\t\t\t\t\teager_block_effects.delete(ancestor);\n\t\t\t\t\t\t\tordered_effects.push(ancestor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tancestor = ancestor.parent;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (let j = ordered_effects.length - 1; j >= 0; j--) {\n\t\t\t\t\t\tconst e = ordered_effects[j];\n\t\t\t\t\t\t// Skip eager effects that have already been unmounted\n\t\t\t\t\t\tif ((e.f & (DESTROYED | INERT)) !== 0) continue;\n\t\t\t\t\t\tupdate_effect(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\teager_block_effects.clear();\n\t\t\t}\n\t\t}\n\t}\n\n\teager_block_effects = null;\n}\n\n/**\n * This is similar to `mark_reactions`, but it only marks async/block effects\n * depending on `value` and at least one of the other `sources`, so that\n * these effects can re-run after another batch has been committed\n * @param {Value} value\n * @param {Source[]} sources\n * @param {Set<Value>} marked\n * @param {Map<Reaction, boolean>} checked\n */\nfunction mark_effects(value, sources, marked, checked) {\n\tif (marked.has(value)) return;\n\tmarked.add(value);\n\n\tif (value.reactions !== null) {\n\t\tfor (const reaction of value.reactions) {\n\t\t\tconst flags = reaction.f;\n\n\t\t\tif ((flags & DERIVED) !== 0) {\n\t\t\t\tmark_effects(/** @type {Derived} */ (reaction), sources, marked, checked);\n\t\t\t} else if (\n\t\t\t\t(flags & (ASYNC | BLOCK_EFFECT)) !== 0 &&\n\t\t\t\t(flags & DIRTY) === 0 &&\n\t\t\t\tdepends_on(reaction, sources, checked)\n\t\t\t) {\n\t\t\t\tset_signal_status(reaction, DIRTY);\n\t\t\t\tschedule_effect(/** @type {Effect} */ (reaction));\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * When committing a fork, we need to trigger eager effects so that\n * any `$state.eager(...)` expressions update immediately. This\n * function allows us to discover them\n * @param {Value} value\n * @param {Set<Effect>} effects\n */\nfunction mark_eager_effects(value, effects) {\n\tif (value.reactions === null) return;\n\n\tfor (const reaction of value.reactions) {\n\t\tconst flags = reaction.f;\n\n\t\tif ((flags & DERIVED) !== 0) {\n\t\t\tmark_eager_effects(/** @type {Derived} */ (reaction), effects);\n\t\t} else if ((flags & EAGER_EFFECT) !== 0) {\n\t\t\tset_signal_status(reaction, DIRTY);\n\t\t\teffects.add(/** @type {Effect} */ (reaction));\n\t\t}\n\t}\n}\n\n/**\n * @param {Reaction} reaction\n * @param {Source[]} sources\n * @param {Map<Reaction, boolean>} checked\n */\nfunction depends_on(reaction, sources, checked) {\n\tconst depends = checked.get(reaction);\n\tif (depends !== undefined) return depends;\n\n\tif (reaction.deps !== null) {\n\t\tfor (const dep of reaction.deps) {\n\t\t\tif (includes.call(sources, dep)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ((dep.f & DERIVED) !== 0 && depends_on(/** @type {Derived} */ (dep), sources, checked)) {\n\t\t\t\tchecked.set(/** @type {Derived} */ (dep), true);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\tchecked.set(reaction, false);\n\n\treturn false;\n}\n\n/**\n * @param {Effect} signal\n * @returns {void}\n */\nexport function schedule_effect(signal) {\n\tvar effect = (last_scheduled_effect = signal);\n\n\twhile (effect.parent !== null) {\n\t\teffect = effect.parent;\n\t\tvar flags = effect.f;\n\n\t\t// if the effect is being scheduled because a parent (each/await/etc) block\n\t\t// updated an internal source, bail out or we'll cause a second flush\n\t\tif (\n\t\t\tis_flushing &&\n\t\t\teffect === active_effect &&\n\t\t\t(flags & BLOCK_EFFECT) !== 0 &&\n\t\t\t(flags & HEAD_EFFECT) === 0\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) {\n\t\t\tif ((flags & CLEAN) === 0) return;\n\t\t\teffect.f ^= CLEAN;\n\t\t}\n\t}\n\n\tqueued_root_effects.push(effect);\n}\n\n/** @type {Source<number>[]} */\nlet eager_versions = [];\n\nfunction eager_flush() {\n\ttry {\n\t\tflushSync(() => {\n\t\t\tfor (const version of eager_versions) {\n\t\t\t\tupdate(version);\n\t\t\t}\n\t\t});\n\t} finally {\n\t\teager_versions = [];\n\t}\n}\n\n/**\n * Implementation of `$state.eager(fn())`\n * @template T\n * @param {() => T} fn\n * @returns {T}\n */\nexport function eager(fn) {\n\tvar version = source(0);\n\tvar initial = true;\n\tvar value = /** @type {T} */ (undefined);\n\n\tget(version);\n\n\teager_effect(() => {\n\t\tif (initial) {\n\t\t\t// the first time this runs, we create an eager effect\n\t\t\t// that will run eagerly whenever the expression changes\n\t\t\tvar previous_batch_values = batch_values;\n\n\t\t\ttry {\n\t\t\t\tbatch_values = null;\n\t\t\t\tvalue = fn();\n\t\t\t} finally {\n\t\t\t\tbatch_values = previous_batch_values;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// the second time this effect runs, it's to schedule a\n\t\t// `version` update. since this will recreate the effect,\n\t\t// we don't need to evaluate the expression here\n\t\tif (eager_versions.length === 0) {\n\t\t\tqueue_micro_task(eager_flush);\n\t\t}\n\n\t\teager_versions.push(version);\n\t});\n\n\tinitial = false;\n\n\treturn value;\n}\n\n/**\n * Mark all the effects inside a skipped branch CLEAN, so that\n * they can be correctly rescheduled later\n * @param {Effect} effect\n */\nfunction reset_branch(effect) {\n\t// clean branch = nothing dirty inside, no need to traverse further\n\tif ((effect.f & BRANCH_EFFECT) !== 0 && (effect.f & CLEAN) !== 0) {\n\t\treturn;\n\t}\n\n\tset_signal_status(effect, CLEAN);\n\n\tvar e = effect.first;\n\twhile (e !== null) {\n\t\treset_branch(e);\n\t\te = e.next;\n\t}\n}\n\n/**\n * Creates a 'fork', in which state changes are evaluated but not applied to the DOM.\n * This is useful for speculatively loading data (for example) when you suspect that\n * the user is about to take some action.\n *\n * Frameworks like SvelteKit can use this to preload data when the user touches or\n * hovers over a link, making any subsequent navigation feel instantaneous.\n *\n * The `fn` parameter is a synchronous function that modifies some state. The\n * state changes will be reverted after the fork is initialised, then reapplied\n * if and when the fork is eventually committed.\n *\n * When it becomes clear that a fork will _not_ be committed (e.g. because the\n * user navigated elsewhere), it must be discarded to avoid leaking memory.\n *\n * @param {() => void} fn\n * @returns {Fork}\n * @since 5.42\n */\nexport function fork(fn) {\n\tif (!async_mode_flag) {\n\t\te.experimental_async_required('fork');\n\t}\n\n\tif (current_batch !== null) {\n\t\te.fork_timing();\n\t}\n\n\tvar batch = Batch.ensure();\n\tbatch.is_fork = true;\n\tbatch_values = new Map();\n\n\tvar committed = false;\n\tvar settled = batch.settled();\n\n\tflushSync(fn);\n\n\t// revert state changes\n\tfor (var [source, value] of batch.previous) {\n\t\tsource.v = value;\n\t}\n\n\t// make writable deriveds dirty, so they recalculate correctly\n\tfor (source of batch.current.keys()) {\n\t\tif ((source.f & DERIVED) !== 0) {\n\t\t\tset_signal_status(source, DIRTY);\n\t\t}\n\t}\n\n\treturn {\n\t\tcommit: async () => {\n\t\t\tif (committed) {\n\t\t\t\tawait settled;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!batches.has(batch)) {\n\t\t\t\te.fork_discarded();\n\t\t\t}\n\n\t\t\tcommitted = true;\n\n\t\t\tbatch.is_fork = false;\n\n\t\t\t// apply changes and update write versions so deriveds see the change\n\t\t\tfor (var [source, value] of batch.current) {\n\t\t\t\tsource.v = value;\n\t\t\t\tsource.wv = increment_write_version();\n\t\t\t}\n\n\t\t\t// trigger any `$state.eager(...)` expressions with the new state.\n\t\t\t// eager effects don't get scheduled like other effects, so we\n\t\t\t// can't just encounter them during traversal, we need to\n\t\t\t// proactively flush them\n\t\t\t// TODO maybe there's a better implementation?\n\t\t\tflushSync(() => {\n\t\t\t\t/** @type {Set<Effect>} */\n\t\t\t\tvar eager_effects = new Set();\n\n\t\t\t\tfor (var source of batch.current.keys()) {\n\t\t\t\t\tmark_eager_effects(source, eager_effects);\n\t\t\t\t}\n\n\t\t\t\tset_eager_effects(eager_effects);\n\t\t\t\tflush_eager_effects();\n\t\t\t});\n\n\t\t\tbatch.revive();\n\t\t\tawait settled;\n\t\t},\n\t\tdiscard: () => {\n\t\t\t// cause any MAYBE_DIRTY deriveds to update\n\t\t\t// if they depend on things thath changed\n\t\t\t// inside the discarded fork\n\t\t\tfor (var source of batch.current.keys()) {\n\t\t\t\tsource.wv = increment_write_version();\n\t\t\t}\n\n\t\t\tif (!committed && batches.has(batch)) {\n\t\t\t\tbatches.delete(batch);\n\t\t\t\tbatch.discard();\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * Forcibly remove all current batches, to prevent cross-talk between tests\n */\nexport function clear() {\n\tbatches.clear();\n}\n","import { get, tick, untrack } from '../internal/client/runtime.js';\nimport { effect_tracking, render_effect } from '../internal/client/reactivity/effects.js';\nimport { source, increment } from '../internal/client/reactivity/sources.js';\nimport { tag } from '../internal/client/dev/tracing.js';\nimport { DEV } from 'esm-env';\nimport { queue_micro_task } from '../internal/client/dom/task.js';\n\n/**\n * Returns a `subscribe` function that integrates external event-based systems with Svelte's reactivity.\n * It's particularly useful for integrating with web APIs like `MediaQuery`, `IntersectionObserver`, or `WebSocket`.\n *\n * If `subscribe` is called inside an effect (including indirectly, for example inside a getter),\n * the `start` callback will be called with an `update` function. Whenever `update` is called, the effect re-runs.\n *\n * If `start` returns a cleanup function, it will be called when the effect is destroyed.\n *\n * If `subscribe` is called in multiple effects, `start` will only be called once as long as the effects\n * are active, and the returned teardown function will only be called when all effects are destroyed.\n *\n * It's best understood with an example. Here's an implementation of [`MediaQuery`](https://svelte.dev/docs/svelte/svelte-reactivity#MediaQuery):\n *\n * ```js\n * import { createSubscriber } from 'svelte/reactivity';\n * import { on } from 'svelte/events';\n *\n * export class MediaQuery {\n * \t#query;\n * \t#subscribe;\n *\n * \tconstructor(query) {\n * \t\tthis.#query = window.matchMedia(`(${query})`);\n *\n * \t\tthis.#subscribe = createSubscriber((update) => {\n * \t\t\t// when the `change` event occurs, re-run any effects that read `this.current`\n * \t\t\tconst off = on(this.#query, 'change', update);\n *\n * \t\t\t// stop listening when all the effects are destroyed\n * \t\t\treturn () => off();\n * \t\t});\n * \t}\n *\n * \tget current() {\n * \t\t// This makes the getter reactive, if read in an effect\n * \t\tthis.#subscribe();\n *\n * \t\t// Return the current state of the query, whether or not we're in an effect\n * \t\treturn this.#query.matches;\n * \t}\n * }\n * ```\n * @param {(update: () => void) => (() => void) | void} start\n * @since 5.7.0\n */\nexport function createSubscriber(start) {\n\tlet subscribers = 0;\n\tlet version = source(0);\n\t/** @type {(() => void) | void} */\n\tlet stop;\n\n\tif (DEV) {\n\t\ttag(version, 'createSubscriber version');\n\t}\n\n\treturn () => {\n\t\tif (effect_tracking()) {\n\t\t\tget(version);\n\n\t\t\trender_effect(() => {\n\t\t\t\tif (subscribers === 0) {\n\t\t\t\t\tstop = untrack(() => start(() => increment(version)));\n\t\t\t\t}\n\n\t\t\t\tsubscribers += 1;\n\n\t\t\t\treturn () => {\n\t\t\t\t\tqueue_micro_task(() => {\n\t\t\t\t\t\t// Only count down after a microtask, else we would reach 0 before our own render effect reruns,\n\t\t\t\t\t\t// but reach 1 again when the tick callback of the prior teardown runs. That would mean we\n\t\t\t\t\t\t// re-subcribe unnecessarily and create a memory leak because the old subscription is never cleaned up.\n\t\t\t\t\t\tsubscribers -= 1;\n\n\t\t\t\t\t\tif (subscribers === 0) {\n\t\t\t\t\t\t\tstop?.();\n\t\t\t\t\t\t\tstop = undefined;\n\t\t\t\t\t\t\t// Increment the version to ensure any dependent deriveds are marked dirty when the subscription is picked up again later.\n\t\t\t\t\t\t\t// If we didn't do this then the comparison of write versions would determine that the derived has a later version than\n\t\t\t\t\t\t\t// the subscriber, and it would not be re-run.\n\t\t\t\t\t\t\tincrement(version);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t};\n}\n","/** @import { Effect, Source, TemplateNode, } from '#client' */\nimport {\n\tBLOCK_EFFECT,\n\tBOUNDARY_EFFECT,\n\tCOMMENT_NODE,\n\tDIRTY,\n\tEFFECT_PRESERVED,\n\tEFFECT_TRANSPARENT,\n\tMAYBE_DIRTY\n} from '#client/constants';\nimport { HYDRATION_START_ELSE } from '../../../../constants.js';\nimport { component_context, set_component_context } from '../../context.js';\nimport { handle_error, invoke_error_boundary } from '../../error-handling.js';\nimport {\n\tblock,\n\tbranch,\n\tdestroy_effect,\n\tmove_effect,\n\tpause_effect\n} from '../../reactivity/effects.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tget,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../runtime.js';\nimport {\n\thydrate_next,\n\thydrate_node,\n\thydrating,\n\tnext,\n\tskip_nodes,\n\tset_hydrate_node\n} from '../hydration.js';\nimport { queue_micro_task } from '../task.js';\nimport * as e from '../../errors.js';\nimport * as w from '../../warnings.js';\nimport { DEV } from 'esm-env';\nimport { Batch, schedule_effect } from '../../reactivity/batch.js';\nimport { internal_set, source } from '../../reactivity/sources.js';\nimport { tag } from '../../dev/tracing.js';\nimport { createSubscriber } from '../../../../reactivity/create-subscriber.js';\nimport { create_text } from '../operations.js';\nimport { defer_effect } from '../../reactivity/utils.js';\nimport { set_signal_status } from '../../reactivity/status.js';\n\n/**\n * @typedef {{\n * \t onerror?: (error: unknown, reset: () => void) => void;\n * failed?: (anchor: Node, error: () => unknown, reset: () => () => void) => void;\n * pending?: (anchor: Node) => void;\n * }} BoundaryProps\n */\n\nvar flags = EFFECT_TRANSPARENT | EFFECT_PRESERVED | BOUNDARY_EFFECT;\n\n/**\n * @param {TemplateNode} node\n * @param {BoundaryProps} props\n * @param {((anchor: Node) => void)} children\n * @returns {void}\n */\nexport function boundary(node, props, children) {\n\tnew Boundary(node, props, children);\n}\n\nexport class Boundary {\n\t/** @type {Boundary | null} */\n\tparent;\n\n\tis_pending = false;\n\n\t/** @type {TemplateNode} */\n\t#anchor;\n\n\t/** @type {TemplateNode | null} */\n\t#hydrate_open = hydrating ? hydrate_node : null;\n\n\t/** @type {BoundaryProps} */\n\t#props;\n\n\t/** @type {((anchor: Node) => void)} */\n\t#children;\n\n\t/** @type {Effect} */\n\t#effect;\n\n\t/** @type {Effect | null} */\n\t#main_effect = null;\n\n\t/** @type {Effect | null} */\n\t#pending_effect = null;\n\n\t/** @type {Effect | null} */\n\t#failed_effect = null;\n\n\t/** @type {DocumentFragment | null} */\n\t#offscreen_fragment = null;\n\n\t/** @type {TemplateNode | null} */\n\t#pending_anchor = null;\n\n\t#local_pending_count = 0;\n\t#pending_count = 0;\n\t#pending_count_update_queued = false;\n\n\t#is_creating_fallback = false;\n\n\t/** @type {Set<Effect>} */\n\t#dirty_effects = new Set();\n\n\t/** @type {Set<Effect>} */\n\t#maybe_dirty_effects = new Set();\n\n\t/**\n\t * A source containing the number of pending async deriveds/expressions.\n\t * Only created if `$effect.pending()` is used inside the boundary,\n\t * otherwise updating the source results in needless `Batch.ensure()`\n\t * calls followed by no-op flushes\n\t * @type {Source<number> | null}\n\t */\n\t#effect_pending = null;\n\n\t#effect_pending_subscriber = createSubscriber(() => {\n\t\tthis.#effect_pending = source(this.#local_pending_count);\n\n\t\tif (DEV) {\n\t\t\ttag(this.#effect_pending, '$effect.pending()');\n\t\t}\n\n\t\treturn () => {\n\t\t\tthis.#effect_pending = null;\n\t\t};\n\t});\n\n\t/**\n\t * @param {TemplateNode} node\n\t * @param {BoundaryProps} props\n\t * @param {((anchor: Node) => void)} children\n\t */\n\tconstructor(node, props, children) {\n\t\tthis.#anchor = node;\n\t\tthis.#props = props;\n\t\tthis.#children = children;\n\n\t\tthis.parent = /** @type {Effect} */ (active_effect).b;\n\n\t\tthis.is_pending = !!this.#props.pending;\n\n\t\tthis.#effect = block(() => {\n\t\t\t/** @type {Effect} */ (active_effect).b = this;\n\n\t\t\tif (hydrating) {\n\t\t\t\tconst comment = this.#hydrate_open;\n\t\t\t\thydrate_next();\n\n\t\t\t\tconst server_rendered_pending =\n\t\t\t\t\t/** @type {Comment} */ (comment).nodeType === COMMENT_NODE &&\n\t\t\t\t\t/** @type {Comment} */ (comment).data === HYDRATION_START_ELSE;\n\n\t\t\t\tif (server_rendered_pending) {\n\t\t\t\t\tthis.#hydrate_pending_content();\n\t\t\t\t} else {\n\t\t\t\t\tthis.#hydrate_resolved_content();\n\n\t\t\t\t\tif (this.#pending_count === 0) {\n\t\t\t\t\t\tthis.is_pending = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar anchor = this.#get_anchor();\n\n\t\t\t\ttry {\n\t\t\t\t\tthis.#main_effect = branch(() => children(anchor));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.error(error);\n\t\t\t\t}\n\n\t\t\t\tif (this.#pending_count > 0) {\n\t\t\t\t\tthis.#show_pending_snippet();\n\t\t\t\t} else {\n\t\t\t\t\tthis.is_pending = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tthis.#pending_anchor?.remove();\n\t\t\t};\n\t\t}, flags);\n\n\t\tif (hydrating) {\n\t\t\tthis.#anchor = hydrate_node;\n\t\t}\n\t}\n\n\t#hydrate_resolved_content() {\n\t\ttry {\n\t\t\tthis.#main_effect = branch(() => this.#children(this.#anchor));\n\t\t} catch (error) {\n\t\t\tthis.error(error);\n\t\t}\n\t}\n\n\t#hydrate_pending_content() {\n\t\tconst pending = this.#props.pending;\n\t\tif (!pending) return;\n\n\t\tthis.#pending_effect = branch(() => pending(this.#anchor));\n\n\t\tqueue_micro_task(() => {\n\t\t\tvar anchor = this.#get_anchor();\n\n\t\t\tthis.#main_effect = this.#run(() => {\n\t\t\t\tBatch.ensure();\n\t\t\t\treturn branch(() => this.#children(anchor));\n\t\t\t});\n\n\t\t\tif (this.#pending_count > 0) {\n\t\t\t\tthis.#show_pending_snippet();\n\t\t\t} else {\n\t\t\t\tpause_effect(/** @type {Effect} */ (this.#pending_effect), () => {\n\t\t\t\t\tthis.#pending_effect = null;\n\t\t\t\t});\n\n\t\t\t\tthis.is_pending = false;\n\t\t\t}\n\t\t});\n\t}\n\n\t#get_anchor() {\n\t\tvar anchor = this.#anchor;\n\n\t\tif (this.is_pending) {\n\t\t\tthis.#pending_anchor = create_text();\n\t\t\tthis.#anchor.before(this.#pending_anchor);\n\n\t\t\tanchor = this.#pending_anchor;\n\t\t}\n\n\t\treturn anchor;\n\t}\n\n\t/**\n\t * Defer an effect inside a pending boundary until the boundary resolves\n\t * @param {Effect} effect\n\t */\n\tdefer_effect(effect) {\n\t\tdefer_effect(effect, this.#dirty_effects, this.#maybe_dirty_effects);\n\t}\n\n\t/**\n\t * Returns `false` if the effect exists inside a boundary whose pending snippet is shown\n\t * @returns {boolean}\n\t */\n\tis_rendered() {\n\t\treturn !this.is_pending && (!this.parent || this.parent.is_rendered());\n\t}\n\n\thas_pending_snippet() {\n\t\treturn !!this.#props.pending;\n\t}\n\n\t/**\n\t * @param {() => Effect | null} fn\n\t */\n\t#run(fn) {\n\t\tvar previous_effect = active_effect;\n\t\tvar previous_reaction = active_reaction;\n\t\tvar previous_ctx = component_context;\n\n\t\tset_active_effect(this.#effect);\n\t\tset_active_reaction(this.#effect);\n\t\tset_component_context(this.#effect.ctx);\n\n\t\ttry {\n\t\t\treturn fn();\n\t\t} catch (e) {\n\t\t\thandle_error(e);\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tset_active_effect(previous_effect);\n\t\t\tset_active_reaction(previous_reaction);\n\t\t\tset_component_context(previous_ctx);\n\t\t}\n\t}\n\n\t#show_pending_snippet() {\n\t\tconst pending = /** @type {(anchor: Node) => void} */ (this.#props.pending);\n\n\t\tif (this.#main_effect !== null) {\n\t\t\tthis.#offscreen_fragment = document.createDocumentFragment();\n\t\t\tthis.#offscreen_fragment.append(/** @type {TemplateNode} */ (this.#pending_anchor));\n\t\t\tmove_effect(this.#main_effect, this.#offscreen_fragment);\n\t\t}\n\n\t\tif (this.#pending_effect === null) {\n\t\t\tthis.#pending_effect = branch(() => pending(this.#anchor));\n\t\t}\n\t}\n\n\t/**\n\t * Updates the pending count associated with the currently visible pending snippet,\n\t * if any, such that we can replace the snippet with content once work is done\n\t * @param {1 | -1} d\n\t */\n\t#update_pending_count(d) {\n\t\tif (!this.has_pending_snippet()) {\n\t\t\tif (this.parent) {\n\t\t\t\tthis.parent.#update_pending_count(d);\n\t\t\t}\n\n\t\t\t// if there's no parent, we're in a scope with no pending snippet\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#pending_count += d;\n\n\t\tif (this.#pending_count === 0) {\n\t\t\tthis.is_pending = false;\n\n\t\t\t// any effects that were encountered and deferred during traversal\n\t\t\t// should be rescheduled — after the next traversal (which will happen\n\t\t\t// immediately, due to the same update that brought us here)\n\t\t\t// the effects will be flushed\n\t\t\tfor (const e of this.#dirty_effects) {\n\t\t\t\tset_signal_status(e, DIRTY);\n\t\t\t\tschedule_effect(e);\n\t\t\t}\n\n\t\t\tfor (const e of this.#maybe_dirty_effects) {\n\t\t\t\tset_signal_status(e, MAYBE_DIRTY);\n\t\t\t\tschedule_effect(e);\n\t\t\t}\n\n\t\t\tthis.#dirty_effects.clear();\n\t\t\tthis.#maybe_dirty_effects.clear();\n\n\t\t\tif (this.#pending_effect) {\n\t\t\t\tpause_effect(this.#pending_effect, () => {\n\t\t\t\t\tthis.#pending_effect = null;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.#offscreen_fragment) {\n\t\t\t\tthis.#anchor.before(this.#offscreen_fragment);\n\t\t\t\tthis.#offscreen_fragment = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update the source that powers `$effect.pending()` inside this boundary,\n\t * and controls when the current `pending` snippet (if any) is removed.\n\t * Do not call from inside the class\n\t * @param {1 | -1} d\n\t */\n\tupdate_pending_count(d) {\n\t\tthis.#update_pending_count(d);\n\n\t\tthis.#local_pending_count += d;\n\n\t\tif (!this.#effect_pending || this.#pending_count_update_queued) return;\n\t\tthis.#pending_count_update_queued = true;\n\n\t\tqueue_micro_task(() => {\n\t\t\tthis.#pending_count_update_queued = false;\n\t\t\tif (this.#effect_pending) {\n\t\t\t\tinternal_set(this.#effect_pending, this.#local_pending_count);\n\t\t\t}\n\t\t});\n\t}\n\n\tget_effect_pending() {\n\t\tthis.#effect_pending_subscriber();\n\t\treturn get(/** @type {Source<number>} */ (this.#effect_pending));\n\t}\n\n\t/** @param {unknown} error */\n\terror(error) {\n\t\tvar onerror = this.#props.onerror;\n\t\tlet failed = this.#props.failed;\n\n\t\t// If we have nothing to capture the error, or if we hit an error while\n\t\t// rendering the fallback, re-throw for another boundary to handle\n\t\tif (this.#is_creating_fallback || (!onerror && !failed)) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this.#main_effect) {\n\t\t\tdestroy_effect(this.#main_effect);\n\t\t\tthis.#main_effect = null;\n\t\t}\n\n\t\tif (this.#pending_effect) {\n\t\t\tdestroy_effect(this.#pending_effect);\n\t\t\tthis.#pending_effect = null;\n\t\t}\n\n\t\tif (this.#failed_effect) {\n\t\t\tdestroy_effect(this.#failed_effect);\n\t\t\tthis.#failed_effect = null;\n\t\t}\n\n\t\tif (hydrating) {\n\t\t\tset_hydrate_node(/** @type {TemplateNode} */ (this.#hydrate_open));\n\t\t\tnext();\n\t\t\tset_hydrate_node(skip_nodes());\n\t\t}\n\n\t\tvar did_reset = false;\n\t\tvar calling_on_error = false;\n\n\t\tconst reset = () => {\n\t\t\tif (did_reset) {\n\t\t\t\tw.svelte_boundary_reset_noop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdid_reset = true;\n\n\t\t\tif (calling_on_error) {\n\t\t\t\te.svelte_boundary_reset_onerror();\n\t\t\t}\n\n\t\t\t// If the failure happened while flushing effects, current_batch can be null\n\t\t\tBatch.ensure();\n\n\t\t\tthis.#local_pending_count = 0;\n\n\t\t\tif (this.#failed_effect !== null) {\n\t\t\t\tpause_effect(this.#failed_effect, () => {\n\t\t\t\t\tthis.#failed_effect = null;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// we intentionally do not try to find the nearest pending boundary. If this boundary has one, we'll render it on reset\n\t\t\t// but it would be really weird to show the parent's boundary on a child reset.\n\t\t\tthis.is_pending = this.has_pending_snippet();\n\n\t\t\tthis.#main_effect = this.#run(() => {\n\t\t\t\tthis.#is_creating_fallback = false;\n\t\t\t\treturn branch(() => this.#children(this.#anchor));\n\t\t\t});\n\n\t\t\tif (this.#pending_count > 0) {\n\t\t\t\tthis.#show_pending_snippet();\n\t\t\t} else {\n\t\t\t\tthis.is_pending = false;\n\t\t\t}\n\t\t};\n\n\t\tqueue_micro_task(() => {\n\t\t\ttry {\n\t\t\t\tcalling_on_error = true;\n\t\t\t\tonerror?.(error, reset);\n\t\t\t\tcalling_on_error = false;\n\t\t\t} catch (error) {\n\t\t\t\tinvoke_error_boundary(error, this.#effect && this.#effect.parent);\n\t\t\t}\n\n\t\t\tif (failed) {\n\t\t\t\tthis.#failed_effect = this.#run(() => {\n\t\t\t\t\tBatch.ensure();\n\t\t\t\t\tthis.#is_creating_fallback = true;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn branch(() => {\n\t\t\t\t\t\t\tfailed(\n\t\t\t\t\t\t\t\tthis.#anchor,\n\t\t\t\t\t\t\t\t() => error,\n\t\t\t\t\t\t\t\t() => reset\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tinvoke_error_boundary(error, /** @type {Effect} */ (this.#effect.parent));\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.#is_creating_fallback = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport function get_boundary() {\n\treturn /** @type {Boundary} */ (/** @type {Effect} */ (active_effect).b);\n}\n\nexport function pending() {\n\tif (active_effect === null) {\n\t\te.effect_pending_outside_reaction();\n\t}\n\n\tvar boundary = active_effect.b;\n\n\tif (boundary === null) {\n\t\treturn 0; // TODO eventually we will need this to be global\n\t}\n\n\treturn boundary.get_effect_pending();\n}\n","/** @import { Blocker, Effect, Value } from '#client' */\nimport { DESTROYED, STALE_REACTION } from '#client/constants';\nimport { DEV } from 'esm-env';\nimport {\n\tcomponent_context,\n\tdev_stack,\n\tis_runes,\n\tset_component_context,\n\tset_dev_stack\n} from '../context.js';\nimport { get_boundary } from '../dom/blocks/boundary.js';\nimport { invoke_error_boundary } from '../error-handling.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tset_active_effect,\n\tset_active_reaction\n} from '../runtime.js';\nimport { Batch, current_batch } from './batch.js';\nimport {\n\tasync_derived,\n\tcurrent_async_effect,\n\tderived,\n\tderived_safe_equal,\n\tset_from_async_derived\n} from './deriveds.js';\nimport { aborted } from './effects.js';\n\n/**\n * @param {Blocker[]} blockers\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {(values: Value[]) => any} fn\n */\nexport function flatten(blockers, sync, async, fn) {\n\tconst d = is_runes() ? derived : derived_safe_equal;\n\n\t// Filter out already-settled blockers - no need to wait for them\n\tvar pending = blockers.filter((b) => !b.settled);\n\n\tif (async.length === 0 && pending.length === 0) {\n\t\tfn(sync.map(d));\n\t\treturn;\n\t}\n\n\tvar batch = current_batch;\n\tvar parent = /** @type {Effect} */ (active_effect);\n\n\tvar restore = capture();\n\tvar blocker_promise =\n\t\tpending.length === 1\n\t\t\t? pending[0].promise\n\t\t\t: pending.length > 1\n\t\t\t\t? Promise.all(pending.map((b) => b.promise))\n\t\t\t\t: null;\n\n\t/** @param {Value[]} values */\n\tfunction finish(values) {\n\t\trestore();\n\n\t\ttry {\n\t\t\tfn(values);\n\t\t} catch (error) {\n\t\t\tif ((parent.f & DESTROYED) === 0) {\n\t\t\t\tinvoke_error_boundary(error, parent);\n\t\t\t}\n\t\t}\n\n\t\tbatch?.deactivate();\n\t\tunset_context();\n\t}\n\n\t// Fast path: blockers but no async expressions\n\tif (async.length === 0) {\n\t\t/** @type {Promise<any>} */ (blocker_promise).then(() => finish(sync.map(d)));\n\t\treturn;\n\t}\n\n\t// Full path: has async expressions\n\tfunction run() {\n\t\trestore();\n\t\tPromise.all(async.map((expression) => async_derived(expression)))\n\t\t\t.then((result) => finish([...sync.map(d), ...result]))\n\t\t\t.catch((error) => invoke_error_boundary(error, parent));\n\t}\n\n\tif (blocker_promise) {\n\t\tblocker_promise.then(run);\n\t} else {\n\t\trun();\n\t}\n}\n\n/**\n * @param {Blocker[]} blockers\n * @param {(values: Value[]) => any} fn\n */\nexport function run_after_blockers(blockers, fn) {\n\tflatten(blockers, [], [], fn);\n}\n\n/**\n * Captures the current effect context so that we can restore it after\n * some asynchronous work has happened (so that e.g. `await a + b`\n * causes `b` to be registered as a dependency).\n */\nexport function capture() {\n\tvar previous_effect = active_effect;\n\tvar previous_reaction = active_reaction;\n\tvar previous_component_context = component_context;\n\tvar previous_batch = current_batch;\n\n\tif (DEV) {\n\t\tvar previous_dev_stack = dev_stack;\n\t}\n\n\treturn function restore(activate_batch = true) {\n\t\tset_active_effect(previous_effect);\n\t\tset_active_reaction(previous_reaction);\n\t\tset_component_context(previous_component_context);\n\t\tif (activate_batch) previous_batch?.activate();\n\n\t\tif (DEV) {\n\t\t\tset_from_async_derived(null);\n\t\t\tset_dev_stack(previous_dev_stack);\n\t\t}\n\t};\n}\n\n/**\n * Wraps an `await` expression in such a way that the effect context that was\n * active before the expression evaluated can be reapplied afterwards —\n * `await a + b` becomes `(await $.save(a))() + b`\n * @template T\n * @param {Promise<T>} promise\n * @returns {Promise<() => T>}\n */\nexport async function save(promise) {\n\tvar restore = capture();\n\tvar value = await promise;\n\n\treturn () => {\n\t\trestore();\n\t\treturn value;\n\t};\n}\n\n/**\n * Reset `current_async_effect` after the `promise` resolves, so\n * that we can emit `await_reactivity_loss` warnings\n * @template T\n * @param {Promise<T>} promise\n * @returns {Promise<() => T>}\n */\nexport async function track_reactivity_loss(promise) {\n\tvar previous_async_effect = current_async_effect;\n\tvar value = await promise;\n\n\treturn () => {\n\t\tset_from_async_derived(previous_async_effect);\n\t\treturn value;\n\t};\n}\n\n/**\n * Used in `for await` loops in DEV, so\n * that we can emit `await_reactivity_loss` warnings\n * after each `async_iterator` result resolves and\n * after the `async_iterator` return resolves (if it runs)\n * @template T\n * @template TReturn\n * @param {Iterable<T> | AsyncIterable<T>} iterable\n * @returns {AsyncGenerator<T, TReturn | undefined>}\n */\nexport async function* for_await_track_reactivity_loss(iterable) {\n\t// This is based on the algorithms described in ECMA-262:\n\t// ForIn/OfBodyEvaluation\n\t// https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset\n\t// AsyncIteratorClose\n\t// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-asynciteratorclose\n\n\t/** @type {AsyncIterator<T, TReturn>} */\n\t// @ts-ignore\n\tconst iterator = iterable[Symbol.asyncIterator]?.() ?? iterable[Symbol.iterator]?.();\n\n\tif (iterator === undefined) {\n\t\tthrow new TypeError('value is not async iterable');\n\t}\n\n\t/** Whether the completion of the iterator was \"normal\", meaning it wasn't ended via `break` or a similar method */\n\tlet normal_completion = false;\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = (await track_reactivity_loss(iterator.next()))();\n\t\t\tif (done) {\n\t\t\t\tnormal_completion = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tyield value;\n\t\t}\n\t} finally {\n\t\t// If the iterator had a normal completion and `return` is defined on the iterator, call it and return the value\n\t\tif (normal_completion && iterator.return !== undefined) {\n\t\t\t// eslint-disable-next-line no-unsafe-finally\n\t\t\treturn /** @type {TReturn} */ ((await track_reactivity_loss(iterator.return()))().value);\n\t\t}\n\t}\n}\n\nexport function unset_context() {\n\tset_active_effect(null);\n\tset_active_reaction(null);\n\tset_component_context(null);\n\n\tif (DEV) {\n\t\tset_from_async_derived(null);\n\t\tset_dev_stack(null);\n\t}\n}\n\n/**\n * @param {Array<() => void | Promise<void>>} thunks\n */\nexport function run(thunks) {\n\tconst restore = capture();\n\n\tvar boundary = get_boundary();\n\tvar batch = /** @type {Batch} */ (current_batch);\n\tvar blocking = boundary.is_rendered();\n\n\tboundary.update_pending_count(1);\n\tbatch.increment(blocking);\n\n\tvar active = /** @type {Effect} */ (active_effect);\n\n\t/** @type {null | { error: any }} */\n\tvar errored = null;\n\n\t/** @param {any} error */\n\tconst handle_error = (error) => {\n\t\terrored = { error }; // wrap in object in case a promise rejects with a falsy value\n\n\t\tif (!aborted(active)) {\n\t\t\tinvoke_error_boundary(error, active);\n\t\t}\n\t};\n\n\tvar promise = Promise.resolve(thunks[0]()).catch(handle_error);\n\n\t/** @type {Blocker} */\n\tvar blocker = { promise, settled: false };\n\tvar blockers = [blocker];\n\n\tpromise.finally(() => {\n\t\tblocker.settled = true;\n\t});\n\n\tfor (const fn of thunks.slice(1)) {\n\t\tpromise = promise\n\t\t\t.then(() => {\n\t\t\t\tif (errored) {\n\t\t\t\t\tthrow errored.error;\n\t\t\t\t}\n\n\t\t\t\tif (aborted(active)) {\n\t\t\t\t\tthrow STALE_REACTION;\n\t\t\t\t}\n\n\t\t\t\trestore();\n\t\t\t\treturn fn();\n\t\t\t})\n\t\t\t.catch(handle_error);\n\n\t\tconst blocker = { promise, settled: false };\n\t\tblockers.push(blocker);\n\n\t\tpromise.finally(() => {\n\t\t\tblocker.settled = true;\n\n\t\t\tunset_context();\n\t\t\tcurrent_batch?.deactivate();\n\t\t});\n\t}\n\n\tpromise\n\t\t// wait one more tick, so that template effects are\n\t\t// guaranteed to run before `$effect(...)`\n\t\t.then(() => Promise.resolve())\n\t\t.finally(() => {\n\t\t\tboundary.update_pending_count(-1);\n\t\t\tbatch.decrement(blocking);\n\t\t});\n\n\treturn blockers;\n}\n\n/**\n * @param {Blocker[]} blockers\n */\nexport function wait(blockers) {\n\treturn Promise.all(blockers.map((b) => b.promise));\n}\n","/** @import { Derived, Effect, Source } from '#client' */\n/** @import { Batch } from './batch.js'; */\nimport { DEV } from 'esm-env';\nimport {\n\tERROR_VALUE,\n\tDERIVED,\n\tDIRTY,\n\tEFFECT_PRESERVED,\n\tSTALE_REACTION,\n\tASYNC,\n\tWAS_MARKED,\n\tDESTROYED,\n\tCLEAN\n} from '#client/constants';\nimport {\n\tactive_reaction,\n\tactive_effect,\n\tupdate_reaction,\n\tincrement_write_version,\n\tset_active_effect,\n\tpush_reaction_value,\n\tis_destroying_effect\n} from '../runtime.js';\nimport { equals, safe_equals } from './equality.js';\nimport * as e from '../errors.js';\nimport * as w from '../warnings.js';\nimport { async_effect, destroy_effect, effect_tracking, teardown } from './effects.js';\nimport { eager_effects, internal_set, set_eager_effects, source } from './sources.js';\nimport { get_error } from '../../shared/dev.js';\nimport { async_mode_flag, tracing_mode_flag } from '../../flags/index.js';\nimport { Boundary } from '../dom/blocks/boundary.js';\nimport { component_context } from '../context.js';\nimport { UNINITIALIZED } from '../../../constants.js';\nimport { batch_values, current_batch } from './batch.js';\nimport { unset_context } from './async.js';\nimport { deferred, includes } from '../../shared/utils.js';\nimport { set_signal_status, update_derived_status } from './status.js';\n\n/** @type {Effect | null} */\nexport let current_async_effect = null;\n\n/** @param {Effect | null} v */\nexport function set_from_async_derived(v) {\n\tcurrent_async_effect = v;\n}\n\nexport const recent_async_deriveds = new Set();\n\n/**\n * @template V\n * @param {() => V} fn\n * @returns {Derived<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function derived(fn) {\n\tvar flags = DERIVED | DIRTY;\n\tvar parent_derived =\n\t\tactive_reaction !== null && (active_reaction.f & DERIVED) !== 0\n\t\t\t? /** @type {Derived} */ (active_reaction)\n\t\t\t: null;\n\n\tif (active_effect !== null) {\n\t\t// Since deriveds are evaluated lazily, any effects created inside them are\n\t\t// created too late to ensure that the parent effect is added to the tree\n\t\tactive_effect.f |= EFFECT_PRESERVED;\n\t}\n\n\t/** @type {Derived<V>} */\n\tconst signal = {\n\t\tctx: component_context,\n\t\tdeps: null,\n\t\teffects: null,\n\t\tequals,\n\t\tf: flags,\n\t\tfn,\n\t\treactions: null,\n\t\trv: 0,\n\t\tv: /** @type {V} */ (UNINITIALIZED),\n\t\twv: 0,\n\t\tparent: parent_derived ?? active_effect,\n\t\tac: null\n\t};\n\n\tif (DEV && tracing_mode_flag) {\n\t\tsignal.created = get_error('created at');\n\t}\n\n\treturn signal;\n}\n\n/**\n * @template V\n * @param {() => V | Promise<V>} fn\n * @param {string} [label]\n * @param {string} [location] If provided, print a warning if the value is not read immediately after update\n * @returns {Promise<Source<V>>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function async_derived(fn, label, location) {\n\tlet parent = /** @type {Effect | null} */ (active_effect);\n\n\tif (parent === null) {\n\t\te.async_derived_orphan();\n\t}\n\n\tvar boundary = /** @type {Boundary} */ (parent.b);\n\n\tvar promise = /** @type {Promise<V>} */ (/** @type {unknown} */ (undefined));\n\tvar signal = source(/** @type {V} */ (UNINITIALIZED));\n\n\tif (DEV) signal.label = label;\n\n\t// only suspend in async deriveds created on initialisation\n\tvar should_suspend = !active_reaction;\n\n\t/** @type {Map<Batch, ReturnType<typeof deferred<V>>>} */\n\tvar deferreds = new Map();\n\n\tasync_effect(() => {\n\t\tif (DEV) current_async_effect = active_effect;\n\n\t\t/** @type {ReturnType<typeof deferred<V>>} */\n\t\tvar d = deferred();\n\t\tpromise = d.promise;\n\n\t\ttry {\n\t\t\t// If this code is changed at some point, make sure to still access the then property\n\t\t\t// of fn() to read any signals it might access, so that we track them as dependencies.\n\t\t\t// We call `unset_context` to undo any `save` calls that happen inside `fn()`\n\t\t\tPromise.resolve(fn())\n\t\t\t\t.then(d.resolve, d.reject)\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (batch === current_batch && batch.committed) {\n\t\t\t\t\t\t// if the batch was rejected as stale, we need to cleanup\n\t\t\t\t\t\t// after any `$.save(...)` calls inside `fn()`\n\t\t\t\t\t\tbatch.deactivate();\n\t\t\t\t\t}\n\n\t\t\t\t\tunset_context();\n\t\t\t\t});\n\t\t} catch (error) {\n\t\t\td.reject(error);\n\t\t\tunset_context();\n\t\t}\n\n\t\tif (DEV) current_async_effect = null;\n\n\t\tvar batch = /** @type {Batch} */ (current_batch);\n\n\t\tif (should_suspend) {\n\t\t\tvar blocking = boundary.is_rendered();\n\n\t\t\tboundary.update_pending_count(1);\n\t\t\tbatch.increment(blocking);\n\n\t\t\tdeferreds.get(batch)?.reject(STALE_REACTION);\n\t\t\tdeferreds.delete(batch); // delete to ensure correct order in Map iteration below\n\t\t\tdeferreds.set(batch, d);\n\t\t}\n\n\t\t/**\n\t\t * @param {any} value\n\t\t * @param {unknown} error\n\t\t */\n\t\tconst handler = (value, error = undefined) => {\n\t\t\tcurrent_async_effect = null;\n\n\t\t\tbatch.activate();\n\n\t\t\tif (error) {\n\t\t\t\tif (error !== STALE_REACTION) {\n\t\t\t\t\tsignal.f |= ERROR_VALUE;\n\n\t\t\t\t\t// @ts-expect-error the error is the wrong type, but we don't care\n\t\t\t\t\tinternal_set(signal, error);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((signal.f & ERROR_VALUE) !== 0) {\n\t\t\t\t\tsignal.f ^= ERROR_VALUE;\n\t\t\t\t}\n\n\t\t\t\tinternal_set(signal, value);\n\n\t\t\t\t// All prior async derived runs are now stale\n\t\t\t\tfor (const [b, d] of deferreds) {\n\t\t\t\t\tdeferreds.delete(b);\n\t\t\t\t\tif (b === batch) break;\n\t\t\t\t\td.reject(STALE_REACTION);\n\t\t\t\t}\n\n\t\t\t\tif (DEV && location !== undefined) {\n\t\t\t\t\trecent_async_deriveds.add(signal);\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (recent_async_deriveds.has(signal)) {\n\t\t\t\t\t\t\tw.await_waterfall(/** @type {string} */ (signal.label), location);\n\t\t\t\t\t\t\trecent_async_deriveds.delete(signal);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (should_suspend) {\n\t\t\t\tboundary.update_pending_count(-1);\n\t\t\t\tbatch.decrement(blocking);\n\t\t\t}\n\t\t};\n\n\t\td.promise.then(handler, (e) => handler(null, e || 'unknown'));\n\t});\n\n\tteardown(() => {\n\t\tfor (const d of deferreds.values()) {\n\t\t\td.reject(STALE_REACTION);\n\t\t}\n\t});\n\n\tif (DEV) {\n\t\t// add a flag that lets this be printed as a derived\n\t\t// when using `$inspect.trace()`\n\t\tsignal.f |= ASYNC;\n\t}\n\n\treturn new Promise((fulfil) => {\n\t\t/** @param {Promise<V>} p */\n\t\tfunction next(p) {\n\t\t\tfunction go() {\n\t\t\t\tif (p === promise) {\n\t\t\t\t\tfulfil(signal);\n\t\t\t\t} else {\n\t\t\t\t\t// if the effect re-runs before the initial promise\n\t\t\t\t\t// resolves, delay resolution until we have a value\n\t\t\t\t\tnext(promise);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tp.then(go, go);\n\t\t}\n\n\t\tnext(promise);\n\t});\n}\n\n/**\n * @template V\n * @param {() => V} fn\n * @returns {Derived<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function user_derived(fn) {\n\tconst d = derived(fn);\n\n\tif (!async_mode_flag) push_reaction_value(d);\n\n\treturn d;\n}\n\n/**\n * @template V\n * @param {() => V} fn\n * @returns {Derived<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function derived_safe_equal(fn) {\n\tconst signal = derived(fn);\n\tsignal.equals = safe_equals;\n\treturn signal;\n}\n\n/**\n * @param {Derived} derived\n * @returns {void}\n */\nexport function destroy_derived_effects(derived) {\n\tvar effects = derived.effects;\n\n\tif (effects !== null) {\n\t\tderived.effects = null;\n\n\t\tfor (var i = 0; i < effects.length; i += 1) {\n\t\t\tdestroy_effect(/** @type {Effect} */ (effects[i]));\n\t\t}\n\t}\n}\n\n/**\n * The currently updating deriveds, used to detect infinite recursion\n * in dev mode and provide a nicer error than 'too much recursion'\n * @type {Derived[]}\n */\nlet stack = [];\n\n/**\n * @param {Derived} derived\n * @returns {Effect | null}\n */\nfunction get_derived_parent_effect(derived) {\n\tvar parent = derived.parent;\n\twhile (parent !== null) {\n\t\tif ((parent.f & DERIVED) === 0) {\n\t\t\t// The original parent effect might've been destroyed but the derived\n\t\t\t// is used elsewhere now - do not return the destroyed effect in that case\n\t\t\treturn (parent.f & DESTROYED) === 0 ? /** @type {Effect} */ (parent) : null;\n\t\t}\n\t\tparent = parent.parent;\n\t}\n\treturn null;\n}\n\n/**\n * @template T\n * @param {Derived} derived\n * @returns {T}\n */\nexport function execute_derived(derived) {\n\tvar value;\n\tvar prev_active_effect = active_effect;\n\n\tset_active_effect(get_derived_parent_effect(derived));\n\n\tif (DEV) {\n\t\tlet prev_eager_effects = eager_effects;\n\t\tset_eager_effects(new Set());\n\t\ttry {\n\t\t\tif (includes.call(stack, derived)) {\n\t\t\t\te.derived_references_self();\n\t\t\t}\n\n\t\t\tstack.push(derived);\n\n\t\t\tderived.f &= ~WAS_MARKED;\n\t\t\tdestroy_derived_effects(derived);\n\t\t\tvalue = update_reaction(derived);\n\t\t} finally {\n\t\t\tset_active_effect(prev_active_effect);\n\t\t\tset_eager_effects(prev_eager_effects);\n\t\t\tstack.pop();\n\t\t}\n\t} else {\n\t\ttry {\n\t\t\tderived.f &= ~WAS_MARKED;\n\t\t\tdestroy_derived_effects(derived);\n\t\t\tvalue = update_reaction(derived);\n\t\t} finally {\n\t\t\tset_active_effect(prev_active_effect);\n\t\t}\n\t}\n\n\treturn value;\n}\n\n/**\n * @param {Derived} derived\n * @returns {void}\n */\nexport function update_derived(derived) {\n\tvar value = execute_derived(derived);\n\n\tif (!derived.equals(value)) {\n\t\tderived.wv = increment_write_version();\n\n\t\t// in a fork, we don't update the underlying value, just `batch_values`.\n\t\t// the underlying value will be updated when the fork is committed.\n\t\t// otherwise, the next time we get here after a 'real world' state\n\t\t// change, `derived.equals` may incorrectly return `true`\n\t\tif (!current_batch?.is_fork || derived.deps === null) {\n\t\t\tderived.v = value;\n\n\t\t\t// deriveds without dependencies should never be recomputed\n\t\t\tif (derived.deps === null) {\n\t\t\t\tset_signal_status(derived, CLEAN);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// don't mark derived clean if we're reading it inside a\n\t// cleanup function, or it will cache a stale value\n\tif (is_destroying_effect) {\n\t\treturn;\n\t}\n\n\t// During time traveling we don't want to reset the status so that\n\t// traversal of the graph in the other batches still happens\n\tif (batch_values !== null) {\n\t\t// only cache the value if we're in a tracking context, otherwise we won't\n\t\t// clear the cache in `mark_reactions` when dependencies are updated\n\t\tif (effect_tracking() || current_batch?.is_fork) {\n\t\t\tbatch_values.set(derived, value);\n\t\t}\n\t} else {\n\t\tupdate_derived_status(derived);\n\t}\n}\n","/** @import { Derived, Effect, Source, Value } from '#client' */\nimport { DEV } from 'esm-env';\nimport {\n\tactive_reaction,\n\tactive_effect,\n\tuntracked_writes,\n\tget,\n\tset_untracked_writes,\n\tuntrack,\n\tincrement_write_version,\n\tupdate_effect,\n\tcurrent_sources,\n\tis_dirty,\n\tuntracking,\n\tis_destroying_effect,\n\tpush_reaction_value\n} from '../runtime.js';\nimport { equals, safe_equals } from './equality.js';\nimport {\n\tCLEAN,\n\tDERIVED,\n\tDIRTY,\n\tBRANCH_EFFECT,\n\tEAGER_EFFECT,\n\tMAYBE_DIRTY,\n\tBLOCK_EFFECT,\n\tROOT_EFFECT,\n\tASYNC,\n\tWAS_MARKED,\n\tCONNECTED\n} from '#client/constants';\nimport * as e from '../errors.js';\nimport { legacy_mode_flag, tracing_mode_flag } from '../../flags/index.js';\nimport { includes } from '../../shared/utils.js';\nimport { tag_proxy } from '../dev/tracing.js';\nimport { get_error } from '../../shared/dev.js';\nimport { component_context, is_runes } from '../context.js';\nimport { Batch, batch_values, eager_block_effects, schedule_effect } from './batch.js';\nimport { proxy } from '../proxy.js';\nimport { execute_derived } from './deriveds.js';\nimport { set_signal_status, update_derived_status } from './status.js';\n\n/** @type {Set<any>} */\nexport let eager_effects = new Set();\n\n/** @type {Map<Source, any>} */\nexport const old_values = new Map();\n\n/**\n * @param {Set<any>} v\n */\nexport function set_eager_effects(v) {\n\teager_effects = v;\n}\n\nlet eager_effects_deferred = false;\n\nexport function set_eager_effects_deferred() {\n\teager_effects_deferred = true;\n}\n\n/**\n * @template V\n * @param {V} v\n * @param {Error | null} [stack]\n * @returns {Source<V>}\n */\n// TODO rename this to `state` throughout the codebase\nexport function source(v, stack) {\n\t/** @type {Value} */\n\tvar signal = {\n\t\tf: 0, // TODO ideally we could skip this altogether, but it causes type errors\n\t\tv,\n\t\treactions: null,\n\t\tequals,\n\t\trv: 0,\n\t\twv: 0\n\t};\n\n\tif (DEV && tracing_mode_flag) {\n\t\tsignal.created = stack ?? get_error('created at');\n\t\tsignal.updated = null;\n\t\tsignal.set_during_effect = false;\n\t\tsignal.trace = null;\n\t}\n\n\treturn signal;\n}\n\n/**\n * @template V\n * @param {V} v\n * @param {Error | null} [stack]\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function state(v, stack) {\n\tconst s = source(v, stack);\n\n\tpush_reaction_value(s);\n\n\treturn s;\n}\n\n/**\n * @template V\n * @param {V} initial_value\n * @param {boolean} [immutable]\n * @returns {Source<V>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function mutable_source(initial_value, immutable = false, trackable = true) {\n\tconst s = source(initial_value);\n\tif (!immutable) {\n\t\ts.equals = safe_equals;\n\t}\n\n\t// bind the signal to the component context, in case we need to\n\t// track updates to trigger beforeUpdate/afterUpdate callbacks\n\tif (legacy_mode_flag && trackable && component_context !== null && component_context.l !== null) {\n\t\t(component_context.l.s ??= []).push(s);\n\t}\n\n\treturn s;\n}\n\n/**\n * @template V\n * @param {Value<V>} source\n * @param {V} value\n */\nexport function mutate(source, value) {\n\tset(\n\t\tsource,\n\t\tuntrack(() => get(source))\n\t);\n\treturn value;\n}\n\n/**\n * @template V\n * @param {Source<V>} source\n * @param {V} value\n * @param {boolean} [should_proxy]\n * @returns {V}\n */\nexport function set(source, value, should_proxy = false) {\n\tif (\n\t\tactive_reaction !== null &&\n\t\t// since we are untracking the function inside `$inspect.with` we need to add this check\n\t\t// to ensure we error if state is set inside an inspect effect\n\t\t(!untracking || (active_reaction.f & EAGER_EFFECT) !== 0) &&\n\t\tis_runes() &&\n\t\t(active_reaction.f & (DERIVED | BLOCK_EFFECT | ASYNC | EAGER_EFFECT)) !== 0 &&\n\t\t(current_sources === null || !includes.call(current_sources, source))\n\t) {\n\t\te.state_unsafe_mutation();\n\t}\n\n\tlet new_value = should_proxy ? proxy(value) : value;\n\n\tif (DEV) {\n\t\ttag_proxy(new_value, /** @type {string} */ (source.label));\n\t}\n\n\treturn internal_set(source, new_value);\n}\n\n/**\n * @template V\n * @param {Source<V>} source\n * @param {V} value\n * @returns {V}\n */\nexport function internal_set(source, value) {\n\tif (!source.equals(value)) {\n\t\tvar old_value = source.v;\n\n\t\tif (is_destroying_effect) {\n\t\t\told_values.set(source, value);\n\t\t} else {\n\t\t\told_values.set(source, old_value);\n\t\t}\n\n\t\tsource.v = value;\n\n\t\tvar batch = Batch.ensure();\n\t\tbatch.capture(source, old_value);\n\n\t\tif (DEV) {\n\t\t\tif (tracing_mode_flag || active_effect !== null) {\n\t\t\t\tsource.updated ??= new Map();\n\n\t\t\t\t// For performance reasons, when not using $inspect.trace, we only start collecting stack traces\n\t\t\t\t// after the same source has been updated more than 5 times in the same flush cycle.\n\t\t\t\tconst count = (source.updated.get('')?.count ?? 0) + 1;\n\t\t\t\tsource.updated.set('', { error: /** @type {any} */ (null), count });\n\n\t\t\t\tif (tracing_mode_flag || count > 5) {\n\t\t\t\t\tconst error = get_error('updated at');\n\n\t\t\t\t\tif (error !== null) {\n\t\t\t\t\t\tlet entry = source.updated.get(error.stack);\n\n\t\t\t\t\t\tif (!entry) {\n\t\t\t\t\t\t\tentry = { error, count: 0 };\n\t\t\t\t\t\t\tsource.updated.set(error.stack, entry);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tentry.count++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (active_effect !== null) {\n\t\t\t\tsource.set_during_effect = true;\n\t\t\t}\n\t\t}\n\n\t\tif ((source.f & DERIVED) !== 0) {\n\t\t\tconst derived = /** @type {Derived} */ (source);\n\n\t\t\t// if we are assigning to a dirty derived we set it to clean/maybe dirty but we also eagerly execute it to track the dependencies\n\t\t\tif ((source.f & DIRTY) !== 0) {\n\t\t\t\texecute_derived(derived);\n\t\t\t}\n\n\t\t\tupdate_derived_status(derived);\n\t\t}\n\n\t\tsource.wv = increment_write_version();\n\n\t\t// For debugging, in case you want to know which reactions are being scheduled:\n\t\t// log_reactions(source);\n\t\tmark_reactions(source, DIRTY);\n\n\t\t// It's possible that the current reaction might not have up-to-date dependencies\n\t\t// whilst it's actively running. So in the case of ensuring it registers the reaction\n\t\t// properly for itself, we need to ensure the current effect actually gets\n\t\t// scheduled. i.e: `$effect(() => x++)`\n\t\tif (\n\t\t\tis_runes() &&\n\t\t\tactive_effect !== null &&\n\t\t\t(active_effect.f & CLEAN) !== 0 &&\n\t\t\t(active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0\n\t\t) {\n\t\t\tif (untracked_writes === null) {\n\t\t\t\tset_untracked_writes([source]);\n\t\t\t} else {\n\t\t\t\tuntracked_writes.push(source);\n\t\t\t}\n\t\t}\n\n\t\tif (!batch.is_fork && eager_effects.size > 0 && !eager_effects_deferred) {\n\t\t\tflush_eager_effects();\n\t\t}\n\t}\n\n\treturn value;\n}\n\nexport function flush_eager_effects() {\n\teager_effects_deferred = false;\n\n\tfor (const effect of eager_effects) {\n\t\t// Mark clean inspect-effects as maybe dirty and then check their dirtiness\n\t\t// instead of just updating the effects - this way we avoid overfiring.\n\t\tif ((effect.f & CLEAN) !== 0) {\n\t\t\tset_signal_status(effect, MAYBE_DIRTY);\n\t\t}\n\n\t\tif (is_dirty(effect)) {\n\t\t\tupdate_effect(effect);\n\t\t}\n\t}\n\n\teager_effects.clear();\n}\n\n/**\n * @template {number | bigint} T\n * @param {Source<T>} source\n * @param {1 | -1} [d]\n * @returns {T}\n */\nexport function update(source, d = 1) {\n\tvar value = get(source);\n\tvar result = d === 1 ? value++ : value--;\n\n\tset(source, value);\n\n\t// @ts-expect-error\n\treturn result;\n}\n\n/**\n * @template {number | bigint} T\n * @param {Source<T>} source\n * @param {1 | -1} [d]\n * @returns {T}\n */\nexport function update_pre(source, d = 1) {\n\tvar value = get(source);\n\n\t// @ts-expect-error\n\treturn set(source, d === 1 ? ++value : --value);\n}\n\n/**\n * Silently (without using `get`) increment a source\n * @param {Source<number>} source\n */\nexport function increment(source) {\n\tset(source, source.v + 1);\n}\n\n/**\n * @param {Value} signal\n * @param {number} status should be DIRTY or MAYBE_DIRTY\n * @returns {void}\n */\nfunction mark_reactions(signal, status) {\n\tvar reactions = signal.reactions;\n\tif (reactions === null) return;\n\n\tvar runes = is_runes();\n\tvar length = reactions.length;\n\n\tfor (var i = 0; i < length; i++) {\n\t\tvar reaction = reactions[i];\n\t\tvar flags = reaction.f;\n\n\t\t// In legacy mode, skip the current effect to prevent infinite loops\n\t\tif (!runes && reaction === active_effect) continue;\n\n\t\t// Inspect effects need to run immediately, so that the stack trace makes sense\n\t\tif (DEV && (flags & EAGER_EFFECT) !== 0) {\n\t\t\teager_effects.add(reaction);\n\t\t\tcontinue;\n\t\t}\n\n\t\tvar not_dirty = (flags & DIRTY) === 0;\n\n\t\t// don't set a DIRTY reaction to MAYBE_DIRTY\n\t\tif (not_dirty) {\n\t\t\tset_signal_status(reaction, status);\n\t\t}\n\n\t\tif ((flags & DERIVED) !== 0) {\n\t\t\tvar derived = /** @type {Derived} */ (reaction);\n\n\t\t\tbatch_values?.delete(derived);\n\n\t\t\tif ((flags & WAS_MARKED) === 0) {\n\t\t\t\t// Only connected deriveds can be reliably unmarked right away\n\t\t\t\tif (flags & CONNECTED) {\n\t\t\t\t\treaction.f |= WAS_MARKED;\n\t\t\t\t}\n\n\t\t\t\tmark_reactions(derived, MAYBE_DIRTY);\n\t\t\t}\n\t\t} else if (not_dirty) {\n\t\t\tif ((flags & BLOCK_EFFECT) !== 0 && eager_block_effects !== null) {\n\t\t\t\teager_block_effects.add(/** @type {Effect} */ (reaction));\n\t\t\t}\n\n\t\t\tschedule_effect(/** @type {Effect} */ (reaction));\n\t\t}\n\t}\n}\n","/** @import { Source } from '#client' */\nimport { DEV } from 'esm-env';\nimport {\n\tget,\n\tactive_effect,\n\tupdate_version,\n\tactive_reaction,\n\tset_update_version,\n\tset_active_reaction\n} from './runtime.js';\nimport {\n\tarray_prototype,\n\tget_descriptor,\n\tget_prototype_of,\n\tis_array,\n\tobject_prototype\n} from '../shared/utils.js';\nimport {\n\tstate as source,\n\tset,\n\tincrement,\n\tflush_eager_effects,\n\tset_eager_effects_deferred\n} from './reactivity/sources.js';\nimport { PROXY_PATH_SYMBOL, STATE_SYMBOL } from '#client/constants';\nimport { UNINITIALIZED } from '../../constants.js';\nimport * as e from './errors.js';\nimport { tag } from './dev/tracing.js';\nimport { get_error } from '../shared/dev.js';\nimport { tracing_mode_flag } from '../flags/index.js';\n\n// TODO move all regexes into shared module?\nconst regex_is_valid_identifier = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n/**\n * @template T\n * @param {T} value\n * @returns {T}\n */\nexport function proxy(value) {\n\t// if non-proxyable, or is already a proxy, return `value`\n\tif (typeof value !== 'object' || value === null || STATE_SYMBOL in value) {\n\t\treturn value;\n\t}\n\n\tconst prototype = get_prototype_of(value);\n\n\tif (prototype !== object_prototype && prototype !== array_prototype) {\n\t\treturn value;\n\t}\n\n\t/** @type {Map<any, Source<any>>} */\n\tvar sources = new Map();\n\tvar is_proxied_array = is_array(value);\n\tvar version = source(0);\n\n\tvar stack = DEV && tracing_mode_flag ? get_error('created at') : null;\n\tvar parent_version = update_version;\n\n\t/**\n\t * Executes the proxy in the context of the reaction it was originally created in, if any\n\t * @template T\n\t * @param {() => T} fn\n\t */\n\tvar with_parent = (fn) => {\n\t\tif (update_version === parent_version) {\n\t\t\treturn fn();\n\t\t}\n\n\t\t// child source is being created after the initial proxy —\n\t\t// prevent it from being associated with the current reaction\n\t\tvar reaction = active_reaction;\n\t\tvar version = update_version;\n\n\t\tset_active_reaction(null);\n\t\tset_update_version(parent_version);\n\n\t\tvar result = fn();\n\n\t\tset_active_reaction(reaction);\n\t\tset_update_version(version);\n\n\t\treturn result;\n\t};\n\n\tif (is_proxied_array) {\n\t\t// We need to create the length source eagerly to ensure that\n\t\t// mutations to the array are properly synced with our proxy\n\t\tsources.set('length', source(/** @type {any[]} */ (value).length, stack));\n\t\tif (DEV) {\n\t\t\tvalue = /** @type {any} */ (inspectable_array(/** @type {any[]} */ (value)));\n\t\t}\n\t}\n\n\t/** Used in dev for $inspect.trace() */\n\tvar path = '';\n\tlet updating = false;\n\t/** @param {string} new_path */\n\tfunction update_path(new_path) {\n\t\tif (updating) return;\n\t\tupdating = true;\n\t\tpath = new_path;\n\n\t\ttag(version, `${path} version`);\n\n\t\t// rename all child sources and child proxies\n\t\tfor (const [prop, source] of sources) {\n\t\t\ttag(source, get_label(path, prop));\n\t\t}\n\t\tupdating = false;\n\t}\n\n\treturn new Proxy(/** @type {any} */ (value), {\n\t\tdefineProperty(_, prop, descriptor) {\n\t\t\tif (\n\t\t\t\t!('value' in descriptor) ||\n\t\t\t\tdescriptor.configurable === false ||\n\t\t\t\tdescriptor.enumerable === false ||\n\t\t\t\tdescriptor.writable === false\n\t\t\t) {\n\t\t\t\t// we disallow non-basic descriptors, because unless they are applied to the\n\t\t\t\t// target object — which we avoid, so that state can be forked — we will run\n\t\t\t\t// afoul of the various invariants\n\t\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/getOwnPropertyDescriptor#invariants\n\t\t\t\te.state_descriptors_fixed();\n\t\t\t}\n\t\t\tvar s = sources.get(prop);\n\t\t\tif (s === undefined) {\n\t\t\t\ts = with_parent(() => {\n\t\t\t\t\tvar s = source(descriptor.value, stack);\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t\tif (DEV && typeof prop === 'string') {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\t\t\t\t\treturn s;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tset(s, descriptor.value, true);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tdeleteProperty(target, prop) {\n\t\t\tvar s = sources.get(prop);\n\n\t\t\tif (s === undefined) {\n\t\t\t\tif (prop in target) {\n\t\t\t\t\tconst s = with_parent(() => source(UNINITIALIZED, stack));\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t\tincrement(version);\n\n\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tset(s, UNINITIALIZED);\n\t\t\t\tincrement(version);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tget(target, prop, receiver) {\n\t\t\tif (prop === STATE_SYMBOL) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tif (DEV && prop === PROXY_PATH_SYMBOL) {\n\t\t\t\treturn update_path;\n\t\t\t}\n\n\t\t\tvar s = sources.get(prop);\n\t\t\tvar exists = prop in target;\n\n\t\t\t// create a source, but only if it's an own property and not a prototype property\n\t\t\tif (s === undefined && (!exists || get_descriptor(target, prop)?.writable)) {\n\t\t\t\ts = with_parent(() => {\n\t\t\t\t\tvar p = proxy(exists ? target[prop] : UNINITIALIZED);\n\t\t\t\t\tvar s = source(p, stack);\n\n\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\n\t\t\t\t\treturn s;\n\t\t\t\t});\n\n\t\t\t\tsources.set(prop, s);\n\t\t\t}\n\n\t\t\tif (s !== undefined) {\n\t\t\t\tvar v = get(s);\n\t\t\t\treturn v === UNINITIALIZED ? undefined : v;\n\t\t\t}\n\n\t\t\treturn Reflect.get(target, prop, receiver);\n\t\t},\n\n\t\tgetOwnPropertyDescriptor(target, prop) {\n\t\t\tvar descriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n\n\t\t\tif (descriptor && 'value' in descriptor) {\n\t\t\t\tvar s = sources.get(prop);\n\t\t\t\tif (s) descriptor.value = get(s);\n\t\t\t} else if (descriptor === undefined) {\n\t\t\t\tvar source = sources.get(prop);\n\t\t\t\tvar value = source?.v;\n\n\t\t\t\tif (source !== undefined && value !== UNINITIALIZED) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tenumerable: true,\n\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\twritable: true\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn descriptor;\n\t\t},\n\n\t\thas(target, prop) {\n\t\t\tif (prop === STATE_SYMBOL) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tvar s = sources.get(prop);\n\t\t\tvar has = (s !== undefined && s.v !== UNINITIALIZED) || Reflect.has(target, prop);\n\n\t\t\tif (\n\t\t\t\ts !== undefined ||\n\t\t\t\t(active_effect !== null && (!has || get_descriptor(target, prop)?.writable))\n\t\t\t) {\n\t\t\t\tif (s === undefined) {\n\t\t\t\t\ts = with_parent(() => {\n\t\t\t\t\t\tvar p = has ? proxy(target[prop]) : UNINITIALIZED;\n\t\t\t\t\t\tvar s = source(p, stack);\n\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn s;\n\t\t\t\t\t});\n\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t}\n\n\t\t\t\tvar value = get(s);\n\t\t\t\tif (value === UNINITIALIZED) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn has;\n\t\t},\n\n\t\tset(target, prop, value, receiver) {\n\t\t\tvar s = sources.get(prop);\n\t\t\tvar has = prop in target;\n\n\t\t\t// variable.length = value -> clear all signals with index >= value\n\t\t\tif (is_proxied_array && prop === 'length') {\n\t\t\t\tfor (var i = value; i < /** @type {Source<number>} */ (s).v; i += 1) {\n\t\t\t\t\tvar other_s = sources.get(i + '');\n\t\t\t\t\tif (other_s !== undefined) {\n\t\t\t\t\t\tset(other_s, UNINITIALIZED);\n\t\t\t\t\t} else if (i in target) {\n\t\t\t\t\t\t// If the item exists in the original, we need to create an uninitialized source,\n\t\t\t\t\t\t// else a later read of the property would result in a source being created with\n\t\t\t\t\t\t// the value of the original item at that index.\n\t\t\t\t\t\tother_s = with_parent(() => source(UNINITIALIZED, stack));\n\t\t\t\t\t\tsources.set(i + '', other_s);\n\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\ttag(other_s, get_label(path, i));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we haven't yet created a source for this property, we need to ensure\n\t\t\t// we do so otherwise if we read it later, then the write won't be tracked and\n\t\t\t// the heuristics of effects will be different vs if we had read the proxied\n\t\t\t// object property before writing to that property.\n\t\t\tif (s === undefined) {\n\t\t\t\tif (!has || get_descriptor(target, prop)?.writable) {\n\t\t\t\t\ts = with_parent(() => source(undefined, stack));\n\n\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\ttag(s, get_label(path, prop));\n\t\t\t\t\t}\n\t\t\t\t\tset(s, proxy(value));\n\n\t\t\t\t\tsources.set(prop, s);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thas = s.v !== UNINITIALIZED;\n\n\t\t\t\tvar p = with_parent(() => proxy(value));\n\t\t\t\tset(s, p);\n\t\t\t}\n\n\t\t\tvar descriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n\n\t\t\t// Set the new value before updating any signals so that any listeners get the new value\n\t\t\tif (descriptor?.set) {\n\t\t\t\tdescriptor.set.call(receiver, value);\n\t\t\t}\n\n\t\t\tif (!has) {\n\t\t\t\t// If we have mutated an array directly, we might need to\n\t\t\t\t// signal that length has also changed. Do it before updating metadata\n\t\t\t\t// to ensure that iterating over the array as a result of a metadata update\n\t\t\t\t// will not cause the length to be out of sync.\n\t\t\t\tif (is_proxied_array && typeof prop === 'string') {\n\t\t\t\t\tvar ls = /** @type {Source<number>} */ (sources.get('length'));\n\t\t\t\t\tvar n = Number(prop);\n\n\t\t\t\t\tif (Number.isInteger(n) && n >= ls.v) {\n\t\t\t\t\t\tset(ls, n + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tincrement(version);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\townKeys(target) {\n\t\t\tget(version);\n\n\t\t\tvar own_keys = Reflect.ownKeys(target).filter((key) => {\n\t\t\t\tvar source = sources.get(key);\n\t\t\t\treturn source === undefined || source.v !== UNINITIALIZED;\n\t\t\t});\n\n\t\t\tfor (var [key, source] of sources) {\n\t\t\t\tif (source.v !== UNINITIALIZED && !(key in target)) {\n\t\t\t\t\town_keys.push(key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn own_keys;\n\t\t},\n\n\t\tsetPrototypeOf() {\n\t\t\te.state_prototype_fixed();\n\t\t}\n\t});\n}\n\n/**\n * @param {string} path\n * @param {string | symbol} prop\n */\nfunction get_label(path, prop) {\n\tif (typeof prop === 'symbol') return `${path}[Symbol(${prop.description ?? ''})]`;\n\tif (regex_is_valid_identifier.test(prop)) return `${path}.${prop}`;\n\treturn /^\\d+$/.test(prop) ? `${path}[${prop}]` : `${path}['${prop}']`;\n}\n\n/**\n * @param {any} value\n */\nexport function get_proxied_value(value) {\n\ttry {\n\t\tif (value !== null && typeof value === 'object' && STATE_SYMBOL in value) {\n\t\t\treturn value[STATE_SYMBOL];\n\t\t}\n\t} catch {\n\t\t// the above if check can throw an error if the value in question\n\t\t// is the contentWindow of an iframe on another domain, in which\n\t\t// case we want to just return the value (because it's definitely\n\t\t// not a proxied value) so we don't break any JavaScript interacting\n\t\t// with that iframe (such as various payment companies client side\n\t\t// JavaScript libraries interacting with their iframes on the same\n\t\t// domain)\n\t}\n\n\treturn value;\n}\n\n/**\n * @param {any} a\n * @param {any} b\n */\nexport function is(a, b) {\n\treturn Object.is(get_proxied_value(a), get_proxied_value(b));\n}\n\nconst ARRAY_MUTATING_METHODS = new Set([\n\t'copyWithin',\n\t'fill',\n\t'pop',\n\t'push',\n\t'reverse',\n\t'shift',\n\t'sort',\n\t'splice',\n\t'unshift'\n]);\n\n/**\n * Wrap array mutating methods so $inspect is triggered only once and\n * to prevent logging an array in intermediate state (e.g. with an empty slot)\n * @param {any[]} array\n */\nfunction inspectable_array(array) {\n\treturn new Proxy(array, {\n\t\tget(target, prop, receiver) {\n\t\t\tvar value = Reflect.get(target, prop, receiver);\n\t\t\tif (!ARRAY_MUTATING_METHODS.has(/** @type {string} */ (prop))) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @this {any[]}\n\t\t\t * @param {any[]} args\n\t\t\t */\n\t\t\treturn function (...args) {\n\t\t\t\tset_eager_effects_deferred();\n\t\t\t\tvar result = value.apply(this, args);\n\t\t\t\tflush_eager_effects();\n\t\t\t\treturn result;\n\t\t\t};\n\t\t}\n\t});\n}\n","/** @import { Effect, TemplateNode } from '#client' */\nimport { hydrate_node, hydrating, set_hydrate_node } from './hydration.js';\nimport { DEV } from 'esm-env';\nimport { init_array_prototype_warnings } from '../dev/equality.js';\nimport { get_descriptor, is_extensible } from '../../shared/utils.js';\nimport { active_effect } from '../runtime.js';\nimport { async_mode_flag } from '../../flags/index.js';\nimport { TEXT_NODE, EFFECT_RAN } from '#client/constants';\nimport { eager_block_effects } from '../reactivity/batch.js';\n\n// export these for reference in the compiled code, making global name deduplication unnecessary\n/** @type {Window} */\nexport var $window;\n\n/** @type {Document} */\nexport var $document;\n\n/** @type {boolean} */\nexport var is_firefox;\n\n/** @type {() => Node | null} */\nvar first_child_getter;\n/** @type {() => Node | null} */\nvar next_sibling_getter;\n\n/**\n * Initialize these lazily to avoid issues when using the runtime in a server context\n * where these globals are not available while avoiding a separate server entry point\n */\nexport function init_operations() {\n\tif ($window !== undefined) {\n\t\treturn;\n\t}\n\n\t$window = window;\n\t$document = document;\n\tis_firefox = /Firefox/.test(navigator.userAgent);\n\n\tvar element_prototype = Element.prototype;\n\tvar node_prototype = Node.prototype;\n\tvar text_prototype = Text.prototype;\n\n\t// @ts-ignore\n\tfirst_child_getter = get_descriptor(node_prototype, 'firstChild').get;\n\t// @ts-ignore\n\tnext_sibling_getter = get_descriptor(node_prototype, 'nextSibling').get;\n\n\tif (is_extensible(element_prototype)) {\n\t\t// the following assignments improve perf of lookups on DOM nodes\n\t\t// @ts-expect-error\n\t\telement_prototype.__click = undefined;\n\t\t// @ts-expect-error\n\t\telement_prototype.__className = undefined;\n\t\t// @ts-expect-error\n\t\telement_prototype.__attributes = null;\n\t\t// @ts-expect-error\n\t\telement_prototype.__style = undefined;\n\t\t// @ts-expect-error\n\t\telement_prototype.__e = undefined;\n\t}\n\n\tif (is_extensible(text_prototype)) {\n\t\t// @ts-expect-error\n\t\ttext_prototype.__t = undefined;\n\t}\n\n\tif (DEV) {\n\t\t// @ts-expect-error\n\t\telement_prototype.__svelte_meta = null;\n\n\t\tinit_array_prototype_warnings();\n\t}\n}\n\n/**\n * @param {string} value\n * @returns {Text}\n */\nexport function create_text(value = '') {\n\treturn document.createTextNode(value);\n}\n\n/**\n * @template {Node} N\n * @param {N} node\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function get_first_child(node) {\n\treturn /** @type {TemplateNode | null} */ (first_child_getter.call(node));\n}\n\n/**\n * @template {Node} N\n * @param {N} node\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function get_next_sibling(node) {\n\treturn /** @type {TemplateNode | null} */ (next_sibling_getter.call(node));\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @template {Node} N\n * @param {N} node\n * @param {boolean} is_text\n * @returns {TemplateNode | null}\n */\nexport function child(node, is_text) {\n\tif (!hydrating) {\n\t\treturn get_first_child(node);\n\t}\n\n\tvar child = get_first_child(hydrate_node);\n\n\t// Child can be null if we have an element with a single child, like `<p>{text}</p>`, where `text` is empty\n\tif (child === null) {\n\t\tchild = hydrate_node.appendChild(create_text());\n\t} else if (is_text && child.nodeType !== TEXT_NODE) {\n\t\tvar text = create_text();\n\t\tchild?.before(text);\n\t\tset_hydrate_node(text);\n\t\treturn text;\n\t}\n\n\tif (is_text) {\n\t\tmerge_text_nodes(/** @type {Text} */ (child));\n\t}\n\n\tset_hydrate_node(child);\n\treturn child;\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @param {TemplateNode} node\n * @param {boolean} [is_text]\n * @returns {TemplateNode | null}\n */\nexport function first_child(node, is_text = false) {\n\tif (!hydrating) {\n\t\tvar first = get_first_child(node);\n\n\t\t// TODO prevent user comments with the empty string when preserveComments is true\n\t\tif (first instanceof Comment && first.data === '') return get_next_sibling(first);\n\n\t\treturn first;\n\t}\n\n\tif (is_text) {\n\t\t// if an {expression} is empty during SSR, there might be no\n\t\t// text node to hydrate — we must therefore create one\n\t\tif (hydrate_node?.nodeType !== TEXT_NODE) {\n\t\t\tvar text = create_text();\n\n\t\t\thydrate_node?.before(text);\n\t\t\tset_hydrate_node(text);\n\t\t\treturn text;\n\t\t}\n\n\t\tmerge_text_nodes(/** @type {Text} */ (hydrate_node));\n\t}\n\n\treturn hydrate_node;\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @param {TemplateNode} node\n * @param {number} count\n * @param {boolean} is_text\n * @returns {TemplateNode | null}\n */\nexport function sibling(node, count = 1, is_text = false) {\n\tlet next_sibling = hydrating ? hydrate_node : node;\n\tvar last_sibling;\n\n\twhile (count--) {\n\t\tlast_sibling = next_sibling;\n\t\tnext_sibling = /** @type {TemplateNode} */ (get_next_sibling(next_sibling));\n\t}\n\n\tif (!hydrating) {\n\t\treturn next_sibling;\n\t}\n\n\tif (is_text) {\n\t\t// if a sibling {expression} is empty during SSR, there might be no\n\t\t// text node to hydrate — we must therefore create one\n\t\tif (next_sibling?.nodeType !== TEXT_NODE) {\n\t\t\tvar text = create_text();\n\t\t\t// If the next sibling is `null` and we're handling text then it's because\n\t\t\t// the SSR content was empty for the text, so we need to generate a new text\n\t\t\t// node and insert it after the last sibling\n\t\t\tif (next_sibling === null) {\n\t\t\t\tlast_sibling?.after(text);\n\t\t\t} else {\n\t\t\t\tnext_sibling.before(text);\n\t\t\t}\n\t\t\tset_hydrate_node(text);\n\t\t\treturn text;\n\t\t}\n\n\t\tmerge_text_nodes(/** @type {Text} */ (next_sibling));\n\t}\n\n\tset_hydrate_node(next_sibling);\n\treturn next_sibling;\n}\n\n/**\n * @template {Node} N\n * @param {N} node\n * @returns {void}\n */\nexport function clear_text_content(node) {\n\tnode.textContent = '';\n}\n\n/**\n * Returns `true` if we're updating the current block, for example `condition` in\n * an `{#if condition}` block just changed. In this case, the branch should be\n * appended (or removed) at the same time as other updates within the\n * current `<svelte:boundary>`\n */\nexport function should_defer_append() {\n\tif (!async_mode_flag) return false;\n\tif (eager_block_effects !== null) return false;\n\n\tvar flags = /** @type {Effect} */ (active_effect).f;\n\treturn (flags & EFFECT_RAN) !== 0;\n}\n\n/**\n *\n * @param {string} tag\n * @param {string} [namespace]\n * @param {string} [is]\n * @returns\n */\nexport function create_element(tag, namespace, is) {\n\tlet options = is ? { is } : undefined;\n\tif (namespace) {\n\t\treturn document.createElementNS(namespace, tag, options);\n\t}\n\treturn document.createElement(tag, options);\n}\n\nexport function create_fragment() {\n\treturn document.createDocumentFragment();\n}\n\n/**\n * @param {string} data\n * @returns\n */\nexport function create_comment(data = '') {\n\treturn document.createComment(data);\n}\n\n/**\n * @param {Element} element\n * @param {string} key\n * @param {string} value\n * @returns\n */\nexport function set_attribute(element, key, value = '') {\n\tif (key.startsWith('xlink:')) {\n\t\telement.setAttributeNS('http://www.w3.org/1999/xlink', key, value);\n\t\treturn;\n\t}\n\treturn element.setAttribute(key, value);\n}\n\n/**\n * Browsers split text nodes larger than 65536 bytes when parsing.\n * For hydration to succeed, we need to stitch them back together\n * @param {Text} text\n */\nexport function merge_text_nodes(text) {\n\tif (/** @type {string} */ (text.nodeValue).length < 65536) {\n\t\treturn;\n\t}\n\n\tlet next = text.nextSibling;\n\n\twhile (next !== null && next.nodeType === TEXT_NODE) {\n\t\tnext.remove();\n\n\t\t/** @type {string} */ (text.nodeValue) += /** @type {string} */ (next.nodeValue);\n\n\t\tnext = text.nextSibling;\n\t}\n}\n","import { teardown } from '../../../reactivity/effects.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../../runtime.js';\nimport { add_form_reset_listener } from '../misc.js';\n\n/**\n * Fires the handler once immediately (unless corresponding arg is set to `false`),\n * then listens to the given events until the render effect context is destroyed\n * @param {EventTarget} target\n * @param {Array<string>} events\n * @param {(event?: Event) => void} handler\n * @param {any} call_handler_immediately\n */\nexport function listen(target, events, handler, call_handler_immediately = true) {\n\tif (call_handler_immediately) {\n\t\thandler();\n\t}\n\n\tfor (var name of events) {\n\t\ttarget.addEventListener(name, handler);\n\t}\n\n\tteardown(() => {\n\t\tfor (var name of events) {\n\t\t\ttarget.removeEventListener(name, handler);\n\t\t}\n\t});\n}\n\n/**\n * @template T\n * @param {() => T} fn\n */\nexport function without_reactive_context(fn) {\n\tvar previous_reaction = active_reaction;\n\tvar previous_effect = active_effect;\n\tset_active_reaction(null);\n\tset_active_effect(null);\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\tset_active_reaction(previous_reaction);\n\t\tset_active_effect(previous_effect);\n\t}\n}\n\n/**\n * Listen to the given event, and then instantiate a global form reset listener if not already done,\n * to notify all bindings when the form is reset\n * @param {HTMLElement} element\n * @param {string} event\n * @param {(is_reset?: true) => void} handler\n * @param {(is_reset?: true) => void} [on_reset]\n */\nexport function listen_to_event_and_reset_event(element, event, handler, on_reset = handler) {\n\telement.addEventListener(event, () => without_reactive_context(handler));\n\t// @ts-expect-error\n\tconst prev = element.__on_r;\n\tif (prev) {\n\t\t// special case for checkbox that can have multiple binds (group & checked)\n\t\t// @ts-expect-error\n\t\telement.__on_r = () => {\n\t\t\tprev();\n\t\t\ton_reset(true);\n\t\t};\n\t} else {\n\t\t// @ts-expect-error\n\t\telement.__on_r = () => on_reset(true);\n\t}\n\n\tadd_form_reset_listener();\n}\n","/** @import { Blocker, ComponentContext, ComponentContextLegacy, Derived, Effect, TemplateNode, TransitionManager } from '#client' */\nimport {\n\tis_dirty,\n\tactive_effect,\n\tactive_reaction,\n\tupdate_effect,\n\tget,\n\tis_destroying_effect,\n\tremove_reactions,\n\tset_active_reaction,\n\tset_is_destroying_effect,\n\tuntrack,\n\tuntracking\n} from '../runtime.js';\nimport {\n\tDIRTY,\n\tBRANCH_EFFECT,\n\tRENDER_EFFECT,\n\tEFFECT,\n\tDESTROYED,\n\tINERT,\n\tEFFECT_RAN,\n\tBLOCK_EFFECT,\n\tROOT_EFFECT,\n\tEFFECT_TRANSPARENT,\n\tDERIVED,\n\tCLEAN,\n\tEAGER_EFFECT,\n\tHEAD_EFFECT,\n\tMAYBE_DIRTY,\n\tEFFECT_PRESERVED,\n\tSTALE_REACTION,\n\tUSER_EFFECT,\n\tASYNC,\n\tCONNECTED,\n\tMANAGED_EFFECT\n} from '#client/constants';\nimport * as e from '../errors.js';\nimport { DEV } from 'esm-env';\nimport { define_property } from '../../shared/utils.js';\nimport { get_next_sibling } from '../dom/operations.js';\nimport { component_context, dev_current_component_function, dev_stack } from '../context.js';\nimport { Batch, current_batch, schedule_effect } from './batch.js';\nimport { flatten } from './async.js';\nimport { without_reactive_context } from '../dom/elements/bindings/shared.js';\nimport { set_signal_status } from './status.js';\n\n/**\n * @param {'$effect' | '$effect.pre' | '$inspect'} rune\n */\nexport function validate_effect(rune) {\n\tif (active_effect === null) {\n\t\tif (active_reaction === null) {\n\t\t\te.effect_orphan(rune);\n\t\t}\n\n\t\te.effect_in_unowned_derived();\n\t}\n\n\tif (is_destroying_effect) {\n\t\te.effect_in_teardown(rune);\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {Effect} parent_effect\n */\nfunction push_effect(effect, parent_effect) {\n\tvar parent_last = parent_effect.last;\n\tif (parent_last === null) {\n\t\tparent_effect.last = parent_effect.first = effect;\n\t} else {\n\t\tparent_last.next = effect;\n\t\teffect.prev = parent_last;\n\t\tparent_effect.last = effect;\n\t}\n}\n\n/**\n * @param {number} type\n * @param {null | (() => void | (() => void))} fn\n * @param {boolean} sync\n * @returns {Effect}\n */\nfunction create_effect(type, fn, sync) {\n\tvar parent = active_effect;\n\n\tif (DEV) {\n\t\t// Ensure the parent is never an inspect effect\n\t\twhile (parent !== null && (parent.f & EAGER_EFFECT) !== 0) {\n\t\t\tparent = parent.parent;\n\t\t}\n\t}\n\n\tif (parent !== null && (parent.f & INERT) !== 0) {\n\t\ttype |= INERT;\n\t}\n\n\t/** @type {Effect} */\n\tvar effect = {\n\t\tctx: component_context,\n\t\tdeps: null,\n\t\tnodes: null,\n\t\tf: type | DIRTY | CONNECTED,\n\t\tfirst: null,\n\t\tfn,\n\t\tlast: null,\n\t\tnext: null,\n\t\tparent,\n\t\tb: parent && parent.b,\n\t\tprev: null,\n\t\tteardown: null,\n\t\twv: 0,\n\t\tac: null\n\t};\n\n\tif (DEV) {\n\t\teffect.component_function = dev_current_component_function;\n\t}\n\n\tif (sync) {\n\t\ttry {\n\t\t\tupdate_effect(effect);\n\t\t\teffect.f |= EFFECT_RAN;\n\t\t} catch (e) {\n\t\t\tdestroy_effect(effect);\n\t\t\tthrow e;\n\t\t}\n\t} else if (fn !== null) {\n\t\tschedule_effect(effect);\n\t}\n\n\t/** @type {Effect | null} */\n\tvar e = effect;\n\n\t// if an effect has already ran and doesn't need to be kept in the tree\n\t// (because it won't re-run, has no DOM, and has no teardown etc)\n\t// then we skip it and go to its child (if any)\n\tif (\n\t\tsync &&\n\t\te.deps === null &&\n\t\te.teardown === null &&\n\t\te.nodes === null &&\n\t\te.first === e.last && // either `null`, or a singular child\n\t\t(e.f & EFFECT_PRESERVED) === 0\n\t) {\n\t\te = e.first;\n\t\tif ((type & BLOCK_EFFECT) !== 0 && (type & EFFECT_TRANSPARENT) !== 0 && e !== null) {\n\t\t\te.f |= EFFECT_TRANSPARENT;\n\t\t}\n\t}\n\n\tif (e !== null) {\n\t\te.parent = parent;\n\n\t\tif (parent !== null) {\n\t\t\tpush_effect(e, parent);\n\t\t}\n\n\t\t// if we're in a derived, add the effect there too\n\t\tif (\n\t\t\tactive_reaction !== null &&\n\t\t\t(active_reaction.f & DERIVED) !== 0 &&\n\t\t\t(type & ROOT_EFFECT) === 0\n\t\t) {\n\t\t\tvar derived = /** @type {Derived} */ (active_reaction);\n\t\t\t(derived.effects ??= []).push(e);\n\t\t}\n\t}\n\n\treturn effect;\n}\n\n/**\n * Internal representation of `$effect.tracking()`\n * @returns {boolean}\n */\nexport function effect_tracking() {\n\treturn active_reaction !== null && !untracking;\n}\n\n/**\n * @param {() => void} fn\n */\nexport function teardown(fn) {\n\tconst effect = create_effect(RENDER_EFFECT, null, false);\n\tset_signal_status(effect, CLEAN);\n\teffect.teardown = fn;\n\treturn effect;\n}\n\n/**\n * Internal representation of `$effect(...)`\n * @param {() => void | (() => void)} fn\n */\nexport function user_effect(fn) {\n\tvalidate_effect('$effect');\n\n\tif (DEV) {\n\t\tdefine_property(fn, 'name', {\n\t\t\tvalue: '$effect'\n\t\t});\n\t}\n\n\t// Non-nested `$effect(...)` in a component should be deferred\n\t// until the component is mounted\n\tvar flags = /** @type {Effect} */ (active_effect).f;\n\tvar defer = !active_reaction && (flags & BRANCH_EFFECT) !== 0 && (flags & EFFECT_RAN) === 0;\n\n\tif (defer) {\n\t\t// Top-level `$effect(...)` in an unmounted component — defer until mount\n\t\tvar context = /** @type {ComponentContext} */ (component_context);\n\t\t(context.e ??= []).push(fn);\n\t} else {\n\t\t// Everything else — create immediately\n\t\treturn create_user_effect(fn);\n\t}\n}\n\n/**\n * @param {() => void | (() => void)} fn\n */\nexport function create_user_effect(fn) {\n\treturn create_effect(EFFECT | USER_EFFECT, fn, false);\n}\n\n/**\n * Internal representation of `$effect.pre(...)`\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function user_pre_effect(fn) {\n\tvalidate_effect('$effect.pre');\n\tif (DEV) {\n\t\tdefine_property(fn, 'name', {\n\t\t\tvalue: '$effect.pre'\n\t\t});\n\t}\n\treturn create_effect(RENDER_EFFECT | USER_EFFECT, fn, true);\n}\n\n/** @param {() => void | (() => void)} fn */\nexport function eager_effect(fn) {\n\treturn create_effect(EAGER_EFFECT, fn, true);\n}\n\n/**\n * Internal representation of `$effect.root(...)`\n * @param {() => void | (() => void)} fn\n * @returns {() => void}\n */\nexport function effect_root(fn) {\n\tBatch.ensure();\n\tconst effect = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn, true);\n\n\treturn () => {\n\t\tdestroy_effect(effect);\n\t};\n}\n\n/**\n * An effect root whose children can transition out\n * @param {() => void} fn\n * @returns {(options?: { outro?: boolean }) => Promise<void>}\n */\nexport function component_root(fn) {\n\tBatch.ensure();\n\tconst effect = create_effect(ROOT_EFFECT | EFFECT_PRESERVED, fn, true);\n\n\treturn (options = {}) => {\n\t\treturn new Promise((fulfil) => {\n\t\t\tif (options.outro) {\n\t\t\t\tpause_effect(effect, () => {\n\t\t\t\t\tdestroy_effect(effect);\n\t\t\t\t\tfulfil(undefined);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdestroy_effect(effect);\n\t\t\t\tfulfil(undefined);\n\t\t\t}\n\t\t});\n\t};\n}\n\n/**\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function effect(fn) {\n\treturn create_effect(EFFECT, fn, false);\n}\n\n/**\n * Internal representation of `$: ..`\n * @param {() => any} deps\n * @param {() => void | (() => void)} fn\n */\nexport function legacy_pre_effect(deps, fn) {\n\tvar context = /** @type {ComponentContextLegacy} */ (component_context);\n\n\t/** @type {{ effect: null | Effect, ran: boolean, deps: () => any }} */\n\tvar token = { effect: null, ran: false, deps };\n\n\tcontext.l.$.push(token);\n\n\ttoken.effect = render_effect(() => {\n\t\tdeps();\n\n\t\t// If this legacy pre effect has already run before the end of the reset, then\n\t\t// bail out to emulate the same behavior.\n\t\tif (token.ran) return;\n\n\t\ttoken.ran = true;\n\t\tuntrack(fn);\n\t});\n}\n\nexport function legacy_pre_effect_reset() {\n\tvar context = /** @type {ComponentContextLegacy} */ (component_context);\n\n\trender_effect(() => {\n\t\t// Run dirty `$:` statements\n\t\tfor (var token of context.l.$) {\n\t\t\ttoken.deps();\n\n\t\t\tvar effect = token.effect;\n\n\t\t\t// If the effect is CLEAN, then make it MAYBE_DIRTY. This ensures we traverse through\n\t\t\t// the effects dependencies and correctly ensure each dependency is up-to-date.\n\t\t\tif ((effect.f & CLEAN) !== 0 && effect.deps !== null) {\n\t\t\t\tset_signal_status(effect, MAYBE_DIRTY);\n\t\t\t}\n\n\t\t\tif (is_dirty(effect)) {\n\t\t\t\tupdate_effect(effect);\n\t\t\t}\n\n\t\t\ttoken.ran = false;\n\t\t}\n\t});\n}\n\n/**\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function async_effect(fn) {\n\treturn create_effect(ASYNC | EFFECT_PRESERVED, fn, true);\n}\n\n/**\n * @param {() => void | (() => void)} fn\n * @returns {Effect}\n */\nexport function render_effect(fn, flags = 0) {\n\treturn create_effect(RENDER_EFFECT | flags, fn, true);\n}\n\n/**\n * @param {(...expressions: any) => void | (() => void)} fn\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {Blocker[]} blockers\n */\nexport function template_effect(fn, sync = [], async = [], blockers = []) {\n\tflatten(blockers, sync, async, (values) => {\n\t\tcreate_effect(RENDER_EFFECT, () => fn(...values.map(get)), true);\n\t});\n}\n\n/**\n * Like `template_effect`, but with an effect which is deferred until the batch commits\n * @param {(...expressions: any) => void | (() => void)} fn\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {Blocker[]} blockers\n */\nexport function deferred_template_effect(fn, sync = [], async = [], blockers = []) {\n\tvar batch = /** @type {Batch} */ (current_batch);\n\tvar is_async = async.length > 0 || blockers.length > 0;\n\n\tif (is_async) batch.increment(true);\n\n\tflatten(blockers, sync, async, (values) => {\n\t\tcreate_effect(EFFECT, () => fn(...values.map(get)), false);\n\t\tif (is_async) batch.decrement(true);\n\t});\n}\n\n/**\n * @param {(() => void)} fn\n * @param {number} flags\n */\nexport function block(fn, flags = 0) {\n\tvar effect = create_effect(BLOCK_EFFECT | flags, fn, true);\n\tif (DEV) {\n\t\teffect.dev_stack = dev_stack;\n\t}\n\treturn effect;\n}\n\n/**\n * @param {(() => void)} fn\n * @param {number} flags\n */\nexport function managed(fn, flags = 0) {\n\tvar effect = create_effect(MANAGED_EFFECT | flags, fn, true);\n\tif (DEV) {\n\t\teffect.dev_stack = dev_stack;\n\t}\n\treturn effect;\n}\n\n/**\n * @param {(() => void)} fn\n */\nexport function branch(fn) {\n\treturn create_effect(BRANCH_EFFECT | EFFECT_PRESERVED, fn, true);\n}\n\n/**\n * @param {Effect} effect\n */\nexport function execute_effect_teardown(effect) {\n\tvar teardown = effect.teardown;\n\tif (teardown !== null) {\n\t\tconst previously_destroying_effect = is_destroying_effect;\n\t\tconst previous_reaction = active_reaction;\n\t\tset_is_destroying_effect(true);\n\t\tset_active_reaction(null);\n\t\ttry {\n\t\t\tteardown.call(null);\n\t\t} finally {\n\t\t\tset_is_destroying_effect(previously_destroying_effect);\n\t\t\tset_active_reaction(previous_reaction);\n\t\t}\n\t}\n}\n\n/**\n * @param {Effect} signal\n * @param {boolean} remove_dom\n * @returns {void}\n */\nexport function destroy_effect_children(signal, remove_dom = false) {\n\tvar effect = signal.first;\n\tsignal.first = signal.last = null;\n\n\twhile (effect !== null) {\n\t\tconst controller = effect.ac;\n\n\t\tif (controller !== null) {\n\t\t\twithout_reactive_context(() => {\n\t\t\t\tcontroller.abort(STALE_REACTION);\n\t\t\t});\n\t\t}\n\n\t\tvar next = effect.next;\n\n\t\tif ((effect.f & ROOT_EFFECT) !== 0) {\n\t\t\t// this is now an independent root\n\t\t\teffect.parent = null;\n\t\t} else {\n\t\t\tdestroy_effect(effect, remove_dom);\n\t\t}\n\n\t\teffect = next;\n\t}\n}\n\n/**\n * @param {Effect} signal\n * @returns {void}\n */\nexport function destroy_block_effect_children(signal) {\n\tvar effect = signal.first;\n\n\twhile (effect !== null) {\n\t\tvar next = effect.next;\n\t\tif ((effect.f & BRANCH_EFFECT) === 0) {\n\t\t\tdestroy_effect(effect);\n\t\t}\n\t\teffect = next;\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {boolean} [remove_dom]\n * @returns {void}\n */\nexport function destroy_effect(effect, remove_dom = true) {\n\tvar removed = false;\n\n\tif (\n\t\t(remove_dom || (effect.f & HEAD_EFFECT) !== 0) &&\n\t\teffect.nodes !== null &&\n\t\teffect.nodes.end !== null\n\t) {\n\t\tremove_effect_dom(effect.nodes.start, /** @type {TemplateNode} */ (effect.nodes.end));\n\t\tremoved = true;\n\t}\n\n\tdestroy_effect_children(effect, remove_dom && !removed);\n\tremove_reactions(effect, 0);\n\tset_signal_status(effect, DESTROYED);\n\n\tvar transitions = effect.nodes && effect.nodes.t;\n\n\tif (transitions !== null) {\n\t\tfor (const transition of transitions) {\n\t\t\ttransition.stop();\n\t\t}\n\t}\n\n\texecute_effect_teardown(effect);\n\n\tvar parent = effect.parent;\n\n\t// If the parent doesn't have any children, then skip this work altogether\n\tif (parent !== null && parent.first !== null) {\n\t\tunlink_effect(effect);\n\t}\n\n\tif (DEV) {\n\t\teffect.component_function = null;\n\t}\n\n\t// `first` and `child` are nulled out in destroy_effect_children\n\t// we don't null out `parent` so that error propagation can work correctly\n\teffect.next =\n\t\teffect.prev =\n\t\teffect.teardown =\n\t\teffect.ctx =\n\t\teffect.deps =\n\t\teffect.fn =\n\t\teffect.nodes =\n\t\teffect.ac =\n\t\t\tnull;\n}\n\n/**\n *\n * @param {TemplateNode | null} node\n * @param {TemplateNode} end\n */\nexport function remove_effect_dom(node, end) {\n\twhile (node !== null) {\n\t\t/** @type {TemplateNode | null} */\n\t\tvar next = node === end ? null : get_next_sibling(node);\n\n\t\tnode.remove();\n\t\tnode = next;\n\t}\n}\n\n/**\n * Detach an effect from the effect tree, freeing up memory and\n * reducing the amount of work that happens on subsequent traversals\n * @param {Effect} effect\n */\nexport function unlink_effect(effect) {\n\tvar parent = effect.parent;\n\tvar prev = effect.prev;\n\tvar next = effect.next;\n\n\tif (prev !== null) prev.next = next;\n\tif (next !== null) next.prev = prev;\n\n\tif (parent !== null) {\n\t\tif (parent.first === effect) parent.first = next;\n\t\tif (parent.last === effect) parent.last = prev;\n\t}\n}\n\n/**\n * When a block effect is removed, we don't immediately destroy it or yank it\n * out of the DOM, because it might have transitions. Instead, we 'pause' it.\n * It stays around (in memory, and in the DOM) until outro transitions have\n * completed, and if the state change is reversed then we _resume_ it.\n * A paused effect does not update, and the DOM subtree becomes inert.\n * @param {Effect} effect\n * @param {() => void} [callback]\n * @param {boolean} [destroy]\n */\nexport function pause_effect(effect, callback, destroy = true) {\n\t/** @type {TransitionManager[]} */\n\tvar transitions = [];\n\n\tpause_children(effect, transitions, true);\n\n\tvar fn = () => {\n\t\tif (destroy) destroy_effect(effect);\n\t\tif (callback) callback();\n\t};\n\n\tvar remaining = transitions.length;\n\tif (remaining > 0) {\n\t\tvar check = () => --remaining || fn();\n\t\tfor (var transition of transitions) {\n\t\t\ttransition.out(check);\n\t\t}\n\t} else {\n\t\tfn();\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @param {TransitionManager[]} transitions\n * @param {boolean} local\n */\nfunction pause_children(effect, transitions, local) {\n\tif ((effect.f & INERT) !== 0) return;\n\teffect.f ^= INERT;\n\n\tvar t = effect.nodes && effect.nodes.t;\n\n\tif (t !== null) {\n\t\tfor (const transition of t) {\n\t\t\tif (transition.is_global || local) {\n\t\t\t\ttransitions.push(transition);\n\t\t\t}\n\t\t}\n\t}\n\n\tvar child = effect.first;\n\n\twhile (child !== null) {\n\t\tvar sibling = child.next;\n\t\tvar transparent =\n\t\t\t(child.f & EFFECT_TRANSPARENT) !== 0 ||\n\t\t\t// If this is a branch effect without a block effect parent,\n\t\t\t// it means the parent block effect was pruned. In that case,\n\t\t\t// transparency information was transferred to the branch effect.\n\t\t\t((child.f & BRANCH_EFFECT) !== 0 && (effect.f & BLOCK_EFFECT) !== 0);\n\t\t// TODO we don't need to call pause_children recursively with a linked list in place\n\t\t// it's slightly more involved though as we have to account for `transparent` changing\n\t\t// through the tree.\n\t\tpause_children(child, transitions, transparent ? local : false);\n\t\tchild = sibling;\n\t}\n}\n\n/**\n * The opposite of `pause_effect`. We call this if (for example)\n * `x` becomes falsy then truthy: `{#if x}...{/if}`\n * @param {Effect} effect\n */\nexport function resume_effect(effect) {\n\tresume_children(effect, true);\n}\n\n/**\n * @param {Effect} effect\n * @param {boolean} local\n */\nfunction resume_children(effect, local) {\n\tif ((effect.f & INERT) === 0) return;\n\teffect.f ^= INERT;\n\n\t// If a dependency of this effect changed while it was paused,\n\t// schedule the effect to update. we don't use `is_dirty`\n\t// here because we don't want to eagerly recompute a derived like\n\t// `{#if foo}{foo.bar()}{/if}` if `foo` is now `undefined\n\tif ((effect.f & CLEAN) === 0) {\n\t\tset_signal_status(effect, DIRTY);\n\t\tschedule_effect(effect);\n\t}\n\n\tvar child = effect.first;\n\n\twhile (child !== null) {\n\t\tvar sibling = child.next;\n\t\tvar transparent = (child.f & EFFECT_TRANSPARENT) !== 0 || (child.f & BRANCH_EFFECT) !== 0;\n\t\t// TODO we don't need to call resume_children recursively with a linked list in place\n\t\t// it's slightly more involved though as we have to account for `transparent` changing\n\t\t// through the tree.\n\t\tresume_children(child, transparent ? local : false);\n\t\tchild = sibling;\n\t}\n\n\tvar t = effect.nodes && effect.nodes.t;\n\n\tif (t !== null) {\n\t\tfor (const transition of t) {\n\t\t\tif (transition.is_global || local) {\n\t\t\t\ttransition.in();\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function aborted(effect = /** @type {Effect} */ (active_effect)) {\n\treturn (effect.f & DESTROYED) !== 0;\n}\n\n/**\n * @param {Effect} effect\n * @param {DocumentFragment} fragment\n */\nexport function move_effect(effect, fragment) {\n\tif (!effect.nodes) return;\n\n\t/** @type {TemplateNode | null} */\n\tvar node = effect.nodes.start;\n\tvar end = effect.nodes.end;\n\n\twhile (node !== null) {\n\t\t/** @type {TemplateNode | null} */\n\t\tvar next = node === end ? null : get_next_sibling(node);\n\n\t\tfragment.append(node);\n\t\tnode = next;\n\t}\n}\n","/** @import { Derived, Effect, Reaction, Source, Value } from '#client' */\nimport { DEV } from 'esm-env';\nimport { get_descriptors, get_prototype_of, includes, index_of } from '../shared/utils.js';\nimport {\n\tdestroy_block_effect_children,\n\tdestroy_effect_children,\n\teffect_tracking,\n\texecute_effect_teardown\n} from './reactivity/effects.js';\nimport {\n\tDIRTY,\n\tMAYBE_DIRTY,\n\tCLEAN,\n\tDERIVED,\n\tDESTROYED,\n\tBRANCH_EFFECT,\n\tSTATE_SYMBOL,\n\tBLOCK_EFFECT,\n\tROOT_EFFECT,\n\tCONNECTED,\n\tREACTION_IS_UPDATING,\n\tSTALE_REACTION,\n\tERROR_VALUE,\n\tWAS_MARKED,\n\tMANAGED_EFFECT\n} from './constants.js';\nimport { old_values } from './reactivity/sources.js';\nimport {\n\tdestroy_derived_effects,\n\texecute_derived,\n\trecent_async_deriveds,\n\tupdate_derived\n} from './reactivity/deriveds.js';\nimport { async_mode_flag, tracing_mode_flag } from '../flags/index.js';\nimport { tracing_expressions } from './dev/tracing.js';\nimport { get_error } from '../shared/dev.js';\nimport {\n\tcomponent_context,\n\tdev_current_component_function,\n\tdev_stack,\n\tis_runes,\n\tset_component_context,\n\tset_dev_current_component_function,\n\tset_dev_stack\n} from './context.js';\nimport {\n\tBatch,\n\tbatch_values,\n\tcurrent_batch,\n\tflushSync,\n\tschedule_effect\n} from './reactivity/batch.js';\nimport { handle_error } from './error-handling.js';\nimport { UNINITIALIZED } from '../../constants.js';\nimport { captured_signals } from './legacy.js';\nimport { without_reactive_context } from './dom/elements/bindings/shared.js';\nimport { set_signal_status, update_derived_status } from './reactivity/status.js';\n\nlet is_updating_effect = false;\n\nexport let is_destroying_effect = false;\n\n/** @param {boolean} value */\nexport function set_is_destroying_effect(value) {\n\tis_destroying_effect = value;\n}\n\n/** @type {null | Reaction} */\nexport let active_reaction = null;\n\nexport let untracking = false;\n\n/** @param {null | Reaction} reaction */\nexport function set_active_reaction(reaction) {\n\tactive_reaction = reaction;\n}\n\n/** @type {null | Effect} */\nexport let active_effect = null;\n\n/** @param {null | Effect} effect */\nexport function set_active_effect(effect) {\n\tactive_effect = effect;\n}\n\n/**\n * When sources are created within a reaction, reading and writing\n * them within that reaction should not cause a re-run\n * @type {null | Source[]}\n */\nexport let current_sources = null;\n\n/** @param {Value} value */\nexport function push_reaction_value(value) {\n\tif (active_reaction !== null && (!async_mode_flag || (active_reaction.f & DERIVED) !== 0)) {\n\t\tif (current_sources === null) {\n\t\t\tcurrent_sources = [value];\n\t\t} else {\n\t\t\tcurrent_sources.push(value);\n\t\t}\n\t}\n}\n\n/**\n * The dependencies of the reaction that is currently being executed. In many cases,\n * the dependencies are unchanged between runs, and so this will be `null` unless\n * and until a new dependency is accessed — we track this via `skipped_deps`\n * @type {null | Value[]}\n */\nlet new_deps = null;\n\nlet skipped_deps = 0;\n\n/**\n * Tracks writes that the effect it's executed in doesn't listen to yet,\n * so that the dependency can be added to the effect later on if it then reads it\n * @type {null | Source[]}\n */\nexport let untracked_writes = null;\n\n/** @param {null | Source[]} value */\nexport function set_untracked_writes(value) {\n\tuntracked_writes = value;\n}\n\n/**\n * @type {number} Used by sources and deriveds for handling updates.\n * Version starts from 1 so that unowned deriveds differentiate between a created effect and a run one for tracing\n **/\nexport let write_version = 1;\n\n/** @type {number} Used to version each read of a source of derived to avoid duplicating depedencies inside a reaction */\nlet read_version = 0;\n\nexport let update_version = read_version;\n\n/** @param {number} value */\nexport function set_update_version(value) {\n\tupdate_version = value;\n}\n\nexport function increment_write_version() {\n\treturn ++write_version;\n}\n\n/**\n * Determines whether a derived or effect is dirty.\n * If it is MAYBE_DIRTY, will set the status to CLEAN\n * @param {Reaction} reaction\n * @returns {boolean}\n */\nexport function is_dirty(reaction) {\n\tvar flags = reaction.f;\n\n\tif ((flags & DIRTY) !== 0) {\n\t\treturn true;\n\t}\n\n\tif (flags & DERIVED) {\n\t\treaction.f &= ~WAS_MARKED;\n\t}\n\n\tif ((flags & MAYBE_DIRTY) !== 0) {\n\t\tvar dependencies = /** @type {Value[]} */ (reaction.deps);\n\t\tvar length = dependencies.length;\n\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tvar dependency = dependencies[i];\n\n\t\t\tif (is_dirty(/** @type {Derived} */ (dependency))) {\n\t\t\t\tupdate_derived(/** @type {Derived} */ (dependency));\n\t\t\t}\n\n\t\t\tif (dependency.wv > reaction.wv) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\t(flags & CONNECTED) !== 0 &&\n\t\t\t// During time traveling we don't want to reset the status so that\n\t\t\t// traversal of the graph in the other batches still happens\n\t\t\tbatch_values === null\n\t\t) {\n\t\t\tset_signal_status(reaction, CLEAN);\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * @param {Value} signal\n * @param {Effect} effect\n * @param {boolean} [root]\n */\nfunction schedule_possible_effect_self_invalidation(signal, effect, root = true) {\n\tvar reactions = signal.reactions;\n\tif (reactions === null) return;\n\n\tif (!async_mode_flag && current_sources !== null && includes.call(current_sources, signal)) {\n\t\treturn;\n\t}\n\n\tfor (var i = 0; i < reactions.length; i++) {\n\t\tvar reaction = reactions[i];\n\n\t\tif ((reaction.f & DERIVED) !== 0) {\n\t\t\tschedule_possible_effect_self_invalidation(/** @type {Derived} */ (reaction), effect, false);\n\t\t} else if (effect === reaction) {\n\t\t\tif (root) {\n\t\t\t\tset_signal_status(reaction, DIRTY);\n\t\t\t} else if ((reaction.f & CLEAN) !== 0) {\n\t\t\t\tset_signal_status(reaction, MAYBE_DIRTY);\n\t\t\t}\n\t\t\tschedule_effect(/** @type {Effect} */ (reaction));\n\t\t}\n\t}\n}\n\n/** @param {Reaction} reaction */\nexport function update_reaction(reaction) {\n\tvar previous_deps = new_deps;\n\tvar previous_skipped_deps = skipped_deps;\n\tvar previous_untracked_writes = untracked_writes;\n\tvar previous_reaction = active_reaction;\n\tvar previous_sources = current_sources;\n\tvar previous_component_context = component_context;\n\tvar previous_untracking = untracking;\n\tvar previous_update_version = update_version;\n\n\tvar flags = reaction.f;\n\n\tnew_deps = /** @type {null | Value[]} */ (null);\n\tskipped_deps = 0;\n\tuntracked_writes = null;\n\tactive_reaction = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ? reaction : null;\n\n\tcurrent_sources = null;\n\tset_component_context(reaction.ctx);\n\tuntracking = false;\n\tupdate_version = ++read_version;\n\n\tif (reaction.ac !== null) {\n\t\twithout_reactive_context(() => {\n\t\t\t/** @type {AbortController} */ (reaction.ac).abort(STALE_REACTION);\n\t\t});\n\n\t\treaction.ac = null;\n\t}\n\n\ttry {\n\t\treaction.f |= REACTION_IS_UPDATING;\n\t\tvar fn = /** @type {Function} */ (reaction.fn);\n\t\tvar result = fn();\n\t\tvar deps = reaction.deps;\n\n\t\t// Don't remove reactions during fork;\n\t\t// they must remain for when fork is discarded\n\t\tvar is_fork = current_batch?.is_fork;\n\n\t\tif (new_deps !== null) {\n\t\t\tvar i;\n\n\t\t\tif (!is_fork) {\n\t\t\t\tremove_reactions(reaction, skipped_deps);\n\t\t\t}\n\n\t\t\tif (deps !== null && skipped_deps > 0) {\n\t\t\t\tdeps.length = skipped_deps + new_deps.length;\n\t\t\t\tfor (i = 0; i < new_deps.length; i++) {\n\t\t\t\t\tdeps[skipped_deps + i] = new_deps[i];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treaction.deps = deps = new_deps;\n\t\t\t}\n\n\t\t\tif (effect_tracking() && (reaction.f & CONNECTED) !== 0) {\n\t\t\t\tfor (i = skipped_deps; i < deps.length; i++) {\n\t\t\t\t\t(deps[i].reactions ??= []).push(reaction);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!is_fork && deps !== null && skipped_deps < deps.length) {\n\t\t\tremove_reactions(reaction, skipped_deps);\n\t\t\tdeps.length = skipped_deps;\n\t\t}\n\n\t\t// If we're inside an effect and we have untracked writes, then we need to\n\t\t// ensure that if any of those untracked writes result in re-invalidation\n\t\t// of the current effect, then that happens accordingly\n\t\tif (\n\t\t\tis_runes() &&\n\t\t\tuntracked_writes !== null &&\n\t\t\t!untracking &&\n\t\t\tdeps !== null &&\n\t\t\t(reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0\n\t\t) {\n\t\t\tfor (i = 0; i < /** @type {Source[]} */ (untracked_writes).length; i++) {\n\t\t\t\tschedule_possible_effect_self_invalidation(\n\t\t\t\t\tuntracked_writes[i],\n\t\t\t\t\t/** @type {Effect} */ (reaction)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// If we are returning to an previous reaction then\n\t\t// we need to increment the read version to ensure that\n\t\t// any dependencies in this reaction aren't marked with\n\t\t// the same version\n\t\tif (previous_reaction !== null && previous_reaction !== reaction) {\n\t\t\tread_version++;\n\n\t\t\t// update the `rv` of the previous reaction's deps — both existing and new —\n\t\t\t// so that they are not added again\n\t\t\tif (previous_reaction.deps !== null) {\n\t\t\t\tfor (let i = 0; i < previous_skipped_deps; i += 1) {\n\t\t\t\t\tprevious_reaction.deps[i].rv = read_version;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (previous_deps !== null) {\n\t\t\t\tfor (const dep of previous_deps) {\n\t\t\t\t\tdep.rv = read_version;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (untracked_writes !== null) {\n\t\t\t\tif (previous_untracked_writes === null) {\n\t\t\t\t\tprevious_untracked_writes = untracked_writes;\n\t\t\t\t} else {\n\t\t\t\t\tprevious_untracked_writes.push(.../** @type {Source[]} */ (untracked_writes));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ((reaction.f & ERROR_VALUE) !== 0) {\n\t\t\treaction.f ^= ERROR_VALUE;\n\t\t}\n\n\t\treturn result;\n\t} catch (error) {\n\t\treturn handle_error(error);\n\t} finally {\n\t\treaction.f ^= REACTION_IS_UPDATING;\n\t\tnew_deps = previous_deps;\n\t\tskipped_deps = previous_skipped_deps;\n\t\tuntracked_writes = previous_untracked_writes;\n\t\tactive_reaction = previous_reaction;\n\t\tcurrent_sources = previous_sources;\n\t\tset_component_context(previous_component_context);\n\t\tuntracking = previous_untracking;\n\t\tupdate_version = previous_update_version;\n\t}\n}\n\n/**\n * @template V\n * @param {Reaction} signal\n * @param {Value<V>} dependency\n * @returns {void}\n */\nfunction remove_reaction(signal, dependency) {\n\tlet reactions = dependency.reactions;\n\tif (reactions !== null) {\n\t\tvar index = index_of.call(reactions, signal);\n\t\tif (index !== -1) {\n\t\t\tvar new_length = reactions.length - 1;\n\t\t\tif (new_length === 0) {\n\t\t\t\treactions = dependency.reactions = null;\n\t\t\t} else {\n\t\t\t\t// Swap with last element and then remove.\n\t\t\t\treactions[index] = reactions[new_length];\n\t\t\t\treactions.pop();\n\t\t\t}\n\t\t}\n\t}\n\n\t// If the derived has no reactions, then we can disconnect it from the graph,\n\t// allowing it to either reconnect in the future, or be GC'd by the VM.\n\tif (\n\t\treactions === null &&\n\t\t(dependency.f & DERIVED) !== 0 &&\n\t\t// Destroying a child effect while updating a parent effect can cause a dependency to appear\n\t\t// to be unused, when in fact it is used by the currently-updating parent. Checking `new_deps`\n\t\t// allows us to skip the expensive work of disconnecting and immediately reconnecting it\n\t\t(new_deps === null || !includes.call(new_deps, dependency))\n\t) {\n\t\tvar derived = /** @type {Derived} */ (dependency);\n\n\t\t// If we are working with a derived that is owned by an effect, then mark it as being\n\t\t// disconnected and remove the mark flag, as it cannot be reliably removed otherwise\n\t\tif ((derived.f & CONNECTED) !== 0) {\n\t\t\tderived.f ^= CONNECTED;\n\t\t\tderived.f &= ~WAS_MARKED;\n\t\t}\n\n\t\tupdate_derived_status(derived);\n\n\t\t// Disconnect any reactions owned by this reaction\n\t\tdestroy_derived_effects(derived);\n\t\tremove_reactions(derived, 0);\n\t}\n}\n\n/**\n * @param {Reaction} signal\n * @param {number} start_index\n * @returns {void}\n */\nexport function remove_reactions(signal, start_index) {\n\tvar dependencies = signal.deps;\n\tif (dependencies === null) return;\n\n\tfor (var i = start_index; i < dependencies.length; i++) {\n\t\tremove_reaction(signal, dependencies[i]);\n\t}\n}\n\n/**\n * @param {Effect} effect\n * @returns {void}\n */\nexport function update_effect(effect) {\n\tvar flags = effect.f;\n\n\tif ((flags & DESTROYED) !== 0) {\n\t\treturn;\n\t}\n\n\tset_signal_status(effect, CLEAN);\n\n\tvar previous_effect = active_effect;\n\tvar was_updating_effect = is_updating_effect;\n\n\tactive_effect = effect;\n\tis_updating_effect = true;\n\n\tif (DEV) {\n\t\tvar previous_component_fn = dev_current_component_function;\n\t\tset_dev_current_component_function(effect.component_function);\n\t\tvar previous_stack = /** @type {any} */ (dev_stack);\n\t\t// only block effects have a dev stack, keep the current one otherwise\n\t\tset_dev_stack(effect.dev_stack ?? dev_stack);\n\t}\n\n\ttry {\n\t\tif ((flags & (BLOCK_EFFECT | MANAGED_EFFECT)) !== 0) {\n\t\t\tdestroy_block_effect_children(effect);\n\t\t} else {\n\t\t\tdestroy_effect_children(effect);\n\t\t}\n\n\t\texecute_effect_teardown(effect);\n\t\tvar teardown = update_reaction(effect);\n\t\teffect.teardown = typeof teardown === 'function' ? teardown : null;\n\t\teffect.wv = write_version;\n\n\t\t// In DEV, increment versions of any sources that were written to during the effect,\n\t\t// so that they are correctly marked as dirty when the effect re-runs\n\t\tif (DEV && tracing_mode_flag && (effect.f & DIRTY) !== 0 && effect.deps !== null) {\n\t\t\tfor (var dep of effect.deps) {\n\t\t\t\tif (dep.set_during_effect) {\n\t\t\t\t\tdep.wv = increment_write_version();\n\t\t\t\t\tdep.set_during_effect = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tis_updating_effect = was_updating_effect;\n\t\tactive_effect = previous_effect;\n\n\t\tif (DEV) {\n\t\t\tset_dev_current_component_function(previous_component_fn);\n\t\t\tset_dev_stack(previous_stack);\n\t\t}\n\t}\n}\n\n/**\n * Returns a promise that resolves once any pending state changes have been applied.\n * @returns {Promise<void>}\n */\nexport async function tick() {\n\tif (async_mode_flag) {\n\t\treturn new Promise((f) => {\n\t\t\t// Race them against each other - in almost all cases requestAnimationFrame will fire first,\n\t\t\t// but e.g. in case the window is not focused or a view transition happens, requestAnimationFrame\n\t\t\t// will be delayed and setTimeout helps us resolve fast enough in that case\n\t\t\trequestAnimationFrame(() => f());\n\t\t\tsetTimeout(() => f());\n\t\t});\n\t}\n\n\tawait Promise.resolve();\n\n\t// By calling flushSync we guarantee that any pending state changes are applied after one tick.\n\t// TODO look into whether we can make flushing subsequent updates synchronously in the future.\n\tflushSync();\n}\n\n/**\n * Returns a promise that resolves once any state changes, and asynchronous work resulting from them,\n * have resolved and the DOM has been updated\n * @returns {Promise<void>}\n * @since 5.36\n */\nexport function settled() {\n\treturn Batch.ensure().settled();\n}\n\n/**\n * @template V\n * @param {Value<V>} signal\n * @returns {V}\n */\nexport function get(signal) {\n\tvar flags = signal.f;\n\tvar is_derived = (flags & DERIVED) !== 0;\n\n\tcaptured_signals?.add(signal);\n\n\t// Register the dependency on the current reaction signal.\n\tif (active_reaction !== null && !untracking) {\n\t\t// if we're in a derived that is being read inside an _async_ derived,\n\t\t// it's possible that the effect was already destroyed. In this case,\n\t\t// we don't add the dependency, because that would create a memory leak\n\t\tvar destroyed = active_effect !== null && (active_effect.f & DESTROYED) !== 0;\n\n\t\tif (!destroyed && (current_sources === null || !includes.call(current_sources, signal))) {\n\t\t\tvar deps = active_reaction.deps;\n\n\t\t\tif ((active_reaction.f & REACTION_IS_UPDATING) !== 0) {\n\t\t\t\t// we're in the effect init/update cycle\n\t\t\t\tif (signal.rv < read_version) {\n\t\t\t\t\tsignal.rv = read_version;\n\n\t\t\t\t\t// If the signal is accessing the same dependencies in the same\n\t\t\t\t\t// order as it did last time, increment `skipped_deps`\n\t\t\t\t\t// rather than updating `new_deps`, which creates GC cost\n\t\t\t\t\tif (new_deps === null && deps !== null && deps[skipped_deps] === signal) {\n\t\t\t\t\t\tskipped_deps++;\n\t\t\t\t\t} else if (new_deps === null) {\n\t\t\t\t\t\tnew_deps = [signal];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnew_deps.push(signal);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// we're adding a dependency outside the init/update cycle\n\t\t\t\t// (i.e. after an `await`)\n\t\t\t\t(active_reaction.deps ??= []).push(signal);\n\n\t\t\t\tvar reactions = signal.reactions;\n\n\t\t\t\tif (reactions === null) {\n\t\t\t\t\tsignal.reactions = [active_reaction];\n\t\t\t\t} else if (!includes.call(reactions, active_reaction)) {\n\t\t\t\t\treactions.push(active_reaction);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (DEV) {\n\t\t// TODO reinstate this, but make it actually work\n\t\t// if (current_async_effect) {\n\t\t// \tvar tracking = (current_async_effect.f & REACTION_IS_UPDATING) !== 0;\n\t\t// \tvar was_read = current_async_effect.deps?.includes(signal);\n\n\t\t// \tif (!tracking && !untracking && !was_read) {\n\t\t// \t\tw.await_reactivity_loss(/** @type {string} */ (signal.label));\n\n\t\t// \t\tvar trace = get_error('traced at');\n\t\t// \t\t// eslint-disable-next-line no-console\n\t\t// \t\tif (trace) console.warn(trace);\n\t\t// \t}\n\t\t// }\n\n\t\trecent_async_deriveds.delete(signal);\n\n\t\tif (\n\t\t\ttracing_mode_flag &&\n\t\t\t!untracking &&\n\t\t\ttracing_expressions !== null &&\n\t\t\tactive_reaction !== null &&\n\t\t\ttracing_expressions.reaction === active_reaction\n\t\t) {\n\t\t\t// Used when mapping state between special blocks like `each`\n\t\t\tif (signal.trace) {\n\t\t\t\tsignal.trace();\n\t\t\t} else {\n\t\t\t\tvar trace = get_error('traced at');\n\n\t\t\t\tif (trace) {\n\t\t\t\t\tvar entry = tracing_expressions.entries.get(signal);\n\n\t\t\t\t\tif (entry === undefined) {\n\t\t\t\t\t\tentry = { traces: [] };\n\t\t\t\t\t\ttracing_expressions.entries.set(signal, entry);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar last = entry.traces[entry.traces.length - 1];\n\n\t\t\t\t\t// traces can be duplicated, e.g. by `snapshot` invoking both\n\t\t\t\t\t// both `getOwnPropertyDescriptor` and `get` traps at once\n\t\t\t\t\tif (trace.stack !== last?.stack) {\n\t\t\t\t\t\tentry.traces.push(trace);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (is_destroying_effect && old_values.has(signal)) {\n\t\treturn old_values.get(signal);\n\t}\n\n\tif (is_derived) {\n\t\tvar derived = /** @type {Derived} */ (signal);\n\n\t\tif (is_destroying_effect) {\n\t\t\tvar value = derived.v;\n\n\t\t\t// if the derived is dirty and has reactions, or depends on the values that just changed, re-execute\n\t\t\t// (a derived can be maybe_dirty due to the effect destroy removing its last reaction)\n\t\t\tif (\n\t\t\t\t((derived.f & CLEAN) === 0 && derived.reactions !== null) ||\n\t\t\t\tdepends_on_old_values(derived)\n\t\t\t) {\n\t\t\t\tvalue = execute_derived(derived);\n\t\t\t}\n\n\t\t\told_values.set(derived, value);\n\n\t\t\treturn value;\n\t\t}\n\n\t\t// connect disconnected deriveds if we are reading them inside an effect,\n\t\t// or inside another derived that is already connected\n\t\tvar should_connect =\n\t\t\t(derived.f & CONNECTED) === 0 &&\n\t\t\t!untracking &&\n\t\t\tactive_reaction !== null &&\n\t\t\t(is_updating_effect || (active_reaction.f & CONNECTED) !== 0);\n\n\t\tvar is_new = derived.deps === null;\n\n\t\tif (is_dirty(derived)) {\n\t\t\tif (should_connect) {\n\t\t\t\t// set the flag before `update_derived`, so that the derived\n\t\t\t\t// is added as a reaction to its dependencies\n\t\t\t\tderived.f |= CONNECTED;\n\t\t\t}\n\n\t\t\tupdate_derived(derived);\n\t\t}\n\n\t\tif (should_connect && !is_new) {\n\t\t\treconnect(derived);\n\t\t}\n\t}\n\n\tif (batch_values?.has(signal)) {\n\t\treturn batch_values.get(signal);\n\t}\n\n\tif ((signal.f & ERROR_VALUE) !== 0) {\n\t\tthrow signal.v;\n\t}\n\n\treturn signal.v;\n}\n\n/**\n * (Re)connect a disconnected derived, so that it is notified\n * of changes in `mark_reactions`\n * @param {Derived} derived\n */\nfunction reconnect(derived) {\n\tif (derived.deps === null) return;\n\n\tderived.f |= CONNECTED;\n\n\tfor (const dep of derived.deps) {\n\t\t(dep.reactions ??= []).push(derived);\n\n\t\tif ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) {\n\t\t\treconnect(/** @type {Derived} */ (dep));\n\t\t}\n\t}\n}\n\n/** @param {Derived} derived */\nfunction depends_on_old_values(derived) {\n\tif (derived.v === UNINITIALIZED) return true; // we don't know, so assume the worst\n\tif (derived.deps === null) return false;\n\n\tfor (const dep of derived.deps) {\n\t\tif (old_values.has(dep)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((dep.f & DERIVED) !== 0 && depends_on_old_values(/** @type {Derived} */ (dep))) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Like `get`, but checks for `undefined`. Used for `var` declarations because they can be accessed before being declared\n * @template V\n * @param {Value<V> | undefined} signal\n * @returns {V | undefined}\n */\nexport function safe_get(signal) {\n\treturn signal && get(signal);\n}\n\n/**\n * When used inside a [`$derived`](https://svelte.dev/docs/svelte/$derived) or [`$effect`](https://svelte.dev/docs/svelte/$effect),\n * any state read inside `fn` will not be treated as a dependency.\n *\n * ```ts\n * $effect(() => {\n * // this will run when `data` changes, but not when `time` changes\n * save(data, {\n * timestamp: untrack(() => time)\n * });\n * });\n * ```\n * @template T\n * @param {() => T} fn\n * @returns {T}\n */\nexport function untrack(fn) {\n\tvar previous_untracking = untracking;\n\ttry {\n\t\tuntracking = true;\n\t\treturn fn();\n\t} finally {\n\t\tuntracking = previous_untracking;\n\t}\n}\n\n/**\n * @param {Record<string | symbol, unknown>} obj\n * @param {Array<string | symbol>} keys\n * @returns {Record<string | symbol, unknown>}\n */\nexport function exclude_from_object(obj, keys) {\n\t/** @type {Record<string | symbol, unknown>} */\n\tvar result = {};\n\n\tfor (var key in obj) {\n\t\tif (!keys.includes(key)) {\n\t\t\tresult[key] = obj[key];\n\t\t}\n\t}\n\n\tfor (var symbol of Object.getOwnPropertySymbols(obj)) {\n\t\tif (Object.propertyIsEnumerable.call(obj, symbol) && !keys.includes(symbol)) {\n\t\t\tresult[symbol] = obj[symbol];\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Possibly traverse an object and read all its properties so that they're all reactive in case this is `$state`.\n * Does only check first level of an object for performance reasons (heuristic should be good for 99% of all cases).\n * @param {any} value\n * @returns {void}\n */\nexport function deep_read_state(value) {\n\tif (typeof value !== 'object' || !value || value instanceof EventTarget) {\n\t\treturn;\n\t}\n\n\tif (STATE_SYMBOL in value) {\n\t\tdeep_read(value);\n\t} else if (!Array.isArray(value)) {\n\t\tfor (let key in value) {\n\t\t\tconst prop = value[key];\n\t\t\tif (typeof prop === 'object' && prop && STATE_SYMBOL in prop) {\n\t\t\t\tdeep_read(prop);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Deeply traverse an object and read all its properties\n * so that they're all reactive in case this is `$state`\n * @param {any} value\n * @param {Set<any>} visited\n * @returns {void}\n */\nexport function deep_read(value, visited = new Set()) {\n\tif (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t// We don't want to traverse DOM elements\n\t\t!(value instanceof EventTarget) &&\n\t\t!visited.has(value)\n\t) {\n\t\tvisited.add(value);\n\t\t// When working with a possible SvelteDate, this\n\t\t// will ensure we capture changes to it.\n\t\tif (value instanceof Date) {\n\t\t\tvalue.getTime();\n\t\t}\n\t\tfor (let key in value) {\n\t\t\ttry {\n\t\t\t\tdeep_read(value[key], visited);\n\t\t\t} catch (e) {\n\t\t\t\t// continue\n\t\t\t}\n\t\t}\n\t\tconst proto = get_prototype_of(value);\n\t\tif (\n\t\t\tproto !== Object.prototype &&\n\t\t\tproto !== Array.prototype &&\n\t\t\tproto !== Map.prototype &&\n\t\t\tproto !== Set.prototype &&\n\t\t\tproto !== Date.prototype\n\t\t) {\n\t\t\tconst descriptors = get_descriptors(proto);\n\t\t\tfor (let key in descriptors) {\n\t\t\t\tconst get = descriptors[key].get;\n\t\t\t\tif (get) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tget.call(value);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// continue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","const regex_return_characters = /\\r/g;\n\n/**\n * @param {string} str\n * @returns {string}\n */\nexport function hash(str) {\n\tstr = str.replace(regex_return_characters, '');\n\tlet hash = 5381;\n\tlet i = str.length;\n\n\twhile (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n\treturn (hash >>> 0).toString(36);\n}\n\nconst VOID_ELEMENT_NAMES = [\n\t'area',\n\t'base',\n\t'br',\n\t'col',\n\t'command',\n\t'embed',\n\t'hr',\n\t'img',\n\t'input',\n\t'keygen',\n\t'link',\n\t'meta',\n\t'param',\n\t'source',\n\t'track',\n\t'wbr'\n];\n\n/**\n * Returns `true` if `name` is of a void element\n * @param {string} name\n */\nexport function is_void(name) {\n\treturn VOID_ELEMENT_NAMES.includes(name) || name.toLowerCase() === '!doctype';\n}\n\nconst RESERVED_WORDS = [\n\t'arguments',\n\t'await',\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'eval',\n\t'export',\n\t'extends',\n\t'false',\n\t'finally',\n\t'for',\n\t'function',\n\t'if',\n\t'implements',\n\t'import',\n\t'in',\n\t'instanceof',\n\t'interface',\n\t'let',\n\t'new',\n\t'null',\n\t'package',\n\t'private',\n\t'protected',\n\t'public',\n\t'return',\n\t'static',\n\t'super',\n\t'switch',\n\t'this',\n\t'throw',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'yield'\n];\n\n/**\n * Returns `true` if `word` is a reserved JavaScript keyword\n * @param {string} word\n */\nexport function is_reserved(word) {\n\treturn RESERVED_WORDS.includes(word);\n}\n\n/**\n * @param {string} name\n */\nexport function is_capture_event(name) {\n\treturn name.endsWith('capture') && name !== 'gotpointercapture' && name !== 'lostpointercapture';\n}\n\n/** List of Element events that will be delegated */\nconst DELEGATED_EVENTS = [\n\t'beforeinput',\n\t'click',\n\t'change',\n\t'dblclick',\n\t'contextmenu',\n\t'focusin',\n\t'focusout',\n\t'input',\n\t'keydown',\n\t'keyup',\n\t'mousedown',\n\t'mousemove',\n\t'mouseout',\n\t'mouseover',\n\t'mouseup',\n\t'pointerdown',\n\t'pointermove',\n\t'pointerout',\n\t'pointerover',\n\t'pointerup',\n\t'touchend',\n\t'touchmove',\n\t'touchstart'\n];\n\n/**\n * Returns `true` if `event_name` is a delegated event\n * @param {string} event_name\n */\nexport function can_delegate_event(event_name) {\n\treturn DELEGATED_EVENTS.includes(event_name);\n}\n\n/**\n * Attributes that are boolean, i.e. they are present or not present.\n */\nconst DOM_BOOLEAN_ATTRIBUTES = [\n\t'allowfullscreen',\n\t'async',\n\t'autofocus',\n\t'autoplay',\n\t'checked',\n\t'controls',\n\t'default',\n\t'disabled',\n\t'formnovalidate',\n\t'indeterminate',\n\t'inert',\n\t'ismap',\n\t'loop',\n\t'multiple',\n\t'muted',\n\t'nomodule',\n\t'novalidate',\n\t'open',\n\t'playsinline',\n\t'readonly',\n\t'required',\n\t'reversed',\n\t'seamless',\n\t'selected',\n\t'webkitdirectory',\n\t'defer',\n\t'disablepictureinpicture',\n\t'disableremoteplayback'\n];\n\n/**\n * Returns `true` if `name` is a boolean attribute\n * @param {string} name\n */\nexport function is_boolean_attribute(name) {\n\treturn DOM_BOOLEAN_ATTRIBUTES.includes(name);\n}\n\n/**\n * @type {Record<string, string>}\n * List of attribute names that should be aliased to their property names\n * because they behave differently between setting them as an attribute and\n * setting them as a property.\n */\nconst ATTRIBUTE_ALIASES = {\n\t// no `class: 'className'` because we handle that separately\n\tformnovalidate: 'formNoValidate',\n\tismap: 'isMap',\n\tnomodule: 'noModule',\n\tplaysinline: 'playsInline',\n\treadonly: 'readOnly',\n\tdefaultvalue: 'defaultValue',\n\tdefaultchecked: 'defaultChecked',\n\tsrcobject: 'srcObject',\n\tnovalidate: 'noValidate',\n\tallowfullscreen: 'allowFullscreen',\n\tdisablepictureinpicture: 'disablePictureInPicture',\n\tdisableremoteplayback: 'disableRemotePlayback'\n};\n\n/**\n * @param {string} name\n */\nexport function normalize_attribute(name) {\n\tname = name.toLowerCase();\n\treturn ATTRIBUTE_ALIASES[name] ?? name;\n}\n\nconst DOM_PROPERTIES = [\n\t...DOM_BOOLEAN_ATTRIBUTES,\n\t'formNoValidate',\n\t'isMap',\n\t'noModule',\n\t'playsInline',\n\t'readOnly',\n\t'value',\n\t'volume',\n\t'defaultValue',\n\t'defaultChecked',\n\t'srcObject',\n\t'noValidate',\n\t'allowFullscreen',\n\t'disablePictureInPicture',\n\t'disableRemotePlayback'\n];\n\n/**\n * @param {string} name\n */\nexport function is_dom_property(name) {\n\treturn DOM_PROPERTIES.includes(name);\n}\n\nconst NON_STATIC_PROPERTIES = ['autofocus', 'muted', 'defaultValue', 'defaultChecked'];\n\n/**\n * Returns `true` if the given attribute cannot be set through the template\n * string, i.e. needs some kind of JavaScript handling to work.\n * @param {string} name\n */\nexport function cannot_be_set_statically(name) {\n\treturn NON_STATIC_PROPERTIES.includes(name);\n}\n\n/**\n * Subset of delegated events which should be passive by default.\n * These two are already passive via browser defaults on window, document and body.\n * But since\n * - we're delegating them\n * - they happen often\n * - they apply to mobile which is generally less performant\n * we're marking them as passive by default for other elements, too.\n */\nconst PASSIVE_EVENTS = ['touchstart', 'touchmove'];\n\n/**\n * Returns `true` if `name` is a passive event\n * @param {string} name\n */\nexport function is_passive_event(name) {\n\treturn PASSIVE_EVENTS.includes(name);\n}\n\nconst CONTENT_EDITABLE_BINDINGS = ['textContent', 'innerHTML', 'innerText'];\n\n/** @param {string} name */\nexport function is_content_editable_binding(name) {\n\treturn CONTENT_EDITABLE_BINDINGS.includes(name);\n}\n\nconst LOAD_ERROR_ELEMENTS = [\n\t'body',\n\t'embed',\n\t'iframe',\n\t'img',\n\t'link',\n\t'object',\n\t'script',\n\t'style',\n\t'track'\n];\n\n/**\n * Returns `true` if the element emits `load` and `error` events\n * @param {string} name\n */\nexport function is_load_error_element(name) {\n\treturn LOAD_ERROR_ELEMENTS.includes(name);\n}\n\nconst SVG_ELEMENTS = [\n\t'altGlyph',\n\t'altGlyphDef',\n\t'altGlyphItem',\n\t'animate',\n\t'animateColor',\n\t'animateMotion',\n\t'animateTransform',\n\t'circle',\n\t'clipPath',\n\t'color-profile',\n\t'cursor',\n\t'defs',\n\t'desc',\n\t'discard',\n\t'ellipse',\n\t'feBlend',\n\t'feColorMatrix',\n\t'feComponentTransfer',\n\t'feComposite',\n\t'feConvolveMatrix',\n\t'feDiffuseLighting',\n\t'feDisplacementMap',\n\t'feDistantLight',\n\t'feDropShadow',\n\t'feFlood',\n\t'feFuncA',\n\t'feFuncB',\n\t'feFuncG',\n\t'feFuncR',\n\t'feGaussianBlur',\n\t'feImage',\n\t'feMerge',\n\t'feMergeNode',\n\t'feMorphology',\n\t'feOffset',\n\t'fePointLight',\n\t'feSpecularLighting',\n\t'feSpotLight',\n\t'feTile',\n\t'feTurbulence',\n\t'filter',\n\t'font',\n\t'font-face',\n\t'font-face-format',\n\t'font-face-name',\n\t'font-face-src',\n\t'font-face-uri',\n\t'foreignObject',\n\t'g',\n\t'glyph',\n\t'glyphRef',\n\t'hatch',\n\t'hatchpath',\n\t'hkern',\n\t'image',\n\t'line',\n\t'linearGradient',\n\t'marker',\n\t'mask',\n\t'mesh',\n\t'meshgradient',\n\t'meshpatch',\n\t'meshrow',\n\t'metadata',\n\t'missing-glyph',\n\t'mpath',\n\t'path',\n\t'pattern',\n\t'polygon',\n\t'polyline',\n\t'radialGradient',\n\t'rect',\n\t'set',\n\t'solidcolor',\n\t'stop',\n\t'svg',\n\t'switch',\n\t'symbol',\n\t'text',\n\t'textPath',\n\t'tref',\n\t'tspan',\n\t'unknown',\n\t'use',\n\t'view',\n\t'vkern'\n];\n\n/** @param {string} name */\nexport function is_svg(name) {\n\treturn SVG_ELEMENTS.includes(name);\n}\n\nconst MATHML_ELEMENTS = [\n\t'annotation',\n\t'annotation-xml',\n\t'maction',\n\t'math',\n\t'merror',\n\t'mfrac',\n\t'mi',\n\t'mmultiscripts',\n\t'mn',\n\t'mo',\n\t'mover',\n\t'mpadded',\n\t'mphantom',\n\t'mprescripts',\n\t'mroot',\n\t'mrow',\n\t'ms',\n\t'mspace',\n\t'msqrt',\n\t'mstyle',\n\t'msub',\n\t'msubsup',\n\t'msup',\n\t'mtable',\n\t'mtd',\n\t'mtext',\n\t'mtr',\n\t'munder',\n\t'munderover',\n\t'semantics'\n];\n\n/** @param {string} name */\nexport function is_mathml(name) {\n\treturn MATHML_ELEMENTS.includes(name);\n}\n\nconst STATE_CREATION_RUNES = /** @type {const} */ ([\n\t'$state',\n\t'$state.raw',\n\t'$derived',\n\t'$derived.by'\n]);\n\nconst RUNES = /** @type {const} */ ([\n\t...STATE_CREATION_RUNES,\n\t'$state.eager',\n\t'$state.snapshot',\n\t'$props',\n\t'$props.id',\n\t'$bindable',\n\t'$effect',\n\t'$effect.pre',\n\t'$effect.tracking',\n\t'$effect.root',\n\t'$effect.pending',\n\t'$inspect',\n\t'$inspect().with',\n\t'$inspect.trace',\n\t'$host'\n]);\n\n/** @typedef {typeof RUNES[number]} RuneName */\n\n/**\n * @param {string} name\n * @returns {name is RuneName}\n */\nexport function is_rune(name) {\n\treturn RUNES.includes(/** @type {RuneName} */ (name));\n}\n\n/** @typedef {typeof STATE_CREATION_RUNES[number]} StateCreationRuneName */\n\n/**\n * @param {string} name\n * @returns {name is StateCreationRuneName}\n */\nexport function is_state_creation_rune(name) {\n\treturn STATE_CREATION_RUNES.includes(/** @type {StateCreationRuneName} */ (name));\n}\n\n/** List of elements that require raw contents and should not have SSR comments put in them */\nconst RAW_TEXT_ELEMENTS = /** @type {const} */ (['textarea', 'script', 'style', 'title']);\n\n/** @param {string} name */\nexport function is_raw_text_element(name) {\n\treturn RAW_TEXT_ELEMENTS.includes(/** @type {typeof RAW_TEXT_ELEMENTS[number]} */ (name));\n}\n\n/**\n * Prevent devtools trying to make `location` a clickable link by inserting a zero-width space\n * @template {string | undefined} T\n * @param {T} location\n * @returns {T};\n */\nexport function sanitize_location(location) {\n\treturn /** @type {T} */ (location?.replace(/\\//g, '/\\u200b'));\n}\n","import { teardown } from '../../reactivity/effects.js';\nimport { define_property } from '../../../shared/utils.js';\nimport { hydrating } from '../hydration.js';\nimport { queue_micro_task } from '../task.js';\nimport { FILENAME } from '../../../../constants.js';\nimport * as w from '../../warnings.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../runtime.js';\nimport { without_reactive_context } from './bindings/shared.js';\n\n/** @type {Set<string>} */\nexport const all_registered_events = new Set();\n\n/** @type {Set<(events: Array<string>) => void>} */\nexport const root_event_handles = new Set();\n\n/**\n * SSR adds onload and onerror attributes to catch those events before the hydration.\n * This function detects those cases, removes the attributes and replays the events.\n * @param {HTMLElement} dom\n */\nexport function replay_events(dom) {\n\tif (!hydrating) return;\n\n\tdom.removeAttribute('onload');\n\tdom.removeAttribute('onerror');\n\t// @ts-expect-error\n\tconst event = dom.__e;\n\tif (event !== undefined) {\n\t\t// @ts-expect-error\n\t\tdom.__e = undefined;\n\t\tqueueMicrotask(() => {\n\t\t\tif (dom.isConnected) {\n\t\t\t\tdom.dispatchEvent(event);\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * @param {string} event_name\n * @param {EventTarget} dom\n * @param {EventListener} [handler]\n * @param {AddEventListenerOptions} [options]\n */\nexport function create_event(event_name, dom, handler, options = {}) {\n\t/**\n\t * @this {EventTarget}\n\t */\n\tfunction target_handler(/** @type {Event} */ event) {\n\t\tif (!options.capture) {\n\t\t\t// Only call in the bubble phase, else delegated events would be called before the capturing events\n\t\t\thandle_event_propagation.call(dom, event);\n\t\t}\n\t\tif (!event.cancelBubble) {\n\t\t\treturn without_reactive_context(() => {\n\t\t\t\treturn handler?.call(this, event);\n\t\t\t});\n\t\t}\n\t}\n\n\t// Chrome has a bug where pointer events don't work when attached to a DOM element that has been cloned\n\t// with cloneNode() and the DOM element is disconnected from the document. To ensure the event works, we\n\t// defer the attachment till after it's been appended to the document. TODO: remove this once Chrome fixes\n\t// this bug. The same applies to wheel events and touch events.\n\tif (\n\t\tevent_name.startsWith('pointer') ||\n\t\tevent_name.startsWith('touch') ||\n\t\tevent_name === 'wheel'\n\t) {\n\t\tqueue_micro_task(() => {\n\t\t\tdom.addEventListener(event_name, target_handler, options);\n\t\t});\n\t} else {\n\t\tdom.addEventListener(event_name, target_handler, options);\n\t}\n\n\treturn target_handler;\n}\n\n/**\n * Attaches an event handler to an element and returns a function that removes the handler. Using this\n * rather than `addEventListener` will preserve the correct order relative to handlers added declaratively\n * (with attributes like `onclick`), which use event delegation for performance reasons\n *\n * @param {EventTarget} element\n * @param {string} type\n * @param {EventListener} handler\n * @param {AddEventListenerOptions} [options]\n */\nexport function on(element, type, handler, options = {}) {\n\tvar target_handler = create_event(type, element, handler, options);\n\n\treturn () => {\n\t\telement.removeEventListener(type, target_handler, options);\n\t};\n}\n\n/**\n * @param {string} event_name\n * @param {Element} dom\n * @param {EventListener} [handler]\n * @param {boolean} [capture]\n * @param {boolean} [passive]\n * @returns {void}\n */\nexport function event(event_name, dom, handler, capture, passive) {\n\tvar options = { capture, passive };\n\tvar target_handler = create_event(event_name, dom, handler, options);\n\n\tif (\n\t\tdom === document.body ||\n\t\t// @ts-ignore\n\t\tdom === window ||\n\t\t// @ts-ignore\n\t\tdom === document ||\n\t\t// Firefox has quirky behavior, it can happen that we still get \"canplay\" events when the element is already removed\n\t\tdom instanceof HTMLMediaElement\n\t) {\n\t\tteardown(() => {\n\t\t\tdom.removeEventListener(event_name, target_handler, options);\n\t\t});\n\t}\n}\n\n/**\n * @param {Array<string>} events\n * @returns {void}\n */\nexport function delegate(events) {\n\tfor (var i = 0; i < events.length; i++) {\n\t\tall_registered_events.add(events[i]);\n\t}\n\n\tfor (var fn of root_event_handles) {\n\t\tfn(events);\n\t}\n}\n\n// used to store the reference to the currently propagated event\n// to prevent garbage collection between microtasks in Firefox\n// If the event object is GCed too early, the expando __root property\n// set on the event object is lost, causing the event delegation\n// to process the event twice\nlet last_propagated_event = null;\n\n/**\n * @this {EventTarget}\n * @param {Event} event\n * @returns {void}\n */\nexport function handle_event_propagation(event) {\n\tvar handler_element = this;\n\tvar owner_document = /** @type {Node} */ (handler_element).ownerDocument;\n\tvar event_name = event.type;\n\tvar path = event.composedPath?.() || [];\n\tvar current_target = /** @type {null | Element} */ (path[0] || event.target);\n\n\tlast_propagated_event = event;\n\n\t// composedPath contains list of nodes the event has propagated through.\n\t// We check __root to skip all nodes below it in case this is a\n\t// parent of the __root node, which indicates that there's nested\n\t// mounted apps. In this case we don't want to trigger events multiple times.\n\tvar path_idx = 0;\n\n\t// the `last_propagated_event === event` check is redundant, but\n\t// without it the variable will be DCE'd and things will\n\t// fail mysteriously in Firefox\n\t// @ts-expect-error is added below\n\tvar handled_at = last_propagated_event === event && event.__root;\n\n\tif (handled_at) {\n\t\tvar at_idx = path.indexOf(handled_at);\n\t\tif (\n\t\t\tat_idx !== -1 &&\n\t\t\t(handler_element === document || handler_element === /** @type {any} */ (window))\n\t\t) {\n\t\t\t// This is the fallback document listener or a window listener, but the event was already handled\n\t\t\t// -> ignore, but set handle_at to document/window so that we're resetting the event\n\t\t\t// chain in case someone manually dispatches the same event object again.\n\t\t\t// @ts-expect-error\n\t\t\tevent.__root = handler_element;\n\t\t\treturn;\n\t\t}\n\n\t\t// We're deliberately not skipping if the index is higher, because\n\t\t// someone could create an event programmatically and emit it multiple times,\n\t\t// in which case we want to handle the whole propagation chain properly each time.\n\t\t// (this will only be a false negative if the event is dispatched multiple times and\n\t\t// the fallback document listener isn't reached in between, but that's super rare)\n\t\tvar handler_idx = path.indexOf(handler_element);\n\t\tif (handler_idx === -1) {\n\t\t\t// handle_idx can theoretically be -1 (happened in some JSDOM testing scenarios with an event listener on the window object)\n\t\t\t// so guard against that, too, and assume that everything was handled at this point.\n\t\t\treturn;\n\t\t}\n\n\t\tif (at_idx <= handler_idx) {\n\t\t\tpath_idx = at_idx;\n\t\t}\n\t}\n\n\tcurrent_target = /** @type {Element} */ (path[path_idx] || event.target);\n\t// there can only be one delegated event per element, and we either already handled the current target,\n\t// or this is the very first target in the chain which has a non-delegated listener, in which case it's safe\n\t// to handle a possible delegated event on it later (through the root delegation listener for example).\n\tif (current_target === handler_element) return;\n\n\t// Proxy currentTarget to correct target\n\tdefine_property(event, 'currentTarget', {\n\t\tconfigurable: true,\n\t\tget() {\n\t\t\treturn current_target || owner_document;\n\t\t}\n\t});\n\n\t// This started because of Chromium issue https://chromestatus.com/feature/5128696823545856,\n\t// where removal or moving of of the DOM can cause sync `blur` events to fire, which can cause logic\n\t// to run inside the current `active_reaction`, which isn't what we want at all. However, on reflection,\n\t// it's probably best that all event handled by Svelte have this behaviour, as we don't really want\n\t// an event handler to run in the context of another reaction or effect.\n\tvar previous_reaction = active_reaction;\n\tvar previous_effect = active_effect;\n\tset_active_reaction(null);\n\tset_active_effect(null);\n\n\ttry {\n\t\t/**\n\t\t * @type {unknown}\n\t\t */\n\t\tvar throw_error;\n\t\t/**\n\t\t * @type {unknown[]}\n\t\t */\n\t\tvar other_errors = [];\n\n\t\twhile (current_target !== null) {\n\t\t\t/** @type {null | Element} */\n\t\t\tvar parent_element =\n\t\t\t\tcurrent_target.assignedSlot ||\n\t\t\t\tcurrent_target.parentNode ||\n\t\t\t\t/** @type {any} */ (current_target).host ||\n\t\t\t\tnull;\n\n\t\t\ttry {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tvar delegated = current_target['__' + event_name];\n\n\t\t\t\tif (\n\t\t\t\t\tdelegated != null &&\n\t\t\t\t\t(!(/** @type {any} */ (current_target).disabled) ||\n\t\t\t\t\t\t// DOM could've been updated already by the time this is reached, so we check this as well\n\t\t\t\t\t\t// -> the target could not have been disabled because it emits the event in the first place\n\t\t\t\t\t\tevent.target === current_target)\n\t\t\t\t) {\n\t\t\t\t\tdelegated.call(current_target, event);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (throw_error) {\n\t\t\t\t\tother_errors.push(error);\n\t\t\t\t} else {\n\t\t\t\t\tthrow_error = error;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.cancelBubble || parent_element === handler_element || parent_element === null) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrent_target = parent_element;\n\t\t}\n\n\t\tif (throw_error) {\n\t\t\tfor (let error of other_errors) {\n\t\t\t\t// Throw the rest of the errors, one-by-one on a microtask\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow throw_error;\n\t\t}\n\t} finally {\n\t\t// @ts-expect-error is used above\n\t\tevent.__root = handler_element;\n\t\t// @ts-ignore remove proxy on currentTarget\n\t\tdelete event.currentTarget;\n\t\tset_active_reaction(previous_reaction);\n\t\tset_active_effect(previous_effect);\n\t}\n}\n\n/**\n * In dev, warn if an event handler is not a function, as it means the\n * user probably called the handler or forgot to add a `() =>`\n * @param {() => (event: Event, ...args: any) => void} thunk\n * @param {EventTarget} element\n * @param {[Event, ...any]} args\n * @param {any} component\n * @param {[number, number]} [loc]\n * @param {boolean} [remove_parens]\n */\nexport function apply(\n\tthunk,\n\telement,\n\targs,\n\tcomponent,\n\tloc,\n\thas_side_effects = false,\n\tremove_parens = false\n) {\n\tlet handler;\n\tlet error;\n\n\ttry {\n\t\thandler = thunk();\n\t} catch (e) {\n\t\terror = e;\n\t}\n\n\tif (typeof handler !== 'function' && (has_side_effects || handler != null || error)) {\n\t\tconst filename = component?.[FILENAME];\n\t\tconst location = loc ? ` at ${filename}:${loc[0]}:${loc[1]}` : ` in ${filename}`;\n\t\tconst phase = args[0]?.eventPhase < Event.BUBBLING_PHASE ? 'capture' : '';\n\t\tconst event_name = args[0]?.type + phase;\n\t\tconst description = `\\`${event_name}\\` handler${location}`;\n\t\tconst suggestion = remove_parens ? 'remove the trailing `()`' : 'add a leading `() =>`';\n\n\t\tw.event_handler_invalid(description, suggestion);\n\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\thandler?.apply(element, args);\n}\n","/** @param {string} html */\nexport function create_fragment_from_html(html) {\n\tvar elem = document.createElement('template');\n\telem.innerHTML = html.replaceAll('<!>', '<!---->'); // XHTML compliance\n\treturn elem.content;\n}\n","/** @import { Effect, EffectNodes, TemplateNode } from '#client' */\n/** @import { TemplateStructure } from './types' */\nimport { hydrate_next, hydrate_node, hydrating, set_hydrate_node } from './hydration.js';\nimport {\n\tcreate_text,\n\tget_first_child,\n\tget_next_sibling,\n\tis_firefox,\n\tcreate_element,\n\tcreate_fragment,\n\tcreate_comment,\n\tset_attribute,\n\tmerge_text_nodes\n} from './operations.js';\nimport { create_fragment_from_html } from './reconciler.js';\nimport { active_effect } from '../runtime.js';\nimport {\n\tNAMESPACE_MATHML,\n\tNAMESPACE_SVG,\n\tTEMPLATE_FRAGMENT,\n\tTEMPLATE_USE_IMPORT_NODE,\n\tTEMPLATE_USE_MATHML,\n\tTEMPLATE_USE_SVG\n} from '../../../constants.js';\nimport { COMMENT_NODE, DOCUMENT_FRAGMENT_NODE, EFFECT_RAN, TEXT_NODE } from '#client/constants';\n\n/**\n * @param {TemplateNode} start\n * @param {TemplateNode | null} end\n */\nexport function assign_nodes(start, end) {\n\tvar effect = /** @type {Effect} */ (active_effect);\n\tif (effect.nodes === null) {\n\t\teffect.nodes = { start, end, a: null, t: null };\n\t}\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n * @returns {() => Node | Node[]}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_html(content, flags) {\n\tvar is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0;\n\tvar use_import_node = (flags & TEMPLATE_USE_IMPORT_NODE) !== 0;\n\n\t/** @type {Node} */\n\tvar node;\n\n\t/**\n\t * Whether or not the first item is a text/element node. If not, we need to\n\t * create an additional comment node to act as `effect.nodes.start`\n\t */\n\tvar has_start = !content.startsWith('<!>');\n\n\treturn () => {\n\t\tif (hydrating) {\n\t\t\tassign_nodes(hydrate_node, null);\n\t\t\treturn hydrate_node;\n\t\t}\n\n\t\tif (node === undefined) {\n\t\t\tnode = create_fragment_from_html(has_start ? content : '<!>' + content);\n\t\t\tif (!is_fragment) node = /** @type {TemplateNode} */ (get_first_child(node));\n\t\t}\n\n\t\tvar clone = /** @type {TemplateNode} */ (\n\t\t\tuse_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true)\n\t\t);\n\n\t\tif (is_fragment) {\n\t\t\tvar start = /** @type {TemplateNode} */ (get_first_child(clone));\n\t\t\tvar end = /** @type {TemplateNode} */ (clone.lastChild);\n\n\t\t\tassign_nodes(start, end);\n\t\t} else {\n\t\t\tassign_nodes(clone, clone);\n\t\t}\n\n\t\treturn clone;\n\t};\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n * @param {'svg' | 'math'} ns\n * @returns {() => Node | Node[]}\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction from_namespace(content, flags, ns = 'svg') {\n\t/**\n\t * Whether or not the first item is a text/element node. If not, we need to\n\t * create an additional comment node to act as `effect.nodes.start`\n\t */\n\tvar has_start = !content.startsWith('<!>');\n\n\tvar is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0;\n\tvar wrapped = `<${ns}>${has_start ? content : '<!>' + content}</${ns}>`;\n\n\t/** @type {Element | DocumentFragment} */\n\tvar node;\n\n\treturn () => {\n\t\tif (hydrating) {\n\t\t\tassign_nodes(hydrate_node, null);\n\t\t\treturn hydrate_node;\n\t\t}\n\n\t\tif (!node) {\n\t\t\tvar fragment = /** @type {DocumentFragment} */ (create_fragment_from_html(wrapped));\n\t\t\tvar root = /** @type {Element} */ (get_first_child(fragment));\n\n\t\t\tif (is_fragment) {\n\t\t\t\tnode = document.createDocumentFragment();\n\t\t\t\twhile (get_first_child(root)) {\n\t\t\t\t\tnode.appendChild(/** @type {TemplateNode} */ (get_first_child(root)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode = /** @type {Element} */ (get_first_child(root));\n\t\t\t}\n\t\t}\n\n\t\tvar clone = /** @type {TemplateNode} */ (node.cloneNode(true));\n\n\t\tif (is_fragment) {\n\t\t\tvar start = /** @type {TemplateNode} */ (get_first_child(clone));\n\t\t\tvar end = /** @type {TemplateNode} */ (clone.lastChild);\n\n\t\t\tassign_nodes(start, end);\n\t\t} else {\n\t\t\tassign_nodes(clone, clone);\n\t\t}\n\n\t\treturn clone;\n\t};\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_svg(content, flags) {\n\treturn from_namespace(content, flags, 'svg');\n}\n\n/**\n * @param {string} content\n * @param {number} flags\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_mathml(content, flags) {\n\treturn from_namespace(content, flags, 'math');\n}\n\n/**\n * @param {TemplateStructure[]} structure\n * @param {typeof NAMESPACE_SVG | typeof NAMESPACE_MATHML | undefined} [ns]\n */\nfunction fragment_from_tree(structure, ns) {\n\tvar fragment = create_fragment();\n\n\tfor (var item of structure) {\n\t\tif (typeof item === 'string') {\n\t\t\tfragment.append(create_text(item));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// if `preserveComments === true`, comments are represented as `['// <data>']`\n\t\tif (item === undefined || item[0][0] === '/') {\n\t\t\tfragment.append(create_comment(item ? item[0].slice(3) : ''));\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [name, attributes, ...children] = item;\n\n\t\tconst namespace = name === 'svg' ? NAMESPACE_SVG : name === 'math' ? NAMESPACE_MATHML : ns;\n\n\t\tvar element = create_element(name, namespace, attributes?.is);\n\n\t\tfor (var key in attributes) {\n\t\t\tset_attribute(element, key, attributes[key]);\n\t\t}\n\n\t\tif (children.length > 0) {\n\t\t\tvar target =\n\t\t\t\telement.tagName === 'TEMPLATE'\n\t\t\t\t\t? /** @type {HTMLTemplateElement} */ (element).content\n\t\t\t\t\t: element;\n\n\t\t\ttarget.append(\n\t\t\t\tfragment_from_tree(children, element.tagName === 'foreignObject' ? undefined : namespace)\n\t\t\t);\n\t\t}\n\n\t\tfragment.append(element);\n\t}\n\n\treturn fragment;\n}\n\n/**\n * @param {TemplateStructure[]} structure\n * @param {number} flags\n * @returns {() => Node | Node[]}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function from_tree(structure, flags) {\n\tvar is_fragment = (flags & TEMPLATE_FRAGMENT) !== 0;\n\tvar use_import_node = (flags & TEMPLATE_USE_IMPORT_NODE) !== 0;\n\n\t/** @type {Node} */\n\tvar node;\n\n\treturn () => {\n\t\tif (hydrating) {\n\t\t\tassign_nodes(hydrate_node, null);\n\t\t\treturn hydrate_node;\n\t\t}\n\n\t\tif (node === undefined) {\n\t\t\tconst ns =\n\t\t\t\t(flags & TEMPLATE_USE_SVG) !== 0\n\t\t\t\t\t? NAMESPACE_SVG\n\t\t\t\t\t: (flags & TEMPLATE_USE_MATHML) !== 0\n\t\t\t\t\t\t? NAMESPACE_MATHML\n\t\t\t\t\t\t: undefined;\n\n\t\t\tnode = fragment_from_tree(structure, ns);\n\t\t\tif (!is_fragment) node = /** @type {TemplateNode} */ (get_first_child(node));\n\t\t}\n\n\t\tvar clone = /** @type {TemplateNode} */ (\n\t\t\tuse_import_node || is_firefox ? document.importNode(node, true) : node.cloneNode(true)\n\t\t);\n\n\t\tif (is_fragment) {\n\t\t\tvar start = /** @type {TemplateNode} */ (get_first_child(clone));\n\t\t\tvar end = /** @type {TemplateNode} */ (clone.lastChild);\n\n\t\t\tassign_nodes(start, end);\n\t\t} else {\n\t\t\tassign_nodes(clone, clone);\n\t\t}\n\n\t\treturn clone;\n\t};\n}\n\n/**\n * @param {() => Element | DocumentFragment} fn\n */\nexport function with_script(fn) {\n\treturn () => run_scripts(fn());\n}\n\n/**\n * Creating a document fragment from HTML that contains script tags will not execute\n * the scripts. We need to replace the script tags with new ones so that they are executed.\n * @param {Element | DocumentFragment} node\n * @returns {Node | Node[]}\n */\nfunction run_scripts(node) {\n\t// scripts were SSR'd, in which case they will run\n\tif (hydrating) return node;\n\n\tconst is_fragment = node.nodeType === DOCUMENT_FRAGMENT_NODE;\n\tconst scripts =\n\t\t/** @type {HTMLElement} */ (node).tagName === 'SCRIPT'\n\t\t\t? [/** @type {HTMLScriptElement} */ (node)]\n\t\t\t: node.querySelectorAll('script');\n\n\tconst effect = /** @type {Effect & { nodes: EffectNodes }} */ (active_effect);\n\n\tfor (const script of scripts) {\n\t\tconst clone = document.createElement('script');\n\t\tfor (var attribute of script.attributes) {\n\t\t\tclone.setAttribute(attribute.name, attribute.value);\n\t\t}\n\n\t\tclone.textContent = script.textContent;\n\n\t\t// The script has changed - if it's at the edges, the effect now points at dead nodes\n\t\tif (is_fragment ? node.firstChild === script : node === script) {\n\t\t\teffect.nodes.start = clone;\n\t\t}\n\t\tif (is_fragment ? node.lastChild === script : node === script) {\n\t\t\teffect.nodes.end = clone;\n\t\t}\n\n\t\tscript.replaceWith(clone);\n\t}\n\treturn node;\n}\n\n/**\n * Don't mark this as side-effect-free, hydration needs to walk all nodes\n * @param {any} value\n */\nexport function text(value = '') {\n\tif (!hydrating) {\n\t\tvar t = create_text(value + '');\n\t\tassign_nodes(t, t);\n\t\treturn t;\n\t}\n\n\tvar node = hydrate_node;\n\n\tif (node.nodeType !== TEXT_NODE) {\n\t\t// if an {expression} is empty during SSR, we need to insert an empty text node\n\t\tnode.before((node = create_text()));\n\t\tset_hydrate_node(node);\n\t} else {\n\t\tmerge_text_nodes(/** @type {Text} */ (node));\n\t}\n\n\tassign_nodes(node, node);\n\treturn node;\n}\n\n/**\n * @returns {TemplateNode | DocumentFragment}\n */\nexport function comment() {\n\t// we're not delegating to `template` here for performance reasons\n\tif (hydrating) {\n\t\tassign_nodes(hydrate_node, null);\n\t\treturn hydrate_node;\n\t}\n\n\tvar frag = document.createDocumentFragment();\n\tvar start = document.createComment('');\n\tvar anchor = create_text();\n\tfrag.append(start, anchor);\n\n\tassign_nodes(start, anchor);\n\n\treturn frag;\n}\n\n/**\n * Assign the created (or in hydration mode, traversed) dom elements to the current block\n * and insert the elements into the dom (in client mode).\n * @param {Text | Comment | Element} anchor\n * @param {DocumentFragment | Element} dom\n */\nexport function append(anchor, dom) {\n\tif (hydrating) {\n\t\tvar effect = /** @type {Effect & { nodes: EffectNodes }} */ (active_effect);\n\n\t\t// When hydrating and outer component and an inner component is async, i.e. blocked on a promise,\n\t\t// then by the time the inner resolves we have already advanced to the end of the hydrated nodes\n\t\t// of the parent component. Check for defined for that reason to avoid rewinding the parent's end marker.\n\t\tif ((effect.f & EFFECT_RAN) === 0 || effect.nodes.end === null) {\n\t\t\teffect.nodes.end = hydrate_node;\n\t\t}\n\n\t\thydrate_next();\n\t\treturn;\n\t}\n\n\tif (anchor === null) {\n\t\t// edge case — void `<svelte:element>` with content\n\t\treturn;\n\t}\n\n\tanchor.before(/** @type {Node} */ (dom));\n}\n\n/**\n * Create (or hydrate) an unique UID for the component instance.\n */\nexport function props_id() {\n\tif (\n\t\thydrating &&\n\t\thydrate_node &&\n\t\thydrate_node.nodeType === COMMENT_NODE &&\n\t\thydrate_node.textContent?.startsWith(`$`)\n\t) {\n\t\tconst id = hydrate_node.textContent.substring(1);\n\t\thydrate_next();\n\t\treturn id;\n\t}\n\n\t// @ts-expect-error This way we ensure the id is unique even across Svelte runtimes\n\t(window.__svelte ??= {}).uid ??= 1;\n\n\t// @ts-expect-error\n\treturn `c${window.__svelte.uid++}`;\n}\n","/** @import { ComponentContext, Effect, EffectNodes, TemplateNode } from '#client' */\n/** @import { Component, ComponentType, SvelteComponent, MountOptions } from '../../index.js' */\nimport { DEV } from 'esm-env';\nimport {\n\tclear_text_content,\n\tcreate_text,\n\tget_first_child,\n\tget_next_sibling,\n\tinit_operations\n} from './dom/operations.js';\nimport { HYDRATION_END, HYDRATION_ERROR, HYDRATION_START } from '../../constants.js';\nimport { active_effect } from './runtime.js';\nimport { push, pop, component_context } from './context.js';\nimport { component_root } from './reactivity/effects.js';\nimport { hydrate_node, hydrating, set_hydrate_node, set_hydrating } from './dom/hydration.js';\nimport { array_from } from '../shared/utils.js';\nimport {\n\tall_registered_events,\n\thandle_event_propagation,\n\troot_event_handles\n} from './dom/elements/events.js';\nimport * as w from './warnings.js';\nimport * as e from './errors.js';\nimport { assign_nodes } from './dom/template.js';\nimport { is_passive_event } from '../../utils.js';\nimport { COMMENT_NODE, STATE_SYMBOL } from './constants.js';\nimport { boundary } from './dom/blocks/boundary.js';\n\n/**\n * This is normally true — block effects should run their intro transitions —\n * but is false during hydration (unless `options.intro` is `true`) and\n * when creating the children of a `<svelte:element>` that just changed tag\n */\nexport let should_intro = true;\n\n/** @param {boolean} value */\nexport function set_should_intro(value) {\n\tshould_intro = value;\n}\n\n/**\n * @param {Element} text\n * @param {string} value\n * @returns {void}\n */\nexport function set_text(text, value) {\n\t// For objects, we apply string coercion (which might make things like $state array references in the template reactive) before diffing\n\tvar str = value == null ? '' : typeof value === 'object' ? value + '' : value;\n\t// @ts-expect-error\n\tif (str !== (text.__t ??= text.nodeValue)) {\n\t\t// @ts-expect-error\n\t\ttext.__t = str;\n\t\ttext.nodeValue = str + '';\n\t}\n}\n\n/**\n * Mounts a component to the given target and returns the exports and potentially the props (if compiled with `accessors: true`) of the component.\n * Transitions will play during the initial render unless the `intro` option is set to `false`.\n *\n * @template {Record<string, any>} Props\n * @template {Record<string, any>} Exports\n * @param {ComponentType<SvelteComponent<Props>> | Component<Props, Exports, any>} component\n * @param {MountOptions<Props>} options\n * @returns {Exports}\n */\nexport function mount(component, options) {\n\treturn _mount(component, options);\n}\n\n/**\n * Hydrates a component on the given target and returns the exports and potentially the props (if compiled with `accessors: true`) of the component\n *\n * @template {Record<string, any>} Props\n * @template {Record<string, any>} Exports\n * @param {ComponentType<SvelteComponent<Props>> | Component<Props, Exports, any>} component\n * @param {{} extends Props ? {\n * \t\ttarget: Document | Element | ShadowRoot;\n * \t\tprops?: Props;\n * \t\tevents?: Record<string, (e: any) => any>;\n * \tcontext?: Map<any, any>;\n * \t\tintro?: boolean;\n * \t\trecover?: boolean;\n * \t} : {\n * \t\ttarget: Document | Element | ShadowRoot;\n * \t\tprops: Props;\n * \t\tevents?: Record<string, (e: any) => any>;\n * \tcontext?: Map<any, any>;\n * \t\tintro?: boolean;\n * \t\trecover?: boolean;\n * \t}} options\n * @returns {Exports}\n */\nexport function hydrate(component, options) {\n\tinit_operations();\n\toptions.intro = options.intro ?? false;\n\tconst target = options.target;\n\tconst was_hydrating = hydrating;\n\tconst previous_hydrate_node = hydrate_node;\n\n\ttry {\n\t\tvar anchor = get_first_child(target);\n\n\t\twhile (\n\t\t\tanchor &&\n\t\t\t(anchor.nodeType !== COMMENT_NODE || /** @type {Comment} */ (anchor).data !== HYDRATION_START)\n\t\t) {\n\t\t\tanchor = get_next_sibling(anchor);\n\t\t}\n\n\t\tif (!anchor) {\n\t\t\tthrow HYDRATION_ERROR;\n\t\t}\n\n\t\tset_hydrating(true);\n\t\tset_hydrate_node(/** @type {Comment} */ (anchor));\n\n\t\tconst instance = _mount(component, { ...options, anchor });\n\n\t\tset_hydrating(false);\n\n\t\treturn /** @type {Exports} */ (instance);\n\t} catch (error) {\n\t\t// re-throw Svelte errors - they are certainly not related to hydration\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\terror.message.split('\\n').some((line) => line.startsWith('https://svelte.dev/e/'))\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\tif (error !== HYDRATION_ERROR) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Failed to hydrate: ', error);\n\t\t}\n\n\t\tif (options.recover === false) {\n\t\t\te.hydration_failed();\n\t\t}\n\n\t\t// If an error occurred above, the operations might not yet have been initialised.\n\t\tinit_operations();\n\t\tclear_text_content(target);\n\n\t\tset_hydrating(false);\n\t\treturn mount(component, options);\n\t} finally {\n\t\tset_hydrating(was_hydrating);\n\t\tset_hydrate_node(previous_hydrate_node);\n\t}\n}\n\n/** @type {Map<string, number>} */\nconst document_listeners = new Map();\n\n/**\n * @template {Record<string, any>} Exports\n * @param {ComponentType<SvelteComponent<any>> | Component<any>} Component\n * @param {MountOptions} options\n * @returns {Exports}\n */\nfunction _mount(Component, { target, anchor, props = {}, events, context, intro = true }) {\n\tinit_operations();\n\n\t/** @type {Set<string>} */\n\tvar registered_events = new Set();\n\n\t/** @param {Array<string>} events */\n\tvar event_handle = (events) => {\n\t\tfor (var i = 0; i < events.length; i++) {\n\t\t\tvar event_name = events[i];\n\n\t\t\tif (registered_events.has(event_name)) continue;\n\t\t\tregistered_events.add(event_name);\n\n\t\t\tvar passive = is_passive_event(event_name);\n\n\t\t\t// Add the event listener to both the container and the document.\n\t\t\t// The container listener ensures we catch events from within in case\n\t\t\t// the outer content stops propagation of the event.\n\t\t\ttarget.addEventListener(event_name, handle_event_propagation, { passive });\n\n\t\t\tvar n = document_listeners.get(event_name);\n\n\t\t\tif (n === undefined) {\n\t\t\t\t// The document listener ensures we catch events that originate from elements that were\n\t\t\t\t// manually moved outside of the container (e.g. via manual portals).\n\t\t\t\tdocument.addEventListener(event_name, handle_event_propagation, { passive });\n\t\t\t\tdocument_listeners.set(event_name, 1);\n\t\t\t} else {\n\t\t\t\tdocument_listeners.set(event_name, n + 1);\n\t\t\t}\n\t\t}\n\t};\n\n\tevent_handle(array_from(all_registered_events));\n\troot_event_handles.add(event_handle);\n\n\t/** @type {Exports} */\n\t// @ts-expect-error will be defined because the render effect runs synchronously\n\tvar component = undefined;\n\n\tvar unmount = component_root(() => {\n\t\tvar anchor_node = anchor ?? target.appendChild(create_text());\n\n\t\tboundary(\n\t\t\t/** @type {TemplateNode} */ (anchor_node),\n\t\t\t{\n\t\t\t\tpending: () => {}\n\t\t\t},\n\t\t\t(anchor_node) => {\n\t\t\t\tif (context) {\n\t\t\t\t\tpush({});\n\t\t\t\t\tvar ctx = /** @type {ComponentContext} */ (component_context);\n\t\t\t\t\tctx.c = context;\n\t\t\t\t}\n\n\t\t\t\tif (events) {\n\t\t\t\t\t// We can't spread the object or else we'd lose the state proxy stuff, if it is one\n\t\t\t\t\t/** @type {any} */ (props).$$events = events;\n\t\t\t\t}\n\n\t\t\t\tif (hydrating) {\n\t\t\t\t\tassign_nodes(/** @type {TemplateNode} */ (anchor_node), null);\n\t\t\t\t}\n\n\t\t\t\tshould_intro = intro;\n\t\t\t\t// @ts-expect-error the public typings are not what the actual function looks like\n\t\t\t\tcomponent = Component(anchor_node, props) || {};\n\t\t\t\tshould_intro = true;\n\n\t\t\t\tif (hydrating) {\n\t\t\t\t\t/** @type {Effect & { nodes: EffectNodes }} */ (active_effect).nodes.end = hydrate_node;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\thydrate_node === null ||\n\t\t\t\t\t\thydrate_node.nodeType !== COMMENT_NODE ||\n\t\t\t\t\t\t/** @type {Comment} */ (hydrate_node).data !== HYDRATION_END\n\t\t\t\t\t) {\n\t\t\t\t\t\tw.hydration_mismatch();\n\t\t\t\t\t\tthrow HYDRATION_ERROR;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (context) {\n\t\t\t\t\tpop();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\treturn () => {\n\t\t\tfor (var event_name of registered_events) {\n\t\t\t\ttarget.removeEventListener(event_name, handle_event_propagation);\n\n\t\t\t\tvar n = /** @type {number} */ (document_listeners.get(event_name));\n\n\t\t\t\tif (--n === 0) {\n\t\t\t\t\tdocument.removeEventListener(event_name, handle_event_propagation);\n\t\t\t\t\tdocument_listeners.delete(event_name);\n\t\t\t\t} else {\n\t\t\t\t\tdocument_listeners.set(event_name, n);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\troot_event_handles.delete(event_handle);\n\n\t\t\tif (anchor_node !== anchor) {\n\t\t\t\tanchor_node.parentNode?.removeChild(anchor_node);\n\t\t\t}\n\t\t};\n\t});\n\n\tmounted_components.set(component, unmount);\n\treturn component;\n}\n\n/**\n * References of the components that were mounted or hydrated.\n * Uses a `WeakMap` to avoid memory leaks.\n */\nlet mounted_components = new WeakMap();\n\n/**\n * Unmounts a component that was previously mounted using `mount` or `hydrate`.\n *\n * Since 5.13.0, if `options.outro` is `true`, [transitions](https://svelte.dev/docs/svelte/transition) will play before the component is removed from the DOM.\n *\n * Returns a `Promise` that resolves after transitions have completed if `options.outro` is true, or immediately otherwise (prior to 5.13.0, returns `void`).\n *\n * ```js\n * import { mount, unmount } from 'svelte';\n * import App from './App.svelte';\n *\n * const app = mount(App, { target: document.body });\n *\n * // later...\n * unmount(app, { outro: true });\n * ```\n * @param {Record<string, any>} component\n * @param {{ outro?: boolean }} [options]\n * @returns {Promise<void>}\n */\nexport function unmount(component, options) {\n\tconst fn = mounted_components.get(component);\n\n\tif (fn) {\n\t\tmounted_components.delete(component);\n\t\treturn fn(options);\n\t}\n\n\tif (DEV) {\n\t\tif (STATE_SYMBOL in component) {\n\t\t\tw.state_proxy_unmount();\n\t\t} else {\n\t\t\tw.lifecycle_double_unmount();\n\t\t}\n\t}\n\n\treturn Promise.resolve();\n}\n","/** @import { Effect, TemplateNode } from '#client' */\nimport { Batch, current_batch } from '../../reactivity/batch.js';\nimport {\n\tbranch,\n\tdestroy_effect,\n\tmove_effect,\n\tpause_effect,\n\tresume_effect\n} from '../../reactivity/effects.js';\nimport { hydrate_node, hydrating } from '../hydration.js';\nimport { create_text, should_defer_append } from '../operations.js';\n\n/**\n * @typedef {{ effect: Effect, fragment: DocumentFragment }} Branch\n */\n\n/**\n * @template Key\n */\nexport class BranchManager {\n\t/** @type {TemplateNode} */\n\tanchor;\n\n\t/** @type {Map<Batch, Key>} */\n\t#batches = new Map();\n\n\t/**\n\t * Map of keys to effects that are currently rendered in the DOM.\n\t * These effects are visible and actively part of the document tree.\n\t * Example:\n\t * ```\n\t * {#if condition}\n\t * \tfoo\n\t * {:else}\n\t * \tbar\n\t * {/if}\n\t * ```\n\t * Can result in the entries `true->Effect` and `false->Effect`\n\t * @type {Map<Key, Effect>}\n\t */\n\t#onscreen = new Map();\n\n\t/**\n\t * Similar to #onscreen with respect to the keys, but contains branches that are not yet\n\t * in the DOM, because their insertion is deferred.\n\t * @type {Map<Key, Branch>}\n\t */\n\t#offscreen = new Map();\n\n\t/**\n\t * Keys of effects that are currently outroing\n\t * @type {Set<Key>}\n\t */\n\t#outroing = new Set();\n\n\t/**\n\t * Whether to pause (i.e. outro) on change, or destroy immediately.\n\t * This is necessary for `<svelte:element>`\n\t */\n\t#transition = true;\n\n\t/**\n\t * @param {TemplateNode} anchor\n\t * @param {boolean} transition\n\t */\n\tconstructor(anchor, transition = true) {\n\t\tthis.anchor = anchor;\n\t\tthis.#transition = transition;\n\t}\n\n\t#commit = () => {\n\t\tvar batch = /** @type {Batch} */ (current_batch);\n\n\t\t// if this batch was made obsolete, bail\n\t\tif (!this.#batches.has(batch)) return;\n\n\t\tvar key = /** @type {Key} */ (this.#batches.get(batch));\n\n\t\tvar onscreen = this.#onscreen.get(key);\n\n\t\tif (onscreen) {\n\t\t\t// effect is already in the DOM — abort any current outro\n\t\t\tresume_effect(onscreen);\n\t\t\tthis.#outroing.delete(key);\n\t\t} else {\n\t\t\t// effect is currently offscreen. put it in the DOM\n\t\t\tvar offscreen = this.#offscreen.get(key);\n\n\t\t\tif (offscreen) {\n\t\t\t\tthis.#onscreen.set(key, offscreen.effect);\n\t\t\t\tthis.#offscreen.delete(key);\n\n\t\t\t\t// remove the anchor...\n\t\t\t\t/** @type {TemplateNode} */ (offscreen.fragment.lastChild).remove();\n\n\t\t\t\t// ...and append the fragment\n\t\t\t\tthis.anchor.before(offscreen.fragment);\n\t\t\t\tonscreen = offscreen.effect;\n\t\t\t}\n\t\t}\n\n\t\tfor (const [b, k] of this.#batches) {\n\t\t\tthis.#batches.delete(b);\n\n\t\t\tif (b === batch) {\n\t\t\t\t// keep values for newer batches\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst offscreen = this.#offscreen.get(k);\n\n\t\t\tif (offscreen) {\n\t\t\t\t// for older batches, destroy offscreen effects\n\t\t\t\t// as they will never be committed\n\t\t\t\tdestroy_effect(offscreen.effect);\n\t\t\t\tthis.#offscreen.delete(k);\n\t\t\t}\n\t\t}\n\n\t\t// outro/destroy all onscreen effects...\n\t\tfor (const [k, effect] of this.#onscreen) {\n\t\t\t// ...except the one that was just committed\n\t\t\t// or those that are already outroing (else the transition is aborted and the effect destroyed right away)\n\t\t\tif (k === key || this.#outroing.has(k)) continue;\n\n\t\t\tconst on_destroy = () => {\n\t\t\t\tconst keys = Array.from(this.#batches.values());\n\n\t\t\t\tif (keys.includes(k)) {\n\t\t\t\t\t// keep the effect offscreen, as another batch will need it\n\t\t\t\t\tvar fragment = document.createDocumentFragment();\n\t\t\t\t\tmove_effect(effect, fragment);\n\n\t\t\t\t\tfragment.append(create_text()); // TODO can we avoid this?\n\n\t\t\t\t\tthis.#offscreen.set(k, { effect, fragment });\n\t\t\t\t} else {\n\t\t\t\t\tdestroy_effect(effect);\n\t\t\t\t}\n\n\t\t\t\tthis.#outroing.delete(k);\n\t\t\t\tthis.#onscreen.delete(k);\n\t\t\t};\n\n\t\t\tif (this.#transition || !onscreen) {\n\t\t\t\tthis.#outroing.add(k);\n\t\t\t\tpause_effect(effect, on_destroy, false);\n\t\t\t} else {\n\t\t\t\ton_destroy();\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @param {Batch} batch\n\t */\n\t#discard = (batch) => {\n\t\tthis.#batches.delete(batch);\n\n\t\tconst keys = Array.from(this.#batches.values());\n\n\t\tfor (const [k, branch] of this.#offscreen) {\n\t\t\tif (!keys.includes(k)) {\n\t\t\t\tdestroy_effect(branch.effect);\n\t\t\t\tthis.#offscreen.delete(k);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t *\n\t * @param {any} key\n\t * @param {null | ((target: TemplateNode) => void)} fn\n\t */\n\tensure(key, fn) {\n\t\tvar batch = /** @type {Batch} */ (current_batch);\n\t\tvar defer = should_defer_append();\n\n\t\tif (fn && !this.#onscreen.has(key) && !this.#offscreen.has(key)) {\n\t\t\tif (defer) {\n\t\t\t\tvar fragment = document.createDocumentFragment();\n\t\t\t\tvar target = create_text();\n\n\t\t\t\tfragment.append(target);\n\n\t\t\t\tthis.#offscreen.set(key, {\n\t\t\t\t\teffect: branch(() => fn(target)),\n\t\t\t\t\tfragment\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.#onscreen.set(\n\t\t\t\t\tkey,\n\t\t\t\t\tbranch(() => fn(this.anchor))\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.#batches.set(batch, key);\n\n\t\tif (defer) {\n\t\t\tfor (const [k, effect] of this.#onscreen) {\n\t\t\t\tif (k === key) {\n\t\t\t\t\tbatch.skipped_effects.delete(effect);\n\t\t\t\t} else {\n\t\t\t\t\tbatch.skipped_effects.add(effect);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [k, branch] of this.#offscreen) {\n\t\t\t\tif (k === key) {\n\t\t\t\t\tbatch.skipped_effects.delete(branch.effect);\n\t\t\t\t} else {\n\t\t\t\t\tbatch.skipped_effects.add(branch.effect);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbatch.oncommit(this.#commit);\n\t\t\tbatch.ondiscard(this.#discard);\n\t\t} else {\n\t\t\tif (hydrating) {\n\t\t\t\tthis.anchor = hydrate_node;\n\t\t\t}\n\n\t\t\tthis.#commit();\n\t\t}\n\t}\n}\n","/** @import { TemplateNode } from '#client' */\nimport { EFFECT_TRANSPARENT } from '#client/constants';\nimport {\n\thydrate_next,\n\thydrating,\n\tread_hydration_instruction,\n\tskip_nodes,\n\tset_hydrate_node,\n\tset_hydrating\n} from '../hydration.js';\nimport { block } from '../../reactivity/effects.js';\nimport { HYDRATION_START_ELSE } from '../../../../constants.js';\nimport { BranchManager } from './branches.js';\n\n// TODO reinstate https://github.com/sveltejs/svelte/pull/15250\n\n/**\n * @param {TemplateNode} node\n * @param {(branch: (fn: (anchor: Node) => void, flag?: boolean) => void) => void} fn\n * @param {boolean} [elseif] True if this is an `{:else if ...}` block rather than an `{#if ...}`, as that affects which transitions are considered 'local'\n * @returns {void}\n */\nexport function if_block(node, fn, elseif = false) {\n\tif (hydrating) {\n\t\thydrate_next();\n\t}\n\n\tvar branches = new BranchManager(node);\n\tvar flags = elseif ? EFFECT_TRANSPARENT : 0;\n\n\t/**\n\t * @param {boolean} condition,\n\t * @param {null | ((anchor: Node) => void)} fn\n\t */\n\tfunction update_branch(condition, fn) {\n\t\tif (hydrating) {\n\t\t\tconst is_else = read_hydration_instruction(node) === HYDRATION_START_ELSE;\n\n\t\t\tif (condition === is_else) {\n\t\t\t\t// Hydration mismatch: remove everything inside the anchor and start fresh.\n\t\t\t\t// This could happen with `{#if browser}...{/if}`, for example\n\t\t\t\tvar anchor = skip_nodes();\n\n\t\t\t\tset_hydrate_node(anchor);\n\t\t\t\tbranches.anchor = anchor;\n\n\t\t\t\tset_hydrating(false);\n\t\t\t\tbranches.ensure(condition, fn);\n\t\t\t\tset_hydrating(true);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tbranches.ensure(condition, fn);\n\t}\n\n\tblock(() => {\n\t\tvar has_branch = false;\n\n\t\tfn((fn, flag = true) => {\n\t\t\thas_branch = true;\n\t\t\tupdate_branch(flag, fn);\n\t\t});\n\n\t\tif (!has_branch) {\n\t\t\tupdate_branch(false, null);\n\t\t}\n\t}, flags);\n}\n","/** @import { EachItem, EachOutroGroup, EachState, Effect, EffectNodes, MaybeSource, Source, TemplateNode, TransitionManager, Value } from '#client' */\n/** @import { Batch } from '../../reactivity/batch.js'; */\nimport {\n\tEACH_INDEX_REACTIVE,\n\tEACH_IS_ANIMATED,\n\tEACH_IS_CONTROLLED,\n\tEACH_ITEM_IMMUTABLE,\n\tEACH_ITEM_REACTIVE,\n\tHYDRATION_END,\n\tHYDRATION_START_ELSE\n} from '../../../../constants.js';\nimport {\n\thydrate_next,\n\thydrate_node,\n\thydrating,\n\tread_hydration_instruction,\n\tskip_nodes,\n\tset_hydrate_node,\n\tset_hydrating\n} from '../hydration.js';\nimport {\n\tclear_text_content,\n\tcreate_text,\n\tget_first_child,\n\tget_next_sibling,\n\tshould_defer_append\n} from '../operations.js';\nimport {\n\tblock,\n\tbranch,\n\tdestroy_effect,\n\tpause_effect,\n\tresume_effect\n} from '../../reactivity/effects.js';\nimport { source, mutable_source, internal_set } from '../../reactivity/sources.js';\nimport { array_from, is_array } from '../../../shared/utils.js';\nimport { BRANCH_EFFECT, COMMENT_NODE, EFFECT_OFFSCREEN, INERT } from '#client/constants';\nimport { queue_micro_task } from '../task.js';\nimport { get } from '../../runtime.js';\nimport { DEV } from 'esm-env';\nimport { derived_safe_equal } from '../../reactivity/deriveds.js';\nimport { current_batch } from '../../reactivity/batch.js';\n\n// When making substantive changes to this file, validate them with the each block stress test:\n// https://svelte.dev/playground/1972b2cf46564476ad8c8c6405b23b7b\n// This test also exists in this repo, as `packages/svelte/tests/manual/each-stress-test`\n\n/**\n * @param {any} _\n * @param {number} i\n */\nexport function index(_, i) {\n\treturn i;\n}\n\n/**\n * Pause multiple effects simultaneously, and coordinate their\n * subsequent destruction. Used in each blocks\n * @param {EachState} state\n * @param {Effect[]} to_destroy\n * @param {null | Node} controlled_anchor\n */\nfunction pause_effects(state, to_destroy, controlled_anchor) {\n\t/** @type {TransitionManager[]} */\n\tvar transitions = [];\n\tvar length = to_destroy.length;\n\n\t/** @type {EachOutroGroup} */\n\tvar group;\n\tvar remaining = to_destroy.length;\n\n\tfor (var i = 0; i < length; i++) {\n\t\tlet effect = to_destroy[i];\n\n\t\tpause_effect(\n\t\t\teffect,\n\t\t\t() => {\n\t\t\t\tif (group) {\n\t\t\t\t\tgroup.pending.delete(effect);\n\t\t\t\t\tgroup.done.add(effect);\n\n\t\t\t\t\tif (group.pending.size === 0) {\n\t\t\t\t\t\tvar groups = /** @type {Set<EachOutroGroup>} */ (state.outrogroups);\n\n\t\t\t\t\t\tdestroy_effects(array_from(group.done));\n\t\t\t\t\t\tgroups.delete(group);\n\n\t\t\t\t\t\tif (groups.size === 0) {\n\t\t\t\t\t\t\tstate.outrogroups = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tremaining -= 1;\n\t\t\t\t}\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\t}\n\n\tif (remaining === 0) {\n\t\t// If we're in a controlled each block (i.e. the block is the only child of an\n\t\t// element), and we are removing all items, _and_ there are no out transitions,\n\t\t// we can use the fast path — emptying the element and replacing the anchor\n\t\tvar fast_path = transitions.length === 0 && controlled_anchor !== null;\n\n\t\tif (fast_path) {\n\t\t\tvar anchor = /** @type {Element} */ (controlled_anchor);\n\t\t\tvar parent_node = /** @type {Element} */ (anchor.parentNode);\n\n\t\t\tclear_text_content(parent_node);\n\t\t\tparent_node.append(anchor);\n\n\t\t\tstate.items.clear();\n\t\t}\n\n\t\tdestroy_effects(to_destroy, !fast_path);\n\t} else {\n\t\tgroup = {\n\t\t\tpending: new Set(to_destroy),\n\t\t\tdone: new Set()\n\t\t};\n\n\t\t(state.outrogroups ??= new Set()).add(group);\n\t}\n}\n\n/**\n * @param {Effect[]} to_destroy\n * @param {boolean} remove_dom\n */\nfunction destroy_effects(to_destroy, remove_dom = true) {\n\t// TODO only destroy effects if no pending batch needs them. otherwise,\n\t// just re-add the `EFFECT_OFFSCREEN` flag\n\tfor (var i = 0; i < to_destroy.length; i++) {\n\t\tdestroy_effect(to_destroy[i], remove_dom);\n\t}\n}\n\n/** @type {TemplateNode} */\nvar offscreen_anchor;\n\n/**\n * @template V\n * @param {Element | Comment} node The next sibling node, or the parent node if this is a 'controlled' block\n * @param {number} flags\n * @param {() => V[]} get_collection\n * @param {(value: V, index: number) => any} get_key\n * @param {(anchor: Node, item: MaybeSource<V>, index: MaybeSource<number>) => void} render_fn\n * @param {null | ((anchor: Node) => void)} fallback_fn\n * @returns {void}\n */\nexport function each(node, flags, get_collection, get_key, render_fn, fallback_fn = null) {\n\tvar anchor = node;\n\n\t/** @type {Map<any, EachItem>} */\n\tvar items = new Map();\n\n\tvar is_controlled = (flags & EACH_IS_CONTROLLED) !== 0;\n\n\tif (is_controlled) {\n\t\tvar parent_node = /** @type {Element} */ (node);\n\n\t\tanchor = hydrating\n\t\t\t? set_hydrate_node(get_first_child(parent_node))\n\t\t\t: parent_node.appendChild(create_text());\n\t}\n\n\tif (hydrating) {\n\t\thydrate_next();\n\t}\n\n\t/** @type {Effect | null} */\n\tvar fallback = null;\n\n\t// TODO: ideally we could use derived for runes mode but because of the ability\n\t// to use a store which can be mutated, we can't do that here as mutating a store\n\t// will still result in the collection array being the same from the store\n\tvar each_array = derived_safe_equal(() => {\n\t\tvar collection = get_collection();\n\n\t\treturn is_array(collection) ? collection : collection == null ? [] : array_from(collection);\n\t});\n\n\t/** @type {V[]} */\n\tvar array;\n\n\tvar first_run = true;\n\n\tfunction commit() {\n\t\tstate.fallback = fallback;\n\t\treconcile(state, array, anchor, flags, get_key);\n\n\t\tif (fallback !== null) {\n\t\t\tif (array.length === 0) {\n\t\t\t\tif ((fallback.f & EFFECT_OFFSCREEN) === 0) {\n\t\t\t\t\tresume_effect(fallback);\n\t\t\t\t} else {\n\t\t\t\t\tfallback.f ^= EFFECT_OFFSCREEN;\n\t\t\t\t\tmove(fallback, null, anchor);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpause_effect(fallback, () => {\n\t\t\t\t\t// TODO only null out if no pending batch needs it,\n\t\t\t\t\t// otherwise re-add `fallback.fragment` and move the\n\t\t\t\t\t// effect into it\n\t\t\t\t\tfallback = null;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tvar effect = block(() => {\n\t\tarray = /** @type {V[]} */ (get(each_array));\n\t\tvar length = array.length;\n\n\t\t/** `true` if there was a hydration mismatch. Needs to be a `let` or else it isn't treeshaken out */\n\t\tlet mismatch = false;\n\n\t\tif (hydrating) {\n\t\t\tvar is_else = read_hydration_instruction(anchor) === HYDRATION_START_ELSE;\n\n\t\t\tif (is_else !== (length === 0)) {\n\t\t\t\t// hydration mismatch — remove the server-rendered DOM and start over\n\t\t\t\tanchor = skip_nodes();\n\n\t\t\t\tset_hydrate_node(anchor);\n\t\t\t\tset_hydrating(false);\n\t\t\t\tmismatch = true;\n\t\t\t}\n\t\t}\n\n\t\tvar keys = new Set();\n\t\tvar batch = /** @type {Batch} */ (current_batch);\n\t\tvar defer = should_defer_append();\n\n\t\tfor (var index = 0; index < length; index += 1) {\n\t\t\tif (\n\t\t\t\thydrating &&\n\t\t\t\thydrate_node.nodeType === COMMENT_NODE &&\n\t\t\t\t/** @type {Comment} */ (hydrate_node).data === HYDRATION_END\n\t\t\t) {\n\t\t\t\t// The server rendered fewer items than expected,\n\t\t\t\t// so break out and continue appending non-hydrated items\n\t\t\t\tanchor = /** @type {Comment} */ (hydrate_node);\n\t\t\t\tmismatch = true;\n\t\t\t\tset_hydrating(false);\n\t\t\t}\n\n\t\t\tvar value = array[index];\n\t\t\tvar key = get_key(value, index);\n\n\t\t\tvar item = first_run ? null : items.get(key);\n\n\t\t\tif (item) {\n\t\t\t\t// update before reconciliation, to trigger any async updates\n\t\t\t\tif (item.v) internal_set(item.v, value);\n\t\t\t\tif (item.i) internal_set(item.i, index);\n\n\t\t\t\tif (defer) {\n\t\t\t\t\tbatch.skipped_effects.delete(item.e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titem = create_item(\n\t\t\t\t\titems,\n\t\t\t\t\tfirst_run ? anchor : (offscreen_anchor ??= create_text()),\n\t\t\t\t\tvalue,\n\t\t\t\t\tkey,\n\t\t\t\t\tindex,\n\t\t\t\t\trender_fn,\n\t\t\t\t\tflags,\n\t\t\t\t\tget_collection\n\t\t\t\t);\n\n\t\t\t\tif (!first_run) {\n\t\t\t\t\titem.e.f |= EFFECT_OFFSCREEN;\n\t\t\t\t}\n\n\t\t\t\titems.set(key, item);\n\t\t\t}\n\n\t\t\tkeys.add(key);\n\t\t}\n\n\t\tif (length === 0 && fallback_fn && !fallback) {\n\t\t\tif (first_run) {\n\t\t\t\tfallback = branch(() => fallback_fn(anchor));\n\t\t\t} else {\n\t\t\t\tfallback = branch(() => fallback_fn((offscreen_anchor ??= create_text())));\n\t\t\t\tfallback.f |= EFFECT_OFFSCREEN;\n\t\t\t}\n\t\t}\n\n\t\t// remove excess nodes\n\t\tif (hydrating && length > 0) {\n\t\t\tset_hydrate_node(skip_nodes());\n\t\t}\n\n\t\tif (!first_run) {\n\t\t\tif (defer) {\n\t\t\t\tfor (const [key, item] of items) {\n\t\t\t\t\tif (!keys.has(key)) {\n\t\t\t\t\t\tbatch.skipped_effects.add(item.e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbatch.oncommit(commit);\n\t\t\t\tbatch.ondiscard(() => {\n\t\t\t\t\t// TODO presumably we need to do something here?\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcommit();\n\t\t\t}\n\t\t}\n\n\t\tif (mismatch) {\n\t\t\t// continue in hydration mode\n\t\t\tset_hydrating(true);\n\t\t}\n\n\t\t// When we mount the each block for the first time, the collection won't be\n\t\t// connected to this effect as the effect hasn't finished running yet and its deps\n\t\t// won't be assigned. However, it's possible that when reconciling the each block\n\t\t// that a mutation occurred and it's made the collection MAYBE_DIRTY, so reading the\n\t\t// collection again can provide consistency to the reactive graph again as the deriveds\n\t\t// will now be `CLEAN`.\n\t\tget(each_array);\n\t});\n\n\t/** @type {EachState} */\n\tvar state = { effect, flags, items, outrogroups: null, fallback };\n\n\tfirst_run = false;\n\n\tif (hydrating) {\n\t\tanchor = hydrate_node;\n\t}\n}\n\n/**\n * Skip past any non-branch effects (which could be created with `createSubscriber`, for example) to find the next branch effect\n * @param {Effect | null} effect\n * @returns {Effect | null}\n */\nfunction skip_to_branch(effect) {\n\twhile (effect !== null && (effect.f & BRANCH_EFFECT) === 0) {\n\t\teffect = effect.next;\n\t}\n\treturn effect;\n}\n\n/**\n * Add, remove, or reorder items output by an each block as its input changes\n * @template V\n * @param {EachState} state\n * @param {Array<V>} array\n * @param {Element | Comment | Text} anchor\n * @param {number} flags\n * @param {(value: V, index: number) => any} get_key\n * @returns {void}\n */\nfunction reconcile(state, array, anchor, flags, get_key) {\n\tvar is_animated = (flags & EACH_IS_ANIMATED) !== 0;\n\n\tvar length = array.length;\n\tvar items = state.items;\n\tvar current = skip_to_branch(state.effect.first);\n\n\t/** @type {undefined | Set<Effect>} */\n\tvar seen;\n\n\t/** @type {Effect | null} */\n\tvar prev = null;\n\n\t/** @type {undefined | Set<Effect>} */\n\tvar to_animate;\n\n\t/** @type {Effect[]} */\n\tvar matched = [];\n\n\t/** @type {Effect[]} */\n\tvar stashed = [];\n\n\t/** @type {V} */\n\tvar value;\n\n\t/** @type {any} */\n\tvar key;\n\n\t/** @type {Effect | undefined} */\n\tvar effect;\n\n\t/** @type {number} */\n\tvar i;\n\n\tif (is_animated) {\n\t\tfor (i = 0; i < length; i += 1) {\n\t\t\tvalue = array[i];\n\t\t\tkey = get_key(value, i);\n\t\t\teffect = /** @type {EachItem} */ (items.get(key)).e;\n\n\t\t\t// offscreen == coming in now, no animation in that case,\n\t\t\t// else this would happen https://github.com/sveltejs/svelte/issues/17181\n\t\t\tif ((effect.f & EFFECT_OFFSCREEN) === 0) {\n\t\t\t\teffect.nodes?.a?.measure();\n\t\t\t\t(to_animate ??= new Set()).add(effect);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (i = 0; i < length; i += 1) {\n\t\tvalue = array[i];\n\t\tkey = get_key(value, i);\n\n\t\teffect = /** @type {EachItem} */ (items.get(key)).e;\n\n\t\tif (state.outrogroups !== null) {\n\t\t\tfor (const group of state.outrogroups) {\n\t\t\t\tgroup.pending.delete(effect);\n\t\t\t\tgroup.done.delete(effect);\n\t\t\t}\n\t\t}\n\n\t\tif ((effect.f & EFFECT_OFFSCREEN) !== 0) {\n\t\t\teffect.f ^= EFFECT_OFFSCREEN;\n\n\t\t\tif (effect === current) {\n\t\t\t\tmove(effect, null, anchor);\n\t\t\t} else {\n\t\t\t\tvar next = prev ? prev.next : current;\n\n\t\t\t\tif (effect === state.effect.last) {\n\t\t\t\t\tstate.effect.last = effect.prev;\n\t\t\t\t}\n\n\t\t\t\tif (effect.prev) effect.prev.next = effect.next;\n\t\t\t\tif (effect.next) effect.next.prev = effect.prev;\n\t\t\t\tlink(state, prev, effect);\n\t\t\t\tlink(state, effect, next);\n\n\t\t\t\tmove(effect, next, anchor);\n\t\t\t\tprev = effect;\n\n\t\t\t\tmatched = [];\n\t\t\t\tstashed = [];\n\n\t\t\t\tcurrent = skip_to_branch(prev.next);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif ((effect.f & INERT) !== 0) {\n\t\t\tresume_effect(effect);\n\t\t\tif (is_animated) {\n\t\t\t\teffect.nodes?.a?.unfix();\n\t\t\t\t(to_animate ??= new Set()).delete(effect);\n\t\t\t}\n\t\t}\n\n\t\tif (effect !== current) {\n\t\t\tif (seen !== undefined && seen.has(effect)) {\n\t\t\t\tif (matched.length < stashed.length) {\n\t\t\t\t\t// more efficient to move later items to the front\n\t\t\t\t\tvar start = stashed[0];\n\t\t\t\t\tvar j;\n\n\t\t\t\t\tprev = start.prev;\n\n\t\t\t\t\tvar a = matched[0];\n\t\t\t\t\tvar b = matched[matched.length - 1];\n\n\t\t\t\t\tfor (j = 0; j < matched.length; j += 1) {\n\t\t\t\t\t\tmove(matched[j], start, anchor);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (j = 0; j < stashed.length; j += 1) {\n\t\t\t\t\t\tseen.delete(stashed[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\tlink(state, a.prev, b.next);\n\t\t\t\t\tlink(state, prev, a);\n\t\t\t\t\tlink(state, b, start);\n\n\t\t\t\t\tcurrent = start;\n\t\t\t\t\tprev = b;\n\t\t\t\t\ti -= 1;\n\n\t\t\t\t\tmatched = [];\n\t\t\t\t\tstashed = [];\n\t\t\t\t} else {\n\t\t\t\t\t// more efficient to move earlier items to the back\n\t\t\t\t\tseen.delete(effect);\n\t\t\t\t\tmove(effect, current, anchor);\n\n\t\t\t\t\tlink(state, effect.prev, effect.next);\n\t\t\t\t\tlink(state, effect, prev === null ? state.effect.first : prev.next);\n\t\t\t\t\tlink(state, prev, effect);\n\n\t\t\t\t\tprev = effect;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmatched = [];\n\t\t\tstashed = [];\n\n\t\t\twhile (current !== null && current !== effect) {\n\t\t\t\t(seen ??= new Set()).add(current);\n\t\t\t\tstashed.push(current);\n\t\t\t\tcurrent = skip_to_branch(current.next);\n\t\t\t}\n\n\t\t\tif (current === null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif ((effect.f & EFFECT_OFFSCREEN) === 0) {\n\t\t\tmatched.push(effect);\n\t\t}\n\n\t\tprev = effect;\n\t\tcurrent = skip_to_branch(effect.next);\n\t}\n\n\tif (state.outrogroups !== null) {\n\t\tfor (const group of state.outrogroups) {\n\t\t\tif (group.pending.size === 0) {\n\t\t\t\tdestroy_effects(array_from(group.done));\n\t\t\t\tstate.outrogroups?.delete(group);\n\t\t\t}\n\t\t}\n\n\t\tif (state.outrogroups.size === 0) {\n\t\t\tstate.outrogroups = null;\n\t\t}\n\t}\n\n\tif (current !== null || seen !== undefined) {\n\t\t/** @type {Effect[]} */\n\t\tvar to_destroy = [];\n\n\t\tif (seen !== undefined) {\n\t\t\tfor (effect of seen) {\n\t\t\t\tif ((effect.f & INERT) === 0) {\n\t\t\t\t\tto_destroy.push(effect);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twhile (current !== null) {\n\t\t\t// If the each block isn't inert, then inert effects are currently outroing and will be removed once the transition is finished\n\t\t\tif ((current.f & INERT) === 0 && current !== state.fallback) {\n\t\t\t\tto_destroy.push(current);\n\t\t\t}\n\n\t\t\tcurrent = skip_to_branch(current.next);\n\t\t}\n\n\t\tvar destroy_length = to_destroy.length;\n\n\t\tif (destroy_length > 0) {\n\t\t\tvar controlled_anchor = (flags & EACH_IS_CONTROLLED) !== 0 && length === 0 ? anchor : null;\n\n\t\t\tif (is_animated) {\n\t\t\t\tfor (i = 0; i < destroy_length; i += 1) {\n\t\t\t\t\tto_destroy[i].nodes?.a?.measure();\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0; i < destroy_length; i += 1) {\n\t\t\t\t\tto_destroy[i].nodes?.a?.fix();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpause_effects(state, to_destroy, controlled_anchor);\n\t\t}\n\t}\n\n\tif (is_animated) {\n\t\tqueue_micro_task(() => {\n\t\t\tif (to_animate === undefined) return;\n\t\t\tfor (effect of to_animate) {\n\t\t\t\teffect.nodes?.a?.apply();\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * @template V\n * @param {Map<any, EachItem>} items\n * @param {Node} anchor\n * @param {V} value\n * @param {unknown} key\n * @param {number} index\n * @param {(anchor: Node, item: V | Source<V>, index: number | Value<number>, collection: () => V[]) => void} render_fn\n * @param {number} flags\n * @param {() => V[]} get_collection\n * @returns {EachItem}\n */\nfunction create_item(items, anchor, value, key, index, render_fn, flags, get_collection) {\n\tvar v =\n\t\t(flags & EACH_ITEM_REACTIVE) !== 0\n\t\t\t? (flags & EACH_ITEM_IMMUTABLE) === 0\n\t\t\t\t? mutable_source(value, false, false)\n\t\t\t\t: source(value)\n\t\t\t: null;\n\n\tvar i = (flags & EACH_INDEX_REACTIVE) !== 0 ? source(index) : null;\n\n\tif (DEV && v) {\n\t\t// For tracing purposes, we need to link the source signal we create with the\n\t\t// collection + index so that tracing works as intended\n\t\tv.trace = () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-expressions\n\t\t\tget_collection()[i?.v ?? index];\n\t\t};\n\t}\n\n\treturn {\n\t\tv,\n\t\ti,\n\t\te: branch(() => {\n\t\t\trender_fn(anchor, v ?? value, i ?? index, get_collection);\n\n\t\t\treturn () => {\n\t\t\t\titems.delete(key);\n\t\t\t};\n\t\t})\n\t};\n}\n\n/**\n * @param {Effect} effect\n * @param {Effect | null} next\n * @param {Text | Element | Comment} anchor\n */\nfunction move(effect, next, anchor) {\n\tif (!effect.nodes) return;\n\n\tvar node = effect.nodes.start;\n\tvar end = effect.nodes.end;\n\n\tvar dest =\n\t\tnext && (next.f & EFFECT_OFFSCREEN) === 0\n\t\t\t? /** @type {EffectNodes} */ (next.nodes).start\n\t\t\t: anchor;\n\n\twhile (node !== null) {\n\t\tvar next_node = /** @type {TemplateNode} */ (get_next_sibling(node));\n\t\tdest.before(node);\n\n\t\tif (node === end) {\n\t\t\treturn;\n\t\t}\n\n\t\tnode = next_node;\n\t}\n}\n\n/**\n * @param {EachState} state\n * @param {Effect | null} prev\n * @param {Effect | null} next\n */\nfunction link(state, prev, next) {\n\tif (prev === null) {\n\t\tstate.effect.first = next;\n\t} else {\n\t\tprev.next = next;\n\t}\n\n\tif (next === null) {\n\t\tstate.effect.last = prev;\n\t} else {\n\t\tnext.prev = prev;\n\t}\n}\n","import { DEV } from 'esm-env';\nimport { register_style } from '../dev/css.js';\nimport { effect } from '../reactivity/effects.js';\n\n/**\n * @param {Node} anchor\n * @param {{ hash: string, code: string }} css\n */\nexport function append_styles(anchor, css) {\n\t// Use `queue_micro_task` to ensure `anchor` is in the DOM, otherwise getRootNode() will yield wrong results\n\teffect(() => {\n\t\tvar root = anchor.getRootNode();\n\n\t\tvar target = /** @type {ShadowRoot} */ (root).host\n\t\t\t? /** @type {ShadowRoot} */ (root)\n\t\t\t: /** @type {Document} */ (root).head ?? /** @type {Document} */ (root.ownerDocument).head;\n\n\t\t// Always querying the DOM is roughly the same perf as additionally checking for presence in a map first assuming\n\t\t// that you'll get cache hits half of the time, so we just always query the dom for simplicity and code savings.\n\t\tif (!target.querySelector('#' + css.hash)) {\n\t\t\tconst style = document.createElement('style');\n\t\t\tstyle.id = css.hash;\n\t\t\tstyle.textContent = css.code;\n\n\t\t\ttarget.appendChild(style);\n\n\t\t\tif (DEV) {\n\t\t\t\tregister_style(css.hash, style);\n\t\t\t}\n\t\t}\n\t});\n}\n","import { escape_html } from '../../escaping.js';\nimport { clsx as _clsx } from 'clsx';\n\n/**\n * `<div translate={false}>` should be rendered as `<div translate=\"no\">` and _not_\n * `<div translate=\"false\">`, which is equivalent to `<div translate=\"yes\">`. There\n * may be other odd cases that need to be added to this list in future\n * @type {Record<string, Map<any, string>>}\n */\nconst replacements = {\n\ttranslate: new Map([\n\t\t[true, 'yes'],\n\t\t[false, 'no']\n\t])\n};\n\n/**\n * @template V\n * @param {string} name\n * @param {V} value\n * @param {boolean} [is_boolean]\n * @returns {string}\n */\nexport function attr(name, value, is_boolean = false) {\n\t// attribute hidden for values other than \"until-found\" behaves like a boolean attribute\n\tif (name === 'hidden' && value !== 'until-found') {\n\t\tis_boolean = true;\n\t}\n\tif (value == null || (!value && is_boolean)) return '';\n\tconst normalized = (name in replacements && replacements[name].get(value)) || value;\n\tconst assignment = is_boolean ? '' : `=\"${escape_html(normalized, true)}\"`;\n\treturn ` ${name}${assignment}`;\n}\n\n/**\n * Small wrapper around clsx to preserve Svelte's (weird) handling of falsy values.\n * TODO Svelte 6 revisit this, and likely turn all falsy values into the empty string (what clsx also does)\n * @param {any} value\n */\nexport function clsx(value) {\n\tif (typeof value === 'object') {\n\t\treturn _clsx(value);\n\t} else {\n\t\treturn value ?? '';\n\t}\n}\n\nconst whitespace = [...' \\t\\n\\r\\f\\u00a0\\u000b\\ufeff'];\n\n/**\n * @param {any} value\n * @param {string | null} [hash]\n * @param {Record<string, boolean>} [directives]\n * @returns {string | null}\n */\nexport function to_class(value, hash, directives) {\n\tvar classname = value == null ? '' : '' + value;\n\n\tif (hash) {\n\t\tclassname = classname ? classname + ' ' + hash : hash;\n\t}\n\n\tif (directives) {\n\t\tfor (var key in directives) {\n\t\t\tif (directives[key]) {\n\t\t\t\tclassname = classname ? classname + ' ' + key : key;\n\t\t\t} else if (classname.length) {\n\t\t\t\tvar len = key.length;\n\t\t\t\tvar a = 0;\n\n\t\t\t\twhile ((a = classname.indexOf(key, a)) >= 0) {\n\t\t\t\t\tvar b = a + len;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t(a === 0 || whitespace.includes(classname[a - 1])) &&\n\t\t\t\t\t\t(b === classname.length || whitespace.includes(classname[b]))\n\t\t\t\t\t) {\n\t\t\t\t\t\tclassname = (a === 0 ? '' : classname.substring(0, a)) + classname.substring(b + 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ta = b;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn classname === '' ? null : classname;\n}\n\n/**\n *\n * @param {Record<string,any>} styles\n * @param {boolean} important\n */\nfunction append_styles(styles, important = false) {\n\tvar separator = important ? ' !important;' : ';';\n\tvar css = '';\n\n\tfor (var key in styles) {\n\t\tvar value = styles[key];\n\t\tif (value != null && value !== '') {\n\t\t\tcss += ' ' + key + ': ' + value + separator;\n\t\t}\n\t}\n\n\treturn css;\n}\n\n/**\n * @param {string} name\n * @returns {string}\n */\nfunction to_css_name(name) {\n\tif (name[0] !== '-' || name[1] !== '-') {\n\t\treturn name.toLowerCase();\n\t}\n\treturn name;\n}\n\n/**\n * @param {any} value\n * @param {Record<string, any> | [Record<string, any>, Record<string, any>]} [styles]\n * @returns {string | null}\n */\nexport function to_style(value, styles) {\n\tif (styles) {\n\t\tvar new_style = '';\n\n\t\t/** @type {Record<string,any> | undefined} */\n\t\tvar normal_styles;\n\n\t\t/** @type {Record<string,any> | undefined} */\n\t\tvar important_styles;\n\n\t\tif (Array.isArray(styles)) {\n\t\t\tnormal_styles = styles[0];\n\t\t\timportant_styles = styles[1];\n\t\t} else {\n\t\t\tnormal_styles = styles;\n\t\t}\n\n\t\tif (value) {\n\t\t\tvalue = String(value)\n\t\t\t\t.replaceAll(/\\s*\\/\\*.*?\\*\\/\\s*/g, '')\n\t\t\t\t.trim();\n\n\t\t\t/** @type {boolean | '\"' | \"'\"} */\n\t\t\tvar in_str = false;\n\t\t\tvar in_apo = 0;\n\t\t\tvar in_comment = false;\n\n\t\t\tvar reserved_names = [];\n\n\t\t\tif (normal_styles) {\n\t\t\t\treserved_names.push(...Object.keys(normal_styles).map(to_css_name));\n\t\t\t}\n\t\t\tif (important_styles) {\n\t\t\t\treserved_names.push(...Object.keys(important_styles).map(to_css_name));\n\t\t\t}\n\n\t\t\tvar start_index = 0;\n\t\t\tvar name_index = -1;\n\n\t\t\tconst len = value.length;\n\t\t\tfor (var i = 0; i < len; i++) {\n\t\t\t\tvar c = value[i];\n\n\t\t\t\tif (in_comment) {\n\t\t\t\t\tif (c === '/' && value[i - 1] === '*') {\n\t\t\t\t\t\tin_comment = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (in_str) {\n\t\t\t\t\tif (in_str === c) {\n\t\t\t\t\t\tin_str = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (c === '/' && value[i + 1] === '*') {\n\t\t\t\t\tin_comment = true;\n\t\t\t\t} else if (c === '\"' || c === \"'\") {\n\t\t\t\t\tin_str = c;\n\t\t\t\t} else if (c === '(') {\n\t\t\t\t\tin_apo++;\n\t\t\t\t} else if (c === ')') {\n\t\t\t\t\tin_apo--;\n\t\t\t\t}\n\n\t\t\t\tif (!in_comment && in_str === false && in_apo === 0) {\n\t\t\t\t\tif (c === ':' && name_index === -1) {\n\t\t\t\t\t\tname_index = i;\n\t\t\t\t\t} else if (c === ';' || i === len - 1) {\n\t\t\t\t\t\tif (name_index !== -1) {\n\t\t\t\t\t\t\tvar name = to_css_name(value.substring(start_index, name_index).trim());\n\n\t\t\t\t\t\t\tif (!reserved_names.includes(name)) {\n\t\t\t\t\t\t\t\tif (c !== ';') {\n\t\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar property = value.substring(start_index, i).trim();\n\t\t\t\t\t\t\t\tnew_style += ' ' + property + ';';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart_index = i + 1;\n\t\t\t\t\t\tname_index = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (normal_styles) {\n\t\t\tnew_style += append_styles(normal_styles);\n\t\t}\n\n\t\tif (important_styles) {\n\t\t\tnew_style += append_styles(important_styles, true);\n\t\t}\n\n\t\tnew_style = new_style.trim();\n\t\treturn new_style === '' ? null : new_style;\n\t}\n\n\treturn value == null ? null : String(value);\n}\n","import { to_class } from '../../../shared/attributes.js';\nimport { hydrating } from '../hydration.js';\n\n/**\n * @param {Element} dom\n * @param {boolean | number} is_html\n * @param {string | null} value\n * @param {string} [hash]\n * @param {Record<string, any>} [prev_classes]\n * @param {Record<string, any>} [next_classes]\n * @returns {Record<string, boolean> | undefined}\n */\nexport function set_class(dom, is_html, value, hash, prev_classes, next_classes) {\n\t// @ts-expect-error need to add __className to patched prototype\n\tvar prev = dom.__className;\n\n\tif (\n\t\thydrating ||\n\t\tprev !== value ||\n\t\tprev === undefined // for edge case of `class={undefined}`\n\t) {\n\t\tvar next_class_name = to_class(value, hash, next_classes);\n\n\t\tif (!hydrating || next_class_name !== dom.getAttribute('class')) {\n\t\t\t// Removing the attribute when the value is only an empty string causes\n\t\t\t// performance issues vs simply making the className an empty string. So\n\t\t\t// we should only remove the class if the value is nullish\n\t\t\t// and there no hash/directives :\n\t\t\tif (next_class_name == null) {\n\t\t\t\tdom.removeAttribute('class');\n\t\t\t} else if (is_html) {\n\t\t\t\tdom.className = next_class_name;\n\t\t\t} else {\n\t\t\t\tdom.setAttribute('class', next_class_name);\n\t\t\t}\n\t\t}\n\n\t\t// @ts-expect-error need to add __className to patched prototype\n\t\tdom.__className = value;\n\t} else if (next_classes && prev_classes !== next_classes) {\n\t\tfor (var key in next_classes) {\n\t\t\tvar is_present = !!next_classes[key];\n\n\t\t\tif (prev_classes == null || is_present !== !!prev_classes[key]) {\n\t\t\t\tdom.classList.toggle(key, is_present);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn next_classes;\n}\n","/** @import { Blocker, Effect } from '#client' */\nimport { DEV } from 'esm-env';\nimport { hydrating, set_hydrating } from '../hydration.js';\nimport { get_descriptors, get_prototype_of } from '../../../shared/utils.js';\nimport { create_event, delegate } from './events.js';\nimport { add_form_reset_listener, autofocus } from './misc.js';\nimport * as w from '../../warnings.js';\nimport { LOADING_ATTR_SYMBOL } from '#client/constants';\nimport { queue_micro_task } from '../task.js';\nimport { is_capture_event, can_delegate_event, normalize_attribute } from '../../../../utils.js';\nimport {\n\tactive_effect,\n\tactive_reaction,\n\tget,\n\tset_active_effect,\n\tset_active_reaction\n} from '../../runtime.js';\nimport { attach } from './attachments.js';\nimport { clsx } from '../../../shared/attributes.js';\nimport { set_class } from './class.js';\nimport { set_style } from './style.js';\nimport { ATTACHMENT_KEY, NAMESPACE_HTML, UNINITIALIZED } from '../../../../constants.js';\nimport { branch, destroy_effect, effect, managed } from '../../reactivity/effects.js';\nimport { init_select, select_option } from './bindings/select.js';\nimport { flatten } from '../../reactivity/async.js';\n\nexport const CLASS = Symbol('class');\nexport const STYLE = Symbol('style');\n\nconst IS_CUSTOM_ELEMENT = Symbol('is custom element');\nconst IS_HTML = Symbol('is html');\n\n/**\n * The value/checked attribute in the template actually corresponds to the defaultValue property, so we need\n * to remove it upon hydration to avoid a bug when someone resets the form value.\n * @param {HTMLInputElement} input\n * @returns {void}\n */\nexport function remove_input_defaults(input) {\n\tif (!hydrating) return;\n\n\tvar already_removed = false;\n\n\t// We try and remove the default attributes later, rather than sync during hydration.\n\t// Doing it sync during hydration has a negative impact on performance, but deferring the\n\t// work in an idle task alleviates this greatly. If a form reset event comes in before\n\t// the idle callback, then we ensure the input defaults are cleared just before.\n\tvar remove_defaults = () => {\n\t\tif (already_removed) return;\n\t\talready_removed = true;\n\n\t\t// Remove the attributes but preserve the values\n\t\tif (input.hasAttribute('value')) {\n\t\t\tvar value = input.value;\n\t\t\tset_attribute(input, 'value', null);\n\t\t\tinput.value = value;\n\t\t}\n\n\t\tif (input.hasAttribute('checked')) {\n\t\t\tvar checked = input.checked;\n\t\t\tset_attribute(input, 'checked', null);\n\t\t\tinput.checked = checked;\n\t\t}\n\t};\n\n\t// @ts-expect-error\n\tinput.__on_r = remove_defaults;\n\tqueue_micro_task(remove_defaults);\n\tadd_form_reset_listener();\n}\n\n/**\n * @param {Element} element\n * @param {any} value\n */\nexport function set_value(element, value) {\n\tvar attributes = get_attributes(element);\n\n\tif (\n\t\tattributes.value ===\n\t\t\t(attributes.value =\n\t\t\t\t// treat null and undefined the same for the initial value\n\t\t\t\tvalue ?? undefined) ||\n\t\t// @ts-expect-error\n\t\t// `progress` elements always need their value set when it's `0`\n\t\t(element.value === value && (value !== 0 || element.nodeName !== 'PROGRESS'))\n\t) {\n\t\treturn;\n\t}\n\n\t// @ts-expect-error\n\telement.value = value ?? '';\n}\n\n/**\n * @param {Element} element\n * @param {boolean} checked\n */\nexport function set_checked(element, checked) {\n\tvar attributes = get_attributes(element);\n\n\tif (\n\t\tattributes.checked ===\n\t\t(attributes.checked =\n\t\t\t// treat null and undefined the same for the initial value\n\t\t\tchecked ?? undefined)\n\t) {\n\t\treturn;\n\t}\n\n\t// @ts-expect-error\n\telement.checked = checked;\n}\n\n/**\n * Sets the `selected` attribute on an `option` element.\n * Not set through the property because that doesn't reflect to the DOM,\n * which means it wouldn't be taken into account when a form is reset.\n * @param {HTMLOptionElement} element\n * @param {boolean} selected\n */\nexport function set_selected(element, selected) {\n\tif (selected) {\n\t\t// The selected option could've changed via user selection, and\n\t\t// setting the value without this check would set it back.\n\t\tif (!element.hasAttribute('selected')) {\n\t\t\telement.setAttribute('selected', '');\n\t\t}\n\t} else {\n\t\telement.removeAttribute('selected');\n\t}\n}\n\n/**\n * Applies the default checked property without influencing the current checked property.\n * @param {HTMLInputElement} element\n * @param {boolean} checked\n */\nexport function set_default_checked(element, checked) {\n\tconst existing_value = element.checked;\n\telement.defaultChecked = checked;\n\telement.checked = existing_value;\n}\n\n/**\n * Applies the default value property without influencing the current value property.\n * @param {HTMLInputElement | HTMLTextAreaElement} element\n * @param {string} value\n */\nexport function set_default_value(element, value) {\n\tconst existing_value = element.value;\n\telement.defaultValue = value;\n\telement.value = existing_value;\n}\n\n/**\n * @param {Element} element\n * @param {string} attribute\n * @param {string | null} value\n * @param {boolean} [skip_warning]\n */\nexport function set_attribute(element, attribute, value, skip_warning) {\n\tvar attributes = get_attributes(element);\n\n\tif (hydrating) {\n\t\tattributes[attribute] = element.getAttribute(attribute);\n\n\t\tif (\n\t\t\tattribute === 'src' ||\n\t\t\tattribute === 'srcset' ||\n\t\t\t(attribute === 'href' && element.nodeName === 'LINK')\n\t\t) {\n\t\t\tif (!skip_warning) {\n\t\t\t\tcheck_src_in_dev_hydration(element, attribute, value ?? '');\n\t\t\t}\n\n\t\t\t// If we reset these attributes, they would result in another network request, which we want to avoid.\n\t\t\t// We assume they are the same between client and server as checking if they are equal is expensive\n\t\t\t// (we can't just compare the strings as they can be different between client and server but result in the\n\t\t\t// same url, so we would need to create hidden anchor elements to compare them)\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (attributes[attribute] === (attributes[attribute] = value)) return;\n\n\tif (attribute === 'loading') {\n\t\t// @ts-expect-error\n\t\telement[LOADING_ATTR_SYMBOL] = value;\n\t}\n\n\tif (value == null) {\n\t\telement.removeAttribute(attribute);\n\t} else if (typeof value !== 'string' && get_setters(element).includes(attribute)) {\n\t\t// @ts-ignore\n\t\telement[attribute] = value;\n\t} else {\n\t\telement.setAttribute(attribute, value);\n\t}\n}\n\n/**\n * @param {Element} dom\n * @param {string} attribute\n * @param {string} value\n */\nexport function set_xlink_attribute(dom, attribute, value) {\n\tdom.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\n\n/**\n * @param {HTMLElement} node\n * @param {string} prop\n * @param {any} value\n */\nexport function set_custom_element_data(node, prop, value) {\n\t// We need to ensure that setting custom element props, which can\n\t// invoke lifecycle methods on other custom elements, does not also\n\t// associate those lifecycle methods with the current active reaction\n\t// or effect\n\tvar previous_reaction = active_reaction;\n\tvar previous_effect = active_effect;\n\n\t// If we're hydrating but the custom element is from Svelte, and it already scaffolded,\n\t// then it might run block logic in hydration mode, which we have to prevent.\n\tlet was_hydrating = hydrating;\n\tif (hydrating) {\n\t\tset_hydrating(false);\n\t}\n\n\tset_active_reaction(null);\n\tset_active_effect(null);\n\n\ttry {\n\t\tif (\n\t\t\t// `style` should use `set_attribute` rather than the setter\n\t\t\tprop !== 'style' &&\n\t\t\t// Don't compute setters for custom elements while they aren't registered yet,\n\t\t\t// because during their upgrade/instantiation they might add more setters.\n\t\t\t// Instead, fall back to a simple \"an object, then set as property\" heuristic.\n\t\t\t(setters_cache.has(node.getAttribute('is') || node.nodeName) ||\n\t\t\t// customElements may not be available in browser extension contexts\n\t\t\t!customElements ||\n\t\t\tcustomElements.get(node.getAttribute('is') || node.tagName.toLowerCase())\n\t\t\t\t? get_setters(node).includes(prop)\n\t\t\t\t: value && typeof value === 'object')\n\t\t) {\n\t\t\t// @ts-expect-error\n\t\t\tnode[prop] = value;\n\t\t} else {\n\t\t\t// We did getters etc checks already, stringify before passing to set_attribute\n\t\t\t// to ensure it doesn't invoke the same logic again, and potentially populating\n\t\t\t// the setters cache too early.\n\t\t\tset_attribute(node, prop, value == null ? value : String(value));\n\t\t}\n\t} finally {\n\t\tset_active_reaction(previous_reaction);\n\t\tset_active_effect(previous_effect);\n\t\tif (was_hydrating) {\n\t\t\tset_hydrating(true);\n\t\t}\n\t}\n}\n\n/**\n * Spreads attributes onto a DOM element, taking into account the currently set attributes\n * @param {Element & ElementCSSInlineStyle} element\n * @param {Record<string | symbol, any> | undefined} prev\n * @param {Record<string | symbol, any>} next New attributes - this function mutates this object\n * @param {string} [css_hash]\n * @param {boolean} [should_remove_defaults]\n * @param {boolean} [skip_warning]\n * @returns {Record<string, any>}\n */\nfunction set_attributes(\n\telement,\n\tprev,\n\tnext,\n\tcss_hash,\n\tshould_remove_defaults = false,\n\tskip_warning = false\n) {\n\tif (hydrating && should_remove_defaults && element.tagName === 'INPUT') {\n\t\tvar input = /** @type {HTMLInputElement} */ (element);\n\t\tvar attribute = input.type === 'checkbox' ? 'defaultChecked' : 'defaultValue';\n\n\t\tif (!(attribute in next)) {\n\t\t\tremove_input_defaults(input);\n\t\t}\n\t}\n\n\tvar attributes = get_attributes(element);\n\n\tvar is_custom_element = attributes[IS_CUSTOM_ELEMENT];\n\tvar preserve_attribute_case = !attributes[IS_HTML];\n\n\t// If we're hydrating but the custom element is from Svelte, and it already scaffolded,\n\t// then it might run block logic in hydration mode, which we have to prevent.\n\tlet is_hydrating_custom_element = hydrating && is_custom_element;\n\tif (is_hydrating_custom_element) {\n\t\tset_hydrating(false);\n\t}\n\n\tvar current = prev || {};\n\tvar is_option_element = element.tagName === 'OPTION';\n\n\tfor (var key in prev) {\n\t\tif (!(key in next)) {\n\t\t\tnext[key] = null;\n\t\t}\n\t}\n\n\tif (next.class) {\n\t\tnext.class = clsx(next.class);\n\t} else if (css_hash || next[CLASS]) {\n\t\tnext.class = null; /* force call to set_class() */\n\t}\n\n\tif (next[STYLE]) {\n\t\tnext.style ??= null; /* force call to set_style() */\n\t}\n\n\tvar setters = get_setters(element);\n\n\t// since key is captured we use const\n\tfor (const key in next) {\n\t\t// let instead of var because referenced in a closure\n\t\tlet value = next[key];\n\n\t\t// Up here because we want to do this for the initial value, too, even if it's undefined,\n\t\t// and this wouldn't be reached in case of undefined because of the equality check below\n\t\tif (is_option_element && key === 'value' && value == null) {\n\t\t\t// The <option> element is a special case because removing the value attribute means\n\t\t\t// the value is set to the text content of the option element, and setting the value\n\t\t\t// to null or undefined means the value is set to the string \"null\" or \"undefined\".\n\t\t\t// To align with how we handle this case in non-spread-scenarios, this logic is needed.\n\t\t\t// There's a super-edge-case bug here that is left in in favor of smaller code size:\n\t\t\t// Because of the \"set missing props to null\" logic above, we can't differentiate\n\t\t\t// between a missing value and an explicitly set value of null or undefined. That means\n\t\t\t// that once set, the value attribute of an <option> element can't be removed. This is\n\t\t\t// a very rare edge case, and removing the attribute altogether isn't possible either\n\t\t\t// for the <option value={undefined}> case, so we're not losing any functionality here.\n\t\t\t// @ts-ignore\n\t\t\telement.value = element.__value = '';\n\t\t\tcurrent[key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === 'class') {\n\t\t\tvar is_html = element.namespaceURI === 'http://www.w3.org/1999/xhtml';\n\t\t\tset_class(element, is_html, value, css_hash, prev?.[CLASS], next[CLASS]);\n\t\t\tcurrent[key] = value;\n\t\t\tcurrent[CLASS] = next[CLASS];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === 'style') {\n\t\t\tset_style(element, value, prev?.[STYLE], next[STYLE]);\n\t\t\tcurrent[key] = value;\n\t\t\tcurrent[STYLE] = next[STYLE];\n\t\t\tcontinue;\n\t\t}\n\n\t\tvar prev_value = current[key];\n\n\t\t// Skip if value is unchanged, unless it's `undefined` and the element still has the attribute\n\t\tif (value === prev_value && !(value === undefined && element.hasAttribute(key))) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent[key] = value;\n\n\t\tvar prefix = key[0] + key[1]; // this is faster than key.slice(0, 2)\n\t\tif (prefix === '$$') continue;\n\n\t\tif (prefix === 'on') {\n\t\t\t/** @type {{ capture?: true }} */\n\t\t\tconst opts = {};\n\t\t\tconst event_handle_key = '$$' + key;\n\t\t\tlet event_name = key.slice(2);\n\t\t\tvar delegated = can_delegate_event(event_name);\n\n\t\t\tif (is_capture_event(event_name)) {\n\t\t\t\tevent_name = event_name.slice(0, -7);\n\t\t\t\topts.capture = true;\n\t\t\t}\n\n\t\t\tif (!delegated && prev_value) {\n\t\t\t\t// Listening to same event but different handler -> our handle function below takes care of this\n\t\t\t\t// If we were to remove and add listeners in this case, it could happen that the event is \"swallowed\"\n\t\t\t\t// (the browser seems to not know yet that a new one exists now) and doesn't reach the handler\n\t\t\t\t// https://github.com/sveltejs/svelte/issues/11903\n\t\t\t\tif (value != null) continue;\n\n\t\t\t\telement.removeEventListener(event_name, current[event_handle_key], opts);\n\t\t\t\tcurrent[event_handle_key] = null;\n\t\t\t}\n\n\t\t\tif (value != null) {\n\t\t\t\tif (!delegated) {\n\t\t\t\t\t/**\n\t\t\t\t\t * @this {any}\n\t\t\t\t\t * @param {Event} evt\n\t\t\t\t\t */\n\t\t\t\t\tfunction handle(evt) {\n\t\t\t\t\t\tcurrent[key].call(this, evt);\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrent[event_handle_key] = create_event(event_name, element, handle, opts);\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\telement[`__${event_name}`] = value;\n\t\t\t\t\tdelegate([event_name]);\n\t\t\t\t}\n\t\t\t} else if (delegated) {\n\t\t\t\t// @ts-ignore\n\t\t\t\telement[`__${event_name}`] = undefined;\n\t\t\t}\n\t\t} else if (key === 'style') {\n\t\t\t// avoid using the setter\n\t\t\tset_attribute(element, key, value);\n\t\t} else if (key === 'autofocus') {\n\t\t\tautofocus(/** @type {HTMLElement} */ (element), Boolean(value));\n\t\t} else if (!is_custom_element && (key === '__value' || (key === 'value' && value != null))) {\n\t\t\t// @ts-ignore We're not running this for custom elements because __value is actually\n\t\t\t// how Lit stores the current value on the element, and messing with that would break things.\n\t\t\telement.value = element.__value = value;\n\t\t} else if (key === 'selected' && is_option_element) {\n\t\t\tset_selected(/** @type {HTMLOptionElement} */ (element), value);\n\t\t} else {\n\t\t\tvar name = key;\n\t\t\tif (!preserve_attribute_case) {\n\t\t\t\tname = normalize_attribute(name);\n\t\t\t}\n\n\t\t\tvar is_default = name === 'defaultValue' || name === 'defaultChecked';\n\n\t\t\tif (value == null && !is_custom_element && !is_default) {\n\t\t\t\tattributes[key] = null;\n\n\t\t\t\tif (name === 'value' || name === 'checked') {\n\t\t\t\t\t// removing value/checked also removes defaultValue/defaultChecked — preserve\n\t\t\t\t\tlet input = /** @type {HTMLInputElement} */ (element);\n\t\t\t\t\tconst use_default = prev === undefined;\n\t\t\t\t\tif (name === 'value') {\n\t\t\t\t\t\tlet previous = input.defaultValue;\n\t\t\t\t\t\tinput.removeAttribute(name);\n\t\t\t\t\t\tinput.defaultValue = previous;\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tinput.value = input.__value = use_default ? previous : null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet previous = input.defaultChecked;\n\t\t\t\t\t\tinput.removeAttribute(name);\n\t\t\t\t\t\tinput.defaultChecked = previous;\n\t\t\t\t\t\tinput.checked = use_default ? previous : false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\telement.removeAttribute(key);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tis_default ||\n\t\t\t\t(setters.includes(name) && (is_custom_element || typeof value !== 'string'))\n\t\t\t) {\n\t\t\t\t// @ts-ignore\n\t\t\t\telement[name] = value;\n\t\t\t\t// remove it from attributes's cache\n\t\t\t\tif (name in attributes) attributes[name] = UNINITIALIZED;\n\t\t\t} else if (typeof value !== 'function') {\n\t\t\t\tset_attribute(element, name, value, skip_warning);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (is_hydrating_custom_element) {\n\t\tset_hydrating(true);\n\t}\n\n\treturn current;\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} element\n * @param {(...expressions: any) => Record<string | symbol, any>} fn\n * @param {Array<() => any>} sync\n * @param {Array<() => Promise<any>>} async\n * @param {Blocker[]} blockers\n * @param {string} [css_hash]\n * @param {boolean} [should_remove_defaults]\n * @param {boolean} [skip_warning]\n */\nexport function attribute_effect(\n\telement,\n\tfn,\n\tsync = [],\n\tasync = [],\n\tblockers = [],\n\tcss_hash,\n\tshould_remove_defaults = false,\n\tskip_warning = false\n) {\n\tflatten(blockers, sync, async, (values) => {\n\t\t/** @type {Record<string | symbol, any> | undefined} */\n\t\tvar prev = undefined;\n\n\t\t/** @type {Record<symbol, Effect>} */\n\t\tvar effects = {};\n\n\t\tvar is_select = element.nodeName === 'SELECT';\n\t\tvar inited = false;\n\n\t\tmanaged(() => {\n\t\t\tvar next = fn(...values.map(get));\n\t\t\t/** @type {Record<string | symbol, any>} */\n\t\t\tvar current = set_attributes(\n\t\t\t\telement,\n\t\t\t\tprev,\n\t\t\t\tnext,\n\t\t\t\tcss_hash,\n\t\t\t\tshould_remove_defaults,\n\t\t\t\tskip_warning\n\t\t\t);\n\n\t\t\tif (inited && is_select && 'value' in next) {\n\t\t\t\tselect_option(/** @type {HTMLSelectElement} */ (element), next.value);\n\t\t\t}\n\n\t\t\tfor (let symbol of Object.getOwnPropertySymbols(effects)) {\n\t\t\t\tif (!next[symbol]) destroy_effect(effects[symbol]);\n\t\t\t}\n\n\t\t\tfor (let symbol of Object.getOwnPropertySymbols(next)) {\n\t\t\t\tvar n = next[symbol];\n\n\t\t\t\tif (symbol.description === ATTACHMENT_KEY && (!prev || n !== prev[symbol])) {\n\t\t\t\t\tif (effects[symbol]) destroy_effect(effects[symbol]);\n\t\t\t\t\teffects[symbol] = branch(() => attach(element, () => n));\n\t\t\t\t}\n\n\t\t\t\tcurrent[symbol] = n;\n\t\t\t}\n\n\t\t\tprev = current;\n\t\t});\n\n\t\tif (is_select) {\n\t\t\tvar select = /** @type {HTMLSelectElement} */ (element);\n\n\t\t\teffect(() => {\n\t\t\t\tselect_option(select, /** @type {Record<string | symbol, any>} */ (prev).value, true);\n\t\t\t\tinit_select(select);\n\t\t\t});\n\t\t}\n\n\t\tinited = true;\n\t});\n}\n\n/**\n *\n * @param {Element} element\n */\nfunction get_attributes(element) {\n\treturn /** @type {Record<string | symbol, unknown>} **/ (\n\t\t// @ts-expect-error\n\t\telement.__attributes ??= {\n\t\t\t[IS_CUSTOM_ELEMENT]: element.nodeName.includes('-'),\n\t\t\t[IS_HTML]: element.namespaceURI === NAMESPACE_HTML\n\t\t}\n\t);\n}\n\n/** @type {Map<string, string[]>} */\nvar setters_cache = new Map();\n\n/** @param {Element} element */\nfunction get_setters(element) {\n\tvar cache_key = element.getAttribute('is') || element.nodeName;\n\tvar setters = setters_cache.get(cache_key);\n\tif (setters) return setters;\n\tsetters_cache.set(cache_key, (setters = []));\n\n\tvar descriptors;\n\tvar proto = element; // In the case of custom elements there might be setters on the instance\n\tvar element_proto = Element.prototype;\n\n\t// Stop at Element, from there on there's only unnecessary setters we're not interested in\n\t// Do not use contructor.name here as that's unreliable in some browser environments\n\twhile (element_proto !== proto) {\n\t\tdescriptors = get_descriptors(proto);\n\n\t\tfor (var key in descriptors) {\n\t\t\tif (descriptors[key].set) {\n\t\t\t\tsetters.push(key);\n\t\t\t}\n\t\t}\n\n\t\tproto = get_prototype_of(proto);\n\t}\n\n\treturn setters;\n}\n\n/**\n * @param {any} element\n * @param {string} attribute\n * @param {string} value\n */\nfunction check_src_in_dev_hydration(element, attribute, value) {\n\tif (!DEV) return;\n\tif (attribute === 'srcset' && srcset_url_equal(element, value)) return;\n\tif (src_url_equal(element.getAttribute(attribute) ?? '', value)) return;\n\n\tw.hydration_attribute_changed(\n\t\tattribute,\n\t\telement.outerHTML.replace(element.innerHTML, element.innerHTML && '...'),\n\t\tString(value)\n\t);\n}\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nfunction src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\treturn new URL(element_src, document.baseURI).href === new URL(url, document.baseURI).href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element\n * @param {string} srcset\n * @returns {boolean}\n */\nfunction srcset_url_equal(element, srcset) {\n\tvar element_urls = split_srcset(element.srcset);\n\tvar urls = split_srcset(srcset);\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n","import { STATE_SYMBOL } from '#client/constants';\nimport { effect, render_effect } from '../../../reactivity/effects.js';\nimport { untrack } from '../../../runtime.js';\nimport { queue_micro_task } from '../../task.js';\n\n/**\n * @param {any} bound_value\n * @param {Element} element_or_component\n * @returns {boolean}\n */\nfunction is_bound_this(bound_value, element_or_component) {\n\treturn (\n\t\tbound_value === element_or_component || bound_value?.[STATE_SYMBOL] === element_or_component\n\t);\n}\n\n/**\n * @param {any} element_or_component\n * @param {(value: unknown, ...parts: unknown[]) => void} update\n * @param {(...parts: unknown[]) => unknown} get_value\n * @param {() => unknown[]} [get_parts] Set if the this binding is used inside an each block,\n * \t\t\t\t\t\t\t\t\t\treturns all the parts of the each block context that are used in the expression\n * @returns {void}\n */\nexport function bind_this(element_or_component = {}, update, get_value, get_parts) {\n\teffect(() => {\n\t\t/** @type {unknown[]} */\n\t\tvar old_parts;\n\n\t\t/** @type {unknown[]} */\n\t\tvar parts;\n\n\t\trender_effect(() => {\n\t\t\told_parts = parts;\n\t\t\t// We only track changes to the parts, not the value itself to avoid unnecessary reruns.\n\t\t\tparts = get_parts?.() || [];\n\n\t\t\tuntrack(() => {\n\t\t\t\tif (element_or_component !== get_value(...parts)) {\n\t\t\t\t\tupdate(element_or_component, ...parts);\n\t\t\t\t\t// If this is an effect rerun (cause: each block context changes), then nullify the binding at\n\t\t\t\t\t// the previous position if it isn't already taken over by a different effect.\n\t\t\t\t\tif (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) {\n\t\t\t\t\t\tupdate(null, ...old_parts);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\t// We cannot use effects in the teardown phase, we we use a microtask instead.\n\t\t\tqueue_micro_task(() => {\n\t\t\t\tif (parts && is_bound_this(get_value(...parts), element_or_component)) {\n\t\t\t\t\tupdate(null, ...parts);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t});\n\n\treturn element_or_component;\n}\n","/** @import { StoreReferencesContainer } from '#client' */\n/** @import { Store } from '#shared' */\nimport { subscribe_to_store } from '../../../store/utils.js';\nimport { get as get_store } from '../../../store/shared/index.js';\nimport { define_property, noop } from '../../shared/utils.js';\nimport { get } from '../runtime.js';\nimport { teardown } from './effects.js';\nimport { mutable_source, set } from './sources.js';\nimport { DEV } from 'esm-env';\n\n/**\n * Whether or not the prop currently being read is a store binding, as in\n * `<Child bind:x={$y} />`. If it is, we treat the prop as mutable even in\n * runes mode, and skip `binding_property_non_reactive` validation\n */\nlet is_store_binding = false;\n\nlet IS_UNMOUNTED = Symbol();\n\n/**\n * Gets the current value of a store. If the store isn't subscribed to yet, it will create a proxy\n * signal that will be updated when the store is. The store references container is needed to\n * track reassignments to stores and to track the correct component context.\n * @template V\n * @param {Store<V> | null | undefined} store\n * @param {string} store_name\n * @param {StoreReferencesContainer} stores\n * @returns {V}\n */\nexport function store_get(store, store_name, stores) {\n\tconst entry = (stores[store_name] ??= {\n\t\tstore: null,\n\t\tsource: mutable_source(undefined),\n\t\tunsubscribe: noop\n\t});\n\n\tif (DEV) {\n\t\tentry.source.label = store_name;\n\t}\n\n\t// if the component that setup this is already unmounted we don't want to register a subscription\n\tif (entry.store !== store && !(IS_UNMOUNTED in stores)) {\n\t\tentry.unsubscribe();\n\t\tentry.store = store ?? null;\n\n\t\tif (store == null) {\n\t\t\tentry.source.v = undefined; // see synchronous callback comment below\n\t\t\tentry.unsubscribe = noop;\n\t\t} else {\n\t\t\tvar is_synchronous_callback = true;\n\n\t\t\tentry.unsubscribe = subscribe_to_store(store, (v) => {\n\t\t\t\tif (is_synchronous_callback) {\n\t\t\t\t\t// If the first updates to the store value (possibly multiple of them) are synchronously\n\t\t\t\t\t// inside a derived, we will hit the `state_unsafe_mutation` error if we `set` the value\n\t\t\t\t\tentry.source.v = v;\n\t\t\t\t} else {\n\t\t\t\t\tset(entry.source, v);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tis_synchronous_callback = false;\n\t\t}\n\t}\n\n\t// if the component that setup this stores is already unmounted the source will be out of sync\n\t// so we just use the `get` for the stores, less performant but it avoids to create a memory leak\n\t// and it will keep the value consistent\n\tif (store && IS_UNMOUNTED in stores) {\n\t\treturn get_store(store);\n\t}\n\n\treturn get(entry.source);\n}\n\n/**\n * Unsubscribe from a store if it's not the same as the one in the store references container.\n * We need this in addition to `store_get` because someone could unsubscribe from a store but\n * then never subscribe to the new one (if any), causing the subscription to stay open wrongfully.\n * @param {Store<any> | null | undefined} store\n * @param {string} store_name\n * @param {StoreReferencesContainer} stores\n */\nexport function store_unsub(store, store_name, stores) {\n\t/** @type {StoreReferencesContainer[''] | undefined} */\n\tlet entry = stores[store_name];\n\n\tif (entry && entry.store !== store) {\n\t\t// Don't reset store yet, so that store_get above can resubscribe to new store if necessary\n\t\tentry.unsubscribe();\n\t\tentry.unsubscribe = noop;\n\t}\n\n\treturn store;\n}\n\n/**\n * Sets the new value of a store and returns that value.\n * @template V\n * @param {Store<V>} store\n * @param {V} value\n * @returns {V}\n */\nexport function store_set(store, value) {\n\tstore.set(value);\n\treturn value;\n}\n\n/**\n * @param {StoreReferencesContainer} stores\n * @param {string} store_name\n */\nexport function invalidate_store(stores, store_name) {\n\tvar entry = stores[store_name];\n\tif (entry.store !== null) {\n\t\tstore_set(entry.store, entry.source.v);\n\t}\n}\n\n/**\n * Unsubscribes from all auto-subscribed stores on destroy\n * @returns {[StoreReferencesContainer, ()=>void]}\n */\nexport function setup_stores() {\n\t/** @type {StoreReferencesContainer} */\n\tconst stores = {};\n\n\tfunction cleanup() {\n\t\tteardown(() => {\n\t\t\tfor (var store_name in stores) {\n\t\t\t\tconst ref = stores[store_name];\n\t\t\t\tref.unsubscribe();\n\t\t\t}\n\t\t\tdefine_property(stores, IS_UNMOUNTED, {\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: true\n\t\t\t});\n\t\t});\n\t}\n\n\treturn [stores, cleanup];\n}\n\n/**\n * Updates a store with a new value.\n * @param {Store<V>} store the store to update\n * @param {any} expression the expression that mutates the store\n * @param {V} new_value the new store value\n * @template V\n */\nexport function store_mutate(store, expression, new_value) {\n\tstore.set(new_value);\n\treturn expression;\n}\n\n/**\n * @param {Store<number>} store\n * @param {number} store_value\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_store(store, store_value, d = 1) {\n\tstore.set(store_value + d);\n\treturn store_value;\n}\n\n/**\n * @param {Store<number>} store\n * @param {number} store_value\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_pre_store(store, store_value, d = 1) {\n\tconst value = store_value + d;\n\tstore.set(value);\n\treturn value;\n}\n\n/**\n * Called inside prop getters to communicate that the prop is a store binding\n */\nexport function mark_store_binding() {\n\tis_store_binding = true;\n}\n\n/**\n * Returns a tuple that indicates whether `fn()` reads a prop that is a store binding.\n * Used to prevent `binding_property_non_reactive` validation false positives and\n * ensure that these props are treated as mutable even in runes mode\n * @template T\n * @param {() => T} fn\n * @returns {[T, boolean]}\n */\nexport function capture_store_binding(fn) {\n\tvar previous_is_store_binding = is_store_binding;\n\n\ttry {\n\t\tis_store_binding = false;\n\t\treturn [fn(), is_store_binding];\n\t} finally {\n\t\tis_store_binding = previous_is_store_binding;\n\t}\n}\n","/** @import { Effect, Source } from './types.js' */\nimport { DEV } from 'esm-env';\nimport {\n\tPROPS_IS_BINDABLE,\n\tPROPS_IS_IMMUTABLE,\n\tPROPS_IS_LAZY_INITIAL,\n\tPROPS_IS_RUNES,\n\tPROPS_IS_UPDATED\n} from '../../../constants.js';\nimport { get_descriptor, is_function } from '../../shared/utils.js';\nimport { set, source, update } from './sources.js';\nimport { derived, derived_safe_equal } from './deriveds.js';\nimport {\n\tactive_effect,\n\tget,\n\tis_destroying_effect,\n\tset_active_effect,\n\tuntrack\n} from '../runtime.js';\nimport * as e from '../errors.js';\nimport { DESTROYED, LEGACY_PROPS, STATE_SYMBOL } from '#client/constants';\nimport { proxy } from '../proxy.js';\nimport { capture_store_binding } from './store.js';\nimport { legacy_mode_flag } from '../../flags/index.js';\n\n/**\n * @param {((value?: number) => number)} fn\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_prop(fn, d = 1) {\n\tconst value = fn();\n\tfn(value + d);\n\treturn value;\n}\n\n/**\n * @param {((value?: number) => number)} fn\n * @param {1 | -1} [d]\n * @returns {number}\n */\nexport function update_pre_prop(fn, d = 1) {\n\tconst value = fn() + d;\n\tfn(value);\n\treturn value;\n}\n\n/**\n * The proxy handler for rest props (i.e. `const { x, ...rest } = $props()`).\n * Is passed the full `$$props` object and excludes the named props.\n * @type {ProxyHandler<{ props: Record<string | symbol, unknown>, exclude: Array<string | symbol>, name?: string }>}}\n */\nconst rest_props_handler = {\n\tget(target, key) {\n\t\tif (target.exclude.includes(key)) return;\n\t\treturn target.props[key];\n\t},\n\tset(target, key) {\n\t\tif (DEV) {\n\t\t\t// TODO should this happen in prod too?\n\t\t\te.props_rest_readonly(`${target.name}.${String(key)}`);\n\t\t}\n\n\t\treturn false;\n\t},\n\tgetOwnPropertyDescriptor(target, key) {\n\t\tif (target.exclude.includes(key)) return;\n\t\tif (key in target.props) {\n\t\t\treturn {\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: target.props[key]\n\t\t\t};\n\t\t}\n\t},\n\thas(target, key) {\n\t\tif (target.exclude.includes(key)) return false;\n\t\treturn key in target.props;\n\t},\n\townKeys(target) {\n\t\treturn Reflect.ownKeys(target.props).filter((key) => !target.exclude.includes(key));\n\t}\n};\n\n/**\n * @param {Record<string, unknown>} props\n * @param {string[]} exclude\n * @param {string} [name]\n * @returns {Record<string, unknown>}\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function rest_props(props, exclude, name) {\n\treturn new Proxy(\n\t\tDEV ? { props, exclude, name, other: {}, to_proxy: [] } : { props, exclude },\n\t\trest_props_handler\n\t);\n}\n\n/**\n * The proxy handler for legacy $$restProps and $$props\n * @type {ProxyHandler<{ props: Record<string | symbol, unknown>, exclude: Array<string | symbol>, special: Record<string | symbol, (v?: unknown) => unknown>, version: Source<number>, parent_effect: Effect }>}}\n */\nconst legacy_rest_props_handler = {\n\tget(target, key) {\n\t\tif (target.exclude.includes(key)) return;\n\t\tget(target.version);\n\t\treturn key in target.special ? target.special[key]() : target.props[key];\n\t},\n\tset(target, key, value) {\n\t\tif (!(key in target.special)) {\n\t\t\tvar previous_effect = active_effect;\n\n\t\t\ttry {\n\t\t\t\tset_active_effect(target.parent_effect);\n\n\t\t\t\t// Handle props that can temporarily get out of sync with the parent\n\t\t\t\t/** @type {Record<string, (v?: unknown) => unknown>} */\n\t\t\t\ttarget.special[key] = prop(\n\t\t\t\t\t{\n\t\t\t\t\t\tget [key]() {\n\t\t\t\t\t\t\treturn target.props[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t/** @type {string} */ (key),\n\t\t\t\t\tPROPS_IS_UPDATED\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tset_active_effect(previous_effect);\n\t\t\t}\n\t\t}\n\n\t\ttarget.special[key](value);\n\t\tupdate(target.version); // $$props is coarse-grained: when $$props.x is updated, usages of $$props.y etc are also rerun\n\t\treturn true;\n\t},\n\tgetOwnPropertyDescriptor(target, key) {\n\t\tif (target.exclude.includes(key)) return;\n\t\tif (key in target.props) {\n\t\t\treturn {\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t\tvalue: target.props[key]\n\t\t\t};\n\t\t}\n\t},\n\tdeleteProperty(target, key) {\n\t\t// Svelte 4 allowed for deletions on $$restProps\n\t\tif (target.exclude.includes(key)) return true;\n\t\ttarget.exclude.push(key);\n\t\tupdate(target.version);\n\t\treturn true;\n\t},\n\thas(target, key) {\n\t\tif (target.exclude.includes(key)) return false;\n\t\treturn key in target.props;\n\t},\n\townKeys(target) {\n\t\treturn Reflect.ownKeys(target.props).filter((key) => !target.exclude.includes(key));\n\t}\n};\n\n/**\n * @param {Record<string, unknown>} props\n * @param {string[]} exclude\n * @returns {Record<string, unknown>}\n */\nexport function legacy_rest_props(props, exclude) {\n\treturn new Proxy(\n\t\t{\n\t\t\tprops,\n\t\t\texclude,\n\t\t\tspecial: {},\n\t\t\tversion: source(0),\n\t\t\t// TODO this is only necessary because we need to track component\n\t\t\t// destruction inside `prop`, because of `bind:this`, but it\n\t\t\t// seems likely that we can simplify `bind:this` instead\n\t\t\tparent_effect: /** @type {Effect} */ (active_effect)\n\t\t},\n\t\tlegacy_rest_props_handler\n\t);\n}\n\n/**\n * The proxy handler for spread props. Handles the incoming array of props\n * that looks like `() => { dynamic: props }, { static: prop }, ..` and wraps\n * them so that the whole thing is passed to the component as the `$$props` argument.\n * @type {ProxyHandler<{ props: Array<Record<string | symbol, unknown> | (() => Record<string | symbol, unknown>)> }>}}\n */\nconst spread_props_handler = {\n\tget(target, key) {\n\t\tlet i = target.props.length;\n\t\twhile (i--) {\n\t\t\tlet p = target.props[i];\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (typeof p === 'object' && p !== null && key in p) return p[key];\n\t\t}\n\t},\n\tset(target, key, value) {\n\t\tlet i = target.props.length;\n\t\twhile (i--) {\n\t\t\tlet p = target.props[i];\n\t\t\tif (is_function(p)) p = p();\n\t\t\tconst desc = get_descriptor(p, key);\n\t\t\tif (desc && desc.set) {\n\t\t\t\tdesc.set(value);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\tgetOwnPropertyDescriptor(target, key) {\n\t\tlet i = target.props.length;\n\t\twhile (i--) {\n\t\t\tlet p = target.props[i];\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (typeof p === 'object' && p !== null && key in p) {\n\t\t\t\tconst descriptor = get_descriptor(p, key);\n\t\t\t\tif (descriptor && !descriptor.configurable) {\n\t\t\t\t\t// Prevent a \"Non-configurability Report Error\": The target is an array, it does\n\t\t\t\t\t// not actually contain this property. If it is now described as non-configurable,\n\t\t\t\t\t// the proxy throws a validation error. Setting it to true avoids that.\n\t\t\t\t\tdescriptor.configurable = true;\n\t\t\t\t}\n\t\t\t\treturn descriptor;\n\t\t\t}\n\t\t}\n\t},\n\thas(target, key) {\n\t\t// To prevent a false positive `is_entry_props` in the `prop` function\n\t\tif (key === STATE_SYMBOL || key === LEGACY_PROPS) return false;\n\n\t\tfor (let p of target.props) {\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (p != null && key in p) return true;\n\t\t}\n\n\t\treturn false;\n\t},\n\townKeys(target) {\n\t\t/** @type {Array<string | symbol>} */\n\t\tconst keys = [];\n\n\t\tfor (let p of target.props) {\n\t\t\tif (is_function(p)) p = p();\n\t\t\tif (!p) continue;\n\n\t\t\tfor (const key in p) {\n\t\t\t\tif (!keys.includes(key)) keys.push(key);\n\t\t\t}\n\n\t\t\tfor (const key of Object.getOwnPropertySymbols(p)) {\n\t\t\t\tif (!keys.includes(key)) keys.push(key);\n\t\t\t}\n\t\t}\n\n\t\treturn keys;\n\t}\n};\n\n/**\n * @param {Array<Record<string, unknown> | (() => Record<string, unknown>)>} props\n * @returns {any}\n */\nexport function spread_props(...props) {\n\treturn new Proxy({ props }, spread_props_handler);\n}\n\n/**\n * This function is responsible for synchronizing a possibly bound prop with the inner component state.\n * It is used whenever the compiler sees that the component writes to the prop, or when it has a default prop_value.\n * @template V\n * @param {Record<string, unknown>} props\n * @param {string} key\n * @param {number} flags\n * @param {V | (() => V)} [fallback]\n * @returns {(() => V | ((arg: V) => V) | ((arg: V, mutation: boolean) => V))}\n */\nexport function prop(props, key, flags, fallback) {\n\tvar runes = !legacy_mode_flag || (flags & PROPS_IS_RUNES) !== 0;\n\tvar bindable = (flags & PROPS_IS_BINDABLE) !== 0;\n\tvar lazy = (flags & PROPS_IS_LAZY_INITIAL) !== 0;\n\n\tvar fallback_value = /** @type {V} */ (fallback);\n\tvar fallback_dirty = true;\n\n\tvar get_fallback = () => {\n\t\tif (fallback_dirty) {\n\t\t\tfallback_dirty = false;\n\n\t\t\tfallback_value = lazy\n\t\t\t\t? untrack(/** @type {() => V} */ (fallback))\n\t\t\t\t: /** @type {V} */ (fallback);\n\t\t}\n\n\t\treturn fallback_value;\n\t};\n\n\t/** @type {((v: V) => void) | undefined} */\n\tvar setter;\n\n\tif (bindable) {\n\t\t// Can be the case when someone does `mount(Component, props)` with `let props = $state({...})`\n\t\t// or `createClassComponent(Component, props)`\n\t\tvar is_entry_props = STATE_SYMBOL in props || LEGACY_PROPS in props;\n\n\t\tsetter =\n\t\t\tget_descriptor(props, key)?.set ??\n\t\t\t(is_entry_props && key in props ? (v) => (props[key] = v) : undefined);\n\t}\n\n\tvar initial_value;\n\tvar is_store_sub = false;\n\n\tif (bindable) {\n\t\t[initial_value, is_store_sub] = capture_store_binding(() => /** @type {V} */ (props[key]));\n\t} else {\n\t\tinitial_value = /** @type {V} */ (props[key]);\n\t}\n\n\tif (initial_value === undefined && fallback !== undefined) {\n\t\tinitial_value = get_fallback();\n\n\t\tif (setter) {\n\t\t\tif (runes) e.props_invalid_value(key);\n\t\t\tsetter(initial_value);\n\t\t}\n\t}\n\n\t/** @type {() => V} */\n\tvar getter;\n\n\tif (runes) {\n\t\tgetter = () => {\n\t\t\tvar value = /** @type {V} */ (props[key]);\n\t\t\tif (value === undefined) return get_fallback();\n\t\t\tfallback_dirty = true;\n\t\t\treturn value;\n\t\t};\n\t} else {\n\t\tgetter = () => {\n\t\t\tvar value = /** @type {V} */ (props[key]);\n\n\t\t\tif (value !== undefined) {\n\t\t\t\t// in legacy mode, we don't revert to the fallback value\n\t\t\t\t// if the prop goes from defined to undefined. The easiest\n\t\t\t\t// way to model this is to make the fallback undefined\n\t\t\t\t// as soon as the prop has a value\n\t\t\t\tfallback_value = /** @type {V} */ (undefined);\n\t\t\t}\n\n\t\t\treturn value === undefined ? fallback_value : value;\n\t\t};\n\t}\n\n\t// prop is never written to — we only need a getter\n\tif (runes && (flags & PROPS_IS_UPDATED) === 0) {\n\t\treturn getter;\n\t}\n\n\t// prop is written to, but the parent component had `bind:foo` which\n\t// means we can just call `$$props.foo = value` directly\n\tif (setter) {\n\t\tvar legacy_parent = props.$$legacy;\n\t\treturn /** @type {() => V} */ (\n\t\t\tfunction (/** @type {V} */ value, /** @type {boolean} */ mutation) {\n\t\t\t\tif (arguments.length > 0) {\n\t\t\t\t\t// We don't want to notify if the value was mutated and the parent is in runes mode.\n\t\t\t\t\t// In that case the state proxy (if it exists) should take care of the notification.\n\t\t\t\t\t// If the parent is not in runes mode, we need to notify on mutation, too, that the prop\n\t\t\t\t\t// has changed because the parent will not be able to detect the change otherwise.\n\t\t\t\t\tif (!runes || !mutation || legacy_parent || is_store_sub) {\n\t\t\t\t\t\t/** @type {Function} */ (setter)(mutation ? getter() : value);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\n\t\t\t\treturn getter();\n\t\t\t}\n\t\t);\n\t}\n\n\t// Either prop is written to, but there's no binding, which means we\n\t// create a derived that we can write to locally.\n\t// Or we are in legacy mode where we always create a derived to replicate that\n\t// Svelte 4 did not trigger updates when a primitive value was updated to the same value.\n\tvar overridden = false;\n\n\tvar d = ((flags & PROPS_IS_IMMUTABLE) !== 0 ? derived : derived_safe_equal)(() => {\n\t\toverridden = false;\n\t\treturn getter();\n\t});\n\n\tif (DEV) {\n\t\td.label = key;\n\t}\n\n\t// Capture the initial value if it's bindable\n\tif (bindable) get(d);\n\n\tvar parent_effect = /** @type {Effect} */ (active_effect);\n\n\treturn /** @type {() => V} */ (\n\t\tfunction (/** @type {any} */ value, /** @type {boolean} */ mutation) {\n\t\t\tif (arguments.length > 0) {\n\t\t\t\tconst new_value = mutation ? get(d) : runes && bindable ? proxy(value) : value;\n\n\t\t\t\tset(d, new_value);\n\t\t\t\toverridden = true;\n\n\t\t\t\tif (fallback_value !== undefined) {\n\t\t\t\t\tfallback_value = new_value;\n\t\t\t\t}\n\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\t// special case — avoid recalculating the derived if we're in a\n\t\t\t// teardown function and the prop was overridden locally, or the\n\t\t\t// component was already destroyed (this latter part is necessary\n\t\t\t// because `bind:this` can read props after the component has\n\t\t\t// been destroyed. TODO simplify `bind:this`\n\t\t\tif ((is_destroying_effect && overridden) || (parent_effect.f & DESTROYED) !== 0) {\n\t\t\t\treturn d.v;\n\t\t\t}\n\n\t\t\treturn get(d);\n\t\t}\n\t);\n}\n","/** @import { ComponentContext, ComponentContextLegacy } from '#client' */\n/** @import { EventDispatcher } from './index.js' */\n/** @import { NotFunction } from './internal/types.js' */\nimport { active_reaction, untrack } from './internal/client/runtime.js';\nimport { is_array } from './internal/shared/utils.js';\nimport { user_effect } from './internal/client/index.js';\nimport * as e from './internal/client/errors.js';\nimport { legacy_mode_flag } from './internal/flags/index.js';\nimport { component_context } from './internal/client/context.js';\nimport { DEV } from 'esm-env';\n\nif (DEV) {\n\t/**\n\t * @param {string} rune\n\t */\n\tfunction throw_rune_error(rune) {\n\t\tif (!(rune in globalThis)) {\n\t\t\t// TODO if people start adjusting the \"this can contain runes\" config through v-p-s more, adjust this message\n\t\t\t/** @type {any} */\n\t\t\tlet value; // let's hope noone modifies this global, but belts and braces\n\t\t\tObject.defineProperty(globalThis, rune, {\n\t\t\t\tconfigurable: true,\n\t\t\t\t// eslint-disable-next-line getter-return\n\t\t\t\tget: () => {\n\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\n\t\t\t\t\te.rune_outside_svelte(rune);\n\t\t\t\t},\n\t\t\t\tset: (v) => {\n\t\t\t\t\tvalue = v;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tthrow_rune_error('$state');\n\tthrow_rune_error('$effect');\n\tthrow_rune_error('$derived');\n\tthrow_rune_error('$inspect');\n\tthrow_rune_error('$props');\n\tthrow_rune_error('$bindable');\n}\n\n/**\n * Returns an [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) that aborts when the current [derived](https://svelte.dev/docs/svelte/$derived) or [effect](https://svelte.dev/docs/svelte/$effect) re-runs or is destroyed.\n *\n * Must be called while a derived or effect is running.\n *\n * ```svelte\n * <script>\n * \timport { getAbortSignal } from 'svelte';\n *\n * \tlet { id } = $props();\n *\n * \tasync function getData(id) {\n * \t\tconst response = await fetch(`/items/${id}`, {\n * \t\t\tsignal: getAbortSignal()\n * \t\t});\n *\n * \t\treturn await response.json();\n * \t}\n *\n * \tconst data = $derived(await getData(id));\n * </script>\n * ```\n */\nexport function getAbortSignal() {\n\tif (active_reaction === null) {\n\t\te.get_abort_signal_outside_reaction();\n\t}\n\n\treturn (active_reaction.ac ??= new AbortController()).signal;\n}\n\n/**\n * `onMount`, like [`$effect`](https://svelte.dev/docs/svelte/$effect), schedules a function to run as soon as the component has been mounted to the DOM.\n * Unlike `$effect`, the provided function only runs once.\n *\n * It must be called during the component's initialisation (but doesn't need to live _inside_ the component;\n * it can be called from an external module). If a function is returned _synchronously_ from `onMount`,\n * it will be called when the component is unmounted.\n *\n * `onMount` functions do not run during [server-side rendering](https://svelte.dev/docs/svelte/svelte-server#render).\n *\n * @template T\n * @param {() => NotFunction<T> | Promise<NotFunction<T>> | (() => any)} fn\n * @returns {void}\n */\nexport function onMount(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('onMount');\n\t}\n\n\tif (legacy_mode_flag && component_context.l !== null) {\n\t\tinit_update_callbacks(component_context).m.push(fn);\n\t} else {\n\t\tuser_effect(() => {\n\t\t\tconst cleanup = untrack(fn);\n\t\t\tif (typeof cleanup === 'function') return /** @type {() => void} */ (cleanup);\n\t\t});\n\t}\n}\n\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * @param {() => any} fn\n * @returns {void}\n */\nexport function onDestroy(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('onDestroy');\n\t}\n\n\tonMount(() => () => untrack(fn));\n}\n\n/**\n * @template [T=any]\n * @param {string} type\n * @param {T} [detail]\n * @param {any}params_0\n * @returns {CustomEvent<T>}\n */\nfunction create_custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n\treturn new CustomEvent(type, { detail, bubbles, cancelable });\n}\n\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](https://svelte.dev/docs/svelte/legacy-on#Component-events).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * The event dispatcher can be typed to narrow the allowed event names and the type of the `detail` argument:\n * ```ts\n * const dispatch = createEventDispatcher<{\n * loaded: null; // does not take a detail argument\n * change: string; // takes a detail argument of type string, which is required\n * optional: number | null; // takes an optional detail argument of type number\n * }>();\n * ```\n *\n * @deprecated Use callback props and/or the `$host()` rune instead — see [migration guide](https://svelte.dev/docs/svelte/v5-migration-guide#Event-changes-Component-events)\n * @template {Record<string, any>} [EventMap = any]\n * @returns {EventDispatcher<EventMap>}\n */\nexport function createEventDispatcher() {\n\tconst active_component_context = component_context;\n\tif (active_component_context === null) {\n\t\te.lifecycle_outside_component('createEventDispatcher');\n\t}\n\n\t/**\n\t * @param [detail]\n\t * @param [options]\n\t */\n\treturn (type, detail, options) => {\n\t\tconst events = /** @type {Record<string, Function | Function[]>} */ (\n\t\t\tactive_component_context.s.$$events\n\t\t)?.[/** @type {string} */ (type)];\n\n\t\tif (events) {\n\t\t\tconst callbacks = is_array(events) ? events.slice() : [events];\n\t\t\t// TODO are there situations where events could be dispatched\n\t\t\t// in a server (non-DOM) environment?\n\t\t\tconst event = create_custom_event(/** @type {string} */ (type), detail, options);\n\t\t\tfor (const fn of callbacks) {\n\t\t\t\tfn.call(active_component_context.x, event);\n\t\t\t}\n\t\t\treturn !event.defaultPrevented;\n\t\t}\n\n\t\treturn true;\n\t};\n}\n\n// TODO mark beforeUpdate and afterUpdate as deprecated in Svelte 6\n\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`.\n *\n * In runes mode use `$effect.pre` instead.\n *\n * @deprecated Use [`$effect.pre`](https://svelte.dev/docs/svelte/$effect#$effect.pre) instead\n * @param {() => void} fn\n * @returns {void}\n */\nexport function beforeUpdate(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('beforeUpdate');\n\t}\n\n\tif (component_context.l === null) {\n\t\te.lifecycle_legacy_only('beforeUpdate');\n\t}\n\n\tinit_update_callbacks(component_context).b.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`.\n *\n * In runes mode use `$effect` instead.\n *\n * @deprecated Use [`$effect`](https://svelte.dev/docs/svelte/$effect) instead\n * @param {() => void} fn\n * @returns {void}\n */\nexport function afterUpdate(fn) {\n\tif (component_context === null) {\n\t\te.lifecycle_outside_component('afterUpdate');\n\t}\n\n\tif (component_context.l === null) {\n\t\te.lifecycle_legacy_only('afterUpdate');\n\t}\n\n\tinit_update_callbacks(component_context).a.push(fn);\n}\n\n/**\n * Legacy-mode: Init callbacks object for onMount/beforeUpdate/afterUpdate\n * @param {ComponentContext} context\n */\nfunction init_update_callbacks(context) {\n\tvar l = /** @type {ComponentContextLegacy} */ (context).l;\n\treturn (l.u ??= { a: [], b: [], m: [] });\n}\n\nexport { flushSync, fork } from './internal/client/reactivity/batch.js';\nexport {\n\tcreateContext,\n\tgetContext,\n\tgetAllContexts,\n\thasContext,\n\tsetContext\n} from './internal/client/context.js';\nexport { hydratable } from './internal/client/hydratable.js';\nexport { hydrate, mount, unmount } from './internal/client/render.js';\nexport { tick, untrack, settled } from './internal/client/runtime.js';\nexport { createRawSnippet } from './internal/client/dom/blocks/snippet.js';\n","// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n * @type {string}\n */\nexport const VERSION = '5.49.1';\nexport const PUBLIC_VERSION = '5';\n","import { PUBLIC_VERSION } from '../version.js';\n\nif (typeof window !== 'undefined') {\n\t// @ts-expect-error\n\t((window.__svelte ??= {}).v ??= new Set()).add(PUBLIC_VERSION);\n}\n","// =============================================================================\n// Typed EventEmitter\n// Framework-agnostic event emitter that works in browser and Node.js\n// =============================================================================\n\nimport type { Logger } from './logger.js';\n\n/**\n * Generic event map type - keys are event names, values are listener signatures\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EventMap = Record<string, (...args: any[]) => void>;\n\n/**\n * Simple typed EventEmitter implementation.\n * Works in browser and Node.js environments without dependencies.\n */\nexport class EventEmitter<Events extends EventMap> {\n private listeners = new Map<keyof Events, Set<Events[keyof Events]>>();\n\n /**\n * Logger for reporting errors in event listeners.\n * Subclasses should set this to their logger instance.\n * @internal\n */\n protected _emitterLogger?: Logger;\n\n /**\n * Register an event listener.\n * @returns Unsubscribe function\n */\n on<K extends keyof Events>(event: K, listener: Events[K]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n\n return () => this.off(event, listener);\n }\n\n /**\n * Remove an event listener.\n */\n off<K extends keyof Events>(event: K, listener: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n /**\n * Register a one-time event listener.\n * @returns Unsubscribe function\n */\n once<K extends keyof Events>(event: K, listener: Events[K]): () => void {\n const wrapper = ((...args: Parameters<Events[K]>) => {\n this.off(event, wrapper as Events[K]);\n (listener as (...args: Parameters<Events[K]>) => void)(...args);\n }) as Events[K];\n\n return this.on(event, wrapper);\n }\n\n /**\n * Emit an event to all registered listeners.\n */\n protected emit<K extends keyof Events>(\n event: K,\n ...args: Parameters<Events[K]>\n ): void {\n const set = this.listeners.get(event);\n if (set) {\n // Copy to array to allow listeners to unsubscribe during emit\n for (const listener of Array.from(set)) {\n try {\n (listener as (...args: Parameters<Events[K]>) => void)(...args);\n } catch (error) {\n (this._emitterLogger ?? console).error(`Error in event listener for \"${String(event)}\":`, error);\n }\n }\n }\n }\n\n /**\n * Remove all listeners for a specific event, or all listeners if no event specified.\n */\n removeAllListeners<K extends keyof Events>(event?: K): void {\n if (event !== undefined) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * Get the number of listeners for a specific event.\n */\n listenerCount<K extends keyof Events>(event: K): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n\n","\nimport type { AuthProvider, AuthUser } from './types.js';\nimport type { Logger } from './logger.js';\n\nconst REFRESH_BUFFER_MS = 15 * 60 * 1000; // Refresh 15 minutes before expiry\n\nconst DEFAULT_STORAGE_PREFIX = 'rool_';\n\nexport interface BrowserAuthConfig {\n /** Auth service URL (e.g. https://api.dev.rool.dev/auth) */\n authUrl: string;\n logger: Logger;\n onAuthStateChanged: (authenticated: boolean) => void;\n}\n\nexport class BrowserAuthProvider implements AuthProvider {\n private config: BrowserAuthConfig;\n private logger: Logger;\n private refreshPromise: Promise<boolean> | null = null;\n private refreshTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private boundVisibilityHandler: (() => void) | null = null;\n\n /**\n * Get a short hash of the auth URL for scoping storage by endpoint.\n */\n private get endpointHash(): string {\n const url = this.authBaseUrl;\n // Simple djb2 hash\n let hash = 5381;\n for (let i = 0; i < url.length; i++) {\n hash = ((hash << 5) + hash) ^ url.charCodeAt(i);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n }\n\n /**\n * Get the storage prefix, incorporating endpoint hash.\n */\n private get storagePrefix(): string {\n return `${DEFAULT_STORAGE_PREFIX}${this.endpointHash}_`;\n }\n\n private get storageKeys() {\n const prefix = this.storagePrefix;\n return {\n access: `${prefix}access_token`,\n refresh: `${prefix}refresh_token`,\n rool: `${prefix}rool_token`,\n expiresAt: `${prefix}token_expires_at`,\n state: `${prefix}auth_state`,\n } as const;\n }\n\n /** Auth URL without trailing slash */\n private get authBaseUrl(): string {\n return this.config.authUrl.replace(/\\/+$/, '');\n }\n\n constructor(config: BrowserAuthConfig) {\n this.config = config;\n this.logger = config.logger;\n }\n\n /**\n * Initialize auth manager - should be called on app startup.\n * Processes any auth callback in the URL and sets up auto-refresh.\n */\n initialize(): boolean {\n const wasCallback = this.processCallback();\n this.scheduleTokenRefresh();\n this.listenForVisibility();\n return wasCallback;\n }\n\n /**\n * Check if user is currently authenticated (validates token is usable).\n */\n async isAuthenticated(): Promise<boolean> {\n const tokens = await this.getTokens();\n return tokens !== undefined;\n }\n\n /**\n * Get current access token and rool token, refreshing if expired.\n * Returns undefined if not authenticated.\n */\n async getTokens(): Promise<{ accessToken: string; roolToken: string } | undefined> {\n const accessToken = this.readAccessToken();\n if (!accessToken) return undefined;\n\n // Token expired or about to expire - try refresh\n const expiresAt = this.readExpiresAt();\n if (expiresAt && Date.now() >= expiresAt - REFRESH_BUFFER_MS) {\n const refreshed = await this.tryRefreshToken();\n if (!refreshed) return undefined;\n const refreshedToken = this.readAccessToken();\n if (!refreshedToken) return undefined;\n return { accessToken: refreshedToken, roolToken: this.readRoolToken() };\n }\n\n return { accessToken, roolToken: this.readRoolToken() };\n }\n\n /**\n * Get auth identity decoded from JWT token.\n */\n getAuthUser(): AuthUser {\n const accessToken = this.readAccessToken();\n if (!accessToken) return { email: null, name: null };\n return this.decodeAuthUser(accessToken);\n }\n\n /**\n * Initiate login by redirecting to auth page.\n * @param appName - The name of the application requesting login (displayed on auth page)\n */\n login(appName: string): void {\n const loginUrl = new URL(`${this.authBaseUrl}/`);\n const redirectTarget = window.location.origin + window.location.pathname + window.location.search;\n loginUrl.searchParams.set('redirect_uri', redirectTarget);\n loginUrl.searchParams.set('app_name', appName);\n\n const state = this.generateState();\n this.storeState(state);\n loginUrl.searchParams.set('state', state);\n\n window.location.href = loginUrl.toString();\n }\n\n /**\n * Logout - clear all tokens and state.\n */\n logout(): void {\n this.clearTokens();\n this.clearState();\n this.cancelScheduledRefresh();\n this.config.onAuthStateChanged(false);\n }\n\n /**\n * Process auth callback from URL fragment.\n * Should be called on page load.\n * @returns true if callback was processed\n */\n processCallback(): boolean {\n const hash = window.location.hash ?? '';\n const trimmed = hash.startsWith('#') ? hash.slice(1) : hash;\n if (!trimmed) return false;\n\n const params = new URLSearchParams(trimmed);\n const idToken = params.get('id_token');\n if (!idToken) return false;\n\n const refreshToken = params.get('refresh_token');\n const roolToken = params.get('rool_token');\n const expiresIn = params.get('expires_in');\n const expiresAt = expiresIn ? Date.now() + Number(expiresIn) * 1000 : NaN;\n const incomingState = params.get('state');\n const storedState = this.readState();\n\n // Validate state - if we stored one, require it back\n if (storedState && incomingState !== storedState) {\n this.logger.error('[RoolClient] Auth state mismatch. Token fragment ignored.');\n return false;\n }\n\n if (!Number.isFinite(expiresAt)) {\n this.logger.error('[RoolClient] Auth response missing expires_in. Token ignored.');\n return false;\n }\n\n // Clear state and store tokens\n this.clearState();\n this.writeTokens(idToken, refreshToken, expiresAt);\n this.writeRoolToken(roolToken);\n\n // Clean URL\n const cleanUrl = window.location.origin + window.location.pathname + window.location.search;\n window.history.replaceState({}, document.title, cleanUrl);\n\n // Schedule refresh and notify\n this.scheduleTokenRefresh();\n this.config.onAuthStateChanged(true);\n\n return true;\n }\n\n /**\n * Destroy auth manager - clear refresh timers.\n */\n destroy(): void {\n this.cancelScheduledRefresh();\n if (this.boundVisibilityHandler) {\n document.removeEventListener('visibilitychange', this.boundVisibilityHandler);\n this.boundVisibilityHandler = null;\n }\n }\n\n /**\n * Get cached storage data from localStorage.\n */\n getStorage(): Record<string, unknown> | null {\n try {\n const key = `${this.storagePrefix}user_storage`;\n const data = localStorage.getItem(key);\n return data ? JSON.parse(data) : null;\n } catch {\n return null;\n }\n }\n\n /**\n * Set cached storage data to localStorage.\n */\n setStorage(data: Record<string, unknown>): void {\n try {\n const key = `${this.storagePrefix}user_storage`;\n localStorage.setItem(key, JSON.stringify(data));\n } catch {\n // Ignore localStorage errors\n }\n }\n\n // ===========================================================================\n // Private methods\n // ===========================================================================\n\n private async tryRefreshToken(): Promise<boolean> {\n // Deduplicate concurrent refresh attempts\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n const refreshToken = localStorage.getItem(this.storageKeys.refresh);\n if (!refreshToken) return false;\n const roolToken = localStorage.getItem(this.storageKeys.rool);\n\n this.refreshPromise = (async () => {\n let response: Response;\n try {\n response = await fetch(`${this.authBaseUrl}/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n refresh_token: refreshToken,\n rool_token: roolToken,\n }),\n });\n } catch (error) {\n // Network error - don't clear tokens, might work next time\n this.logger.warn('[RoolClient] Token refresh network error:', error);\n return false;\n }\n\n // 400/401 = refresh token is invalid, clear everything\n if (response.status === 400 || response.status === 401) {\n this.logger.warn('[RoolClient] Refresh token invalid, clearing credentials');\n this.clearTokens();\n this.config.onAuthStateChanged(false);\n return false;\n }\n\n // Other HTTP errors - don't clear tokens, might be transient\n if (!response.ok) {\n this.logger.warn(`[RoolClient] Token refresh failed: ${response.status} ${response.statusText}`);\n return false;\n }\n\n // Success - parse and store new tokens\n try {\n const data = await response.json();\n const accessToken: string | null = data.id_token ?? null;\n const nextRefreshToken: string | null = data.refresh_token ?? refreshToken;\n const expiresAt = data.expires_in ? Date.now() + data.expires_in * 1000 : NaN;\n\n if (!accessToken || !Number.isFinite(expiresAt)) {\n this.logger.error('[RoolClient] Refresh response missing id_token or expires_in');\n return false;\n }\n\n this.writeTokens(accessToken, nextRefreshToken, expiresAt);\n this.writeRoolToken(data.rool_token ?? null);\n this.scheduleTokenRefresh();\n return true;\n } catch (error) {\n this.logger.error('[RoolClient] Failed to parse refresh response:', error);\n return false;\n }\n })().finally(() => {\n this.refreshPromise = null;\n });\n\n return this.refreshPromise;\n }\n\n private scheduleTokenRefresh(): void {\n this.cancelScheduledRefresh();\n\n const expiresAt = this.readExpiresAt();\n if (!expiresAt) return;\n\n const refreshAt = expiresAt - REFRESH_BUFFER_MS;\n const delay = refreshAt - Date.now();\n\n if (delay <= 0) {\n // Already needs refresh\n void this.tryRefreshToken();\n } else {\n this.refreshTimeoutId = setTimeout(() => {\n void this.tryRefreshToken();\n }, delay);\n }\n }\n\n private listenForVisibility(): void {\n if (typeof document === 'undefined') return;\n if (this.boundVisibilityHandler) return;\n\n this.boundVisibilityHandler = () => {\n if (document.visibilityState === 'visible') {\n this.scheduleTokenRefresh();\n }\n };\n document.addEventListener('visibilitychange', this.boundVisibilityHandler);\n }\n\n private cancelScheduledRefresh(): void {\n if (this.refreshTimeoutId !== null) {\n clearTimeout(this.refreshTimeoutId);\n this.refreshTimeoutId = null;\n }\n }\n\n private readAccessToken(): string | null {\n return localStorage.getItem(this.storageKeys.access);\n }\n\n private readRoolToken(): string {\n return localStorage.getItem(this.storageKeys.rool) ?? '';\n }\n\n private readExpiresAt(): number | null {\n const raw = localStorage.getItem(this.storageKeys.expiresAt);\n if (!raw) return null;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n private writeTokens(\n accessToken: string | null,\n refreshToken: string | null,\n expiresAt: number | null\n ): void {\n if (accessToken) {\n localStorage.setItem(this.storageKeys.access, accessToken);\n } else {\n localStorage.removeItem(this.storageKeys.access);\n }\n\n if (refreshToken) {\n localStorage.setItem(this.storageKeys.refresh, refreshToken);\n } else {\n localStorage.removeItem(this.storageKeys.refresh);\n }\n\n if (expiresAt !== null && Number.isFinite(expiresAt)) {\n localStorage.setItem(this.storageKeys.expiresAt, Math.floor(expiresAt).toString());\n } else {\n localStorage.removeItem(this.storageKeys.expiresAt);\n }\n }\n\n private writeRoolToken(token: string | null): void {\n if (token) {\n localStorage.setItem(this.storageKeys.rool, token);\n } else {\n localStorage.removeItem(this.storageKeys.rool);\n }\n }\n\n private clearTokens(): void {\n this.writeTokens(null, null, null);\n this.writeRoolToken(null);\n }\n\n private storeState(value: string): void {\n try {\n sessionStorage.setItem(this.storageKeys.state, value);\n } catch {\n // Ignore storage restrictions\n }\n }\n\n private readState(): string | null {\n try {\n return sessionStorage.getItem(this.storageKeys.state);\n } catch {\n return null;\n }\n }\n\n private clearState(): void {\n try {\n sessionStorage.removeItem(this.storageKeys.state);\n } catch {\n // Ignore storage restrictions\n }\n }\n\n private generateState(): string {\n try {\n const buffer = new Uint8Array(16);\n window.crypto.getRandomValues(buffer);\n return Array.from(buffer, (value) => value.toString(16).padStart(2, '0')).join('');\n } catch {\n return Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2);\n }\n }\n\n private decodeAuthUser(accessToken: string): AuthUser {\n try {\n const payload = JSON.parse(atob(accessToken.split('.')[1]));\n return {\n email: payload.email || null,\n name: payload.name || null,\n };\n } catch (error) {\n this.logger.error('[RoolClient] Failed to decode token:', error);\n return { email: null, name: null };\n }\n }\n}\n","// =============================================================================\n// Auth Manager\n// Handles authentication via configurable AuthProvider\n// =============================================================================\n\nimport type { AuthUser, AuthProvider } from './types.js';\nimport { BrowserAuthProvider } from './auth-browser.js';\nimport type { Logger } from './logger.js';\n\nexport interface AuthManagerConfig {\n authUrl: string;\n logger: Logger;\n onAuthStateChanged?: (authenticated: boolean) => void;\n /** External auth provider - when set, delegates all auth to this provider */\n authProvider?: AuthProvider;\n}\n\nexport class AuthManager {\n private provider: AuthProvider;\n\n constructor(config: AuthManagerConfig) {\n if (config.authProvider) {\n this.provider = config.authProvider;\n // Inject auth URL if the provider supports it (e.g. NodeAuthProvider)\n if ('setAuthUrl' in this.provider && typeof (this.provider as any).setAuthUrl === 'function') {\n (this.provider as any).setAuthUrl(config.authUrl);\n }\n // Inject logger if the provider supports it\n if ('setLogger' in this.provider && typeof (this.provider as any).setLogger === 'function') {\n (this.provider as any).setLogger(config.logger);\n }\n } else {\n // Default to BrowserAuthProvider if no external provider specified\n // This preserves existing behavior for browser usage\n this.provider = new BrowserAuthProvider({\n authUrl: config.authUrl,\n logger: config.logger,\n onAuthStateChanged: (authenticated) => {\n config.onAuthStateChanged?.(authenticated);\n },\n });\n }\n }\n\n /**\n * Initialize auth manager - should be called on app startup.\n */\n initialize(): boolean {\n return this.provider.initialize?.() ?? false;\n }\n\n /**\n * Check if user is currently authenticated (validates token is usable).\n */\n async isAuthenticated(): Promise<boolean> {\n return this.provider.isAuthenticated();\n }\n\n /**\n * Get current access token and rool token.\n * Returns undefined if not authenticated.\n */\n async getTokens(): Promise<{ accessToken: string; roolToken: string } | undefined> {\n return this.provider.getTokens();\n }\n\n /**\n * Get auth identity from current session (decoded from token).\n */\n getAuthUser(): AuthUser {\n return this.provider.getAuthUser();\n }\n\n /**\n * Initiate login.\n * @param appName - The name of the application requesting login (displayed on auth page)\n */\n login(appName: string): Promise<void> | void {\n return this.provider.login(appName);\n }\n\n /**\n * Logout - clear all tokens and state.\n */\n logout(): void {\n this.provider.logout();\n }\n\n /**\n * Process auth callback from URL fragment.\n * Should be called on page load.\n * @returns true if callback was processed\n */\n processCallback(): boolean {\n // Only BrowserAuthProvider knows how to process URL callbacks\n if (this.provider instanceof BrowserAuthProvider) {\n return this.provider.processCallback();\n }\n return false;\n }\n\n /**\n * Destroy auth manager - cleanup resources.\n */\n destroy(): void {\n this.provider.destroy?.();\n }\n\n /**\n * Get cached storage data.\n */\n getStorage(): Record<string, unknown> | null {\n return this.provider.getStorage();\n }\n\n /**\n * Set cached storage data.\n */\n setStorage(data: Record<string, unknown>): void {\n this.provider.setStorage(data);\n }\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n ,\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data.length) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush();\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function () { w.postMessage([]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n */\n Deflate.prototype.flush = function () {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n */\n Gzip.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n // process concatenated GZIP\n if (this.s.f && !this.s.l && !final) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n */\n Zlib.prototype.flush = function () {\n Deflate.prototype.flush.call(this);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (val instanceof u8)\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (data, final) {\n this.ondata(null, data, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (data, final) {\n try {\n this.i.push(data, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (data, final) {\n if (this.i.terminate)\n data = slc(data, 0);\n this.i.push(data, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var _a;\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n if (sc_1 == 4294967295) {\n _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n }\n else if (dd)\n sc_1 = -1;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295 || c == 65535;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","// =============================================================================\n// GraphQL Client\n// Handles all GraphQL queries and mutations for the Rool API\n// =============================================================================\n\nimport { gzipSync } from 'fflate';\nimport type {\n PromptOptions,\n FindObjectsOptions,\n RoolSpaceInfo,\n SpaceMember,\n CurrentUser,\n UserResult,\n RoolObject,\n RoolObjectStat,\n LinkAccess,\n CollectionDef,\n FieldDef,\n ChannelInfo,\n Channel,\n SpaceSchema,\n} from './types.js';\nimport type { AuthManager } from './auth.js';\n\nconst COMPRESSION_THRESHOLD = 2048; // Compress payloads > 2KB\n\n/** Get the client's IANA timezone (e.g., \"America/New_York\") */\nfunction getTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n}\n\nexport interface GraphQLClientConfig {\n graphqlUrl: string;\n authManager: AuthManager;\n}\n\n/** Result from the openChannel GraphQL query */\nexport interface OpenChannelResult {\n name: string;\n role: string;\n userId: string;\n linkAccess: LinkAccess;\n objectIds: string[];\n objectStats: Record<string, RoolObjectStat>;\n schema: SpaceSchema;\n meta: Record<string, unknown>;\n channel: Channel | undefined;\n}\n\ninterface GraphQLResponse<T> {\n data?: T;\n errors?: Array<{ message: string; extensions?: Record<string, unknown> }>;\n}\n\nexport class GraphQLClient {\n private config: GraphQLClientConfig;\n\n constructor(config: GraphQLClientConfig) {\n this.config = config;\n }\n\n private get graphqlUrl(): string {\n return this.config.graphqlUrl;\n }\n\n async listSpaces(): Promise<RoolSpaceInfo[]> {\n const query = `\n query ListSpaces {\n listSpaces {\n id\n name\n role\n ownerId\n size\n createdAt\n updatedAt\n linkAccess\n }\n }\n `;\n const response = await this.request<{ listSpaces: RoolSpaceInfo[] }>(query);\n return response.listSpaces;\n }\n\n async openSpace(spaceId: string): Promise<{ name: string; role: string; linkAccess: LinkAccess; channels: ChannelInfo[] }> {\n const query = `\n query OpenSpace($id: String!) {\n openSpace(id: $id) {\n name\n role\n linkAccess\n channels {\n id\n name\n createdAt\n createdBy\n createdByName\n interactionCount\n }\n }\n }\n `;\n const response = await this.request<{ openSpace: { name: string; role: string; linkAccess: LinkAccess; channels: ChannelInfo[] } }>(query, { id: spaceId });\n return response.openSpace;\n }\n\n // ===========================================================================\n // Space Lifecycle Operations (called from RoolClient)\n // ===========================================================================\n\n async createSpace(name: string): Promise<{ spaceId: string }> {\n const mutation = `\n mutation CreateSpace($name: String!) {\n createSpace(name: $name) {\n spaceId\n }\n }\n `;\n const response = await this.request<{ createSpace: { spaceId: string } }>(mutation, {\n name,\n });\n return { spaceId: response.createSpace.spaceId };\n }\n\n /** Response from openChannel — top-level fields, channel data, object stats */\n async openChannel(spaceId: string, channelId: string): Promise<OpenChannelResult> {\n const query = `\n query OpenChannel($spaceId: String!, $channelId: String!) {\n openChannel(spaceId: $spaceId, channelId: $channelId) {\n name\n role\n userId\n linkAccess\n objectIds\n objectStats\n schema\n meta\n channel\n }\n }\n `;\n const response = await this.request<{ openChannel: {\n name: string; role: string; userId: string; linkAccess: LinkAccess;\n objectIds: string[];\n objectStats: Record<string, RoolObjectStat> | null;\n schema: SpaceSchema | null;\n meta: Record<string, unknown> | null;\n channel: Channel | null;\n } }>(query, { spaceId, channelId });\n\n const r = response.openChannel;\n return {\n name: r.name,\n role: r.role,\n userId: r.userId,\n linkAccess: r.linkAccess,\n objectIds: r.objectIds,\n objectStats: r.objectStats ?? {},\n schema: r.schema ?? {},\n meta: r.meta ?? {},\n channel: r.channel ?? undefined,\n };\n }\n\n async deleteSpace(spaceId: string): Promise<void> {\n const mutation = `\n mutation DeleteSpace($id: String!) {\n deleteSpace(id: $id)\n }\n `;\n await this.request(mutation, {\n id: spaceId,\n });\n }\n\n async renameSpace(spaceId: string, name: string): Promise<void> {\n const mutation = `\n mutation RenameSpace($id: String!, $name: String!) {\n renameSpace(id: $id, name: $name)\n }\n `;\n await this.request(mutation, {\n id: spaceId,\n name,\n });\n }\n\n // ===========================================================================\n // Space Content Operations (called from RoolChannel)\n // These require channelId for AI context\n // ===========================================================================\n\n async setSpaceMeta(spaceId: string, meta: Record<string, unknown>, channelId: string): Promise<void> {\n const mutation = `\n mutation SetSpaceMeta($id: String!, $meta: String!, $channelId: String!) {\n setSpaceMeta(id: $id, meta: $meta, channelId: $channelId)\n }\n `;\n await this.request(mutation, {\n id: spaceId,\n meta: JSON.stringify(meta),\n channelId,\n });\n }\n\n async deleteObjects(spaceId: string, ids: string[], channelId: string): Promise<void> {\n const mutation = `\n mutation DeleteObjects($spaceId: String!, $ids: [String!]!, $channelId: String!) {\n deleteObjects(spaceId: $spaceId, ids: $ids, channelId: $channelId)\n }\n `;\n await this.request(mutation, {\n spaceId,\n ids,\n channelId,\n });\n }\n\n async deleteChannel(spaceId: string, channelId: string): Promise<void> {\n const mutation = `\n mutation DeleteChannel($spaceId: String!, $channelId: String!) {\n deleteChannel(spaceId: $spaceId, channelId: $channelId)\n }\n `;\n await this.request(mutation, {\n spaceId,\n channelId,\n });\n }\n\n async renameChannel(spaceId: string, channelId: string, name: string): Promise<void> {\n const mutation = `\n mutation UpdateChannel($spaceId: String!, $channelId: String!, $name: String!) {\n updateChannel(spaceId: $spaceId, channelId: $channelId, name: $name)\n }\n `;\n await this.request(mutation, {\n spaceId,\n channelId,\n name,\n });\n }\n\n async setSystemInstruction(spaceId: string, channelId: string, instruction: string | null): Promise<void> {\n const mutation = `\n mutation UpdateChannel($spaceId: String!, $channelId: String!, $systemInstruction: String) {\n updateChannel(spaceId: $spaceId, channelId: $channelId, systemInstruction: $systemInstruction)\n }\n `;\n await this.request(mutation, {\n spaceId,\n channelId,\n systemInstruction: instruction,\n });\n }\n\n // ===========================================================================\n // Checkpoint / Undo / Redo Operations\n // ===========================================================================\n\n async checkpoint(\n spaceId: string,\n label: string | undefined,\n channelId: string,\n ): Promise<{ checkpointId: string }> {\n const mutation = `\n mutation Checkpoint($spaceId: String!, $label: String, $channelId: String!) {\n checkpoint(spaceId: $spaceId, label: $label, channelId: $channelId) {\n checkpointId\n }\n }\n `;\n const result = await this.request<{ checkpoint: { checkpointId: string } }>(mutation, {\n spaceId,\n label,\n channelId,\n });\n return result.checkpoint;\n }\n\n async undo(spaceId: string, channelId: string): Promise<{ success: boolean }> {\n const mutation = `\n mutation Undo($spaceId: String!, $channelId: String!) {\n undo(spaceId: $spaceId, channelId: $channelId) {\n success\n }\n }\n `;\n const result = await this.request<{ undo: { success: boolean } }>(mutation, {\n spaceId,\n channelId,\n });\n return result.undo;\n }\n\n async redo(spaceId: string, channelId: string): Promise<{ success: boolean }> {\n const mutation = `\n mutation Redo($spaceId: String!, $channelId: String!) {\n redo(spaceId: $spaceId, channelId: $channelId) {\n success\n }\n }\n `;\n const result = await this.request<{ redo: { success: boolean } }>(mutation, {\n spaceId,\n channelId,\n });\n return result.redo;\n }\n\n async checkpointStatus(\n spaceId: string,\n channelId: string,\n ): Promise<{ canUndo: boolean; canRedo: boolean }> {\n const query = `\n query CheckpointStatus($spaceId: String!, $channelId: String!) {\n checkpointStatus(spaceId: $spaceId, channelId: $channelId) {\n canUndo\n canRedo\n }\n }\n `;\n const result = await this.request<{\n checkpointStatus: { canUndo: boolean; canRedo: boolean }\n }>(query, {\n spaceId,\n channelId,\n });\n return result.checkpointStatus;\n }\n\n async clearCheckpointHistory(spaceId: string, channelId: string): Promise<void> {\n const mutation = `\n mutation ClearCheckpointHistory($spaceId: String!, $channelId: String!) {\n clearCheckpointHistory(spaceId: $spaceId, channelId: $channelId)\n }\n `;\n await this.request(mutation, {\n spaceId,\n channelId,\n });\n }\n\n // ===========================================================================\n // Collection Schema Operations\n // ===========================================================================\n\n async createCollection(\n spaceId: string,\n name: string,\n fields: FieldDef[],\n channelId: string,\n ): Promise<CollectionDef> {\n const mutation = `\n mutation CreateCollection($spaceId: String!, $name: String!, $fields: String!, $channelId: String!) {\n createCollection(spaceId: $spaceId, name: $name, fields: $fields, channelId: $channelId)\n }\n `;\n const result = await this.request<{ createCollection: string }>(mutation, {\n spaceId,\n name,\n fields: JSON.stringify(fields),\n channelId,\n });\n const parsed = JSON.parse(result.createCollection);\n return parsed[name] as CollectionDef;\n }\n\n async alterCollection(\n spaceId: string,\n name: string,\n fields: FieldDef[],\n channelId: string,\n ): Promise<CollectionDef> {\n const mutation = `\n mutation AlterCollection($spaceId: String!, $name: String!, $fields: String!, $channelId: String!) {\n alterCollection(spaceId: $spaceId, name: $name, fields: $fields, channelId: $channelId)\n }\n `;\n const result = await this.request<{ alterCollection: string }>(mutation, {\n spaceId,\n name,\n fields: JSON.stringify(fields),\n channelId,\n });\n const parsed = JSON.parse(result.alterCollection);\n return parsed[name] as CollectionDef;\n }\n\n async dropCollection(\n spaceId: string,\n name: string,\n channelId: string,\n ): Promise<void> {\n const mutation = `\n mutation DropCollection($spaceId: String!, $name: String!, $channelId: String!) {\n dropCollection(spaceId: $spaceId, name: $name, channelId: $channelId)\n }\n `;\n await this.request(mutation, {\n spaceId,\n name,\n channelId,\n });\n }\n\n // ===========================================================================\n // Object Operations\n // ===========================================================================\n\n async createObject(\n spaceId: string,\n data: Record<string, unknown>,\n channelId: string,\n ephemeral?: boolean,\n ): Promise<{ objectId: string; message: string }> {\n const mutation = `\n mutation CreateObject($spaceId: String!, $data: String!, $channelId: String!, $ephemeral: Boolean) {\n createObject(spaceId: $spaceId, data: $data, channelId: $channelId, ephemeral: $ephemeral) {\n objectId\n message\n }\n }\n `;\n const result = await this.request<{ createObject: { objectId: string; message: string } }>(mutation, {\n spaceId,\n data: JSON.stringify(data),\n channelId,\n ephemeral,\n });\n return result.createObject;\n }\n\n async updateObject(\n spaceId: string,\n id: string,\n channelId: string,\n data?: Record<string, unknown>,\n prompt?: string,\n ephemeral?: boolean,\n ): Promise<{ objectId: string; message: string }> {\n const mutation = `\n mutation UpdateObject($spaceId: String!, $id: String!, $data: String, $prompt: String, $channelId: String!, $ephemeral: Boolean) {\n updateObject(spaceId: $spaceId, id: $id, data: $data, prompt: $prompt, channelId: $channelId, ephemeral: $ephemeral) {\n objectId\n message\n }\n }\n `;\n const result = await this.request<{ updateObject: { objectId: string; message: string } }>(mutation, {\n spaceId,\n id,\n data: data ? JSON.stringify(data) : undefined,\n prompt,\n channelId,\n ephemeral,\n });\n return result.updateObject;\n }\n\n async getObject(\n spaceId: string,\n objectId: string,\n ): Promise<RoolObject | undefined> {\n const query = `\n query GetObject($spaceId: String!, $objectId: String!) {\n getObject(spaceId: $spaceId, objectId: $objectId)\n }\n `;\n const result = await this.request<{ getObject: RoolObject | null }>(query, {\n spaceId,\n objectId,\n });\n return result.getObject ?? undefined;\n }\n\n async findObjects(\n spaceId: string,\n options: FindObjectsOptions,\n channelId: string,\n ): Promise<{ objects: RoolObject[]; message: string }> {\n const query = `\n query FindObjects($spaceId: String!, $where: String, $prompt: String, $limit: Int, $objectIds: [String!], $order: String, $channelId: String!, $ephemeral: Boolean) {\n findObjects(spaceId: $spaceId, where: $where, prompt: $prompt, limit: $limit, objectIds: $objectIds, order: $order, channelId: $channelId, ephemeral: $ephemeral) {\n objects\n message\n }\n }\n `;\n const result = await this.request<{\n findObjects: { objects: string; message: string }\n }>(query, {\n spaceId,\n where: options.where ? JSON.stringify(options.where) : undefined,\n prompt: options.prompt,\n limit: options.limit,\n objectIds: options.objectIds ?? [],\n order: options.order,\n channelId,\n ephemeral: options.ephemeral,\n });\n return {\n objects: JSON.parse(result.findObjects.objects),\n message: result.findObjects.message,\n };\n }\n\n // ===========================================================================\n // AI Operations\n // ===========================================================================\n\n async prompt(\n spaceId: string,\n prompt: string,\n channelId: string,\n options: Omit<PromptOptions, 'attachments'> & { attachmentUrls?: string[] } = {}\n ): Promise<{ message: string; modifiedObjectIds: string[] }> {\n const mutation = `\n mutation Prompt($spaceId: String!, $prompt: String!, $objectIds: [String!], $responseSchema: JSON, $channelId: String!, $effort: PromptEffort, $ephemeral: Boolean, $readOnly: Boolean, $attachments: [String!]) {\n prompt(spaceId: $spaceId, prompt: $prompt, objectIds: $objectIds, responseSchema: $responseSchema, channelId: $channelId, effort: $effort, ephemeral: $ephemeral, readOnly: $readOnly, attachments: $attachments) {\n message\n modifiedObjectIds\n }\n }\n `;\n const response = await this.request<{\n prompt: { message: string; modifiedObjectIds: string[] }\n }>(mutation, {\n spaceId,\n prompt,\n objectIds: options.objectIds ?? [],\n responseSchema: options.responseSchema,\n channelId,\n effort: options.effort,\n ephemeral: options.ephemeral,\n readOnly: options.readOnly,\n attachments: options.attachmentUrls,\n });\n return response.prompt;\n }\n\n // ===========================================================================\n // User / Collaboration Operations\n // ===========================================================================\n\n async getAccount(): Promise<CurrentUser> {\n const query = `\n query GetAccount {\n getAccount {\n id\n email\n name\n slug\n plan\n creditsBalance\n totalCreditsUsed\n createdAt\n lastActivity\n processedAt\n storage\n }\n }\n `;\n const response = await this.request<{ getAccount: CurrentUser }>(query);\n return response.getAccount;\n }\n\n async setSlug(slug: string): Promise<void> {\n const mutation = `\n mutation SetSlug($slug: String!) {\n setSlug(slug: $slug)\n }\n `;\n await this.request(mutation, { slug });\n }\n\n async setUserStorage(key: string, value: unknown): Promise<void> {\n const mutation = `\n mutation SetUserStorage($key: String!, $value: JSON) {\n setUserStorage(key: $key, value: $value)\n }\n `;\n await this.request(mutation, { key, value: value ?? null });\n }\n\n async searchUser(email: string): Promise<UserResult | null> {\n const query = `\n query SearchUser($email: String!) {\n searchUser(email: $email) {\n id\n email\n name\n }\n }\n `;\n try {\n const response = await this.request<{ searchUser: UserResult | null }>(query, { email });\n return response.searchUser;\n } catch {\n return null;\n }\n }\n\n async listSpaceUsers(spaceId: string): Promise<SpaceMember[]> {\n const query = `\n query ListSpaceUsers($spaceId: String!) {\n listSpaceUsers(spaceId: $spaceId) {\n id\n email\n role\n }\n }\n `;\n const response = await this.request<{ listSpaceUsers: SpaceMember[] }>(query, { spaceId });\n return response.listSpaceUsers;\n }\n\n async addSpaceUser(spaceId: string, userId: string, role: string): Promise<void> {\n const mutation = `\n mutation AddSpaceUser($spaceId: String!, $userId: String!, $role: String!) {\n addSpaceUser(spaceId: $spaceId, userId: $userId, role: $role)\n }\n `;\n await this.request(mutation, { spaceId, userId, role });\n }\n\n async removeSpaceUser(spaceId: string, userId: string): Promise<void> {\n const mutation = `\n mutation RemoveSpaceUser($spaceId: String!, $userId: String!) {\n removeSpaceUser(spaceId: $spaceId, userId: $userId)\n }\n `;\n await this.request(mutation, { spaceId, userId });\n }\n\n async setLinkAccess(spaceId: string, linkAccess: string): Promise<void> {\n const mutation = `\n mutation SetLinkAccess($spaceId: String!, $linkAccess: String!) {\n setLinkAccess(spaceId: $spaceId, linkAccess: $linkAccess)\n }\n `;\n await this.request(mutation, { spaceId, linkAccess });\n }\n\n // ===========================================================================\n // Generic Query (escape hatch for app-specific queries)\n // ===========================================================================\n\n /**\n * Execute an arbitrary GraphQL query or mutation.\n * Use this for app-specific operations not covered by the typed methods.\n */\n async query<T>(\n query: string,\n variables?: Record<string, unknown>\n ): Promise<T> {\n return this.request<T>(query, variables);\n }\n\n // ===========================================================================\n // Private Methods\n // ===========================================================================\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>\n ): Promise<T> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) {\n throw new Error('Not authenticated');\n }\n\n const body = JSON.stringify({ query, variables });\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${tokens.accessToken}`,\n 'X-Rool-Token': tokens.roolToken,\n };\n\n const timezone = getTimezone();\n if (timezone) {\n headers['X-Timezone'] = timezone;\n }\n\n let fetchBody: BodyInit = body;\n\n // Compress large payloads\n if (body.length > COMPRESSION_THRESHOLD) {\n const gzipped = gzipSync(new TextEncoder().encode(body));\n headers['Content-Encoding'] = 'gzip';\n // Convert to ArrayBuffer for fetch compatibility\n fetchBody = gzipped.buffer.slice(\n gzipped.byteOffset,\n gzipped.byteOffset + gzipped.byteLength\n ) as ArrayBuffer;\n }\n\n const response = await fetch(this.graphqlUrl, {\n method: 'POST',\n headers,\n body: fetchBody,\n });\n\n if (!response.ok) {\n throw new Error(`GraphQL request failed: ${response.status} ${response.statusText}`);\n }\n\n const result: GraphQLResponse<T> = await response.json();\n\n if (result.errors && result.errors.length > 0) {\n const error = result.errors[0];\n const err = new Error(error.message);\n (err as Error & { extensions?: Record<string, unknown> }).extensions = error.extensions;\n throw err;\n }\n\n if (!result.data) {\n throw new Error('GraphQL response missing data');\n }\n\n return result.data;\n }\n}\n","/**\n *\n * utils\n *\n */\n/** @private */\nexport function isObject(val) {\n return typeof val === 'object' && val !== null;\n}\n","/**\n *\n * common\n *\n */\nimport { isObject } from './utils.mjs';\n/**\n * Header key through which the event stream token is transmitted\n * when using the client in \"single connection mode\".\n *\n * Read more: https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md#single-connection-mode\n *\n * @category Common\n */\nexport const TOKEN_HEADER_KEY = 'x-graphql-event-stream-token';\n/**\n * URL query parameter key through which the event stream token is transmitted\n * when using the client in \"single connection mode\".\n *\n * Read more: https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md#single-connection-mode\n *\n * @category Common\n */\nexport const TOKEN_QUERY_KEY = 'token';\n/** @category Common */\nexport function validateStreamEvent(e) {\n e = e;\n if (e !== 'next' && e !== 'complete')\n throw new Error(`Invalid stream event \"${e}\"`);\n return e;\n}\n/** @category Common */\nexport function print(msg) {\n let str = `event: ${msg.event}\\ndata:`;\n if (msg.data) {\n str += ' ';\n str += JSON.stringify(msg.data);\n }\n str += '\\n\\n';\n return str;\n}\n/** @category Common */\nexport function parseStreamData(e, data) {\n if (data) {\n try {\n data = JSON.parse(data);\n }\n catch {\n throw new Error('Invalid stream data');\n }\n }\n if (e === 'next' && !data)\n throw new Error('Stream data must be an object for \"next\" events');\n return (data || null);\n}\n/**\n * Checks whether the provided value is an async iterable.\n *\n * @category Common\n */\nexport function isAsyncIterable(val) {\n return typeof Object(val)[Symbol.asyncIterator] === 'function';\n}\n/**\n * Checks whether the provided value is an async generator.\n *\n * @category Common\n */\nexport function isAsyncGenerator(val) {\n return (isObject(val) &&\n typeof Object(val)[Symbol.asyncIterator] === 'function' &&\n typeof val.return === 'function' &&\n typeof val.throw === 'function' &&\n typeof val.next === 'function');\n}\n","/**\n *\n * parser\n *\n */\nimport { validateStreamEvent, parseStreamData, } from './common.mjs';\nvar ControlChars;\n(function (ControlChars) {\n ControlChars[ControlChars[\"NewLine\"] = 10] = \"NewLine\";\n ControlChars[ControlChars[\"CarriageReturn\"] = 13] = \"CarriageReturn\";\n ControlChars[ControlChars[\"Space\"] = 32] = \"Space\";\n ControlChars[ControlChars[\"Colon\"] = 58] = \"Colon\";\n})(ControlChars || (ControlChars = {}));\n/**\n * HTTP response chunk parser for graphql-sse's event stream messages.\n *\n * Reference: https://github.com/Azure/fetch-event-source/blob/main/src/parse.ts\n *\n * @private\n */\nexport function createParser() {\n let buffer;\n let position; // current read position\n let fieldLength; // length of the `field` portion of the line\n let discardTrailingNewline = false;\n let message = { event: '', data: '' };\n let pending = [];\n const decoder = new TextDecoder();\n return function parse(chunk) {\n if (buffer === undefined) {\n buffer = chunk;\n position = 0;\n fieldLength = -1;\n }\n else {\n const concat = new Uint8Array(buffer.length + chunk.length);\n concat.set(buffer);\n concat.set(chunk, buffer.length);\n buffer = concat;\n }\n const bufLength = buffer.length;\n let lineStart = 0; // index where the current line starts\n while (position < bufLength) {\n if (discardTrailingNewline) {\n if (buffer[position] === ControlChars.NewLine) {\n lineStart = ++position; // skip to next char\n }\n discardTrailingNewline = false;\n }\n // look forward until the end of line\n let lineEnd = -1; // index of the \\r or \\n char\n for (; position < bufLength && lineEnd === -1; ++position) {\n switch (buffer[position]) {\n case ControlChars.Colon:\n if (fieldLength === -1) {\n // first colon in line\n fieldLength = position - lineStart;\n }\n break;\n // \\r case below should fallthrough to \\n:\n case ControlChars.CarriageReturn:\n discardTrailingNewline = true;\n // eslint-disable-next-line no-fallthrough\n case ControlChars.NewLine:\n lineEnd = position;\n break;\n }\n }\n if (lineEnd === -1) {\n // end of the buffer but the line hasn't ended\n break;\n }\n else if (lineStart === lineEnd) {\n // empty line denotes end of incoming message\n if (message.event || message.data) {\n // NOT a server ping (\":\\n\\n\")\n if (!message.event)\n throw new Error('Missing message event');\n const event = validateStreamEvent(message.event);\n const data = parseStreamData(event, message.data);\n pending.push({\n event,\n data,\n });\n message = { event: '', data: '' };\n }\n }\n else if (fieldLength > 0) {\n // end of line indicates message\n const line = buffer.subarray(lineStart, lineEnd);\n // exclude comments and lines with no values\n // line is of format \"<field>:<value>\" or \"<field>: <value>\"\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n const field = decoder.decode(line.subarray(0, fieldLength));\n const valueOffset = fieldLength + (line[fieldLength + 1] === ControlChars.Space ? 2 : 1);\n const value = decoder.decode(line.subarray(valueOffset));\n switch (field) {\n case 'event':\n message.event = value;\n break;\n case 'data':\n // append the new value if the message has data\n message.data = message.data ? message.data + '\\n' + value : value;\n break;\n }\n }\n // next line\n lineStart = position;\n fieldLength = -1;\n }\n if (lineStart === bufLength) {\n // finished reading\n buffer = undefined;\n const messages = [...pending];\n pending = [];\n return messages;\n }\n else if (lineStart !== 0) {\n // create a new view into buffer beginning at lineStart so we don't\n // need to copy over the previous lines when we get the new chunk\n buffer = buffer.subarray(lineStart);\n position -= lineStart;\n }\n };\n}\n","/**\n *\n * client\n *\n */\nimport { createParser } from './parser.mjs';\nimport { isObject } from './utils.mjs';\nimport { TOKEN_HEADER_KEY, } from './common.mjs';\n/** This file is the entry point for browsers, re-export common elements. */\nexport * from './common.mjs';\n/**\n * Creates a disposable GraphQL over SSE client to transmit\n * GraphQL operation results.\n *\n * If you have an HTTP/2 server, it is recommended to use the client\n * in \"distinct connections mode\" (`singleConnection = false`) which will\n * create a new SSE connection for each subscribe. This is the default.\n *\n * However, when dealing with HTTP/1 servers from a browser, consider using\n * the \"single connection mode\" (`singleConnection = true`) which will\n * use only one SSE connection.\n *\n * @category Client\n */\nexport function createClient(options) {\n const { singleConnection = false, lazy = true, lazyCloseTimeout = 0, onNonLazyError = console.error, \n /**\n * Generates a v4 UUID to be used as the ID using `Math`\n * as the random number generator. Supply your own generator\n * in case you need more uniqueness.\n *\n * Reference: https://gist.github.com/jed/982883\n */\n generateID = function generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }, retryAttempts = 5, retry = async function randomisedExponentialBackoff(retries) {\n let retryDelay = 1000; // start with 1s delay\n for (let i = 0; i < retries; i++) {\n retryDelay *= 2;\n }\n await new Promise((resolve) => setTimeout(resolve, retryDelay +\n // add random timeout from 300ms to 3s\n Math.floor(Math.random() * (3000 - 300) + 300)));\n }, credentials = 'same-origin', referrer, referrerPolicy, onMessage, on: clientOn, } = options;\n const fetchFn = (options.fetchFn || fetch);\n const AbortControllerImpl = (options.abortControllerImpl ||\n AbortController);\n // we dont use yet another AbortController here because of\n // node's max EventEmitters listeners being only 10\n const client = (() => {\n let disposed = false;\n const listeners = [];\n return {\n get disposed() {\n return disposed;\n },\n onDispose(cb) {\n if (disposed) {\n // empty the call stack and then call the cb\n setTimeout(() => cb(), 0);\n return () => {\n // noop\n };\n }\n listeners.push(cb);\n return () => {\n listeners.splice(listeners.indexOf(cb), 1);\n };\n },\n dispose() {\n if (disposed)\n return;\n disposed = true;\n // we copy the listeners so that onDispose unlistens dont \"pull the rug under our feet\"\n for (const listener of [...listeners]) {\n listener();\n }\n },\n };\n })();\n let connCtrl, conn, locks = 0, retryingErr = null, retries = 0;\n async function getOrConnect() {\n try {\n if (client.disposed)\n throw new Error('Client has been disposed');\n return await (conn !== null && conn !== void 0 ? conn : (conn = (async () => {\n var _a, _b, _c;\n if (retryingErr) {\n await retry(retries);\n // connection might've been aborted while waiting for retry\n if (connCtrl.signal.aborted)\n throw new Error('Connection aborted by the client');\n retries++;\n }\n (_a = clientOn === null || clientOn === void 0 ? void 0 : clientOn.connecting) === null || _a === void 0 ? void 0 : _a.call(clientOn, !!retryingErr);\n // we must create a new controller here because lazy mode aborts currently active ones\n connCtrl = new AbortControllerImpl();\n const unlistenDispose = client.onDispose(() => connCtrl.abort());\n connCtrl.signal.addEventListener('abort', () => {\n unlistenDispose();\n conn = undefined;\n });\n const opts = options;\n const url = typeof opts.url === 'function'\n ? await opts.url(undefined)\n : opts.url;\n if (connCtrl.signal.aborted)\n throw new Error('Connection aborted by the client');\n const headers = typeof opts.headers === 'function'\n ? await opts.headers(undefined)\n : (_b = opts.headers) !== null && _b !== void 0 ? _b : {};\n if (connCtrl.signal.aborted)\n throw new Error('Connection aborted by the client');\n let res;\n try {\n res = await fetchFn(url, {\n signal: connCtrl.signal,\n method: 'PUT',\n credentials,\n referrer,\n referrerPolicy,\n headers,\n });\n }\n catch (err) {\n throw new NetworkError(err);\n }\n if (res.status !== 201)\n throw new NetworkError(res);\n const token = await res.text();\n headers[TOKEN_HEADER_KEY] = token;\n const connected = await connect({\n signal: connCtrl.signal,\n headers,\n credentials,\n referrer,\n referrerPolicy,\n url,\n fetchFn,\n onMessage: (msg) => {\n var _a;\n (_a = clientOn === null || clientOn === void 0 ? void 0 : clientOn.message) === null || _a === void 0 ? void 0 : _a.call(clientOn, msg);\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(msg); // @deprecated\n },\n });\n (_c = clientOn === null || clientOn === void 0 ? void 0 : clientOn.connected) === null || _c === void 0 ? void 0 : _c.call(clientOn, !!retryingErr);\n connected.waitForThrow().catch(() => (conn = undefined));\n return connected;\n })()));\n }\n catch (err) {\n // whatever problem happens during connect means the connection was not established\n conn = undefined;\n throw err;\n }\n }\n // non-lazy mode always holds one lock to persist the connection\n if (singleConnection && !lazy) {\n (async () => {\n locks++;\n for (;;) {\n try {\n const { waitForThrow } = await getOrConnect();\n await waitForThrow();\n }\n catch (err) {\n if (client.disposed)\n return;\n // all non-network errors are worth reporting immediately\n if (!(err instanceof NetworkError))\n return onNonLazyError === null || onNonLazyError === void 0 ? void 0 : onNonLazyError(err);\n // was a network error, get rid of the current connection to ensure retries\n conn = undefined;\n // retries are not allowed or we tried to many times, report error\n if (!retryAttempts || retries >= retryAttempts)\n return onNonLazyError === null || onNonLazyError === void 0 ? void 0 : onNonLazyError(err);\n // try again\n retryingErr = err;\n }\n }\n })();\n }\n function subscribe(request, sink, on) {\n if (!singleConnection) {\n // distinct connections mode\n const control = new AbortControllerImpl();\n const unlisten = client.onDispose(() => {\n unlisten();\n control.abort();\n });\n (async () => {\n var _a, _b, _c, _d, _e;\n let retryingErr = null, retries = 0;\n for (;;) {\n try {\n if (retryingErr) {\n await retry(retries);\n // connection might've been aborted while waiting for retry\n if (control.signal.aborted)\n throw new Error('Connection aborted by the client');\n retries++;\n }\n (_a = clientOn === null || clientOn === void 0 ? void 0 : clientOn.connecting) === null || _a === void 0 ? void 0 : _a.call(clientOn, !!retryingErr);\n (_b = on === null || on === void 0 ? void 0 : on.connecting) === null || _b === void 0 ? void 0 : _b.call(on, !!retryingErr);\n const opts = options;\n const url = typeof opts.url === 'function'\n ? await opts.url(request)\n : opts.url;\n if (control.signal.aborted)\n throw new Error('Connection aborted by the client');\n const headers = typeof opts.headers === 'function'\n ? await opts.headers(request)\n : (_c = opts.headers) !== null && _c !== void 0 ? _c : {};\n if (control.signal.aborted)\n throw new Error('Connection aborted by the client');\n const { getResults } = await connect({\n signal: control.signal,\n headers: {\n ...headers,\n 'content-type': 'application/json; charset=utf-8',\n },\n credentials,\n referrer,\n referrerPolicy,\n url,\n body: JSON.stringify(request),\n fetchFn,\n onMessage: (msg) => {\n var _a, _b;\n (_a = clientOn === null || clientOn === void 0 ? void 0 : clientOn.message) === null || _a === void 0 ? void 0 : _a.call(clientOn, msg);\n (_b = on === null || on === void 0 ? void 0 : on.message) === null || _b === void 0 ? void 0 : _b.call(on, msg);\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(msg); // @deprecated\n },\n });\n (_d = clientOn === null || clientOn === void 0 ? void 0 : clientOn.connected) === null || _d === void 0 ? void 0 : _d.call(clientOn, !!retryingErr);\n (_e = on === null || on === void 0 ? void 0 : on.connected) === null || _e === void 0 ? void 0 : _e.call(on, !!retryingErr);\n for await (const result of getResults()) {\n // only after receiving results are future connects not considered retries.\n // this is because a client might successfully connect, but the server\n // ends up terminating the connection afterwards before streaming anything.\n // of course, if the client completes the subscription, this loop will\n // break and therefore stop the stream (it wont reconnect)\n retryingErr = null;\n retries = 0;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sink.next(result);\n }\n return control.abort();\n }\n catch (err) {\n if (control.signal.aborted)\n return;\n // all non-network errors are worth reporting immediately\n if (!(err instanceof NetworkError))\n throw err;\n // retries are not allowed or we tried to many times, report error\n if (!retryAttempts || retries >= retryAttempts)\n throw err;\n // try again\n retryingErr = err;\n }\n }\n })()\n .then(() => sink.complete())\n .catch((err) => sink.error(err));\n return () => control.abort();\n }\n // single connection mode\n locks++;\n const control = new AbortControllerImpl();\n const unlisten = client.onDispose(() => {\n unlisten();\n control.abort();\n });\n (async () => {\n const operationId = generateID();\n request = {\n ...request,\n extensions: { ...request.extensions, operationId },\n };\n let complete = null;\n for (;;) {\n complete = null;\n try {\n const { url, headers, getResults } = await getOrConnect();\n let res;\n try {\n res = await fetchFn(url, {\n signal: control.signal,\n method: 'POST',\n credentials,\n referrer,\n referrerPolicy,\n headers: {\n ...headers,\n 'content-type': 'application/json; charset=utf-8',\n },\n body: JSON.stringify(request),\n });\n }\n catch (err) {\n throw new NetworkError(err);\n }\n if (res.status !== 202)\n throw new NetworkError(res);\n complete = async () => {\n let res;\n try {\n const control = new AbortControllerImpl();\n const unlisten = client.onDispose(() => {\n unlisten();\n control.abort();\n });\n res = await fetchFn(url + '?operationId=' + operationId, {\n signal: control.signal,\n method: 'DELETE',\n credentials,\n referrer,\n referrerPolicy,\n headers,\n });\n }\n catch (err) {\n throw new NetworkError(err);\n }\n if (res.status !== 200)\n throw new NetworkError(res);\n };\n for await (const result of getResults({\n signal: control.signal,\n operationId,\n })) {\n // only after receiving results are future connects not considered retries.\n // this is because a client might successfully connect, but the server\n // ends up terminating the connection afterwards before streaming anything.\n // of course, if the client completes the subscription, this loop will\n // break and therefore stop the stream (it wont reconnect)\n retryingErr = null;\n retries = 0;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sink.next(result);\n }\n complete = null; // completed by the server\n return control.abort();\n }\n catch (err) {\n if (control.signal.aborted)\n return await (complete === null || complete === void 0 ? void 0 : complete());\n // all non-network errors are worth reporting immediately\n if (!(err instanceof NetworkError)) {\n control.abort(); // TODO: tests for making sure the control's aborted\n throw err;\n }\n // was a network error, get rid of the current connection to ensure retries\n // but only if the client is running in lazy mode (otherwise the non-lazy lock will get rid of the connection)\n if (lazy) {\n conn = undefined;\n }\n // retries are not allowed or we tried to many times, report error\n if (!retryAttempts || retries >= retryAttempts) {\n control.abort(); // TODO: tests for making sure the control's aborted\n throw err;\n }\n // try again\n retryingErr = err;\n }\n finally {\n // release lock if subscription is aborted\n if (control.signal.aborted && --locks === 0) {\n if (isFinite(lazyCloseTimeout) && lazyCloseTimeout > 0) {\n // allow for the specified calmdown time and then close the\n // connection, only if no lock got created in the meantime and\n // if the connection is still open\n setTimeout(() => {\n if (!locks)\n connCtrl.abort();\n }, lazyCloseTimeout);\n }\n else {\n // otherwise close immediately\n connCtrl.abort();\n }\n }\n }\n }\n })()\n .then(() => sink.complete())\n .catch((err) => sink.error(err));\n return () => control.abort();\n }\n return {\n subscribe,\n iterate(request, on) {\n const pending = [];\n const deferred = {\n done: false,\n error: null,\n resolve: () => {\n // noop\n },\n };\n const dispose = subscribe(request, {\n next(val) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pending.push(val);\n deferred.resolve();\n },\n error(err) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n },\n complete() {\n deferred.done = true;\n deferred.resolve();\n },\n }, on);\n const iterator = (async function* iterator() {\n for (;;) {\n if (!pending.length) {\n // only wait if there are no pending messages available\n await new Promise((resolve) => (deferred.resolve = resolve));\n }\n // first flush\n while (pending.length) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n yield pending.shift();\n }\n // then error\n if (deferred.error) {\n throw deferred.error;\n }\n // or complete\n if (deferred.done) {\n return;\n }\n }\n })();\n iterator.throw = async (err) => {\n if (!deferred.done) {\n deferred.done = true;\n deferred.error = err;\n deferred.resolve();\n }\n return { done: true, value: undefined };\n };\n iterator.return = async () => {\n dispose();\n return { done: true, value: undefined };\n };\n return iterator;\n },\n dispose() {\n client.dispose();\n },\n };\n}\n/**\n * A network error caused by the client or an unexpected response from the server.\n *\n * Network errors are considered retryable, all others error types will be reported\n * immediately.\n *\n * To avoid bundling DOM typings (because the client can run in Node env too),\n * you should supply the `Response` generic depending on your Fetch implementation.\n *\n * @category Client\n */\nexport class NetworkError extends Error {\n constructor(msgOrErrOrResponse) {\n let message, response;\n if (isResponseLike(msgOrErrOrResponse)) {\n response = msgOrErrOrResponse;\n message =\n 'Server responded with ' +\n msgOrErrOrResponse.status +\n ': ' +\n msgOrErrOrResponse.statusText;\n }\n else if (msgOrErrOrResponse instanceof Error)\n message = msgOrErrOrResponse.message;\n else\n message = String(msgOrErrOrResponse);\n super(message);\n this.name = this.constructor.name;\n this.response = response;\n }\n}\nfunction isResponseLike(val) {\n return (isObject(val) &&\n typeof val['ok'] === 'boolean' &&\n typeof val['status'] === 'number' &&\n typeof val['statusText'] === 'string');\n}\nasync function connect(options) {\n const { signal, url, credentials, headers, body, referrer, referrerPolicy, fetchFn, onMessage, } = options;\n const waiting = {};\n const queue = {};\n let res;\n try {\n res = await fetchFn(url, {\n signal,\n method: body ? 'POST' : 'GET',\n credentials,\n referrer,\n referrerPolicy,\n headers: {\n ...headers,\n accept: 'text/event-stream',\n },\n body,\n });\n }\n catch (err) {\n throw new NetworkError(err);\n }\n if (!res.ok)\n throw new NetworkError(res);\n if (!res.body)\n throw new Error('Missing response body');\n let error = null;\n let waitingForThrow;\n (async () => {\n var _a;\n try {\n const parse = createParser();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n for await (const chunk of toAsyncIterable(res.body)) {\n if (typeof chunk === 'string')\n throw (error = new Error(`Unexpected string chunk \"${chunk}\"`)); // set error as fatal indicator\n // read chunk and if messages are ready, yield them\n let msgs;\n try {\n msgs = parse(chunk);\n }\n catch (err) {\n throw (error = err); // set error as fatal indicator\n }\n if (!msgs)\n continue;\n for (const msg of msgs) {\n try {\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(msg);\n }\n catch (err) {\n throw (error = err); // set error as fatal indicator\n }\n const operationId = msg.data && 'id' in msg.data\n ? msg.data.id // StreamDataForID\n : ''; // StreamData\n if (!(operationId in queue))\n queue[operationId] = [];\n switch (msg.event) {\n case 'next':\n if (operationId)\n queue[operationId].push(msg.data.payload);\n else\n queue[operationId].push(msg.data);\n break;\n case 'complete':\n queue[operationId].push('complete');\n break;\n default:\n throw (error = new Error(`Unexpected message event \"${msg.event}\"`)); // set error as fatal indicator\n }\n (_a = waiting[operationId]) === null || _a === void 0 ? void 0 : _a.proceed();\n }\n }\n // some browsers (like Safari) closes the connection without errors even on abrupt server shutdowns,\n // we therefore make sure that no stream is active and waiting for results (not completed)\n if (Object.keys(waiting).length) {\n throw new Error('Connection closed while having active streams');\n }\n }\n catch (err) {\n if (!error && Object.keys(waiting).length) {\n // we assume the error is most likely a NetworkError because there are listeners waiting for events.\n // additionally, the `error` is another indicator because we set it early if the error is considered fatal\n error = new NetworkError(err);\n }\n else {\n error = err;\n }\n waitingForThrow === null || waitingForThrow === void 0 ? void 0 : waitingForThrow(error);\n }\n finally {\n Object.values(waiting).forEach(({ proceed }) => proceed());\n }\n })();\n return {\n url,\n headers,\n waitForThrow: () => new Promise((_, reject) => {\n if (error)\n return reject(error);\n waitingForThrow = reject;\n }),\n async *getResults(options) {\n var _a;\n const { signal, operationId = '' } = options !== null && options !== void 0 ? options : {};\n // operationId === '' ? StreamData : StreamDataForID\n try {\n for (;;) {\n while ((_a = queue[operationId]) === null || _a === void 0 ? void 0 : _a.length) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const result = queue[operationId].shift();\n if (result === 'complete')\n return;\n yield result;\n }\n if (error)\n throw error;\n if (signal === null || signal === void 0 ? void 0 : signal.aborted)\n throw new Error('Getting results aborted by the client');\n await new Promise((resolve) => {\n const proceed = () => {\n signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', proceed);\n delete waiting[operationId];\n resolve();\n };\n signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', proceed);\n waiting[operationId] = { proceed };\n });\n }\n }\n finally {\n delete queue[operationId];\n }\n },\n };\n}\n/** Isomorphic ReadableStream to AsyncIterator converter. */\nfunction toAsyncIterable(val) {\n // node stream is already async iterable\n if (typeof Object(val)[Symbol.asyncIterator] === 'function') {\n val = val;\n return val;\n }\n // convert web stream to async iterable\n return (async function* () {\n const reader = val.getReader();\n let result;\n do {\n result = await reader.read();\n if (result.value !== undefined)\n yield result.value;\n } while (!result.done);\n })();\n}\n","// =============================================================================\n// Subscription Managers\n// SSE-based GraphQL subscriptions with auto-reconnect\n// =============================================================================\n\nimport { createClient, type Client } from 'graphql-sse';\nimport type { ConnectionState, ClientEvent, ChannelEvent, RoolEventSource, RoolObject, RoolObjectStat, SpaceSchema, Channel } from './types.js';\nimport type { AuthManager } from './auth.js';\nimport type { Logger } from './logger.js';\n\nconst INITIAL_RECONNECT_DELAY = 1000;\nconst MAX_RECONNECT_DELAY = 30000;\nconst RECONNECT_MULTIPLIER = 2;\n\n// =============================================================================\n// Client Subscription Manager\n// Handles client-level events (space created, deleted, renamed)\n// =============================================================================\n\nexport interface ClientSubscriptionConfig {\n graphqlUrl: string;\n authManager: AuthManager;\n logger: Logger;\n onEvent: (event: ClientEvent) => void;\n onConnectionStateChanged: (state: ConnectionState) => void;\n onError: (error: Error) => void;\n}\n\nexport class ClientSubscriptionManager {\n private config: ClientSubscriptionConfig;\n private client: Client | null = null;\n private unsubscribe: (() => void) | null = null;\n private reconnectDelay = INITIAL_RECONNECT_DELAY;\n private reconnectTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private isIntentionalClose = false;\n private _isSubscribed = false;\n private logger: Logger;\n\n constructor(config: ClientSubscriptionConfig) {\n this.config = config;\n this.logger = config.logger;\n }\n\n get isSubscribed(): boolean {\n return this._isSubscribed;\n }\n\n async subscribe(): Promise<void> {\n if (this._isSubscribed) return;\n\n this.isIntentionalClose = false;\n await this.connect();\n }\n\n unsubscribeFromEvents(): void {\n this.isIntentionalClose = true;\n this.cancelReconnect();\n this.disconnect();\n }\n\n private async connect(): Promise<void> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) {\n // Token not available - may be refreshing or network not ready after wake\n // Schedule retry instead of giving up\n if (!this.isIntentionalClose) {\n this.scheduleReconnect();\n }\n return;\n }\n\n this.config.onConnectionStateChanged('reconnecting');\n\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${tokens.accessToken}`,\n 'X-Rool-Token': tokens.roolToken,\n };\n\n this.client = createClient({\n url: this.config.graphqlUrl,\n headers,\n });\n\n const query = `\n subscription ClientEvents {\n clientEvents\n }\n `;\n\n this.unsubscribe = this.client.subscribe(\n { query },\n {\n next: (result) => {\n this.reconnectDelay = INITIAL_RECONNECT_DELAY;\n\n if (result.data?.clientEvents) {\n try {\n const eventData = result.data.clientEvents as string;\n const rawEvent = JSON.parse(eventData);\n const event = this.parseClientEvent(rawEvent);\n if (event) {\n // Handle connected event\n if (event.type === 'connected') {\n this.logger.info(`[RoolClient] Connected, server version: ${event.serverVersion}`);\n if (!this._isSubscribed) {\n this._isSubscribed = true;\n this.config.onConnectionStateChanged('connected');\n }\n }\n this.config.onEvent(event);\n }\n } catch (e) {\n this.logger.error('[RoolClient] Failed to parse client event:', e);\n }\n }\n },\n error: (error) => {\n this.logger.error('[RoolClient] Client subscription error:', error);\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n\n if (!this.isIntentionalClose) {\n this.scheduleReconnect();\n }\n },\n complete: () => {\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n\n if (!this.isIntentionalClose) {\n this.scheduleReconnect();\n }\n },\n }\n );\n } catch (error) {\n this.logger.error('[RoolClient] Failed to establish client subscription:', error);\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n\n if (!this.isIntentionalClose) {\n this.scheduleReconnect();\n }\n }\n }\n\n private disconnect(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n this.client = null;\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n }\n\n private scheduleReconnect(): void {\n this.cancelReconnect();\n\n this.logger.info(`[RoolClient] Client reconnecting in ${this.reconnectDelay}ms...`);\n this.config.onConnectionStateChanged('reconnecting');\n\n this.reconnectTimeoutId = setTimeout(() => {\n this.reconnectTimeoutId = null;\n void this.connect();\n }, this.reconnectDelay);\n\n this.reconnectDelay = Math.min(\n this.reconnectDelay * RECONNECT_MULTIPLIER,\n MAX_RECONNECT_DELAY\n );\n }\n\n private cancelReconnect(): void {\n if (this.reconnectTimeoutId !== null) {\n clearTimeout(this.reconnectTimeoutId);\n this.reconnectTimeoutId = null;\n }\n }\n\n private parseClientEvent(raw: Record<string, unknown>): ClientEvent | null {\n const type = raw.type as ClientEvent[\"type\"];\n const timestamp = raw.timestamp as number;\n\n if (!type) return null;\n\n switch (type) {\n case 'connected':\n return { type, timestamp, serverVersion: raw.serverVersion as string };\n case 'space_created':\n case 'space_renamed':\n return { type, spaceId: raw.spaceId as string, timestamp, name: raw.name as string };\n case 'space_deleted':\n return { type, spaceId: raw.spaceId as string, timestamp };\n case 'user_storage_changed':\n return { type, timestamp, key: raw.key as string, value: raw.value };\n case 'channel_created':\n return {\n type, spaceId: raw.spaceId as string, timestamp,\n channelId: raw.channelId as string, name: raw.name as string,\n channelCreatedAt: raw.createdAt as number, channelCreatedBy: raw.createdBy as string,\n channelCreatedByName: raw.createdByName as string | undefined,\n };\n case 'channel_renamed':\n return { type, spaceId: raw.spaceId as string, timestamp, channelId: raw.channelId as string, name: raw.name as string };\n case 'channel_deleted':\n return { type, spaceId: raw.spaceId as string, timestamp, channelId: raw.channelId as string };\n default:\n this.logger.warn('[RoolClient] Unknown client event type:', type);\n return null;\n }\n }\n\n destroy(): void {\n this.unsubscribeFromEvents();\n }\n}\n\n// =============================================================================\n// Channel Subscription Manager\n// Handles channel-level events (objects, schema, metadata, interactions)\n// =============================================================================\n\nexport interface ChannelSubscriptionConfig {\n graphqlUrl: string;\n authManager: AuthManager;\n logger: Logger;\n spaceId: string;\n channelId: string;\n onEvent: (event: ChannelEvent) => void;\n onConnectionStateChanged: (state: ConnectionState) => void;\n onError: (error: Error) => void;\n}\n\nexport class ChannelSubscriptionManager {\n private config: ChannelSubscriptionConfig;\n private client: Client | null = null;\n private unsubscribe: (() => void) | null = null;\n private reconnectDelay = INITIAL_RECONNECT_DELAY;\n private reconnectTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private isIntentionalClose = false;\n private _isSubscribed = false;\n private _initialConnectPromise: { resolve: () => void; reject: (e: Error) => void } | null = null;\n private logger: Logger;\n\n constructor(config: ChannelSubscriptionConfig) {\n this.config = config;\n this.logger = config.logger;\n }\n\n get isSubscribed(): boolean {\n return this._isSubscribed;\n }\n\n /**\n * Start the subscription. Returns a promise that resolves when connected.\n * If the initial connection fails, the promise rejects.\n * After initial connection, disconnects trigger auto-reconnect.\n */\n subscribe(): Promise<void> {\n if (this._isSubscribed) return Promise.resolve();\n\n this.isIntentionalClose = false;\n\n return new Promise<void>((resolve, reject) => {\n this._initialConnectPromise = { resolve, reject };\n void this.connect();\n });\n }\n\n unsubscribeFromEvents(): void {\n this.isIntentionalClose = true;\n this.cancelReconnect();\n this.disconnect();\n }\n\n private async connect(): Promise<void> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) {\n const error = new Error('Cannot subscribe: not authenticated');\n this.config.onError(error);\n if (this._initialConnectPromise) {\n // Initial connection - reject so caller knows it failed\n this._initialConnectPromise.reject(error);\n this._initialConnectPromise = null;\n } else if (!this.isIntentionalClose) {\n // Reconnect attempt - token may be refreshing, retry\n this.scheduleReconnect();\n }\n return;\n }\n\n this.config.onConnectionStateChanged('reconnecting');\n\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${tokens.accessToken}`,\n 'X-Rool-Token': tokens.roolToken,\n };\n\n this.client = createClient({\n url: this.config.graphqlUrl,\n headers,\n });\n\n const query = `\n subscription ChannelEvents($spaceId: String!, $channelId: String!) {\n channelEvents(spaceId: $spaceId, channelId: $channelId)\n }\n `;\n\n this.unsubscribe = this.client.subscribe(\n {\n query,\n variables: {\n spaceId: this.config.spaceId,\n channelId: this.config.channelId,\n },\n },\n {\n next: (result) => {\n this.reconnectDelay = INITIAL_RECONNECT_DELAY;\n\n if (result.data?.channelEvents) {\n try {\n const eventData = result.data.channelEvents as string;\n const rawEvent = JSON.parse(eventData);\n const event = this.parseChannelEvent(rawEvent);\n if (event) {\n // Handle connected event - resolve initial promise\n if (event.type === 'connected') {\n this.logger.info(`[RoolChannel] Connected to space ${event.spaceId}, server version: ${event.serverVersion}`);\n if (!this._isSubscribed) {\n this._isSubscribed = true;\n this.config.onConnectionStateChanged('connected');\n if (this._initialConnectPromise) {\n this._initialConnectPromise.resolve();\n this._initialConnectPromise = null;\n }\n }\n }\n this.config.onEvent(event);\n }\n } catch (e) {\n this.logger.error('[RoolChannel] Failed to parse space event:', e);\n }\n }\n },\n error: (error) => {\n this.logger.error('[RoolChannel] Space subscription error:', error);\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n\n if (this._initialConnectPromise) {\n // Initial connection failed - reject and don't auto-reconnect\n this._initialConnectPromise.reject(error instanceof Error ? error : new Error(String(error)));\n this._initialConnectPromise = null;\n } else if (!this.isIntentionalClose) {\n // Established connection dropped - auto-reconnect\n this.scheduleReconnect();\n }\n },\n complete: () => {\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n\n if (this._initialConnectPromise) {\n // Connection closed before establishing - reject\n this._initialConnectPromise.reject(new Error('Connection closed before establishing'));\n this._initialConnectPromise = null;\n } else if (!this.isIntentionalClose) {\n this.scheduleReconnect();\n }\n },\n }\n );\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to establish space subscription:', error);\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n\n if (this._initialConnectPromise) {\n this._initialConnectPromise.reject(error instanceof Error ? error : new Error(String(error)));\n this._initialConnectPromise = null;\n } else if (!this.isIntentionalClose) {\n this.scheduleReconnect();\n }\n }\n }\n\n private disconnect(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n this.client = null;\n this._isSubscribed = false;\n this.config.onConnectionStateChanged('disconnected');\n }\n\n private scheduleReconnect(): void {\n this.cancelReconnect();\n\n this.logger.info(`[RoolChannel] Space ${this.config.spaceId} reconnecting in ${this.reconnectDelay}ms...`);\n this.config.onConnectionStateChanged('reconnecting');\n\n this.reconnectTimeoutId = setTimeout(() => {\n this.reconnectTimeoutId = null;\n void this.connect();\n }, this.reconnectDelay);\n\n this.reconnectDelay = Math.min(\n this.reconnectDelay * RECONNECT_MULTIPLIER,\n MAX_RECONNECT_DELAY\n );\n }\n\n private cancelReconnect(): void {\n if (this.reconnectTimeoutId !== null) {\n clearTimeout(this.reconnectTimeoutId);\n this.reconnectTimeoutId = null;\n }\n }\n\n private parseChannelEvent(raw: Record<string, unknown>): ChannelEvent | null {\n const type = raw.type as ChannelEvent[\"type\"];\n const spaceId = raw.spaceId as string;\n const timestamp = raw.timestamp as number;\n const source = (raw.source as RoolEventSource) ?? 'user';\n\n if (!type || !spaceId) return null;\n\n switch (type) {\n case 'connected':\n return { type, spaceId, timestamp, source, serverVersion: raw.serverVersion as number };\n case 'space_changed':\n return { type, spaceId, timestamp, source };\n case 'object_created':\n case 'object_updated':\n return { type, spaceId, timestamp, source, objectId: raw.objectId as string, object: raw.object as RoolObject, objectStat: raw.objectStat as RoolObjectStat | undefined };\n case 'object_deleted':\n return { type, spaceId, timestamp, source, objectId: raw.objectId as string };\n case 'schema_updated':\n return { type, spaceId, timestamp, source, schema: raw.schema as SpaceSchema };\n case 'metadata_updated':\n return { type, spaceId, timestamp, source, metadata: raw.metadata as Record<string, unknown> };\n case 'channel_updated':\n return { type, spaceId, timestamp, source, channelId: raw.channelId as string, channel: raw.channel as Channel };\n case 'channel_deleted':\n return { type, spaceId, timestamp, source, channelId: raw.channelId as string };\n default:\n this.logger.warn('[RoolChannel] Unknown space event type:', type);\n return null;\n }\n }\n\n destroy(): void {\n this.unsubscribeFromEvents();\n }\n}\n","// =============================================================================\n// Media Client\n// REST API wrapper for file upload/download/list/delete\n// =============================================================================\n\nimport type { MediaInfo, MediaResponse } from './types.js';\nimport type { AuthManager } from './auth.js';\n\nexport interface MediaClientConfig {\n mediaUrl: string;\n backendOrigin: string;\n authManager: AuthManager;\n}\n\nexport class MediaClient {\n private config: MediaClientConfig;\n\n constructor(config: MediaClientConfig) {\n this.config = config;\n }\n\n private baseUrl(spaceId: string): string {\n return `${this.config.mediaUrl}/${encodeURIComponent(spaceId)}`;\n }\n\n /**\n * Extract filename from a media URL.\n * URL format: {baseUrl}/{spaceId}/{filename}\n */\n private extractFilename(url: string): string {\n const parts = new URL(url).pathname.split('/');\n const filename = parts[parts.length - 1];\n if (!filename) throw new Error('Invalid media URL: cannot extract filename');\n return filename;\n }\n\n /**\n * Check if a URL is a backend URL (requires auth).\n */\n private isBackendUrl(url: string): boolean {\n if (url.startsWith('/')) return true;\n try {\n const parsed = new URL(url);\n return parsed.origin === this.config.backendOrigin;\n } catch {\n return false;\n }\n }\n\n /**\n * List all media files for a space.\n */\n async list(spaceId: string): Promise<MediaInfo[]> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const response = await fetch(this.baseUrl(spaceId), {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to list media: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Upload a file to a space. Returns the URL.\n * Accepts File, Blob, or base64 data with content type.\n */\n async upload(\n spaceId: string,\n file: File | Blob | { data: string; contentType: string }\n ): Promise<string> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n let body: FormData | string;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${tokens.accessToken}`,\n 'X-Rool-Token': tokens.roolToken,\n };\n\n if (file instanceof File || file instanceof Blob) {\n const formData = new FormData();\n formData.append('file', file);\n body = formData;\n } else {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify({\n data: file.data,\n contentType: file.contentType,\n });\n }\n\n const response = await fetch(this.baseUrl(spaceId), {\n method: 'POST',\n headers,\n body,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to upload media: ${response.status} ${response.statusText}`);\n }\n\n const item: MediaInfo = await response.json();\n return item.url;\n }\n\n /**\n * Fetch any URL, returning headers and a blob() method (like fetch Response).\n * For backend URLs: adds auth headers.\n * For external URLs: tries direct fetch first, falls back to server proxy if CORS blocks it.\n */\n async fetch(spaceId: string, url: string, options?: { forceProxy?: boolean }): Promise<MediaResponse> {\n let response: Response;\n\n if (this.isBackendUrl(url)) {\n response = await this.fetchWithAuth(url);\n } else if (options?.forceProxy) {\n // Skip direct fetch, go straight to proxy\n response = await this.fetchViaProxy(spaceId, url);\n } else {\n // External URL: try direct fetch first\n try {\n const directResponse = await fetch(url, { method: 'GET', mode: 'cors' });\n if (directResponse.ok) {\n response = directResponse;\n } else {\n // Non-OK response, fall through to proxy\n response = await this.fetchViaProxy(spaceId, url);\n }\n } catch {\n // CORS or network error, fall through to proxy\n response = await this.fetchViaProxy(spaceId, url);\n }\n }\n\n const contentLength = response.headers.get('content-length');\n return {\n contentType: response.headers.get('content-type') || 'application/octet-stream',\n size: contentLength ? parseInt(contentLength, 10) : null,\n blob: () => response.blob(),\n };\n }\n\n /**\n * Fetch a backend URL with auth headers.\n */\n private async fetchWithAuth(url: string): Promise<Response> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch media: ${response.status} ${response.statusText}`);\n }\n\n return response;\n }\n\n /**\n * Fetch an external URL via the server proxy (bypasses CORS).\n */\n private async fetchViaProxy(spaceId: string, url: string): Promise<Response> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const proxyUrl = `${this.baseUrl(spaceId)}/proxy?url=${encodeURIComponent(url)}`;\n const response = await fetch(proxyUrl, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch media via proxy: ${response.status} ${response.statusText}`);\n }\n\n return response;\n }\n\n /**\n * Delete a media file by URL.\n */\n async delete(spaceId: string, url: string): Promise<void> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const filename = this.extractFilename(url);\n const response = await fetch(`${this.baseUrl(spaceId)}/${encodeURIComponent(filename)}`, {\n method: 'DELETE',\n headers,\n });\n\n if (!response.ok && response.status !== 204) {\n throw new Error(`Failed to delete media: ${response.status} ${response.statusText}`);\n }\n }\n\n /**\n * Export a space as a zip archive containing data and media.\n * The archive includes data.json with objects, relations, metadata, and channels,\n * plus a media/ folder with all media files.\n */\n async exportArchive(spaceId: string): Promise<Blob> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const exportUrl = `${this.config.backendOrigin}/spaces/${encodeURIComponent(spaceId)}/export`;\n const response = await fetch(exportUrl, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`Failed to export space: ${response.status} ${errorText}`);\n }\n\n return response.blob();\n }\n\n /**\n * Import a space from a zip archive.\n * Creates a new space with the given name and imports objects, relations, and media.\n * Returns the new space ID.\n */\n async importArchive(name: string, archive: Blob): Promise<string> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const formData = new FormData();\n formData.append('name', name);\n formData.append('archive', archive, 'archive.zip');\n\n const importUrl = `${this.config.backendOrigin}/spaces/import`;\n const response = await fetch(importUrl, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n throw new Error(`Failed to import space: ${response.status} ${errorText}`);\n }\n\n const result = await response.json() as { spaceId: string; name: string };\n return result.spaceId;\n }\n}\n\n","// =============================================================================\n// Apps Client\n// REST API wrapper for app publishing/unpublishing/listing\n// =============================================================================\n\nimport type { PublishedAppInfo, PublishAppOptions } from './types.js';\nimport type { AuthManager } from './auth.js';\n\nexport interface AppsClientConfig {\n appsUrl: string;\n authManager: AuthManager;\n}\n\nexport class AppsClient {\n private config: AppsClientConfig;\n\n constructor(config: AppsClientConfig) {\n this.config = config;\n }\n\n /**\n * List all published apps for the current user.\n */\n async list(): Promise<PublishedAppInfo[]> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const response = await fetch(this.config.appsUrl, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to list apps: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Get info for a specific published app.\n */\n async get(appId: string): Promise<PublishedAppInfo | null> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const response = await fetch(`${this.config.appsUrl}/${encodeURIComponent(appId)}`, {\n method: 'GET',\n headers,\n });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(`Failed to get app: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Publish or update an app.\n * @param appId - URL-safe identifier for the app\n * @param options - App name, bundle (zip file), and optional SPA flag\n */\n async publish(appId: string, options: PublishAppOptions): Promise<PublishedAppInfo> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const formData = new FormData();\n formData.append('bundle', options.bundle);\n formData.append('name', options.name);\n if (options.spa !== undefined) {\n formData.append('spa', String(options.spa));\n }\n\n const response = await fetch(`${this.config.appsUrl}/${encodeURIComponent(appId)}`, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({}));\n const errorMessage = errorBody.error || `${response.status} ${response.statusText}`;\n throw new Error(`Failed to publish app: ${errorMessage}`);\n }\n\n return response.json();\n }\n\n /**\n * Unpublish an app.\n */\n async unpublish(appId: string): Promise<void> {\n const tokens = await this.config.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers: Record<string, string> = { Authorization: `Bearer ${tokens.accessToken}`, 'X-Rool-Token': tokens.roolToken };\n\n const response = await fetch(`${this.config.appsUrl}/${encodeURIComponent(appId)}`, {\n method: 'DELETE',\n headers,\n });\n\n if (!response.ok && response.status !== 204) {\n throw new Error(`Failed to unpublish app: ${response.status} ${response.statusText}`);\n }\n }\n}\n","import { EventEmitter } from './event-emitter.js';\nimport type { GraphQLClient } from './graphql.js';\nimport type { MediaClient } from './media.js';\nimport type { AuthManager } from './auth.js';\nimport { ChannelSubscriptionManager } from './subscription.js';\nimport type { Logger } from './logger.js';\nimport type {\n RoolObject,\n RoolObjectStat,\n ChannelEvents,\n RoolUserRole,\n PromptOptions,\n FindObjectsOptions,\n CreateObjectOptions,\n UpdateObjectOptions,\n MediaInfo,\n MediaResponse,\n ChangeSource,\n ChannelEvent,\n Interaction,\n Channel,\n LinkAccess,\n SpaceSchema,\n CollectionDef,\n FieldDef,\n} from './types.js';\n\n// 6-character alphanumeric ID (62^6 = 56.8 billion possible values)\nconst ID_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\nexport function generateEntityId(): string {\n let result = '';\n for (let i = 0; i < 6; i++) {\n result += ID_CHARS[Math.floor(Math.random() * ID_CHARS.length)];\n }\n return result;\n}\n\n// Default timeout for waiting on SSE object events (30 seconds)\nconst OBJECT_COLLECT_TIMEOUT = 30000;\n\nexport interface ChannelConfig {\n id: string;\n name: string;\n role: RoolUserRole;\n linkAccess: LinkAccess;\n /** Current user's ID (for identifying own interactions) */\n userId: string;\n /** Object IDs in the space (sorted by modifiedAt desc) */\n objectIds: string[];\n /** Object stats keyed by object ID */\n objectStats: Record<string, RoolObjectStat>;\n /** Collection schema */\n schema: SpaceSchema;\n /** Space metadata */\n meta: Record<string, unknown>;\n /** This channel's data (undefined if new) */\n channel: Channel | undefined;\n /** Channel ID for this channel (required). */\n channelId: string;\n graphqlClient: GraphQLClient;\n mediaClient: MediaClient;\n graphqlUrl: string;\n authManager: AuthManager;\n logger: Logger;\n onClose: (spaceId: string) => void;\n}\n\n/**\n * A channel is a space + channelId pair.\n *\n * All object operations go through a channel. The channelId is fixed\n * at open time and cannot be changed. To use a different channel,\n * open a second one.\n *\n * Objects are fetched on demand from the server; only schema, metadata,\n * and the channel's own history are cached locally. Object changes\n * arrive via SSE semantic events and are emitted as SDK events.\n *\n * Features:\n * - High-level object operations\n * - Built-in undo/redo with checkpoints\n * - Metadata management\n * - Event emission for state changes\n * - Real-time updates via space-specific subscription\n */\nexport class RoolChannel extends EventEmitter<ChannelEvents> {\n private _id: string;\n private _name: string;\n private _role: RoolUserRole;\n private _linkAccess: LinkAccess;\n private _userId: string;\n private _channelId: string;\n private _closed: boolean = false;\n private graphqlClient: GraphQLClient;\n private mediaClient: MediaClient;\n private subscriptionManager: ChannelSubscriptionManager;\n private onCloseCallback: (spaceId: string) => void;\n private _subscriptionReady: Promise<void>;\n private logger: Logger;\n\n // Local cache for bounded data (schema, metadata, own channel, object IDs, stats)\n private _meta: Record<string, unknown>;\n private _schema: SpaceSchema;\n private _channel: Channel | undefined;\n private _objectIds: string[];\n private _objectStats: Map<string, RoolObjectStat>;\n\n // Object collection: tracks pending local mutations for dedup\n // Maps objectId → optimistic object data (for create/update) or null (for delete)\n private _pendingMutations = new Map<string, RoolObject | null>();\n // Resolvers waiting for object data from SSE events\n private _objectResolvers = new Map<string, (obj: RoolObject) => void>();\n // Buffer for object data that arrived before a collector was registered\n private _objectBuffer = new Map<string, RoolObject>();\n\n constructor(config: ChannelConfig) {\n super();\n this._id = config.id;\n this._name = config.name;\n this._role = config.role;\n this._linkAccess = config.linkAccess;\n this._userId = config.userId;\n this._emitterLogger = config.logger;\n this._channelId = config.channelId;\n this.graphqlClient = config.graphqlClient;\n this.mediaClient = config.mediaClient;\n this.logger = config.logger;\n this.onCloseCallback = config.onClose;\n\n // Initialize local cache from server data\n this._meta = config.meta;\n this._schema = config.schema;\n this._channel = config.channel;\n this._objectIds = config.objectIds;\n this._objectStats = new Map(Object.entries(config.objectStats));\n\n // Create channel subscription\n this.subscriptionManager = new ChannelSubscriptionManager({\n graphqlUrl: config.graphqlUrl,\n authManager: config.authManager,\n logger: this.logger,\n spaceId: this._id,\n channelId: this._channelId,\n onEvent: (event) => this.handleChannelEvent(event),\n onConnectionStateChanged: () => {\n // Channel connection state (could emit events if needed)\n },\n onError: (error) => {\n this.logger.error(`[RoolChannel ${this._id}] Subscription error:`, error);\n },\n });\n\n // Start subscription - store promise for openChannel to await\n this._subscriptionReady = this.subscriptionManager.subscribe();\n }\n\n /**\n * Wait for the real-time subscription to be established.\n * Called internally by openChannel/createSpace before returning the channel.\n * @internal\n */\n _waitForSubscription(): Promise<void> {\n return this._subscriptionReady;\n }\n\n // ===========================================================================\n // Properties\n // ===========================================================================\n\n get id(): string {\n return this._id;\n }\n\n get name(): string {\n return this._name;\n }\n\n get role(): RoolUserRole {\n return this._role;\n }\n\n get linkAccess(): LinkAccess {\n return this._linkAccess;\n }\n\n /** Current user's ID (for identifying own interactions) */\n get userId(): string {\n return this._userId;\n }\n\n /**\n * Get the channel's display name, or null if not set.\n */\n get channelName(): string | null {\n return this._channel?.name ?? null;\n }\n\n /**\n * Get the channel ID for this channel.\n * Fixed at open time — cannot be changed.\n */\n get channelId(): string {\n return this._channelId;\n }\n\n get isReadOnly(): boolean {\n return this._role === 'viewer';\n }\n\n // ===========================================================================\n // Channel History Access\n // ===========================================================================\n\n /**\n * Get interactions for this channel.\n */\n getInteractions(): Interaction[] {\n return this._channel?.interactions ?? [];\n }\n\n // ===========================================================================\n // Channel Lifecycle\n // ===========================================================================\n\n /**\n * Close this channel and clean up resources.\n * Stops real-time subscription and unregisters from client.\n */\n close(): void {\n this._closed = true;\n this.subscriptionManager.destroy();\n this.onCloseCallback(this._id);\n\n // Clean up pending object collectors\n this._objectResolvers.clear();\n this._objectBuffer.clear();\n this._pendingMutations.clear();\n\n this.removeAllListeners();\n }\n\n // ===========================================================================\n // Undo / Redo (Server-managed checkpoints)\n // ===========================================================================\n\n /**\n * Create a checkpoint (seal current batch of changes).\n * @returns The checkpoint ID\n */\n async checkpoint(label: string = 'Change'): Promise<string> {\n const result = await this.graphqlClient.checkpoint(\n this._id,\n label,\n this._channelId,\n );\n return result.checkpointId;\n }\n\n /**\n * Check if undo is available.\n */\n async canUndo(): Promise<boolean> {\n const status = await this.graphqlClient.checkpointStatus(this._id, this._channelId);\n return status.canUndo;\n }\n\n /**\n * Check if redo is available.\n */\n async canRedo(): Promise<boolean> {\n const status = await this.graphqlClient.checkpointStatus(this._id, this._channelId);\n return status.canRedo;\n }\n\n /**\n * Undo the most recent batch of changes.\n * Reverses your most recent batch (sealed or open).\n * Conflicting patches (modified by others) are silently skipped.\n * @returns true if undo was performed\n */\n async undo(): Promise<boolean> {\n const result = await this.graphqlClient.undo(this._id, this._channelId);\n // Server broadcasts space_changed, which triggers a reset event\n return result.success;\n }\n\n /**\n * Redo a previously undone batch of changes.\n * @returns true if redo was performed\n */\n async redo(): Promise<boolean> {\n const result = await this.graphqlClient.redo(this._id, this._channelId);\n // Server broadcasts space_changed, which triggers a reset event\n return result.success;\n }\n\n /**\n * Clear checkpoint history for this channel.\n */\n async clearHistory(): Promise<void> {\n await this.graphqlClient.clearCheckpointHistory(this._id, this._channelId);\n }\n\n // ===========================================================================\n // Object Operations\n // ===========================================================================\n\n /**\n * Get an object's data by ID.\n * Fetches from the server on each call.\n */\n async getObject(objectId: string): Promise<RoolObject | undefined> {\n return this.graphqlClient.getObject(this._id, objectId);\n }\n\n /**\n * Get an object's stat (audit information).\n * Returns modification timestamp and author, or undefined if object not found.\n */\n stat(objectId: string): RoolObjectStat | undefined {\n return this._objectStats.get(objectId);\n }\n\n /**\n * Find objects using structured filters and/or natural language.\n *\n * `where` provides exact-match filtering — values must match literally (no placeholders or operators).\n * `prompt` enables AI-powered semantic queries. When both are provided, `where` and `objectIds`\n * constrain the data set before the AI sees it.\n *\n * @param options.where - Exact-match field filter (e.g. `{ type: 'article' }`). Constrains which objects the AI can see when combined with `prompt`.\n * @param options.prompt - Natural language query. Triggers AI evaluation (uses credits).\n * @param options.limit - Maximum number of results to return (applies to structured filtering only; the AI controls its own result size).\n * @param options.objectIds - Scope search to specific object IDs. Constrains the candidate set in both structured and AI queries.\n * @param options.order - Sort order by modifiedAt: `'asc'` or `'desc'` (default: `'desc'`). Only applies to structured filtering (no `prompt`).\n * @param options.ephemeral - If true, the query won't be recorded in interaction history.\n * @returns The matching objects and a descriptive message.\n */\n async findObjects(options: FindObjectsOptions): Promise<{ objects: RoolObject[]; message: string }> {\n return this.graphqlClient.findObjects(this._id, options, this._channelId);\n }\n\n /**\n * Get all object IDs (sync, from local cache).\n * The list is loaded on open and kept current via SSE events.\n * @param options.limit - Maximum number of IDs to return\n * @param options.order - Sort order by modifiedAt ('asc' or 'desc', default: 'desc')\n */\n getObjectIds(options?: { limit?: number; order?: 'asc' | 'desc' }): string[] {\n let ids = this._objectIds;\n if (options?.order === 'asc') {\n ids = [...ids].reverse();\n }\n if (options?.limit !== undefined) {\n ids = ids.slice(0, options.limit);\n }\n return ids;\n }\n\n /**\n * Create a new object with optional AI generation.\n * @param options.data - Object data fields (any key-value pairs). Optionally include `id` to use a custom ID. Use {{placeholder}} for AI-generated content. Fields prefixed with _ are hidden from AI.\n * @param options.ephemeral - If true, the operation won't be recorded in interaction history.\n * @returns The created object (with AI-filled content) and message\n */\n async createObject(options: CreateObjectOptions): Promise<{ object: RoolObject; message: string }> {\n const { data, ephemeral } = options;\n\n // Use data.id if provided (string), otherwise generate\n const objectId = typeof data.id === 'string' ? data.id : generateEntityId();\n\n // Validate ID format: alphanumeric, hyphens, underscores only\n if (!/^[a-zA-Z0-9_-]+$/.test(objectId)) {\n throw new Error(`Invalid object ID \"${objectId}\". IDs must contain only alphanumeric characters, hyphens, and underscores.`);\n }\n\n const dataWithId = { ...data, id: objectId } as RoolObject;\n\n // Emit optimistic event and track for dedup\n this._pendingMutations.set(objectId, dataWithId);\n this.emit('objectCreated', { objectId, object: dataWithId, source: 'local_user' });\n\n try {\n // Await mutation — server processes AI placeholders before responding.\n // SSE events arrive during the await and are buffered via _deliverObject.\n const { message } = await this.graphqlClient.createObject(this.id, dataWithId, this._channelId, ephemeral);\n // Collect resolved object from buffer (or wait if not yet arrived)\n const object = await this._collectObject(objectId);\n return { object, message };\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to create object:', error);\n this._pendingMutations.delete(objectId);\n this._cancelCollector(objectId);\n // Emit reset so UI can recover from the optimistic event\n this.emit('syncError', error instanceof Error ? error : new Error(String(error)));\n this.emit('reset', { source: 'system' });\n throw error;\n }\n }\n\n /**\n * Update an existing object.\n * @param objectId - The ID of the object to update\n * @param options.data - Fields to add or update. Pass null or undefined to delete a field. Use {{placeholder}} for AI-generated content. Fields prefixed with _ are hidden from AI.\n * @param options.prompt - AI prompt for content editing (optional).\n * @param options.ephemeral - If true, the operation won't be recorded in interaction history.\n * @returns The updated object (with AI-filled content) and message\n */\n async updateObject(\n objectId: string,\n options: UpdateObjectOptions\n ): Promise<{ object: RoolObject; message: string }> {\n const { data, ephemeral } = options;\n\n // id is immutable after creation (but null/undefined means delete attempt, which we also reject)\n if (data?.id !== undefined && data.id !== null) {\n throw new Error('Cannot change id in updateObject. The id field is immutable after creation.');\n }\n if (data && ('id' in data)) {\n throw new Error('Cannot delete id field. The id field is immutable after creation.');\n }\n\n // Normalize undefined to null (for JSON serialization) and build server data\n let serverData: Record<string, unknown> | undefined;\n if (data) {\n serverData = {};\n for (const [key, value] of Object.entries(data)) {\n // Convert undefined to null for wire protocol\n serverData[key] = value === undefined ? null : value;\n }\n }\n\n // Emit optimistic event if we have data changes\n if (data) {\n // Build optimistic object (best effort — we may not have the current state)\n const optimistic = { id: objectId, ...data } as RoolObject;\n this._pendingMutations.set(objectId, optimistic);\n this.emit('objectUpdated', { objectId, object: optimistic, source: 'local_user' });\n }\n\n try {\n const { message } = await this.graphqlClient.updateObject(this.id, objectId, this._channelId, serverData, options.prompt, ephemeral);\n const object = await this._collectObject(objectId);\n return { object, message };\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to update object:', error);\n this._pendingMutations.delete(objectId);\n this._cancelCollector(objectId);\n this.emit('syncError', error instanceof Error ? error : new Error(String(error)));\n this.emit('reset', { source: 'system' });\n throw error;\n }\n }\n\n /**\n * Delete objects by IDs.\n * Other objects that reference deleted objects via data fields will retain stale ref values.\n */\n async deleteObjects(objectIds: string[]): Promise<void> {\n if (objectIds.length === 0) return;\n\n // Track for dedup and emit optimistic events\n for (const objectId of objectIds) {\n this._pendingMutations.set(objectId, null);\n this.emit('objectDeleted', { objectId, source: 'local_user' });\n }\n\n try {\n await this.graphqlClient.deleteObjects(this.id, objectIds, this._channelId);\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to delete objects:', error);\n for (const objectId of objectIds) {\n this._pendingMutations.delete(objectId);\n }\n this.emit('syncError', error instanceof Error ? error : new Error(String(error)));\n this.emit('reset', { source: 'system' });\n throw error;\n }\n }\n\n // ===========================================================================\n // Collection Schema Operations\n // ===========================================================================\n\n /**\n * Get the current schema for this space.\n * Returns a map of collection names to their definitions.\n */\n getSchema(): SpaceSchema {\n return this._schema;\n }\n\n /**\n * Create a new collection schema.\n * @param name - Collection name (must start with a letter, alphanumeric/hyphens/underscores only)\n * @param fields - Field definitions for the collection\n * @returns The created CollectionDef\n */\n async createCollection(name: string, fields: FieldDef[]): Promise<CollectionDef> {\n if (this._schema[name]) {\n throw new Error(`Collection \"${name}\" already exists`);\n }\n\n // Optimistic local update\n const optimisticDef: CollectionDef = { fields: fields.map(f => ({ name: f.name, type: f.type })) };\n this._schema[name] = optimisticDef;\n\n try {\n return await this.graphqlClient.createCollection(this._id, name, fields, this._channelId);\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to create collection:', error);\n delete this._schema[name];\n throw error;\n }\n }\n\n /**\n * Alter an existing collection schema, replacing its field definitions.\n * @param name - Name of the collection to alter\n * @param fields - New field definitions (replaces all existing fields)\n * @returns The updated CollectionDef\n */\n async alterCollection(name: string, fields: FieldDef[]): Promise<CollectionDef> {\n if (!this._schema[name]) {\n throw new Error(`Collection \"${name}\" not found`);\n }\n\n const previous = this._schema[name];\n // Optimistic local update\n this._schema[name] = { fields: fields.map(f => ({ name: f.name, type: f.type })) };\n\n try {\n return await this.graphqlClient.alterCollection(this._id, name, fields, this._channelId);\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to alter collection:', error);\n this._schema[name] = previous;\n throw error;\n }\n }\n\n /**\n * Drop a collection schema.\n * @param name - Name of the collection to drop\n */\n async dropCollection(name: string): Promise<void> {\n if (!this._schema[name]) {\n throw new Error(`Collection \"${name}\" not found`);\n }\n\n const previous = this._schema[name];\n // Optimistic local update\n delete this._schema[name];\n\n try {\n await this.graphqlClient.dropCollection(this._id, name, this._channelId);\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to drop collection:', error);\n this._schema[name] = previous;\n throw error;\n }\n }\n\n // ===========================================================================\n // System Instructions\n // ===========================================================================\n\n /**\n * Get the system instruction for this channel.\n * Returns undefined if no system instruction is set.\n */\n getSystemInstruction(): string | undefined {\n return this._channel?.systemInstruction;\n }\n\n /**\n * Set the system instruction for this channel.\n * Pass null to clear the instruction.\n */\n async setSystemInstruction(instruction: string | null): Promise<void> {\n // Optimistic local update\n if (!this._channel) {\n this._channel = {\n createdAt: Date.now(),\n createdBy: this._userId,\n interactions: [],\n };\n }\n const previous = this._channel;\n if (instruction === null) {\n const { systemInstruction: _, ...rest } = this._channel;\n this._channel = rest;\n } else {\n this._channel = { ...this._channel, systemInstruction: instruction };\n }\n\n // Emit event\n this.emit('channelUpdated', {\n channelId: this._channelId,\n source: 'local_user',\n });\n\n // Call server\n try {\n await this.graphqlClient.setSystemInstruction(this.id, this._channelId, instruction);\n } catch (error) {\n this.logger.error('[RoolChannel] Failed to set system instruction:', error);\n this._channel = previous;\n throw error;\n }\n }\n\n // ===========================================================================\n // Metadata Operations\n // ===========================================================================\n\n /**\n * Set a space-level metadata value.\n * Metadata is stored in meta and hidden from AI operations.\n */\n setMetadata(key: string, value: unknown): void {\n this._meta[key] = value;\n this.emit('metadataUpdated', { metadata: this._meta, source: 'local_user' });\n\n // Fire-and-forget server call\n this.graphqlClient.setSpaceMeta(this.id, this._meta, this._channelId)\n .catch((error) => {\n this.logger.error('[RoolChannel] Failed to set meta:', error);\n });\n }\n\n /**\n * Get a space-level metadata value.\n */\n getMetadata(key: string): unknown {\n return this._meta[key];\n }\n\n /**\n * Get all space-level metadata.\n */\n getAllMetadata(): Record<string, unknown> {\n return this._meta;\n }\n\n // ===========================================================================\n // AI Operations\n // ===========================================================================\n\n /**\n * Send a prompt to the AI agent for space manipulation.\n * @returns The message from the AI and the list of objects that were created or modified\n */\n async prompt(prompt: string, options?: PromptOptions): Promise<{ message: string; objects: RoolObject[] }> {\n // Upload attachments via media endpoint, then send URLs to the server\n const { attachments, ...rest } = options ?? {};\n let attachmentUrls: string[] | undefined;\n if (attachments?.length) {\n attachmentUrls = await Promise.all(\n attachments.map(file => this.mediaClient.upload(this._id, file))\n );\n }\n\n const result = await this.graphqlClient.prompt(this._id, prompt, this._channelId, { ...rest, attachmentUrls });\n\n // Collect modified objects — they arrive via SSE events during/after the mutation.\n // Try collecting from buffer first, then fetch any missing from server.\n const objects: RoolObject[] = [];\n const missing: string[] = [];\n\n for (const id of result.modifiedObjectIds) {\n const buffered = this._objectBuffer.get(id);\n if (buffered) {\n this._objectBuffer.delete(id);\n objects.push(buffered);\n } else {\n missing.push(id);\n }\n }\n\n // Fetch any objects not yet received via SSE\n if (missing.length > 0) {\n const fetched = await Promise.all(\n missing.map(id => this.graphqlClient.getObject(this._id, id))\n );\n for (const obj of fetched) {\n if (obj) objects.push(obj);\n }\n }\n\n return {\n message: result.message,\n objects,\n };\n }\n\n // ===========================================================================\n // Channel Admin\n // ===========================================================================\n\n /**\n * Rename this channel.\n */\n async rename(newName: string): Promise<void> {\n await this.graphqlClient.renameChannel(this._id, this._channelId, newName);\n }\n\n // ===========================================================================\n // Media Operations\n // ===========================================================================\n\n /**\n * List all media files for this space.\n */\n async listMedia(): Promise<MediaInfo[]> {\n return this.mediaClient.list(this._id);\n }\n\n /**\n * Upload a file to this space. Returns the URL.\n */\n async uploadMedia(\n file: File | Blob | { data: string; contentType: string }\n ): Promise<string> {\n return this.mediaClient.upload(this._id, file);\n }\n\n /**\n * Fetch any URL, returning headers and a blob() method (like fetch Response).\n * Adds auth headers for backend media URLs, fetches external URLs via server proxy if CORS blocks.\n * Pass `{ forceProxy: true }` to skip the direct fetch and go straight through the server proxy.\n */\n async fetchMedia(url: string, options?: { forceProxy?: boolean }): Promise<MediaResponse> {\n return this.mediaClient.fetch(this._id, url, options);\n }\n\n /**\n * Delete a media file by URL.\n */\n async deleteMedia(url: string): Promise<void> {\n return this.mediaClient.delete(this._id, url);\n }\n\n // ===========================================================================\n // Object Collection (internal)\n // ===========================================================================\n\n /**\n * Register a collector that resolves when the object arrives via SSE.\n * If the object is already in the buffer (arrived before collector), resolves immediately.\n * @internal\n */\n private _collectObject(objectId: string): Promise<RoolObject> {\n return new Promise<RoolObject>((resolve, reject) => {\n // Check buffer first — SSE event may have arrived before the HTTP response\n const buffered = this._objectBuffer.get(objectId);\n if (buffered) {\n this._objectBuffer.delete(objectId);\n resolve(buffered);\n return;\n }\n\n const timer = setTimeout(() => {\n this._objectResolvers.delete(objectId);\n // Fallback: try to fetch from server\n this.graphqlClient.getObject(this._id, objectId).then(obj => {\n if (obj) {\n resolve(obj);\n } else {\n reject(new Error(`Timeout waiting for object ${objectId} from SSE`));\n }\n }).catch(reject);\n }, OBJECT_COLLECT_TIMEOUT);\n\n this._objectResolvers.set(objectId, (obj) => {\n clearTimeout(timer);\n resolve(obj);\n });\n });\n }\n\n /**\n * Cancel a pending object collector (e.g., on mutation error).\n * @internal\n */\n private _cancelCollector(objectId: string): void {\n this._objectResolvers.delete(objectId);\n this._objectBuffer.delete(objectId);\n }\n\n /**\n * Deliver an object to a pending collector, or buffer it for later collection.\n * @internal\n */\n private _deliverObject(objectId: string, object: RoolObject): void {\n const resolver = this._objectResolvers.get(objectId);\n if (resolver) {\n resolver(object);\n this._objectResolvers.delete(objectId);\n } else {\n // Buffer for prompt() or late collectors\n this._objectBuffer.set(objectId, object);\n }\n }\n\n // ===========================================================================\n // Event Handlers (internal - handles space subscription events)\n // ===========================================================================\n\n /**\n * Handle a channel event from the subscription.\n * @internal\n */\n private handleChannelEvent(event: ChannelEvent): void {\n // Ignore events after close - the channel is being torn down\n if (this._closed) return;\n\n const changeSource: ChangeSource = event.source === 'agent' ? 'remote_agent' : 'remote_user';\n\n switch (event.type) {\n case 'object_created':\n if (event.objectId && event.object) {\n if (event.objectStat) this._objectStats.set(event.objectId, event.objectStat);\n this._handleObjectCreated(event.objectId, event.object, changeSource);\n }\n break;\n\n case 'object_updated':\n if (event.objectId && event.object) {\n if (event.objectStat) this._objectStats.set(event.objectId, event.objectStat);\n this._handleObjectUpdated(event.objectId, event.object, changeSource);\n }\n break;\n\n case 'object_deleted':\n if (event.objectId) {\n this._objectStats.delete(event.objectId);\n this._handleObjectDeleted(event.objectId, changeSource);\n }\n break;\n\n case 'schema_updated':\n if (event.schema) {\n this._schema = event.schema;\n }\n break;\n\n case 'metadata_updated':\n if (event.metadata) {\n this._meta = event.metadata;\n this.emit('metadataUpdated', { metadata: this._meta, source: changeSource });\n }\n break;\n\n case 'channel_updated':\n // Only update if it's our channel\n if (event.channelId === this._channelId && event.channel) {\n this._channel = event.channel;\n this.emit('channelUpdated', { channelId: event.channelId, source: changeSource });\n }\n break;\n\n case 'space_changed':\n // Full reload needed (undo/redo, bulk operations)\n void this.graphqlClient.openChannel(this._id, this._channelId).then((result) => {\n if (this._closed) return;\n this._meta = result.meta;\n this._schema = result.schema;\n this._channel = result.channel;\n this._objectIds = result.objectIds;\n this._objectStats = new Map(Object.entries(result.objectStats));\n this.emit('reset', { source: changeSource });\n });\n break;\n }\n }\n\n /**\n * Handle an object_created SSE event.\n * Deduplicates against optimistic local creates.\n * @internal\n */\n private _handleObjectCreated(objectId: string, object: RoolObject, source: ChangeSource): void {\n // Deliver to any pending collector (for mutation return values)\n this._deliverObject(objectId, object);\n\n // Maintain local ID list — prepend (most recently modified first)\n this._objectIds = [objectId, ...this._objectIds.filter(id => id !== objectId)];\n\n const pending = this._pendingMutations.get(objectId);\n if (pending !== undefined) {\n // This is our own mutation echoed back\n this._pendingMutations.delete(objectId);\n\n if (pending !== null) {\n // It was a create — already emitted objectCreated optimistically.\n // Emit objectUpdated only if AI resolved placeholders (data changed).\n if (JSON.stringify(pending) !== JSON.stringify(object)) {\n this.emit('objectUpdated', { objectId, object, source });\n }\n }\n } else {\n // Remote event — emit normally\n this.emit('objectCreated', { objectId, object, source });\n }\n }\n\n /**\n * Handle an object_updated SSE event.\n * Deduplicates against optimistic local updates.\n * @internal\n */\n private _handleObjectUpdated(objectId: string, object: RoolObject, source: ChangeSource): void {\n // Deliver to any pending collector\n this._deliverObject(objectId, object);\n\n // Maintain local ID list — move to front (most recently modified)\n this._objectIds = [objectId, ...this._objectIds.filter(id => id !== objectId)];\n\n const pending = this._pendingMutations.get(objectId);\n if (pending !== undefined) {\n // This is our own mutation echoed back\n this._pendingMutations.delete(objectId);\n\n if (pending !== null) {\n // Already emitted objectUpdated optimistically.\n // Emit again only if data changed (AI resolved placeholders).\n if (JSON.stringify(pending) !== JSON.stringify(object)) {\n this.emit('objectUpdated', { objectId, object, source });\n }\n }\n } else {\n // Remote event\n this.emit('objectUpdated', { objectId, object, source });\n }\n }\n\n /**\n * Handle an object_deleted SSE event.\n * Deduplicates against optimistic local deletes.\n * @internal\n */\n private _handleObjectDeleted(objectId: string, source: ChangeSource): void {\n // Remove from local ID list\n this._objectIds = this._objectIds.filter(id => id !== objectId);\n\n const pending = this._pendingMutations.get(objectId);\n if (pending !== undefined) {\n // This is our own delete echoed back — already emitted\n this._pendingMutations.delete(objectId);\n } else {\n // Remote event\n this.emit('objectDeleted', { objectId, source });\n }\n }\n}\n","// =============================================================================\n// RoolSpace — Lightweight handle for space-level admin operations\n// =============================================================================\n\nimport type { GraphQLClient } from './graphql.js';\nimport type { MediaClient } from './media.js';\nimport type { RoolChannel } from './channel.js';\nimport type {\n RoolUserRole,\n LinkAccess,\n SpaceMember,\n ChannelInfo,\n} from './types.js';\n\nexport interface SpaceConfig {\n id: string;\n name: string;\n role: RoolUserRole;\n linkAccess: LinkAccess;\n /** Initial channel summaries (for getChannels without a round-trip) */\n channels: ChannelInfo[];\n graphqlClient: GraphQLClient;\n mediaClient: MediaClient;\n /** Callback to open a channel via the client */\n openChannelFn: (spaceId: string, channelId: string) => Promise<RoolChannel>;\n}\n\n/**\n * A space is a container for objects, schema, metadata, and channels.\n *\n * RoolSpace is a lightweight handle for space-level admin operations:\n * user management, link access, channel management, and export.\n * It does not have a real-time subscription — use channels for live data.\n *\n * To work with objects and AI, open a channel on the space.\n */\nexport class RoolSpace {\n private _id: string;\n private _name: string;\n private _role: RoolUserRole;\n private _linkAccess: LinkAccess;\n private _channels: ChannelInfo[];\n private graphqlClient: GraphQLClient;\n private mediaClient: MediaClient;\n private _openChannelFn: (spaceId: string, channelId: string) => Promise<RoolChannel>;\n\n constructor(config: SpaceConfig) {\n this._id = config.id;\n this._name = config.name;\n this._role = config.role;\n this._linkAccess = config.linkAccess;\n this._channels = config.channels;\n this.graphqlClient = config.graphqlClient;\n this.mediaClient = config.mediaClient;\n this._openChannelFn = config.openChannelFn;\n }\n\n // ===========================================================================\n // Properties\n // ===========================================================================\n\n get id(): string { return this._id; }\n get name(): string { return this._name; }\n get role(): RoolUserRole { return this._role; }\n get linkAccess(): LinkAccess { return this._linkAccess; }\n\n // ===========================================================================\n // Channel Lifecycle\n // ===========================================================================\n\n /**\n * Open a channel on this space.\n * If the channel doesn't exist, the server creates it.\n */\n async openChannel(channelId: string): Promise<RoolChannel> {\n return this._openChannelFn(this._id, channelId);\n }\n\n // ===========================================================================\n // Space Admin\n // ===========================================================================\n\n /**\n * Rename this space.\n */\n async rename(newName: string): Promise<void> {\n await this.graphqlClient.renameSpace(this._id, newName);\n this._name = newName;\n }\n\n /**\n * Delete this space permanently. Cannot be undone.\n */\n async delete(): Promise<void> {\n await this.graphqlClient.deleteSpace(this._id);\n }\n\n // ===========================================================================\n // User Management\n // ===========================================================================\n\n /**\n * List users with access to this space.\n */\n async listUsers(): Promise<SpaceMember[]> {\n return this.graphqlClient.listSpaceUsers(this._id);\n }\n\n /**\n * Add a user to this space with specified role.\n */\n async addUser(userId: string, role: RoolUserRole): Promise<void> {\n return this.graphqlClient.addSpaceUser(this._id, userId, role);\n }\n\n /**\n * Remove a user from this space.\n */\n async removeUser(userId: string): Promise<void> {\n return this.graphqlClient.removeSpaceUser(this._id, userId);\n }\n\n /**\n * Set the link sharing level for this space.\n * Requires owner or admin role.\n */\n async setLinkAccess(linkAccess: LinkAccess): Promise<void> {\n const previous = this._linkAccess;\n this._linkAccess = linkAccess;\n try {\n await this.graphqlClient.setLinkAccess(this._id, linkAccess);\n } catch (error) {\n this._linkAccess = previous;\n throw error;\n }\n }\n\n // ===========================================================================\n // Channel Management\n // ===========================================================================\n\n /**\n * List channels in this space.\n * Returns from cached snapshot (populated at open time).\n * Call refresh() to update from server.\n */\n getChannels(): ChannelInfo[] {\n return this._channels;\n }\n\n /**\n * Delete a channel from this space.\n */\n async deleteChannel(channelId: string): Promise<void> {\n await this.graphqlClient.deleteChannel(this._id, channelId);\n this._channels = this._channels.filter(c => c.id !== channelId);\n }\n\n // ===========================================================================\n // Export\n // ===========================================================================\n\n /**\n * Export space data and media as a zip archive.\n */\n async exportArchive(): Promise<Blob> {\n return this.mediaClient.exportArchive(this._id);\n }\n\n // ===========================================================================\n // Refresh\n // ===========================================================================\n\n /**\n * Refresh space data from the server.\n * Updates name, role, linkAccess, and channel list.\n */\n async refresh(): Promise<void> {\n const { name, role, linkAccess, channels } = await this.graphqlClient.openSpace(this._id);\n this._name = name;\n this._role = role as RoolUserRole;\n this._linkAccess = linkAccess;\n this._channels = channels;\n }\n}\n","// =============================================================================\n// Logger\n// =============================================================================\n\n/**\n * Logger interface accepted by RoolClient.\n * Compatible with `console` — pass `{ logger: console }` for quick debugging.\n */\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n}\n\n/** Default logger — only surfaces errors via console.error. */\nexport const defaultLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error(message, ...args) {\n console.error(message, ...args);\n },\n};\n","// =============================================================================\n// Rool Client\n// =============================================================================\n\nimport { EventEmitter } from './event-emitter.js';\nimport { AuthManager } from './auth.js';\nimport { GraphQLClient } from './graphql.js';\nimport { ClientSubscriptionManager } from './subscription.js';\nimport { MediaClient } from './media.js';\nimport { AppsClient } from './apps.js';\nimport { RoolChannel, generateEntityId } from './channel.js';\nimport { RoolSpace } from './space.js';\nimport { defaultLogger, type Logger } from './logger.js';\nimport type {\n RoolClientConfig,\n RoolClientEvents,\n RoolSpaceInfo,\n RoolUserRole,\n LinkAccess,\n ClientEvent,\n CurrentUser,\n UserResult,\n AuthUser,\n ConnectionState,\n PublishedAppInfo,\n PublishAppOptions,\n} from './types.js';\n\ntype ResolvedUrls = {\n graphql: string;\n media: string;\n auth: string;\n apps: string;\n};\n\n/**\n * Rool Client - Manages authentication, space lifecycle, and shared infrastructure.\n *\n * The client is lightweight - most operations happen on RoolChannel instances.\n *\n * Features:\n * - Authentication (login, logout, token management)\n * - Space lifecycle (list, create, delete, rename)\n * - Channel management (open, list, rename, delete)\n * - Client-level subscription for lifecycle events\n * - User storage (cross-device key-value storage)\n */\nexport class RoolClient extends EventEmitter<RoolClientEvents> {\n private baseUrl: string;\n private urls: ResolvedUrls;\n private authManager: AuthManager;\n private graphqlClient: GraphQLClient;\n private subscriptionManager: ClientSubscriptionManager | null = null;\n private logger: Logger;\n\n // Registry of open channels (for cleanup on logout/destroy)\n private openChannels = new Map<string, RoolChannel>();\n\n // User storage cache (synced to localStorage)\n private _storageCache: Record<string, unknown> = {};\n\n // Current user (fetched during initialize)\n private _currentUser: CurrentUser | null = null;\n\n constructor(config: RoolClientConfig = {}) {\n super();\n\n this.logger = config.logger ?? defaultLogger;\n this._emitterLogger = this.logger;\n\n this.baseUrl = (config.baseUrl ?? 'https://api.rool.dev').replace(/\\/+$/, ''); // Remove trailing slashes\n this.urls = {\n graphql: config.graphqlUrl ?? `${this.baseUrl}/graphql`,\n media: config.mediaUrl ?? `${this.baseUrl}/media`,\n auth: config.authUrl ?? `${this.baseUrl}/auth`,\n apps: `${this.baseUrl}/apps`,\n };\n\n this.authManager = new AuthManager({\n authUrl: this.urls.auth,\n authProvider: config.authProvider,\n logger: this.logger,\n onAuthStateChanged: (authenticated) => {\n this.emit('authStateChanged', authenticated);\n },\n });\n\n this.graphqlClient = new GraphQLClient({\n graphqlUrl: this.urls.graphql,\n authManager: this.authManager,\n });\n\n // Load storage cache from localStorage\n this.loadStorageCache();\n }\n\n // ===========================================================================\n // Initialization\n // ===========================================================================\n\n /**\n * Initialize the client - should be called on app startup.\n * Processes any auth callback in the URL, sets up auto-refresh,\n * and starts real-time event subscription if authenticated.\n * @returns true if authenticated, false otherwise\n */\n async initialize(): Promise<boolean> {\n this.authManager.initialize();\n const authenticated = await this.isAuthenticated();\n if (authenticated) {\n // Sync storage from server (replaces potentially stale localStorage cache)\n try {\n const user = await this.getCurrentUser();\n this._currentUser = user;\n this._storageCache = user.storage ?? {};\n this.saveStorageCache();\n } catch (error) {\n // Non-fatal: proceed with cached storage, SSE will sync changes\n this.logger.warn('[RoolClient] Failed to sync user storage:', error);\n }\n await this.ensureSubscribed();\n }\n return authenticated;\n }\n\n /**\n * Clean up resources - call when destroying the client.\n */\n destroy(): void {\n this.authManager.destroy();\n this.subscriptionManager?.destroy();\n\n // Close all open channels\n for (const channel of this.openChannels.values()) {\n channel.close();\n }\n this.openChannels.clear();\n\n this.removeAllListeners();\n }\n\n // ===========================================================================\n // Authentication\n // ===========================================================================\n\n /**\n * Initiate login by redirecting to auth page.\n * @param appName - The name of the application requesting login (displayed on auth page)\n */\n async login(appName: string): Promise<void> {\n return this.authManager.login(appName);\n }\n\n /**\n * Logout - clear all tokens and state.\n */\n logout(): void {\n this.authManager.logout();\n this.unsubscribe();\n\n // Close all open channels\n for (const channel of this.openChannels.values()) {\n channel.close();\n }\n this.openChannels.clear();\n }\n\n /**\n * Process auth callback from URL fragment.\n * Called automatically by initialize(), but can be called manually.\n */\n processAuthCallback(): boolean {\n return this.authManager.processCallback();\n }\n\n /**\n * Check if user is currently authenticated (validates token is usable).\n */\n async isAuthenticated(): Promise<boolean> {\n return this.authManager.isAuthenticated();\n }\n\n /**\n * Make an authenticated fetch request to the Rool API.\n * Use this escape hatch for app-specific endpoints not covered by the typed API.\n *\n * @param path - Path relative to the base URL (e.g., '/billing/usage')\n * @param init - Standard fetch RequestInit options. Authorization header is added automatically.\n */\n async fetch(path: string, init?: RequestInit): Promise<Response> {\n const tokens = await this.authManager.getTokens();\n if (!tokens) throw new Error('Not authenticated');\n\n const headers = new Headers(init?.headers);\n headers.set('Authorization', `Bearer ${tokens.accessToken}`);\n headers.set('X-Rool-Token', tokens.roolToken);\n\n return fetch(`${this.baseUrl}${path}`, { ...init, headers });\n }\n\n /**\n * Get auth identity decoded from JWT token.\n * For the Rool user (with server-assigned id), use currentUser.\n */\n getAuthUser(): AuthUser {\n return this.authManager.getAuthUser();\n }\n\n /**\n * Get the current Rool user (cached from initialize).\n * Available after successful authentication.\n */\n get currentUser(): CurrentUser | null {\n return this._currentUser;\n }\n\n // ===========================================================================\n // Space Lifecycle\n // ===========================================================================\n\n /**\n * List all spaces accessible to the user.\n */\n async listSpaces(): Promise<RoolSpaceInfo[]> {\n return this.graphqlClient.listSpaces();\n }\n\n /**\n * Open a channel (space + channelId pair).\n * Loads the space data from the server and returns a RoolChannel instance.\n * The channel manages its own real-time subscription.\n * If the channel doesn't exist, the server creates it.\n *\n * @param spaceId - The ID of the space\n * @param channelId - The channel ID\n */\n async openChannel(spaceId: string, channelId: string): Promise<RoolChannel> {\n if (!channelId || channelId.length > 32 || !/^[a-zA-Z0-9_-]+$/.test(channelId)) {\n throw new Error('channelId must be 1–32 characters containing only alphanumeric characters, hyphens, and underscores');\n }\n\n // Ensure client subscription is active (for lifecycle events)\n void this.ensureSubscribed();\n\n const result = await this.graphqlClient.openChannel(spaceId, channelId);\n\n const channel = new RoolChannel({\n id: spaceId,\n name: result.name,\n role: result.role as RoolUserRole,\n linkAccess: result.linkAccess,\n userId: result.userId,\n objectIds: result.objectIds,\n objectStats: result.objectStats,\n schema: result.schema,\n meta: result.meta,\n channel: result.channel,\n channelId,\n graphqlClient: this.graphqlClient,\n mediaClient: this.mediaClient,\n graphqlUrl: this.urls.graphql,\n authManager: this.authManager,\n logger: this.logger,\n onClose: (id) => this.unregisterChannel(id),\n });\n\n // Wait for real-time subscription before returning\n await channel._waitForSubscription();\n\n // Register for cleanup\n this.registerChannel(spaceId, channel);\n\n return channel;\n }\n\n /**\n * Open a space for admin operations.\n * Returns a lightweight handle for user management, link access,\n * channel management, and export. Does not start a real-time subscription.\n *\n * To work with objects and AI, call space.openChannel(channelId).\n */\n async openSpace(spaceId: string): Promise<RoolSpace> {\n const { name, role, linkAccess, channels } = await this.graphqlClient.openSpace(spaceId);\n\n return new RoolSpace({\n id: spaceId,\n name,\n role: role as RoolUserRole,\n linkAccess,\n channels,\n graphqlClient: this.graphqlClient,\n mediaClient: this.mediaClient,\n openChannelFn: (sid, cid) => this.openChannel(sid, cid),\n });\n }\n\n /**\n * Create a new space.\n * Returns a RoolSpace handle for admin operations.\n * Call space.openChannel(channelId) to start working with objects.\n */\n async createSpace(name: string): Promise<RoolSpace> {\n // Ensure client subscription is active (for lifecycle events)\n void this.ensureSubscribed();\n\n const { spaceId } = await this.graphqlClient.createSpace(name);\n\n return new RoolSpace({\n id: spaceId,\n name,\n role: 'owner',\n linkAccess: 'none',\n channels: [],\n graphqlClient: this.graphqlClient,\n mediaClient: this.mediaClient,\n openChannelFn: (sid, cid) => this.openChannel(sid, cid),\n });\n }\n\n /**\n * Rename a channel in a space.\n * Lightweight — single GraphQL mutation, no subscription needed.\n */\n async renameChannel(spaceId: string, channelId: string, name: string): Promise<void> {\n await this.graphqlClient.renameChannel(spaceId, channelId, name);\n }\n\n /**\n * Delete a channel from a space.\n * Lightweight — single GraphQL mutation, no subscription needed.\n */\n async deleteChannel(spaceId: string, channelId: string): Promise<void> {\n await this.graphqlClient.deleteChannel(spaceId, channelId);\n }\n\n /**\n * Delete a space.\n * Note: This does not affect any open Channel instances - they become stale.\n */\n async deleteSpace(spaceId: string): Promise<void> {\n await this.graphqlClient.deleteSpace(spaceId);\n // Client-level event will be emitted via SSE subscription\n }\n\n /**\n * Import a space from a zip archive.\n * Creates a new space with the given name and imports objects, relations, and media.\n * Returns a RoolSpace handle.\n */\n async importArchive(name: string, archive: Blob): Promise<RoolSpace> {\n // Ensure client subscription is active (for lifecycle events)\n void this.ensureSubscribed();\n\n // Import via REST endpoint (creates the space)\n const spaceId = await this.mediaClient.importArchive(name, archive);\n\n // Open the space to get its data\n return this.openSpace(spaceId);\n }\n\n // ===========================================================================\n // User Operations\n // ===========================================================================\n\n /**\n * Get the current Rool user from the server.\n * Returns the user's server-assigned id, email, plan, and credits.\n */\n async getCurrentUser(): Promise<CurrentUser> {\n const user = await this.graphqlClient.getAccount();\n this._currentUser = user;\n return user;\n }\n\n /**\n * Search for a user by email.\n */\n async searchUser(email: string): Promise<UserResult | null> {\n return this.graphqlClient.searchUser(email);\n }\n\n /**\n * Set the current user's slug (used in app publishing URLs).\n * Slug must be 3-32 characters, start with a letter, and contain only\n * lowercase letters, numbers, hyphens, and underscores.\n * Cannot be changed if the user has published apps.\n */\n async setSlug(slug: string): Promise<void> {\n return this.graphqlClient.setSlug(slug);\n }\n\n // ===========================================================================\n // App Publishing\n // ===========================================================================\n\n /**\n * Publish an app. The app will be accessible at:\n * https://{appId}.rool.app/\n *\n * @param appId - URL-safe identifier (alphanumeric, hyphens, underscores; case-insensitive, lowercased by server)\n * @param options - App name, bundle (zip file), and optional SPA flag\n */\n async publishApp(appId: string, options: PublishAppOptions): Promise<PublishedAppInfo> {\n return this.appsClient.publish(appId, options);\n }\n\n /**\n * Unpublish an app.\n */\n async unpublishApp(appId: string): Promise<void> {\n return this.appsClient.unpublish(appId);\n }\n\n /**\n * List all published apps for the current user.\n */\n async listApps(): Promise<PublishedAppInfo[]> {\n return this.appsClient.list();\n }\n\n /**\n * Get info for a specific published app.\n * Returns null if the app doesn't exist.\n */\n async getAppInfo(appId: string): Promise<PublishedAppInfo | null> {\n return this.appsClient.get(appId);\n }\n\n // ===========================================================================\n // User Storage (server-side localStorage equivalent)\n // ===========================================================================\n\n /**\n * Get a value from user storage (sync read from local cache).\n * Returns undefined if key doesn't exist.\n */\n getUserStorage<T = unknown>(key: string): T | undefined {\n return this._storageCache[key] as T | undefined;\n }\n\n /**\n * Set a value in user storage.\n * Updates local cache immediately, then syncs to server.\n * Pass undefined/null to delete the key.\n * Storage is limited to 10MB total.\n */\n setUserStorage(key: string, value: unknown): void {\n // Update local cache\n if (value === null || value === undefined) {\n delete this._storageCache[key];\n } else {\n this._storageCache[key] = value;\n }\n\n // Persist to localStorage\n this.saveStorageCache();\n\n // Emit event (local source)\n this.emit('userStorageChanged', { key, value: value ?? null, source: 'local' });\n\n // Fire-and-forget server sync\n this.graphqlClient.setUserStorage(key, value).catch((error) => {\n this.logger.error('[RoolClient] Failed to sync user storage:', error);\n this.emit('error', error instanceof Error ? error : new Error(String(error)), 'userStorage');\n });\n }\n\n /**\n * Get all user storage data (sync read from local cache).\n */\n getAllUserStorage(): Record<string, unknown> {\n return { ...this._storageCache };\n }\n\n // ===========================================================================\n // Media Client (used internally by Space instances)\n // ===========================================================================\n\n private get mediaClient(): MediaClient {\n return new MediaClient({\n mediaUrl: this.urls.media,\n backendOrigin: new URL(this.urls.media).origin,\n authManager: this.authManager,\n });\n }\n\n // ===========================================================================\n // Apps Client (used for app publishing)\n // ===========================================================================\n\n private get appsClient(): AppsClient {\n return new AppsClient({\n appsUrl: this.urls.apps,\n authManager: this.authManager,\n });\n }\n\n // ===========================================================================\n // Subscriptions (internal - auto-managed)\n // ===========================================================================\n\n /**\n * Ensure the client-level event subscription is active.\n * Called automatically when opening spaces.\n * Also fetches and caches the current user ID.\n * @internal\n */\n private async ensureSubscribed(): Promise<void> {\n if (this.subscriptionManager) return;\n\n this.subscriptionManager = new ClientSubscriptionManager({\n graphqlUrl: this.urls.graphql,\n authManager: this.authManager,\n logger: this.logger,\n onEvent: (event) => this.handleClientEvent(event),\n onConnectionStateChanged: (state: ConnectionState) => {\n this.emit('connectionStateChanged', state);\n },\n onError: (error) => {\n this.emit('error', error, 'subscription');\n },\n });\n\n await this.subscriptionManager.subscribe();\n }\n\n /**\n * Disconnect from real-time events.\n * @internal\n */\n private unsubscribe(): void {\n if (this.subscriptionManager) {\n this.subscriptionManager.destroy();\n this.subscriptionManager = null;\n }\n }\n\n // ===========================================================================\n // Utilities\n // ===========================================================================\n\n /**\n * Generate a unique entity ID.\n * 6-character alphanumeric string (62^6 = 56.8 billion possible values).\n * Also available as top-level generateEntityId() export.\n */\n static generateId(): string {\n return generateEntityId();\n }\n\n /**\n * Execute an arbitrary GraphQL query or mutation.\n * Use this escape hatch for app-specific operations not covered by the typed API.\n * \n * @example\n * const result = await client.graphql<{ lastMessages: Message[] }>(\n * `query trace($spaceId: String!) { trace(spaceId: $spaceId) }`,\n * { spaceId: 'abc123' }\n * );\n */\n async graphql<T>(\n query: string,\n variables?: Record<string, unknown>\n ): Promise<T> {\n return this.graphqlClient.query<T>(query, variables);\n }\n\n // ===========================================================================\n // Private Methods - Channel Registry\n // ===========================================================================\n\n private registerChannel(spaceId: string, channel: RoolChannel): void {\n this.openChannels.set(spaceId, channel);\n }\n\n private unregisterChannel(spaceId: string): void {\n this.openChannels.delete(spaceId);\n }\n\n // ===========================================================================\n // Private Methods - Event Handling\n // ===========================================================================\n\n /**\n * Handle a client-level event from the subscription.\n * @internal\n */\n private handleClientEvent(event: ClientEvent): void {\n switch (event.type) {\n case 'space_created':\n this.emit('spaceAdded', {\n id: event.spaceId!,\n name: event.name ?? event.spaceId!,\n role: (event.role as RoolUserRole) ?? 'owner',\n ownerId: event.ownerId ?? '',\n size: event.size ?? 0,\n createdAt: event.createdAt ?? new Date().toISOString(),\n updatedAt: event.updatedAt ?? new Date().toISOString(),\n linkAccess: 'none', // New spaces default to no link access\n });\n break;\n\n case 'space_deleted':\n this.emit('spaceRemoved', event.spaceId!);\n break;\n\n case 'space_renamed':\n this.emit('spaceRenamed', event.spaceId!, event.name ?? event.spaceId!);\n break;\n\n case 'space_access_changed':\n if (event.role === 'none') {\n // Access revoked - remove from list\n this.emit('spaceRemoved', event.spaceId!);\n } else {\n // Access granted or changed - add/update in list\n this.emit('spaceAdded', {\n id: event.spaceId!,\n name: event.name!,\n role: event.role as RoolUserRole,\n ownerId: event.ownerId!,\n size: event.size!,\n createdAt: event.createdAt!,\n updatedAt: event.updatedAt!,\n linkAccess: (event.linkAccess as LinkAccess) ?? 'none',\n });\n }\n break;\n\n case 'user_storage_changed':\n this.handleUserStorageChanged(event.key!, event.value);\n break;\n\n case 'channel_created':\n this.emit('channelCreated', event.spaceId!, {\n id: event.channelId!,\n name: event.name ?? null,\n createdAt: event.channelCreatedAt ?? Date.now(),\n createdBy: event.channelCreatedBy ?? '',\n createdByName: event.channelCreatedByName ?? null,\n interactionCount: 0,\n });\n break;\n\n case 'channel_renamed':\n this.emit('channelRenamed', event.spaceId!, event.channelId!, event.name ?? '');\n break;\n\n case 'channel_deleted':\n this.emit('channelDeleted', event.spaceId!, event.channelId!);\n break;\n }\n }\n\n // ===========================================================================\n // Private Methods - User Storage Cache\n // ===========================================================================\n\n /**\n * Load storage cache from auth provider.\n * @internal\n */\n private loadStorageCache(): void {\n const cached = this.authManager.getStorage();\n if (cached) {\n this._storageCache = cached;\n }\n }\n\n /**\n * Save storage cache via auth provider.\n * @internal\n */\n private saveStorageCache(): void {\n this.authManager.setStorage(this._storageCache);\n }\n\n /**\n * Handle a user storage change from SSE (remote update).\n * Updates cache and emits event if value actually changed.\n * @internal\n */\n private handleUserStorageChanged(key: string, value: unknown): void {\n const currentValue = this._storageCache[key];\n\n // Only update and emit if value actually changed\n if (JSON.stringify(currentValue) !== JSON.stringify(value)) {\n if (value === null || value === undefined) {\n delete this._storageCache[key];\n } else {\n this._storageCache[key] = value;\n }\n\n this.saveStorageCache();\n this.emit('userStorageChanged', { key, value: value ?? null, source: 'remote' });\n }\n }\n}\n","/**\n * Bridge protocol types shared between app (client) and host.\n *\n * All communication between the sandboxed iframe and the host happens\n * via window.postMessage using these message shapes.\n */\n\n/** App → Host: invoke a channel method */\nexport interface BridgeRequest {\n type: 'rool:request';\n id: string;\n method: string;\n args: unknown[];\n}\n\n/** Host → App: result of a channel method call */\nexport interface BridgeResponse {\n type: 'rool:response';\n id: string;\n result?: unknown;\n error?: string;\n}\n\n/** Host → App: channel event pushed in real-time */\nexport interface BridgeEvent {\n type: 'rool:event';\n name: string;\n data: unknown;\n}\n\n/** App → Host: app is loaded and ready for handshake */\nexport interface BridgeReady {\n type: 'rool:ready';\n}\n\n/** Host → App: handshake response with channel metadata */\nexport interface BridgeInit {\n type: 'rool:init';\n channelId: string;\n spaceId: string;\n spaceName: string;\n role: string;\n linkAccess: string;\n userId: string;\n schema: Record<string, unknown>;\n metadata: Record<string, unknown>;\n}\n\nexport type BridgeMessage =\n | BridgeRequest\n | BridgeResponse\n | BridgeEvent\n | BridgeReady\n | BridgeInit;\n\n/** Type guard for bridge messages */\nexport function isBridgeMessage(data: unknown): data is BridgeMessage {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n typeof (data as BridgeMessage).type === 'string' &&\n (data as BridgeMessage).type.startsWith('rool:')\n );\n}\n","/**\n * @rool-dev/app/host — Host-side bridge for iframe-sandboxed apps.\n *\n * The host creates a `BridgeHost` with a real `BridgeableChannel` and an iframe.\n * It handles the handshake, proxies method calls, and forwards events.\n *\n * Used by both the console's AppHost component and the local dev shell.\n */\n\nimport type { BridgeRequest, BridgeInit } from './protocol.js';\nimport { isBridgeMessage } from './protocol.js';\n\n/**\n * Minimal channel interface accepted by the bridge host.\n * Works with both BridgeableChannel (SDK) and ReactiveChannel (@rool-dev/svelte).\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface BridgeableChannel {\n id: string;\n name: string;\n role: string;\n linkAccess: string;\n userId: string;\n channelId: string;\n getSchema(): Record<string, unknown>;\n getAllMetadata(): Record<string, unknown>;\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n}\n\n// Channel events to forward to the app\nconst FORWARDED_EVENTS = [\n 'objectCreated',\n 'objectUpdated',\n 'objectDeleted',\n 'metadataUpdated',\n 'channelUpdated',\n 'reset',\n 'syncError',\n] as const;\n\n// Channel methods the app can call.\n// Sync methods (getObjectIds, getSchema, etc.) are wrapped as async on the host side.\nconst ALLOWED_METHODS = new Set([\n 'getObject',\n 'stat',\n 'findObjects',\n 'getObjectIds',\n 'createObject',\n 'updateObject',\n 'deleteObjects',\n 'getSchema',\n 'createCollection',\n 'alterCollection',\n 'dropCollection',\n 'getInteractions',\n 'getSystemInstruction',\n 'setSystemInstruction',\n 'setMetadata',\n 'getMetadata',\n 'getAllMetadata',\n 'prompt',\n 'checkpoint',\n 'canUndo',\n 'canRedo',\n 'undo',\n 'redo',\n 'clearHistory',\n]);\n\nexport interface BridgeHostOptions {\n /** The real channel to proxy calls to */\n channel: BridgeableChannel;\n /** The iframe element hosting the app */\n iframe: HTMLIFrameElement;\n}\n\nexport class BridgeHost {\n private channel: BridgeableChannel;\n private iframe: HTMLIFrameElement;\n private eventCleanups: Array<() => void> = [];\n private _destroyed = false;\n\n constructor(options: BridgeHostOptions) {\n this.channel = options.channel;\n this.iframe = options.iframe;\n\n window.addEventListener('message', this._onMessage);\n\n // Forward channel events to the app iframe\n for (const eventName of FORWARDED_EVENTS) {\n const handler = (data: unknown) => {\n this._postToApp({\n type: 'rool:event',\n name: eventName,\n data,\n });\n };\n this.channel.on(eventName, handler);\n this.eventCleanups.push(() => {\n this.channel.off(eventName, handler);\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Handshake\n // ---------------------------------------------------------------------------\n\n private _sendInit(): void {\n const init: BridgeInit = {\n type: 'rool:init',\n channelId: this.channel.channelId,\n spaceId: this.channel.id,\n spaceName: this.channel.name,\n role: this.channel.role,\n linkAccess: this.channel.linkAccess,\n userId: this.channel.userId,\n schema: this.channel.getSchema(),\n metadata: this.channel.getAllMetadata(),\n };\n this._postToApp(init);\n }\n\n // ---------------------------------------------------------------------------\n // Message handling\n // ---------------------------------------------------------------------------\n\n private _onMessage = async (event: MessageEvent): Promise<void> => {\n // Only accept messages from our iframe\n if (event.source !== this.iframe.contentWindow) return;\n if (!isBridgeMessage(event.data)) return;\n\n if (event.data.type === 'rool:ready') {\n this._sendInit();\n return;\n }\n\n if (event.data.type === 'rool:request') {\n await this._handleRequest(event.data as BridgeRequest);\n return;\n }\n };\n\n private async _handleRequest(req: BridgeRequest): Promise<void> {\n const { id, method, args } = req;\n\n if (!ALLOWED_METHODS.has(method)) {\n this._postToApp({\n type: 'rool:response',\n id,\n error: `Method \"${method}\" is not available to apps`,\n });\n return;\n }\n\n try {\n // Get the method from the channel (cast for dynamic dispatch)\n const fn = (this.channel as unknown as Record<string, unknown>)[method];\n let result: unknown;\n\n if (typeof fn === 'function') {\n result = fn.apply(this.channel, args);\n // Await if it returns a promise\n if (result instanceof Promise) {\n result = await result;\n }\n } else {\n // Property access (shouldn't happen with current ALLOWED_METHODS, but just in case)\n result = fn;\n }\n\n this._postToApp({ type: 'rool:response', id, result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this._postToApp({ type: 'rool:response', id, error: message });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private _postToApp(message: object): void {\n if (this._destroyed) return;\n this.iframe.contentWindow?.postMessage(message, '*');\n }\n\n // ---------------------------------------------------------------------------\n // Cleanup\n // ---------------------------------------------------------------------------\n\n destroy(): void {\n this._destroyed = true;\n window.removeEventListener('message', this._onMessage);\n for (const cleanup of this.eventCleanups) {\n cleanup();\n }\n this.eventCleanups = [];\n }\n}\n\n/**\n * Create a bridge host that proxies a BridgeableChannel to an iframe.\n *\n * @example\n * ```typescript\n * const host = createBridgeHost({ channel, iframe });\n * // ... later\n * host.destroy();\n * ```\n */\nexport function createBridgeHost(options: BridgeHostOptions): BridgeHost {\n return new BridgeHost(options);\n}\n","/**\n * Shared manifest types and environment config.\n *\n * Browser-safe — no Node.js imports. Used by CLI code, the dev host shell,\n * and the publish command.\n */\n\n// ---------------------------------------------------------------------------\n// Manifest types\n// ---------------------------------------------------------------------------\n\nexport interface ManifestFieldDef {\n name: string;\n type: Record<string, unknown>;\n}\n\nexport interface ManifestCollections {\n write?: Record<string, ManifestFieldDef[]> | '*';\n read?: Record<string, ManifestFieldDef[]> | '*';\n}\n\nexport interface AppManifest {\n id: string;\n name: string;\n description?: string;\n systemInstruction?: string | null;\n collections?: ManifestCollections;\n [key: string]: unknown;\n}\n\nexport interface ManifestResult {\n manifest: AppManifest | null;\n error: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Environment config\n// ---------------------------------------------------------------------------\n\nexport type Environment = 'dev' | 'prod';\n\nexport interface EnvironmentConfig {\n baseUrl: string;\n authUrl: string;\n label: string;\n appsDomain: string;\n}\n\nexport const ENV_URLS: Record<Environment, EnvironmentConfig> = {\n dev: { baseUrl: 'https://api.dev.rool.dev', authUrl: 'https://api.dev.rool.dev/auth', label: 'api.dev.rool.dev', appsDomain: 'dev.rool.app' },\n prod: { baseUrl: 'https://api.rool.dev', authUrl: 'https://api.rool.dev/auth', label: 'api.rool.dev', appsDomain: 'rool.app' },\n};\n","/**\n * DevHostController — business logic for the dev host shell.\n *\n * Owns the RoolClient lifecycle, space management, channel-per-app management,\n * bridge hosting, and published app management. The Svelte component is a thin\n * view layer that reads this controller's state and calls its methods.\n *\n * The controller is self-sufficient: it manages the full lifecycle including\n * DOM flush (via injected tick) and bridge binding. Svelte components can call\n * controller methods directly without needing wrappers.\n */\n\nimport { RoolClient } from '@rool-dev/sdk';\nimport type { RoolSpaceInfo, RoolChannel, PublishedAppInfo } from '@rool-dev/sdk';\nimport { createBridgeHost, type BridgeHost } from '../host.js';\nimport type { AppManifest, Environment } from '../manifest.js';\nimport { ENV_URLS } from '../manifest.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AppTab {\n id: string; // 'local' or the published app ID\n name: string;\n url: string;\n isLocal: boolean;\n}\n\nexport type StatusState = 'ok' | 'loading' | 'off';\n\n// ---------------------------------------------------------------------------\n// localStorage helpers\n// ---------------------------------------------------------------------------\n\nfunction storageGet(key: string): string | null {\n try { return localStorage.getItem(key); } catch { return null; }\n}\n\nfunction storageSet(key: string, value: string | null) {\n try {\n if (value === null) localStorage.removeItem(key);\n else localStorage.setItem(key, value);\n } catch { /* ignore */ }\n}\n\n// ---------------------------------------------------------------------------\n// DevHostController\n// ---------------------------------------------------------------------------\n\nexport class DevHostController {\n // --- Config (immutable after construction) ---\n readonly channelId: string;\n readonly appUrl: string;\n readonly manifest: AppManifest | null;\n readonly manifestError: string | null;\n\n // --- SDK client ---\n client!: RoolClient;\n\n // --- Observable state (Svelte component mirrors these via $state) ---\n spaces: RoolSpaceInfo[] = [];\n currentSpaceId: string | null = null;\n statusText: string = 'Initializing...';\n statusState: StatusState = 'off';\n placeholderText: string | null = 'Authenticating...';\n env: Environment;\n publishedApps: PublishedAppInfo[] = [];\n installedAppIds: string[] = [];\n sidebarCollapsed: boolean = false;\n\n // --- Per-tab state (imperative, not rendered directly) ---\n private channels: Record<string, RoolChannel> = {};\n private iframeEls: Record<string, HTMLIFrameElement> = {};\n private bridgeHosts: Record<string, BridgeHost> = {};\n\n // --- Dependencies ---\n private _onChange: () => void;\n private _tick: () => Promise<void>;\n\n // --- Storage keys ---\n private _spaceKey: string;\n\n constructor(\n options: {\n channelId: string;\n appUrl: string;\n manifest: AppManifest | null;\n manifestError: string | null;\n },\n onChange: () => void,\n tick: () => Promise<void>,\n ) {\n this.channelId = options.channelId;\n this.appUrl = options.appUrl;\n this.manifest = options.manifest;\n this.manifestError = options.manifestError;\n this._onChange = onChange;\n this._tick = tick;\n\n this._spaceKey = `rool-devhost:${options.channelId}:space`;\n\n // Restore persisted state\n this.env = this._getSavedEnv();\n this.sidebarCollapsed = storageGet('rool-devhost:collapsed') === 'true';\n }\n\n // ---------------------------------------------------------------------------\n // Derived\n // ---------------------------------------------------------------------------\n\n get tabs(): AppTab[] {\n const localTab: AppTab = {\n id: 'local',\n name: this.manifest?.name ?? 'Local',\n url: this.appUrl,\n isLocal: true,\n };\n const appTabs: AppTab[] = this.installedAppIds\n .map((id) => {\n const app = this.publishedApps.find((a) => a.appId === id);\n if (!app) return null;\n return {\n id: app.appId,\n name: app.name,\n url: `https://${app.appId}.${ENV_URLS[this.env].appsDomain}`,\n isLocal: false,\n } as AppTab;\n })\n .filter((t): t is AppTab => t !== null);\n return [localTab, ...appTabs];\n }\n\n // ---------------------------------------------------------------------------\n // Bootstrap\n // ---------------------------------------------------------------------------\n\n async boot(): Promise<void> {\n const urls = ENV_URLS[this.env];\n this.client = new RoolClient({ baseUrl: urls.baseUrl, authUrl: urls.authUrl });\n const authenticated = await this.client.initialize();\n\n if (!authenticated) {\n this.placeholderText = 'Redirecting to login...';\n this.statusText = 'Authenticating...';\n this.statusState = 'loading';\n this._onChange();\n this.client.login('App Dev Host');\n return;\n }\n\n this.placeholderText = 'Loading spaces...';\n this.statusText = 'Loading spaces...';\n this.statusState = 'loading';\n this._onChange();\n\n const [spaceList, appList] = await Promise.all([\n this.client.listSpaces(),\n this.client.listApps().catch(() => [] as PublishedAppInfo[]),\n ]);\n\n this.spaces = spaceList;\n this.publishedApps = appList;\n\n this.client.on('spaceAdded', (space) => {\n if (!this.spaces.some((s) => s.id === space.id)) {\n this.spaces = [...this.spaces, space];\n this._onChange();\n }\n });\n this.client.on('spaceRemoved', (id) => {\n this.spaces = this.spaces.filter((s) => s.id !== id);\n if (this.currentSpaceId === id) {\n this.currentSpaceId = null;\n this.statusText = 'Disconnected';\n this.statusState = 'off';\n }\n this._onChange();\n });\n this.client.on('spaceRenamed', (id, name) => {\n this.spaces = this.spaces.map((s) => (s.id === id ? { ...s, name } : s));\n this._onChange();\n });\n\n this.statusText = 'Ready';\n this.statusState = 'off';\n\n const savedSpace = storageGet(this._spaceKey);\n if (savedSpace && this.spaces.some((s) => s.id === savedSpace)) {\n await this.selectSpace(savedSpace);\n } else {\n this.placeholderText = 'Select a space to load the app';\n this._onChange();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Space selection\n // ---------------------------------------------------------------------------\n\n async selectSpace(spaceId: string): Promise<void> {\n this._destroyAllBridgesAndChannels();\n\n this.currentSpaceId = spaceId;\n storageSet(this._spaceKey, spaceId);\n this.statusText = 'Opening channels...';\n this.statusState = 'loading';\n this.placeholderText = 'Opening channels...';\n this._onChange();\n\n try {\n // Open the local app's channel\n const localChannel = await this.client.openChannel(spaceId, this.channelId);\n this.channels['local'] = localChannel;\n\n // Apply manifest settings to the local channel\n await this._syncManifest(localChannel, this.manifest);\n\n // Discover installed apps: space channels whose ID matches a published app\n const space = await this.client.openSpace(spaceId);\n const spaceChannels = space.getChannels();\n const publishedAppIds = new Set(this.publishedApps.map((a) => a.appId));\n this.installedAppIds = spaceChannels\n .map((ch) => ch.id)\n .filter((id) => publishedAppIds.has(id) && id !== this.channelId);\n\n // Open channels for each installed app and sync their manifests\n for (const appId of this.installedAppIds) {\n try {\n const ch = await this.client.openChannel(spaceId, appId);\n this.channels[appId] = ch;\n\n const remoteManifest = await this._fetchRemoteManifest(appId);\n if (remoteManifest) {\n await this._syncManifest(ch, remoteManifest);\n }\n } catch (e) {\n console.error(`Failed to open channel for app ${appId}:`, e);\n }\n }\n\n // Show iframes, wait for DOM to mount them, then bind bridges\n this.placeholderText = null;\n this._onChange();\n await this._tick();\n this._bindAllBridges();\n\n const spaceName = this.spaces.find((s) => s.id === this.currentSpaceId)?.name ?? spaceId;\n this.statusText = `Connected \\u2014 ${spaceName}`;\n this.statusState = 'ok';\n this._onChange();\n } catch (e) {\n console.error('Failed to open channel:', e);\n this.placeholderText = `Error: ${e instanceof Error ? e.message : String(e)}`;\n this.statusText = 'Error';\n this.statusState = 'off';\n this._onChange();\n }\n }\n\n // ---------------------------------------------------------------------------\n // App installation / removal\n // ---------------------------------------------------------------------------\n\n /**\n * Install an app in the current space.\n *\n * Opens the channel first, THEN adds the tab. This ensures the channel\n * exists when the iframe mounts so registerIframe → _bindBridge can\n * connect the bridge before the app sends its init message.\n */\n async installApp(appId: string): Promise<void> {\n if (!this.currentSpaceId) return;\n if (this.installedAppIds.includes(appId)) return;\n\n try {\n // Step 1: open channel (creates it on server == install)\n const ch = await this.client.openChannel(this.currentSpaceId, appId);\n this.channels[appId] = ch;\n\n // Step 2: add the card, flush DOM, bind bridge\n this.installedAppIds = [...this.installedAppIds, appId];\n this._onChange();\n await this._tick();\n this._bindBridge(appId);\n\n // Step 3: fetch and apply the published app's manifest\n const remoteManifest = await this._fetchRemoteManifest(appId);\n if (remoteManifest) {\n await this._syncManifest(ch, remoteManifest);\n }\n } catch (e) {\n console.error(`Failed to install app ${appId}:`, e);\n this.installedAppIds = this.installedAppIds.filter((id) => id !== appId);\n this._onChange();\n }\n }\n\n /**\n * Uninstall an app from the current space.\n * Deletes the channel and removes the card.\n */\n removeApp(appId: string): void {\n this._destroyTab(appId);\n this.installedAppIds = this.installedAppIds.filter((id) => id !== appId);\n this._onChange();\n\n // Delete the channel in the background (fire-and-forget)\n if (this.currentSpaceId) {\n this.client.deleteChannel(this.currentSpaceId, appId).catch((e) => {\n console.error(`Failed to delete channel for app ${appId}:`, e);\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // Environment switching\n // ---------------------------------------------------------------------------\n\n async switchEnv(newEnv: Environment): Promise<void> {\n if (newEnv === this.env) return;\n this.env = newEnv;\n storageSet('rool-devhost:env', newEnv);\n this._destroyAllBridgesAndChannels();\n this.currentSpaceId = null;\n this.spaces = [];\n this.publishedApps = [];\n this.installedAppIds = [];\n this._onChange();\n await this.boot();\n }\n\n // ---------------------------------------------------------------------------\n // Sidebar\n // ---------------------------------------------------------------------------\n\n toggleSidebar(): void {\n this.sidebarCollapsed = !this.sidebarCollapsed;\n storageSet('rool-devhost:collapsed', String(this.sidebarCollapsed));\n this._onChange();\n }\n\n // ---------------------------------------------------------------------------\n // Iframe registration (called by Svelte action)\n // ---------------------------------------------------------------------------\n\n registerIframe(tabId: string, el: HTMLIFrameElement): void {\n this.iframeEls[tabId] = el;\n this._bindBridge(tabId);\n }\n\n unregisterIframe(tabId: string): void {\n delete this.iframeEls[tabId];\n }\n\n // ---------------------------------------------------------------------------\n // Cleanup\n // ---------------------------------------------------------------------------\n\n logout(): void {\n this.client.logout();\n window.location.reload();\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private _bindBridge(tabId: string): void {\n const el = this.iframeEls[tabId];\n const ch = this.channels[tabId];\n if (el && ch && !this.bridgeHosts[tabId]) {\n this.bridgeHosts[tabId] = createBridgeHost({ channel: ch, iframe: el });\n }\n }\n\n private _bindAllBridges(): void {\n for (const tab of this.tabs) {\n this._bindBridge(tab.id);\n }\n }\n\n private _destroyTab(tabId: string): void {\n this.bridgeHosts[tabId]?.destroy();\n delete this.bridgeHosts[tabId];\n this.channels[tabId]?.close();\n delete this.channels[tabId];\n delete this.iframeEls[tabId];\n }\n\n private _destroyAllBridgesAndChannels(): void {\n for (const host of Object.values(this.bridgeHosts)) {\n host.destroy();\n }\n for (const ch of Object.values(this.channels)) {\n ch.close();\n }\n this.bridgeHosts = {};\n this.channels = {};\n this.iframeEls = {};\n }\n\n /**\n * Fetch `rool-app.json` from a published app's URL.\n * Returns null if the fetch fails (app might not have a manifest).\n */\n private async _fetchRemoteManifest(appId: string): Promise<AppManifest | null> {\n const domain = ENV_URLS[this.env].appsDomain;\n const url = `https://${appId}.${domain}/rool-app.json`;\n try {\n const res = await fetch(url);\n if (!res.ok) return null;\n return await res.json();\n } catch {\n return null;\n }\n }\n\n /**\n * Idempotently sync a manifest's settings (name, system instruction, collections)\n * onto a channel. Safe to call every time the app is opened.\n */\n private async _syncManifest(channel: RoolChannel, manifest: AppManifest | null): Promise<void> {\n if (!manifest) return;\n\n if (channel.channelName !== manifest.name) {\n await channel.rename(manifest.name);\n }\n\n const targetInstruction = manifest.systemInstruction ?? null;\n const currentInstruction = channel.getSystemInstruction() ?? null;\n if (currentInstruction !== targetInstruction) {\n await channel.setSystemInstruction(targetInstruction);\n }\n\n if (manifest.collections) {\n const currentSchema = channel.getSchema();\n const syncCollections = async (colls: Record<string, { name: string; type: Record<string, unknown> }[]>) => {\n for (const [name, fields] of Object.entries(colls)) {\n if (name in currentSchema) {\n await channel.alterCollection(name, fields as any);\n } else {\n await channel.createCollection(name, fields as any);\n }\n }\n };\n const { write: w, read: r } = manifest.collections;\n if (w && w !== '*') await syncCollections(w);\n if (r && r !== '*') await syncCollections(r);\n }\n }\n\n private _getSavedEnv(): Environment {\n const saved = storageGet('rool-devhost:env');\n if (saved === 'dev' || saved === 'prod') return saved;\n return 'prod';\n }\n}\n","<script lang=\"ts\">\n import type { DevHostController } from './DevHostController.js';\n import type { RoolSpaceInfo } from '@rool-dev/sdk';\n import type { AppManifest, Environment } from '../manifest.js';\n import { ENV_URLS } from '../manifest.js';\n\n interface Props {\n controller: DevHostController;\n // Reactive copies from the controller (Svelte $state)\n manifest: AppManifest | null;\n manifestError: string | null;\n spaces: RoolSpaceInfo[];\n currentSpaceId: string | null;\n env: Environment;\n statusText: string;\n statusState: 'ok' | 'loading' | 'off';\n sidebarCollapsed: boolean;\n dropdownOpen: boolean;\n }\n\n let {\n controller,\n manifest,\n manifestError,\n spaces,\n currentSpaceId,\n env,\n statusText,\n statusState,\n sidebarCollapsed,\n dropdownOpen = $bindable(),\n }: Props = $props();\n\n let selectedSpace = $derived(spaces.find((s) => s.id === currentSpaceId));\n</script>\n\n{#if sidebarCollapsed}\n <!-- Collapsed sidebar -->\n <div class=\"w-10 shrink-0 bg-white border-r border-slate-200 flex flex-col items-center py-3\">\n <button\n class=\"p-1.5 text-slate-400 hover:text-slate-600 transition-colors\"\n onclick={() => controller.toggleSidebar()}\n title=\"Expand sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"/></svg>\n </button>\n <div class=\"mt-3\">\n <span\n class=\"block w-2 h-2 rounded-full {statusState === 'ok' ? 'bg-green-500' : statusState === 'loading' ? 'bg-amber-500' : 'bg-slate-400'}\"\n title={statusText}\n ></span>\n </div>\n </div>\n{:else}\n <!-- Expanded sidebar -->\n <div class=\"w-[280px] shrink-0 bg-white border-r border-slate-200 flex flex-col overflow-y-auto\">\n <!-- App identity (hero) -->\n <div class=\"px-4 pt-4 pb-3 border-b border-slate-100\">\n <div class=\"flex items-start justify-between mb-1\">\n {#if manifest}\n <div class=\"min-w-0\">\n <div class=\"font-semibold text-base text-slate-800 leading-tight\">{manifest.name}</div>\n <div class=\"text-[11px] text-slate-400 font-mono mt-0.5\">{manifest.id}</div>\n </div>\n {:else}\n <div class=\"min-w-0\">\n <div class=\"font-semibold text-base text-slate-800 leading-tight\">App</div>\n </div>\n {/if}\n <button\n class=\"p-1 -mr-1 text-slate-400 hover:text-slate-600 transition-colors shrink-0\"\n onclick={() => controller.toggleSidebar()}\n title=\"Collapse sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n </div>\n {#if manifest?.description}\n <div class=\"text-xs text-slate-500 leading-snug mt-1\">{manifest.description}</div>\n {/if}\n {#if manifestError && !manifest}\n <div class=\"text-xs text-red-500 mt-1\">{manifestError}</div>\n {/if}\n </div>\n\n <!-- Collections -->\n {#if manifest?.collections}\n <div class=\"px-4 py-3 border-b border-slate-100\">\n <div class=\"text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5\">Collections</div>\n <div class=\"space-y-2.5\">\n {#if manifest.collections.write && manifest.collections.write !== '*'}\n <div>\n <div class=\"text-[10px] font-semibold text-emerald-600 mb-1\">Defines</div>\n <div class=\"space-y-1\">\n {#each Object.entries(manifest.collections.write) as [name, fields]}\n <div class=\"flex items-baseline gap-1.5 pl-2 border-l-2 border-emerald-200\">\n <span class=\"text-[11px] font-medium text-slate-700 shrink-0\">{name}</span>\n <span class=\"text-[10px] text-slate-400 truncate\">{fields.map(f => f.name).join(', ')}</span>\n </div>\n {/each}\n </div>\n </div>\n {/if}\n {#if manifest.collections.read && manifest.collections.read !== '*'}\n <div>\n <div class=\"text-[10px] font-semibold text-blue-600 mb-1\">Defines (read-only)</div>\n <div class=\"space-y-1\">\n {#each Object.entries(manifest.collections.read) as [name, fields]}\n <div class=\"flex items-baseline gap-1.5 pl-2 border-l-2 border-blue-200\">\n <span class=\"text-[11px] font-medium text-slate-700 shrink-0\">{name}</span>\n <span class=\"text-[10px] text-slate-400 truncate\">{fields.map(f => f.name).join(', ')}</span>\n </div>\n {/each}\n </div>\n </div>\n {/if}\n {#if manifest.collections.write === '*' || manifest.collections.read === '*'}\n <div>\n <div class=\"text-[10px] font-semibold text-slate-500 mb-1\">Requests access</div>\n <div class=\"space-y-0.5 pl-2\">\n {#if manifest.collections.write === '*'}\n <div class=\"text-[11px] text-slate-600\">Read & write all collections</div>\n {:else if manifest.collections.read === '*'}\n <div class=\"text-[11px] text-slate-600\">Read all collections</div>\n {/if}\n </div>\n </div>\n {/if}\n </div>\n </div>\n {/if}\n\n <!-- System Instruction -->\n {#if manifest?.systemInstruction}\n <div class=\"px-4 py-3 border-b border-slate-100\">\n <div class=\"text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5\">System Instruction</div>\n <div class=\"text-xs text-slate-600 bg-slate-50 border border-slate-200 rounded-md px-2.5 py-2 whitespace-pre-wrap leading-snug max-h-24 overflow-y-auto\">{manifest.systemInstruction}</div>\n </div>\n {/if}\n\n <!-- Manifest warning -->\n {#if manifestError && manifest}\n <div class=\"px-3 py-2 mx-3 mt-2 text-xs text-amber-700 bg-amber-50 border border-amber-200 rounded-md\">\n {manifestError}\n </div>\n {/if}\n\n <!-- Environment -->\n <div class=\"px-4 py-3 border-b border-slate-100\">\n <div class=\"text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5\">Environment</div>\n <div class=\"flex rounded-md border border-slate-200 overflow-hidden\">\n <button\n class=\"flex-1 py-1.5 text-[11px] font-medium transition-colors {env === 'dev' ? 'bg-indigo-50 text-indigo-600 border-r border-slate-200' : 'text-slate-500 hover:bg-slate-50 border-r border-slate-200'}\"\n onclick={() => controller.switchEnv('dev')}\n >\n Dev\n </button>\n <button\n class=\"flex-1 py-1.5 text-[11px] font-medium transition-colors {env === 'prod' ? 'bg-indigo-50 text-indigo-600' : 'text-slate-500 hover:bg-slate-50'}\"\n onclick={() => controller.switchEnv('prod')}\n >\n Prod\n </button>\n </div>\n <div class=\"text-[10px] text-slate-400 mt-1 font-mono\">{ENV_URLS[env].label}</div>\n </div>\n\n <!-- Space picker -->\n <div class=\"px-4 py-3 border-b border-slate-100\">\n <div class=\"text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5\">Space</div>\n <div class=\"relative\" data-dropdown>\n <button\n class=\"w-full py-1.5 pl-2.5 pr-8 text-[13px] border border-slate-200 rounded-md bg-white text-slate-700 text-left truncate cursor-pointer outline-none hover:border-slate-300 {dropdownOpen ? 'border-indigo-500 ring-2 ring-indigo-500/12' : 'focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/12'}\"\n type=\"button\"\n onclick={(e) => { e.stopPropagation(); dropdownOpen = !dropdownOpen; }}\n >\n {selectedSpace?.name ?? 'Select a space...'}\n <svg class=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </button>\n {#if dropdownOpen}\n <div class=\"absolute top-full mt-1 left-0 min-w-full max-w-[360px] max-h-60 overflow-y-auto bg-white border border-slate-200 rounded-md shadow-lg z-50 py-1\">\n {#each spaces as space}\n <button\n class=\"block w-full px-2.5 py-1.5 text-[13px] text-left truncate border-none cursor-pointer hover:bg-slate-100 {space.id === currentSpaceId ? 'bg-indigo-50 text-indigo-600 font-medium' : 'text-slate-700 bg-transparent'}\"\n type=\"button\"\n onclick={() => { dropdownOpen = false; controller.selectSpace(space.id); }}\n >\n {space.name}\n </button>\n {:else}\n <div class=\"px-2.5 py-1.5 text-[13px] text-slate-400\">No spaces available</div>\n {/each}\n </div>\n {/if}\n </div>\n <!-- Connection status -->\n <div class=\"text-[11px] text-slate-400 leading-normal mt-1.5\">\n <span\n class=\"inline-block w-1.5 h-1.5 rounded-full mr-1 align-middle {statusState === 'ok' ? 'bg-green-500' : statusState === 'loading' ? 'bg-amber-500' : 'bg-slate-400'}\"\n ></span>\n {statusText}\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"px-4 py-3 mt-auto flex items-center justify-between\">\n <a\n href=\"https://docs.rool.dev/app\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-[11px] text-slate-400 hover:text-indigo-500 transition-colors\"\n >\n Documentation\n </a>\n <button\n class=\"text-[11px] text-slate-400 hover:text-red-500 transition-colors\"\n onclick={() => controller.logout()}\n >\n Sign out\n </button>\n </div>\n </div>\n{/if}\n","/**\n * utils.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n// /**\n// * Checks for obsolete method names and provides deprecation warnings.\n// * Creates a wrapper function that logs a deprecation warning when called.\n// *\n// * @param self the object context to apply the function to\n// * @param f the new function to call\n// * @param oldName the deprecated method name\n// * @param newName the new method name to use instead\n// * @param rev the version when the deprecation was introduced\n// * @returns a wrapper function that warns about deprecation\n// */\n// eslint-disable-next-line\n// export function obsolete(self, f, oldName: string, newName: string, rev: string): (...args: any[]) => any {\n// const wrapper = (...args) => {\n// console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\n// 'with `' + newName + '`. It will be **removed** in a future release');\n// return f.apply(self, args);\n// }\n// wrapper.prototype = f.prototype;\n// return wrapper;\n// }\n// /**\n// * Checks for obsolete grid options and migrates them to new names.\n// * Automatically copies old option values to new option names and shows deprecation warnings.\n// *\n// * @param opts the options object to check and migrate\n// * @param oldName the deprecated option name\n// * @param newName the new option name to use instead\n// * @param rev the version when the deprecation was introduced\n// */\n// export function obsoleteOpts(opts: GridStackOptions, oldName: string, newName: string, rev: string): void {\n// if (opts[oldName] !== undefined) {\n// opts[newName] = opts[oldName];\n// console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\n// newName + '`. It will be **removed** in a future release');\n// }\n// }\n// /**\n// * Checks for obsolete grid options that have been completely removed.\n// * Shows deprecation warnings for options that are no longer supported.\n// *\n// * @param opts the options object to check\n// * @param oldName the removed option name\n// * @param rev the version when the option was removed\n// * @param info additional information about the removal\n// */\n// export function obsoleteOptsDel(opts: GridStackOptions, oldName: string, rev: string, info: string): void {\n// if (opts[oldName] !== undefined) {\n// console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\n// }\n// }\n// /**\n// * Checks for obsolete HTML element attributes and migrates them.\n// * Automatically copies old attribute values to new attribute names and shows deprecation warnings.\n// *\n// * @param el the HTML element to check and migrate\n// * @param oldName the deprecated attribute name\n// * @param newName the new attribute name to use instead\n// * @param rev the version when the deprecation was introduced\n// */\n// export function obsoleteAttr(el: HTMLElement, oldName: string, newName: string, rev: string): void {\n// const oldAttr = el.getAttribute(oldName);\n// if (oldAttr !== null) {\n// el.setAttribute(newName, oldAttr);\n// console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\n// newName + '`. It will be **removed** in a future release');\n// }\n// }\n/**\n * Collection of utility methods used throughout GridStack.\n * These are general-purpose helper functions for DOM manipulation,\n * positioning calculations, object operations, and more.\n */\nexport class Utils {\n /**\n * Convert a potential selector into an actual list of HTML elements.\n * Supports CSS selectors, element references, and special ID handling.\n *\n * @param els selector string, HTMLElement, or array of elements\n * @param root optional root element to search within (defaults to document, useful for shadow DOM)\n * @returns array of HTML elements matching the selector\n *\n * @example\n * const elements = Utils.getElements('.grid-item');\n * const byId = Utils.getElements('#myWidget');\n * const fromShadow = Utils.getElements('.item', shadowRoot);\n */\n static getElements(els, root = document) {\n if (typeof els === 'string') {\n const doc = ('getElementById' in root) ? root : undefined;\n // Note: very common for people use to id='1,2,3' which is only legal as HTML5 id, but not CSS selectors\n // so if we start with a number, assume it's an id and just return that one item...\n // see https://github.com/gridstack/gridstack.js/issues/2234#issuecomment-1523796562\n if (doc && !isNaN(+els[0])) { // start with digit\n const el = doc.getElementById(els);\n return el ? [el] : [];\n }\n let list = root.querySelectorAll(els);\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\n // see if mean to be a class\n list = root.querySelectorAll('.' + els);\n // else if mean to be an id\n if (!list.length)\n list = root.querySelectorAll('#' + els);\n // else see if gs-id attribute\n if (!list.length) {\n const el = root.querySelector(`[gs-id=\"${els}\"]`);\n return el ? [el] : [];\n }\n }\n return Array.from(list);\n }\n return [els];\n }\n /**\n * Convert a potential selector into a single HTML element.\n * Similar to getElements() but returns only the first match.\n *\n * @param els selector string or HTMLElement\n * @param root optional root element to search within (defaults to document)\n * @returns the first HTML element matching the selector, or null if not found\n *\n * @example\n * const element = Utils.getElement('#myWidget');\n * const first = Utils.getElement('.grid-item');\n */\n static getElement(els, root = document) {\n if (typeof els === 'string') {\n const doc = ('getElementById' in root) ? root : undefined;\n if (!els.length)\n return null;\n if (doc && els[0] === '#') {\n return doc.getElementById(els.substring(1));\n }\n if (els[0] === '#' || els[0] === '.' || els[0] === '[') {\n return root.querySelector(els);\n }\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\n if (doc && !isNaN(+els[0])) { // start with digit\n return doc.getElementById(els);\n }\n // finally try string, then id, then class\n let el = root.querySelector(els);\n if (doc && !el) {\n el = doc.getElementById(els);\n }\n if (!el) {\n el = root.querySelector('.' + els);\n }\n return el;\n }\n return els;\n }\n /**\n * Check if a widget should be lazy loaded based on node or grid settings.\n *\n * @param n the grid node to check\n * @returns true if the item should be lazy loaded\n *\n * @example\n * if (Utils.lazyLoad(node)) {\n * // Set up intersection observer for lazy loading\n * }\n */\n static lazyLoad(n) {\n return n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false;\n }\n /**\n * Create a div element with the specified CSS classes.\n *\n * @param classes array of CSS class names to add\n * @param parent optional parent element to append the div to\n * @returns the created div element\n *\n * @example\n * const div = Utils.createDiv(['grid-item', 'draggable']);\n * const nested = Utils.createDiv(['content'], parentDiv);\n */\n static createDiv(classes, parent) {\n const el = document.createElement('div');\n classes.forEach(c => { if (c)\n el.classList.add(c); });\n parent?.appendChild(el);\n return el;\n }\n /**\n * Check if a widget should resize to fit its content.\n *\n * @param n the grid node to check (can be undefined)\n * @param strict if true, only returns true for explicit sizeToContent:true (not numbers)\n * @returns true if the widget should resize to content\n *\n * @example\n * if (Utils.shouldSizeToContent(node)) {\n * // Trigger content-based resizing\n * }\n */\n static shouldSizeToContent(n, strict = false) {\n return n?.grid && (strict ?\n (n.sizeToContent === true || (n.grid.opts.sizeToContent === true && n.sizeToContent === undefined)) :\n (!!n.sizeToContent || (n.grid.opts.sizeToContent && n.sizeToContent !== false)));\n }\n /**\n * Check if two grid positions overlap/intersect.\n *\n * @param a first position with x, y, w, h properties\n * @param b second position with x, y, w, h properties\n * @returns true if the positions overlap\n *\n * @example\n * const overlaps = Utils.isIntercepted(\n * {x: 0, y: 0, w: 2, h: 1},\n * {x: 1, y: 0, w: 2, h: 1}\n * ); // true - they overlap\n */\n static isIntercepted(a, b) {\n return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);\n }\n /**\n * Check if two grid positions are touching (edges or corners).\n *\n * @param a first position\n * @param b second position\n * @returns true if the positions are touching\n *\n * @example\n * const touching = Utils.isTouching(\n * {x: 0, y: 0, w: 2, h: 1},\n * {x: 2, y: 0, w: 1, h: 1}\n * ); // true - they share an edge\n */\n static isTouching(a, b) {\n return Utils.isIntercepted(a, { x: b.x - 0.5, y: b.y - 0.5, w: b.w + 1, h: b.h + 1 });\n }\n /**\n * Calculate the overlapping area between two grid positions.\n *\n * @param a first position\n * @param b second position\n * @returns the area of overlap (0 if no overlap)\n *\n * @example\n * const overlap = Utils.areaIntercept(\n * {x: 0, y: 0, w: 3, h: 2},\n * {x: 1, y: 0, w: 3, h: 2}\n * ); // returns 4 (2x2 overlap)\n */\n static areaIntercept(a, b) {\n const x0 = (a.x > b.x) ? a.x : b.x;\n const x1 = (a.x + a.w < b.x + b.w) ? a.x + a.w : b.x + b.w;\n if (x1 <= x0)\n return 0; // no overlap\n const y0 = (a.y > b.y) ? a.y : b.y;\n const y1 = (a.y + a.h < b.y + b.h) ? a.y + a.h : b.y + b.h;\n if (y1 <= y0)\n return 0; // no overlap\n return (x1 - x0) * (y1 - y0);\n }\n /**\n * Calculate the total area of a grid position.\n *\n * @param a position with width and height\n * @returns the total area (width * height)\n *\n * @example\n * const area = Utils.area({x: 0, y: 0, w: 3, h: 2}); // returns 6\n */\n static area(a) {\n return a.w * a.h;\n }\n /**\n * Sort an array of grid nodes by position (y first, then x).\n *\n * @param nodes array of nodes to sort\n * @param dir sort direction: 1 for ascending (top-left first), -1 for descending\n * @returns the sorted array (modifies original)\n *\n * @example\n * const sorted = Utils.sort(nodes); // Sort top-left to bottom-right\n * const reverse = Utils.sort(nodes, -1); // Sort bottom-right to top-left\n */\n static sort(nodes, dir = 1) {\n const und = 10000;\n return nodes.sort((a, b) => {\n const diffY = dir * ((a.y ?? und) - (b.y ?? und));\n if (diffY === 0)\n return dir * ((a.x ?? und) - (b.x ?? und));\n return diffY;\n });\n }\n /**\n * Find a grid node by its ID.\n *\n * @param nodes array of nodes to search\n * @param id the ID to search for\n * @returns the node with matching ID, or undefined if not found\n *\n * @example\n * const node = Utils.find(nodes, 'widget-1');\n * if (node) console.log('Found node at:', node.x, node.y);\n */\n static find(nodes, id) {\n return id ? nodes.find(n => n.id === id) : undefined;\n }\n /**\n * Convert various value types to boolean.\n * Handles strings like 'false', 'no', '0' as false.\n *\n * @param v value to convert\n * @returns boolean representation\n *\n * @example\n * Utils.toBool('true'); // true\n * Utils.toBool('false'); // false\n * Utils.toBool('no'); // false\n * Utils.toBool('1'); // true\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static toBool(v) {\n if (typeof v === 'boolean') {\n return v;\n }\n if (typeof v === 'string') {\n v = v.toLowerCase();\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\n }\n return Boolean(v);\n }\n /**\n * Convert a string value to a number, handling null and empty strings.\n *\n * @param value string or null value to convert\n * @returns number value, or undefined for null/empty strings\n *\n * @example\n * Utils.toNumber('42'); // 42\n * Utils.toNumber(''); // undefined\n * Utils.toNumber(null); // undefined\n */\n static toNumber(value) {\n return (value === null || value.length === 0) ? undefined : Number(value);\n }\n /**\n * Parse a height value with units into numeric value and unit string.\n * Supports px, em, rem, vh, vw, %, cm, mm units.\n *\n * @param val height value as number or string with units\n * @returns object with h (height) and unit properties\n *\n * @example\n * Utils.parseHeight('100px'); // {h: 100, unit: 'px'}\n * Utils.parseHeight('2rem'); // {h: 2, unit: 'rem'}\n * Utils.parseHeight(50); // {h: 50, unit: 'px'}\n */\n static parseHeight(val) {\n let h;\n let unit = 'px';\n if (typeof val === 'string') {\n if (val === 'auto' || val === '')\n h = 0;\n else {\n const match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%|cm|mm)?$/);\n if (!match) {\n throw new Error(`Invalid height val = ${val}`);\n }\n unit = match[2] || 'px';\n h = parseFloat(match[1]);\n }\n }\n else {\n h = val;\n }\n return { h, unit };\n }\n /**\n * Copy unset fields from source objects to target object (shallow merge with defaults).\n * Similar to Object.assign but only sets undefined/null fields.\n *\n * @param target the object to copy defaults into\n * @param sources one or more source objects to copy defaults from\n * @returns the modified target object\n *\n * @example\n * const config = { width: 100 };\n * Utils.defaults(config, { width: 200, height: 50 });\n * // config is now { width: 100, height: 50 }\n */\n // eslint-disable-next-line\n static defaults(target, ...sources) {\n sources.forEach(source => {\n for (const key in source) {\n if (!source.hasOwnProperty(key))\n return;\n if (target[key] === null || target[key] === undefined) {\n target[key] = source[key];\n }\n else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\n // property is an object, recursively add it's field over... #1373\n Utils.defaults(target[key], source[key]);\n }\n }\n });\n return target;\n }\n /**\n * Compare two objects for equality (shallow comparison).\n * Checks if objects have the same fields and values at one level deep.\n *\n * @param a first object to compare\n * @param b second object to compare\n * @returns true if objects have the same values\n *\n * @example\n * Utils.same({x: 1, y: 2}, {x: 1, y: 2}); // true\n * Utils.same({x: 1}, {x: 1, y: 2}); // false\n */\n static same(a, b) {\n if (typeof a !== 'object')\n return a == b;\n if (typeof a !== typeof b)\n return false;\n // else we have object, check just 1 level deep for being same things...\n if (Object.keys(a).length !== Object.keys(b).length)\n return false;\n for (const key in a) {\n if (a[key] !== b[key])\n return false;\n }\n return true;\n }\n /**\n * Copy position and size properties from one widget to another.\n * Copies x, y, w, h and optionally min/max constraints.\n *\n * @param a target widget to copy to\n * @param b source widget to copy from\n * @param doMinMax if true, also copy min/max width/height constraints\n * @returns the target widget (a)\n *\n * @example\n * Utils.copyPos(widget1, widget2); // Copy position/size\n * Utils.copyPos(widget1, widget2, true); // Also copy constraints\n */\n static copyPos(a, b, doMinMax = false) {\n if (b.x !== undefined)\n a.x = b.x;\n if (b.y !== undefined)\n a.y = b.y;\n if (b.w !== undefined)\n a.w = b.w;\n if (b.h !== undefined)\n a.h = b.h;\n if (doMinMax) {\n if (b.minW)\n a.minW = b.minW;\n if (b.minH)\n a.minH = b.minH;\n if (b.maxW)\n a.maxW = b.maxW;\n if (b.maxH)\n a.maxH = b.maxH;\n }\n return a;\n }\n /** true if a and b has same size & position */\n static samePos(a, b) {\n return a && b && a.x === b.x && a.y === b.y && (a.w || 1) === (b.w || 1) && (a.h || 1) === (b.h || 1);\n }\n /** given a node, makes sure it's min/max are valid */\n static sanitizeMinMax(node) {\n // remove 0, undefine, null\n if (!node.minW) {\n delete node.minW;\n }\n if (!node.minH) {\n delete node.minH;\n }\n if (!node.maxW) {\n delete node.maxW;\n }\n if (!node.maxH) {\n delete node.maxH;\n }\n }\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\n static removeInternalAndSame(a, b) {\n if (typeof a !== 'object' || typeof b !== 'object')\n return;\n // skip arrays as we don't know how to hydrate them (unlike object spread operator)\n if (Array.isArray(a) || Array.isArray(b))\n return;\n for (let key in a) {\n const aVal = a[key];\n const bVal = b[key];\n if (key[0] === '_' || aVal === bVal) {\n delete a[key];\n }\n else if (aVal && typeof aVal === 'object' && bVal !== undefined) {\n Utils.removeInternalAndSame(aVal, bVal);\n if (!Object.keys(aVal).length) {\n delete a[key];\n }\n }\n }\n }\n /** removes internal fields '_' and default values for saving */\n static removeInternalForSave(n, removeEl = true) {\n for (let key in n) {\n if (key[0] === '_' || n[key] === null || n[key] === undefined)\n delete n[key];\n }\n delete n.grid;\n if (removeEl)\n delete n.el;\n // delete default values (will be re-created on read)\n if (!n.autoPosition)\n delete n.autoPosition;\n if (!n.noResize)\n delete n.noResize;\n if (!n.noMove)\n delete n.noMove;\n if (!n.locked)\n delete n.locked;\n if (n.w === 1 || n.w === n.minW)\n delete n.w;\n if (n.h === 1 || n.h === n.minH)\n delete n.h;\n }\n /** return the closest parent (or itself) matching the given class */\n // static closestUpByClass(el: HTMLElement, name: string): HTMLElement {\n // while (el) {\n // if (el.classList.contains(name)) return el;\n // el = el.parentElement\n // }\n // return null;\n // }\n /** delay calling the given function for given delay, preventing new calls from happening while waiting */\n static throttle(func, delay) {\n let isWaiting = false;\n return (...args) => {\n if (!isWaiting) {\n isWaiting = true;\n setTimeout(() => { func(...args); isWaiting = false; }, delay);\n }\n };\n }\n static removePositioningStyles(el) {\n const style = el.style;\n if (style.position) {\n style.removeProperty('position');\n }\n if (style.left) {\n style.removeProperty('left');\n }\n if (style.top) {\n style.removeProperty('top');\n }\n if (style.width) {\n style.removeProperty('width');\n }\n if (style.height) {\n style.removeProperty('height');\n }\n }\n /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */\n static getScrollElement(el) {\n if (!el)\n return document.scrollingElement || document.documentElement; // IE support\n const style = getComputedStyle(el);\n const overflowRegex = /(auto|scroll)/;\n if (overflowRegex.test(style.overflow + style.overflowY)) {\n return el;\n }\n else {\n return Utils.getScrollElement(el.parentElement);\n }\n }\n /** @internal */\n static updateScrollPosition(el, position, distance) {\n const scrollEl = Utils.getScrollElement(el);\n if (!scrollEl)\n return;\n const elRect = el.getBoundingClientRect();\n const scrollRect = scrollEl.getBoundingClientRect();\n const innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\n const offsetDiffDown = elRect.bottom - Math.min(scrollRect.bottom, innerHeightOrClientHeight);\n const offsetDiffUp = elRect.top - Math.max(scrollRect.top, 0);\n const prevScroll = scrollEl.scrollTop;\n if (offsetDiffUp < 0 && distance < 0) {\n // scroll up\n if (el.offsetHeight > scrollRect.height) {\n scrollEl.scrollTop += distance;\n }\n else {\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\n }\n }\n else if (offsetDiffDown > 0 && distance > 0) {\n // scroll down\n if (el.offsetHeight > scrollRect.height) {\n scrollEl.scrollTop += distance;\n }\n else {\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\n }\n }\n position.top += scrollEl.scrollTop - prevScroll;\n }\n /**\n * @internal Function used to scroll the page.\n *\n * @param event `MouseEvent` that triggers the resize\n * @param el `HTMLElement` that's being resized\n * @param distance Distance from the V edges to start scrolling\n */\n static updateScrollResize(event, el, distance) {\n const scrollEl = Utils.getScrollElement(el);\n const height = scrollEl.clientHeight;\n // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top\n // #1745 Special situation if scrollEl is document 'html': here browser spec states that\n // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;\n // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.\n const offsetTop = (scrollEl === Utils.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;\n const pointerPosY = event.clientY - offsetTop;\n const top = pointerPosY < distance;\n const bottom = pointerPosY > height - distance;\n if (top) {\n // This also can be done with a timeout to keep scrolling while the mouse is\n // in the scrolling zone. (will have smoother behavior)\n scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance });\n }\n else if (bottom) {\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY) });\n }\n }\n /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */\n static clone(obj) {\n if (obj === null || obj === undefined || typeof (obj) !== 'object') {\n return obj;\n }\n // return Object.assign({}, obj);\n if (obj instanceof Array) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return [...obj];\n }\n return { ...obj };\n }\n /**\n * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.\n * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.\n */\n static cloneDeep(obj) {\n // list of fields we will skip during cloneDeep (nested objects, other internal)\n const skipFields = ['parentGrid', 'el', 'grid', 'subGrid', 'engine'];\n // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?\n const ret = Utils.clone(obj);\n for (const key in ret) {\n // NOTE: we don't support function/circular dependencies so skip those properties for now...\n if (ret.hasOwnProperty(key) && typeof (ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(k => k === key)) {\n ret[key] = Utils.cloneDeep(obj[key]);\n }\n }\n return ret;\n }\n /** deep clone the given HTML node, removing teh unique id field */\n static cloneNode(el) {\n const node = el.cloneNode(true);\n node.removeAttribute('id');\n return node;\n }\n static appendTo(el, parent) {\n let parentNode;\n if (typeof parent === 'string') {\n parentNode = Utils.getElement(parent);\n }\n else {\n parentNode = parent;\n }\n if (parentNode) {\n parentNode.appendChild(el);\n }\n }\n // public static setPositionRelative(el: HTMLElement): void {\n // if (!(/^(?:r|a|f)/).test(getComputedStyle(el).position)) {\n // el.style.position = \"relative\";\n // }\n // }\n static addElStyles(el, styles) {\n if (styles instanceof Object) {\n for (const s in styles) {\n if (styles.hasOwnProperty(s)) {\n if (Array.isArray(styles[s])) {\n // support fallback value\n styles[s].forEach(val => {\n el.style[s] = val;\n });\n }\n else {\n el.style[s] = styles[s];\n }\n }\n }\n }\n }\n static initEvent(e, info) {\n const evt = { type: info.type };\n const obj = {\n button: 0,\n which: 0,\n buttons: 1,\n bubbles: true,\n cancelable: true,\n target: info.target ? info.target : e.target\n };\n ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].forEach(p => evt[p] = e[p]); // keys\n ['pageX', 'pageY', 'clientX', 'clientY', 'screenX', 'screenY'].forEach(p => evt[p] = e[p]); // point info\n return { ...evt, ...obj };\n }\n /** copies the MouseEvent (or convert Touch) properties and sends it as another event to the given target */\n static simulateMouseEvent(e, simulatedType, target) {\n const me = e;\n const simulatedEvent = new MouseEvent(simulatedType, {\n bubbles: true,\n composed: true,\n cancelable: true,\n view: window,\n detail: 1,\n screenX: e.screenX,\n screenY: e.screenY,\n clientX: e.clientX,\n clientY: e.clientY,\n ctrlKey: me.ctrlKey ?? false,\n altKey: me.altKey ?? false,\n shiftKey: me.shiftKey ?? false,\n metaKey: me.metaKey ?? false,\n button: 0,\n relatedTarget: e.target\n });\n (target || e.target).dispatchEvent(simulatedEvent);\n }\n /**\n * defines an element that is used to get the offset and scale from grid transforms\n * returns the scale and offsets from said element\n */\n static getValuesFromTransformedElement(parent) {\n const transformReference = document.createElement('div');\n Utils.addElStyles(transformReference, {\n opacity: '0',\n position: 'fixed',\n top: 0 + 'px',\n left: 0 + 'px',\n width: '1px',\n height: '1px',\n zIndex: '-999999',\n });\n parent.appendChild(transformReference);\n const transformValues = transformReference.getBoundingClientRect();\n parent.removeChild(transformReference);\n transformReference.remove();\n return {\n xScale: 1 / transformValues.width,\n yScale: 1 / transformValues.height,\n xOffset: transformValues.left,\n yOffset: transformValues.top,\n };\n }\n /** swap the given object 2 field values */\n static swap(o, a, b) {\n if (!o)\n return;\n const tmp = o[a];\n o[a] = o[b];\n o[b] = tmp;\n }\n /** returns true if event is inside the given element rectangle */\n // Note: Safari Mac has null event.relatedTarget which causes #1684 so check if DragEvent is inside the coordinates instead\n // Utils.el.contains(event.relatedTarget as HTMLElement)\n // public static inside(e: MouseEvent, el: HTMLElement): boolean {\n // // srcElement, toElement, target: all set to placeholder when leaving simple grid, so we can't use that (Chrome)\n // const target: HTMLElement = e.relatedTarget || (e as any).fromElement;\n // if (!target) {\n // const { bottom, left, right, top } = el.getBoundingClientRect();\n // return (e.x < right && e.x > left && e.y < bottom && e.y > top);\n // }\n // return el.contains(target);\n // }\n /** true if the item can be rotated (checking for prop, not space available) */\n static canBeRotated(n) {\n return !(!n || n.w === n.h || n.locked || n.noResize || n.grid?.opts.disableResize || (n.minW && n.minW === n.maxW) || (n.minH && n.minH === n.maxH));\n }\n}\n//# sourceMappingURL=utils.js.map","/**\n * gridstack-engine.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { Utils } from './utils';\n/**\n * Defines the GridStack engine that handles all grid layout calculations and node positioning.\n * This is the core engine that performs grid manipulation without any DOM operations.\n *\n * The engine manages:\n * - Node positioning and collision detection\n * - Layout algorithms (compact, float, etc.)\n * - Grid resizing and column changes\n * - Widget movement and resizing logic\n *\n * NOTE: Values should not be modified directly - use the main GridStack API instead\n * to ensure proper DOM updates and event triggers.\n */\nclass GridStackEngine {\n constructor(opts = {}) {\n this.addedNodes = [];\n this.removedNodes = [];\n this.defaultColumn = 12;\n this.column = opts.column || this.defaultColumn;\n if (this.column > this.defaultColumn)\n this.defaultColumn = this.column;\n this.maxRow = opts.maxRow;\n this._float = opts.float;\n this.nodes = opts.nodes || [];\n this.onChange = opts.onChange;\n }\n /**\n * Enable/disable batch mode for multiple operations to optimize performance.\n * When enabled, layout updates are deferred until batch mode is disabled.\n *\n * @param flag true to enable batch mode, false to disable and apply changes\n * @param doPack if true (default), pack/compact nodes when disabling batch mode\n * @returns the engine instance for chaining\n *\n * @example\n * // Start batch mode for multiple operations\n * engine.batchUpdate(true);\n * engine.addNode(node1);\n * engine.addNode(node2);\n * engine.batchUpdate(false); // Apply all changes at once\n */\n batchUpdate(flag = true, doPack = true) {\n if (!!this.batchMode === flag)\n return this;\n this.batchMode = flag;\n if (flag) {\n this._prevFloat = this._float;\n this._float = true; // let things go anywhere for now... will restore and possibly reposition later\n this.cleanNodes();\n this.saveInitial(); // since begin update (which is called multiple times) won't do this\n }\n else {\n this._float = this._prevFloat;\n delete this._prevFloat;\n if (doPack)\n this._packNodes();\n this._notify();\n }\n return this;\n }\n // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip\n _useEntireRowArea(node, nn) {\n return (!this.float || this.batchMode && !this._prevFloat) && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);\n }\n /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.\n * return true if we moved. */\n _fixCollisions(node, nn = node, collide, opt = {}) {\n this.sortNodes(-1); // from last to first, so recursive collision move items in the right order\n collide = collide || this.collide(node, nn); // REAL area collide for swap and skip if none...\n if (!collide)\n return false;\n // swap check: if we're actively moving in gravity mode, see if we collide with an object the same size\n if (node._moving && !opt.nested && !this.float) {\n if (this.swap(node, collide))\n return true;\n }\n // during while() collisions MAKE SURE to check entire row so larger items don't leap frog small ones (push them all down starting last in grid)\n let area = nn;\n if (!this._loading && this._useEntireRowArea(node, nn)) {\n area = { x: 0, w: this.column, y: nn.y, h: nn.h };\n collide = this.collide(node, area, opt.skip); // force new hit\n }\n let didMove = false;\n const newOpt = { nested: true, pack: false };\n let counter = 0;\n while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each\n if (counter++ > this.nodes.length * 2) {\n throw new Error(\"Infinite collide check\");\n }\n let moved;\n // if colliding with a locked item OR loading (move after) OR moving down with top gravity (and collide could move up) -> skip past the collide,\n // but remember that skip down so we only do this once (and push others otherwise).\n if (collide.locked || this._loading || node._moving && !node._skipDown && nn.y > node.y && !this.float &&\n // can take space we had, or before where we're going\n (!this.collide(collide, { ...collide, y: node.y }, node) || !this.collide(collide, { ...collide, y: nn.y - collide.h }, node))) {\n node._skipDown = (node._skipDown || nn.y > node.y);\n const newNN = { ...nn, y: collide.y + collide.h, ...newOpt };\n // pretent we moved to where we are now so we can continue any collision checks #2492\n moved = this._loading && Utils.samePos(node, newNN) ? true : this.moveNode(node, newNN);\n if ((collide.locked || this._loading) && moved) {\n Utils.copyPos(nn, node); // moving after lock become our new desired location\n }\n else if (!collide.locked && moved && opt.pack) {\n // we moved after and will pack: do it now and keep the original drop location, but past the old collide to see what else we might push way\n this._packNodes();\n nn.y = collide.y + collide.h;\n Utils.copyPos(node, nn);\n }\n didMove = didMove || moved;\n }\n else {\n // move collide down *after* where we will be, ignoring where we are now (don't collide with us)\n moved = this.moveNode(collide, { ...collide, y: nn.y + nn.h, skip: node, ...newOpt });\n }\n if (!moved)\n return didMove; // break inf loop if we couldn't move after all (ex: maxRow, fixed)\n collide = undefined;\n }\n return didMove;\n }\n /**\n * Return the first node that intercepts/collides with the given node or area.\n * Used for collision detection during drag and drop operations.\n *\n * @param skip the node to skip in collision detection (usually the node being moved)\n * @param area the area to check for collisions (defaults to skip node's area)\n * @param skip2 optional second node to skip in collision detection\n * @returns the first colliding node, or undefined if no collision\n *\n * @example\n * const colliding = engine.collide(draggedNode, {x: 2, y: 1, w: 2, h: 1});\n * if (colliding) {\n * console.log('Would collide with:', colliding.id);\n * }\n */\n collide(skip, area = skip, skip2) {\n const skipId = skip._id;\n const skip2Id = skip2?._id;\n return this.nodes.find(n => n._id !== skipId && n._id !== skip2Id && Utils.isIntercepted(n, area));\n }\n /**\n * Return all nodes that intercept/collide with the given node or area.\n * Similar to collide() but returns all colliding nodes instead of just the first.\n *\n * @param skip the node to skip in collision detection\n * @param area the area to check for collisions (defaults to skip node's area)\n * @param skip2 optional second node to skip in collision detection\n * @returns array of all colliding nodes\n *\n * @example\n * const allCollisions = engine.collideAll(draggedNode);\n * console.log('Colliding with', allCollisions.length, 'nodes');\n */\n collideAll(skip, area = skip, skip2) {\n const skipId = skip._id;\n const skip2Id = skip2?._id;\n return this.nodes.filter(n => n._id !== skipId && n._id !== skip2Id && Utils.isIntercepted(n, area));\n }\n /** does a pixel coverage collision based on where we started, returning the node that has the most coverage that is >50% mid line */\n directionCollideCoverage(node, o, collides) {\n if (!o.rect || !node._rect)\n return;\n const r0 = node._rect; // where started\n const r = { ...o.rect }; // where we are\n // update dragged rect to show where it's coming from (above or below, etc...)\n if (r.y > r0.y) {\n r.h += r.y - r0.y;\n r.y = r0.y;\n }\n else {\n r.h += r0.y - r.y;\n }\n if (r.x > r0.x) {\n r.w += r.x - r0.x;\n r.x = r0.x;\n }\n else {\n r.w += r0.x - r.x;\n }\n let collide;\n let overMax = 0.5; // need >50%\n for (let n of collides) {\n if (n.locked || !n._rect) {\n break;\n }\n const r2 = n._rect; // overlapping target\n let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE;\n // depending on which side we started from, compute the overlap % of coverage\n // (ex: from above/below we only compute the max horizontal line coverage)\n if (r0.y < r2.y) { // from above\n yOver = ((r.y + r.h) - r2.y) / r2.h;\n }\n else if (r0.y + r0.h > r2.y + r2.h) { // from below\n yOver = ((r2.y + r2.h) - r.y) / r2.h;\n }\n if (r0.x < r2.x) { // from the left\n xOver = ((r.x + r.w) - r2.x) / r2.w;\n }\n else if (r0.x + r0.w > r2.x + r2.w) { // from the right\n xOver = ((r2.x + r2.w) - r.x) / r2.w;\n }\n const over = Math.min(xOver, yOver);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n }\n o.collide = collide; // save it so we don't have to find it again\n return collide;\n }\n /** does a pixel coverage returning the node that has the most coverage by area */\n /*\n protected collideCoverage(r: GridStackPosition, collides: GridStackNode[]): {collide: GridStackNode, over: number} {\n const collide: GridStackNode;\n const overMax = 0;\n collides.forEach(n => {\n if (n.locked || !n._rect) return;\n const over = Utils.areaIntercept(r, n._rect);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n });\n return {collide, over: overMax};\n }\n */\n /**\n * Cache the pixel rectangles for all nodes used for collision detection during drag operations.\n * This optimization converts grid coordinates to pixel coordinates for faster collision detection.\n *\n * @param w width of a single grid cell in pixels\n * @param h height of a single grid cell in pixels\n * @param top top margin/padding in pixels\n * @param right right margin/padding in pixels\n * @param bottom bottom margin/padding in pixels\n * @param left left margin/padding in pixels\n * @returns the engine instance for chaining\n *\n * @internal This is typically called by GridStack during resize events\n */\n cacheRects(w, h, top, right, bottom, left) {\n this.nodes.forEach(n => n._rect = {\n y: n.y * h + top,\n x: n.x * w + left,\n w: n.w * w - left - right,\n h: n.h * h - top - bottom\n });\n return this;\n }\n /**\n * Attempt to swap the positions of two nodes if they meet swapping criteria.\n * Nodes can swap if they are the same size or in the same column/row, not locked, and touching.\n *\n * @param a first node to swap\n * @param b second node to swap\n * @returns true if swap was successful, false if not possible, undefined if not applicable\n *\n * @example\n * const swapped = engine.swap(nodeA, nodeB);\n * if (swapped) {\n * console.log('Nodes swapped successfully');\n * }\n */\n swap(a, b) {\n if (!b || b.locked || !a || a.locked)\n return false;\n function _doSwap() {\n const x = b.x, y = b.y;\n b.x = a.x;\n b.y = a.y; // b -> a position\n if (a.h != b.h) {\n a.x = x;\n a.y = b.y + b.h; // a -> goes after b\n }\n else if (a.w != b.w) {\n a.x = b.x + b.w;\n a.y = y; // a -> goes after b\n }\n else {\n a.x = x;\n a.y = y; // a -> old b position\n }\n a._dirty = b._dirty = true;\n return true;\n }\n let touching; // remember if we called it (vs undefined)\n // same size and same row or column, and touching\n if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = Utils.isTouching(a, b)))\n return _doSwap();\n if (touching === false)\n return; // IFF ran test and fail, bail out\n // check for taking same columns (but different height) and touching\n if (a.w === b.w && a.x === b.x && (touching || (touching = Utils.isTouching(a, b)))) {\n if (b.y < a.y) {\n const t = a;\n a = b;\n b = t;\n } // swap a <-> b vars so a is first\n return _doSwap();\n }\n if (touching === false)\n return;\n // check if taking same row (but different width) and touching\n if (a.h === b.h && a.y === b.y && (touching || (touching = Utils.isTouching(a, b)))) {\n if (b.x < a.x) {\n const t = a;\n a = b;\n b = t;\n } // swap a <-> b vars so a is first\n return _doSwap();\n }\n return false;\n }\n /**\n * Check if the specified rectangular area is empty (no nodes occupy any part of it).\n *\n * @param x the x coordinate (column) of the area to check\n * @param y the y coordinate (row) of the area to check\n * @param w the width in columns of the area to check\n * @param h the height in rows of the area to check\n * @returns true if the area is completely empty, false if any node overlaps\n *\n * @example\n * if (engine.isAreaEmpty(2, 1, 3, 2)) {\n * console.log('Area is available for placement');\n * }\n */\n isAreaEmpty(x, y, w, h) {\n const nn = { x: x || 0, y: y || 0, w: w || 1, h: h || 1 };\n return !this.collide(nn);\n }\n /**\n * Re-layout grid items to reclaim any empty space.\n * This optimizes the grid layout by moving items to fill gaps.\n *\n * @param layout layout algorithm to use:\n * - 'compact' (default): find truly empty spaces, may reorder items\n * - 'list': keep the sort order exactly the same, move items up sequentially\n * @param doSort if true (default), sort nodes by position before compacting\n * @returns the engine instance for chaining\n *\n * @example\n * // Compact to fill empty spaces\n * engine.compact();\n *\n * // Compact preserving item order\n * engine.compact('list');\n */\n compact(layout = 'compact', doSort = true) {\n if (this.nodes.length === 0)\n return this;\n if (doSort)\n this.sortNodes();\n const wasBatch = this.batchMode;\n if (!wasBatch)\n this.batchUpdate();\n const wasColumnResize = this._inColumnResize;\n if (!wasColumnResize)\n this._inColumnResize = true; // faster addNode()\n const copyNodes = this.nodes;\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\n copyNodes.forEach((n, index, list) => {\n let after;\n if (!n.locked) {\n n.autoPosition = true;\n if (layout === 'list' && index)\n after = list[index - 1];\n }\n this.addNode(n, false, after); // 'false' for add event trigger\n });\n if (!wasColumnResize)\n delete this._inColumnResize;\n if (!wasBatch)\n this.batchUpdate(false);\n return this;\n }\n /**\n * Enable/disable floating widgets (default: `false`).\n * When floating is enabled, widgets can move up to fill empty spaces.\n * See [example](http://gridstackjs.com/demo/float.html)\n *\n * @param val true to enable floating, false to disable\n *\n * @example\n * engine.float = true; // Enable floating\n * engine.float = false; // Disable floating (default)\n */\n set float(val) {\n if (this._float === val)\n return;\n this._float = val || false;\n if (!val) {\n this._packNodes()._notify();\n }\n }\n /**\n * Get the current floating mode setting.\n *\n * @returns true if floating is enabled, false otherwise\n *\n * @example\n * const isFloating = engine.float;\n * console.log('Floating enabled:', isFloating);\n */\n get float() { return this._float || false; }\n /**\n * Sort the nodes array from first to last, or reverse.\n * This is called during collision/placement operations to enforce a specific order.\n *\n * @param dir sort direction: 1 for ascending (first to last), -1 for descending (last to first)\n * @returns the engine instance for chaining\n *\n * @example\n * engine.sortNodes(); // Sort ascending (default)\n * engine.sortNodes(-1); // Sort descending\n */\n sortNodes(dir = 1) {\n this.nodes = Utils.sort(this.nodes, dir);\n return this;\n }\n /** @internal called to top gravity pack the items back OR revert back to original Y positions when floating */\n _packNodes() {\n if (this.batchMode) {\n return this;\n }\n this.sortNodes(); // first to last\n if (this.float) {\n // restore original Y pos\n this.nodes.forEach(n => {\n if (n._updating || n._orig === undefined || n.y === n._orig.y)\n return;\n let newY = n.y;\n while (newY > n._orig.y) {\n --newY;\n const collide = this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\n if (!collide) {\n n._dirty = true;\n n.y = newY;\n }\n }\n });\n }\n else {\n // top gravity pack\n this.nodes.forEach((n, i) => {\n if (n.locked)\n return;\n while (n.y > 0) {\n const newY = i === 0 ? 0 : n.y - 1;\n const canBeMoved = i === 0 || !this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\n if (!canBeMoved)\n break;\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\n // and move items back. The user 'change' CB should detect changes from the original\n // starting position instead.\n n._dirty = (n.y !== newY);\n n.y = newY;\n }\n });\n }\n return this;\n }\n /**\n * Prepare and validate a node's coordinates and values for the current grid.\n * This ensures the node has valid position, size, and properties before being added to the grid.\n *\n * @param node the node to prepare and validate\n * @param resizing if true, resize the node down if it's out of bounds; if false, move it to fit\n * @returns the prepared node with valid coordinates\n *\n * @example\n * const node = { w: 3, h: 2, content: 'Hello' };\n * const prepared = engine.prepareNode(node);\n * console.log('Node prepared at:', prepared.x, prepared.y);\n */\n prepareNode(node, resizing) {\n node._id = node._id ?? GridStackEngine._idSeq++;\n // make sure USER supplied id are unique in our list, else assign a new one as it will create issues during load/update/etc...\n const id = node.id;\n if (id) {\n let count = 1; // append nice _n rather than some random number\n while (this.nodes.find(n => n.id === node.id && n !== node)) {\n node.id = id + '_' + (count++);\n }\n }\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\n node.autoPosition = true;\n }\n // assign defaults for missing required fields\n const defaults = { x: 0, y: 0, w: 1, h: 1 };\n Utils.defaults(node, defaults);\n if (!node.autoPosition) {\n delete node.autoPosition;\n }\n if (!node.noResize) {\n delete node.noResize;\n }\n if (!node.noMove) {\n delete node.noMove;\n }\n Utils.sanitizeMinMax(node);\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\n if (typeof node.x == 'string') {\n node.x = Number(node.x);\n }\n if (typeof node.y == 'string') {\n node.y = Number(node.y);\n }\n if (typeof node.w == 'string') {\n node.w = Number(node.w);\n }\n if (typeof node.h == 'string') {\n node.h = Number(node.h);\n }\n if (isNaN(node.x)) {\n node.x = defaults.x;\n node.autoPosition = true;\n }\n if (isNaN(node.y)) {\n node.y = defaults.y;\n node.autoPosition = true;\n }\n if (isNaN(node.w)) {\n node.w = defaults.w;\n }\n if (isNaN(node.h)) {\n node.h = defaults.h;\n }\n this.nodeBoundFix(node, resizing);\n return node;\n }\n /**\n * Part 2 of preparing a node to fit inside the grid - validates and fixes coordinates and dimensions.\n * This ensures the node fits within grid boundaries and respects min/max constraints.\n *\n * @param node the node to validate and fix\n * @param resizing if true, resize the node to fit; if false, move the node to fit\n * @returns the engine instance for chaining\n *\n * @example\n * // Fix a node that might be out of bounds\n * engine.nodeBoundFix(node, true); // Resize to fit\n * engine.nodeBoundFix(node, false); // Move to fit\n */\n nodeBoundFix(node, resizing) {\n const before = node._orig || Utils.copyPos({}, node);\n if (node.maxW) {\n node.w = Math.min(node.w || 1, node.maxW);\n }\n if (node.maxH) {\n node.h = Math.min(node.h || 1, node.maxH);\n }\n if (node.minW) {\n node.w = Math.max(node.w || 1, node.minW);\n }\n if (node.minH) {\n node.h = Math.max(node.h || 1, node.minH);\n }\n // if user loaded a larger than allowed widget for current # of columns,\n // remember it's position & width so we can restore back (1 -> 12 column) #1655 #1985\n // IFF we're not in the middle of column resizing!\n const saveOrig = (node.x || 0) + (node.w || 1) > this.column;\n if (saveOrig && this.column < this.defaultColumn && !this._inColumnResize && !this.skipCacheUpdate && node._id != null && this.findCacheLayout(node, this.defaultColumn) === -1) {\n const copy = { ...node }; // need _id + positions\n if (copy.autoPosition || copy.x === undefined) {\n delete copy.x;\n delete copy.y;\n }\n else\n copy.x = Math.min(this.defaultColumn - 1, copy.x);\n copy.w = Math.min(this.defaultColumn, copy.w || 1);\n this.cacheOneLayout(copy, this.defaultColumn);\n }\n if (node.w > this.column) {\n node.w = this.column;\n }\n else if (node.w < 1) {\n node.w = 1;\n }\n if (this.maxRow && node.h > this.maxRow) {\n node.h = this.maxRow;\n }\n else if (node.h < 1) {\n node.h = 1;\n }\n if (node.x < 0) {\n node.x = 0;\n }\n if (node.y < 0) {\n node.y = 0;\n }\n if (node.x + node.w > this.column) {\n if (resizing) {\n node.w = this.column - node.x;\n }\n else {\n node.x = this.column - node.w;\n }\n }\n if (this.maxRow && node.y + node.h > this.maxRow) {\n if (resizing) {\n node.h = this.maxRow - node.y;\n }\n else {\n node.y = this.maxRow - node.h;\n }\n }\n if (!Utils.samePos(node, before)) {\n node._dirty = true;\n }\n return this;\n }\n /**\n * Returns a list of nodes that have been modified from their original values.\n * This is used to track which nodes need DOM updates.\n *\n * @param verify if true, performs additional verification by comparing current vs original positions\n * @returns array of nodes that have been modified\n *\n * @example\n * const changed = engine.getDirtyNodes();\n * console.log('Modified nodes:', changed.length);\n *\n * // Get verified dirty nodes\n * const verified = engine.getDirtyNodes(true);\n */\n getDirtyNodes(verify) {\n // compare original x,y,w,h instead as _dirty can be a temporary state\n if (verify) {\n return this.nodes.filter(n => n._dirty && !Utils.samePos(n, n._orig));\n }\n return this.nodes.filter(n => n._dirty);\n }\n /** @internal call this to call onChange callback with dirty nodes so DOM can be updated */\n _notify(removedNodes) {\n if (this.batchMode || !this.onChange)\n return this;\n const dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());\n this.onChange(dirtyNodes);\n return this;\n }\n /**\n * Clean all dirty and last tried information from nodes.\n * This resets the dirty state tracking for all nodes.\n *\n * @returns the engine instance for chaining\n *\n * @internal\n */\n cleanNodes() {\n if (this.batchMode)\n return this;\n this.nodes.forEach(n => {\n delete n._dirty;\n delete n._lastTried;\n });\n return this;\n }\n /**\n * Save the initial position/size of all nodes to track real dirty state.\n * This creates a snapshot of current positions that can be restored later.\n *\n * Note: Should be called right after change events and before move/resize operations.\n *\n * @returns the engine instance for chaining\n *\n * @internal\n */\n saveInitial() {\n this.nodes.forEach(n => {\n n._orig = Utils.copyPos({}, n);\n delete n._dirty;\n });\n this._hasLocked = this.nodes.some(n => n.locked);\n return this;\n }\n /**\n * Restore all nodes back to their initial values.\n * This is typically called when canceling an operation (e.g., Esc key during drag).\n *\n * @returns the engine instance for chaining\n *\n * @internal\n */\n restoreInitial() {\n this.nodes.forEach(n => {\n if (!n._orig || Utils.samePos(n, n._orig))\n return;\n Utils.copyPos(n, n._orig);\n n._dirty = true;\n });\n this._notify();\n return this;\n }\n /**\n * Find the first available empty spot for the given node dimensions.\n * Updates the node's x,y attributes with the found position.\n *\n * @param node the node to find a position for (w,h must be set)\n * @param nodeList optional list of nodes to check against (defaults to engine nodes)\n * @param column optional column count (defaults to engine column count)\n * @param after optional node to start search after (maintains order)\n * @returns true if an empty position was found and node was updated\n *\n * @example\n * const node = { w: 2, h: 1 };\n * if (engine.findEmptyPosition(node)) {\n * console.log('Found position at:', node.x, node.y);\n * }\n */\n findEmptyPosition(node, nodeList = this.nodes, column = this.column, after) {\n const start = after ? after.y * column + (after.x + after.w) : 0;\n let found = false;\n for (let i = start; !found; ++i) {\n const x = i % column;\n const y = Math.floor(i / column);\n if (x + node.w > column) {\n continue;\n }\n const box = { x, y, w: node.w, h: node.h };\n if (!nodeList.find(n => Utils.isIntercepted(box, n))) {\n if (node.x !== x || node.y !== y)\n node._dirty = true;\n node.x = x;\n node.y = y;\n delete node.autoPosition;\n found = true;\n }\n }\n return found;\n }\n /**\n * Add the given node to the grid, handling collision detection and re-packing.\n * This is the main method for adding new widgets to the engine.\n *\n * @param node the node to add to the grid\n * @param triggerAddEvent if true, adds node to addedNodes list for event triggering\n * @param after optional node to place this node after (for ordering)\n * @returns the added node (or existing node if duplicate)\n *\n * @example\n * const node = { x: 0, y: 0, w: 2, h: 1, content: 'Hello' };\n * const added = engine.addNode(node, true);\n */\n addNode(node, triggerAddEvent = false, after) {\n const dup = this.nodes.find(n => n._id === node._id);\n if (dup)\n return dup; // prevent inserting twice! return it instead.\n // skip prepareNode if we're in middle of column resize (not new) but do check for bounds!\n this._inColumnResize ? this.nodeBoundFix(node) : this.prepareNode(node);\n delete node._temporaryRemoved;\n delete node._removeDOM;\n let skipCollision;\n if (node.autoPosition && this.findEmptyPosition(node, this.nodes, this.column, after)) {\n delete node.autoPosition; // found our slot\n skipCollision = true;\n }\n this.nodes.push(node);\n if (triggerAddEvent) {\n this.addedNodes.push(node);\n }\n if (!skipCollision)\n this._fixCollisions(node);\n if (!this.batchMode) {\n this._packNodes()._notify();\n }\n return node;\n }\n /**\n * Remove the given node from the grid.\n *\n * @param node the node to remove\n * @param removeDOM if true (default), marks node for DOM removal\n * @param triggerEvent if true, adds node to removedNodes list for event triggering\n * @returns the engine instance for chaining\n *\n * @example\n * engine.removeNode(node, true, true);\n */\n removeNode(node, removeDOM = true, triggerEvent = false) {\n if (!this.nodes.find(n => n._id === node._id)) {\n // TEST console.log(`Error: GridStackEngine.removeNode() node._id=${node._id} not found!`)\n return this;\n }\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\n this.removedNodes.push(node);\n }\n if (removeDOM)\n node._removeDOM = true; // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\n // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\n this.nodes = this.nodes.filter(n => n._id !== node._id);\n if (!node._isAboutToRemove)\n this._packNodes(); // if dragged out, no need to relayout as already done...\n this._notify([node]);\n return this;\n }\n /**\n * Remove all nodes from the grid.\n *\n * @param removeDOM if true (default), marks all nodes for DOM removal\n * @param triggerEvent if true (default), triggers removal events\n * @returns the engine instance for chaining\n *\n * @example\n * engine.removeAll(); // Remove all nodes\n */\n removeAll(removeDOM = true, triggerEvent = true) {\n delete this._layouts;\n if (!this.nodes.length)\n return this;\n removeDOM && this.nodes.forEach(n => n._removeDOM = true); // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\n const removedNodes = this.nodes;\n this.removedNodes = triggerEvent ? removedNodes : [];\n this.nodes = [];\n return this._notify(removedNodes);\n }\n /**\n * Check if a node can be moved to a new position, considering layout constraints.\n * This is a safer version of moveNode() that validates the move first.\n *\n * For complex cases (like maxRow constraints), it simulates the move in a clone first,\n * then applies the changes only if they meet all specifications.\n *\n * @param node the node to move\n * @param o move options including target position\n * @returns true if the node was successfully moved\n *\n * @example\n * const canMove = engine.moveNodeCheck(node, { x: 2, y: 1 });\n * if (canMove) {\n * console.log('Node moved successfully');\n * }\n */\n moveNodeCheck(node, o) {\n // if (node.locked) return false;\n if (!this.changedPosConstrain(node, o))\n return false;\n o.pack = true;\n // simpler case: move item directly...\n if (!this.maxRow) {\n return this.moveNode(node, o);\n }\n // complex case: create a clone with NO maxRow (will check for out of bounds at the end)\n let clonedNode;\n const clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(n => {\n if (n._id === node._id) {\n clonedNode = { ...n };\n return clonedNode;\n }\n return { ...n };\n })\n });\n if (!clonedNode)\n return false;\n // check if we're covering 50% collision and could move, while still being under maxRow or at least not making it worse\n // (case where widget was somehow added past our max #2449)\n const canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= Math.max(this.getRow(), this.maxRow);\n // else check if we can force a swap (float=true, or different shapes) on non-resize\n if (!canMove && !o.resizing && o.collide) {\n const collide = o.collide.el.gridstackNode; // find the source node the clone collided with at 50%\n if (this.swap(node, collide)) { // swaps and mark dirty\n this._notify();\n return true;\n }\n }\n if (!canMove)\n return false;\n // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!\n // Note: we can't use the list directly as elements and other parts point to actual node, so copy content\n clone.nodes.filter(n => n._dirty).forEach(c => {\n const n = this.nodes.find(a => a._id === c._id);\n if (!n)\n return;\n Utils.copyPos(n, c);\n n._dirty = true;\n });\n this._notify();\n return true;\n }\n /** return true if can fit in grid height constrain only (always true if no maxRow) */\n willItFit(node) {\n delete node._willFitPos;\n if (!this.maxRow)\n return true;\n // create a clone with NO maxRow and check if still within size\n const clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(n => { return { ...n }; })\n });\n const n = { ...node }; // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687\n this.cleanupNode(n);\n delete n.el;\n delete n._id;\n delete n.content;\n delete n.grid;\n clone.addNode(n);\n if (clone.getRow() <= this.maxRow) {\n node._willFitPos = Utils.copyPos({}, n);\n return true;\n }\n return false;\n }\n /** true if x,y or w,h are different after clamping to min/max */\n changedPosConstrain(node, p) {\n // first make sure w,h are set for caller\n p.w = p.w || node.w;\n p.h = p.h || node.h;\n if (node.x !== p.x || node.y !== p.y)\n return true;\n // check constrained w,h\n if (node.maxW) {\n p.w = Math.min(p.w, node.maxW);\n }\n if (node.maxH) {\n p.h = Math.min(p.h, node.maxH);\n }\n if (node.minW) {\n p.w = Math.max(p.w, node.minW);\n }\n if (node.minH) {\n p.h = Math.max(p.h, node.minH);\n }\n return (node.w !== p.w || node.h !== p.h);\n }\n /** return true if the passed in node was actually moved (checks for no-op and locked) */\n moveNode(node, o) {\n if (!node || /*node.locked ||*/ !o)\n return false;\n let wasUndefinedPack;\n if (o.pack === undefined && !this.batchMode) {\n wasUndefinedPack = o.pack = true;\n }\n // constrain the passed in values and check if we're still changing our node\n if (typeof o.x !== 'number') {\n o.x = node.x;\n }\n if (typeof o.y !== 'number') {\n o.y = node.y;\n }\n if (typeof o.w !== 'number') {\n o.w = node.w;\n }\n if (typeof o.h !== 'number') {\n o.h = node.h;\n }\n const resizing = (node.w !== o.w || node.h !== o.h);\n const nn = Utils.copyPos({}, node, true); // get min/max out first, then opt positions next\n Utils.copyPos(nn, o);\n this.nodeBoundFix(nn, resizing);\n Utils.copyPos(o, nn);\n if (!o.forceCollide && Utils.samePos(node, o))\n return false;\n const prevPos = Utils.copyPos({}, node);\n // check if we will need to fix collision at our new location\n const collides = this.collideAll(node, nn, o.skip);\n let needToMove = true;\n if (collides.length) {\n const activeDrag = node._moving && !o.nested;\n // check to make sure we actually collided over 50% surface area while dragging\n let collide = activeDrag ? this.directionCollideCoverage(node, o, collides) : collides[0];\n // if we're enabling creation of sub-grids on the fly, see if we're covering 80% of either one, if we didn't already do that\n if (activeDrag && collide && node.grid?.opts?.subGridDynamic && !node.grid._isTemp) {\n const over = Utils.areaIntercept(o.rect, collide._rect);\n const a1 = Utils.area(o.rect);\n const a2 = Utils.area(collide._rect);\n const perc = over / (a1 < a2 ? a1 : a2);\n if (perc > .8) {\n collide.grid.makeSubGrid(collide.el, undefined, node);\n collide = undefined;\n }\n }\n if (collide) {\n needToMove = !this._fixCollisions(node, nn, collide, o); // check if already moved...\n }\n else {\n needToMove = false; // we didn't cover >50% for a move, skip...\n if (wasUndefinedPack)\n delete o.pack;\n }\n }\n // now move (to the original ask vs the collision version which might differ) and repack things\n if (needToMove && !Utils.samePos(node, nn)) {\n node._dirty = true;\n Utils.copyPos(node, nn);\n }\n if (o.pack) {\n this._packNodes()\n ._notify();\n }\n return !Utils.samePos(node, prevPos); // pack might have moved things back\n }\n getRow() {\n return this.nodes.reduce((row, n) => Math.max(row, n.y + n.h), 0);\n }\n beginUpdate(node) {\n if (!node._updating) {\n node._updating = true;\n delete node._skipDown;\n if (!this.batchMode)\n this.saveInitial();\n }\n return this;\n }\n endUpdate() {\n const n = this.nodes.find(n => n._updating);\n if (n) {\n delete n._updating;\n delete n._skipDown;\n }\n return this;\n }\n /** saves a copy of the largest column layout (eg 12 even when rendering 1 column) so we don't loose orig layout, unless explicity column\n * count to use is given. returning a list of widgets for serialization\n * @param saveElement if true (default), the element will be saved to GridStackWidget.el field, else it will be removed.\n * @param saveCB callback for each node -> widget, so application can insert additional data to be saved into the widget data structure.\n * @param column if provided, the grid will be saved for the given column count (IFF we have matching internal saved layout, or current layout).\n * Note: nested grids will ALWAYS save the container w to match overall layouts (parent + child) to be consistent.\n */\n save(saveElement = true, saveCB, column) {\n // use the highest layout for any saved info so we can have full detail on reload #1849\n // unless we're given a column to match (always set for nested grids)\n const len = this._layouts?.length || 0;\n let layout;\n if (len) {\n if (column) {\n if (column !== this.column)\n layout = this._layouts[column];\n }\n else if (this.column !== len - 1) {\n layout = this._layouts[len - 1];\n }\n }\n const list = [];\n this.sortNodes();\n this.nodes.forEach(n => {\n const wl = layout?.find(l => l._id === n._id);\n // use layout info fields instead if set\n const w = { ...n, ...(wl || {}) };\n Utils.removeInternalForSave(w, !saveElement);\n if (saveCB)\n saveCB(n, w);\n list.push(w);\n });\n return list;\n }\n /** @internal called whenever a node is added or moved - updates the cached layouts */\n layoutsNodesChange(nodes) {\n if (!this._layouts || this._inColumnResize)\n return this;\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\n this._layouts.forEach((layout, column) => {\n if (!layout || column === this.column)\n return this;\n if (column < this.column) {\n this._layouts[column] = undefined;\n }\n else {\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\n // NOTE: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. #1785\n const ratio = column / this.column;\n nodes.forEach(node => {\n if (!node._orig)\n return; // didn't change (newly added ?)\n const n = layout.find(l => l._id === node._id);\n if (!n)\n return; // no cache for new nodes. Will use those values.\n // Y changed, push down same amount\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\n if (n.y >= 0 && node.y !== node._orig.y) {\n n.y += (node.y - node._orig.y);\n if (n.y < 0)\n n.y = 0;\n }\n // X changed, scale from new position\n if (node.x !== node._orig.x) {\n n.x = Math.round(node.x * ratio);\n if (n.x < 0)\n n.x = 0;\n }\n // width changed, scale from new width\n if (node.w !== node._orig.w) {\n n.w = Math.round(node.w * ratio);\n if (n.w < 1)\n n.w = 1;\n }\n // ...height always carries over from cache\n });\n }\n });\n return this;\n }\n /**\n * @internal Called to scale the widget width & position up/down based on the column change.\n * Note we store previous layouts (especially original ones) to make it possible to go\n * from say 12 -> 1 -> 12 and get back to where we were.\n *\n * @param prevColumn previous number of columns\n * @param column new column number\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\n */\n columnChanged(prevColumn, column, layout = 'moveScale') {\n if (!this.nodes.length || !column || prevColumn === column)\n return this;\n // simpler shortcuts layouts\n const doCompact = layout === 'compact' || layout === 'list';\n if (doCompact) {\n this.sortNodes(1); // sort with original layout once and only once (new column will affect order otherwise)\n }\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data IFF we're sizing down (see below)\n if (column < prevColumn)\n this.cacheLayout(this.nodes, prevColumn);\n this.batchUpdate(); // do this EARLY as it will call saveInitial() so we can detect where we started for _dirty and collision\n let newNodes = [];\n let nodes = doCompact ? this.nodes : Utils.sort(this.nodes, -1); // current column reverse sorting so we can insert last to front (limit collision)\n // see if we have cached previous layout IFF we are going up in size (restore) otherwise always\n // generate next size down from where we are (looks more natural as you gradually size down).\n if (column > prevColumn && this._layouts) {\n const cacheNodes = this._layouts[column] || [];\n // ...if not, start with the largest layout (if not already there) as down-scaling is more accurate\n // by pretending we came from that larger column by assigning those values as starting point\n const lastIndex = this._layouts.length - 1;\n if (!cacheNodes.length && prevColumn !== lastIndex && this._layouts[lastIndex]?.length) {\n prevColumn = lastIndex;\n this._layouts[lastIndex].forEach(cacheNode => {\n const n = nodes.find(n => n._id === cacheNode._id);\n if (n) {\n // still current, use cache info positions\n if (!doCompact && !cacheNode.autoPosition) {\n n.x = cacheNode.x ?? n.x;\n n.y = cacheNode.y ?? n.y;\n }\n n.w = cacheNode.w ?? n.w;\n if (cacheNode.x == undefined || cacheNode.y === undefined)\n n.autoPosition = true;\n }\n });\n }\n // if we found cache re-use those nodes that are still current\n cacheNodes.forEach(cacheNode => {\n const j = nodes.findIndex(n => n._id === cacheNode._id);\n if (j !== -1) {\n const n = nodes[j];\n // still current, use cache info positions\n if (doCompact) {\n n.w = cacheNode.w; // only w is used, and don't trim the list\n return;\n }\n if (cacheNode.autoPosition || isNaN(cacheNode.x) || isNaN(cacheNode.y)) {\n this.findEmptyPosition(cacheNode, newNodes);\n }\n if (!cacheNode.autoPosition) {\n n.x = cacheNode.x ?? n.x;\n n.y = cacheNode.y ?? n.y;\n n.w = cacheNode.w ?? n.w;\n newNodes.push(n);\n }\n nodes.splice(j, 1);\n }\n });\n }\n // much simpler layout that just compacts\n if (doCompact) {\n this.compact(layout, false);\n }\n else {\n // ...and add any extra non-cached ones\n if (nodes.length) {\n if (typeof layout === 'function') {\n layout(column, prevColumn, newNodes, nodes);\n }\n else {\n const ratio = (doCompact || layout === 'none') ? 1 : column / prevColumn;\n const move = (layout === 'move' || layout === 'moveScale');\n const scale = (layout === 'scale' || layout === 'moveScale');\n nodes.forEach(node => {\n // NOTE: x + w could be outside of the grid, but addNode() below will handle that\n node.x = (column === 1 ? 0 : (move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1)));\n node.w = ((column === 1 || prevColumn === 1) ? 1 : scale ? (Math.round(node.w * ratio) || 1) : (Math.min(node.w, column)));\n newNodes.push(node);\n });\n nodes = [];\n }\n }\n // finally re-layout them in reverse order (to get correct placement)\n newNodes = Utils.sort(newNodes, -1);\n this._inColumnResize = true; // prevent cache update\n this.nodes = []; // pretend we have no nodes to start with (add() will use same structures) to simplify layout\n newNodes.forEach(node => {\n this.addNode(node, false); // 'false' for add event trigger\n delete node._orig; // make sure the commit doesn't try to restore things back to original\n });\n }\n this.nodes.forEach(n => delete n._orig); // clear _orig before batch=false so it doesn't handle float=true restore\n this.batchUpdate(false, !doCompact);\n delete this._inColumnResize;\n return this;\n }\n /**\n * call to cache the given layout internally to the given location so we can restore back when column changes size\n * @param nodes list of nodes\n * @param column corresponding column index to save it under\n * @param clear if true, will force other caches to be removed (default false)\n */\n cacheLayout(nodes, column, clear = false) {\n const copy = [];\n nodes.forEach((n, i) => {\n // make sure we have an id in case this is new layout, else re-use id already set\n if (n._id === undefined) {\n const existing = n.id ? this.nodes.find(n2 => n2.id === n.id) : undefined; // find existing node using users id\n n._id = existing?._id ?? GridStackEngine._idSeq++;\n }\n copy[i] = { x: n.x, y: n.y, w: n.w, _id: n._id }; // only thing we change is x,y,w and id to find it back\n });\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\n this._layouts[column] = copy;\n return this;\n }\n /**\n * call to cache the given node layout internally to the given location so we can restore back when column changes size\n * @param node single node to cache\n * @param column corresponding column index to save it under\n */\n cacheOneLayout(n, column) {\n n._id = n._id ?? GridStackEngine._idSeq++;\n const l = { x: n.x, y: n.y, w: n.w, _id: n._id };\n if (n.autoPosition || n.x === undefined) {\n delete l.x;\n delete l.y;\n if (n.autoPosition)\n l.autoPosition = true;\n }\n this._layouts = this._layouts || [];\n this._layouts[column] = this._layouts[column] || [];\n const index = this.findCacheLayout(n, column);\n if (index === -1)\n this._layouts[column].push(l);\n else\n this._layouts[column][index] = l;\n return this;\n }\n findCacheLayout(n, column) {\n return this._layouts?.[column]?.findIndex(l => l._id === n._id) ?? -1;\n }\n removeNodeFromLayoutCache(n) {\n if (!this._layouts) {\n return;\n }\n for (let i = 0; i < this._layouts.length; i++) {\n const index = this.findCacheLayout(n, i);\n if (index !== -1) {\n this._layouts[i].splice(index, 1);\n }\n }\n }\n /** called to remove all internal values but the _id */\n cleanupNode(node) {\n for (const prop in node) {\n if (prop[0] === '_' && prop !== '_id')\n delete node[prop];\n }\n return this;\n }\n}\n/** @internal unique global internal _id counter */\nGridStackEngine._idSeq = 0;\nexport { GridStackEngine };\n//# sourceMappingURL=gridstack-engine.js.map","/**\n * types.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n/**\n * Default values for grid options - used during initialization and when saving out grid configuration.\n * These values are applied when options are not explicitly provided.\n */\nexport const gridDefaults = {\n alwaysShowResizeHandle: 'mobile',\n animate: true,\n auto: true,\n cellHeight: 'auto',\n cellHeightThrottle: 100,\n cellHeightUnit: 'px',\n column: 12,\n draggable: { handle: '.grid-stack-item-content', appendTo: 'body', scroll: true },\n handle: '.grid-stack-item-content',\n itemClass: 'grid-stack-item',\n margin: 10,\n marginUnit: 'px',\n maxRow: 0,\n minRow: 0,\n placeholderClass: 'grid-stack-placeholder',\n placeholderText: '',\n removableOptions: { accept: 'grid-stack-item', decline: 'grid-stack-non-removable' },\n resizable: { handles: 'se' },\n rtl: 'auto',\n // **** same as not being set ****\n // disableDrag: false,\n // disableResize: false,\n // float: false,\n // handleClass: null,\n // removable: false,\n // staticGrid: false,\n //removable\n};\n//# sourceMappingURL=types.js.map","/**\n * dd-manager.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n/**\n * Global state manager for all Drag & Drop instances.\n *\n * This class maintains shared state across all drag & drop operations,\n * ensuring proper coordination between multiple grids and drag/drop elements.\n * All properties are static to provide global access throughout the DD system.\n */\nexport class DDManager {\n}\n//# sourceMappingURL=dd-manager.js.map","/**\n * touch.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { DDManager } from './dd-manager';\nimport { Utils } from './utils';\n/**\n * Detect touch support - Windows Surface devices and other touch devices\n * should we use this instead ? (what we had for always showing resize handles)\n * /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)\n */\nexport const isTouch = typeof window !== 'undefined' && typeof document !== 'undefined' &&\n ('ontouchstart' in document\n || 'ontouchstart' in window\n // || !!window.TouchEvent // true on Windows 10 Chrome desktop so don't use this\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || (window.DocumentTouch && document instanceof window.DocumentTouch)\n || navigator.maxTouchPoints > 0\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || navigator.msMaxTouchPoints > 0);\n// interface TouchCoord {x: number, y: number};\nexport class DDTouch {\n}\n/**\n* Get the x,y position of a touch event\n*/\n// function getTouchCoords(e: TouchEvent): TouchCoord {\n// return {\n// x: e.changedTouches[0].pageX,\n// y: e.changedTouches[0].pageY\n// };\n// }\n/**\n * Simulate a mouse event based on a corresponding touch event\n * @param {Object} e A touch event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulateMouseEvent(e, simulatedType) {\n // Ignore multi-touch events\n if (e.touches.length > 1)\n return;\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable)\n e.preventDefault();\n // Dispatch the simulated event to the target element\n Utils.simulateMouseEvent(e.changedTouches[0], simulatedType);\n}\n/**\n * Simulate a mouse event based on a corresponding Pointer event\n * @param {Object} e A pointer event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulatePointerMouseEvent(e, simulatedType) {\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable)\n e.preventDefault();\n // Dispatch the simulated event to the target element\n Utils.simulateMouseEvent(e, simulatedType);\n}\n/**\n * Handle the touchstart events\n * @param {Object} e The widget element's touchstart event\n */\nexport function touchstart(e) {\n // Ignore the event if another widget is already being handled\n if (DDTouch.touchHandled)\n return;\n DDTouch.touchHandled = true;\n // Simulate the mouse events\n // simulateMouseEvent(e, 'mouseover');\n // simulateMouseEvent(e, 'mousemove');\n simulateMouseEvent(e, 'mousedown');\n}\n/**\n * Handle the touchmove events\n * @param {Object} e The document's touchmove event\n */\nexport function touchmove(e) {\n // Ignore event if not handled by us\n if (!DDTouch.touchHandled)\n return;\n simulateMouseEvent(e, 'mousemove');\n}\n/**\n * Handle the touchend events\n * @param {Object} e The document's touchend event\n */\nexport function touchend(e) {\n // Ignore event if not handled\n if (!DDTouch.touchHandled)\n return;\n // cancel delayed leave event when we release on ourself which happens BEFORE we get this!\n if (DDTouch.pointerLeaveTimeout) {\n window.clearTimeout(DDTouch.pointerLeaveTimeout);\n delete DDTouch.pointerLeaveTimeout;\n }\n const wasDragging = !!DDManager.dragElement;\n // Simulate the mouseup event\n simulateMouseEvent(e, 'mouseup');\n // simulateMouseEvent(event, 'mouseout');\n // If the touch interaction did not move, it should trigger a click\n if (!wasDragging) {\n simulateMouseEvent(e, 'click');\n }\n // Unset the flag to allow other widgets to inherit the touch event\n DDTouch.touchHandled = false;\n}\n/**\n * Note we don't get touchenter/touchleave (which are deprecated)\n * see https://stackoverflow.com/questions/27908339/js-touch-equivalent-for-mouseenter\n * so instead of PointerEvent to still get enter/leave and send the matching mouse event.\n */\nexport function pointerdown(e) {\n // console.log(\"pointer down\")\n if (e.pointerType === 'mouse')\n return;\n e.target.releasePointerCapture(e.pointerId); // <- Important!\n}\nexport function pointerenter(e) {\n // ignore the initial one we get on pointerdown on ourself\n if (!DDManager.dragElement) {\n // console.log('pointerenter ignored');\n return;\n }\n // console.log('pointerenter');\n if (e.pointerType === 'mouse')\n return;\n simulatePointerMouseEvent(e, 'mouseenter');\n}\nexport function pointerleave(e) {\n // ignore the leave on ourself we get before releasing the mouse over ourself\n // by delaying sending the event and having the up event cancel us\n if (!DDManager.dragElement) {\n // console.log('pointerleave ignored');\n return;\n }\n if (e.pointerType === 'mouse')\n return;\n DDTouch.pointerLeaveTimeout = window.setTimeout(() => {\n delete DDTouch.pointerLeaveTimeout;\n // console.log('pointerleave delayed');\n simulatePointerMouseEvent(e, 'mouseleave');\n }, 10);\n}\n//# sourceMappingURL=dd-touch.js.map","/**\n * dd-resizable-handle.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { isTouch, pointerdown, touchend, touchmove, touchstart } from './dd-touch';\nclass DDResizableHandle {\n constructor(host, dir, option) {\n this.host = host;\n this.dir = dir;\n this.option = option;\n /** @internal true after we've moved enough pixels to start a resize */\n this.moving = false;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._keyEvent = this._keyEvent.bind(this);\n this._init();\n }\n /** @internal */\n _init() {\n if (this.option.element) {\n try {\n this.el = this.option.element instanceof HTMLElement\n ? this.option.element\n : this.host.querySelector(this.option.element);\n }\n catch (error) {\n this.option.element = undefined; // make sure destroy handles it correctly\n console.error(\"Query for resizeable handle failed, falling back\", error);\n }\n }\n if (!this.el) {\n this.el = document.createElement('div');\n this.host.appendChild(this.el);\n }\n this.el.classList.add('ui-resizable-handle');\n this.el.classList.add(`${DDResizableHandle.prefix}${this.dir}`);\n this.el.style.zIndex = '100';\n this.el.style.userSelect = 'none';\n this.el.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.addEventListener('touchstart', touchstart);\n this.el.addEventListener('pointerdown', pointerdown);\n // this.el.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n return this;\n }\n /** call this when resize handle needs to be removed and cleaned up */\n destroy() {\n if (this.moving)\n this._mouseUp(this.mouseDownEvent);\n this.el.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n this.el.removeEventListener('touchstart', touchstart);\n this.el.removeEventListener('pointerdown', pointerdown);\n }\n if (!this.option.element) {\n this.host.removeChild(this.el);\n }\n delete this.el;\n delete this.host;\n return this;\n }\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\n _mouseDown(e) {\n this.mouseDownEvent = e;\n document.addEventListener('mousemove', this._mouseMove, { capture: true, passive: true }); // capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.addEventListener('touchmove', touchmove);\n this.el.addEventListener('touchend', touchend);\n }\n e.stopPropagation();\n e.preventDefault();\n }\n /** @internal */\n _mouseMove(e) {\n const s = this.mouseDownEvent;\n if (this.moving) {\n this._triggerEvent('move', e);\n }\n else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\n // don't start unless we've moved at least 3 pixels\n this.moving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n this._triggerEvent('move', e);\n // now track keyboard events to cancel\n document.addEventListener('keydown', this._keyEvent);\n }\n e.stopPropagation();\n // e.preventDefault(); passive = true\n }\n /** @internal */\n _mouseUp(e) {\n if (this.moving) {\n this._triggerEvent('stop', e);\n document.removeEventListener('keydown', this._keyEvent);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n this.el.removeEventListener('touchmove', touchmove);\n this.el.removeEventListener('touchend', touchend);\n }\n delete this.moving;\n delete this.mouseDownEvent;\n e.stopPropagation();\n e.preventDefault();\n }\n /** @internal call when keys are being pressed - use Esc to cancel */\n _keyEvent(e) {\n if (e.key === 'Escape') {\n this.host.gridstackNode?.grid?.engine.restoreInitial();\n this._mouseUp(this.mouseDownEvent);\n }\n }\n /** @internal */\n _triggerEvent(name, event) {\n if (this.option[name])\n this.option[name](event);\n return this;\n }\n}\n/** @internal */\nDDResizableHandle.prefix = 'ui-resizable-';\nexport { DDResizableHandle };\n//# sourceMappingURL=dd-resizable-handle.js.map","/**\n * dd-base-impl.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\n/**\n * Abstract base class for all drag & drop implementations.\n * Provides common functionality for event handling, enable/disable state,\n * and lifecycle management used by draggable, droppable, and resizable implementations.\n */\nexport class DDBaseImplement {\n constructor() {\n /** @internal */\n this._eventRegister = {};\n }\n /**\n * Returns the current disabled state.\n * Note: Use enable()/disable() methods to change state as other operations need to happen.\n */\n get disabled() { return this._disabled; }\n /**\n * Register an event callback for the specified event.\n *\n * @param event - Event name to listen for\n * @param callback - Function to call when event occurs\n */\n on(event, callback) {\n this._eventRegister[event] = callback;\n }\n /**\n * Unregister an event callback for the specified event.\n *\n * @param event - Event name to stop listening for\n */\n off(event) {\n delete this._eventRegister[event];\n }\n /**\n * Enable this drag & drop implementation.\n * Subclasses should override to perform additional setup.\n */\n enable() {\n this._disabled = false;\n }\n /**\n * Disable this drag & drop implementation.\n * Subclasses should override to perform additional cleanup.\n */\n disable() {\n this._disabled = true;\n }\n /**\n * Destroy this drag & drop implementation and clean up resources.\n * Removes all event handlers and clears internal state.\n */\n destroy() {\n delete this._eventRegister;\n }\n /**\n * Trigger a registered event callback if one exists and the implementation is enabled.\n *\n * @param eventName - Name of the event to trigger\n * @param event - DOM event object to pass to the callback\n * @returns Result from the callback function, if any\n */\n triggerEvent(eventName, event) {\n if (!this.disabled && this._eventRegister && this._eventRegister[eventName])\n return this._eventRegister[eventName](event);\n }\n}\n//# sourceMappingURL=dd-base-impl.js.map","/**\n * dd-resizable.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { DDResizableHandle } from './dd-resizable-handle';\nimport { DDBaseImplement } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDManager } from './dd-manager';\nclass DDResizable extends DDBaseImplement {\n // have to be public else complains for HTMLElementExtendOpt ?\n constructor(el, option = {}) {\n super();\n this.el = el;\n this.option = option;\n /** @internal */\n this.rectScale = { x: 1, y: 1 };\n /** @internal */\n this._ui = () => {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const newRect = {\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n const rect = this.temporalRect || newRect;\n return {\n position: {\n left: (rect.left - containmentRect.left) * this.rectScale.x,\n top: (rect.top - containmentRect.top) * this.rectScale.y\n },\n size: {\n width: rect.width * this.rectScale.x,\n height: rect.height * this.rectScale.y\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n };\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseOver = this._mouseOver.bind(this);\n this._mouseOut = this._mouseOut.bind(this);\n this.enable();\n this._setupAutoHide(this.option.autoHide);\n this._setupHandlers();\n }\n on(event, callback) {\n super.on(event, callback);\n }\n off(event) {\n super.off(event);\n }\n enable() {\n super.enable();\n this.el.classList.remove('ui-resizable-disabled');\n this._setupAutoHide(this.option.autoHide);\n }\n disable() {\n super.disable();\n this.el.classList.add('ui-resizable-disabled');\n this._setupAutoHide(false);\n }\n destroy() {\n this._removeHandlers();\n this._setupAutoHide(false);\n delete this.el;\n super.destroy();\n }\n updateOption(opts) {\n const updateHandles = (opts.handles && opts.handles !== this.option.handles);\n const updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide(this.option.autoHide);\n }\n return this;\n }\n /** @internal turns auto hide on/off */\n _setupAutoHide(auto) {\n if (auto) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover and not mouseenter to get better performance and track for nested cases\n this.el.addEventListener('mouseover', this._mouseOver);\n this.el.addEventListener('mouseout', this._mouseOut);\n }\n else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._mouseOver);\n this.el.removeEventListener('mouseout', this._mouseOut);\n if (DDManager.overResizeElement === this) {\n delete DDManager.overResizeElement;\n }\n }\n return this;\n }\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _mouseOver(e) {\n // console.log(`${count++} pre-enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n // already over a child, ignore. Ideally we just call e.stopPropagation() but see https://github.com/gridstack/gridstack.js/issues/2018\n if (DDManager.overResizeElement || DDManager.dragElement)\n return;\n DDManager.overResizeElement = this;\n // console.log(`${count++} enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.remove('ui-resizable-autohide');\n }\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _mouseOut(e) {\n // console.log(`${count++} pre-leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n if (DDManager.overResizeElement !== this)\n return;\n delete DDManager.overResizeElement;\n // console.log(`${count++} leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.add('ui-resizable-autohide');\n }\n /** @internal */\n _setupHandlers() {\n this.handlers = this.option.handles.split(',')\n .map(dir => dir.trim())\n .map(dir => new DDResizableHandle(this.el, dir, {\n element: this.option.element,\n start: (event) => this._resizeStart(event),\n stop: (event) => this._resizeStop(event),\n move: (event) => this._resizing(event, dir)\n }));\n return this;\n }\n /** @internal */\n _resizeStart(event) {\n this.sizeToContent = Utils.shouldSizeToContent(this.el.gridstackNode, true); // strick true only and not number\n this.originalRect = this.el.getBoundingClientRect();\n this.scrollEl = Utils.getScrollElement(this.el);\n this.scrollY = this.scrollEl.scrollTop;\n this.scrolled = 0;\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n }\n /** @internal */\n _resizing(event, dir) {\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n const ev = Utils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n }\n /** @internal */\n _resizeStop(event) {\n const ev = Utils.initEvent(event, { type: 'resizestop', target: this.el });\n // Remove style attr now, so the stop handler can rebuild style attrs\n this._cleanHelper();\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n delete this.scrollY;\n delete this.scrolled;\n return this;\n }\n /** @internal */\n _setupHelper() {\n this.elOriginStyleVal = DDResizable._originStyleProp.map(prop => this.el.style[prop]);\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n const parent = this.el.parentElement;\n const dragTransform = Utils.getValuesFromTransformedElement(parent);\n this.rectScale = {\n x: dragTransform.xScale,\n y: dragTransform.yScale\n };\n if (getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = 'absolute';\n this.el.style.opacity = '0.8';\n return this;\n }\n /** @internal */\n _cleanHelper() {\n DDResizable._originStyleProp.forEach((prop, i) => {\n this.el.style[prop] = this.elOriginStyleVal[i] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n }\n /** @internal */\n _getChange(event, dir) {\n const oEvent = this.startEvent;\n const newRect = {\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n const offsetX = event.clientX - oEvent.clientX;\n const offsetY = this.sizeToContent ? 0 : event.clientY - oEvent.clientY; // prevent vert resize\n let moveLeft;\n let moveUp;\n if (dir.indexOf('e') > -1) {\n newRect.width += offsetX;\n }\n else if (dir.indexOf('w') > -1) {\n newRect.width -= offsetX;\n newRect.left += offsetX;\n moveLeft = true;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += offsetY;\n }\n else if (dir.indexOf('n') > -1) {\n newRect.height -= offsetY;\n newRect.top += offsetY;\n moveUp = true;\n }\n const constrain = this._constrainSize(newRect.width, newRect.height, moveLeft, moveUp);\n if (Math.round(newRect.width) !== Math.round(constrain.width)) { // round to ignore slight round-off errors\n if (dir.indexOf('w') > -1) {\n newRect.left += newRect.width - constrain.width;\n }\n newRect.width = constrain.width;\n }\n if (Math.round(newRect.height) !== Math.round(constrain.height)) {\n if (dir.indexOf('n') > -1) {\n newRect.top += newRect.height - constrain.height;\n }\n newRect.height = constrain.height;\n }\n return newRect;\n }\n /** @internal constrain the size to the set min/max values */\n _constrainSize(oWidth, oHeight, moveLeft, moveUp) {\n const o = this.option;\n const maxWidth = (moveLeft ? o.maxWidthMoveLeft : o.maxWidth) || Number.MAX_SAFE_INTEGER;\n const minWidth = o.minWidth / this.rectScale.x || oWidth;\n const maxHeight = (moveUp ? o.maxHeightMoveUp : o.maxHeight) || Number.MAX_SAFE_INTEGER;\n const minHeight = o.minHeight / this.rectScale.y || oHeight;\n const width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n const height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width, height };\n }\n /** @internal */\n _applyChange() {\n let containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n const containmentEl = this.el.parentElement;\n const { left, top } = containmentEl.getBoundingClientRect();\n containmentRect = { left, top, width: 0, height: 0 };\n }\n if (!this.temporalRect)\n return this;\n Object.keys(this.temporalRect).forEach(key => {\n const value = this.temporalRect[key];\n const scaleReciprocal = key === 'width' || key === 'left' ? this.rectScale.x : key === 'height' || key === 'top' ? this.rectScale.y : 1;\n this.el.style[key] = (value - containmentRect[key]) * scaleReciprocal + 'px';\n });\n return this;\n }\n /** @internal */\n _removeHandlers() {\n this.handlers.forEach(handle => handle.destroy());\n delete this.handlers;\n return this;\n }\n}\n/** @internal */\nDDResizable._originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\nexport { DDResizable };\n//# sourceMappingURL=dd-resizable.js.map","/**\n * dd-draggable.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { DDManager } from './dd-manager';\nimport { Utils } from './utils';\nimport { DDBaseImplement } from './dd-base-impl';\nimport { isTouch, touchend, touchmove, touchstart, pointerdown, DDTouch } from './dd-touch';\n// make sure we are not clicking on known object that handles mouseDown\nconst skipMouseDown = 'input,textarea,button,select,option,[contenteditable=\"true\"],.ui-resizable-handle';\n// let count = 0; // TEST\nclass DDDraggable extends DDBaseImplement {\n constructor(el, option = {}) {\n super();\n this.el = el;\n this.option = option;\n /** @internal */\n this.dragTransform = {\n xScale: 1,\n yScale: 1,\n xOffset: 0,\n yOffset: 0\n };\n // get the element that is actually supposed to be dragged by\n const handleName = option?.handle?.substring(1);\n const n = el.gridstackNode;\n this.dragEls = !handleName || el.classList.contains(handleName) ? [el] : (n?.subGrid ? [el.querySelector(option.handle) || el] : Array.from(el.querySelectorAll(option.handle)));\n if (this.dragEls.length === 0) {\n this.dragEls = [el];\n }\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._keyEvent = this._keyEvent.bind(this);\n this.enable();\n }\n on(event, callback) {\n super.on(event, callback);\n }\n off(event) {\n super.off(event);\n }\n enable() {\n if (this.disabled === false)\n return;\n super.enable();\n this.dragEls.forEach(dragEl => {\n dragEl.addEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n dragEl.addEventListener('touchstart', touchstart);\n dragEl.addEventListener('pointerdown', pointerdown);\n // dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n });\n this.el.classList.remove('ui-draggable-disabled');\n }\n disable(forDestroy = false) {\n if (this.disabled === true)\n return;\n super.disable();\n this.dragEls.forEach(dragEl => {\n dragEl.removeEventListener('mousedown', this._mouseDown);\n if (isTouch) {\n dragEl.removeEventListener('touchstart', touchstart);\n dragEl.removeEventListener('pointerdown', pointerdown);\n }\n });\n if (!forDestroy)\n this.el.classList.add('ui-draggable-disabled');\n }\n destroy() {\n if (this.dragTimeout)\n window.clearTimeout(this.dragTimeout);\n delete this.dragTimeout;\n if (this.mouseDownEvent)\n this._mouseUp(this.mouseDownEvent);\n this.disable(true);\n delete this.el;\n delete this.helper;\n delete this.option;\n super.destroy();\n }\n updateOption(opts) {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n return this;\n }\n /** @internal call when mouse goes down before a dragstart happens */\n _mouseDown(e) {\n // if real brower event (trusted:true vs false for our simulated ones) and we didn't correctly clear the last touch event, clear things up\n if (DDTouch.touchHandled && e.isTrusted)\n DDTouch.touchHandled = false;\n // don't let more than one widget handle mouseStart\n if (DDManager.mouseHandled)\n return;\n if (e.button !== 0)\n return true; // only left click\n // make sure we are not clicking on known object that handles mouseDown, or ones supplied by the user\n if (!this.dragEls.find(el => el === e.target) && e.target.closest(skipMouseDown))\n return true;\n if (this.option.cancel) {\n if (e.target.closest(this.option.cancel))\n return true;\n }\n this.mouseDownEvent = e;\n delete this.dragging;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n // document handler so we can continue receiving moves as the item is 'fixed' position, and capture=true so WE get a first crack\n document.addEventListener('mousemove', this._mouseMove, { capture: true, passive: true }); // true=capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (isTouch) {\n e.currentTarget.addEventListener('touchmove', touchmove);\n e.currentTarget.addEventListener('touchend', touchend);\n }\n e.preventDefault();\n // preventDefault() prevents blur event which occurs just after mousedown event.\n // if an editable content has focus, then blur must be call\n if (document.activeElement)\n document.activeElement.blur();\n DDManager.mouseHandled = true;\n return true;\n }\n /** @internal method to call actual drag event */\n _callDrag(e) {\n if (!this.dragging)\n return;\n const ev = Utils.initEvent(e, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n }\n /** @internal called when the main page (after successful mousedown) receives a move event to drag the item around the screen */\n _mouseMove(e) {\n // console.log(`${count++} move ${e.x},${e.y}`)\n const s = this.mouseDownEvent;\n this.lastDrag = e;\n if (this.dragging) {\n this._dragFollow(e);\n // delay actual grid handling drag until we pause for a while if set\n if (DDManager.pauseDrag) {\n const pause = Number.isInteger(DDManager.pauseDrag) ? DDManager.pauseDrag : 100;\n if (this.dragTimeout)\n window.clearTimeout(this.dragTimeout);\n this.dragTimeout = window.setTimeout(() => this._callDrag(e), pause);\n }\n else {\n this._callDrag(e);\n }\n }\n else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 3) {\n /**\n * don't start unless we've moved at least 3 pixels\n */\n this.dragging = true;\n DDManager.dragElement = this;\n // if we're dragging an actual grid item, set the current drop as the grid (to detect enter/leave)\n const grid = this.el.gridstackNode?.grid;\n if (grid) {\n DDManager.dropElement = grid.el.ddElement.ddDroppable;\n }\n else {\n delete DDManager.dropElement;\n }\n this.helper = this._createHelper();\n this._setupHelperContainmentStyle();\n this.dragTransform = Utils.getValuesFromTransformedElement(this.helperContainment);\n this.dragOffset = this._getDragOffset(e, this.el, this.helperContainment);\n this._setupHelperStyle(e);\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstart' });\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.triggerEvent('dragstart', ev);\n // now track keyboard events to cancel or rotate\n document.addEventListener('keydown', this._keyEvent);\n }\n // e.preventDefault(); // passive = true. OLD: was needed otherwise we get text sweep text selection as we drag around\n return true;\n }\n /** @internal call when the mouse gets released to drop the item at current location */\n _mouseUp(e) {\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (isTouch && e.currentTarget) { // destroy() during nested grid call us again wit fake _mouseUp\n e.currentTarget.removeEventListener('touchmove', touchmove, true);\n e.currentTarget.removeEventListener('touchend', touchend, true);\n }\n if (this.dragging) {\n delete this.dragging;\n delete this.el.gridstackNode?._origRotate;\n document.removeEventListener('keydown', this._keyEvent);\n // reset the drop target if dragging over ourself (already parented, just moving during stop callback below)\n if (DDManager.dropElement?.el === this.el.parentElement) {\n delete DDManager.dropElement;\n }\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper !== this.el)\n this.helper.remove(); // hide now\n this._removeHelperStyle();\n const ev = Utils.initEvent(e, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // NOTE: destroy() will be called when removing item, so expect NULL ptr after!\n }\n this.triggerEvent('dragstop', ev);\n // call the droppable method to receive the item\n if (DDManager.dropElement) {\n DDManager.dropElement.drop(e);\n }\n }\n delete this.helper;\n delete this.mouseDownEvent;\n delete DDManager.dragElement;\n delete DDManager.dropElement;\n delete DDManager.mouseHandled;\n e.preventDefault();\n }\n /** @internal call when keys are being pressed - use Esc to cancel, R to rotate */\n _keyEvent(e) {\n const n = this.el.gridstackNode;\n const grid = n?.grid || DDManager.dropElement?.el?.gridstack;\n if (e.key === 'Escape') {\n if (n && n._origRotate) {\n n._orig = n._origRotate;\n delete n._origRotate;\n }\n grid?.cancelDrag();\n this._mouseUp(this.mouseDownEvent);\n }\n else if (n && grid && (e.key === 'r' || e.key === 'R')) {\n if (!Utils.canBeRotated(n))\n return;\n n._origRotate = n._origRotate || { ...n._orig }; // store the real orig size in case we Esc after doing rotation\n delete n._moving; // force rotate to happen (move waits for >50% coverage otherwise)\n grid.setAnimation(false) // immediate rotate so _getDragOffset() gets the right dom size below\n .rotate(n.el, { top: -this.dragOffset.offsetTop, left: -this.dragOffset.offsetLeft })\n .setAnimation();\n n._moving = true;\n this.dragOffset = this._getDragOffset(this.lastDrag, n.el, this.helperContainment);\n this.helper.style.width = this.dragOffset.width + 'px';\n this.helper.style.height = this.dragOffset.height + 'px';\n Utils.swap(n._orig, 'w', 'h');\n delete n._rect;\n this._mouseMove(this.lastDrag);\n }\n }\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\n _createHelper() {\n let helper = this.el;\n if (typeof this.option.helper === 'function') {\n helper = this.option.helper(this.el);\n }\n else if (this.option.helper === 'clone') {\n helper = Utils.cloneNode(this.el);\n }\n if (!helper.parentElement) {\n Utils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentElement : this.option.appendTo);\n }\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(prop => this.el.style[prop]);\n return helper;\n }\n /** @internal set the fix position of the dragged item */\n _setupHelperStyle(e) {\n this.helper.classList.add('ui-draggable-dragging');\n this.el.gridstackNode?.grid?.el.classList.add('grid-stack-dragging');\n // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593\n const style = this.helper.style;\n style.pointerEvents = 'none'; // needed for over items to get enter/leave\n // style.cursor = 'move'; // TODO: can't set with pointerEvents=none ! (no longer in CSS either as no-op)\n style.width = this.dragOffset.width + 'px';\n style.height = this.dragOffset.height + 'px';\n style.willChange = 'left, top';\n style.position = 'fixed'; // let us drag between grids by not clipping as parent .grid-stack is position: 'relative'\n this._dragFollow(e); // now position it\n style.transition = 'none'; // show up instantly\n setTimeout(() => {\n if (this.helper) {\n style.transition = null; // recover animation\n }\n }, 0);\n return this;\n }\n /** @internal restore back the original style before dragging */\n _removeHelperStyle() {\n this.helper.classList.remove('ui-draggable-dragging');\n this.el.gridstackNode?.grid?.el.classList.remove('grid-stack-dragging');\n const node = this.helper?.gridstackNode;\n // don't bother restoring styles if we're gonna remove anyway...\n if (!node?._isAboutToRemove && this.dragElementOriginStyle) {\n const helper = this.helper;\n // don't animate, otherwise we animate offseted when switching back to 'absolute' from 'fixed'.\n // TODO: this also removes resizing animation which doesn't have this issue, but others.\n // Ideally both would animate ('move' would immediately restore 'absolute' and adjust coordinate to match,\n // then trigger a delay (repaint) to restore to final dest with animate) but then we need to make sure 'resizestop'\n // is called AFTER 'transitionend' event is received (see https://github.com/gridstack/gridstack.js/issues/2033)\n const transition = this.dragElementOriginStyle['transition'] || null;\n helper.style.transition = this.dragElementOriginStyle['transition'] = 'none'; // can't be NULL #1973\n DDDraggable.originStyleProp.forEach(prop => helper.style[prop] = this.dragElementOriginStyle[prop] || null);\n setTimeout(() => helper.style.transition = transition, 50); // recover animation from saved vars after a pause (0 isn't enough #1973)\n }\n delete this.dragElementOriginStyle;\n return this;\n }\n /** @internal updates the top/left position to follow the mouse */\n _dragFollow(e) {\n const containmentRect = { left: 0, top: 0 };\n // if (this.helper.style.position === 'absolute') { // we use 'fixed'\n // const { left, top } = this.helperContainment.getBoundingClientRect();\n // containmentRect = { left, top };\n // }\n const style = this.helper.style;\n const offset = this.dragOffset;\n style.left = (e.clientX + offset.offsetLeft - containmentRect.left) * this.dragTransform.xScale + 'px';\n style.top = (e.clientY + offset.offsetTop - containmentRect.top) * this.dragTransform.yScale + 'px';\n }\n /** @internal */\n _setupHelperContainmentStyle() {\n this.helperContainment = this.helper.parentElement;\n if (this.helper.style.position !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n }\n /** @internal */\n _getDragOffset(event, el, parent) {\n // in case ancestor has transform/perspective css properties that change the viewpoint\n let xformOffsetX = 0;\n let xformOffsetY = 0;\n if (parent) {\n xformOffsetX = this.dragTransform.xOffset;\n xformOffsetY = this.dragTransform.yOffset;\n }\n const targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: -event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: -event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width * this.dragTransform.xScale,\n height: targetOffset.height * this.dragTransform.yScale\n };\n }\n /** @internal TODO: set to public as called by DDDroppable! */\n ui() {\n const containmentEl = this.el.parentElement;\n const containmentRect = containmentEl.getBoundingClientRect();\n const offset = this.helper.getBoundingClientRect();\n return {\n position: {\n top: (offset.top - containmentRect.top) * this.dragTransform.yScale,\n left: (offset.left - containmentRect.left) * this.dragTransform.xScale\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n }\n}\n/** @internal properties we change during dragging, and restore back */\nDDDraggable.originStyleProp = ['width', 'height', 'transform', 'transform-origin', 'transition', 'pointerEvents', 'position', 'left', 'top', 'minWidth', 'willChange'];\nexport { DDDraggable };\n//# sourceMappingURL=dd-draggable.js.map","/**\n * dd-droppable.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { DDManager } from './dd-manager';\nimport { DDBaseImplement } from './dd-base-impl';\nimport { Utils } from './utils';\nimport { DDTouch, isTouch, pointerenter, pointerleave } from './dd-touch';\n// let count = 0; // TEST\nexport class DDDroppable extends DDBaseImplement {\n constructor(el, option = {}) {\n super();\n this.el = el;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseEnter = this._mouseEnter.bind(this);\n this._mouseLeave = this._mouseLeave.bind(this);\n this.enable();\n this._setupAccept();\n }\n on(event, callback) {\n super.on(event, callback);\n }\n off(event) {\n super.off(event);\n }\n enable() {\n if (this.disabled === false)\n return;\n super.enable();\n this.el.classList.add('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('mouseenter', this._mouseEnter);\n this.el.addEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.addEventListener('pointerenter', pointerenter);\n this.el.addEventListener('pointerleave', pointerleave);\n }\n }\n disable(forDestroy = false) {\n if (this.disabled === true)\n return;\n super.disable();\n this.el.classList.remove('ui-droppable');\n if (!forDestroy)\n this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('mouseenter', this._mouseEnter);\n this.el.removeEventListener('mouseleave', this._mouseLeave);\n if (isTouch) {\n this.el.removeEventListener('pointerenter', pointerenter);\n this.el.removeEventListener('pointerleave', pointerleave);\n }\n }\n destroy() {\n this.disable(true);\n this.el.classList.remove('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n super.destroy();\n }\n updateOption(opts) {\n Object.keys(opts).forEach(key => this.option[key] = opts[key]);\n this._setupAccept();\n return this;\n }\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n _mouseEnter(e) {\n // console.log(`${count++} Enter ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement)\n return;\n // During touch drag operations, ignore real browser-generated mouseenter events (isTrusted:true) vs our simulated ones (isTrusted:false).\n // The browser can fire spurious mouseenter events when we dispatch simulated mousemove events.\n if (DDTouch.touchHandled && e.isTrusted)\n return;\n if (!this._canDrop(DDManager.dragElement.el))\n return;\n e.preventDefault();\n e.stopPropagation();\n // make sure when we enter this, that the last one gets a leave FIRST to correctly cleanup as we don't always do\n if (DDManager.dropElement && DDManager.dropElement !== this) {\n DDManager.dropElement._mouseLeave(e, true); // calledByEnter = true\n }\n DDManager.dropElement = this;\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(DDManager.dragElement));\n }\n this.triggerEvent('dropover', ev);\n this.el.classList.add('ui-droppable-over');\n // console.log('tracking'); // TEST\n }\n /** @internal called when the item is leaving our area, stop tracking if we had moving item */\n _mouseLeave(e, calledByEnter = false) {\n // console.log(`${count++} Leave ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!DDManager.dragElement || DDManager.dropElement !== this)\n return;\n e.preventDefault();\n e.stopPropagation();\n const ev = Utils.initEvent(e, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(DDManager.dragElement));\n }\n this.triggerEvent('dropout', ev);\n if (DDManager.dropElement === this) {\n delete DDManager.dropElement;\n // console.log('not tracking'); // TEST\n // if we're still over a parent droppable, send it an enter as we don't get one from leaving nested children\n if (!calledByEnter) {\n let parentDrop;\n let parent = this.el.parentElement;\n while (!parentDrop && parent) {\n parentDrop = parent.ddElement?.ddDroppable;\n parent = parent.parentElement;\n }\n if (parentDrop) {\n parentDrop._mouseEnter(e);\n }\n }\n }\n }\n /** item is being dropped on us - called by the drag mouseup handler - this calls the client drop event */\n drop(e) {\n e.preventDefault();\n const ev = Utils.initEvent(e, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(DDManager.dragElement));\n }\n this.triggerEvent('drop', ev);\n }\n /** @internal true if element matches the string/method accept option */\n _canDrop(el) {\n return el && (!this.accept || this.accept(el));\n }\n /** @internal */\n _setupAccept() {\n if (!this.option.accept)\n return this;\n if (typeof this.option.accept === 'string') {\n this.accept = (el) => el.classList.contains(this.option.accept) || el.matches(this.option.accept);\n }\n else {\n this.accept = this.option.accept;\n }\n return this;\n }\n /** @internal */\n _ui(drag) {\n return {\n draggable: drag.el,\n ...drag.ui()\n };\n }\n}\n//# sourceMappingURL=dd-droppable.js.map","/**\n * dd-elements.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { DDResizable } from './dd-resizable';\nimport { DDDraggable } from './dd-draggable';\nimport { DDDroppable } from './dd-droppable';\nexport class DDElement {\n static init(el) {\n if (!el.ddElement) {\n el.ddElement = new DDElement(el);\n }\n return el.ddElement;\n }\n constructor(el) {\n this.el = el;\n }\n on(eventName, callback) {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName, callback);\n }\n else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName, callback);\n }\n else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName, callback);\n }\n return this;\n }\n off(eventName) {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName);\n }\n else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName);\n }\n else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName);\n }\n return this;\n }\n setupDraggable(opts) {\n if (!this.ddDraggable) {\n this.ddDraggable = new DDDraggable(this.el, opts);\n }\n else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n }\n cleanDraggable() {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n }\n setupResizable(opts) {\n if (!this.ddResizable) {\n this.ddResizable = new DDResizable(this.el, opts);\n }\n else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n }\n cleanResizable() {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n }\n setupDroppable(opts) {\n if (!this.ddDroppable) {\n this.ddDroppable = new DDDroppable(this.el, opts);\n }\n else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n }\n cleanDroppable() {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n }\n}\n//# sourceMappingURL=dd-element.js.map","/**\n * dd-gridstack.ts 12.4.2\n * Copyright (c) 2021-2025 Alain Dumesny - see GridStack root license\n */\nimport { Utils } from './utils';\nimport { DDManager } from './dd-manager';\nimport { DDElement } from './dd-element';\n// let count = 0; // TEST\n/**\n * HTML Native Mouse and Touch Events Drag and Drop functionality.\n *\n * This class provides the main drag & drop implementation for GridStack,\n * handling resizing, dragging, and dropping of grid items using native HTML5 events.\n * It manages the interaction between different DD components and the grid system.\n */\nexport class DDGridStack {\n /**\n * Enable/disable/configure resizing for grid elements.\n *\n * @param el - Grid item element(s) to configure\n * @param opts - Resize options or command ('enable', 'disable', 'destroy', 'option', or config object)\n * @param key - Option key when using 'option' command\n * @param value - Option value when using 'option' command\n * @returns this instance for chaining\n *\n * @example\n * dd.resizable(element, 'enable'); // Enable resizing\n * dd.resizable(element, 'option', 'minWidth', 100); // Set minimum width\n */\n resizable(el, opts, key, value) {\n this._getDDElements(el, opts).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\n }\n else if (opts === 'destroy') {\n dEl.ddResizable && dEl.cleanResizable();\n }\n else if (opts === 'option') {\n dEl.setupResizable({ [key]: value });\n }\n else {\n const n = dEl.el.gridstackNode;\n const grid = n.grid;\n let handles = dEl.el.getAttribute('gs-resize-handles') || grid.opts.resizable.handles || 'e,s,se';\n if (handles === 'all')\n handles = 'n,e,s,w,se,sw,ne,nw';\n // NOTE: keep the resize handles as e,w don't have enough space (10px) to show resize corners anyway. limit during drag instead\n // restrict vertical resize if height is done to match content anyway... odd to have it spring back\n // if (Utils.shouldSizeToContent(n, true)) {\n // const doE = handles.indexOf('e') !== -1;\n // const doW = handles.indexOf('w') !== -1;\n // handles = doE ? (doW ? 'e,w' : 'e') : (doW ? 'w' : '');\n // }\n const autoHide = !grid.opts.alwaysShowResizeHandle;\n dEl.setupResizable({\n ...grid.opts.resizable,\n ...{ handles, autoHide },\n ...{\n start: opts.start,\n stop: opts.stop,\n resize: opts.resize\n }\n });\n }\n });\n return this;\n }\n /**\n * Enable/disable/configure dragging for grid elements.\n *\n * @param el - Grid item element(s) to configure\n * @param opts - Drag options or command ('enable', 'disable', 'destroy', 'option', or config object)\n * @param key - Option key when using 'option' command\n * @param value - Option value when using 'option' command\n * @returns this instance for chaining\n *\n * @example\n * dd.draggable(element, 'enable'); // Enable dragging\n * dd.draggable(element, {handle: '.drag-handle'}); // Configure drag handle\n */\n draggable(el, opts, key, value) {\n this._getDDElements(el, opts).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\n }\n else if (opts === 'destroy') {\n dEl.ddDraggable && dEl.cleanDraggable();\n }\n else if (opts === 'option') {\n dEl.setupDraggable({ [key]: value });\n }\n else {\n const grid = dEl.el.gridstackNode.grid;\n dEl.setupDraggable({\n ...grid.opts.draggable,\n ...{\n // containment: (grid.parentGridNode && grid.opts.dragOut === false) ? grid.el.parentElement : (grid.opts.draggable.containment || null),\n start: opts.start,\n stop: opts.stop,\n drag: opts.drag\n }\n });\n }\n });\n return this;\n }\n dragIn(el, opts) {\n this._getDDElements(el).forEach(dEl => dEl.setupDraggable(opts));\n return this;\n }\n droppable(el, opts, key, value) {\n if (typeof opts.accept === 'function' && !opts._accept) {\n opts._accept = opts.accept;\n opts.accept = (el) => opts._accept(el);\n }\n this._getDDElements(el, opts).forEach(dEl => {\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDroppable && dEl.ddDroppable[opts]();\n }\n else if (opts === 'destroy') {\n dEl.ddDroppable && dEl.cleanDroppable();\n }\n else if (opts === 'option') {\n dEl.setupDroppable({ [key]: value });\n }\n else {\n dEl.setupDroppable(opts);\n }\n });\n return this;\n }\n /** true if element is droppable */\n isDroppable(el) {\n return !!(el?.ddElement?.ddDroppable && !el.ddElement.ddDroppable.disabled);\n }\n /** true if element is draggable */\n isDraggable(el) {\n return !!(el?.ddElement?.ddDraggable && !el.ddElement.ddDraggable.disabled);\n }\n /** true if element is draggable */\n isResizable(el) {\n return !!(el?.ddElement?.ddResizable && !el.ddElement.ddResizable.disabled);\n }\n on(el, name, callback) {\n this._getDDElements(el).forEach(dEl => dEl.on(name, (event) => {\n callback(event, DDManager.dragElement ? DDManager.dragElement.el : event.target, DDManager.dragElement ? DDManager.dragElement.helper : null);\n }));\n return this;\n }\n off(el, name) {\n this._getDDElements(el).forEach(dEl => dEl.off(name));\n return this;\n }\n /** @internal returns a list of DD elements, creating them on the fly by default unless option is to destroy or disable */\n _getDDElements(els, opts) {\n // don't force create if we're going to destroy it, unless it's a grid which is used as drop target for it's children\n const create = els.gridstack || opts !== 'destroy' && opts !== 'disable';\n const hosts = Utils.getElements(els);\n if (!hosts.length)\n return [];\n const list = hosts.map(e => e.ddElement || (create ? DDElement.init(e) : null)).filter(d => d); // remove nulls\n return list;\n }\n}\n//# sourceMappingURL=dd-gridstack.js.map","/*!\n * GridStack 12.4.2\n * https://gridstackjs.com/\n *\n * Copyright (c) 2021-2025 Alain Dumesny\n * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE\n */\nimport { GridStackEngine } from './gridstack-engine';\nimport { Utils } from './utils';\nimport { gridDefaults } from './types';\n/*\n * and include D&D by default\n * TODO: while we could generate a gridstack-static.js at smaller size - saves about 31k (41k -> 72k)\n * I don't know how to generate the DD only code at the remaining 31k to delay load as code depends on Gridstack.ts\n * also it caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\n */\nimport { DDGridStack } from './dd-gridstack';\nimport { isTouch } from './dd-touch';\nimport { DDManager } from './dd-manager';\nconst dd = new DDGridStack;\n// export all dependent file as well to make it easier for users to just import the main file\nexport * from './types';\nexport * from './utils';\nexport * from './gridstack-engine';\nexport * from './dd-gridstack';\nexport * from './dd-manager';\nexport * from './dd-element';\nexport * from './dd-draggable';\nexport * from './dd-droppable';\nexport * from './dd-resizable';\nexport * from './dd-resizable-handle';\nexport * from './dd-base-impl';\n/**\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\n * @example\n * <div class=\"grid-stack\">\n * <div class=\"grid-stack-item\">\n * <div class=\"grid-stack-item-content\">Item 1</div>\n * </div>\n * </div>\n */\nclass GridStack {\n /**\n * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\n * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\n * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.\n * @param options grid options (optional)\n * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\n *\n * @example\n * const grid = GridStack.init();\n *\n * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\n * const grid = document.querySelector('.grid-stack').gridstack;\n */\n static init(options = {}, elOrString = '.grid-stack') {\n if (typeof document === 'undefined')\n return null; // temp workaround SSR\n const el = GridStack.getGridElement(elOrString);\n if (!el) {\n if (typeof elOrString === 'string') {\n console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\n }\n else {\n console.error('GridStack.init() no grid element was passed.');\n }\n return null;\n }\n if (!el.gridstack) {\n el.gridstack = new GridStack(el, Utils.cloneDeep(options));\n }\n return el.gridstack;\n }\n /**\n * Will initialize a list of elements (given a selector) and return an array of grids.\n * @param options grid options (optional)\n * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)\n *\n * @example\n * const grids = GridStack.initAll();\n * grids.forEach(...)\n */\n static initAll(options = {}, selector = '.grid-stack') {\n const grids = [];\n if (typeof document === 'undefined')\n return grids; // temp workaround SSR\n GridStack.getGridElements(selector).forEach(el => {\n if (!el.gridstack) {\n el.gridstack = new GridStack(el, Utils.cloneDeep(options));\n }\n grids.push(el.gridstack);\n });\n if (grids.length === 0) {\n console.error('GridStack.initAll() no grid was found with selector \"' + selector + '\" - element missing or wrong selector ?' +\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\n }\n return grids;\n }\n /**\n * call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then\n * grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from\n * JSON serialized data, including options.\n * @param parent HTML element parent to the grid\n * @param opt grids options used to initialize the grid, and list of children\n */\n static addGrid(parent, opt = {}) {\n if (!parent)\n return null;\n let el = parent;\n if (el.gridstack) {\n // already a grid - set option and load data\n const grid = el.gridstack;\n if (opt)\n grid.opts = { ...grid.opts, ...opt };\n if (opt.children !== undefined)\n grid.load(opt.children);\n return grid;\n }\n // create the grid element, but check if the passed 'parent' already has grid styling and should be used instead\n const parentIsGrid = parent.classList.contains('grid-stack');\n if (!parentIsGrid || GridStack.addRemoveCB) {\n if (GridStack.addRemoveCB) {\n el = GridStack.addRemoveCB(parent, opt, true, true);\n }\n else {\n el = Utils.createDiv(['grid-stack', opt.class], parent);\n }\n }\n // create grid class and load any children\n const grid = GridStack.init(opt, el);\n return grid;\n }\n /** call this method to register your engine instead of the default one.\n * See instead `GridStackOptions.engineClass` if you only need to\n * replace just one instance.\n */\n static registerEngine(engineClass) {\n GridStack.engineClass = engineClass;\n }\n /**\n * @internal create placeholder DIV as needed\n * @returns the placeholder element for indicating drop zones during drag operations\n */\n get placeholder() {\n if (!this._placeholder) {\n this._placeholder = Utils.createDiv([this.opts.placeholderClass, gridDefaults.itemClass, this.opts.itemClass]);\n const placeholderChild = Utils.createDiv(['placeholder-content'], this._placeholder);\n if (this.opts.placeholderText) {\n placeholderChild.textContent = this.opts.placeholderText;\n }\n }\n return this._placeholder;\n }\n /**\n * Construct a grid item from the given element and options\n * @param el the HTML element tied to this grid after it's been initialized\n * @param opts grid options - public for classes to access, but use methods to modify!\n */\n constructor(el, opts = {}) {\n this.el = el;\n this.opts = opts;\n /** time to wait for animation (if enabled) to be done so content sizing can happen */\n this.animationDelay = 300 + 10;\n /** @internal */\n this._gsEventHandler = {};\n /** @internal extra row added when dragging at the bottom of the grid */\n this._extraDragRow = 0;\n /** @internal meant to store the scale of the active grid */\n this.dragTransform = { xScale: 1, yScale: 1, xOffset: 0, yOffset: 0 };\n el.gridstack = this;\n this.opts = opts = opts || {}; // handles null/undefined/0\n if (!el.classList.contains('grid-stack')) {\n this.el.classList.add('grid-stack');\n }\n // if row property exists, replace minRow and maxRow instead\n if (opts.row) {\n opts.minRow = opts.maxRow = opts.row;\n delete opts.row;\n }\n const rowAttr = Utils.toNumber(el.getAttribute('gs-row'));\n // flag only valid in sub-grids (handled by parent, not here)\n if (opts.column === 'auto') {\n delete opts.column;\n }\n // save original setting so we can restore on save\n if (opts.alwaysShowResizeHandle !== undefined) {\n opts._alwaysShowResizeHandle = opts.alwaysShowResizeHandle;\n }\n // cleanup responsive opts (must have columnWidth | breakpoints) then sort breakpoints by size (so we can match during resize)\n const resp = opts.columnOpts;\n if (resp) {\n const bk = resp.breakpoints;\n if (!resp.columnWidth && !bk?.length) {\n delete opts.columnOpts;\n }\n else {\n resp.columnMax = resp.columnMax || 12;\n if (bk?.length > 1)\n bk.sort((a, b) => (b.w || 0) - (a.w || 0));\n }\n }\n // elements DOM attributes override any passed options (like CSS style) - merge the two together\n const defaults = {\n ...Utils.cloneDeep(gridDefaults),\n column: Utils.toNumber(el.getAttribute('gs-column')) || gridDefaults.column,\n minRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-min-row')) || gridDefaults.minRow,\n maxRow: rowAttr ? rowAttr : Utils.toNumber(el.getAttribute('gs-max-row')) || gridDefaults.maxRow,\n staticGrid: Utils.toBool(el.getAttribute('gs-static')) || gridDefaults.staticGrid,\n sizeToContent: Utils.toBool(el.getAttribute('gs-size-to-content')) || undefined,\n draggable: {\n handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || gridDefaults.draggable.handle,\n },\n removableOptions: {\n accept: opts.itemClass || gridDefaults.removableOptions.accept,\n decline: gridDefaults.removableOptions.decline\n },\n };\n if (el.getAttribute('gs-animate')) { // default to true, but if set to false use that instead\n defaults.animate = Utils.toBool(el.getAttribute('gs-animate'));\n }\n opts = Utils.defaults(opts, defaults);\n this._initMargin(); // part of settings defaults...\n // Now check if we're loading into !12 column mode FIRST so we don't do un-necessary work (like cellHeight = width / 12 then go 1 column)\n this.checkDynamicColumn();\n this._updateColumnVar(opts);\n if (opts.rtl === 'auto') {\n opts.rtl = (el.style.direction === 'rtl');\n }\n if (opts.rtl) {\n this.el.classList.add('grid-stack-rtl');\n }\n // check if we're been nested, and if so update our style and keep pointer around (used during save)\n const parentGridItem = this.el.closest('.' + gridDefaults.itemClass);\n const parentNode = parentGridItem?.gridstackNode;\n if (parentNode) {\n parentNode.subGrid = this;\n this.parentGridNode = parentNode;\n this.el.classList.add('grid-stack-nested');\n parentNode.el.classList.add('grid-stack-sub-grid');\n }\n this._isAutoCellHeight = (opts.cellHeight === 'auto');\n if (this._isAutoCellHeight || opts.cellHeight === 'initial') {\n // make the cell content square initially (will use resize/column event to keep it square)\n this.cellHeight(undefined);\n }\n else {\n // append unit if any are set\n if (typeof opts.cellHeight == 'number' && opts.cellHeightUnit && opts.cellHeightUnit !== gridDefaults.cellHeightUnit) {\n opts.cellHeight = opts.cellHeight + opts.cellHeightUnit;\n delete opts.cellHeightUnit;\n }\n const val = opts.cellHeight;\n delete opts.cellHeight; // force initial cellHeight() call to set the value\n this.cellHeight(val);\n }\n // see if we need to adjust auto-hide\n if (opts.alwaysShowResizeHandle === 'mobile') {\n opts.alwaysShowResizeHandle = isTouch;\n }\n this._setStaticClass();\n const engineClass = opts.engineClass || GridStack.engineClass || GridStackEngine;\n this.engine = new engineClass({\n column: this.getColumn(),\n float: opts.float,\n maxRow: opts.maxRow,\n onChange: (cbNodes) => {\n cbNodes.forEach(n => {\n const el = n.el;\n if (!el)\n return;\n if (n._removeDOM) {\n if (el)\n el.remove();\n delete n._removeDOM;\n }\n else {\n this._writePosAttr(el, n);\n }\n });\n this._updateContainerHeight();\n }\n });\n if (opts.auto) {\n this.batchUpdate(); // prevent in between re-layout #1535 TODO: this only set float=true, need to prevent collision check...\n this.engine._loading = true; // loading collision check\n this.getGridItems().forEach(el => this._prepareElement(el));\n delete this.engine._loading;\n this.batchUpdate(false);\n }\n // load any passed in children as well, which overrides any DOM layout done above\n if (opts.children) {\n const children = opts.children;\n delete opts.children;\n if (children.length)\n this.load(children); // don't load empty\n }\n this.setAnimation();\n // dynamic grids require pausing during drag to detect over to nest vs push\n if (opts.subGridDynamic && !DDManager.pauseDrag)\n DDManager.pauseDrag = true;\n if (opts.draggable?.pause !== undefined)\n DDManager.pauseDrag = opts.draggable.pause;\n this._setupRemoveDrop();\n this._setupAcceptWidget();\n this._updateResizeEvent();\n }\n _updateColumnVar(opts = this.opts) {\n this.el.classList.add('gs-' + opts.column);\n if (typeof opts.column === 'number')\n this.el.style.setProperty('--gs-column-width', `${100 / opts.column}%`);\n }\n /**\n * add a new widget and returns it.\n *\n * Widget will be always placed even if result height is more than actual grid height.\n * You need to use `willItFit()` before calling addWidget for additional check.\n * See also `makeWidget(el)` for DOM element.\n *\n * @example\n * const grid = GridStack.init();\n * grid.addWidget({w: 3, content: 'hello'});\n *\n * @param w GridStackWidget definition. used MakeWidget(el) if you have dom element instead.\n */\n addWidget(w) {\n if (!w)\n return;\n if (typeof w === 'string') {\n console.error('V11: GridStack.addWidget() does not support string anymore. see #2736');\n return;\n }\n if (w.ELEMENT_NODE) {\n console.error('V11: GridStack.addWidget() does not support HTMLElement anymore. use makeWidget()');\n return this.makeWidget(w);\n }\n let el;\n let node = w;\n node.grid = this;\n if (node.el) {\n el = node.el; // re-use element stored in the node\n }\n else if (GridStack.addRemoveCB) {\n el = GridStack.addRemoveCB(this.el, w, true, false);\n }\n else {\n el = this.createWidgetDivs(node);\n }\n if (!el)\n return;\n // if the caller ended up initializing the widget in addRemoveCB, or we stared with one already, skip the rest\n node = el.gridstackNode;\n if (node && el.parentElement === this.el && this.engine.nodes.find(n => n._id === node._id))\n return el;\n // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos\n // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz') before adding the node.\n // So make sure we load any DOM attributes that are not specified in passed in options (which override)\n const domAttr = this._readAttr(el);\n Utils.defaults(w, domAttr);\n this.engine.prepareNode(w);\n // this._writeAttr(el, w); why write possibly incorrect values back when makeWidget() will ?\n this.el.appendChild(el);\n this.makeWidget(el, w);\n return el;\n }\n /**\n * Create the default grid item divs and content (possibly lazy loaded) by using GridStack.renderCB().\n *\n * @param n GridStackNode definition containing widget configuration\n * @returns the created HTML element with proper grid item structure\n *\n * @example\n * const element = grid.createWidgetDivs({ w: 2, h: 1, content: 'Hello World' });\n */\n createWidgetDivs(n) {\n const el = Utils.createDiv(['grid-stack-item', this.opts.itemClass]);\n const cont = Utils.createDiv(['grid-stack-item-content'], el);\n if (Utils.lazyLoad(n)) {\n if (!n.visibleObservable) {\n n.visibleObservable = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n n.visibleObservable?.disconnect();\n delete n.visibleObservable;\n GridStack.renderCB(cont, n);\n n.grid?.prepareDragDrop(n.el);\n }\n });\n window.setTimeout(() => n.visibleObservable?.observe(el)); // wait until callee sets position attributes\n }\n }\n else\n GridStack.renderCB(cont, n);\n return el;\n }\n /**\n * Convert an existing gridItem element into a sub-grid with the given (optional) options, else inherit them\n * from the parent's subGrid options.\n * @param el gridItem element to convert\n * @param ops (optional) sub-grid options, else default to node, then parent settings, else defaults\n * @param nodeToAdd (optional) node to add to the newly created sub grid (used when dragging over existing regular item)\n * @param saveContent if true (default) the html inside .grid-stack-content will be saved to child widget\n * @returns newly created grid\n */\n makeSubGrid(el, ops, nodeToAdd, saveContent = true) {\n let node = el.gridstackNode;\n if (!node) {\n node = this.makeWidget(el).gridstackNode;\n }\n if (node.subGrid?.el)\n return node.subGrid; // already done\n // find the template subGrid stored on a parent as fallback...\n let subGridTemplate; // eslint-disable-next-line @typescript-eslint/no-this-alias\n let grid = this;\n while (grid && !subGridTemplate) {\n subGridTemplate = grid.opts?.subGridOpts;\n grid = grid.parentGridNode?.grid;\n }\n //... and set the create options\n ops = Utils.cloneDeep({\n // by default sub-grid inherit from us | parent, other than id, children, etc...\n ...this.opts, id: undefined, children: undefined, column: 'auto', columnOpts: undefined, layout: 'list', subGridOpts: undefined,\n ...(subGridTemplate || {}),\n ...(ops || node.subGridOpts || {})\n });\n node.subGridOpts = ops;\n // if column special case it set, remember that flag and set default\n let autoColumn;\n if (ops.column === 'auto') {\n autoColumn = true;\n ops.column = Math.max(node.w || 1, nodeToAdd?.w || 1);\n delete ops.columnOpts; // driven by parent\n }\n // if we're converting an existing full item, move over the content to be the first sub item in the new grid\n let content = node.el.querySelector('.grid-stack-item-content');\n let newItem;\n let newItemOpt;\n if (saveContent) {\n this._removeDD(node.el); // remove D&D since it's set on content div\n newItemOpt = { ...node, x: 0, y: 0 };\n Utils.removeInternalForSave(newItemOpt);\n delete newItemOpt.subGridOpts;\n if (node.content) {\n newItemOpt.content = node.content;\n delete node.content;\n }\n if (GridStack.addRemoveCB) {\n newItem = GridStack.addRemoveCB(this.el, newItemOpt, true, false);\n }\n else {\n newItem = Utils.createDiv(['grid-stack-item']);\n newItem.appendChild(content);\n content = Utils.createDiv(['grid-stack-item-content'], node.el);\n }\n this.prepareDragDrop(node.el); // ... and restore original D&D\n }\n // if we're adding an additional item, make the container large enough to have them both\n if (nodeToAdd) {\n const w = autoColumn ? ops.column : node.w;\n const h = node.h + nodeToAdd.h;\n const style = node.el.style;\n style.transition = 'none'; // show up instantly so we don't see scrollbar with nodeToAdd\n this.update(node.el, { w, h });\n setTimeout(() => style.transition = null); // recover animation\n }\n const subGrid = node.subGrid = GridStack.addGrid(content, ops);\n if (nodeToAdd?._moving)\n subGrid._isTemp = true; // prevent re-nesting as we add over\n if (autoColumn)\n subGrid._autoColumn = true;\n // add the original content back as a child of the newly created grid\n if (saveContent) {\n subGrid.makeWidget(newItem, newItemOpt);\n }\n // now add any additional node\n if (nodeToAdd) {\n if (nodeToAdd._moving) {\n // create an artificial event even for the just created grid to receive this item\n window.setTimeout(() => Utils.simulateMouseEvent(nodeToAdd._event, 'mouseenter', subGrid.el), 0);\n }\n else {\n subGrid.makeWidget(node.el, node);\n }\n }\n // if sizedToContent, we need to re-calc the size of ourself\n this.resizeToContentCheck(false, node);\n return subGrid;\n }\n /**\n * called when an item was converted into a nested grid to accommodate a dragged over item, but then item leaves - return back\n * to the original grid-item. Also called to remove empty sub-grids when last item is dragged out (since re-creating is simple)\n */\n removeAsSubGrid(nodeThatRemoved) {\n const pGrid = this.parentGridNode?.grid;\n if (!pGrid)\n return;\n pGrid.batchUpdate();\n pGrid.removeWidget(this.parentGridNode.el, true, true);\n this.engine.nodes.forEach(n => {\n // migrate any children over and offsetting by our location\n n.x += this.parentGridNode.x;\n n.y += this.parentGridNode.y;\n pGrid.makeWidget(n.el, n);\n });\n pGrid.batchUpdate(false);\n if (this.parentGridNode)\n delete this.parentGridNode.subGrid;\n delete this.parentGridNode;\n // create an artificial event for the original grid now that this one is gone (got a leave, but won't get enter)\n if (nodeThatRemoved) {\n window.setTimeout(() => Utils.simulateMouseEvent(nodeThatRemoved._event, 'mouseenter', pGrid.el), 0);\n }\n }\n /**\n * saves the current layout returning a list of widgets for serialization which might include any nested grids.\n * @param saveContent if true (default) the latest html inside .grid-stack-content will be saved to GridStackWidget.content field, else it will\n * be removed.\n * @param saveGridOpt if true (default false), save the grid options itself, so you can call the new GridStack.addGrid()\n * to recreate everything from scratch. GridStackOptions.children would then contain the widget list instead.\n * @param saveCB callback for each node -> widget, so application can insert additional data to be saved into the widget data structure.\n * @param column if provided, the grid will be saved for the given column size (IFF we have matching internal saved layout, or current layout).\n * Otherwise it will use the largest possible layout (say 12 even if rendering at 1 column) so we can restore to all layouts.\n * NOTE: if you want to save to currently display layout, pass this.getColumn() as column.\n * NOTE2: nested grids will ALWAYS save to the container size to be in sync with parent.\n * @returns list of widgets or full grid option, including .children list of widgets\n */\n save(saveContent = true, saveGridOpt = false, saveCB = GridStack.saveCB, column) {\n // return copied GridStackWidget (with optionally .el) we can modify at will...\n const list = this.engine.save(saveContent, saveCB, column);\n // check for HTML content and nested grids\n list.forEach(n => {\n if (saveContent && n.el && !n.subGrid && !saveCB) { // sub-grid are saved differently, not plain content\n const itemContent = n.el.querySelector('.grid-stack-item-content');\n n.content = itemContent?.innerHTML;\n if (!n.content)\n delete n.content;\n }\n else {\n if (!saveContent && !saveCB) {\n delete n.content;\n }\n // check for nested grid - make sure it saves to the given container size to be consistent\n if (n.subGrid?.el) {\n const column = n.w || n.subGrid.getColumn();\n const listOrOpt = n.subGrid.save(saveContent, saveGridOpt, saveCB, column);\n n.subGridOpts = (saveGridOpt ? listOrOpt : { children: listOrOpt });\n delete n.subGrid;\n }\n }\n delete n.el;\n });\n // check if save entire grid options (needed for recursive) + children...\n if (saveGridOpt) {\n const o = Utils.cloneDeep(this.opts);\n // delete default values that will be recreated on launch\n if (o.marginBottom === o.marginTop && o.marginRight === o.marginLeft && o.marginTop === o.marginRight) {\n o.margin = o.marginTop;\n delete o.marginTop;\n delete o.marginRight;\n delete o.marginBottom;\n delete o.marginLeft;\n }\n if (o.rtl === (this.el.style.direction === 'rtl')) {\n o.rtl = 'auto';\n }\n if (this._isAutoCellHeight) {\n o.cellHeight = 'auto';\n }\n if (this._autoColumn) {\n o.column = 'auto';\n }\n const origShow = o._alwaysShowResizeHandle;\n delete o._alwaysShowResizeHandle;\n if (origShow !== undefined) {\n o.alwaysShowResizeHandle = origShow;\n }\n else {\n delete o.alwaysShowResizeHandle;\n }\n Utils.removeInternalAndSame(o, gridDefaults);\n o.children = list;\n return o;\n }\n return list;\n }\n /**\n * Load widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.\n * Used to restore a grid layout for a saved layout list (see `save()`).\n *\n * @param items list of widgets definition to update/create\n * @param addRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving\n * the user control of insertion.\n * @returns the grid instance for chaining\n *\n * @example\n * // Basic usage with saved layout\n * const savedLayout = grid.save(); // Save current layout\n * // ... later restore it\n * grid.load(savedLayout);\n *\n * // Load with custom add/remove callback\n * grid.load(layout, (items, grid, add) => {\n * if (add) {\n * // Custom logic for adding new widgets\n * items.forEach(item => {\n * const el = document.createElement('div');\n * el.innerHTML = item.content || '';\n * grid.addWidget(el, item);\n * });\n * } else {\n * // Custom logic for removing widgets\n * items.forEach(item => grid.removeWidget(item.el));\n * }\n * });\n *\n * // Load without adding/removing missing widgets\n * grid.load(layout, false);\n *\n * @see {@link http://gridstackjs.com/demo/serialization.html} for complete example\n */\n load(items, addRemove = GridStack.addRemoveCB || true) {\n items = Utils.cloneDeep(items); // so we can mod\n const column = this.getColumn();\n // make sure size 1x1 (default) is present as it may need to override current sizes\n items.forEach(n => { n.w = n.w || n.minW || 1; n.h = n.h || n.minH || 1; });\n // sort items. those without coord will be appended last\n items = Utils.sort(items);\n this.engine.skipCacheUpdate = this._ignoreLayoutsNodeChange = true; // skip layout update\n // if we're loading a layout into for example 1 column and items don't fit, make sure to save\n // the original wanted layout so we can scale back up correctly #1471\n let maxColumn = 0;\n items.forEach(n => { maxColumn = Math.max(maxColumn, (n.x || 0) + n.w); });\n if (maxColumn > this.engine.defaultColumn)\n this.engine.defaultColumn = maxColumn;\n if (maxColumn > column) {\n // if we're loading (from empty) into a smaller column, check for special responsive layout\n if (this.engine.nodes.length === 0 && this.responseLayout) {\n this.engine.nodes = items;\n this.engine.columnChanged(maxColumn, column, this.responseLayout);\n items = this.engine.nodes;\n this.engine.nodes = [];\n delete this.responseLayout;\n }\n else\n this.engine.cacheLayout(items, maxColumn, true);\n }\n // if given a different callback, temporally set it as global option so creating will use it\n const prevCB = GridStack.addRemoveCB;\n if (typeof (addRemove) === 'function')\n GridStack.addRemoveCB = addRemove;\n const removed = [];\n this.batchUpdate();\n // if we are loading from empty temporarily remove animation\n const blank = !this.engine.nodes.length;\n const noAnim = blank && this.opts.animate;\n if (noAnim)\n this.setAnimation(false);\n // see if any items are missing from new layout and need to be removed first\n if (!blank && addRemove) {\n const copyNodes = [...this.engine.nodes]; // don't loop through array you modify\n copyNodes.forEach(n => {\n if (!n.id)\n return;\n const item = Utils.find(items, n.id);\n if (!item) {\n if (GridStack.addRemoveCB)\n GridStack.addRemoveCB(this.el, n, false, false);\n removed.push(n); // batch keep track\n this.removeWidget(n.el, true, false);\n }\n });\n }\n // now add/update the widgets - starting with removing items in the new layout we will reposition\n // to reduce collision and add no-coord ones at next available spot\n this.engine._loading = true; // help with collision\n const updateNodes = [];\n this.engine.nodes = this.engine.nodes.filter(n => {\n if (Utils.find(items, n.id)) {\n updateNodes.push(n);\n return false;\n } // remove if found from list\n return true;\n });\n items.forEach(w => {\n const item = Utils.find(updateNodes, w.id);\n if (item) {\n // if item sizes to content, re-use the exiting height so it's a better guess at the final size (same if width doesn't change)\n if (Utils.shouldSizeToContent(item))\n w.h = item.h;\n // check if missing coord, in which case find next empty slot with new (or old if missing) sizes\n this.engine.nodeBoundFix(w);\n if (w.autoPosition || w.x === undefined || w.y === undefined) {\n w.w = w.w || item.w;\n w.h = w.h || item.h;\n this.engine.findEmptyPosition(w);\n }\n // add back to current list BUT force a collision check if it 'appears' we didn't change to make sure we don't overlap others now\n this.engine.nodes.push(item);\n if (Utils.samePos(item, w) && this.engine.nodes.length > 1) {\n this.moveNode(item, { ...w, forceCollide: true });\n Utils.copyPos(w, item); // use possily updated values before update() is called next (no-op since already moved)\n }\n this.update(item.el, w);\n if (w.subGridOpts?.children) { // update any sub grid as well\n const sub = item.el.querySelector('.grid-stack');\n if (sub && sub.gridstack) {\n sub.gridstack.load(w.subGridOpts.children); // TODO: support updating grid options ?\n }\n }\n }\n else if (addRemove) {\n this.addWidget(w);\n }\n });\n delete this.engine._loading; // done loading\n this.engine.removedNodes = removed;\n this.batchUpdate(false);\n // after commit, clear that flag\n delete this._ignoreLayoutsNodeChange;\n delete this.engine.skipCacheUpdate;\n prevCB ? GridStack.addRemoveCB = prevCB : delete GridStack.addRemoveCB;\n if (noAnim)\n this.setAnimation(true, true); // delay adding animation back\n return this;\n }\n /**\n * use before calling a bunch of `addWidget()` to prevent un-necessary relayouts in between (more efficient)\n * and get a single event callback. You will see no changes until `batchUpdate(false)` is called.\n */\n batchUpdate(flag = true) {\n this.engine.batchUpdate(flag);\n if (!flag) {\n this._updateContainerHeight();\n this._triggerRemoveEvent();\n this._triggerAddEvent();\n this._triggerChangeEvent();\n }\n return this;\n }\n /**\n * Gets the current cell height in pixels. This takes into account the unit type and converts to pixels if necessary.\n *\n * @param forcePixel if true, forces conversion to pixels even when cellHeight is specified in other units\n * @returns the cell height in pixels\n *\n * @example\n * const height = grid.getCellHeight();\n * console.log('Cell height:', height, 'px');\n *\n * // Force pixel conversion\n * const pixelHeight = grid.getCellHeight(true);\n */\n getCellHeight(forcePixel = false) {\n if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\n (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\n return this.opts.cellHeight;\n }\n // do rem/em/cm/mm to px conversion\n if (this.opts.cellHeightUnit === 'rem') {\n return this.opts.cellHeight * parseFloat(getComputedStyle(document.documentElement).fontSize);\n }\n if (this.opts.cellHeightUnit === 'em') {\n return this.opts.cellHeight * parseFloat(getComputedStyle(this.el).fontSize);\n }\n if (this.opts.cellHeightUnit === 'cm') {\n // 1cm = 96px/2.54. See https://www.w3.org/TR/css-values-3/#absolute-lengths\n return this.opts.cellHeight * (96 / 2.54);\n }\n if (this.opts.cellHeightUnit === 'mm') {\n return this.opts.cellHeight * (96 / 2.54) / 10;\n }\n // else get first cell height\n const el = this.el.querySelector('.' + this.opts.itemClass);\n if (el) {\n const h = Utils.toNumber(el.getAttribute('gs-h')) || 1; // since we don't write 1 anymore\n return Math.round(el.offsetHeight / h);\n }\n // else do entire grid and # of rows (but doesn't work if min-height is the actual constrain)\n const rows = parseInt(this.el.getAttribute('gs-current-row'));\n return rows ? Math.round(this.el.getBoundingClientRect().height / rows) : this.opts.cellHeight;\n }\n /**\n * Update current cell height - see `GridStackOptions.cellHeight` for format by updating eh Browser CSS variable.\n *\n * @param val the cell height. Options:\n * - `undefined`: cells content will be made square (match width minus margin)\n * - `0`: the CSS will be generated by the application instead\n * - number: height in pixels\n * - string: height with units (e.g., '70px', '5rem', '2em')\n * @returns the grid instance for chaining\n *\n * @example\n * grid.cellHeight(100); // 100px height\n * grid.cellHeight('70px'); // explicit pixel height\n * grid.cellHeight('5rem'); // relative to root font size\n * grid.cellHeight(grid.cellWidth() * 1.2); // aspect ratio\n * grid.cellHeight('auto'); // auto-size based on content\n */\n cellHeight(val) {\n // if not called internally, check if we're changing mode\n if (val !== undefined) {\n if (this._isAutoCellHeight !== (val === 'auto')) {\n this._isAutoCellHeight = (val === 'auto');\n this._updateResizeEvent();\n }\n }\n if (val === 'initial' || val === 'auto') {\n val = undefined;\n }\n // make item content be square\n if (val === undefined) {\n const marginDiff = -this.opts.marginRight - this.opts.marginLeft\n + this.opts.marginTop + this.opts.marginBottom;\n val = this.cellWidth() + marginDiff;\n }\n const data = Utils.parseHeight(val);\n if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {\n return this;\n }\n this.opts.cellHeightUnit = data.unit;\n this.opts.cellHeight = data.h;\n // finally update var and container\n this.el.style.setProperty('--gs-cell-height', `${this.opts.cellHeight}${this.opts.cellHeightUnit}`);\n this._updateContainerHeight();\n this.resizeToContentCheck();\n return this;\n }\n /** Gets current cell width. */\n /**\n * Gets the current cell width in pixels. This is calculated based on the grid container width divided by the number of columns.\n *\n * @returns the cell width in pixels\n *\n * @example\n * const width = grid.cellWidth();\n * console.log('Cell width:', width, 'px');\n *\n * // Use cell width to calculate widget dimensions\n * const widgetWidth = width * 3; // For a 3-column wide widget\n */\n cellWidth() {\n return this._widthOrContainer() / this.getColumn();\n }\n /** return our expected width (or parent) , and optionally of window for dynamic column check */\n _widthOrContainer(forBreakpoint = false) {\n // use `offsetWidth` or `clientWidth` (no scrollbar) ?\n // https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n return forBreakpoint && this.opts.columnOpts?.breakpointForWindow ? window.innerWidth : (this.el.clientWidth || this.el.parentElement.clientWidth || window.innerWidth);\n }\n /** checks for dynamic column count for our current size, returning true if changed */\n checkDynamicColumn() {\n const resp = this.opts.columnOpts;\n if (!resp || (!resp.columnWidth && !resp.breakpoints?.length))\n return false;\n const column = this.getColumn();\n let newColumn = column;\n const w = this._widthOrContainer(true);\n if (resp.columnWidth) {\n newColumn = Math.min(Math.round(w / resp.columnWidth) || 1, resp.columnMax);\n }\n else {\n // find the closest breakpoint (already sorted big to small) that matches\n newColumn = resp.columnMax;\n let i = 0;\n while (i < resp.breakpoints.length && w <= resp.breakpoints[i].w) {\n newColumn = resp.breakpoints[i++].c || column;\n }\n }\n if (newColumn !== column) {\n const bk = resp.breakpoints?.find(b => b.c === newColumn);\n this.column(newColumn, bk?.layout || resp.layout);\n return true;\n }\n return false;\n }\n /**\n * Re-layout grid items to reclaim any empty space. This is useful after removing widgets\n * or when you want to optimize the layout.\n *\n * @param layout layout type. Options:\n * - 'compact' (default): might re-order items to fill any empty space\n * - 'list': keep the widget left->right order the same, even if that means leaving an empty slot if things don't fit\n * @param doSort re-sort items first based on x,y position. Set to false to do your own sorting ahead (default: true)\n * @returns the grid instance for chaining\n *\n * @example\n * // Compact layout after removing widgets\n * grid.removeWidget('.widget-to-remove');\n * grid.compact();\n *\n * // Use list layout (preserve order)\n * grid.compact('list');\n *\n * // Compact without sorting first\n * grid.compact('compact', false);\n */\n compact(layout = 'compact', doSort = true) {\n this.engine.compact(layout, doSort);\n this._triggerChangeEvent();\n return this;\n }\n /**\n * Set the number of columns in the grid. Will update existing widgets to conform to new number of columns,\n * as well as cache the original layout so you can revert back to previous positions without loss.\n *\n * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11] columns,\n * else you will need to generate correct CSS.\n * See: https://github.com/gridstack/gridstack.js#change-grid-columns\n *\n * @param column Integer > 0 (default 12)\n * @param layout specify the type of re-layout that will happen. Options:\n * - 'moveScale' (default): scale widget positions and sizes\n * - 'move': keep widget sizes, only move positions\n * - 'scale': keep widget positions, only scale sizes\n * - 'none': don't change widget positions or sizes\n * Note: items will never be outside of the current column boundaries.\n * Ignored for `column=1` as we always want to vertically stack.\n * @returns the grid instance for chaining\n *\n * @example\n * // Change to 6 columns with default scaling\n * grid.column(6);\n *\n * // Change to 4 columns, only move positions\n * grid.column(4, 'move');\n *\n * // Single column layout (vertical stack)\n * grid.column(1);\n */\n column(column, layout = 'moveScale') {\n if (!column || column < 1 || this.opts.column === column)\n return this;\n const oldColumn = this.getColumn();\n this.opts.column = column;\n if (!this.engine) {\n // called in constructor, noting else to do but remember that breakpoint layout\n this.responseLayout = layout;\n return this;\n }\n this.engine.column = column;\n this.el.classList.remove('gs-' + oldColumn);\n this._updateColumnVar();\n // update the items now\n this.engine.columnChanged(oldColumn, column, layout);\n if (this._isAutoCellHeight)\n this.cellHeight();\n this.resizeToContentCheck(true); // wait for width resizing\n // and trigger our event last...\n this._ignoreLayoutsNodeChange = true; // skip layout update\n this._triggerChangeEvent();\n delete this._ignoreLayoutsNodeChange;\n return this;\n }\n /**\n * Get the number of columns in the grid (default 12).\n *\n * @returns the current number of columns in the grid\n *\n * @example\n * const columnCount = grid.getColumn(); // returns 12 by default\n */\n getColumn() { return this.opts.column; }\n /**\n * Returns an array of grid HTML elements (no placeholder) - used to iterate through our children in DOM order.\n * This method excludes placeholder elements and returns only actual grid items.\n *\n * @returns array of GridItemHTMLElement instances representing all grid items\n *\n * @example\n * const items = grid.getGridItems();\n * items.forEach(item => {\n * console.log('Item ID:', item.gridstackNode.id);\n * });\n */\n getGridItems() {\n return Array.from(this.el.children)\n .filter((el) => el.matches('.' + this.opts.itemClass) && !el.matches('.' + this.opts.placeholderClass));\n }\n /**\n * Returns true if change callbacks should be ignored due to column change, sizeToContent, loading, etc.\n * This is useful for callers who want to implement dirty flag functionality.\n *\n * @returns true if change callbacks are currently being ignored\n *\n * @example\n * if (!grid.isIgnoreChangeCB()) {\n * // Process the change event\n * console.log('Grid layout changed');\n * }\n */\n isIgnoreChangeCB() { return this._ignoreLayoutsNodeChange; }\n /**\n * Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.\n * @param removeDOM if `false` grid and items HTML elements will not be removed from the DOM (Optional. Default `true`).\n */\n destroy(removeDOM = true) {\n if (!this.el)\n return; // prevent multiple calls\n this.offAll();\n this._updateResizeEvent(true);\n this.setStatic(true, false); // permanently removes DD but don't set CSS class (we're going away)\n this.setAnimation(false);\n if (!removeDOM) {\n this.removeAll(removeDOM);\n this.el.removeAttribute('gs-current-row');\n }\n else {\n this.el.parentNode.removeChild(this.el);\n }\n if (this.parentGridNode)\n delete this.parentGridNode.subGrid;\n delete this.parentGridNode;\n delete this.opts;\n delete this._placeholder?.gridstackNode;\n delete this._placeholder;\n delete this.engine;\n delete this.el.gridstack; // remove circular dependency that would prevent a freeing\n delete this.el;\n return this;\n }\n /**\n * Enable/disable floating widgets (default: `false`). When enabled, widgets can float up to fill empty spaces.\n * See [example](http://gridstackjs.com/demo/float.html)\n *\n * @param val true to enable floating, false to disable\n * @returns the grid instance for chaining\n *\n * @example\n * grid.float(true); // Enable floating\n * grid.float(false); // Disable floating (default)\n */\n float(val) {\n if (this.opts.float !== val) {\n this.opts.float = this.engine.float = val;\n this._triggerChangeEvent();\n }\n return this;\n }\n /**\n * Get the current float mode setting.\n *\n * @returns true if floating is enabled, false otherwise\n *\n * @example\n * const isFloating = grid.getFloat();\n * console.log('Floating enabled:', isFloating);\n */\n getFloat() {\n return this.engine.float;\n }\n /**\n * Get the position of the cell under a pixel on screen.\n * @param position the position of the pixel to resolve in\n * absolute coordinates, as an object with top and left properties\n * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).\n * Useful when grid is within `position: relative` element\n *\n * Returns an object with properties `x` and `y` i.e. the column and row in the grid.\n */\n getCellFromPixel(position, useDocRelative = false) {\n const box = this.el.getBoundingClientRect();\n // console.log(`getBoundingClientRect left: ${box.left} top: ${box.top} w: ${box.w} h: ${box.h}`)\n let containerPos;\n if (useDocRelative) {\n containerPos = { top: box.top + document.documentElement.scrollTop, left: box.left };\n // console.log(`getCellFromPixel scrollTop: ${document.documentElement.scrollTop}`)\n }\n else {\n containerPos = { top: this.el.offsetTop, left: this.el.offsetLeft };\n // console.log(`getCellFromPixel offsetTop: ${containerPos.left} offsetLeft: ${containerPos.top}`)\n }\n const relativeLeft = position.left - containerPos.left;\n const relativeTop = position.top - containerPos.top;\n const columnWidth = (box.width / this.getColumn());\n const rowHeight = (box.height / parseInt(this.el.getAttribute('gs-current-row')));\n return { x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight) };\n }\n /**\n * Returns the current number of rows, which will be at least `minRow` if set.\n * The row count is based on the highest positioned widget in the grid.\n *\n * @returns the current number of rows in the grid\n *\n * @example\n * const rowCount = grid.getRow();\n * console.log('Grid has', rowCount, 'rows');\n */\n getRow() {\n return Math.max(this.engine.getRow(), this.opts.minRow || 0);\n }\n /**\n * Checks if the specified rectangular area is empty (no widgets occupy any part of it).\n *\n * @param x the x coordinate (column) of the area to check\n * @param y the y coordinate (row) of the area to check\n * @param w the width in columns of the area to check\n * @param h the height in rows of the area to check\n * @returns true if the area is completely empty, false if any widget overlaps\n *\n * @example\n * // Check if a 2x2 area at position (1,1) is empty\n * if (grid.isAreaEmpty(1, 1, 2, 2)) {\n * console.log('Area is available for placement');\n * }\n */\n isAreaEmpty(x, y, w, h) {\n return this.engine.isAreaEmpty(x, y, w, h);\n }\n /**\n * If you add elements to your grid by hand (or have some framework creating DOM), you have to tell gridstack afterwards to make them widgets.\n * If you want gridstack to add the elements for you, use `addWidget()` instead.\n * Makes the given element a widget and returns it.\n *\n * @param els widget or single selector to convert.\n * @param options widget definition to use instead of reading attributes or using default sizing values\n * @returns the converted GridItemHTMLElement\n *\n * @example\n * const grid = GridStack.init();\n *\n * // Create HTML content manually, possibly looking like:\n * // <div id=\"item-1\" gs-x=\"0\" gs-y=\"0\" gs-w=\"3\" gs-h=\"2\"></div>\n * grid.el.innerHTML = '<div id=\"item-1\" gs-w=\"3\"></div><div id=\"item-2\"></div>';\n *\n * // Convert existing elements to widgets\n * grid.makeWidget('#item-1'); // Uses gs-* attributes from DOM\n * grid.makeWidget('#item-2', {w: 2, h: 1, content: 'Hello World'});\n *\n * // Or pass DOM element directly\n * const element = document.getElementById('item-3');\n * grid.makeWidget(element, {x: 0, y: 1, w: 4, h: 2});\n */\n makeWidget(els, options) {\n const el = GridStack.getElement(els);\n if (!el || el.gridstackNode)\n return el;\n if (!el.parentElement)\n this.el.appendChild(el);\n this._prepareElement(el, true, options);\n const node = el.gridstackNode;\n this._updateContainerHeight();\n // see if there is a sub-grid to create\n if (node.subGridOpts) {\n this.makeSubGrid(el, node.subGridOpts, undefined, false); // node.subGrid will be used as option in method, no need to pass\n }\n // if we're adding an item into 1 column make sure\n // we don't override the larger 12 column layout that was already saved. #1985\n let resetIgnoreLayoutsNodeChange;\n if (this.opts.column === 1 && !this._ignoreLayoutsNodeChange) {\n resetIgnoreLayoutsNodeChange = this._ignoreLayoutsNodeChange = true;\n }\n this._triggerAddEvent();\n this._triggerChangeEvent();\n if (resetIgnoreLayoutsNodeChange)\n delete this._ignoreLayoutsNodeChange;\n return el;\n }\n on(name, callback) {\n // check for array of names being passed instead\n if (name.indexOf(' ') !== -1) {\n const names = name.split(' ');\n names.forEach(name => this.on(name, callback));\n return this;\n }\n // native CustomEvent handlers - cash the generic handlers so we can easily remove\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\n const noData = (name === 'enable' || name === 'disable');\n if (noData) {\n this._gsEventHandler[name] = (event) => callback(event);\n }\n else {\n this._gsEventHandler[name] = (event) => { if (event.detail)\n callback(event, event.detail); };\n }\n this.el.addEventListener(name, this._gsEventHandler[name]);\n }\n else if (name === 'drag' || name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resize'\n || name === 'resizestop' || name === 'dropped' || name === 'resizecontent') {\n // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.\n // do same for start event to make it easier...\n this._gsEventHandler[name] = callback;\n }\n else {\n console.error('GridStack.on(' + name + ') event not supported');\n }\n return this;\n }\n /**\n * unsubscribe from the 'on' event GridStackEvent\n * @param name of the event (see possible values) or list of names space separated\n */\n off(name) {\n // check for array of names being passed instead\n if (name.indexOf(' ') !== -1) {\n const names = name.split(' ');\n names.forEach(name => this.off(name));\n return this;\n }\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\n // remove native CustomEvent handlers\n if (this._gsEventHandler[name]) {\n this.el.removeEventListener(name, this._gsEventHandler[name]);\n }\n }\n delete this._gsEventHandler[name];\n return this;\n }\n /**\n * Remove all event handlers from the grid. This is useful for cleanup when destroying a grid.\n *\n * @returns the grid instance for chaining\n *\n * @example\n * grid.offAll(); // Remove all event listeners\n */\n offAll() {\n Object.keys(this._gsEventHandler).forEach((key) => this.off(key));\n return this;\n }\n /**\n * Removes widget from the grid.\n * @param el widget or selector to modify\n * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).\n * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\n */\n removeWidget(els, removeDOM = true, triggerEvent = true) {\n if (!els) {\n console.error('Error: GridStack.removeWidget(undefined) called');\n return this;\n }\n GridStack.getElements(els).forEach(el => {\n if (el.parentElement && el.parentElement !== this.el)\n return; // not our child!\n let node = el.gridstackNode;\n // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272\n if (!node) {\n node = this.engine.nodes.find(n => el === n.el);\n }\n if (!node)\n return;\n if (removeDOM && GridStack.addRemoveCB) {\n GridStack.addRemoveCB(this.el, node, false, false);\n }\n // remove our DOM data (circular link) and drag&drop permanently\n delete el.gridstackNode;\n this._removeDD(el);\n this.engine.removeNode(node, removeDOM, triggerEvent);\n if (removeDOM && el.parentElement) {\n el.remove(); // in batch mode engine.removeNode doesn't call back to remove DOM\n }\n });\n if (triggerEvent) {\n this._triggerRemoveEvent();\n this._triggerChangeEvent();\n }\n return this;\n }\n /**\n * Removes all widgets from the grid.\n * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).\n * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\n */\n removeAll(removeDOM = true, triggerEvent = true) {\n // always remove our DOM data (circular link) before list gets emptied and drag&drop permanently\n this.engine.nodes.forEach(n => {\n if (removeDOM && GridStack.addRemoveCB) {\n GridStack.addRemoveCB(this.el, n, false, false);\n }\n delete n.el.gridstackNode;\n if (!this.opts.staticGrid)\n this._removeDD(n.el);\n });\n this.engine.removeAll(removeDOM, triggerEvent);\n if (triggerEvent)\n this._triggerRemoveEvent();\n return this;\n }\n /**\n * Toggle the grid animation state. Toggles the `grid-stack-animate` class.\n * @param doAnimate if true the grid will animate.\n * @param delay if true setting will be set on next event loop.\n */\n setAnimation(doAnimate = this.opts.animate, delay) {\n if (delay) {\n // delay, but check to make sure grid (opt) is still around\n setTimeout(() => { if (this.opts)\n this.setAnimation(doAnimate); });\n }\n else if (doAnimate) {\n this.el.classList.add('grid-stack-animate');\n }\n else {\n this.el.classList.remove('grid-stack-animate');\n }\n this.opts.animate = doAnimate;\n return this;\n }\n /** @internal */\n hasAnimationCSS() { return this.el.classList.contains('grid-stack-animate'); }\n /**\n * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.\n * Also toggle the grid-stack-static class.\n * @param val if true the grid become static.\n * @param updateClass true (default) if css class gets updated\n * @param recurse true (default) if sub-grids also get updated\n */\n setStatic(val, updateClass = true, recurse = true) {\n if (!!this.opts.staticGrid === val)\n return this;\n val ? this.opts.staticGrid = true : delete this.opts.staticGrid;\n this._setupRemoveDrop();\n this._setupAcceptWidget();\n this.engine.nodes.forEach(n => {\n this.prepareDragDrop(n.el); // either delete or init Drag&drop\n if (n.subGrid && recurse)\n n.subGrid.setStatic(val, updateClass, recurse);\n });\n if (updateClass) {\n this._setStaticClass();\n }\n return this;\n }\n /**\n * Updates the passed in options on the grid (similar to update(widget) for for the grid options).\n * @param options PARTIAL grid options to update - only items specified will be updated.\n * NOTE: not all options updating are currently supported (lot of code, unlikely to change)\n */\n updateOptions(o) {\n const opts = this.opts;\n if (o === opts)\n return this; // nothing to do\n if (o.acceptWidgets !== undefined) {\n opts.acceptWidgets = o.acceptWidgets;\n this._setupAcceptWidget();\n }\n if (o.animate !== undefined)\n this.setAnimation(o.animate);\n if (o.cellHeight)\n this.cellHeight(o.cellHeight);\n if (o.class !== undefined && o.class !== opts.class) {\n if (opts.class)\n this.el.classList.remove(opts.class);\n if (o.class)\n this.el.classList.add(o.class);\n }\n // responsive column take over actual count (keep what we have now)\n if (o.columnOpts) {\n this.opts.columnOpts = o.columnOpts;\n this.checkDynamicColumn();\n }\n else if (o.columnOpts === null && this.opts.columnOpts) {\n delete this.opts.columnOpts;\n this._updateResizeEvent();\n }\n else if (typeof (o.column) === 'number')\n this.column(o.column);\n if (o.margin !== undefined)\n this.margin(o.margin);\n if (o.staticGrid !== undefined)\n this.setStatic(o.staticGrid);\n if (o.disableDrag !== undefined && !o.staticGrid)\n this.enableMove(!o.disableDrag);\n if (o.disableResize !== undefined && !o.staticGrid)\n this.enableResize(!o.disableResize);\n if (o.float !== undefined)\n this.float(o.float);\n if (o.row !== undefined) {\n opts.minRow = opts.maxRow = opts.row = o.row;\n this._updateContainerHeight();\n }\n else {\n if (o.minRow !== undefined) {\n opts.minRow = o.minRow;\n this._updateContainerHeight();\n }\n if (o.maxRow !== undefined)\n opts.maxRow = o.maxRow;\n }\n if (o.lazyLoad !== undefined)\n opts.lazyLoad = o.lazyLoad;\n if (o.children?.length)\n this.load(o.children);\n // TBD if we have a real need for these (more complex code)\n // alwaysShowResizeHandle, draggable, handle, handleClass, itemClass, layout, placeholderClass, placeholderText, resizable, removable, row,...\n return this;\n }\n /**\n * Updates widget position/size and other info. This is used to change widget properties after creation.\n * Can update position, size, content, and other widget properties.\n *\n * Note: If you need to call this on all nodes, use load() instead which will update what changed.\n * Setting the same x,y for multiple items will be indeterministic and likely unwanted.\n *\n * @param els widget element(s) or selector to modify\n * @param opt new widget options (x,y,w,h, etc.). Only those set will be updated.\n * @returns the grid instance for chaining\n *\n * @example\n * // Update widget size and position\n * grid.update('.my-widget', { x: 2, y: 1, w: 3, h: 2 });\n *\n * // Update widget content\n * grid.update(widget, { content: '<p>New content</p>' });\n *\n * // Update multiple properties\n * grid.update('#my-widget', {\n * w: 4,\n * h: 3,\n * noResize: true,\n * locked: true\n * });\n */\n update(els, opt) {\n GridStack.getElements(els).forEach(el => {\n const n = el?.gridstackNode;\n if (!n)\n return;\n const w = { ...Utils.copyPos({}, n), ...Utils.cloneDeep(opt) }; // make a copy we can modify in case they re-use it or multiple items\n this.engine.nodeBoundFix(w);\n delete w.autoPosition;\n // move/resize widget if anything changed\n const keys = ['x', 'y', 'w', 'h'];\n let m;\n if (keys.some(k => w[k] !== undefined && w[k] !== n[k])) {\n m = {};\n keys.forEach(k => {\n m[k] = (w[k] !== undefined) ? w[k] : n[k];\n delete w[k];\n });\n }\n // for a move as well IFF there is any min/max fields set\n if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {\n m = {}; // will use node position but validate values\n }\n // check for content changing\n if (w.content !== undefined) {\n const itemContent = el.querySelector('.grid-stack-item-content');\n if (itemContent && itemContent.textContent !== w.content) {\n n.content = w.content;\n GridStack.renderCB(itemContent, w);\n // restore any sub-grid back\n if (n.subGrid?.el) {\n itemContent.appendChild(n.subGrid.el);\n n.subGrid._updateContainerHeight();\n }\n }\n delete w.content;\n }\n // any remaining fields are assigned, but check for dragging changes, resize constrain\n let changed = false;\n let ddChanged = false;\n for (const key in w) {\n if (key[0] !== '_' && n[key] !== w[key]) {\n n[key] = w[key];\n changed = true;\n ddChanged = ddChanged || (!this.opts.staticGrid && (key === 'noResize' || key === 'noMove' || key === 'locked'));\n }\n }\n Utils.sanitizeMinMax(n);\n // finally move the widget and update attr\n if (m) {\n const widthChanged = (m.w !== undefined && m.w !== n.w);\n this.moveNode(n, m);\n if (widthChanged && n.subGrid) {\n // if we're animating the client size hasn't changed yet, so force a change (not exact size)\n n.subGrid.onResize(this.hasAnimationCSS() ? n.w : undefined);\n }\n else {\n this.resizeToContentCheck(widthChanged, n);\n }\n delete n._orig; // clear out original position now that we moved #2669\n }\n if (m || changed) {\n this._writeAttr(el, n);\n }\n if (ddChanged) {\n this.prepareDragDrop(n.el);\n }\n if (GridStack.updateCB)\n GridStack.updateCB(n); // call user callback so they know widget got updated\n });\n return this;\n }\n moveNode(n, m) {\n const wasUpdating = n._updating;\n if (!wasUpdating)\n this.engine.cleanNodes().beginUpdate(n);\n this.engine.moveNode(n, m);\n this._updateContainerHeight();\n if (!wasUpdating) {\n this._triggerChangeEvent();\n this.engine.endUpdate();\n }\n }\n /**\n * Updates widget height to match the content height to avoid vertical scrollbars or dead space.\n * This automatically adjusts the widget height based on its content size.\n *\n * Note: This assumes only 1 child under resizeToContentParent='.grid-stack-item-content'\n * (sized to gridItem minus padding) that represents the entire content size.\n *\n * @param el the grid item element to resize\n *\n * @example\n * // Resize a widget to fit its content\n * const widget = document.querySelector('.grid-stack-item');\n * grid.resizeToContent(widget);\n *\n * // This is commonly used with dynamic content:\n * widget.querySelector('.content').innerHTML = 'New longer content...';\n * grid.resizeToContent(widget);\n */\n resizeToContent(el) {\n if (!el)\n return;\n el.classList.remove('size-to-content-max');\n if (!el.clientHeight)\n return; // 0 when hidden, skip\n const n = el.gridstackNode;\n if (!n)\n return;\n const grid = n.grid;\n if (!grid || el.parentElement !== grid.el)\n return; // skip if we are not inside a grid\n const cell = grid.getCellHeight(true);\n if (!cell)\n return;\n let height = n.h ? n.h * cell : el.clientHeight; // getBoundingClientRect().height seem to flicker back and forth\n let item;\n if (n.resizeToContentParent)\n item = el.querySelector(n.resizeToContentParent);\n if (!item)\n item = el.querySelector(GridStack.resizeToContentParent);\n if (!item)\n return;\n const padding = el.clientHeight - item.clientHeight; // full - available height to our child (minus border, padding...)\n const itemH = n.h ? n.h * cell - padding : item.clientHeight; // calculated to what cellHeight is or will become (rather than actual to prevent waiting for animation to finish)\n let wantedH;\n if (n.subGrid) {\n // sub-grid - use their actual row count * their cell height, BUT append any content outside of the grid (eg: above text)\n wantedH = n.subGrid.getRow() * n.subGrid.getCellHeight(true);\n const subRec = n.subGrid.el.getBoundingClientRect();\n const parentRec = el.getBoundingClientRect();\n wantedH += subRec.top - parentRec.top;\n }\n else if (n.subGridOpts?.children?.length) {\n // not sub-grid just yet (case above) wait until we do\n return;\n }\n else {\n // NOTE: clientHeight & getBoundingClientRect() is undefined for text and other leaf nodes. use <div> container!\n const child = item.firstElementChild;\n if (!child) {\n console.error(`Error: GridStack.resizeToContent() widget id:${n.id} '${GridStack.resizeToContentParent}'.firstElementChild is null, make sure to have a div like container. Skipping sizing.`);\n return;\n }\n wantedH = child.getBoundingClientRect().height || itemH;\n }\n if (itemH === wantedH)\n return;\n height += wantedH - itemH;\n let h = Math.ceil(height / cell);\n // check for min/max and special sizing\n const softMax = Number.isInteger(n.sizeToContent) ? n.sizeToContent : 0;\n if (softMax && h > softMax) {\n h = softMax;\n el.classList.add('size-to-content-max'); // get v-scroll back\n }\n if (n.minH && h < n.minH)\n h = n.minH;\n else if (n.maxH && h > n.maxH)\n h = n.maxH;\n if (h !== n.h) {\n grid._ignoreLayoutsNodeChange = true;\n grid.moveNode(n, { h });\n delete grid._ignoreLayoutsNodeChange;\n }\n }\n /** call the user resize (so they can do extra work) else our build in version */\n resizeToContentCBCheck(el) {\n if (GridStack.resizeToContentCB)\n GridStack.resizeToContentCB(el);\n else\n this.resizeToContent(el);\n }\n /**\n * Rotate widgets by swapping their width and height. This is typically called when the user presses 'r' during dragging.\n * The rotation swaps the w/h dimensions and adjusts min/max constraints accordingly.\n *\n * @param els widget element(s) or selector to rotate\n * @param relative optional pixel coordinate relative to upper/left corner to rotate around (keeps that cell under cursor)\n * @returns the grid instance for chaining\n *\n * @example\n * // Rotate a specific widget\n * grid.rotate('.my-widget');\n *\n * // Rotate with relative positioning during drag\n * grid.rotate(widget, { left: 50, top: 30 });\n */\n rotate(els, relative) {\n GridStack.getElements(els).forEach(el => {\n const n = el.gridstackNode;\n if (!Utils.canBeRotated(n))\n return;\n const rot = { w: n.h, h: n.w, minH: n.minW, minW: n.minH, maxH: n.maxW, maxW: n.maxH };\n // if given an offset, adjust x/y by column/row bounds when user presses 'r' during dragging\n if (relative) {\n const pivotX = relative.left > 0 ? Math.floor(relative.left / this.cellWidth()) : 0;\n const pivotY = relative.top > 0 ? Math.floor(relative.top / this.opts.cellHeight) : 0;\n rot.x = n.x + pivotX - (n.h - (pivotY + 1));\n rot.y = (n.y + pivotY) - pivotX;\n }\n Object.keys(rot).forEach(k => { if (rot[k] === undefined)\n delete rot[k]; });\n const _orig = n._orig;\n this.update(el, rot);\n n._orig = _orig; // restore as move() will delete it\n });\n return this;\n }\n /**\n * Updates the margins which will set all 4 sides at once - see `GridStackOptions.margin` for format options.\n * Supports CSS string format of 1, 2, or 4 values or a single number.\n *\n * @param value margin value - can be:\n * - Single number: `10` (applies to all sides)\n * - Two values: `'10px 20px'` (top/bottom, left/right)\n * - Four values: `'10px 20px 5px 15px'` (top, right, bottom, left)\n * @returns the grid instance for chaining\n *\n * @example\n * grid.margin(10); // 10px all sides\n * grid.margin('10px 20px'); // 10px top/bottom, 20px left/right\n * grid.margin('5px 10px 15px 20px'); // Different for each side\n */\n margin(value) {\n const isMultiValue = (typeof value === 'string' && value.split(' ').length > 1);\n // check if we can skip... won't check if multi values (too much hassle)\n if (!isMultiValue) {\n const data = Utils.parseHeight(value);\n if (this.opts.marginUnit === data.unit && this.opts.margin === data.h)\n return;\n }\n // re-use existing margin handling\n this.opts.margin = value;\n this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = undefined;\n this._initMargin();\n return this;\n }\n /**\n * Returns the current margin value as a number (undefined if the 4 sides don't match).\n * This only returns a number if all sides have the same margin value.\n *\n * @returns the margin value in pixels, or undefined if sides have different values\n *\n * @example\n * const margin = grid.getMargin();\n * if (margin !== undefined) {\n * console.log('Uniform margin:', margin, 'px');\n * } else {\n * console.log('Margins are different on different sides');\n * }\n */\n getMargin() { return this.opts.margin; }\n /**\n * Returns true if the height of the grid will be less than the vertical\n * constraint. Always returns true if grid doesn't have height constraint.\n * @param node contains x,y,w,h,auto-position options\n *\n * @example\n * if (grid.willItFit(newWidget)) {\n * grid.addWidget(newWidget);\n * } else {\n * alert('Not enough free space to place the widget');\n * }\n */\n willItFit(node) { return this.engine.willItFit(node); }\n /** @internal */\n _triggerChangeEvent() {\n if (this.engine.batchMode)\n return this;\n const elements = this.engine.getDirtyNodes(true); // verify they really changed\n if (elements && elements.length) {\n if (!this._ignoreLayoutsNodeChange) {\n this.engine.layoutsNodesChange(elements);\n }\n this._triggerEvent('change', elements);\n }\n this.engine.saveInitial(); // we called, now reset initial values & dirty flags\n return this;\n }\n /** @internal */\n _triggerAddEvent() {\n if (this.engine.batchMode)\n return this;\n if (this.engine.addedNodes?.length) {\n if (!this._ignoreLayoutsNodeChange) {\n this.engine.layoutsNodesChange(this.engine.addedNodes);\n }\n // prevent added nodes from also triggering 'change' event (which is called next)\n this.engine.addedNodes.forEach(n => { delete n._dirty; });\n const addedNodes = [...this.engine.addedNodes];\n this.engine.addedNodes = [];\n this._triggerEvent('added', addedNodes);\n }\n return this;\n }\n /** @internal */\n _triggerRemoveEvent() {\n if (this.engine.batchMode)\n return this;\n if (this.engine.removedNodes?.length) {\n const removedNodes = [...this.engine.removedNodes];\n this.engine.removedNodes = [];\n this._triggerEvent('removed', removedNodes);\n }\n return this;\n }\n /** @internal */\n _triggerEvent(type, data) {\n const event = data ? new CustomEvent(type, { bubbles: false, detail: data }) : new Event(type);\n // check if we're nested, and if so call the outermost grid to trigger the event\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let grid = this;\n while (grid.parentGridNode)\n grid = grid.parentGridNode.grid;\n grid.el.dispatchEvent(event);\n return this;\n }\n /** @internal */\n _updateContainerHeight() {\n if (!this.engine || this.engine.batchMode)\n return this;\n const parent = this.parentGridNode;\n let row = this.getRow() + this._extraDragRow; // this checks for minRow already\n const cellHeight = this.opts.cellHeight;\n const unit = this.opts.cellHeightUnit;\n if (!cellHeight)\n return this;\n // check for css min height (non nested grid). TODO: support mismatch, say: min % while unit is px.\n // If `minRow` was applied, don't override it with this check, and avoid performance issues\n // (reflows) using `getComputedStyle`\n if (!parent && !this.opts.minRow) {\n const cssMinHeight = Utils.parseHeight(getComputedStyle(this.el)['minHeight']);\n if (cssMinHeight.h > 0 && cssMinHeight.unit === unit) {\n const minRow = Math.floor(cssMinHeight.h / cellHeight);\n if (row < minRow) {\n row = minRow;\n }\n }\n }\n this.el.setAttribute('gs-current-row', String(row));\n this.el.style.removeProperty('min-height');\n this.el.style.removeProperty('height');\n if (row) {\n // nested grids have 'insert:0' to fill the space of parent by default, but we may be taller so use min-height for possible scrollbars\n this.el.style[parent ? 'minHeight' : 'height'] = row * cellHeight + unit;\n }\n // if we're a nested grid inside an sizeToContent item, tell it to resize itself too\n if (parent && Utils.shouldSizeToContent(parent)) {\n parent.grid.resizeToContentCBCheck(parent.el);\n }\n return this;\n }\n /** @internal */\n _prepareElement(el, triggerAddEvent = false, node) {\n node = node || this._readAttr(el);\n el.gridstackNode = node;\n node.el = el;\n node.grid = this;\n node = this.engine.addNode(node, triggerAddEvent);\n // write the dom sizes and class\n this._writeAttr(el, node);\n el.classList.add(gridDefaults.itemClass, this.opts.itemClass);\n const sizeToContent = Utils.shouldSizeToContent(node);\n sizeToContent ? el.classList.add('size-to-content') : el.classList.remove('size-to-content');\n if (sizeToContent)\n this.resizeToContentCheck(false, node);\n if (!Utils.lazyLoad(node))\n this.prepareDragDrop(node.el);\n return this;\n }\n /** @internal write position CSS vars and x,y,w,h attributes (not used for CSS but by users) back to element */\n _writePosAttr(el, n) {\n // Avoid overwriting the inline style of the element during drag/resize, but always update the placeholder\n if ((!n._moving && !n._resizing) || this._placeholder === el) {\n // width/height:1 x/y:0 is set by default in the main CSS, so no need to set inlined vars\n el.style.top = n.y ? (n.y === 1 ? `var(--gs-cell-height)` : `calc(${n.y} * var(--gs-cell-height))`) : null;\n el.style.left = n.x ? (n.x === 1 ? `var(--gs-column-width)` : `calc(${n.x} * var(--gs-column-width))`) : null;\n el.style.width = n.w > 1 ? `calc(${n.w} * var(--gs-column-width))` : null;\n el.style.height = n.h > 1 ? `calc(${n.h} * var(--gs-cell-height))` : null;\n }\n // NOTE: those are technically not needed anymore (v12+) as we have CSS vars for everything, but some users depends on them to render item size using CSS\n // ALways write x,y otherwise it could be autoPositioned incorrectly #3181\n el.setAttribute('gs-x', String(n.x));\n el.setAttribute('gs-y', String(n.y));\n n.w > 1 ? el.setAttribute('gs-w', String(n.w)) : el.removeAttribute('gs-w');\n n.h > 1 ? el.setAttribute('gs-h', String(n.h)) : el.removeAttribute('gs-h');\n return this;\n }\n /** @internal call to write any default attributes back to element */\n _writeAttr(el, node) {\n if (!node)\n return this;\n this._writePosAttr(el, node);\n const attrs /*: GridStackWidget but strings */ = {\n // autoPosition: 'gs-auto-position', // no need to write out as already in node and doesn't affect CSS\n noResize: 'gs-no-resize',\n noMove: 'gs-no-move',\n locked: 'gs-locked',\n id: 'gs-id',\n sizeToContent: 'gs-size-to-content',\n };\n for (const key in attrs) {\n if (node[key]) { // 0 is valid for x,y only but done above already and not in list anyway\n el.setAttribute(attrs[key], String(node[key]));\n }\n else {\n el.removeAttribute(attrs[key]);\n }\n }\n return this;\n }\n /** @internal call to read any default attributes from element */\n _readAttr(el, clearDefaultAttr = true) {\n const n = {};\n n.x = Utils.toNumber(el.getAttribute('gs-x'));\n n.y = Utils.toNumber(el.getAttribute('gs-y'));\n n.w = Utils.toNumber(el.getAttribute('gs-w'));\n n.h = Utils.toNumber(el.getAttribute('gs-h'));\n n.autoPosition = Utils.toBool(el.getAttribute('gs-auto-position'));\n n.noResize = Utils.toBool(el.getAttribute('gs-no-resize'));\n n.noMove = Utils.toBool(el.getAttribute('gs-no-move'));\n n.locked = Utils.toBool(el.getAttribute('gs-locked'));\n const attr = el.getAttribute('gs-size-to-content');\n if (attr) {\n if (attr === 'true' || attr === 'false')\n n.sizeToContent = Utils.toBool(attr);\n else\n n.sizeToContent = parseInt(attr, 10);\n }\n n.id = el.getAttribute('gs-id');\n // read but never written out\n n.maxW = Utils.toNumber(el.getAttribute('gs-max-w'));\n n.minW = Utils.toNumber(el.getAttribute('gs-min-w'));\n n.maxH = Utils.toNumber(el.getAttribute('gs-max-h'));\n n.minH = Utils.toNumber(el.getAttribute('gs-min-h'));\n // v8.x optimization to reduce un-needed attr that don't render or are default CSS\n if (clearDefaultAttr) {\n if (n.w === 1)\n el.removeAttribute('gs-w');\n if (n.h === 1)\n el.removeAttribute('gs-h');\n if (n.maxW)\n el.removeAttribute('gs-max-w');\n if (n.minW)\n el.removeAttribute('gs-min-w');\n if (n.maxH)\n el.removeAttribute('gs-max-h');\n if (n.minH)\n el.removeAttribute('gs-min-h');\n }\n // remove any key not found (null or false which is default, unless sizeToContent=false override)\n for (const key in n) {\n if (!n.hasOwnProperty(key))\n return;\n if (!n[key] && n[key] !== 0 && key !== 'sizeToContent') { // 0 can be valid value (x,y only really)\n delete n[key];\n }\n }\n return n;\n }\n /** @internal */\n _setStaticClass() {\n const classes = ['grid-stack-static'];\n if (this.opts.staticGrid) {\n this.el.classList.add(...classes);\n this.el.setAttribute('gs-static', 'true');\n }\n else {\n this.el.classList.remove(...classes);\n this.el.removeAttribute('gs-static');\n }\n return this;\n }\n /**\n * called when we are being resized - check if the one Column Mode needs to be turned on/off\n * and remember the prev columns we used, or get our count from parent, as well as check for cellHeight==='auto' (square)\n * or `sizeToContent` gridItem options.\n */\n onResize(clientWidth = this.el?.clientWidth) {\n if (!clientWidth)\n return; // return if we're gone or no size yet (will get called again)\n if (this.prevWidth === clientWidth)\n return; // no-op\n this.prevWidth = clientWidth;\n // console.log('onResize ', clientWidth);\n this.batchUpdate();\n // see if we're nested and take our column count from our parent....\n let columnChanged = false;\n if (this._autoColumn && this.parentGridNode) {\n if (this.opts.column !== this.parentGridNode.w) {\n this.column(this.parentGridNode.w, this.opts.layout || 'list');\n columnChanged = true;\n }\n }\n else {\n // else check for dynamic column\n columnChanged = this.checkDynamicColumn();\n }\n // make the cells content square again\n if (this._isAutoCellHeight)\n this.cellHeight();\n // update any nested grids, or items size\n this.engine.nodes.forEach(n => {\n if (n.subGrid)\n n.subGrid.onResize();\n });\n if (!this._skipInitialResize)\n this.resizeToContentCheck(columnChanged); // wait for anim of column changed (DOM reflow before we can size correctly)\n delete this._skipInitialResize;\n this.batchUpdate(false);\n return this;\n }\n /** resizes content for given node (or all) if shouldSizeToContent() is true */\n resizeToContentCheck(delay = false, n = undefined) {\n if (!this.engine)\n return; // we've been deleted in between!\n // update any gridItem height with sizeToContent, but wait for DOM $animation_speed to settle if we changed column count\n // TODO: is there a way to know what the final (post animation) size of the content will be so we can animate the column width and height together rather than sequentially ?\n if (delay && this.hasAnimationCSS())\n return setTimeout(() => this.resizeToContentCheck(false, n), this.animationDelay);\n if (n) {\n if (Utils.shouldSizeToContent(n))\n this.resizeToContentCBCheck(n.el);\n }\n else if (this.engine.nodes.some(n => Utils.shouldSizeToContent(n))) {\n const nodes = [...this.engine.nodes]; // in case order changes while resizing one\n this.batchUpdate();\n nodes.forEach(n => {\n if (Utils.shouldSizeToContent(n))\n this.resizeToContentCBCheck(n.el);\n });\n this._ignoreLayoutsNodeChange = true; // loop through each node will set/reset around each move, so set it here again\n this.batchUpdate(false);\n this._ignoreLayoutsNodeChange = false;\n }\n // call this regardless of shouldSizeToContent because widget might need to stretch to take available space after a resize\n if (this._gsEventHandler['resizecontent'])\n this._gsEventHandler['resizecontent'](null, n ? [n] : this.engine.nodes);\n }\n /** add or remove the grid element size event handler */\n _updateResizeEvent(forceRemove = false) {\n // only add event if we're not nested (parent will call us) and we're auto sizing cells or supporting dynamic column (i.e. doing work)\n // or supporting new sizeToContent option.\n const trackSize = !this.parentGridNode && (this._isAutoCellHeight || this.opts.sizeToContent || this.opts.columnOpts\n || this.engine.nodes.find(n => n.sizeToContent));\n if (!forceRemove && trackSize && !this.resizeObserver) {\n this._sizeThrottle = Utils.throttle(() => this.onResize(), this.opts.cellHeightThrottle);\n this.resizeObserver = new ResizeObserver(() => this._sizeThrottle());\n this.resizeObserver.observe(this.el);\n this._skipInitialResize = true; // makeWidget will originally have called on startup\n }\n else if ((forceRemove || !trackSize) && this.resizeObserver) {\n this.resizeObserver.disconnect();\n delete this.resizeObserver;\n delete this._sizeThrottle;\n }\n return this;\n }\n /** @internal convert a potential selector into actual element */\n static getElement(els = '.grid-stack-item') { return Utils.getElement(els); }\n /** @internal */\n static getElements(els = '.grid-stack-item') { return Utils.getElements(els); }\n /** @internal */\n static getGridElement(els) { return GridStack.getElement(els); }\n /** @internal */\n static getGridElements(els) { return Utils.getElements(els); }\n /** @internal initialize margin top/bottom/left/right and units */\n _initMargin() {\n let data;\n let margin = 0;\n // support passing multiple values like CSS (ex: '5px 10px 0 20px')\n let margins = [];\n if (typeof this.opts.margin === 'string') {\n margins = this.opts.margin.split(' ');\n }\n if (margins.length === 2) { // top/bot, left/right like CSS\n this.opts.marginTop = this.opts.marginBottom = margins[0];\n this.opts.marginLeft = this.opts.marginRight = margins[1];\n }\n else if (margins.length === 4) { // Clockwise like CSS\n this.opts.marginTop = margins[0];\n this.opts.marginRight = margins[1];\n this.opts.marginBottom = margins[2];\n this.opts.marginLeft = margins[3];\n }\n else {\n data = Utils.parseHeight(this.opts.margin);\n this.opts.marginUnit = data.unit;\n margin = this.opts.margin = data.h;\n }\n // see if top/bottom/left/right need to be set as well\n const keys = ['marginTop', 'marginRight', 'marginBottom', 'marginLeft'];\n keys.forEach(k => {\n if (this.opts[k] === undefined) {\n this.opts[k] = margin;\n }\n else {\n data = Utils.parseHeight(this.opts[k]);\n this.opts[k] = data.h;\n delete this.opts.margin;\n }\n });\n this.opts.marginUnit = data.unit; // in case side were spelled out, use those units instead...\n if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {\n this.opts.margin = this.opts.marginTop; // makes it easier to check for no-ops in setMargin()\n }\n // finally Update the CSS margin variables (inside the cell height) */\n const style = this.el.style;\n style.setProperty('--gs-item-margin-top', `${this.opts.marginTop}${this.opts.marginUnit}`);\n style.setProperty('--gs-item-margin-bottom', `${this.opts.marginBottom}${this.opts.marginUnit}`);\n style.setProperty('--gs-item-margin-right', `${this.opts.marginRight}${this.opts.marginUnit}`);\n style.setProperty('--gs-item-margin-left', `${this.opts.marginLeft}${this.opts.marginUnit}`);\n return this;\n }\n /* ===========================================================================================\n * drag&drop methods that used to be stubbed out and implemented in dd-gridstack.ts\n * but caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\n * ===========================================================================================\n */\n /**\n * Get the global drag & drop implementation instance.\n * This provides access to the underlying drag & drop functionality.\n *\n * @returns the DDGridStack instance used for drag & drop operations\n *\n * @example\n * const dd = GridStack.getDD();\n * // Access drag & drop functionality\n */\n static getDD() {\n return dd;\n }\n /**\n * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.\n * Called during GridStack.init() as options, but can also be called directly (last param are used) in case the toolbar\n * is dynamically create and needs to be set later.\n * @param dragIn string selector (ex: '.sidebar-item') or list of dom elements\n * @param dragInOptions options - see DDDragOpt. (default: {handle: '.grid-stack-item-content', appendTo: 'body'}\n * @param widgets GridStackWidget def to assign to each element which defines what to create on drop\n * @param root optional root which defaults to document (for shadow dom pass the parent HTMLDocument)\n */\n static setupDragIn(dragIn, dragInOptions, widgets, root = document) {\n if (dragInOptions?.pause !== undefined) {\n DDManager.pauseDrag = dragInOptions.pause;\n }\n dragInOptions = { appendTo: 'body', helper: 'clone', ...(dragInOptions || {}) }; // default to handle:undefined = drag by the whole item\n const els = (typeof dragIn === 'string') ? Utils.getElements(dragIn, root) : dragIn;\n els.forEach((el, i) => {\n if (!dd.isDraggable(el))\n dd.dragIn(el, dragInOptions);\n if (widgets?.[i])\n el.gridstackNode = widgets[i];\n });\n }\n /**\n * Enables/Disables dragging by the user for specific grid elements.\n * For all items and future items, use enableMove() instead. No-op for static grids.\n *\n * Note: If you want to prevent an item from moving due to being pushed around by another\n * during collision, use the 'locked' property instead.\n *\n * @param els widget element(s) or selector to modify\n * @param val if true widget will be draggable, assuming the parent grid isn't noMove or static\n * @returns the grid instance for chaining\n *\n * @example\n * // Make specific widgets draggable\n * grid.movable('.my-widget', true);\n *\n * // Disable dragging for specific widgets\n * grid.movable('#fixed-widget', false);\n */\n movable(els, val) {\n if (this.opts.staticGrid)\n return this; // can't move a static grid!\n GridStack.getElements(els).forEach(el => {\n const n = el.gridstackNode;\n if (!n)\n return;\n val ? delete n.noMove : n.noMove = true;\n this.prepareDragDrop(n.el); // init DD if need be, and adjust\n });\n return this;\n }\n /**\n * Enables/Disables user resizing for specific grid elements.\n * For all items and future items, use enableResize() instead. No-op for static grids.\n *\n * @param els widget element(s) or selector to modify\n * @param val if true widget will be resizable, assuming the parent grid isn't noResize or static\n * @returns the grid instance for chaining\n *\n * @example\n * // Make specific widgets resizable\n * grid.resizable('.my-widget', true);\n *\n * // Disable resizing for specific widgets\n * grid.resizable('#fixed-size-widget', false);\n */\n resizable(els, val) {\n if (this.opts.staticGrid)\n return this; // can't resize a static grid!\n GridStack.getElements(els).forEach(el => {\n const n = el.gridstackNode;\n if (!n)\n return;\n val ? delete n.noResize : n.noResize = true;\n this.prepareDragDrop(n.el); // init DD if need be, and adjust\n });\n return this;\n }\n /**\n * Temporarily disables widgets moving/resizing.\n * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\n *\n * Note: This is a no-op for static grids.\n *\n * This is a shortcut for:\n * ```typescript\n * grid.enableMove(false);\n * grid.enableResize(false);\n * ```\n *\n * @param recurse if true (default), sub-grids also get updated\n * @returns the grid instance for chaining\n *\n * @example\n * // Disable all interactions\n * grid.disable();\n *\n * // Disable only this grid, not sub-grids\n * grid.disable(false);\n */\n disable(recurse = true) {\n if (this.opts.staticGrid)\n return;\n this.enableMove(false, recurse);\n this.enableResize(false, recurse);\n this._triggerEvent('disable');\n return this;\n }\n /**\n * Re-enables widgets moving/resizing - see disable().\n * Note: This is a no-op for static grids.\n *\n * This is a shortcut for:\n * ```typescript\n * grid.enableMove(true);\n * grid.enableResize(true);\n * ```\n *\n * @param recurse if true (default), sub-grids also get updated\n * @returns the grid instance for chaining\n *\n * @example\n * // Re-enable all interactions\n * grid.enable();\n *\n * // Enable only this grid, not sub-grids\n * grid.enable(false);\n */\n enable(recurse = true) {\n if (this.opts.staticGrid)\n return;\n this.enableMove(true, recurse);\n this.enableResize(true, recurse);\n this._triggerEvent('enable');\n return this;\n }\n /**\n * Enables/disables widget moving for all widgets. No-op for static grids.\n * Note: locally defined items (with noMove property) still override this setting.\n *\n * @param doEnable if true widgets will be movable, if false moving is disabled\n * @param recurse if true (default), sub-grids also get updated\n * @returns the grid instance for chaining\n *\n * @example\n * // Enable moving for all widgets\n * grid.enableMove(true);\n *\n * // Disable moving for all widgets\n * grid.enableMove(false);\n *\n * // Enable only this grid, not sub-grids\n * grid.enableMove(true, false);\n */\n enableMove(doEnable, recurse = true) {\n if (this.opts.staticGrid)\n return this; // can't move a static grid!\n doEnable ? delete this.opts.disableDrag : this.opts.disableDrag = true; // FIRST before we update children as grid overrides #1658\n this.engine.nodes.forEach(n => {\n this.prepareDragDrop(n.el);\n if (n.subGrid && recurse)\n n.subGrid.enableMove(doEnable, recurse);\n });\n return this;\n }\n /**\n * Enables/disables widget resizing for all widgets. No-op for static grids.\n * Note: locally defined items (with noResize property) still override this setting.\n *\n * @param doEnable if true widgets will be resizable, if false resizing is disabled\n * @param recurse if true (default), sub-grids also get updated\n * @returns the grid instance for chaining\n *\n * @example\n * // Enable resizing for all widgets\n * grid.enableResize(true);\n *\n * // Disable resizing for all widgets\n * grid.enableResize(false);\n *\n * // Enable only this grid, not sub-grids\n * grid.enableResize(true, false);\n */\n enableResize(doEnable, recurse = true) {\n if (this.opts.staticGrid)\n return this; // can't size a static grid!\n doEnable ? delete this.opts.disableResize : this.opts.disableResize = true; // FIRST before we update children as grid overrides #1658\n this.engine.nodes.forEach(n => {\n this.prepareDragDrop(n.el);\n if (n.subGrid && recurse)\n n.subGrid.enableResize(doEnable, recurse);\n });\n return this;\n }\n /** @internal call when drag (and drop) needs to be cancelled (Esc key) */\n cancelDrag() {\n const n = this._placeholder?.gridstackNode;\n if (!n)\n return;\n if (n._isExternal) {\n // remove any newly inserted nodes (from outside)\n n._isAboutToRemove = true;\n this.engine.removeNode(n);\n }\n else if (n._isAboutToRemove) {\n // restore any temp removed (dragged over trash)\n GridStack._itemRemoving(n.el, false);\n }\n this.engine.restoreInitial();\n }\n /** @internal removes any drag&drop present (called during destroy) */\n _removeDD(el) {\n dd.draggable(el, 'destroy').resizable(el, 'destroy');\n if (el.gridstackNode) {\n delete el.gridstackNode._initDD; // reset our DD init flag\n }\n delete el.ddElement;\n return this;\n }\n /** @internal called to add drag over to support widgets being added externally */\n _setupAcceptWidget() {\n // check if we need to disable things\n if (this.opts.staticGrid || (!this.opts.acceptWidgets && !this.opts.removable)) {\n dd.droppable(this.el, 'destroy');\n return this;\n }\n // vars shared across all methods\n let cellHeight, cellWidth;\n const onDrag = (event, el, helper) => {\n helper = helper || el;\n const node = helper.gridstackNode;\n if (!node)\n return;\n // if the element is being dragged from outside, scale it down to match the grid's scale\n // and slightly adjust its position relative to the mouse\n if (!node.grid?.el) {\n // this scales the helper down\n helper.style.transform = `scale(${1 / this.dragTransform.xScale},${1 / this.dragTransform.yScale})`;\n // this makes it so that the helper is well positioned relative to the mouse after scaling\n const helperRect = helper.getBoundingClientRect();\n helper.style.left = helperRect.x + (this.dragTransform.xScale - 1) * (event.clientX - helperRect.x) / this.dragTransform.xScale + 'px';\n helper.style.top = helperRect.y + (this.dragTransform.yScale - 1) * (event.clientY - helperRect.y) / this.dragTransform.yScale + 'px';\n helper.style.transformOrigin = `0px 0px`;\n }\n let { top, left } = helper.getBoundingClientRect();\n const rect = this.el.getBoundingClientRect();\n left -= rect.left;\n top -= rect.top;\n const ui = {\n position: {\n top: top * this.dragTransform.xScale,\n left: left * this.dragTransform.yScale\n }\n };\n if (node._temporaryRemoved) {\n node.x = Math.max(0, Math.round(left / cellWidth));\n node.y = Math.max(0, Math.round(top / cellHeight));\n delete node.autoPosition;\n this.engine.nodeBoundFix(node);\n // don't accept *initial* location if doesn't fit #1419 (locked drop region, or can't grow), but maybe try if it will go somewhere\n if (!this.engine.willItFit(node)) {\n node.autoPosition = true; // ignore x,y and try for any slot...\n if (!this.engine.willItFit(node)) {\n dd.off(el, 'drag'); // stop calling us\n return; // full grid or can't grow\n }\n if (node._willFitPos) {\n // use the auto position instead #1687\n Utils.copyPos(node, node._willFitPos);\n delete node._willFitPos;\n }\n }\n // re-use the existing node dragging method\n this._onStartMoving(helper, event, ui, node, cellWidth, cellHeight);\n }\n else {\n // re-use the existing node dragging that does so much of the collision detection\n this._dragOrResize(helper, event, ui, node, cellWidth, cellHeight);\n }\n };\n dd.droppable(this.el, {\n accept: (el) => {\n const node = el.gridstackNode || this._readAttr(el, false);\n // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\n if (node?.grid === this)\n return true;\n if (!this.opts.acceptWidgets)\n return false;\n // check for accept method or class matching\n let canAccept = true;\n if (typeof this.opts.acceptWidgets === 'function') {\n canAccept = this.opts.acceptWidgets(el);\n }\n else {\n const selector = (this.opts.acceptWidgets === true ? '.grid-stack-item' : this.opts.acceptWidgets);\n canAccept = el.matches(selector);\n }\n // finally check to make sure we actually have space left #1571 #2633\n if (canAccept && node && this.opts.maxRow) {\n const n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH }; // only width/height matters and autoPosition\n canAccept = this.engine.willItFit(n);\n }\n return canAccept;\n }\n })\n /**\n * entering our grid area\n */\n .on(this.el, 'dropover', (event, el, helper) => {\n // console.log(`over ${this.el.gridstack.opts.id} ${count++}`); // TEST\n let node = helper?.gridstackNode || el.gridstackNode;\n // ignore drop enter on ourself (unless we temporarily removed) which happens on a simple drag of our item\n if (node?.grid === this && !node._temporaryRemoved) {\n // delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\n return false; // prevent parent from receiving msg (which may be a grid as well)\n }\n // If sidebar item, restore the sidebar node size to ensure consistent behavior when dragging between grids\n if (node?._sidebarOrig) {\n node.w = node._sidebarOrig.w;\n node.h = node._sidebarOrig.h;\n }\n // fix #1578 when dragging fast, we may not get a leave on the previous grid so force one now\n if (node?.grid && node.grid !== this && !node._temporaryRemoved) {\n // console.log('dropover without leave'); // TEST\n const otherGrid = node.grid;\n otherGrid._leave(el, helper);\n }\n helper = helper || el;\n // cache cell dimensions (which don't change), position can animate if we removed an item in otherGrid that affects us...\n cellWidth = this.cellWidth();\n cellHeight = this.getCellHeight(true);\n // sidebar items: load any element attributes if we don't have a node on first enter from the sidebar\n if (!node) {\n const attr = helper.getAttribute('data-gs-widget') || helper.getAttribute('gridstacknode'); // TBD: temp support for old V11.0.0 attribute\n if (attr) {\n try {\n node = JSON.parse(attr);\n }\n catch (error) {\n console.error(\"Gridstack dropover: Bad JSON format: \", attr);\n }\n helper.removeAttribute('data-gs-widget');\n helper.removeAttribute('gridstacknode');\n }\n if (!node)\n node = this._readAttr(helper); // used to pass false for #2354, but now we clone top level node\n // On first grid enter from sidebar, set the initial sidebar item size properties for the node\n node._sidebarOrig = { w: node.w, h: node.h };\n }\n if (!node.grid) { // sidebar item\n if (!node.el)\n node = { ...node }; // clone first time we're coming from sidebar (since 'clone' doesn't copy vars)\n node._isExternal = true;\n helper.gridstackNode = node;\n }\n // calculate the grid size based on element outer size\n const w = node.w || Math.round(helper.offsetWidth / cellWidth) || 1;\n const h = node.h || Math.round(helper.offsetHeight / cellHeight) || 1;\n // if the item came from another grid, make a copy and save the original info in case we go back there\n if (node.grid && node.grid !== this) {\n // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\n // console.log('dropover cloning node'); // TEST\n if (!el._gridstackNodeOrig)\n el._gridstackNodeOrig = node; // shouldn't have multiple nested!\n el.gridstackNode = node = { ...node, w, h, grid: this };\n delete node.x;\n delete node.y;\n this.engine.cleanupNode(node)\n .nodeBoundFix(node);\n // restore some internal fields we need after clearing them all\n node._initDD =\n node._isExternal = // DOM needs to be re-parented on a drop\n node._temporaryRemoved = true; // so it can be inserted onDrag below\n }\n else {\n node.w = w;\n node.h = h;\n node._temporaryRemoved = true; // so we can insert it\n }\n // clear any marked for complete removal (Note: don't check _isAboutToRemove as that is cleared above - just do it)\n GridStack._itemRemoving(node.el, false);\n dd.on(el, 'drag', onDrag);\n // make sure this is called at least once when going fast #1578\n onDrag(event, el, helper);\n return false; // prevent parent from receiving msg (which may be a grid as well)\n })\n /**\n * Leaving our grid area...\n */\n .on(this.el, 'dropout', (event, el, helper) => {\n // console.log(`out ${this.el.gridstack.opts.id} ${count++}`); // TEST\n const node = helper?.gridstackNode || el.gridstackNode;\n if (!node)\n return false;\n // fix #1578 when dragging fast, we might get leave after other grid gets enter (which calls us to clean)\n // so skip this one if we're not the active grid really..\n if (!node.grid || node.grid === this) {\n this._leave(el, helper);\n // if we were created as temporary nested grid, go back to before state\n if (this._isTemp) {\n this.removeAsSubGrid(node);\n }\n }\n return false; // prevent parent from receiving msg (which may be grid as well)\n })\n /**\n * end - releasing the mouse\n */\n .on(this.el, 'drop', (event, el, helper) => {\n const node = helper?.gridstackNode || el.gridstackNode;\n // ignore drop on ourself from ourself that didn't come from the outside - dragend will handle the simple move instead\n if (node?.grid === this && !node._isExternal)\n return false;\n const wasAdded = !!this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419\n const wasSidebar = el !== helper;\n this.placeholder.remove();\n delete this.placeholder.gridstackNode;\n // disable animation when replacing a placeholder (already positioned) with actual content\n if (wasAdded && this.opts.animate) {\n this.setAnimation(false);\n this.setAnimation(true, true); // delay adding back\n }\n // notify previous grid of removal\n // console.log('drop delete _gridstackNodeOrig') // TEST\n const origNode = el._gridstackNodeOrig;\n delete el._gridstackNodeOrig;\n if (wasAdded && origNode?.grid && origNode.grid !== this) {\n const oGrid = origNode.grid;\n oGrid.engine.removeNodeFromLayoutCache(origNode);\n oGrid.engine.removedNodes.push(origNode);\n oGrid._triggerRemoveEvent()._triggerChangeEvent();\n // if it's an empty sub-grid that got auto-created, nuke it\n if (oGrid.parentGridNode && !oGrid.engine.nodes.length && oGrid.opts.subGridDynamic) {\n oGrid.removeAsSubGrid();\n }\n }\n if (!node)\n return false;\n // use existing placeholder node as it's already in our list with drop location\n if (wasAdded) {\n this.engine.cleanupNode(node); // removes all internal _xyz values\n node.grid = this;\n }\n delete node.grid?._isTemp;\n dd.off(el, 'drag');\n // if we made a copy insert that instead of the original (sidebar item)\n if (helper !== el) {\n helper.remove();\n el = helper;\n }\n else {\n el.remove(); // reduce flicker as we change depth here, and size further down\n }\n this._removeDD(el);\n if (!wasAdded)\n return false;\n const subGrid = node.subGrid?.el?.gridstack; // set when actual sub-grid present\n Utils.copyPos(node, this._readAttr(this.placeholder)); // placeholder values as moving VERY fast can throw things off #1578\n Utils.removePositioningStyles(el);\n // give the user a chance to alter the widget that will get inserted if new sidebar item\n if (wasSidebar && (node.content || node.subGridOpts || GridStack.addRemoveCB)) {\n delete node.el;\n el = this.addWidget(node);\n }\n else {\n this._prepareElement(el, true, node);\n this.el.appendChild(el);\n // resizeToContent is skipped in _prepareElement() until node is visible (clientHeight=0) so call it now\n this.resizeToContentCheck(false, node);\n if (subGrid) {\n subGrid.parentGridNode = node;\n }\n this._updateContainerHeight();\n }\n this.engine.addedNodes.push(node);\n this._triggerAddEvent();\n this._triggerChangeEvent();\n this.engine.endUpdate();\n if (this._gsEventHandler['dropped']) {\n this._gsEventHandler['dropped']({ ...event, type: 'dropped' }, origNode && origNode.grid ? origNode : undefined, node);\n }\n return false; // prevent parent from receiving msg (which may be grid as well)\n });\n return this;\n }\n /** @internal mark item for removal */\n static _itemRemoving(el, remove) {\n if (!el)\n return;\n const node = el ? el.gridstackNode : undefined;\n if (!node?.grid || el.classList.contains(node.grid.opts.removableOptions.decline))\n return;\n remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;\n remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');\n }\n /** @internal called to setup a trash drop zone if the user specifies it */\n _setupRemoveDrop() {\n if (typeof this.opts.removable !== 'string')\n return this;\n const trashEl = document.querySelector(this.opts.removable);\n if (!trashEl)\n return this;\n // only register ONE static drop-over/dropout callback for the 'trash', and it will\n // update the passed in item and parent grid because the '.trash' is a shared resource anyway,\n // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\n if (!this.opts.staticGrid && !dd.isDroppable(trashEl)) {\n dd.droppable(trashEl, this.opts.removableOptions)\n .on(trashEl, 'dropover', (event, el) => GridStack._itemRemoving(el, true))\n .on(trashEl, 'dropout', (event, el) => GridStack._itemRemoving(el, false));\n }\n return this;\n }\n /**\n * prepares the element for drag&drop - this is normally called by makeWidget() unless are are delay loading\n * @param el GridItemHTMLElement of the widget\n * @param [force=false]\n * */\n prepareDragDrop(el, force = false) {\n const node = el?.gridstackNode;\n if (!node)\n return;\n const noMove = node.noMove || this.opts.disableDrag;\n const noResize = node.noResize || this.opts.disableResize;\n // check for disabled grid first\n const disable = this.opts.staticGrid || (noMove && noResize);\n if (force || disable) {\n if (node._initDD) {\n this._removeDD(el); // nukes everything instead of just disable, will add some styles back next\n delete node._initDD;\n }\n if (disable)\n el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\n if (!force)\n return this;\n }\n if (!node._initDD) {\n // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\n let cellWidth;\n let cellHeight;\n /** called when item starts moving/resizing */\n const onStartMoving = (event, ui) => {\n // trigger any 'dragstart' / 'resizestart' manually\n this.triggerEvent(event, event.target);\n cellWidth = this.cellWidth();\n cellHeight = this.getCellHeight(true); // force pixels for calculations\n this._onStartMoving(el, event, ui, node, cellWidth, cellHeight);\n };\n /** called when item is being dragged/resized */\n const dragOrResize = (event, ui) => {\n this._dragOrResize(el, event, ui, node, cellWidth, cellHeight);\n };\n /** called when the item stops moving/resizing */\n const onEndMoving = (event) => {\n this.placeholder.remove();\n delete this.placeholder.gridstackNode;\n delete node._moving;\n delete node._resizing;\n delete node._event;\n delete node._lastTried;\n const widthChanged = node.w !== node._orig.w;\n // if the item has moved to another grid, we're done here\n const target = event.target;\n if (!target.gridstackNode || target.gridstackNode.grid !== this)\n return;\n node.el = target;\n if (node._isAboutToRemove) {\n const grid = el.gridstackNode.grid;\n if (grid._gsEventHandler[event.type]) {\n grid._gsEventHandler[event.type](event, target);\n }\n grid.engine.nodes.push(node); // temp add it back so we can proper remove it next\n grid.removeWidget(el, true, true);\n }\n else {\n Utils.removePositioningStyles(target);\n if (node._temporaryRemoved) {\n // use last position we were at (not _orig as we may have pushed others and moved) and add it back\n this._writePosAttr(target, node);\n this.engine.addNode(node);\n }\n else {\n // move to new placeholder location\n this._writePosAttr(target, node);\n }\n this.triggerEvent(event, target);\n }\n // @ts-ignore\n this._extraDragRow = 0; // @ts-ignore\n this._updateContainerHeight(); // @ts-ignore\n this._triggerChangeEvent();\n this.engine.endUpdate();\n if (event.type === 'resizestop') {\n if (Number.isInteger(node.sizeToContent))\n node.sizeToContent = node.h; // new soft limit\n this.resizeToContentCheck(widthChanged, node); // wait for width animation if changed\n }\n };\n dd.draggable(el, {\n start: onStartMoving,\n stop: onEndMoving,\n drag: dragOrResize\n }).resizable(el, {\n start: onStartMoving,\n stop: onEndMoving,\n resize: dragOrResize\n });\n node._initDD = true; // we've set DD support now\n }\n // finally fine tune move vs resize by disabling any part...\n dd.draggable(el, noMove ? 'disable' : 'enable')\n .resizable(el, noResize ? 'disable' : 'enable');\n return this;\n }\n /** @internal handles actual drag/resize start */\n _onStartMoving(el, event, ui, node, cellWidth, cellHeight) {\n this.engine.cleanNodes()\n .beginUpdate(node);\n // @ts-ignore\n this._writePosAttr(this.placeholder, node);\n this.el.appendChild(this.placeholder);\n this.placeholder.gridstackNode = node;\n // console.log('_onStartMoving placeholder') // TEST\n // if the element is inside a grid, it has already been scaled\n // we can use that as a scale reference\n if (node.grid?.el) {\n this.dragTransform = Utils.getValuesFromTransformedElement(el);\n }\n // if the element is being dragged from outside (not from any grid)\n // we use the grid as the transformation reference, since the helper is not subject to transformation\n else if (this.placeholder && this.placeholder.closest('.grid-stack')) {\n const gridEl = this.placeholder.closest('.grid-stack');\n this.dragTransform = Utils.getValuesFromTransformedElement(gridEl);\n }\n // Fallback\n else {\n this.dragTransform = {\n xScale: 1,\n xOffset: 0,\n yScale: 1,\n yOffset: 0,\n };\n }\n node.el = this.placeholder;\n node._lastUiPosition = ui.position;\n node._prevYPix = ui.position.top;\n node._moving = (event.type === 'dragstart'); // 'dropover' are not initially moving so they can go exactly where they enter (will push stuff out of the way)\n node._resizing = (event.type === 'resizestart');\n delete node._lastTried;\n if (event.type === 'dropover' && node._temporaryRemoved) {\n // console.log('engine.addNode x=' + node.x); // TEST\n this.engine.addNode(node); // will add, fix collisions, update attr and clear _temporaryRemoved\n node._moving = true; // AFTER, mark as moving object (wanted fix location before)\n }\n // set the min/max resize info taking into account the column count and position (so we don't resize outside the grid)\n this.engine.cacheRects(cellWidth, cellHeight, this.opts.marginTop, this.opts.marginRight, this.opts.marginBottom, this.opts.marginLeft);\n if (event.type === 'resizestart') {\n const colLeft = this.getColumn() - node.x;\n const rowLeft = (this.opts.maxRow || Number.MAX_SAFE_INTEGER) - node.y;\n dd.resizable(el, 'option', 'minWidth', cellWidth * Math.min(node.minW || 1, colLeft))\n .resizable(el, 'option', 'minHeight', cellHeight * Math.min(node.minH || 1, rowLeft))\n .resizable(el, 'option', 'maxWidth', cellWidth * Math.min(node.maxW || Number.MAX_SAFE_INTEGER, colLeft))\n .resizable(el, 'option', 'maxWidthMoveLeft', cellWidth * Math.min(node.maxW || Number.MAX_SAFE_INTEGER, node.x + node.w))\n .resizable(el, 'option', 'maxHeight', cellHeight * Math.min(node.maxH || Number.MAX_SAFE_INTEGER, rowLeft))\n .resizable(el, 'option', 'maxHeightMoveUp', cellHeight * Math.min(node.maxH || Number.MAX_SAFE_INTEGER, node.y + node.h));\n }\n }\n /** @internal handles actual drag/resize */\n _dragOrResize(el, event, ui, node, cellWidth, cellHeight) {\n const p = { ...node._orig }; // could be undefined (_isExternal) which is ok (drag only set x,y and w,h will default to node value)\n let resizing;\n let mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;\n // if margins (which are used to pass mid point by) are large relative to cell height/width, reduce them down #1855\n const mHeight = Math.round(cellHeight * 0.1), mWidth = Math.round(cellWidth * 0.1);\n mLeft = Math.min(mLeft, mWidth);\n mRight = Math.min(mRight, mWidth);\n mTop = Math.min(mTop, mHeight);\n mBottom = Math.min(mBottom, mHeight);\n if (event.type === 'drag') {\n if (node._temporaryRemoved)\n return; // handled by dropover\n const distance = ui.position.top - node._prevYPix;\n node._prevYPix = ui.position.top;\n if (this.opts.draggable.scroll !== false) {\n Utils.updateScrollPosition(el, ui.position, distance);\n }\n // get new position taking into account the margin in the direction we are moving! (need to pass mid point by margin)\n const left = ui.position.left + (ui.position.left > node._lastUiPosition.left ? -mRight : mLeft);\n const top = ui.position.top + (ui.position.top > node._lastUiPosition.top ? -mBottom : mTop);\n p.x = Math.round(left / cellWidth);\n p.y = Math.round(top / cellHeight);\n // @ts-ignore// if we're at the bottom hitting something else, grow the grid so cursor doesn't leave when trying to place below others\n const prev = this._extraDragRow;\n if (this.engine.collide(node, p)) {\n const row = this.getRow();\n let extra = Math.max(0, (p.y + node.h) - row);\n if (this.opts.maxRow && row + extra > this.opts.maxRow) {\n extra = Math.max(0, this.opts.maxRow - row);\n } // @ts-ignore\n this._extraDragRow = extra; // @ts-ignore\n }\n else\n this._extraDragRow = 0; // @ts-ignore\n if (this._extraDragRow !== prev)\n this._updateContainerHeight();\n if (node.x === p.x && node.y === p.y)\n return; // skip same\n // DON'T skip one we tried as we might have failed because of coverage <50% before\n // if (node._lastTried && node._lastTried.x === x && node._lastTried.y === y) return;\n }\n else if (event.type === 'resize') {\n if (p.x < 0)\n return;\n // Scrolling page if needed\n Utils.updateScrollResize(event, el, cellHeight);\n // get new size\n p.w = Math.round((ui.size.width - mLeft) / cellWidth);\n p.h = Math.round((ui.size.height - mTop) / cellHeight);\n if (node.w === p.w && node.h === p.h)\n return;\n if (node._lastTried && node._lastTried.w === p.w && node._lastTried.h === p.h)\n return; // skip one we tried (but failed)\n // if we size on left/top side this might move us, so get possible new position as well\n const left = ui.position.left + mLeft;\n const top = ui.position.top + mTop;\n p.x = Math.round(left / cellWidth);\n p.y = Math.round(top / cellHeight);\n resizing = true;\n }\n node._event = event;\n node._lastTried = p; // set as last tried (will nuke if we go there)\n const rect = {\n x: ui.position.left + mLeft,\n y: ui.position.top + mTop,\n w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,\n h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom\n };\n if (this.engine.moveNodeCheck(node, { ...p, cellWidth, cellHeight, rect, resizing })) {\n node._lastUiPosition = ui.position;\n this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);\n delete node._skipDown;\n if (resizing && node.subGrid)\n node.subGrid.onResize();\n this._extraDragRow = 0; // @ts-ignore\n this._updateContainerHeight();\n const target = event.target; // @ts-ignore\n // Do not write sidebar item attributes back to the original sidebar el\n if (!node._sidebarOrig) {\n this._writePosAttr(target, node);\n }\n this.triggerEvent(event, target);\n }\n }\n /** call given event callback on our main top-most grid (if we're nested) */\n triggerEvent(event, target) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let grid = this;\n while (grid.parentGridNode)\n grid = grid.parentGridNode.grid;\n if (grid._gsEventHandler[event.type]) {\n grid._gsEventHandler[event.type](event, target);\n }\n }\n /** @internal called when item leaving our area by either cursor dropout event\n * or shape is outside our boundaries. remove it from us, and mark temporary if this was\n * our item to start with else restore prev node values from prev grid it came from.\n */\n _leave(el, helper) {\n helper = helper || el;\n const node = helper.gridstackNode;\n if (!node)\n return;\n // remove the scale of the helper on leave\n helper.style.transform = helper.style.transformOrigin = null;\n dd.off(el, 'drag'); // no need to track while being outside\n // this gets called when cursor leaves and shape is outside, so only do this once\n if (node._temporaryRemoved)\n return;\n node._temporaryRemoved = true;\n this.engine.removeNode(node); // remove placeholder as well, otherwise it's a sign node is not in our list, which is a bigger issue\n node.el = node._isExternal && helper ? helper : el; // point back to real item being dragged\n const sidebarOrig = node._sidebarOrig;\n if (node._isExternal)\n this.engine.cleanupNode(node);\n // Restore sidebar item initial size info to stay consistent when dragging between multiple grids\n node._sidebarOrig = sidebarOrig;\n if (this.opts.removable === true) { // boolean vs a class string\n // item leaving us and we are supposed to remove on leave (no need to drag onto trash) mark it so\n GridStack._itemRemoving(el, true);\n }\n // finally if item originally came from another grid, but left us, restore things back to prev info\n if (el._gridstackNodeOrig) {\n // console.log('leave delete _gridstackNodeOrig') // TEST\n el.gridstackNode = el._gridstackNodeOrig;\n delete el._gridstackNodeOrig;\n }\n else if (node._isExternal) {\n // item came from outside restore all nodes back to original\n this.engine.restoreInitial();\n }\n }\n}\n/**\n * callback to create the content of widgets so the app can control how to store and restore it\n * By default this lib will do 'el.textContent = w.content' forcing text only support for avoiding potential XSS issues.\n */\nGridStack.renderCB = (el, w) => { if (el && w?.content)\n el.textContent = w.content; };\n/** parent class for sizing content. defaults to '.grid-stack-item-content' */\nGridStack.resizeToContentParent = '.grid-stack-item-content';\n/** scoping so users can call GridStack.Utils.sort() for example */\nGridStack.Utils = Utils;\n/** scoping so users can call new GridStack.Engine(12) for example */\nGridStack.Engine = GridStackEngine;\n/** @internal current version compiled in code */\nGridStack.GDRev = '12.4.2';\nexport { GridStack };\n//# sourceMappingURL=gridstack.js.map","<script lang=\"ts\">\n import { onMount } from 'svelte';\n import { GridStack } from 'gridstack';\n import type { AppTab } from './DevHostController.js';\n import type { DevHostController } from './DevHostController.js';\n import type { PublishedAppInfo } from '@rool-dev/sdk';\n\n interface Props {\n controller: DevHostController;\n tabs: AppTab[];\n uninstalledApps: PublishedAppInfo[];\n onInstallApp: (appId: string) => void;\n onRemoveApp: (appId: string) => void;\n }\n\n let { controller, tabs, uninstalledApps, onInstallApp, onRemoveApp }: Props = $props();\n\n let gridEl: HTMLDivElement;\n let grid: GridStack;\n let addMenuOpen = $state(false);\n\n let mountedTabIds = new Set<string>();\n\n // --- Layout persistence ---\n\n interface SavedWidget { id: string; x: number; y: number; w: number; h: number }\n\n function layoutKey(): string {\n return `rool-devhost:layout:${controller.currentSpaceId ?? 'default'}`;\n }\n\n function loadLayout(): Record<string, SavedWidget> {\n try {\n const raw = localStorage.getItem(layoutKey());\n if (!raw) return {};\n const arr: SavedWidget[] = JSON.parse(raw);\n const map: Record<string, SavedWidget> = {};\n for (const w of arr) map[w.id] = w;\n return map;\n } catch { return {}; }\n }\n\n function saveLayout() {\n if (!grid) return;\n const widgets: SavedWidget[] = [];\n for (const node of grid.engine.nodes) {\n if (node.id) {\n widgets.push({ id: node.id as string, x: node.x!, y: node.y!, w: node.w!, h: node.h! });\n }\n }\n try { localStorage.setItem(layoutKey(), JSON.stringify(widgets)); } catch {}\n }\n\n function defaultPosition(count: number): { x: number; y: number; w: number; h: number } {\n if (count <= 1) return { x: 0, y: 0, w: 12, h: 6 };\n return {\n w: 6,\n h: 6,\n x: ((count - 1) % 2) * 6,\n y: Math.floor((count - 1) / 2) * 6,\n };\n }\n\n onMount(() => {\n grid = GridStack.init({\n column: 12,\n cellHeight: 80,\n margin: 6,\n animate: true,\n float: true,\n draggable: { handle: '.app-card-handle' },\n resizable: { handles: 'e,se,s,sw,w' },\n }, gridEl);\n\n grid.on('dragstart resizestart', () => {\n gridEl.classList.add('gs-dragging');\n });\n grid.on('dragstop resizestop', () => {\n gridEl.classList.remove('gs-dragging');\n });\n\n // Save layout after any drag/resize/add/remove settles\n grid.on('change', () => saveLayout());\n\n const saved = loadLayout();\n for (const tab of tabs) {\n addTabWidget(tab, saved);\n }\n\n return () => {\n grid.destroy(false);\n };\n });\n\n function addTabWidget(tab: AppTab, savedLayout?: Record<string, SavedWidget>) {\n if (mountedTabIds.has(tab.id)) return;\n mountedTabIds.add(tab.id);\n\n const saved = savedLayout?.[tab.id];\n let { x, y, w, h } = saved ?? defaultPosition(mountedTabIds.size);\n\n // If no saved layout and this is the second widget, shrink the first\n if (!saved && mountedTabIds.size === 2) {\n const firstEl = gridEl.querySelector(`[gs-id=\"${[...mountedTabIds][0]}\"]`) as HTMLElement;\n if (firstEl) grid.update(firstEl, { w: 6 });\n }\n\n const widgetEl = grid.addWidget({ id: tab.id, x, y, w, h, content: '' });\n\n const contentEl = widgetEl.querySelector('.grid-stack-item-content') as HTMLElement;\n contentEl.innerHTML = '';\n contentEl.className = 'grid-stack-item-content flex flex-col overflow-hidden rounded-lg border bg-white shadow-sm'\n + (tab.isLocal ? ' border-emerald-300' : ' border-slate-200');\n\n // Title bar\n const titleBar = document.createElement('div');\n titleBar.className = 'app-card-handle flex items-center gap-1.5 px-2.5 h-8 border-b cursor-grab select-none shrink-0'\n + (tab.isLocal\n ? ' bg-emerald-50 border-emerald-200'\n : ' bg-slate-50 border-slate-200');\n\n if (tab.isLocal) {\n const badge = document.createElement('span');\n badge.className = 'text-[9px] font-bold text-emerald-700 bg-emerald-100 border border-emerald-300 rounded px-1 py-px tracking-wide';\n badge.textContent = 'DEV';\n titleBar.appendChild(badge);\n }\n\n const name = document.createElement('span');\n name.className = 'text-xs font-medium text-slate-700 flex-1 min-w-0 truncate';\n name.textContent = tab.name;\n titleBar.appendChild(name);\n\n if (!tab.isLocal) {\n const id = document.createElement('span');\n id.className = 'text-[10px] text-slate-400 font-mono shrink-0';\n id.textContent = tab.id;\n titleBar.appendChild(id);\n\n const close = document.createElement('button');\n close.className = 'border-none bg-transparent cursor-pointer text-slate-400 hover:text-red-500 p-0.5 leading-none shrink-0 transition-colors';\n close.innerHTML = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18\"/><path d=\"M6 6l12 12\"/></svg>';\n close.title = 'Uninstall app';\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n removeTabWidget(tab.id);\n onRemoveApp(tab.id);\n });\n titleBar.appendChild(close);\n }\n\n contentEl.appendChild(titleBar);\n\n const iframe = document.createElement('iframe');\n iframe.src = tab.url;\n iframe.title = tab.name;\n iframe.sandbox.add('allow-scripts', 'allow-same-origin');\n iframe.className = 'flex-1 border-0 min-h-0 w-full';\n contentEl.appendChild(iframe);\n\n controller.registerIframe(tab.id, iframe);\n }\n\n function removeTabWidget(tabId: string) {\n const el = gridEl.querySelector(`[gs-id=\"${tabId}\"]`) as HTMLElement;\n if (el) {\n controller.unregisterIframe(tabId);\n grid.removeWidget(el);\n mountedTabIds.delete(tabId);\n saveLayout();\n }\n }\n\n $effect(() => {\n if (!grid) return;\n const currentIds = new Set(tabs.map(t => t.id));\n\n for (const tab of tabs) {\n if (!mountedTabIds.has(tab.id)) addTabWidget(tab);\n }\n for (const id of mountedTabIds) {\n if (!currentIds.has(id)) removeTabWidget(id);\n }\n });\n</script>\n\n<div class=\"flex-1 min-h-0 relative flex flex-col\">\n <!-- Toolbar -->\n <div class=\"flex items-center px-3 py-1.5 bg-white border-b border-slate-200 shrink-0\">\n <span class=\"text-[11px] text-slate-400 font-semibold uppercase tracking-wide\">Apps</span>\n <div class=\"flex-1\"></div>\n {#if uninstalledApps.length > 0}\n <div class=\"relative\" data-add-menu>\n <button\n class=\"px-2.5 py-1 text-[11px] font-medium text-slate-500 hover:text-slate-700 hover:bg-slate-50 rounded-md transition-colors border border-slate-200 bg-white flex items-center gap-1.5\"\n type=\"button\"\n onclick={(e: MouseEvent) => { e.stopPropagation(); addMenuOpen = !addMenuOpen; }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14\"/><path d=\"M5 12h14\"/></svg>\n Install\n </button>\n {#if addMenuOpen}\n <div class=\"absolute top-full mt-1 right-0 min-w-[200px] max-h-60 overflow-y-auto bg-white border border-slate-200 rounded-lg shadow-lg z-50 py-1\">\n {#each uninstalledApps as app}\n <button\n class=\"flex items-center gap-2 w-full px-2.5 py-1.5 text-[13px] text-left border-none cursor-pointer hover:bg-slate-50 text-slate-700 bg-transparent\"\n type=\"button\"\n onclick={() => { addMenuOpen = false; onInstallApp(app.appId); }}\n >\n <span class=\"font-medium\">{app.name}</span>\n <span class=\"text-[10px] text-slate-400 font-mono ml-auto\">{app.appId}</span>\n </button>\n {/each}\n </div>\n {/if}\n </div>\n {/if}\n </div>\n\n <!-- Grid -->\n <div class=\"flex-1 min-h-0 overflow-auto bg-slate-100 p-2\">\n <div bind:this={gridEl} class=\"grid-stack\"></div>\n </div>\n</div>\n\n<svelte:document onclick={(e: MouseEvent) => {\n if (addMenuOpen && !(e.target as Element)?.closest('[data-add-menu]')) {\n addMenuOpen = false;\n }\n}} />\n\n<style>\n /* Only GridStack overrides that can't be done with Tailwind */\n :global(.gs-dragging .grid-stack-item-content iframe) {\n pointer-events: none !important;\n }\n :global(.ui-draggable-dragging > .grid-stack-item-content),\n :global(.ui-resizable-resizing > .grid-stack-item-content) {\n opacity: 1 !important;\n }\n :global(.grid-stack-placeholder > .placeholder-content) {\n background: rgba(99, 102, 241, 0.06) !important;\n border: 2px dashed #c7d2fe !important;\n border-radius: 8px !important;\n }\n</style>\n","<script lang=\"ts\">\n import { onMount, tick } from 'svelte';\n import { DevHostController } from './DevHostController.js';\n import type { AppTab } from './DevHostController.js';\n import type { AppManifest } from '../manifest.js';\n import type { RoolSpaceInfo, PublishedAppInfo } from '@rool-dev/sdk';\n import type { Environment } from '../manifest.js';\n import Sidebar from './Sidebar.svelte';\n import AppGrid from './AppGrid.svelte';\n\n // Props injected from the mount entry\n interface Props {\n channelId: string;\n appUrl: string;\n manifest: AppManifest | null;\n manifestError: string | null;\n }\n\n const props: Props = $props();\n\n // ---------------------------------------------------------------------------\n // Controller + reactive state mirror\n // ---------------------------------------------------------------------------\n\n let spaces: RoolSpaceInfo[] = $state([]);\n let currentSpaceId: string | null = $state(null);\n let statusText: string = $state('Initializing...');\n let statusState: 'ok' | 'loading' | 'off' = $state('off');\n let placeholderText: string | null = $state('Authenticating...');\n let sidebarCollapsed: boolean = $state(false);\n let env: Environment = $state('prod');\n let publishedApps: PublishedAppInfo[] = $state([]);\n let installedAppIds: string[] = $state([]);\n let tabs: AppTab[] = $state([]);\n\n // UI-only state (not in controller)\n let dropdownOpen: boolean = $state(false);\n\n const controller = new DevHostController(\n props,\n syncState,\n tick,\n );\n\n function syncState() {\n spaces = controller.spaces;\n currentSpaceId = controller.currentSpaceId;\n statusText = controller.statusText;\n statusState = controller.statusState;\n placeholderText = controller.placeholderText;\n sidebarCollapsed = controller.sidebarCollapsed;\n env = controller.env;\n publishedApps = controller.publishedApps;\n installedAppIds = controller.installedAppIds;\n tabs = controller.tabs;\n }\n\n // Derived: published apps not yet installed (excluding the local dev app)\n let uninstalledApps = $derived(\n publishedApps.filter((app) => app.appId !== props.channelId && !installedAppIds.includes(app.appId)),\n );\n\n // Initial sync\n syncState();\n\n // ---------------------------------------------------------------------------\n // Bootstrap\n // ---------------------------------------------------------------------------\n\n onMount(() => {\n controller.boot();\n\n function handleClickOutside(e: MouseEvent) {\n if (dropdownOpen && !(e.target as Element)?.closest('[data-dropdown]')) {\n dropdownOpen = false;\n }\n }\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n });\n</script>\n\n<!-- Sidebar -->\n<Sidebar\n {controller}\n manifest={props.manifest}\n manifestError={props.manifestError}\n {spaces}\n {currentSpaceId}\n {env}\n {statusText}\n {statusState}\n {sidebarCollapsed}\n bind:dropdownOpen\n/>\n\n<!-- Main area -->\n<div class=\"flex-1 min-w-0 flex flex-col\">\n {#if placeholderText}\n <div class=\"flex items-center justify-center h-full text-slate-400 text-sm\">{placeholderText}</div>\n {:else}\n <AppGrid\n {controller}\n {tabs}\n {uninstalledApps}\n onInstallApp={(id) => controller.installApp(id)}\n onRemoveApp={(id) => controller.removeApp(id)}\n />\n {/if}\n</div>\n","/**\n * Dev host shell entry point.\n *\n * Mounts the HostShell Svelte component into #rool-host.\n * Built into a single bundle at publish time and served by the CLI dev server.\n */\n\nimport { mount } from 'svelte';\nimport HostShell from './HostShell.svelte';\nimport css from './app.css?inline';\nimport gridstackCss from 'gridstack/dist/gridstack.css?inline';\n\n// Inject Tailwind + GridStack CSS into the document\nconst style = document.createElement('style');\nstyle.textContent = css + '\\n' + gridstackCss;\ndocument.head.appendChild(style);\n\nconst root = document.getElementById('rool-host')!;\nconst channelId = root.dataset.channelId ?? 'app-dev';\nconst appUrl = root.dataset.appUrl ?? '/';\nconst manifest = root.dataset.manifest ? JSON.parse(root.dataset.manifest) : null;\nconst manifestError = root.dataset.manifestError ?? null;\n\nmount(HostShell, {\n target: root,\n props: { channelId, appUrl, manifest, manifestError },\n});\n"],"names":["_dirty_effects","_maybe_dirty_effects","_a","effect","derived","root","source","flags","child","e.effect_update_depth_exceeded","e","w.svelte_boundary_reset_noop","e.svelte_boundary_reset_onerror","error","e.async_derived_orphan","boundary","d","e.state_unsafe_mutation","version","prop","e.state_descriptors_fixed","s","value","key","e.state_prototype_fixed","e.effect_orphan","e.effect_in_unowned_derived","e.effect_in_teardown","teardown","sibling","i","index","event","capture","events","anchor_node","offscreen","branch","fn","state","item","css","style","e.lifecycle_outside_component","set","_b","channelId","ControlChars","retries","control","unlisten","retryingErr","res","deferred","iterator","options","signal","tick","manifest","$.prop","root_1","$.set_class","root_2","root_3","$.sibling","$.each","$.index","$$anchor","$.get","$.set_text","n","move","el","grid","column","name","$.state","$.user_effect","$.event","$.document","$.set","$.rest_props","$.proxy"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,46,48,49,50,51,64,65,66,67,68,69,70,71,72,73,74,75,76]}
|