@getforma/core 1.0.10 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-T33QUD2Y.cjs → chunk-E3FV2VSU.cjs} +43 -43
- package/dist/{chunk-T33QUD2Y.cjs.map → chunk-E3FV2VSU.cjs.map} +1 -1
- package/dist/chunk-ETPJTPYD.js +103 -0
- package/dist/chunk-ETPJTPYD.js.map +1 -0
- package/dist/chunk-H7MDUHS5.cjs +110 -0
- package/dist/chunk-H7MDUHS5.cjs.map +1 -0
- package/dist/{chunk-6FW5E54W.cjs → chunk-KUXNZ5MG.cjs} +127 -103
- package/dist/chunk-KUXNZ5MG.cjs.map +1 -0
- package/dist/{chunk-3G7ET4O5.js → chunk-Y3A2EVVS.js} +121 -94
- package/dist/chunk-Y3A2EVVS.js.map +1 -0
- package/dist/{chunk-AFRFF7XL.js → chunk-YRNYOZF3.js} +4 -4
- package/dist/{chunk-AFRFF7XL.js.map → chunk-YRNYOZF3.js.map} +1 -1
- package/dist/forma-runtime-csp.js +52 -4
- package/dist/forma-runtime.js +98 -10
- package/dist/formajs-runtime-hardened.global.js +52 -4
- package/dist/formajs-runtime-hardened.global.js.map +1 -1
- package/dist/formajs-runtime.global.js +98 -10
- package/dist/formajs-runtime.global.js.map +1 -1
- package/dist/formajs.global.js +368 -147
- package/dist/formajs.global.js.map +1 -1
- package/dist/http.cjs +11 -11
- package/dist/http.js +2 -2
- package/dist/index.cjs +262 -141
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -27
- package/dist/index.d.ts +32 -27
- package/dist/index.js +204 -83
- package/dist/index.js.map +1 -1
- package/dist/{resource-DeEzxUz6.d.cts → resource-D6HfVgiA.d.cts} +7 -2
- package/dist/{resource-BHsgURy0.d.ts → resource-ljs2X5NM.d.ts} +7 -2
- package/dist/runtime-hardened.cjs +53 -3
- package/dist/runtime-hardened.cjs.map +1 -1
- package/dist/runtime-hardened.js +53 -3
- package/dist/runtime-hardened.js.map +1 -1
- package/dist/runtime.cjs +29 -29
- package/dist/runtime.js +3 -3
- package/dist/server.cjs +7 -7
- package/dist/server.d.cts +2 -2
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/{signal-C9v4akyJ.d.cts → signal-CRBJYQ6B.d.cts} +0 -8
- package/dist/{signal-C9v4akyJ.d.ts → signal-CRBJYQ6B.d.ts} +0 -8
- package/dist/tc39-compat.cjs +3 -6
- package/dist/tc39-compat.cjs.map +1 -1
- package/dist/tc39-compat.d.cts +1 -1
- package/dist/tc39-compat.d.ts +1 -1
- package/dist/tc39-compat.js +1 -4
- package/dist/tc39-compat.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-3G7ET4O5.js.map +0 -1
- package/dist/chunk-6FW5E54W.cjs.map +0 -1
- package/dist/chunk-HLM5BZZQ.js +0 -35
- package/dist/chunk-HLM5BZZQ.js.map +0 -1
- package/dist/chunk-QLPCVK7C.cjs +0 -38
- package/dist/chunk-QLPCVK7C.cjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dom/text.ts","../src/dom/mount.ts","../src/dom/switch.ts","../src/dom/portal.ts","../src/dom/error-boundary.ts","../src/dom/suspense.ts","../src/dom/template.ts","../src/dom/activate.ts","../src/component/define.ts","../src/component/context.ts","../src/state/store.ts","../src/state/history.ts","../src/state/persist.ts","../src/events/bus.ts","../src/events/delegate.ts","../src/events/keyboard.ts","../src/dom-utils/query.ts","../src/dom-utils/mutate.ts","../src/dom-utils/traverse.ts","../src/dom-utils/observe.ts"],"names":["fragment","cache","parent","children","trigger","cleanup","setter","on"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Forma DOM - Text\n *\n * Creates static or reactive Text nodes.\n * Zero dependencies -- native browser APIs only.\n */\n\nimport { internalEffect } from 'forma/reactive';\n\n/**\n * Create a Text node that is either static or reactively bound.\n *\n * - If `value` is a string, creates a plain Text node.\n * - If `value` is a function (signal getter), creates a Text node and sets up\n * an effect that auto-updates `textContent` whenever the signal changes.\n *\n * @returns The Text node.\n */\nexport function createText(value: string | (() => string)): Text {\n if (typeof value === 'function') {\n // \"Track Limits\": new Text() bypasses Document factory dispatch\n const node = new Text('');\n internalEffect(() => {\n // \"DAS\": CharacterData.data is the rawest text setter\n node.data = value();\n });\n return node;\n }\n return new Text(value);\n}\n","/**\n * Forma DOM - Mount\n *\n * Mounts a component function into a DOM container, returning an unmount handle.\n * Uses createRoot() for automatic effect disposal — no global state.\n *\n * When the container has `data-forma-ssr`, uses hydrateIsland() for zero-flash\n * descriptor-based hydration instead of tearing down and rebuilding the DOM.\n */\n\nimport { createUnownedRoot } from 'forma/reactive';\nimport { hydrateIsland } from './hydrate.js';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Mount a component into a DOM container.\n *\n * All effects created during the component's render are tracked via\n * `createRoot()` and automatically disposed when unmount is called.\n *\n * When `data-forma-ssr` is present on the container, the component runs\n * inside `createRoot` in hydration mode — h() returns descriptors that are\n * walked against SSR DOM to attach handlers and reactive bindings.\n *\n * @param component A function returning an HTMLElement or DocumentFragment.\n * @param container An HTMLElement or a CSS selector string.\n * @returns An unmount function that removes the DOM and disposes all effects.\n *\n * ```ts\n * const unmount = mount(() => h('h1', null, 'Hello'), '#app');\n * // later…\n * unmount();\n * ```\n */\nexport function mount(\n component: () => HTMLElement | DocumentFragment,\n container: HTMLElement | string,\n): () => void {\n const target =\n typeof container === 'string'\n ? document.querySelector<HTMLElement>(container)\n : container;\n\n if (!target) {\n throw new Error(`mount: container not found — \"${container}\"`);\n }\n\n let disposeRoot!: () => void;\n\n if (target.hasAttribute('data-forma-ssr')) {\n // SSR content present — hydrate in-place using descriptor-based adoption.\n // The component MUST run inside createRoot so effects are tracked.\n createUnownedRoot((dispose) => {\n disposeRoot = dispose;\n hydrateIsland(component, target);\n });\n } else {\n // Normal mount — clear and append\n const dom = createUnownedRoot((dispose) => {\n disposeRoot = dispose;\n return component();\n });\n target.innerHTML = '';\n target.appendChild(dom);\n }\n\n // Return unmount function\n let unmounted = false;\n return () => {\n if (unmounted) return;\n unmounted = true;\n disposeRoot();\n target.innerHTML = '';\n };\n}\n","/**\n * Forma DOM - Switch (Multi-branch Conditional)\n *\n * Maps a reactive value to one of N render branches.\n * Caches previously rendered nodes for instant swap-back.\n *\n * Each cached branch gets its own reactive root (ownership scope) so that:\n * 1. Inner effects survive when the switch effect re-runs (alien-signals\n * would otherwise dispose child effects linked to the parent).\n * 2. Inner effects are explicitly disposed when the branch is evicted\n * from the cache or the switch itself is torn down.\n *\n * SolidJS equivalent: <Switch><Match when={}>\n */\n\nimport { internalEffect, untrack, createRoot, registerDisposer } from 'forma/reactive';\n\n/** A single branch for {@link createSwitch}. */\nexport interface SwitchCase<T> {\n /** The value that activates this branch. */\n match: T;\n /** Factory function that renders this branch's DOM. */\n render: () => Node;\n}\n\n/** Cached branch: the rendered DOM node + a dispose function for its root. */\ninterface CachedBranch {\n node: Node;\n dispose: () => void;\n}\n\n/**\n * Multi-branch conditional rendering with node caching.\n *\n * ```ts\n * const [tab, setTab] = createSignal('home');\n * const fragment = createSwitch(tab, [\n * { match: 'home', render: () => h('div', null, 'Home page') },\n * { match: 'about', render: () => h('div', null, 'About page') },\n * { match: 'contact', render: () => h('div', null, 'Contact page') },\n * ], () => h('div', null, '404'));\n * ```\n *\n * Previously rendered branches are cached — switching back to a tab\n * re-inserts the cached node without re-rendering.\n */\nexport function createSwitch<T>(\n value: () => T,\n cases: SwitchCase<T>[],\n fallback?: () => Node,\n): DocumentFragment {\n const startMarker = document.createComment('forma-switch');\n const endMarker = document.createComment('/forma-switch');\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n // Branch cache: value → { node, dispose }\n // Each branch has its own reactive root for explicit lifecycle management.\n const cache = new Map<T, CachedBranch>();\n let currentNode: Node | null = null;\n let currentMatch: T | typeof UNSET = UNSET;\n\n const switchDispose = internalEffect(() => {\n const val = value();\n if (val === currentMatch) return; // Same branch, skip\n\n const DEBUG = typeof (globalThis as any).__FORMA_DEBUG__ !== 'undefined';\n if (DEBUG) console.log('[forma:switch] transition', String(currentMatch), '→', String(val));\n\n currentMatch = val;\n\n const parent = startMarker.parentNode;\n if (!parent) {\n if (DEBUG) console.warn('[forma:switch] markers not in DOM yet, skipping');\n return;\n }\n\n // Remove current content between markers.\n // If currentNode was a DocumentFragment, its children transferred to the\n // DOM on insertion and the fragment is now detached (parentNode === null).\n // We must scoop the children BACK into the fragment so the cache stays\n // valid for re-insertion later.\n if (currentNode) {\n if (currentNode.parentNode === parent) {\n if (DEBUG) console.log('[forma:switch] removing single node');\n parent.removeChild(currentNode);\n } else if (currentNode.nodeType === 11 /* DOCUMENT_FRAGMENT_NODE */) {\n // Scoop DOM nodes back into the fragment for cache reuse\n if (DEBUG) console.log('[forma:switch] scooping nodes back into fragment');\n let scooped = 0;\n while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {\n currentNode.appendChild(startMarker.nextSibling);\n scooped++;\n }\n if (DEBUG) console.log('[forma:switch] scooped', scooped, 'nodes back into fragment');\n } else {\n // Other detached node — just clear between markers\n if (DEBUG) console.log('[forma:switch] clearing detached node between markers');\n while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {\n parent.removeChild(startMarker.nextSibling);\n }\n }\n }\n\n // Find matching case\n const matchedCase = cases.find(c => c.match === val);\n if (matchedCase) {\n let entry = cache.get(val);\n if (!entry) {\n // Render inside a createRoot so child effects are tracked for\n // disposal, and inside untrack so they are NOT linked to the\n // switch effect (alien-signals disposes child effects on parent\n // re-run, which would kill reactivity in cached branches).\n let branchDispose!: () => void;\n const node = createRoot((dispose) => {\n branchDispose = dispose;\n return untrack(() => matchedCase.render());\n });\n entry = { node, dispose: branchDispose };\n cache.set(val, entry);\n if (DEBUG) console.log('[forma:switch] rendered new branch for', String(val), '→', node.nodeName, 'type', node.nodeType);\n } else {\n if (DEBUG) console.log('[forma:switch] reusing cached branch for', String(val), '→', entry.node.nodeName, 'type', entry.node.nodeType, 'childNodes', entry.node.childNodes?.length);\n }\n currentNode = entry.node;\n } else {\n // Fallback — not cached, effects are owned by the switch effect\n // and correctly torn down on next re-run.\n currentNode = fallback?.() ?? null;\n if (DEBUG) console.log('[forma:switch] no match, using fallback');\n }\n\n if (currentNode) {\n parent.insertBefore(currentNode, endMarker);\n if (DEBUG) console.log('[forma:switch] inserted', currentNode.nodeName, 'before end marker');\n }\n });\n\n // Defense-in-depth: when the parent root is disposed, explicitly dispose\n // all cached branches and clear references. The branch roots are already\n // auto-registered with the parent (Solid-style ownership), but the cache\n // Map still holds stale references that prevent GC.\n registerDisposer(() => {\n for (const entry of cache.values()) {\n entry.dispose();\n }\n cache.clear();\n currentNode = null;\n });\n\n // Attach a cleanup marker so external disposal (via disposeComponent or\n // parent root teardown) can clean up all cached branches.\n (fragment as any).__switchDispose = () => {\n switchDispose();\n for (const entry of cache.values()) {\n entry.dispose();\n }\n cache.clear();\n };\n\n return fragment;\n}\n\n// Sentinel value for \"no match yet\"\nconst UNSET = Symbol('unset');\n","/**\n * Forma DOM - Portal\n *\n * Renders children into a different DOM container than the parent.\n * Useful for modals, tooltips, dropdowns that need to escape overflow.\n *\n * SolidJS equivalent: <Portal mount={}>\n */\n\nimport { createEffect } from 'forma/reactive';\n\n/**\n * Render content into an external DOM container.\n *\n * ```ts\n * const modal = createPortal(\n * () => h('div', { class: 'modal' }, 'Modal content'),\n * document.body,\n * );\n * ```\n *\n * Returns a comment node placeholder. The actual content is rendered\n * into the target container. Cleanup removes content from target.\n */\nexport function createPortal(\n children: () => Node,\n target?: Element | string,\n): Comment {\n const placeholder = document.createComment('forma-portal');\n\n const resolvedTarget = typeof target === 'string'\n ? document.querySelector(target)\n : (target ?? document.body);\n\n if (!resolvedTarget) {\n throw new Error(`createPortal: target not found: ${target}`);\n }\n\n let mountedNode: Node | null = null;\n const removeMountedNode = () => {\n if (mountedNode && mountedNode.parentNode === resolvedTarget) {\n resolvedTarget.removeChild(mountedNode);\n }\n mountedNode = null;\n };\n\n createEffect(() => {\n const node = children();\n\n // Remove previous\n removeMountedNode();\n\n mountedNode = node;\n resolvedTarget.appendChild(node);\n\n // Ensure portal content is removed when the owner root disposes.\n return () => {\n removeMountedNode();\n };\n });\n\n return placeholder;\n}\n","/**\n * Forma DOM - Error Boundary\n *\n * Catches errors during rendering and shows a fallback UI.\n * Provides a retry function to re-attempt the original render.\n *\n * SolidJS equivalent: <ErrorBoundary fallback={}>\n */\n\nimport { createSignal, internalEffect } from 'forma/reactive';\n\n/**\n * Wrap a render function with error recovery.\n *\n * ```ts\n * const fragment = createErrorBoundary(\n * () => h('div', null, riskyComponent()),\n * (error, retry) => h('div', { class: 'error' },\n * h('p', null, `Error: ${error.message}`),\n * h('button', { onClick: retry }, 'Retry'),\n * ),\n * );\n * ```\n *\n * If `tryFn` throws, `catchFn` is called with the error and a retry function.\n * Calling `retry()` re-runs `tryFn`.\n */\nexport function createErrorBoundary(\n tryFn: () => Node,\n catchFn: (error: Error, retry: () => void) => Node,\n): DocumentFragment {\n const startMarker = document.createComment('forma-error-boundary');\n const endMarker = document.createComment('/forma-error-boundary');\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n const [retryCount, setRetryCount] = createSignal(0);\n let currentNode: Node | null = null;\n\n internalEffect(() => {\n // Subscribe to retryCount so retry() triggers re-run\n retryCount();\n\n const parent = startMarker.parentNode;\n if (!parent) return;\n\n // Remove current\n if (currentNode && currentNode.parentNode === parent) {\n parent.removeChild(currentNode);\n }\n\n try {\n currentNode = tryFn();\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n const retry = () => setRetryCount(c => c + 1);\n currentNode = catchFn(error, retry);\n }\n\n if (currentNode) {\n parent.insertBefore(currentNode, endMarker);\n }\n });\n\n return fragment;\n}\n","/**\n * Forma DOM - Suspense\n *\n * A Suspense boundary that shows fallback content while async resources\n * inside the children function are loading. Uses comment markers\n * (like createShow, createList) for zero-wrapper rendering.\n *\n * When all resources resolve, the fallback is swapped for the real content.\n * If a resource errors, the fallback remains (pair with createErrorBoundary\n * for error handling).\n *\n * SolidJS equivalent: <Suspense fallback={}>\n */\n\nimport { createSignal, internalEffect } from 'forma/reactive';\nimport {\n type SuspenseContext,\n pushSuspenseContext,\n popSuspenseContext,\n} from 'forma/reactive/suspense-context';\n\n// Re-export context utilities so consumers can import from dom/suspense\nexport { getSuspenseContext, pushSuspenseContext, popSuspenseContext } from 'forma/reactive/suspense-context';\nexport type { SuspenseContext } from 'forma/reactive/suspense-context';\n\n// ---------------------------------------------------------------------------\n// createSuspense\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Suspense boundary that shows fallback content while async resources\n * inside the children function are loading.\n *\n * Uses comment markers: `<!--forma-suspense-->` / `<!--/forma-suspense-->`\n *\n * When all resources resolve, the fallback is swapped for the real content.\n * If a resource errors, the fallback remains (pair with createErrorBoundary\n * for errors).\n *\n * ```ts\n * const frag = createSuspense(\n * () => h('div', null, 'Loading...'),\n * () => {\n * const data = createResource(source, fetcher);\n * return h('div', null, () => data()?.name ?? '');\n * },\n * );\n * container.appendChild(frag);\n * ```\n */\nexport function createSuspense(\n fallback: () => Node,\n children: () => Node,\n): DocumentFragment {\n const startMarker = document.createComment('forma-suspense');\n const endMarker = document.createComment('/forma-suspense');\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n const [pending, setPending] = createSignal(0);\n let currentNode: Node | null = null;\n let resolvedNode: Node | null = null;\n let fallbackNode: Node | null = null;\n\n const ctx: SuspenseContext = {\n increment() { setPending(p => p + 1); },\n decrement() { setPending(p => Math.max(0, p - 1)); },\n };\n\n // Render children within the Suspense context so that any createResource\n // calls inside will register with this boundary.\n pushSuspenseContext(ctx);\n try {\n resolvedNode = children();\n } finally {\n popSuspenseContext();\n }\n\n // Reactively swap between fallback and children based on pending count\n internalEffect(() => {\n const parent = startMarker.parentNode;\n if (!parent) return;\n\n const isPending = pending() > 0;\n const newNode = isPending ? (fallbackNode ??= fallback()) : resolvedNode;\n\n if (newNode === currentNode) return;\n\n // Remove current node\n if (currentNode && currentNode.parentNode === parent) {\n parent.removeChild(currentNode);\n }\n\n // Insert new node\n if (newNode) {\n parent.insertBefore(newNode, endMarker);\n }\n\n currentNode = newNode;\n });\n\n return fragment;\n}\n","/**\n * Forma DOM - Template\n *\n * Runtime helper for compiled template output. Memoizes template parsing\n * so that each unique HTML string is parsed once and then cloned per use.\n *\n * The returned node should be cloned via `.cloneNode(true)` before use\n * in component instances.\n */\n\nconst cache = new Map<string, Node>();\n\n/**\n * Create a reusable template node from an HTML string.\n *\n * The returned node is a cached prototype. Callers must call\n * `.cloneNode(true)` to get a unique DOM tree for each component instance.\n */\nexport function template(html: string): Node {\n let node = cache.get(html);\n if (!node) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n node = tpl.content.firstChild!;\n cache.set(html, node);\n }\n return node;\n}\n\n/**\n * Create a reusable template DocumentFragment from an HTML string.\n *\n * Used when the template has multiple root nodes. The returned fragment\n * is a cached prototype; callers must call `.cloneNode(true)`.\n */\nexport function templateMany(html: string): DocumentFragment {\n let node = cache.get(html);\n if (!node) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n node = tpl.content;\n cache.set(html, node);\n }\n return node.cloneNode(true) as DocumentFragment;\n}\n","/**\n * Forma DOM - Island Activation\n *\n * Discovers SSR-rendered islands via [data-forma-island] attributes,\n * loads props (inline or script_tag), and hydrates each island inside\n * an independent createRoot scope with try/catch error isolation.\n */\n\nimport { createUnownedRoot, __DEV__ } from 'forma/reactive';\nimport { hydrateIsland } from './hydrate.js';\n\n/**\n * Function that hydrates an island.\n *\n * @param el The root element of the island (`[data-forma-island]`).\n * Useful for layout measurement, focus management, CSS class\n * toggling, third-party library init, or reading extra `data-*`\n * attributes from the server-rendered shell.\n * @param props Parsed props from `data-forma-props` (inline or script block),\n * or `null` if no props were provided.\n * @returns A component tree (from `h()` calls) for descriptor-based\n * hydration, or `undefined` for imperative islands that set up\n * their own effects.\n */\nexport type IslandHydrateFn = (el: HTMLElement, props: Record<string, unknown> | null) => unknown;\n\nconst FORBIDDEN_PROP_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction sanitizeProps(obj: Record<string, unknown>): Record<string, unknown> {\n for (const key of FORBIDDEN_PROP_KEYS) {\n if (key in obj) delete (obj as any)[key];\n }\n return obj;\n}\n\n/**\n * Load props for an island from either inline attribute or shared script block.\n */\nfunction loadIslandProps(\n root: HTMLElement,\n id: number,\n sharedProps: Record<string, unknown> | null,\n): Record<string, unknown> | null {\n // Mode 1: Inline (small props, < 1KB)\n const inline = root.getAttribute('data-forma-props');\n if (inline) {\n return sanitizeProps(JSON.parse(inline));\n }\n\n // Mode 2: Script tag (1KB–50KB, pre-parsed)\n if (sharedProps && String(id) in sharedProps) {\n return sanitizeProps((sharedProps as any)[String(id)] as Record<string, unknown>);\n }\n\n // No props — island creates its own state\n return null;\n}\n\n/**\n * Discover and activate all SSR-rendered islands on the page.\n *\n * Each island is activated inside its own createRoot scope with try/catch\n * isolation — a broken island never takes down its siblings.\n *\n * @param registry Map of component names to hydration functions.\n */\nexport function activateIslands(registry: Record<string, IslandHydrateFn>): void {\n // Parse shared props once before the loop\n const scriptBlock = document.getElementById('__forma_islands');\n const sharedProps: Record<string, unknown> | null =\n scriptBlock ? JSON.parse(scriptBlock.textContent!) : null;\n\n const islands = document.querySelectorAll<HTMLElement>('[data-forma-island]');\n\n for (const root of islands) {\n const id = parseInt(root.getAttribute('data-forma-island')!, 10);\n const componentName = root.getAttribute('data-forma-component')!;\n const hydrateFn = registry[componentName];\n\n if (!hydrateFn) {\n if (__DEV__) console.warn(`[forma] No hydrate function for island \"${componentName}\" (id=${id})`);\n root.setAttribute('data-forma-status', 'error');\n continue;\n }\n\n const trigger = root.getAttribute('data-forma-hydrate') || 'load';\n\n if (trigger === 'visible') {\n // Defer hydration until island enters the viewport\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n observer.disconnect();\n hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n }\n },\n { rootMargin: '200px' },\n );\n observer.observe(root);\n } else if (trigger === 'idle') {\n const hydrate = () => hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n if (typeof requestIdleCallback === 'function') {\n requestIdleCallback(hydrate);\n } else {\n setTimeout(hydrate, 200);\n }\n } else if (trigger === 'interaction') {\n const hydrate = () => {\n root.removeEventListener('pointerdown', hydrate, true);\n root.removeEventListener('focusin', hydrate, true);\n hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n };\n root.addEventListener('pointerdown', hydrate, { capture: true, once: true });\n root.addEventListener('focusin', hydrate, { capture: true, once: true });\n } else {\n // load (default) — hydrate immediately\n hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n }\n }\n}\n\n/**\n * Dispose a single island, tearing down its reactive root and all effects.\n *\n * Safe to call multiple times (idempotent). Sets `data-forma-status` to\n * `\"disposed\"` so the island can be distinguished from active/error states.\n */\nexport function deactivateIsland(el: HTMLElement): void {\n const dispose = (el as any).__formaDispose;\n if (typeof dispose === 'function') {\n dispose();\n delete (el as any).__formaDispose;\n el.setAttribute('data-forma-status', 'disposed');\n }\n}\n\n/**\n * Dispose ALL active islands under a root element (or the whole document).\n *\n * Use this when swapping module content — e.g., replacing the contents of\n * a `<forma-stage>` Shadow DOM during AI generation. Prevents leaked effects\n * and event listeners from accumulating across swaps.\n */\nexport function deactivateAllIslands(root: Element | Document = document): void {\n const islands = root.querySelectorAll<HTMLElement>('[data-forma-status=\"active\"]');\n for (const island of islands) {\n deactivateIsland(island);\n }\n}\n\n/** Hydrate a single island root with error isolation. */\nfunction hydrateIslandRoot(\n root: HTMLElement,\n id: number,\n componentName: string,\n hydrateFn: IslandHydrateFn,\n sharedProps: Record<string, unknown> | null,\n): void {\n try {\n const props = loadIslandProps(root, id, sharedProps);\n root.setAttribute('data-forma-status', 'hydrating');\n\n // hydrateIsland may replace the shell element with the component's own\n // root element (CSR fallback for empty islands). Track the active root.\n let activeRoot: Element = root;\n createUnownedRoot((dispose) => {\n activeRoot = hydrateIsland(() => hydrateFn(root, props), root);\n (activeRoot as any).__formaDispose = dispose;\n });\n\n activeRoot.setAttribute('data-forma-status', 'active');\n } catch (err) {\n if (__DEV__) console.error(`[forma] Island \"${componentName}\" (id=${id}) failed:`, err);\n root.setAttribute('data-forma-status', 'error');\n }\n}\n","/**\n * Forma Component - Define\n *\n * Component definition system where the setup function runs ONCE.\n * Reactivity comes from signals, not re-rendering.\n * Backed by alien-signals via forma/reactive.\n */\n\nimport { reportError } from '../reactive/dev.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A teardown function that disposes effects and cleans up resources. */\nexport type CleanupFn = () => void;\n/** A function that runs once to build the component's DOM tree. */\nexport type SetupFn = () => HTMLElement | DocumentFragment;\n\n/** Definition object passed to {@link defineComponent}. */\nexport interface ComponentDef {\n /** The setup function that builds the component's DOM and reactive bindings. */\n setup: SetupFn;\n /** Optional debug name for devtools inspection. */\n name?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle context stack\n// ---------------------------------------------------------------------------\n\ninterface LifecycleContext {\n /** Dispose functions for all effects created during setup. */\n disposers: (() => void)[];\n /** Callbacks registered via onMount(). */\n mountCallbacks: (() => void | CleanupFn)[];\n /** Callbacks registered via onUnmount(). */\n unmountCallbacks: (() => void)[];\n}\n\nlet currentLifecycleContext: LifecycleContext | null = null;\nconst lifecycleStack: (LifecycleContext | null)[] = [];\n\nfunction pushLifecycleContext(ctx: LifecycleContext): void {\n lifecycleStack.push(currentLifecycleContext);\n currentLifecycleContext = ctx;\n}\n\nfunction popLifecycleContext(): void {\n currentLifecycleContext = lifecycleStack.pop() ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Public API - Lifecycle hooks\n// ---------------------------------------------------------------------------\n\n/**\n * Register a callback that runs after the component's setup completes.\n * If the callback returns a function, that function is called on unmount.\n * Must be called inside a setup function.\n */\nexport function onMount(fn: () => void | CleanupFn): void {\n if (currentLifecycleContext === null) {\n throw new Error('onMount() must be called inside a component setup function');\n }\n currentLifecycleContext.mountCallbacks.push(fn);\n}\n\n/**\n * Register a callback that runs when the component is disposed.\n * Must be called inside a setup function.\n */\nexport function onUnmount(fn: () => void): void {\n if (currentLifecycleContext === null) {\n throw new Error('onUnmount() must be called inside a component setup function');\n }\n currentLifecycleContext.unmountCallbacks.push(fn);\n}\n\n// ---------------------------------------------------------------------------\n// Internal: symbol for attaching dispose to DOM nodes\n// ---------------------------------------------------------------------------\n\nconst DISPOSE_KEY = Symbol('forma:component:dispose');\n\ninterface DisposableNode {\n [DISPOSE_KEY]?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Public API - defineComponent\n// ---------------------------------------------------------------------------\n\n/**\n * Define a component from a setup function or definition object.\n * Returns a factory function that, when called, produces a DOM element\n * with attached lifecycle and disposal logic.\n *\n * The setup function runs ONCE per factory call. Reactivity is driven\n * by signals, not by re-running setup.\n */\nexport function defineComponent(\n setupOrDef: SetupFn | ComponentDef,\n): () => HTMLElement | DocumentFragment {\n const setup: SetupFn =\n typeof setupOrDef === 'function' ? setupOrDef : setupOrDef.setup;\n const name: string | undefined =\n typeof setupOrDef === 'function' ? undefined : setupOrDef.name;\n\n return function componentFactory(): HTMLElement | DocumentFragment {\n // Create a fresh lifecycle context for this component instance\n const ctx: LifecycleContext = {\n disposers: [],\n mountCallbacks: [],\n unmountCallbacks: [],\n };\n\n // Push lifecycle context so onMount/onUnmount calls register here\n pushLifecycleContext(ctx);\n\n let dom: HTMLElement | DocumentFragment;\n try {\n dom = setup();\n } finally {\n popLifecycleContext();\n }\n\n // Build the dispose function that tears down the entire component\n const dispose = (): void => {\n // Run onUnmount callbacks\n for (const cb of ctx.unmountCallbacks) {\n try {\n cb();\n } catch (e) {\n reportError(e, 'onUnmount');\n }\n }\n\n // Dispose all effects\n for (const d of ctx.disposers) {\n try {\n d();\n } catch (e) {\n reportError(e, 'component disposer');\n }\n }\n\n // Clean up\n ctx.disposers.length = 0;\n ctx.mountCallbacks.length = 0;\n ctx.unmountCallbacks.length = 0;\n };\n\n // Attach dispose to the DOM node so callers can tear it down\n (dom as unknown as DisposableNode)[DISPOSE_KEY] = dispose;\n\n // Run mount callbacks (synchronously, after setup completes)\n // If a mount callback returns a cleanup, register it as an unmount callback\n for (const cb of ctx.mountCallbacks) {\n try {\n const cleanup = cb();\n if (typeof cleanup === 'function') {\n ctx.unmountCallbacks.push(cleanup);\n }\n } catch (e) {\n reportError(e, 'onMount');\n }\n }\n\n return dom;\n };\n}\n\n/**\n * Dispose a component that was created via defineComponent.\n * This runs all onUnmount callbacks and disposes all tracked effects.\n */\nexport function disposeComponent(dom: HTMLElement | DocumentFragment): void {\n const disposable = dom as unknown as DisposableNode;\n if (typeof disposable[DISPOSE_KEY] === 'function') {\n disposable[DISPOSE_KEY]();\n delete disposable[DISPOSE_KEY];\n }\n}\n\n/**\n * Track an effect disposal within the current component's lifecycle.\n * Call this inside a setup function to ensure effects are cleaned up\n * when the component is disposed.\n */\nexport function trackDisposer(dispose: () => void): void {\n if (currentLifecycleContext !== null) {\n currentLifecycleContext.disposers.push(dispose);\n }\n}\n","/**\n * Forma Component - Context\n *\n * Dependency injection via stack-based context.\n * Simpler than React's Provider component tree: provide() pushes a value,\n * inject() reads the top, component teardown pops automatically.\n * Zero dependencies -- native browser APIs only.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A typed dependency injection context created by {@link createContext}. */\nexport interface Context<T> {\n /** Unique identifier for this context. */\n readonly id: symbol;\n /** Value returned when no provider is active. */\n readonly defaultValue: T;\n}\n\n// ---------------------------------------------------------------------------\n// Internal storage\n// ---------------------------------------------------------------------------\n\n/**\n * Per-context value stacks.\n * Each context id maps to a stack of provided values.\n * The top of the stack is the \"current\" value.\n */\nconst contextStacks = new Map<symbol, unknown[]>();\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new context with a default value.\n *\n * ```ts\n * const ThemeCtx = createContext('light');\n * ```\n */\nexport function createContext<T>(defaultValue: T): Context<T> {\n return {\n id: Symbol('forma:context'),\n defaultValue,\n };\n}\n\n/**\n * Provide a value for a context.\n * The value is pushed onto the context's stack and will be returned by\n * inject() until it is removed via unprovide() or overridden by a nested provide().\n *\n * ```ts\n * provide(ThemeCtx, 'dark');\n * ```\n */\nexport function provide<T>(ctx: Context<T>, value: T): void {\n let stack = contextStacks.get(ctx.id);\n if (stack === undefined) {\n stack = [];\n contextStacks.set(ctx.id, stack);\n }\n stack.push(value);\n}\n\n/**\n * Read the current value of a context.\n * Returns the most recently provided value, or the default if none was provided.\n *\n * ```ts\n * const theme = inject(ThemeCtx); // 'dark' if provided, else 'light'\n * ```\n */\nexport function inject<T>(ctx: Context<T>): T {\n const stack = contextStacks.get(ctx.id);\n if (stack === undefined || stack.length === 0) {\n return ctx.defaultValue;\n }\n return stack[stack.length - 1] as T;\n}\n\n/**\n * Remove the most recent provided value for a context.\n * Used during component teardown to restore the previous scope.\n *\n * ```ts\n * unprovide(ThemeCtx);\n * ```\n */\nexport function unprovide<T>(ctx: Context<T>): void {\n const stack = contextStacks.get(ctx.id);\n if (stack !== undefined && stack.length > 0) {\n stack.pop();\n // Clean up empty stacks to avoid memory leaks\n if (stack.length === 0) {\n contextStacks.delete(ctx.id);\n }\n }\n}\n","/**\n * Forma State - Store\n *\n * Deep reactive store with path-based signal granularity.\n * Every property path (e.g. `user.name`, `items.0.done`) gets its own signal,\n * so only effects that read a specific path are notified when it changes.\n *\n * Inspired by SolidJS's createStore and Vue's reactive(), with:\n * - Lazy proxy wrapping (child objects proxied on first access)\n * - Structural sharing (replacing an object invalidates child signals)\n * - Array mutation batching (push/pop/splice/sort etc. batch their signals)\n *\n * Backed by alien-signals via forma/reactive.\n */\n\nimport { createSignal, batch, untrack } from 'forma/reactive';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype SignalPair = [get: () => unknown, set: (v: unknown) => void];\n\n/** Setter for a reactive store — accepts a partial update object or updater function. */\nexport type StoreSetter<T extends object> = (\n partial: Partial<T> | ((prev: T) => Partial<T>),\n) => void;\n\n// ---------------------------------------------------------------------------\n// Symbols\n// ---------------------------------------------------------------------------\n\n/** Access the underlying raw (unproxied) object from a store proxy. */\nconst RAW = Symbol('forma-raw');\n\n/** Marker: true on every store proxy so we can detect them. */\nconst PROXY = Symbol('forma-proxy');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst ARRAY_MUTATORS = new Set([\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse',\n 'fill',\n 'copyWithin',\n]);\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (v == null || typeof v !== 'object') return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null || Array.isArray(v);\n}\n\nfunction shouldWrap(v: unknown): v is object {\n if (v == null || typeof v !== 'object') return false;\n // Don't wrap special built-ins (Date, RegExp, Map, Set, etc.)\n if (v instanceof Date || v instanceof RegExp || v instanceof Map ||\n v instanceof Set || v instanceof WeakMap || v instanceof WeakSet ||\n v instanceof Error || v instanceof Promise) {\n return false;\n }\n // Already a store proxy — no double wrapping\n if ((v as any)[PROXY]) return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Deep-clone helper (used for functional setter snapshots)\n// ---------------------------------------------------------------------------\n\nfunction deepClone(obj: unknown, seen?: WeakSet<object>): unknown {\n if (obj === null || typeof obj !== 'object') return obj;\n if (!seen) seen = new WeakSet();\n if (seen.has(obj as object)) return obj; // circular — return ref as-is\n seen.add(obj as object);\n if (Array.isArray(obj)) return obj.map(item => deepClone(item, seen));\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n out[key] = deepClone((obj as any)[key], seen);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a deep reactive store.\n *\n * Returns a tuple of `[getter proxy, setter function]`.\n * The getter proxy tracks reads at every property path via dedicated signals.\n * Setting a property (either via `setState()` or direct mutation like\n * `state.user.name = 'Bob'`) only notifies effects that actually read that\n * specific path.\n *\n * ```ts\n * const [state, setState] = createStore({\n * count: 0,\n * user: { name: 'Alice', age: 30 },\n * items: [{ text: 'Buy milk', done: false }],\n * });\n *\n * // Fine-grained reads\n * state.user.name; // tracked at path \"user.name\"\n * state.items[0].done; // tracked at path \"items.0.done\"\n *\n * // Setter API (batched)\n * setState({ count: 1 });\n * setState(prev => ({ count: prev.count + 1 }));\n *\n * // Direct mutation (via Proxy set trap)\n * state.user.name = 'Bob'; // only \"user.name\" subscribers notified\n * state.items[0].done = true;\n *\n * // Array mutations\n * state.items.push({ text: 'Walk dog', done: false });\n * ```\n *\n * **Limitation:** `Object.keys(state)`, `for...in`, and spread (`{...state}`)\n * are NOT reactive. Adding or removing a property will not trigger effects\n * that iterated over keys. Use signals or explicit arrays for collections\n * that need to react to membership changes.\n */\nexport function createStore<T extends object>(\n initial: T,\n): [get: T, set: StoreSetter<T>] {\n // -------------------------------------------------------------------------\n // Signal-per-path map\n // -------------------------------------------------------------------------\n\n /** Map of dot-separated paths -> signal pairs. */\n const signals = new Map<string, SignalPair>();\n\n /** Parent path -> set of direct child paths for O(1) child invalidation. */\n const children = new Map<string, Set<string>>();\n\n /**\n * Register a signal path with its parent in the adjacency map.\n * This allows walking the tree instead of scanning all signals.\n */\n function registerChild(path: string): void {\n const lastDot = path.lastIndexOf('.');\n if (lastDot === -1) return; // root-level, no parent\n const parentPath = path.substring(0, lastDot);\n let set = children.get(parentPath);\n if (!set) { set = new Set(); children.set(parentPath, set); }\n set.add(path);\n }\n\n /**\n * Get or create the signal for a given path.\n * When creating, seeds with `initialValue`.\n */\n function getSignal(path: string, initialValue?: unknown): SignalPair {\n let pair = signals.get(path);\n if (!pair) {\n pair = createSignal<unknown>(initialValue) as SignalPair;\n signals.set(path, pair);\n registerChild(path);\n }\n return pair;\n }\n\n // -------------------------------------------------------------------------\n // Proxy cache (raw object -> proxy)\n // -------------------------------------------------------------------------\n\n /**\n * WeakMap so proxies for child objects are reused as long as the raw object\n * is alive. When an object is replaced, the old entry is GC'd naturally.\n */\n const proxyCache = new WeakMap<object, object>();\n\n // -------------------------------------------------------------------------\n // Invalidation\n // -------------------------------------------------------------------------\n\n /**\n * Recursively delete all child signals using the adjacency map.\n * Called when an entire sub-tree is replaced so stale signals are not reused.\n * O(k) where k = number of descendant signals, instead of O(n) over all signals.\n */\n function invalidateChildren(parentPath: string): void {\n const childSet = children.get(parentPath);\n if (!childSet) return;\n for (const childPath of childSet) {\n // Recursively invalidate grandchildren first\n invalidateChildren(childPath);\n // Remove the signal itself\n signals.delete(childPath);\n // Clean up this child's entry in the adjacency map\n children.delete(childPath);\n }\n // Clear the parent's children set (all children have been removed)\n childSet.clear();\n }\n\n // -------------------------------------------------------------------------\n // Proxy factory (lazy, recursive)\n // -------------------------------------------------------------------------\n\n function wrap(raw: object, basePath: string): object {\n // Primitives / non-wrappable values pass through\n if (!shouldWrap(raw)) return raw;\n\n // Return cached proxy if we already have one for this raw object\n const cached = proxyCache.get(raw);\n if (cached) return cached;\n\n const isArr = Array.isArray(raw);\n // Pre-compute the path prefix to avoid repeated string concatenation in hot paths\n const basePrefix = basePath ? basePath + '.' : '';\n\n // Inline cache: skip Map lookup when the same key is accessed repeatedly\n // (very common in render loops and effects that read the same property)\n let lastKey: string = '';\n let lastSignal: SignalPair | undefined;\n\n const proxy: object = new Proxy(raw, {\n // -------------------------------------------------------------------\n // GET\n // -------------------------------------------------------------------\n get(target: any, prop: PropertyKey, receiver: unknown): unknown {\n // Escape hatches\n if (prop === RAW) return target;\n if (prop === PROXY) return true;\n\n // Symbols pass through (Symbol.iterator, Symbol.toPrimitive, etc.)\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n\n const key = String(prop);\n // Cache-friendly path construction: avoid template literals in hot path\n const childPath = basePrefix + key;\n\n // ------------------------------------------------------------------\n // Array mutator methods — wrap to batch signal updates\n // ------------------------------------------------------------------\n if (isArr && ARRAY_MUTATORS.has(key)) {\n return (...args: unknown[]) => {\n let result: unknown;\n batch(() => {\n // Unwrap proxy arguments (e.g. pushing a store proxy)\n const rawArgs = args.map((a) =>\n a != null && typeof a === 'object' && (a as any)[RAW]\n ? (a as any)[RAW]\n : a,\n );\n result = (target as any)[key].apply(target, rawArgs);\n\n // Invalidate all child paths so they recreate from the\n // mutated raw array on next access.\n invalidateChildren(basePath);\n\n // Notify the length signal\n const [, setLen] = getSignal(\n basePrefix + 'length',\n (target as unknown[]).length,\n );\n setLen((target as unknown[]).length);\n });\n return result;\n };\n }\n\n // ------------------------------------------------------------------\n // Array `length` — special-case so it's always tracked\n // ------------------------------------------------------------------\n if (isArr && key === 'length') {\n const [getter] = getSignal(childPath, target.length);\n getter(); // subscribe\n return target.length;\n }\n\n // ------------------------------------------------------------------\n // Regular property access\n // ------------------------------------------------------------------\n const value = Reflect.get(target, prop);\n\n // Inline cache: if same key as last access, skip Map lookup\n let pair: SignalPair;\n if (key === lastKey && lastSignal) {\n pair = lastSignal;\n } else {\n pair = getSignal(childPath, value);\n lastKey = key;\n lastSignal = pair;\n }\n\n pair[0](); // subscribe to this path\n\n // Lazily wrap child objects/arrays\n if (shouldWrap(value)) {\n return wrap(value, childPath);\n }\n\n return value;\n },\n\n // -------------------------------------------------------------------\n // SET\n // -------------------------------------------------------------------\n set(target: any, prop: PropertyKey, value: unknown): boolean {\n if (typeof prop === 'symbol') {\n return Reflect.set(target, prop, value);\n }\n\n const key = String(prop);\n const childPath = basePrefix + key;\n\n // Unwrap if the value being set is itself a proxy\n const rawValue =\n value != null && typeof value === 'object' && (value as any)[RAW]\n ? (value as any)[RAW]\n : value;\n\n // Write to the underlying object\n Reflect.set(target, prop, rawValue);\n\n // If we're replacing with an object, invalidate all child signals\n // and evict the old proxy so sub-paths are recreated on next access.\n if (rawValue != null && typeof rawValue === 'object') {\n invalidateChildren(childPath);\n // Remove cached proxy for the old value so a fresh one is created\n // on the next access.\n }\n\n // Update the length signal when setting indexed array elements\n if (isArr && key !== 'length') {\n const lengthPath = basePrefix + 'length';\n const lenPair = signals.get(lengthPath);\n if (lenPair) {\n lenPair[1](target.length);\n }\n }\n\n // Notify (or create) the signal for this path\n const [, setter] = getSignal(childPath, rawValue);\n setter(rawValue);\n\n return true;\n },\n\n // -------------------------------------------------------------------\n // HAS — track membership checks\n // -------------------------------------------------------------------\n has(target: any, prop: PropertyKey): boolean {\n if (typeof prop === 'symbol') {\n return Reflect.has(target, prop);\n }\n const key = String(prop);\n const childPath = basePrefix + key;\n // Subscribe so that `'x' in state` is tracked\n const [getter] = getSignal(childPath, Reflect.get(target, prop));\n getter();\n return Reflect.has(target, prop);\n },\n\n // -------------------------------------------------------------------\n // OWNKEYS — return keys from the raw target\n // -------------------------------------------------------------------\n ownKeys(target: any): (string | symbol)[] {\n return Reflect.ownKeys(target);\n },\n\n // -------------------------------------------------------------------\n // GETOWNPROPERTYDESCRIPTOR — needed for Object.keys / spread / ...\n // -------------------------------------------------------------------\n getOwnPropertyDescriptor(target: any, prop: PropertyKey) {\n return Object.getOwnPropertyDescriptor(target, prop);\n },\n\n // -------------------------------------------------------------------\n // DELETEPROPERTY — clean up signals when a key is removed\n // -------------------------------------------------------------------\n deleteProperty(target: any, prop: PropertyKey): boolean {\n if (typeof prop === 'symbol') {\n return Reflect.deleteProperty(target, prop);\n }\n\n const key = String(prop);\n const childPath = basePrefix + key;\n\n const result = Reflect.deleteProperty(target, prop);\n\n // Clean up the signal for this path and all children via adjacency map\n invalidateChildren(childPath);\n signals.delete(childPath);\n\n // Remove from parent's children set in the adjacency map\n const parentPath = basePath;\n if (parentPath !== undefined) {\n const parentSet = children.get(parentPath);\n if (parentSet) {\n parentSet.delete(childPath);\n if (parentSet.size === 0) children.delete(parentPath);\n }\n }\n // Clean up the deleted path's own children entry\n children.delete(childPath);\n\n return result;\n },\n });\n\n proxyCache.set(raw, proxy);\n return proxy;\n }\n\n // -------------------------------------------------------------------------\n // Root proxy\n // -------------------------------------------------------------------------\n\n const rootProxy = wrap(initial, '') as T;\n\n // -------------------------------------------------------------------------\n // Snapshot (for functional setter)\n // -------------------------------------------------------------------------\n\n /**\n * Produce a plain-object snapshot of the store's current state.\n * Reads are untracked so calling `setState(prev => ...)` inside an effect\n * does not create additional subscriptions.\n */\n function getCurrentSnapshot(): T {\n return untrack(() => deepClone(initial) as T);\n }\n\n // -------------------------------------------------------------------------\n // Setter\n // -------------------------------------------------------------------------\n\n const setter: StoreSetter<T> = (\n partial: Partial<T> | ((prev: T) => Partial<T>),\n ) => {\n // Resolve functional updates by snapshotting current state\n const updates: Partial<T> =\n typeof partial === 'function' ? partial(getCurrentSnapshot()) : partial;\n\n // Batch all top-level key writes so effects run only once\n batch(() => {\n for (const key of Object.keys(updates) as (keyof T & string)[]) {\n (rootProxy as Record<string, unknown>)[key] = (updates as Record<string, unknown>)[key];\n }\n });\n };\n\n return [rootProxy, setter];\n}\n","/**\n * Forma State - History\n *\n * Undo/redo for any signal. Tracks changes and maintains undo/redo stacks\n * with reactive canUndo/canRedo signals.\n * Zero dependencies -- native browser APIs only.\n */\n\nimport { createSignal, internalEffect, batch } from 'forma/reactive';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Undo/redo controls returned by {@link createHistory}. */\nexport interface HistoryControls<T> {\n /** Undo the last change, restoring the previous value. */\n undo: () => void;\n /** Redo the last undone change. */\n redo: () => void;\n /** Reactive getter: true if undo is available. */\n canUndo: () => boolean;\n /** Reactive getter: true if redo is available. */\n canRedo: () => boolean;\n /** Reactive getter: the full history stack (past + current + future). */\n history: () => T[];\n /** Reactive getter: current position in the history stack (0-based). */\n cursor: () => number;\n /** Clear all history, keeping only the current value. */\n clear: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create undo/redo history tracking for a signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const h = createHistory([count, setCount], { maxLength: 50 });\n *\n * setCount(1);\n * setCount(2);\n * h.undo(); // count() === 1\n * h.redo(); // count() === 2\n * h.canUndo(); // true (reactive)\n * ```\n */\nexport function createHistory<T>(\n source: [get: () => T, set: (v: T) => void],\n options?: { maxLength?: number },\n): HistoryControls<T> {\n const [sourceGet, sourceSet] = source;\n const maxLength = options?.maxLength ?? 100;\n\n // ---------- Internal mutable state (not signals) ----------\n // We use plain arrays/numbers to avoid creating signal dependencies\n // inside the source-tracking effect, which would cause re-entrance issues.\n let _stack: T[] = [sourceGet()];\n let _cursor = 0;\n\n // ---------- Reactive output signals ----------\n // These are signals that external consumers can subscribe to.\n // We update them explicitly after every mutation.\n const [stackSignal, setStackSignal] = createSignal<T[]>([..._stack]);\n const [cursorSignal, setCursorSignal] = createSignal(_cursor);\n // Separate signal for stack length so canRedo only depends on numeric\n // signals and doesn't re-fire when array reference changes but length stays.\n const [stackLenSignal, setStackLenSignal] = createSignal(_stack.length);\n\n /** Sync the reactive output signals with internal mutable state. */\n function syncSignals(): void {\n batch(() => {\n setStackSignal([..._stack]);\n setCursorSignal(_cursor);\n setStackLenSignal(_stack.length);\n });\n }\n\n // Track whether the next source change should be ignored\n // (because it was caused by undo/redo, not an external set).\n let ignoreNext = false;\n let isFirstRun = true;\n\n // Watch the source signal for external changes\n internalEffect(() => {\n const value = sourceGet();\n\n // Skip the initial effect run -- the initial value is already in the stack\n if (isFirstRun) {\n isFirstRun = false;\n return;\n }\n\n if (ignoreNext) {\n ignoreNext = false;\n return;\n }\n\n // New value from an external set: push onto history\n // Discard any \"future\" entries after the current cursor (redo is cleared)\n _stack = _stack.slice(0, _cursor + 1);\n _stack.push(value);\n\n // Enforce maxLength\n if (_stack.length > maxLength) {\n _stack.splice(0, _stack.length - maxLength);\n }\n\n _cursor = _stack.length - 1;\n syncSignals();\n });\n\n // Reactive derived getters\n const canUndo = (): boolean => cursorSignal() > 0;\n const canRedo = (): boolean => cursorSignal() < stackLenSignal() - 1;\n\n const undo = (): void => {\n if (_cursor <= 0) return;\n\n _cursor--;\n ignoreNext = true;\n sourceSet(_stack[_cursor] as T);\n syncSignals();\n };\n\n const redo = (): void => {\n if (_cursor >= _stack.length - 1) return;\n\n _cursor++;\n ignoreNext = true;\n sourceSet(_stack[_cursor] as T);\n syncSignals();\n };\n\n const clear = (): void => {\n const currentValue = sourceGet();\n _stack = [currentValue];\n _cursor = 0;\n syncSignals();\n };\n\n return {\n undo,\n redo,\n canUndo,\n canRedo,\n history: () => stackSignal(),\n cursor: () => cursorSignal(),\n clear,\n };\n}\n","/**\n * Forma State - Persist\n *\n * Auto-persist a signal to localStorage (or any Storage-compatible backend).\n * Reads stored value on creation; writes on every signal change.\n * Zero dependencies -- native browser APIs only.\n */\n\nimport { internalEffect } from 'forma/reactive';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Options for {@link persist} — storage backend, serialization, and validation. */\nexport interface PersistOptions<T> {\n /** Storage backend. Defaults to localStorage. */\n storage?: Storage;\n /** Custom serializer. Defaults to JSON.stringify. */\n serialize?: (v: T) => string;\n /** Custom deserializer. Defaults to JSON.parse. */\n deserialize?: (s: string) => T;\n /** Optional validator — return true if the deserialized value is valid. Rejects corrupt/tampered data. */\n validate?: (v: unknown) => v is T;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Persist a signal's value to storage.\n *\n * On creation, reads the stored value (if any) and hydrates the signal.\n * Then sets up an effect to write to storage whenever the signal changes.\n *\n * ```ts\n * const [theme, setTheme] = createSignal('light');\n * persist([theme, setTheme], 'app:theme');\n *\n * setTheme('dark'); // auto-saved to localStorage under key 'app:theme'\n * ```\n */\nexport function persist<T>(\n source: [get: () => T, set: (v: T) => void],\n key: string,\n options?: PersistOptions<T>,\n): void {\n const [sourceGet, sourceSet] = source;\n const storage = options?.storage ?? globalThis.localStorage;\n const serialize = options?.serialize ?? JSON.stringify;\n const deserialize = options?.deserialize ?? JSON.parse;\n const validate = options?.validate;\n\n // Step 1: Hydrate from storage (if a value exists)\n try {\n const stored = storage.getItem(key);\n if (stored !== null) {\n const value = deserialize(stored);\n if (!validate || validate(value)) {\n sourceSet(value);\n }\n }\n } catch {\n // Stored data is invalid or storage is unavailable -- ignore and keep\n // the signal's current value.\n }\n\n // Step 2: Set up effect to persist on changes\n internalEffect(() => {\n const value = sourceGet();\n try {\n const serialized = serialize(value);\n storage.setItem(key, serialized);\n } catch {\n // Storage write failed (e.g., quota exceeded) -- silently ignore.\n }\n });\n}\n","// Typed event bus — pub/sub pattern\n\n/**\n * A typed publish/subscribe event bus.\n *\n * The type parameter `T` maps event names to their payload types,\n * ensuring type-safe event emission and subscription.\n */\nexport interface EventBus<T extends Record<string, unknown>> {\n /** Subscribe to an event. Returns an unsubscribe function. */\n on<K extends keyof T>(event: K, handler: (payload: T[K]) => void): () => void;\n /** Subscribe to an event, automatically unsubscribing after the first firing. */\n once<K extends keyof T>(event: K, handler: (payload: T[K]) => void): () => void;\n /** Emit an event to all current subscribers. */\n emit<K extends keyof T>(event: K, payload: T[K]): void;\n /** Remove a specific handler from an event. */\n off<K extends keyof T>(event: K, handler: (payload: T[K]) => void): void;\n /** Remove all handlers for all events. */\n clear(): void;\n}\n\n/**\n * Create a typed event bus for publish/subscribe messaging.\n *\n * ```ts\n * type Events = { save: { id: number }; delete: { id: number } };\n * const bus = createBus<Events>();\n *\n * const unsub = bus.on('save', (payload) => console.log(payload.id));\n * bus.emit('save', { id: 42 });\n * unsub();\n * ```\n */\nexport function createBus<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(): EventBus<T> {\n const listeners = new Map<keyof T, Set<(payload: any) => void>>();\n\n function getHandlers<K extends keyof T>(event: K): Set<(payload: any) => void> {\n let set = listeners.get(event);\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n return set;\n }\n\n function on<K extends keyof T>(\n event: K,\n handler: (payload: T[K]) => void,\n ): () => void {\n const set = getHandlers(event);\n set.add(handler);\n return () => {\n set.delete(handler);\n };\n }\n\n function once<K extends keyof T>(\n event: K,\n handler: (payload: T[K]) => void,\n ): () => void {\n const wrapper = (payload: T[K]) => {\n off(event, wrapper);\n handler(payload);\n };\n return on(event, wrapper);\n }\n\n function emit<K extends keyof T>(event: K, payload: T[K]): void {\n const set = listeners.get(event);\n if (set) {\n // Iterate over a snapshot so removals during emit are safe\n for (const handler of [...set]) {\n try {\n handler(payload);\n } catch (e) {\n console.error(`[forma] Bus handler error on \"${String(event)}\":`, e);\n }\n }\n }\n }\n\n function off<K extends keyof T>(\n event: K,\n handler: (payload: T[K]) => void,\n ): void {\n const set = listeners.get(event);\n if (set) {\n set.delete(handler);\n }\n }\n\n function clear(): void {\n listeners.clear();\n }\n\n return { on, once, emit, off, clear };\n}\n","// Event delegation — single listener on parent, matches children by selector\n\n/**\n * Attach a single event listener on a parent that fires for children matching\n * a CSS selector. Efficient for large/dynamic lists — one listener instead of\n * one per child.\n *\n * ```ts\n * const unsub = delegate(ul, 'li', 'click', (e, li) => {\n * console.log('Clicked:', li.textContent);\n * });\n * ```\n *\n * @param container The parent element or document to listen on.\n * @param selector CSS selector to match against delegated targets.\n * @param event DOM event name (e.g. `'click'`, `'input'`).\n * @param handler Called with the event and the matched child element.\n * @param options Standard `addEventListener` options (capture, passive, etc.).\n * @returns An unsubscribe function that removes the listener.\n */\nexport function delegate<K extends keyof HTMLElementEventMap>(\n container: HTMLElement | Document,\n selector: string,\n event: K,\n handler: (e: HTMLElementEventMap[K], matchedEl: HTMLElement) => void,\n options?: AddEventListenerOptions,\n): () => void {\n const listener = (e: Event) => {\n const target = e.target;\n if (!(target instanceof HTMLElement)) return;\n\n const root =\n container instanceof Document ? container.documentElement : container;\n const matched = target.closest(selector);\n\n if (matched instanceof HTMLElement && root.contains(matched)) {\n handler(e as HTMLElementEventMap[K], matched);\n }\n };\n\n container.addEventListener(event, listener, options);\n\n return () => {\n container.removeEventListener(event, listener, options);\n };\n}\n","// Keyboard shortcut handler\n\ntype KeyCombo = string; // e.g., 'ctrl+s', 'shift+enter', 'escape', 'ctrl+shift+z'\n\n/** Options for the {@link onKey} keyboard shortcut handler. */\nexport interface KeyOptions {\n /** Element or document to listen on. Defaults to `document`. */\n target?: EventTarget;\n /** Whether to call `e.preventDefault()`. Defaults to `true`. */\n preventDefault?: boolean;\n}\n\ninterface ParsedCombo {\n ctrl: boolean;\n shift: boolean;\n alt: boolean;\n meta: boolean;\n key: string;\n}\n\nfunction parseCombo(combo: KeyCombo): ParsedCombo {\n const parts = combo.toLowerCase().split('+').map((p) => p.trim());\n const modifiers: ParsedCombo = {\n ctrl: false,\n shift: false,\n alt: false,\n meta: false,\n key: '',\n };\n\n for (const part of parts) {\n switch (part) {\n case 'ctrl':\n case 'control':\n modifiers.ctrl = true;\n break;\n case 'shift':\n modifiers.shift = true;\n break;\n case 'alt':\n modifiers.alt = true;\n break;\n case 'meta':\n case 'cmd':\n case 'command':\n modifiers.meta = true;\n break;\n default:\n modifiers.key = part;\n }\n }\n\n return modifiers;\n}\n\nfunction matchesCombo(e: KeyboardEvent, parsed: ParsedCombo): boolean {\n if (e.ctrlKey !== parsed.ctrl) return false;\n if (e.shiftKey !== parsed.shift) return false;\n if (e.altKey !== parsed.alt) return false;\n if (e.metaKey !== parsed.meta) return false;\n return e.key.toLowerCase() === parsed.key;\n}\n\n/**\n * Listen for a keyboard shortcut and invoke a handler when it fires.\n *\n * Supports modifier keys: `ctrl`, `shift`, `alt`, `meta`/`cmd`.\n *\n * ```ts\n * const unsub = onKey('ctrl+s', (e) => save());\n * const unsub2 = onKey('escape', () => close(), { target: modal });\n * ```\n *\n * @param combo Key combination string (e.g. `'ctrl+s'`, `'shift+enter'`).\n * @param handler Called when the combo is pressed.\n * @param options Optional target element and preventDefault behavior.\n * @returns An unsubscribe function that removes the listener.\n */\nexport function onKey(\n combo: KeyCombo,\n handler: (e: KeyboardEvent) => void,\n options?: KeyOptions,\n): () => void {\n const target: EventTarget = options?.target ?? document;\n const shouldPreventDefault = options?.preventDefault ?? true;\n const parsed = parseCombo(combo);\n\n const listener = (e: Event) => {\n if (!(e instanceof KeyboardEvent)) return;\n if (matchesCombo(e, parsed)) {\n if (shouldPreventDefault) {\n e.preventDefault();\n }\n handler(e);\n }\n };\n\n target.addEventListener('keydown', listener);\n\n return () => {\n target.removeEventListener('keydown', listener);\n };\n}\n","// Typed query helpers\n\n/**\n * Select a single element by CSS selector. Returns `null` if not found.\n *\n * ```ts\n * const btn = $<HTMLButtonElement>('.submit-btn');\n * const inner = $('span', container);\n * ```\n */\nexport function $<T extends HTMLElement = HTMLElement>(\n selector: string,\n parent?: ParentNode,\n): T | null {\n return (parent ?? document).querySelector<T>(selector);\n}\n\n/**\n * Select all elements matching a CSS selector, returned as a plain array.\n *\n * ```ts\n * const items = $$<HTMLLIElement>('ul > li');\n * items.forEach((li) => li.classList.add('active'));\n * ```\n */\nexport function $$<T extends HTMLElement = HTMLElement>(\n selector: string,\n parent?: ParentNode,\n): T[] {\n return Array.from((parent ?? document).querySelectorAll<T>(selector));\n}\n","// DOM mutation helpers\n\n/** Add one or more CSS classes to an element. */\nexport function addClass(el: HTMLElement, ...classes: string[]): void {\n el.classList.add(...classes);\n}\n\n/** Remove one or more CSS classes from an element. */\nexport function removeClass(el: HTMLElement, ...classes: string[]): void {\n el.classList.remove(...classes);\n}\n\n/** Toggle a CSS class on an element. Returns the resulting state. */\nexport function toggleClass(\n el: HTMLElement,\n className: string,\n force?: boolean,\n): boolean {\n return el.classList.toggle(className, force);\n}\n\n/**\n * Apply multiple inline styles to an element at once.\n *\n * ```ts\n * setStyle(el, { opacity: '0', transform: 'translateY(-10px)' });\n * ```\n */\nexport function setStyle(\n el: HTMLElement,\n styles: Partial<CSSStyleDeclaration>,\n): void {\n for (const [key, value] of Object.entries(styles)) {\n if (value !== undefined) {\n (el.style as any)[key] = value;\n }\n }\n}\n\n/**\n * Set or remove multiple attributes on an element.\n *\n * - `false` / `null` removes the attribute.\n * - `true` sets it as a boolean attribute (empty string).\n * - A string sets the attribute value.\n */\nexport function setAttr(\n el: HTMLElement,\n attrs: Record<string, string | boolean | null>,\n): void {\n for (const [name, value] of Object.entries(attrs)) {\n if (value === false || value === null) {\n el.removeAttribute(name);\n } else if (value === true) {\n el.setAttribute(name, '');\n } else {\n el.setAttribute(name, value);\n }\n }\n}\n\n/** Set an element's text content. Safe for user-controlled strings. */\nexport function setText(el: HTMLElement, text: string): void {\n el.textContent = text;\n}\n\n/**\n * Set raw HTML on an element. **No sanitization is performed.**\n *\n * Prefer `setText()` for user-controlled content. Only use this when you\n * trust the HTML source (e.g., server-rendered markup you control).\n */\nexport function setHTMLUnsafe(el: HTMLElement, html: string): void {\n el.innerHTML = html;\n}\n","// DOM traversal helpers\n\n/** Find the closest ancestor matching a CSS selector. */\nexport function closest<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector: string,\n): T | null {\n return el.closest<T>(selector);\n}\n\n/** Get direct child elements, optionally filtered by a CSS selector. */\nexport function children<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T[] {\n const all = Array.from(el.children) as HTMLElement[];\n if (!selector) return all as T[];\n return all.filter((child) => child.matches(selector)) as T[];\n}\n\n/** Get sibling elements (excluding the element itself), optionally filtered. */\nexport function siblings<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T[] {\n const parentEl = el.parentElement;\n if (!parentEl) return [];\n const all = Array.from(parentEl.children) as HTMLElement[];\n const sibs = all.filter((child) => child !== el);\n if (!selector) return sibs as T[];\n return sibs.filter((child) => child.matches(selector)) as T[];\n}\n\n/** Get the parent element, or `null` if detached. */\nexport function parent<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n): T | null {\n return el.parentElement as T | null;\n}\n\n/** Find the next sibling element, optionally matching a CSS selector. */\nexport function nextSibling<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T | null {\n let sib = el.nextElementSibling;\n while (sib) {\n if (sib instanceof HTMLElement) {\n if (!selector || sib.matches(selector)) {\n return sib as T;\n }\n }\n sib = sib.nextElementSibling;\n }\n return null;\n}\n\n/** Find the previous sibling element, optionally matching a CSS selector. */\nexport function prevSibling<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T | null {\n let sib = el.previousElementSibling;\n while (sib) {\n if (sib instanceof HTMLElement) {\n if (!selector || sib.matches(selector)) {\n return sib as T;\n }\n }\n sib = sib.previousElementSibling;\n }\n return null;\n}\n","// Observer wrappers — clean API for ResizeObserver, IntersectionObserver, MutationObserver\n\n/**\n * Observe element size changes via `ResizeObserver`.\n *\n * @returns A disconnect function that stops observing.\n */\nexport function onResize(\n el: HTMLElement,\n handler: (entry: ResizeObserverEntry) => void,\n): () => void {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n handler(entry);\n }\n });\n observer.observe(el);\n return () => {\n observer.disconnect();\n };\n}\n\n/**\n * Observe element visibility changes via `IntersectionObserver`.\n *\n * @returns A disconnect function that stops observing.\n */\nexport function onIntersect(\n el: HTMLElement,\n handler: (entry: IntersectionObserverEntry) => void,\n options?: IntersectionObserverInit,\n): () => void {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n handler(entry);\n }\n }, options);\n observer.observe(el);\n return () => {\n observer.disconnect();\n };\n}\n\n/**\n * Observe DOM mutations (child additions/removals, attribute changes) via\n * `MutationObserver`. Defaults to `{ childList: true, subtree: true }`.\n *\n * @returns A disconnect function that stops observing.\n */\nexport function onMutation(\n el: HTMLElement,\n handler: (mutations: MutationRecord[]) => void,\n options?: MutationObserverInit,\n): () => void {\n const observer = new MutationObserver((mutations) => {\n handler(mutations);\n });\n observer.observe(el, options ?? { childList: true, subtree: true });\n return () => {\n observer.disconnect();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dom/text.ts","../src/dom/mount.ts","../src/dom/switch.ts","../src/dom/portal.ts","../src/dom/error-boundary.ts","../src/dom/suspense.ts","../src/dom/template.ts","../src/dom/activate.ts","../src/component/define.ts","../src/component/context.ts","../src/state/store.ts","../src/state/history.ts","../src/state/persist.ts","../src/events/bus.ts","../src/events/delegate.ts","../src/events/keyboard.ts","../src/dom-utils/query.ts","../src/dom-utils/mutate.ts","../src/dom-utils/traverse.ts","../src/dom-utils/observe.ts"],"names":["value","fragment","cache","parent","children","trigger","cleanup","setter","onError","on"],"mappings":";;;;;;;;AAkBO,SAAS,WAAWA,MAAAA,EAAsC;AAC/D,EAAA,IAAI,OAAOA,WAAU,UAAA,EAAY;AAE/B,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,CAAA;AACxB,IAAA,cAAA,CAAe,MAAM;AAEnB,MAAA,IAAA,CAAK,OAAOA,MAAAA,EAAM;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,KAAKA,MAAK,CAAA;AACvB;;;ACQO,SAAS,KAAA,CACd,WACA,SAAA,EACY;AACZ,EAAA,MAAM,SACJ,OAAO,SAAA,KAAc,WACjB,QAAA,CAAS,aAAA,CAA2B,SAAS,CAAA,GAC7C,SAAA;AAEN,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAiC,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,YAAA,CAAa,gBAAgB,CAAA,EAAG;AAGzC,IAAA,iBAAA,CAAkB,CAAC,OAAA,KAAY;AAC7B,MAAA,WAAA,GAAc,OAAA;AACd,MAAA,aAAA,CAAc,WAAW,MAAM,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,CAAC,OAAA,KAAY;AACzC,MAAA,WAAA,GAAc,OAAA;AACd,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AACnB,IAAA,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,EACxB;AAGA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,WAAA,EAAY;AACZ,IAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AAAA,EACrB,CAAA;AACF;;;AC/BO,SAAS,YAAA,CACdA,MAAAA,EACA,KAAA,EACA,QAAA,EACkB;AAClB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,cAAc,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,eAAe,CAAA;AACxD,EAAA,MAAMC,SAAAA,GAAW,SAAS,sBAAA,EAAuB;AACjD,EAAAA,SAAAA,CAAS,YAAY,WAAW,CAAA;AAChC,EAAAA,SAAAA,CAAS,YAAY,SAAS,CAAA;AAI9B,EAAA,MAAMC,MAAAA,uBAAY,GAAA,EAAqB;AACvC,EAAA,IAAI,WAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,YAAA,GAAiC,KAAA;AAErC,EAAA,MAAM,aAAA,GAAgB,eAAe,MAAM;AACzC,IAAA,MAAM,MAAMF,MAAAA,EAAM;AAClB,IAAA,IAAI,QAAQ,YAAA,EAAc;AAE1B,IAAA,MAAM,KAAA,GAAQ,OAAQ,UAAA,CAAmB,eAAA,KAAoB,WAAA;AAC7D,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,MAAA,CAAO,YAAY,CAAA,EAAG,QAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAE1F,IAAA,YAAA,GAAe,GAAA;AAEf,IAAA,MAAMG,UAAS,WAAA,CAAY,UAAA;AAC3B,IAAA,IAAI,CAACA,OAAAA,EAAQ;AACX,MAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,iDAAiD,CAAA;AACzE,MAAA;AAAA,IACF;AAOA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI,WAAA,CAAY,eAAeA,OAAAA,EAAQ;AACrC,QAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,qCAAqC,CAAA;AAC5D,QAAAA,OAAAA,CAAO,YAAY,WAAW,CAAA;AAAA,MAChC,CAAA,MAAA,IAAW,WAAA,CAAY,QAAA,KAAa,EAAA,EAAiC;AAEnE,QAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,kDAAkD,CAAA;AACzE,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,OAAO,WAAA,CAAY,WAAA,IAAe,WAAA,CAAY,WAAA,KAAgB,SAAA,EAAW;AACvE,UAAA,WAAA,CAAY,WAAA,CAAY,YAAY,WAAW,CAAA;AAC/C,UAAA,OAAA,EAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,SAAS,0BAA0B,CAAA;AAAA,MACtF,CAAA,MAAO;AAEL,QAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,uDAAuD,CAAA;AAC9E,QAAA,OAAO,WAAA,CAAY,WAAA,IAAe,WAAA,CAAY,WAAA,KAAgB,SAAA,EAAW;AACvE,UAAAA,OAAAA,CAAO,WAAA,CAAY,WAAA,CAAY,WAAW,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAc,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,GAAG,CAAA;AACnD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAI,KAAA,GAAQD,MAAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,IAAI,CAAC,KAAA,EAAO;AAKV,QAAA,IAAI,aAAA;AACJ,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,CAAC,OAAA,KAAY;AACnC,UAAA,aAAA,GAAgB,OAAA;AAChB,UAAA,OAAO,OAAA,CAAQ,MAAM,WAAA,CAAY,MAAA,EAAQ,CAAA;AAAA,QAC3C,CAAC,CAAA;AACD,QAAA,KAAA,GAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,aAAA,EAAc;AACvC,QAAAA,MAAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACpB,QAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,wCAAA,EAA0C,MAAA,CAAO,GAAG,CAAA,EAAG,QAAA,EAAK,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,MACzH,CAAA,MAAO;AACL,QAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,CAAI,4CAA4C,MAAA,CAAO,GAAG,GAAG,QAAA,EAAK,KAAA,CAAM,KAAK,QAAA,EAAU,MAAA,EAAQ,MAAM,IAAA,CAAK,QAAA,EAAU,cAAc,KAAA,CAAM,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,MACpL;AACA,MAAA,WAAA,GAAc,KAAA,CAAM,IAAA;AAAA,IACtB,CAAA,MAAO;AAGL,MAAA,WAAA,GAAc,YAAW,IAAK,IAAA;AAC9B,MAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,yCAAyC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAAC,OAAAA,CAAO,YAAA,CAAa,WAAA,EAAa,SAAS,CAAA;AAC1C,MAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,CAAI,yBAAA,EAA2B,WAAA,CAAY,UAAU,mBAAmB,CAAA;AAAA,IAC7F;AAAA,EACF,CAAC,CAAA;AAMD,EAAA,gBAAA,CAAiB,MAAM;AACrB,IAAA,KAAA,MAAW,KAAA,IAASD,MAAAA,CAAM,MAAA,EAAO,EAAG;AAClC,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAChB;AACA,IAAAA,OAAM,KAAA,EAAM;AACZ,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAC,CAAA;AAID,EAACD,SAAAA,CAAiB,kBAAkB,MAAM;AACxC,IAAA,aAAA,EAAc;AACd,IAAA,KAAA,MAAW,KAAA,IAASC,MAAAA,CAAM,MAAA,EAAO,EAAG;AAClC,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAChB;AACA,IAAAA,OAAM,KAAA,EAAM;AAAA,EACd,CAAA;AAEA,EAAA,OAAOD,SAAAA;AACT;AAGA,IAAM,KAAA,0BAAe,OAAO,CAAA;;;AC7IrB,SAAS,YAAA,CACdG,WACA,MAAA,EACS;AACT,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,cAAc,CAAA;AAEzD,EAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,KAAW,QAAA,GACrC,SAAS,aAAA,CAAc,MAAM,CAAA,GAC5B,MAAA,IAAU,QAAA,CAAS,IAAA;AAExB,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAA,GAA2B,IAAA;AAC/B,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,UAAA,KAAe,cAAA,EAAgB;AAC5D,MAAA,cAAA,CAAe,YAAY,WAAW,CAAA;AAAA,IACxC;AACA,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAA;AAEA,EAAA,YAAA,CAAa,MAAM;AACjB,IAAA,MAAM,OAAOA,SAAAA,EAAS;AAGtB,IAAA,iBAAA,EAAkB;AAElB,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,cAAA,CAAe,YAAY,IAAI,CAAA;AAG/B,IAAA,OAAO,MAAM;AACX,MAAA,iBAAA,EAAkB;AAAA,IACpB,CAAA;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,WAAA;AACT;;;ACnCO,SAAS,mBAAA,CACd,OACA,OAAA,EACkB;AAClB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,sBAAsB,CAAA;AACjE,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,uBAAuB,CAAA;AAChE,EAAA,MAAMH,SAAAA,GAAW,SAAS,sBAAA,EAAuB;AACjD,EAAAA,SAAAA,CAAS,YAAY,WAAW,CAAA;AAChC,EAAAA,SAAAA,CAAS,YAAY,SAAS,CAAA;AAE9B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,aAAa,CAAC,CAAA;AAClD,EAAA,IAAI,WAAA,GAA2B,IAAA;AAE/B,EAAA,cAAA,CAAe,MAAM;AAEnB,IAAA,UAAA,EAAW;AAEX,IAAA,MAAME,UAAS,WAAA,CAAY,UAAA;AAC3B,IAAA,IAAI,CAACA,OAAAA,EAAQ;AAGb,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,UAAA,KAAeA,OAAAA,EAAQ;AACpD,MAAAA,OAAAA,CAAO,YAAY,WAAW,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,KAAA,EAAM;AAAA,IACtB,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1D,MAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AAC5C,MAAA,WAAA,GAAc,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAAA,OAAAA,CAAO,YAAA,CAAa,WAAA,EAAa,SAAS,CAAA;AAAA,IAC5C;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAOF,SAAAA;AACT;;;AChBO,SAAS,cAAA,CACd,UACAG,SAAAA,EACkB;AAClB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,gBAAgB,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,iBAAiB,CAAA;AAC1D,EAAA,MAAMH,SAAAA,GAAW,SAAS,sBAAA,EAAuB;AACjD,EAAAA,SAAAA,CAAS,YAAY,WAAW,CAAA;AAChC,EAAAA,SAAAA,CAAS,YAAY,SAAS,CAAA;AAE9B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,aAAa,CAAC,CAAA;AAC5C,EAAA,IAAI,WAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,YAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,YAAA,GAA4B,IAAA;AAEhC,EAAA,MAAM,GAAA,GAAuB;AAAA,IAC3B,SAAA,GAAY;AAAE,MAAA,UAAA,CAAW,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AAAA,IAAG,CAAA;AAAA,IACtC,SAAA,GAAY;AAAE,MAAA,UAAA,CAAW,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IAAG;AAAA,GACrD;AAIA,EAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,EAAA,IAAI;AACF,IAAA,YAAA,GAAeG,SAAAA,EAAS;AAAA,EAC1B,CAAA,SAAE;AACA,IAAA,kBAAA,EAAmB;AAAA,EACrB;AAGA,EAAA,cAAA,CAAe,MAAM;AACnB,IAAA,MAAMD,UAAS,WAAA,CAAY,UAAA;AAC3B,IAAA,IAAI,CAACA,OAAAA,EAAQ;AAEb,IAAA,MAAM,SAAA,GAAY,SAAQ,GAAI,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,SAAA,GAAa,YAAA,KAAiB,QAAA,EAAS,GAAK,YAAA;AAE5D,IAAA,IAAI,YAAY,WAAA,EAAa;AAG7B,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,UAAA,KAAeA,OAAAA,EAAQ;AACpD,MAAAA,OAAAA,CAAO,YAAY,WAAW,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAAA,OAAAA,CAAO,YAAA,CAAa,OAAA,EAAS,SAAS,CAAA;AAAA,IACxC;AAEA,IAAA,WAAA,GAAc,OAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,OAAOF,SAAAA;AACT;;;AC7FA,IAAM,KAAA,uBAAY,GAAA,EAAkB;AAQ7B,SAAS,SAAS,IAAA,EAAoB;AAC3C,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAC7C,IAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,IAAA,IAAA,GAAO,IAAI,OAAA,CAAQ,UAAA;AACnB,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,aAAa,IAAA,EAAgC;AAC3D,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACzB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAC7C,IAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,IAAA,IAAA,GAAO,GAAA,CAAI,OAAA;AACX,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAC5B;;;AClBA,IAAM,sCAAsB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAE7E,SAAS,cAAc,GAAA,EAAuD;AAC5E,EAAA,KAAA,MAAW,OAAO,mBAAA,EAAqB;AACrC,IAAA,IAAI,GAAA,IAAO,GAAA,EAAK,OAAQ,GAAA,CAAY,GAAG,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,eAAA,CACP,IAAA,EACA,EAAA,EACA,WAAA,EACgC;AAEhC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,kBAAkB,CAAA;AACnD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,EACzC;AAGA,EAAA,IAAI,WAAA,IAAe,MAAA,CAAO,EAAE,CAAA,IAAK,WAAA,EAAa;AAC5C,IAAA,OAAO,aAAA,CAAe,WAAA,CAAoB,MAAA,CAAO,EAAE,CAAC,CAA4B,CAAA;AAAA,EAClF;AAGA,EAAA,OAAO,IAAA;AACT;AAUO,SAAS,gBAAgB,QAAA,EAAiD;AAE/E,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,cAAA,CAAe,iBAAiB,CAAA;AAC7D,EAAA,MAAM,cACJ,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,WAAY,CAAA,GAAI,IAAA;AAEvD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,gBAAA,CAA8B,qBAAqB,CAAA;AAE5E,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,KAAK,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,mBAAmB,GAAI,EAAE,CAAA;AAC/D,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,CAAa,sBAAsB,CAAA;AAC9D,IAAA,MAAM,SAAA,GAAY,SAAS,aAAa,CAAA;AAExC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAI,SAAS,OAAA,CAAQ,IAAA,CAAK,2CAA2C,aAAa,CAAA,MAAA,EAAS,EAAE,CAAA,CAAA,CAAG,CAAA;AAChG,MAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,OAAO,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAMI,QAAAA,GAAU,IAAA,CAAK,YAAA,CAAa,oBAAoB,CAAA,IAAK,MAAA;AAE3D,IAAA,IAAIA,aAAY,SAAA,EAAW;AAEzB,MAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,QACnB,CAAC,OAAA,KAAY;AACX,UAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,YAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AAC3B,YAAA,QAAA,CAAS,UAAA,EAAW;AACpB,YAAA,iBAAA,CAAkB,IAAA,EAAM,EAAA,EAAI,aAAA,EAAe,SAAA,EAAW,WAAW,CAAA;AAAA,UACnE;AAAA,QACF,CAAA;AAAA,QACA,EAAE,YAAY,OAAA;AAAQ,OACxB;AACA,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IACvB,CAAA,MAAA,IAAWA,aAAY,MAAA,EAAQ;AAC7B,MAAA,MAAM,UAAU,MAAM,iBAAA,CAAkB,MAAM,EAAA,EAAI,aAAA,EAAe,WAAW,WAAW,CAAA;AACvF,MAAA,IAAI,OAAO,wBAAwB,UAAA,EAAY;AAC7C,QAAA,mBAAA,CAAoB,OAAO,CAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAA,IAAWA,aAAY,aAAA,EAAe;AACpC,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAA,CAAK,mBAAA,CAAoB,aAAA,EAAe,OAAA,EAAS,IAAI,CAAA;AACrD,QAAA,IAAA,CAAK,mBAAA,CAAoB,SAAA,EAAW,OAAA,EAAS,IAAI,CAAA;AACjD,QAAA,iBAAA,CAAkB,IAAA,EAAM,EAAA,EAAI,aAAA,EAAe,SAAA,EAAW,WAAW,CAAA;AAAA,MACnE,CAAA;AACA,MAAA,IAAA,CAAK,gBAAA,CAAiB,eAAe,OAAA,EAAS,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC3E,MAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,OAAA,EAAS,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAAA,IACzE,CAAA,MAAO;AAEL,MAAA,iBAAA,CAAkB,IAAA,EAAM,EAAA,EAAI,aAAA,EAAe,SAAA,EAAW,WAAW,CAAA;AAAA,IACnE;AAAA,EACF;AACF;AAQO,SAAS,iBAAiB,EAAA,EAAuB;AACtD,EAAA,MAAM,UAAW,EAAA,CAAW,cAAA;AAC5B,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAA,EAAQ;AACR,IAAA,OAAQ,EAAA,CAAW,cAAA;AACnB,IAAA,EAAA,CAAG,YAAA,CAAa,qBAAqB,UAAU,CAAA;AAAA,EACjD;AACF;AASO,SAAS,oBAAA,CAAqB,OAA2B,QAAA,EAAgB;AAC9E,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAA8B,8BAA8B,CAAA;AACjF,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,EACzB;AACF;AAGA,SAAS,iBAAA,CACP,IAAA,EACA,EAAA,EACA,aAAA,EACA,WACA,WAAA,EACM;AACN,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,EAAA,EAAI,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,WAAW,CAAA;AAIlD,IAAA,IAAI,UAAA,GAAsB,IAAA;AAC1B,IAAA,iBAAA,CAAkB,CAAC,OAAA,KAAY;AAC7B,MAAA,UAAA,GAAa,cAAc,MAAM,SAAA,CAAU,IAAA,EAAM,KAAK,GAAG,IAAI,CAAA;AAC7D,MAAC,WAAmB,cAAA,GAAiB,OAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,UAAA,CAAW,YAAA,CAAa,qBAAqB,QAAQ,CAAA;AAAA,EACvD,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,OAAA,UAAiB,KAAA,CAAM,CAAA,gBAAA,EAAmB,aAAa,CAAA,MAAA,EAAS,EAAE,aAAa,GAAG,CAAA;AACtF,IAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,OAAO,CAAA;AAAA,EAChD;AACF;;;ACxIA,IAAI,uBAAA,GAAmD,IAAA;AACvD,IAAM,iBAA8C,EAAC;AAErD,SAAS,qBAAqB,GAAA,EAA6B;AACzD,EAAA,cAAA,CAAe,KAAK,uBAAuB,CAAA;AAC3C,EAAA,uBAAA,GAA0B,GAAA;AAC5B;AAEA,SAAS,mBAAA,GAA4B;AACnC,EAAA,uBAAA,GAA0B,cAAA,CAAe,KAAI,IAAK,IAAA;AACpD;AAWO,SAAS,QAAQ,EAAA,EAAkC;AACxD,EAAA,IAAI,4BAA4B,IAAA,EAAM;AACpC,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AACA,EAAA,uBAAA,CAAwB,cAAA,CAAe,KAAK,EAAE,CAAA;AAChD;AAMO,SAAS,UAAU,EAAA,EAAsB;AAC9C,EAAA,IAAI,4BAA4B,IAAA,EAAM;AACpC,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AACA,EAAA,uBAAA,CAAwB,gBAAA,CAAiB,KAAK,EAAE,CAAA;AAClD;AAMA,IAAM,WAAA,0BAAqB,yBAAyB,CAAA;AAkB7C,SAAS,gBACd,UAAA,EACsC;AACtC,EAAA,MAAM,KAAA,GACJ,OAAO,UAAA,KAAe,UAAA,GAAa,aAAa,UAAA,CAAW,KAAA;AAC7D,EACE,OAAO,UAAA,KAAe,UAAA,GAAa,SAAY,UAAA,CAAW;AAE5D,EAAA,OAAO,SAAS,gBAAA,GAAmD;AAEjE,IAAA,MAAM,GAAA,GAAwB;AAAA,MAC5B,WAAW,EAAC;AAAA,MACZ,gBAAgB,EAAC;AAAA,MACjB,kBAAkB;AAAC,KACrB;AAGA,IAAA,oBAAA,CAAqB,GAAG,CAAA;AAExB,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,KAAA,EAAM;AAAA,IACd,CAAA,SAAE;AACA,MAAA,mBAAA,EAAoB;AAAA,IACtB;AAGA,IAAA,MAAM,UAAU,MAAY;AAE1B,MAAA,KAAA,MAAW,EAAA,IAAM,IAAI,gBAAA,EAAkB;AACrC,QAAA,IAAI;AACF,UAAA,EAAA,EAAG;AAAA,QACL,SAAS,CAAA,EAAG;AACV,UAAA,WAAA,CAAY,GAAG,WAAW,CAAA;AAAA,QAC5B;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,QAAA,IAAI;AACF,UAAA,CAAA,EAAE;AAAA,QACJ,SAAS,CAAA,EAAG;AACV,UAAA,WAAA,CAAY,GAAG,oBAAoB,CAAA;AAAA,QACrC;AAAA,MACF;AAGA,MAAA,GAAA,CAAI,UAAU,MAAA,GAAS,CAAA;AACvB,MAAA,GAAA,CAAI,eAAe,MAAA,GAAS,CAAA;AAC5B,MAAA,GAAA,CAAI,iBAAiB,MAAA,GAAS,CAAA;AAAA,IAChC,CAAA;AAGA,IAAC,GAAA,CAAkC,WAAW,CAAA,GAAI,OAAA;AAIlD,IAAA,KAAA,MAAW,EAAA,IAAM,IAAI,cAAA,EAAgB;AACnC,MAAA,IAAI;AACF,QAAA,MAAMC,WAAU,EAAA,EAAG;AACnB,QAAA,IAAI,OAAOA,aAAY,UAAA,EAAY;AACjC,UAAA,GAAA,CAAI,gBAAA,CAAiB,KAAKA,QAAO,CAAA;AAAA,QACnC;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,WAAA,CAAY,GAAG,SAAS,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACF;AAMO,SAAS,iBAAiB,GAAA,EAA2C;AAC1E,EAAA,MAAM,UAAA,GAAa,GAAA;AACnB,EAAA,IAAI,OAAO,UAAA,CAAW,WAAW,CAAA,KAAM,UAAA,EAAY;AACjD,IAAA,UAAA,CAAW,WAAW,CAAA,EAAE;AACxB,IAAA,OAAO,WAAW,WAAW,CAAA;AAAA,EAC/B;AACF;AAOO,SAAS,cAAc,OAAA,EAA2B;AACvD,EAAA,IAAI,4BAA4B,IAAA,EAAM;AACpC,IAAA,uBAAA,CAAwB,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EAChD;AACF;;;ACpKA,IAAM,aAAA,uBAAoB,GAAA,EAAuB;AAa1C,SAAS,cAAiB,YAAA,EAA6B;AAC5D,EAAA,OAAO;AAAA,IACL,EAAA,yBAAW,eAAe,CAAA;AAAA,IAC1B;AAAA,GACF;AACF;AAWO,SAAS,OAAA,CAAW,KAAiBN,MAAAA,EAAgB;AAC1D,EAAA,IAAI,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACpC,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,KAAA,GAAQ,EAAC;AACT,IAAA,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC;AACA,EAAA,KAAA,CAAM,KAAKA,MAAK,CAAA;AAClB;AAUO,SAAS,OAAU,GAAA,EAAoB;AAC5C,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACtC,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7C,IAAA,OAAO,GAAA,CAAI,YAAA;AAAA,EACb;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAC/B;AAUO,SAAS,UAAa,GAAA,EAAuB;AAClD,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACtC,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC3C,IAAA,KAAA,CAAM,GAAA,EAAI;AAEV,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,aAAA,CAAc,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IAC7B;AAAA,EACF;AACF;;;ACpEA,IAAM,GAAA,0BAAa,WAAW,CAAA;AAG9B,IAAM,KAAA,0BAAe,aAAa,CAAA;AAMlC,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAQD,SAAS,WAAW,CAAA,EAAyB;AAC3C,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AAE/C,EAAA,IAAI,CAAA,YAAa,IAAA,IAAQ,CAAA,YAAa,MAAA,IAAU,aAAa,GAAA,IACzD,CAAA,YAAa,GAAA,IAAO,CAAA,YAAa,WAAW,CAAA,YAAa,OAAA,IACzD,CAAA,YAAa,KAAA,IAAS,aAAa,OAAA,EAAS;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAK,CAAA,CAAU,KAAK,CAAA,EAAG,OAAO,KAAA;AAC9B,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,SAAA,CAAU,KAAc,IAAA,EAAiC;AAChE,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,GAAA;AACpD,EAAA,IAAI,CAAC,IAAA,EAAM,IAAA,mBAAO,IAAI,OAAA,EAAQ;AAC9B,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAa,CAAA,EAAG,OAAO,GAAA;AACpC,EAAA,IAAA,CAAK,IAAI,GAAa,CAAA;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,GAAA,CAAI,GAAA,CAAI,CAAA,IAAA,KAAQ,SAAA,CAAU,IAAA,EAAM,IAAI,CAAC,CAAA;AACpE,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAA8B,CAAA,EAAG;AAC7D,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,SAAA,CAAW,GAAA,CAAY,GAAG,GAAG,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,GAAA;AACT;AA2CO,SAAS,YACd,OAAA,EAC+B;AAM/B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAwB;AAG5C,EAAA,MAAMI,SAAAA,uBAAe,GAAA,EAAyB;AAS9C,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAwB;AAClD,EAAA,SAAS,gBAAgB,IAAA,EAA0B;AACjD,IAAA,IAAI,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAC9B,IAAA,IAAI,CAAC,CAAA,EAAG;AAAE,MAAA,CAAA,GAAI,aAAsB,CAAC,CAAA;AAAiB,MAAA,aAAA,CAAc,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAAG;AAClF,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,SAAS,iBAAiB,IAAA,EAAoB;AAC5C,IAAA,MAAM,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAChC,IAAA,IAAI,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA,KAAc,IAAI,CAAC,CAAA;AAAA,EAClC;AAMA,EAAA,SAAS,cAAc,IAAA,EAAoB;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACpC,IAAA,IAAI,YAAY,EAAA,EAAI;AACpB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA;AAC5C,IAAA,IAAI,GAAA,GAAMA,SAAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA,GAAA,uBAAU,GAAA,EAAI;AAAG,MAAAA,SAAAA,CAAS,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AAAA,IAAG;AAC5D,IAAA,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,EACd;AAMA,EAAA,SAAS,SAAA,CAAU,MAAc,YAAA,EAAoC;AACnE,IAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,aAAsB,YAAY,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAI,CAAA;AACtB,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAYA,EAAA,MAAM,UAAA,uBAAiB,OAAA,EAAqC;AAW5D,EAAA,SAAS,mBAAmB,UAAA,EAA0B;AACpD,IAAA,MAAM,QAAA,GAAWA,SAAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACxC,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAEhC,MAAA,kBAAA,CAAmB,SAAS,CAAA;AAE5B,MAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAExB,MAAAA,SAAAA,CAAS,OAAO,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,QAAA,CAAS,KAAA,EAAM;AAAA,EACjB;AAEA,EAAA,SAAS,YAAY,IAAA,EAAsB;AACzC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAC9B,IAAA,OAAO,MAAM,EAAA,GAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EAC/C;AAQA,EAAA,SAAS,UAAA,CAAW,MAAkB,CAAA,EAAkB;AACtD,IAAA,IAAA,CAAK,CAAC,EAAE,OAAO,CAAA,KAAM,aAAa,KAAA,CAAM,CAAC,IAAI,CAAC,CAAA;AAAA,EAChD;AASA,EAAA,SAAS,iBAAA,CAAkB,YAAoB,SAAA,EAA0B;AACvE,IAAA,MAAM,GAAA,GAAMA,SAAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,MAAW,aAAa,GAAA,EAAK;AAC3B,MAAA,MAAM,GAAA,GAAM,YAAY,SAAS,CAAA;AACjC,MAAA,MAAM,EAAA,GAAM,UAAsC,GAAG,CAAA;AACrD,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AAClC,MAAA,IAAI,IAAA,EAAM,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA;AAC7B,MAAA,IAAI,EAAA,IAAM,IAAA,IAAQ,OAAO,EAAA,KAAO,QAAA,EAAU;AACxC,QAAA,iBAAA,CAAkB,WAAW,EAAE,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,kBAAA,CAAmB,SAAS,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAMA,EAAA,SAAS,IAAA,CAAK,KAAa,QAAA,EAA0B;AAEnD,IAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,GAAA;AAG7B,IAAA,IAAI,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC/B,MAAA,IAAI,KAAK,OAAO,GAAA;AAAA,IAClB;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAE/B,IAAA,MAAM,UAAA,GAAa,QAAA,GAAW,QAAA,GAAW,GAAA,GAAM,EAAA;AAE/C,IAAA,MAAM,KAAA,GAAgB,IAAI,KAAA,CAAM,GAAA,EAAK;AAAA;AAAA;AAAA;AAAA,MAInC,GAAA,CAAI,MAAA,EAAa,IAAA,EAAmB,QAAA,EAA4B;AAE9D,QAAA,IAAI,IAAA,KAAS,KAAK,OAAO,MAAA;AACzB,QAAA,IAAI,IAAA,KAAS,OAAO,OAAO,IAAA;AAG3B,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,QAC3C;AAEA,QAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AAEvB,QAAA,MAAM,YAAY,UAAA,GAAa,GAAA;AAK/B,QAAA,IAAI,KAAA,IAAS,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AACpC,UAAA,OAAO,IAAI,IAAA,KAAoB;AAC7B,YAAA,IAAI,MAAA;AACJ,YAAA,KAAA,CAAM,MAAM;AAEV,cAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,gBAAI,CAAC,CAAA,KACxB,CAAA,IAAK,IAAA,IAAQ,OAAO,CAAA,KAAM,QAAA,IAAa,CAAA,CAAU,GAAG,CAAA,GAC/C,CAAA,CAAU,GAAG,CAAA,GACd;AAAA,eACN;AACA,cAAA,MAAA,GAAU,MAAA,CAAe,GAAG,CAAA,CAAE,KAAA,CAAM,QAAQ,OAAO,CAAA;AAInD,cAAA,iBAAA,CAAkB,UAAU,MAAM,CAAA;AAIlC,cAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,UAAA,GAAa,QAAQ,CAAA;AACjD,cAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAA,CAAG,OAAqB,MAAM,CAAA;AAGpD,cAAA,IAAI,QAAA,mBAA2B,QAAQ,CAAA;AAAA,YACzC,CAAC,CAAA;AACD,YAAA,OAAO,MAAA;AAAA,UACT,CAAA;AAAA,QACF;AAKA,QAAA,IAAI,KAAA,IAAS,QAAQ,QAAA,EAAU;AAC7B,UAAA,MAAM,CAAC,MAAM,CAAA,GAAI,SAAA,CAAU,SAAA,EAAW,OAAO,MAAM,CAAA;AACnD,UAAA,MAAA,EAAO;AACP,UAAA,OAAO,MAAA,CAAO,MAAA;AAAA,QAChB;AAKA,QAAA,MAAMJ,MAAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAKtC,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,EAAWA,MAAK,CAAA;AACvC,QAAA,IAAA,CAAK,CAAC,CAAA,EAAE;AAIR,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQA,MAAK,CAAA,EAAG;AACxB,UAAA,eAAA,CAAgB,SAAS,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,QAChC;AAGA,QAAA,IAAI,UAAA,CAAWA,MAAK,CAAA,EAAG;AACrB,UAAA,OAAO,IAAA,CAAKA,QAAO,SAAS,CAAA;AAAA,QAC9B;AAEA,QAAA,OAAOA,MAAAA;AAAA,MACT,CAAA;AAAA;AAAA;AAAA;AAAA,MAKA,GAAA,CAAI,MAAA,EAAa,IAAA,EAAmBA,MAAAA,EAAyB;AAC3D,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAMA,MAAK,CAAA;AAAA,QACxC;AAEA,QAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,QAAA,MAAM,YAAY,UAAA,GAAa,GAAA;AAG/B,QAAA,MAAM,QAAA,GACJA,MAAAA,IAAS,IAAA,IAAQ,OAAOA,MAAAA,KAAU,QAAA,IAAaA,MAAAA,CAAc,GAAG,CAAA,GAC3DA,MAAAA,CAAc,GAAG,CAAA,GAClBA,MAAAA;AAGN,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAGvC,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAMlC,QAAA,IAAI,YAAY,IAAA,IAAQ,OAAO,QAAA,KAAa,QAAA,IAAY,WAAW,QAAA,EAAU;AAC3E,UAAA,kBAAA,CAAmB,SAAS,CAAA;AAC5B,UAAA,UAAA,CAAW,QAAQ,SAAS,CAAA;AAAA,QAC9B;AAGA,QAAA,IAAI,KAAA,IAAS,QAAQ,QAAA,EAAU;AAC7B,UAAA,MAAM,aAAa,UAAA,GAAa,QAAA;AAChC,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AACtC,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAAA,UAC1B;AAAA,QACF;AAIA,QAAA,IAAI,KAAA,IAAS,QAAQ,QAAA,EAAU;AAC7B,UAAA,KAAA,CAAM,MAAM;AACV,YAAA,iBAAA,CAAkB,UAAU,MAAM,CAAA;AAClC,YAAA,IAAI,QAAA,mBAA2B,QAAQ,CAAA;AAAA,UACzC,CAAC,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,GAAGO,OAAM,CAAA,GAAI,SAAA,CAAU,WAAW,QAAQ,CAAA;AAChD,QAAAA,QAAO,QAAQ,CAAA;AAEf,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA;AAAA;AAAA;AAAA,MAKA,GAAA,CAAI,QAAa,IAAA,EAA4B;AAC3C,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,QACjC;AACA,QAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,QAAA,MAAM,YAAY,UAAA,GAAa,GAAA;AAE/B,QAAA,MAAM,CAAC,MAAM,CAAA,GAAI,SAAA,CAAU,WAAW,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAC,CAAA;AAC/D,QAAA,MAAA,EAAO;AACP,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,MACjC,CAAA;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,MAAA,EAAkC;AACxC,QAAA,OAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,MAC/B,CAAA;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAA,CAAyB,QAAa,IAAA,EAAmB;AACvD,QAAA,OAAO,MAAA,CAAO,wBAAA,CAAyB,MAAA,EAAQ,IAAI,CAAA;AAAA,MACrD,CAAA;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,CAAe,QAAa,IAAA,EAA4B;AACtD,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,OAAO,OAAA,CAAQ,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAAA,QAC5C;AAEA,QAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,QAAA,MAAM,YAAY,UAAA,GAAa,GAAA;AAE/B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AACvC,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAOlD,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AACrC,QAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAS,CAAA;AAGjC,QAAA,UAAA,CAAW,QAAQ,SAAS,CAAA;AAG5B,QAAA,kBAAA,CAAmB,SAAS,CAAA;AAE5B,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,MAAA,MAAA,uBAAa,GAAA,EAAI;AAAG,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IAAG;AAChE,IAAA,MAAA,CAAO,GAAA,CAAI,UAAU,KAAK,CAAA;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,SAAS,UAAA,CAAW,QAAiB,IAAA,EAAoB;AACvD,IAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AAClD,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,GAAA,CAAI,MAAgB,CAAA;AAC1C,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,EAAA,CAAG,OAAO,IAAI,CAAA;AACd,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,CAAA,EAAG,UAAA,CAAW,OAAO,MAAgB,CAAA;AAAA,IACvD;AAAA,EACF;AAMA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA;AAWlC,EAAA,SAAS,kBAAA,GAAwB;AAC/B,IAAA,OAAO,OAAA,CAAQ,MAAM,SAAA,CAAU,OAAO,CAAM,CAAA;AAAA,EAC9C;AAMA,EAAA,MAAM,MAAA,GAAyB,CAC7B,OAAA,KACG;AAEH,IAAA,MAAM,UACJ,OAAO,OAAA,KAAY,aAAa,OAAA,CAAQ,kBAAA,EAAoB,CAAA,GAAI,OAAA;AAGlE,IAAA,KAAA,CAAM,MAAM;AACV,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAA2B;AAC9D,QAAC,SAAA,CAAsC,GAAG,CAAA,GAAK,OAAA,CAAoC,GAAG,CAAA;AAAA,MACxF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,CAAC,WAAW,MAAM,CAAA;AAC3B;;;ACzgBA,SAAS,UAAA,CAAc,GAAM,IAAA,EAA2B;AACtD,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,KAAM,UAAU,OAAO,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA;AACrC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,UAAU,MAAA,CAAO,SAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,CAAA;AAC9E,EAAA,IAAI,CAAC,IAAA,EAAM,IAAA,mBAAO,IAAI,OAAA,EAAQ;AAC9B,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAsB,CAAA,EAAG,OAAO,CAAA;AAC7C,EAAA,IAAA,CAAK,IAAI,CAAsB,CAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,IAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,CAA4B,CAAA,EAAG;AACzD,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,UAAA,CAAY,CAAA,CAA8B,CAAC,GAAG,IAAI,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,GAAA;AACT;AAmDO,SAAS,aAAA,CACd,QACA,OAAA,EACoB;AACpB,EAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,MAAA;AAG/B,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,aAAa,GAAG,CAAA;AAKvD,EAAA,IAAI,MAAA,GAAc,CAAC,UAAA,CAAW,SAAA,EAAW,CAAC,CAAA;AAC1C,EAAA,IAAI,OAAA,GAAU,CAAA;AAKd,EAAA,MAAM,CAAC,aAAa,cAAc,CAAA,GAAI,aAAkB,CAAC,GAAG,MAAM,CAAC,CAAA;AACnE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,aAAa,OAAO,CAAA;AAG5D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,YAAA,CAAa,OAAO,MAAM,CAAA;AAGtE,EAAA,SAAS,WAAA,GAAoB;AAC3B,IAAA,KAAA,CAAM,MAAM;AACV,MAAA,cAAA,CAAe,CAAC,GAAG,MAAM,CAAC,CAAA;AAC1B,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,iBAAA,CAAkB,OAAO,MAAM,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH;AAMA,EAAA,MAAM,IAAA,0BAAc,MAAM,CAAA;AAC1B,EAAA,IAAI,SAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,UAAA,GAAa,IAAA;AAGjB,EAAA,MAAM,aAAA,GAAgB,eAAe,MAAM;AACzC,IAAA,MAAMP,SAAQ,SAAA,EAAU;AAGxB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,GAAa,KAAA;AACb,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,cAAc,IAAA,IAAQ,MAAA,CAAO,EAAA,CAAGA,MAAAA,EAAO,SAAS,CAAA,EAAG;AACrD,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA;AAAA,IACF;AAGA,IAAA,SAAA,GAAY,IAAA;AAGZ,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA;AACpC,IAAA,MAAA,CAAO,IAAA,CAAK,UAAA,CAAWA,MAAK,CAAC,CAAA;AAG7B,IAAA,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW;AAC7B,MAAA,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAA,GAAS,SAAS,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAA,GAAU,OAAO,MAAA,GAAS,CAAA;AAC1B,IAAA,WAAA,EAAY;AAAA,EACd,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,MAAY;AAAE,IAAA,aAAA,EAAc;AAAA,EAAG,CAAA;AAG/C,EAAA,MAAM,OAAA,GAAU,MAAe,YAAA,EAAa,GAAI,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,MAAe,YAAA,EAAa,GAAI,gBAAe,GAAI,CAAA;AAEnE,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,IAAI,WAAW,CAAA,EAAG;AAElB,IAAA,OAAA,EAAA;AAGA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,OAAO,CAAM,CAAA;AAChD,IAAA,SAAA,GAAY,QAAA;AACZ,IAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,IAAI,OAAA,IAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAElC,IAAA,OAAA,EAAA;AACA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,OAAO,CAAM,CAAA;AAChD,IAAA,SAAA,GAAY,QAAA;AACZ,IAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,MAAA,GAAS,CAAC,UAAA,CAAW,YAAY,CAAC,CAAA;AAClC,IAAA,OAAA,GAAU,CAAA;AACV,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,MAAM,WAAA,EAAY;AAAA,IAC3B,MAAA,EAAQ,MAAM,YAAA,EAAa;AAAA,IAC3B,KAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChKA,IAAM,YAAA,GAAe,UAAA;AAmBd,SAAS,OAAA,CACd,MAAA,EACA,GAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,MAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,IAAW,UAAA,CAAW,YAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,SAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,OAAA,EAAS,WAAA,IAAgB,IAAA,CAAK,KAAA;AAClD,EAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAC1B,EAAA,MAAM,UAAU,OAAA,EAAS,OAAA;AACzB,EAAA,MAAM,UAAU,OAAA,EAAS,OAAA;AACzB,EAAA,MAAMQ,WAAU,OAAA,EAAS,OAAA;AAIzB,EAAA,IAAI,OAAA,GAAU,KAAA;AAKd,EAAA,SAAS,OAAO,MAAA,EAAqD;AACnE,IAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,IAAA,IACE,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,IACpC,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,YAAY,CAAA,EACzD;AACA,MAAA,MAAM,GAAA,GAAM,MAAA;AACZ,MAAA,OAAO,EAAE,OAAO,GAAA,CAAI,KAAA,EAAO,SAAS,MAAA,CAAO,GAAA,CAAI,YAAY,CAAC,CAAA,EAAE;AAAA,IAChE;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,CAAA,EAAE;AAAA,EACrC;AAEA,EAAA,SAAS,OAAA,GAAgB;AACvB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAAA,QAAAA,GAAU,KAAK,SAAS,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,WAAW,IAAA,EAAM;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,SAAS,aAAA,EAAc,GAAI,OAAO,MAAM,CAAA;AAC5D,MAAA,IAAIR,MAAAA,GAAQ,GAAA;AACZ,MAAA,IAAI,OAAA,KAAY,KAAA,CAAA,IAAa,aAAA,GAAgB,OAAA,EAAS;AACpD,QAAA,IAAI,CAAC,OAAA,EAAS;AACd,QAAA,IAAI;AACF,UAAAA,MAAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,aAAa,CAAA;AAAA,QACpC,SAAS,GAAA,EAAK;AACZ,UAAAQ,QAAAA,GAAU,KAAK,SAAS,CAAA;AACxB,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAASR,MAAK,CAAA,EAAG;AAChC,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,IAAI;AAAE,UAAA,SAAA,CAAUA,MAAU,CAAA;AAAA,QAAG,CAAA,SAAE;AAAU,UAAA,OAAA,GAAU,KAAA;AAAA,QAAO;AAAA,MAC5D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAAQ,QAAAA,GAAU,KAAK,SAAS,CAAA;AAAA,IAC1B;AAAA,EACF;AAIA,EAAA,OAAA,EAAQ;AAIR,EAAA,MAAM,UAAA,GAAa,eAAe,MAAM;AACtC,IAAA,MAAMR,SAAQ,SAAA,EAAU;AACxB,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,OAAA,KAAY,KAAA,CAAA,GAC3B,SAAA,CAAU,EAAE,CAAC,YAAY,GAAG,OAAA,EAAS,KAAA,EAAAA,MAAAA,EAAuB,CAAA,GAC5D,UAAUA,MAAK,CAAA;AACnB,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAAQ,WAAU,GAAA,EAAM,GAAA,EAA2B,IAAA,KAAS,oBAAA,GAAuB,UAAU,WAAW,CAAA;AAAA,IAClG;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,aAAa,OAAA,EAAS,QAAA,KACtB,OAAO,MAAA,KAAW,WAAA,IAAe,YAAY,UAAA,CAAW,YAAA,CAAA;AAC9D,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA,IAAc,OAAO,MAAA,KAAW,WAAA,EAAa;AAC/C,IAAA,SAAA,GAAY,CAAC,CAAA,KAAoB;AAC/B,MAAA,IAAI,CAAA,CAAE,gBAAgB,OAAA,EAAS;AAC/B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,IAAA,IAAQ,CAAA,CAAE,QAAQ,GAAA,EAAK;AACrC,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,UAAA,EAAW;AACX,IAAA,IAAI,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa;AAC9C,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACjD;AAAA,EACF,CAAA;AACF;;;AC7HO,SAAS,SAAA,GAEC;AACf,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0C;AAEhE,EAAA,SAAS,YAA+B,KAAA,EAAuC;AAC7E,IAAA,IAAI,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,SAAA,CAAU,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,SAASC,GAAAA,CACP,OACA,OAAA,EACY;AACZ,IAAA,MAAM,GAAA,GAAM,YAAY,KAAK,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,IACpB,CAAA;AAAA,EACF;AAEA,EAAA,SAAS,IAAA,CACP,OACA,OAAA,EACY;AACZ,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAAkB;AACjC,MAAA,GAAA,CAAI,OAAO,OAAO,CAAA;AAClB,MAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IACjB,CAAA;AACA,IAAA,OAAOA,GAAAA,CAAG,OAAO,OAAO,CAAA;AAAA,EAC1B;AAEA,EAAA,SAAS,IAAA,CAAwB,OAAU,OAAA,EAAqB;AAC9D,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC/B,IAAA,IAAI,GAAA,EAAK;AAEP,MAAA,KAAA,MAAW,OAAA,IAAW,CAAC,GAAG,GAAG,CAAA,EAAG;AAC9B,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACjB,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,MAAM,CAAA,8BAAA,EAAiC,MAAA,CAAO,KAAK,CAAC,MAAM,CAAC,CAAA;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,GAAA,CACP,OACA,OAAA,EACM;AACN,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC/B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,SAAS,KAAA,GAAc;AACrB,IAAA,SAAA,CAAU,KAAA,EAAM;AAAA,EAClB;AAEA,EAAA,OAAO,EAAE,EAAA,EAAAA,GAAAA,EAAI,IAAA,EAAM,IAAA,EAAM,KAAK,KAAA,EAAM;AACtC;;;AC9EO,SAAS,QAAA,CACd,SAAA,EACA,QAAA,EACA,KAAA,EACA,SACA,OAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAa;AAC7B,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,IAAI,EAAE,kBAAkB,WAAA,CAAA,EAAc;AAEtC,IAAA,MAAM,IAAA,GACJ,SAAA,YAAqB,QAAA,GAAW,SAAA,CAAU,eAAA,GAAkB,SAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAEvC,IAAA,IAAI,OAAA,YAAmB,WAAA,IAAe,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC5D,MAAA,OAAA,CAAQ,GAA6B,OAAO,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA;AAEA,EAAA,SAAA,CAAU,gBAAA,CAAiB,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAEnD,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,CAAU,mBAAA,CAAoB,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,EACxD,CAAA;AACF;;;ACzBA,SAAS,WAAW,KAAA,EAA8B;AAChD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAChE,EAAA,MAAM,SAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,KAAA;AAAA,IACP,GAAA,EAAK,KAAA;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,MAAA;AAAA,MACL,KAAK,SAAA;AACH,QAAA,SAAA,CAAU,IAAA,GAAO,IAAA;AACjB,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,SAAA,CAAU,GAAA,GAAM,IAAA;AAChB,QAAA;AAAA,MACF,KAAK,MAAA;AAAA,MACL,KAAK,KAAA;AAAA,MACL,KAAK,SAAA;AACH,QAAA,SAAA,CAAU,IAAA,GAAO,IAAA;AACjB,QAAA;AAAA,MACF;AACE,QAAA,SAAA,CAAU,GAAA,GAAM,IAAA;AAAA;AACpB,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,YAAA,CAAa,GAAkB,MAAA,EAA8B;AACpE,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,CAAO,IAAA,EAAM,OAAO,KAAA;AACtC,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,CAAO,KAAA,EAAO,OAAO,KAAA;AACxC,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,GAAA,EAAK,OAAO,KAAA;AACpC,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,MAAA,CAAO,IAAA,EAAM,OAAO,KAAA;AACtC,EAAA,OAAO,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,MAAA,CAAO,GAAA;AACxC;AAiBO,SAAS,KAAA,CACd,KAAA,EACA,OAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,MAAA,GAAsB,SAAS,MAAA,IAAU,QAAA;AAC/C,EAAA,MAAM,oBAAA,GAAuB,SAAS,cAAA,IAAkB,IAAA;AACxD,EAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAE/B,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAa;AAC7B,IAAA,IAAI,EAAE,aAAa,aAAA,CAAA,EAAgB;AACnC,IAAA,IAAI,YAAA,CAAa,CAAA,EAAG,MAAM,CAAA,EAAG;AAC3B,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,CAAA,CAAE,cAAA,EAAe;AAAA,MACnB;AACA,MAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IACX;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,QAAQ,CAAA;AAE3C,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,QAAQ,CAAA;AAAA,EAChD,CAAA;AACF;;;AC5FO,SAAS,CAAA,CACd,UACAN,OAAAA,EACU;AACV,EAAA,OAAA,CAAQA,OAAAA,IAAU,QAAA,EAAU,aAAA,CAAiB,QAAQ,CAAA;AACvD;AAUO,SAAS,EAAA,CACd,UACAA,OAAAA,EACK;AACL,EAAA,OAAO,MAAM,IAAA,CAAA,CAAMA,OAAAA,IAAU,QAAA,EAAU,gBAAA,CAAoB,QAAQ,CAAC,CAAA;AACtE;;;AC3BO,SAAS,QAAA,CAAS,OAAoB,OAAA,EAAyB;AACpE,EAAA,EAAA,CAAG,SAAA,CAAU,GAAA,CAAI,GAAG,OAAO,CAAA;AAC7B;AAGO,SAAS,WAAA,CAAY,OAAoB,OAAA,EAAyB;AACvE,EAAA,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,GAAG,OAAO,CAAA;AAChC;AAGO,SAAS,WAAA,CACd,EAAA,EACA,SAAA,EACA,KAAA,EACS;AACT,EAAA,OAAO,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,SAAA,EAAW,KAAK,CAAA;AAC7C;AASO,SAAS,QAAA,CACd,IACA,MAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAKH,MAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAIA,WAAU,MAAA,EAAW;AACvB,MAAC,EAAA,CAAG,KAAA,CAAc,GAAG,CAAA,GAAIA,MAAAA;AAAA,IAC3B;AAAA,EACF;AACF;AASO,SAAS,OAAA,CACd,IACA,KAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,IAAA,EAAMA,MAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjD,IAAA,IAAIA,MAAAA,KAAU,KAAA,IAASA,MAAAA,KAAU,IAAA,EAAM;AACrC,MAAA,EAAA,CAAG,gBAAgB,IAAI,CAAA;AAAA,IACzB,CAAA,MAAA,IAAWA,WAAU,IAAA,EAAM;AACzB,MAAA,EAAA,CAAG,YAAA,CAAa,MAAM,EAAE,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,EAAA,CAAG,YAAA,CAAa,MAAMA,MAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AACF;AAGO,SAAS,OAAA,CAAQ,IAAiB,IAAA,EAAoB;AAC3D,EAAA,EAAA,CAAG,WAAA,GAAc,IAAA;AACnB;AAQO,SAAS,aAAA,CAAc,IAAiB,IAAA,EAAoB;AACjE,EAAA,EAAA,CAAG,SAAA,GAAY,IAAA;AACjB;;;ACvEO,SAAS,OAAA,CACd,IACA,QAAA,EACU;AACV,EAAA,OAAO,EAAA,CAAG,QAAW,QAAQ,CAAA;AAC/B;AAGO,SAAS,QAAA,CACd,IACA,QAAA,EACK;AACL,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA;AAClC,EAAA,IAAI,CAAC,UAAU,OAAO,GAAA;AACtB,EAAA,OAAO,IAAI,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACtD;AAGO,SAAS,QAAA,CACd,IACA,QAAA,EACK;AACL,EAAA,MAAM,WAAW,EAAA,CAAG,aAAA;AACpB,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACxC,EAAA,MAAM,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,EAAE,CAAA;AAC/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,OAAO,KAAK,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACvD;AAGO,SAAS,OACd,EAAA,EACU;AACV,EAAA,OAAO,EAAA,CAAG,aAAA;AACZ;AAGO,SAAS,WAAA,CACd,IACA,QAAA,EACU;AACV,EAAA,IAAI,MAAM,EAAA,CAAG,kBAAA;AACb,EAAA,OAAO,GAAA,EAAK;AACV,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,IAAI,CAAC,QAAA,IAAY,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACtC,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,GAAA,GAAM,GAAA,CAAI,kBAAA;AAAA,EACZ;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,WAAA,CACd,IACA,QAAA,EACU;AACV,EAAA,IAAI,MAAM,EAAA,CAAG,sBAAA;AACb,EAAA,OAAO,GAAA,EAAK;AACV,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,IAAI,CAAC,QAAA,IAAY,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACtC,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,GAAA,GAAM,GAAA,CAAI,sBAAA;AAAA,EACZ;AACA,EAAA,OAAO,IAAA;AACT;;;ACjEO,SAAS,QAAA,CACd,IACA,OAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AAC/C,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,EAAA,OAAO,MAAM;AACX,IAAA,QAAA,CAAS,UAAA,EAAW;AAAA,EACtB,CAAA;AACF;AAOO,SAAS,WAAA,CACd,EAAA,EACA,OAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAqB,CAAC,OAAA,KAAY;AACrD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,GAAG,OAAO,CAAA;AACV,EAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,EAAA,OAAO,MAAM;AACX,IAAA,QAAA,CAAS,UAAA,EAAW;AAAA,EACtB,CAAA;AACF;AAQO,SAAS,UAAA,CACd,EAAA,EACA,OAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,CAAC,SAAA,KAAc;AACnD,IAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,EACnB,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,OAAA,IAAW,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAClE,EAAA,OAAO,MAAM;AACX,IAAA,QAAA,CAAS,UAAA,EAAW;AAAA,EACtB,CAAA;AACF","file":"index.js","sourcesContent":["/**\n * Forma DOM - Text\n *\n * Creates static or reactive Text nodes.\n * Zero dependencies -- native browser APIs only.\n */\n\nimport { internalEffect } from 'forma/reactive';\n\n/**\n * Create a Text node that is either static or reactively bound.\n *\n * - If `value` is a string, creates a plain Text node.\n * - If `value` is a function (signal getter), creates a Text node and sets up\n * an effect that auto-updates `textContent` whenever the signal changes.\n *\n * @returns The Text node.\n */\nexport function createText(value: string | (() => string)): Text {\n if (typeof value === 'function') {\n // \"Track Limits\": new Text() bypasses Document factory dispatch\n const node = new Text('');\n internalEffect(() => {\n // \"DAS\": CharacterData.data is the rawest text setter\n node.data = value();\n });\n return node;\n }\n return new Text(value);\n}\n","/**\n * Forma DOM - Mount\n *\n * Mounts a component function into a DOM container, returning an unmount handle.\n * Uses createRoot() for automatic effect disposal — no global state.\n *\n * When the container has `data-forma-ssr`, uses hydrateIsland() for zero-flash\n * descriptor-based hydration instead of tearing down and rebuilding the DOM.\n */\n\nimport { createUnownedRoot } from 'forma/reactive';\nimport { hydrateIsland } from './hydrate.js';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Mount a component into a DOM container.\n *\n * All effects created during the component's render are tracked via\n * `createRoot()` and automatically disposed when unmount is called.\n *\n * When `data-forma-ssr` is present on the container, the component runs\n * inside `createRoot` in hydration mode — h() returns descriptors that are\n * walked against SSR DOM to attach handlers and reactive bindings.\n *\n * @param component A function returning an HTMLElement or DocumentFragment.\n * @param container An HTMLElement or a CSS selector string.\n * @returns An unmount function that removes the DOM and disposes all effects.\n *\n * ```ts\n * const unmount = mount(() => h('h1', null, 'Hello'), '#app');\n * // later…\n * unmount();\n * ```\n */\nexport function mount(\n component: () => HTMLElement | DocumentFragment,\n container: HTMLElement | string,\n): () => void {\n const target =\n typeof container === 'string'\n ? document.querySelector<HTMLElement>(container)\n : container;\n\n if (!target) {\n throw new Error(`mount: container not found — \"${container}\"`);\n }\n\n let disposeRoot!: () => void;\n\n if (target.hasAttribute('data-forma-ssr')) {\n // SSR content present — hydrate in-place using descriptor-based adoption.\n // The component MUST run inside createRoot so effects are tracked.\n createUnownedRoot((dispose) => {\n disposeRoot = dispose;\n hydrateIsland(component, target);\n });\n } else {\n // Normal mount — clear and append\n const dom = createUnownedRoot((dispose) => {\n disposeRoot = dispose;\n return component();\n });\n target.innerHTML = '';\n target.appendChild(dom);\n }\n\n // Return unmount function\n let unmounted = false;\n return () => {\n if (unmounted) return;\n unmounted = true;\n disposeRoot();\n target.innerHTML = '';\n };\n}\n","/**\n * Forma DOM - Switch (Multi-branch Conditional)\n *\n * Maps a reactive value to one of N render branches.\n * Caches previously rendered nodes for instant swap-back.\n *\n * Each cached branch gets its own reactive root (ownership scope) so that:\n * 1. Inner effects survive when the switch effect re-runs (alien-signals\n * would otherwise dispose child effects linked to the parent).\n * 2. Inner effects are explicitly disposed when the branch is evicted\n * from the cache or the switch itself is torn down.\n *\n * SolidJS equivalent: <Switch><Match when={}>\n */\n\nimport { internalEffect, untrack, createRoot, registerDisposer } from 'forma/reactive';\n\n/** A single branch for {@link createSwitch}. */\nexport interface SwitchCase<T> {\n /** The value that activates this branch. */\n match: T;\n /** Factory function that renders this branch's DOM. */\n render: () => Node;\n}\n\n/** Cached branch: the rendered DOM node + a dispose function for its root. */\ninterface CachedBranch {\n node: Node;\n dispose: () => void;\n}\n\n/**\n * Multi-branch conditional rendering with node caching.\n *\n * ```ts\n * const [tab, setTab] = createSignal('home');\n * const fragment = createSwitch(tab, [\n * { match: 'home', render: () => h('div', null, 'Home page') },\n * { match: 'about', render: () => h('div', null, 'About page') },\n * { match: 'contact', render: () => h('div', null, 'Contact page') },\n * ], () => h('div', null, '404'));\n * ```\n *\n * Previously rendered branches are cached — switching back to a tab\n * re-inserts the cached node without re-rendering.\n */\nexport function createSwitch<T>(\n value: () => T,\n cases: SwitchCase<T>[],\n fallback?: () => Node,\n): DocumentFragment {\n const startMarker = document.createComment('forma-switch');\n const endMarker = document.createComment('/forma-switch');\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n // Branch cache: value → { node, dispose }\n // Each branch has its own reactive root for explicit lifecycle management.\n const cache = new Map<T, CachedBranch>();\n let currentNode: Node | null = null;\n let currentMatch: T | typeof UNSET = UNSET;\n\n const switchDispose = internalEffect(() => {\n const val = value();\n if (val === currentMatch) return; // Same branch, skip\n\n const DEBUG = typeof (globalThis as any).__FORMA_DEBUG__ !== 'undefined';\n if (DEBUG) console.log('[forma:switch] transition', String(currentMatch), '→', String(val));\n\n currentMatch = val;\n\n const parent = startMarker.parentNode;\n if (!parent) {\n if (DEBUG) console.warn('[forma:switch] markers not in DOM yet, skipping');\n return;\n }\n\n // Remove current content between markers.\n // If currentNode was a DocumentFragment, its children transferred to the\n // DOM on insertion and the fragment is now detached (parentNode === null).\n // We must scoop the children BACK into the fragment so the cache stays\n // valid for re-insertion later.\n if (currentNode) {\n if (currentNode.parentNode === parent) {\n if (DEBUG) console.log('[forma:switch] removing single node');\n parent.removeChild(currentNode);\n } else if (currentNode.nodeType === 11 /* DOCUMENT_FRAGMENT_NODE */) {\n // Scoop DOM nodes back into the fragment for cache reuse\n if (DEBUG) console.log('[forma:switch] scooping nodes back into fragment');\n let scooped = 0;\n while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {\n currentNode.appendChild(startMarker.nextSibling);\n scooped++;\n }\n if (DEBUG) console.log('[forma:switch] scooped', scooped, 'nodes back into fragment');\n } else {\n // Other detached node — just clear between markers\n if (DEBUG) console.log('[forma:switch] clearing detached node between markers');\n while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {\n parent.removeChild(startMarker.nextSibling);\n }\n }\n }\n\n // Find matching case\n const matchedCase = cases.find(c => c.match === val);\n if (matchedCase) {\n let entry = cache.get(val);\n if (!entry) {\n // Render inside a createRoot so child effects are tracked for\n // disposal, and inside untrack so they are NOT linked to the\n // switch effect (alien-signals disposes child effects on parent\n // re-run, which would kill reactivity in cached branches).\n let branchDispose!: () => void;\n const node = createRoot((dispose) => {\n branchDispose = dispose;\n return untrack(() => matchedCase.render());\n });\n entry = { node, dispose: branchDispose };\n cache.set(val, entry);\n if (DEBUG) console.log('[forma:switch] rendered new branch for', String(val), '→', node.nodeName, 'type', node.nodeType);\n } else {\n if (DEBUG) console.log('[forma:switch] reusing cached branch for', String(val), '→', entry.node.nodeName, 'type', entry.node.nodeType, 'childNodes', entry.node.childNodes?.length);\n }\n currentNode = entry.node;\n } else {\n // Fallback — not cached, effects are owned by the switch effect\n // and correctly torn down on next re-run.\n currentNode = fallback?.() ?? null;\n if (DEBUG) console.log('[forma:switch] no match, using fallback');\n }\n\n if (currentNode) {\n parent.insertBefore(currentNode, endMarker);\n if (DEBUG) console.log('[forma:switch] inserted', currentNode.nodeName, 'before end marker');\n }\n });\n\n // Defense-in-depth: when the parent root is disposed, explicitly dispose\n // all cached branches and clear references. The branch roots are already\n // auto-registered with the parent (Solid-style ownership), but the cache\n // Map still holds stale references that prevent GC.\n registerDisposer(() => {\n for (const entry of cache.values()) {\n entry.dispose();\n }\n cache.clear();\n currentNode = null;\n });\n\n // Attach a cleanup marker so external disposal (via disposeComponent or\n // parent root teardown) can clean up all cached branches.\n (fragment as any).__switchDispose = () => {\n switchDispose();\n for (const entry of cache.values()) {\n entry.dispose();\n }\n cache.clear();\n };\n\n return fragment;\n}\n\n// Sentinel value for \"no match yet\"\nconst UNSET = Symbol('unset');\n","/**\n * Forma DOM - Portal\n *\n * Renders children into a different DOM container than the parent.\n * Useful for modals, tooltips, dropdowns that need to escape overflow.\n *\n * SolidJS equivalent: <Portal mount={}>\n */\n\nimport { createEffect } from 'forma/reactive';\n\n/**\n * Render content into an external DOM container.\n *\n * ```ts\n * const modal = createPortal(\n * () => h('div', { class: 'modal' }, 'Modal content'),\n * document.body,\n * );\n * ```\n *\n * Returns a comment node placeholder. The actual content is rendered\n * into the target container. Cleanup removes content from target.\n */\nexport function createPortal(\n children: () => Node,\n target?: Element | string,\n): Comment {\n const placeholder = document.createComment('forma-portal');\n\n const resolvedTarget = typeof target === 'string'\n ? document.querySelector(target)\n : (target ?? document.body);\n\n if (!resolvedTarget) {\n throw new Error(`createPortal: target not found: ${target}`);\n }\n\n let mountedNode: Node | null = null;\n const removeMountedNode = () => {\n if (mountedNode && mountedNode.parentNode === resolvedTarget) {\n resolvedTarget.removeChild(mountedNode);\n }\n mountedNode = null;\n };\n\n createEffect(() => {\n const node = children();\n\n // Remove previous\n removeMountedNode();\n\n mountedNode = node;\n resolvedTarget.appendChild(node);\n\n // Ensure portal content is removed when the owner root disposes.\n return () => {\n removeMountedNode();\n };\n });\n\n return placeholder;\n}\n","/**\n * Forma DOM - Error Boundary\n *\n * Catches errors during rendering and shows a fallback UI.\n * Provides a retry function to re-attempt the original render.\n *\n * SolidJS equivalent: <ErrorBoundary fallback={}>\n */\n\nimport { createSignal, internalEffect } from 'forma/reactive';\n\n/**\n * Wrap a render function with error recovery.\n *\n * ```ts\n * const fragment = createErrorBoundary(\n * () => h('div', null, riskyComponent()),\n * (error, retry) => h('div', { class: 'error' },\n * h('p', null, `Error: ${error.message}`),\n * h('button', { onClick: retry }, 'Retry'),\n * ),\n * );\n * ```\n *\n * If `tryFn` throws, `catchFn` is called with the error and a retry function.\n * Calling `retry()` re-runs `tryFn`.\n */\nexport function createErrorBoundary(\n tryFn: () => Node,\n catchFn: (error: Error, retry: () => void) => Node,\n): DocumentFragment {\n const startMarker = document.createComment('forma-error-boundary');\n const endMarker = document.createComment('/forma-error-boundary');\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n const [retryCount, setRetryCount] = createSignal(0);\n let currentNode: Node | null = null;\n\n internalEffect(() => {\n // Subscribe to retryCount so retry() triggers re-run\n retryCount();\n\n const parent = startMarker.parentNode;\n if (!parent) return;\n\n // Remove current\n if (currentNode && currentNode.parentNode === parent) {\n parent.removeChild(currentNode);\n }\n\n try {\n currentNode = tryFn();\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n const retry = () => setRetryCount(c => c + 1);\n currentNode = catchFn(error, retry);\n }\n\n if (currentNode) {\n parent.insertBefore(currentNode, endMarker);\n }\n });\n\n return fragment;\n}\n","/**\n * Forma DOM - Suspense\n *\n * A Suspense boundary that shows fallback content while async resources\n * inside the children function are loading. Uses comment markers\n * (like createShow, createList) for zero-wrapper rendering.\n *\n * When all resources resolve, the fallback is swapped for the real content.\n * If a resource errors, the fallback remains (pair with createErrorBoundary\n * for error handling).\n *\n * SolidJS equivalent: <Suspense fallback={}>\n */\n\nimport { createSignal, internalEffect } from 'forma/reactive';\nimport {\n type SuspenseContext,\n pushSuspenseContext,\n popSuspenseContext,\n} from 'forma/reactive/suspense-context';\n\n// Re-export context utilities so consumers can import from dom/suspense\nexport { getSuspenseContext, pushSuspenseContext, popSuspenseContext } from 'forma/reactive/suspense-context';\nexport type { SuspenseContext } from 'forma/reactive/suspense-context';\n\n// ---------------------------------------------------------------------------\n// createSuspense\n// ---------------------------------------------------------------------------\n\n/**\n * Create a Suspense boundary that shows fallback content while async resources\n * inside the children function are loading.\n *\n * Uses comment markers: `<!--forma-suspense-->` / `<!--/forma-suspense-->`\n *\n * When all resources resolve, the fallback is swapped for the real content.\n * If a resource errors, the fallback remains (pair with createErrorBoundary\n * for errors).\n *\n * ```ts\n * const frag = createSuspense(\n * () => h('div', null, 'Loading...'),\n * () => {\n * const data = createResource(source, fetcher);\n * return h('div', null, () => data()?.name ?? '');\n * },\n * );\n * container.appendChild(frag);\n * ```\n */\nexport function createSuspense(\n fallback: () => Node,\n children: () => Node,\n): DocumentFragment {\n const startMarker = document.createComment('forma-suspense');\n const endMarker = document.createComment('/forma-suspense');\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n const [pending, setPending] = createSignal(0);\n let currentNode: Node | null = null;\n let resolvedNode: Node | null = null;\n let fallbackNode: Node | null = null;\n\n const ctx: SuspenseContext = {\n increment() { setPending(p => p + 1); },\n decrement() { setPending(p => Math.max(0, p - 1)); },\n };\n\n // Render children within the Suspense context so that any createResource\n // calls inside will register with this boundary.\n pushSuspenseContext(ctx);\n try {\n resolvedNode = children();\n } finally {\n popSuspenseContext();\n }\n\n // Reactively swap between fallback and children based on pending count\n internalEffect(() => {\n const parent = startMarker.parentNode;\n if (!parent) return;\n\n const isPending = pending() > 0;\n const newNode = isPending ? (fallbackNode ??= fallback()) : resolvedNode;\n\n if (newNode === currentNode) return;\n\n // Remove current node\n if (currentNode && currentNode.parentNode === parent) {\n parent.removeChild(currentNode);\n }\n\n // Insert new node\n if (newNode) {\n parent.insertBefore(newNode, endMarker);\n }\n\n currentNode = newNode;\n });\n\n return fragment;\n}\n","/**\n * Forma DOM - Template\n *\n * Runtime helper for compiled template output. Memoizes template parsing\n * so that each unique HTML string is parsed once and then cloned per use.\n *\n * The returned node should be cloned via `.cloneNode(true)` before use\n * in component instances.\n */\n\nconst cache = new Map<string, Node>();\n\n/**\n * Create a reusable template node from an HTML string.\n *\n * The returned node is a cached prototype. Callers must call\n * `.cloneNode(true)` to get a unique DOM tree for each component instance.\n */\nexport function template(html: string): Node {\n let node = cache.get(html);\n if (!node) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n node = tpl.content.firstChild!;\n cache.set(html, node);\n }\n return node;\n}\n\n/**\n * Create a reusable template DocumentFragment from an HTML string.\n *\n * Used when the template has multiple root nodes. The returned fragment\n * is a cached prototype; callers must call `.cloneNode(true)`.\n */\nexport function templateMany(html: string): DocumentFragment {\n let node = cache.get(html);\n if (!node) {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n node = tpl.content;\n cache.set(html, node);\n }\n return node.cloneNode(true) as DocumentFragment;\n}\n","/**\n * Forma DOM - Island Activation\n *\n * Discovers SSR-rendered islands via [data-forma-island] attributes,\n * loads props (inline or script_tag), and hydrates each island inside\n * an independent createRoot scope with try/catch error isolation.\n */\n\nimport { createUnownedRoot, __DEV__ } from 'forma/reactive';\nimport { hydrateIsland } from './hydrate.js';\n\n/**\n * Function that hydrates an island.\n *\n * @param el The root element of the island (`[data-forma-island]`).\n * Useful for layout measurement, focus management, CSS class\n * toggling, third-party library init, or reading extra `data-*`\n * attributes from the server-rendered shell.\n * @param props Parsed props from `data-forma-props` (inline or script block),\n * or `null` if no props were provided.\n * @returns A component tree (from `h()` calls) for descriptor-based\n * hydration, or `undefined` for imperative islands that set up\n * their own effects.\n */\nexport type IslandHydrateFn = (el: HTMLElement, props: Record<string, unknown> | null) => unknown;\n\nconst FORBIDDEN_PROP_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction sanitizeProps(obj: Record<string, unknown>): Record<string, unknown> {\n for (const key of FORBIDDEN_PROP_KEYS) {\n if (key in obj) delete (obj as any)[key];\n }\n return obj;\n}\n\n/**\n * Load props for an island from either inline attribute or shared script block.\n */\nfunction loadIslandProps(\n root: HTMLElement,\n id: number,\n sharedProps: Record<string, unknown> | null,\n): Record<string, unknown> | null {\n // Mode 1: Inline (small props, < 1KB)\n const inline = root.getAttribute('data-forma-props');\n if (inline) {\n return sanitizeProps(JSON.parse(inline));\n }\n\n // Mode 2: Script tag (1KB–50KB, pre-parsed)\n if (sharedProps && String(id) in sharedProps) {\n return sanitizeProps((sharedProps as any)[String(id)] as Record<string, unknown>);\n }\n\n // No props — island creates its own state\n return null;\n}\n\n/**\n * Discover and activate all SSR-rendered islands on the page.\n *\n * Each island is activated inside its own createRoot scope with try/catch\n * isolation — a broken island never takes down its siblings.\n *\n * @param registry Map of component names to hydration functions.\n */\nexport function activateIslands(registry: Record<string, IslandHydrateFn>): void {\n // Parse shared props once before the loop\n const scriptBlock = document.getElementById('__forma_islands');\n const sharedProps: Record<string, unknown> | null =\n scriptBlock ? JSON.parse(scriptBlock.textContent!) : null;\n\n const islands = document.querySelectorAll<HTMLElement>('[data-forma-island]');\n\n for (const root of islands) {\n const id = parseInt(root.getAttribute('data-forma-island')!, 10);\n const componentName = root.getAttribute('data-forma-component')!;\n const hydrateFn = registry[componentName];\n\n if (!hydrateFn) {\n if (__DEV__) console.warn(`[forma] No hydrate function for island \"${componentName}\" (id=${id})`);\n root.setAttribute('data-forma-status', 'error');\n continue;\n }\n\n const trigger = root.getAttribute('data-forma-hydrate') || 'load';\n\n if (trigger === 'visible') {\n // Defer hydration until island enters the viewport\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n observer.disconnect();\n hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n }\n },\n { rootMargin: '200px' },\n );\n observer.observe(root);\n } else if (trigger === 'idle') {\n const hydrate = () => hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n if (typeof requestIdleCallback === 'function') {\n requestIdleCallback(hydrate);\n } else {\n setTimeout(hydrate, 200);\n }\n } else if (trigger === 'interaction') {\n const hydrate = () => {\n root.removeEventListener('pointerdown', hydrate, true);\n root.removeEventListener('focusin', hydrate, true);\n hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n };\n root.addEventListener('pointerdown', hydrate, { capture: true, once: true });\n root.addEventListener('focusin', hydrate, { capture: true, once: true });\n } else {\n // load (default) — hydrate immediately\n hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);\n }\n }\n}\n\n/**\n * Dispose a single island, tearing down its reactive root and all effects.\n *\n * Safe to call multiple times (idempotent). Sets `data-forma-status` to\n * `\"disposed\"` so the island can be distinguished from active/error states.\n */\nexport function deactivateIsland(el: HTMLElement): void {\n const dispose = (el as any).__formaDispose;\n if (typeof dispose === 'function') {\n dispose();\n delete (el as any).__formaDispose;\n el.setAttribute('data-forma-status', 'disposed');\n }\n}\n\n/**\n * Dispose ALL active islands under a root element (or the whole document).\n *\n * Use this when swapping module content — e.g., replacing the contents of\n * a `<forma-stage>` Shadow DOM during AI generation. Prevents leaked effects\n * and event listeners from accumulating across swaps.\n */\nexport function deactivateAllIslands(root: Element | Document = document): void {\n const islands = root.querySelectorAll<HTMLElement>('[data-forma-status=\"active\"]');\n for (const island of islands) {\n deactivateIsland(island);\n }\n}\n\n/** Hydrate a single island root with error isolation. */\nfunction hydrateIslandRoot(\n root: HTMLElement,\n id: number,\n componentName: string,\n hydrateFn: IslandHydrateFn,\n sharedProps: Record<string, unknown> | null,\n): void {\n try {\n const props = loadIslandProps(root, id, sharedProps);\n root.setAttribute('data-forma-status', 'hydrating');\n\n // hydrateIsland may replace the shell element with the component's own\n // root element (CSR fallback for empty islands). Track the active root.\n let activeRoot: Element = root;\n createUnownedRoot((dispose) => {\n activeRoot = hydrateIsland(() => hydrateFn(root, props), root);\n (activeRoot as any).__formaDispose = dispose;\n });\n\n activeRoot.setAttribute('data-forma-status', 'active');\n } catch (err) {\n if (__DEV__) console.error(`[forma] Island \"${componentName}\" (id=${id}) failed:`, err);\n root.setAttribute('data-forma-status', 'error');\n }\n}\n","/**\n * Forma Component - Define\n *\n * Component definition system where the setup function runs ONCE.\n * Reactivity comes from signals, not re-rendering.\n * Backed by alien-signals via forma/reactive.\n */\n\nimport { reportError } from '../reactive/dev.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A teardown function that disposes effects and cleans up resources. */\nexport type CleanupFn = () => void;\n/** A function that runs once to build the component's DOM tree. */\nexport type SetupFn = () => HTMLElement | DocumentFragment;\n\n/** Definition object passed to {@link defineComponent}. */\nexport interface ComponentDef {\n /** The setup function that builds the component's DOM and reactive bindings. */\n setup: SetupFn;\n /** Optional debug name for devtools inspection. */\n name?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle context stack\n// ---------------------------------------------------------------------------\n\ninterface LifecycleContext {\n /** Dispose functions for all effects created during setup. */\n disposers: (() => void)[];\n /** Callbacks registered via onMount(). */\n mountCallbacks: (() => void | CleanupFn)[];\n /** Callbacks registered via onUnmount(). */\n unmountCallbacks: (() => void)[];\n}\n\nlet currentLifecycleContext: LifecycleContext | null = null;\nconst lifecycleStack: (LifecycleContext | null)[] = [];\n\nfunction pushLifecycleContext(ctx: LifecycleContext): void {\n lifecycleStack.push(currentLifecycleContext);\n currentLifecycleContext = ctx;\n}\n\nfunction popLifecycleContext(): void {\n currentLifecycleContext = lifecycleStack.pop() ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Public API - Lifecycle hooks\n// ---------------------------------------------------------------------------\n\n/**\n * Register a callback that runs after the component's setup completes.\n * If the callback returns a function, that function is called on unmount.\n * Must be called inside a setup function.\n */\nexport function onMount(fn: () => void | CleanupFn): void {\n if (currentLifecycleContext === null) {\n throw new Error('onMount() must be called inside a component setup function');\n }\n currentLifecycleContext.mountCallbacks.push(fn);\n}\n\n/**\n * Register a callback that runs when the component is disposed.\n * Must be called inside a setup function.\n */\nexport function onUnmount(fn: () => void): void {\n if (currentLifecycleContext === null) {\n throw new Error('onUnmount() must be called inside a component setup function');\n }\n currentLifecycleContext.unmountCallbacks.push(fn);\n}\n\n// ---------------------------------------------------------------------------\n// Internal: symbol for attaching dispose to DOM nodes\n// ---------------------------------------------------------------------------\n\nconst DISPOSE_KEY = Symbol('forma:component:dispose');\n\ninterface DisposableNode {\n [DISPOSE_KEY]?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Public API - defineComponent\n// ---------------------------------------------------------------------------\n\n/**\n * Define a component from a setup function or definition object.\n * Returns a factory function that, when called, produces a DOM element\n * with attached lifecycle and disposal logic.\n *\n * The setup function runs ONCE per factory call. Reactivity is driven\n * by signals, not by re-running setup.\n */\nexport function defineComponent(\n setupOrDef: SetupFn | ComponentDef,\n): () => HTMLElement | DocumentFragment {\n const setup: SetupFn =\n typeof setupOrDef === 'function' ? setupOrDef : setupOrDef.setup;\n const name: string | undefined =\n typeof setupOrDef === 'function' ? undefined : setupOrDef.name;\n\n return function componentFactory(): HTMLElement | DocumentFragment {\n // Create a fresh lifecycle context for this component instance\n const ctx: LifecycleContext = {\n disposers: [],\n mountCallbacks: [],\n unmountCallbacks: [],\n };\n\n // Push lifecycle context so onMount/onUnmount calls register here\n pushLifecycleContext(ctx);\n\n let dom: HTMLElement | DocumentFragment;\n try {\n dom = setup();\n } finally {\n popLifecycleContext();\n }\n\n // Build the dispose function that tears down the entire component\n const dispose = (): void => {\n // Run onUnmount callbacks\n for (const cb of ctx.unmountCallbacks) {\n try {\n cb();\n } catch (e) {\n reportError(e, 'onUnmount');\n }\n }\n\n // Dispose all effects\n for (const d of ctx.disposers) {\n try {\n d();\n } catch (e) {\n reportError(e, 'component disposer');\n }\n }\n\n // Clean up\n ctx.disposers.length = 0;\n ctx.mountCallbacks.length = 0;\n ctx.unmountCallbacks.length = 0;\n };\n\n // Attach dispose to the DOM node so callers can tear it down\n (dom as unknown as DisposableNode)[DISPOSE_KEY] = dispose;\n\n // Run mount callbacks (synchronously, after setup completes)\n // If a mount callback returns a cleanup, register it as an unmount callback\n for (const cb of ctx.mountCallbacks) {\n try {\n const cleanup = cb();\n if (typeof cleanup === 'function') {\n ctx.unmountCallbacks.push(cleanup);\n }\n } catch (e) {\n reportError(e, 'onMount');\n }\n }\n\n return dom;\n };\n}\n\n/**\n * Dispose a component that was created via defineComponent.\n * This runs all onUnmount callbacks and disposes all tracked effects.\n */\nexport function disposeComponent(dom: HTMLElement | DocumentFragment): void {\n const disposable = dom as unknown as DisposableNode;\n if (typeof disposable[DISPOSE_KEY] === 'function') {\n disposable[DISPOSE_KEY]();\n delete disposable[DISPOSE_KEY];\n }\n}\n\n/**\n * Track an effect disposal within the current component's lifecycle.\n * Call this inside a setup function to ensure effects are cleaned up\n * when the component is disposed.\n */\nexport function trackDisposer(dispose: () => void): void {\n if (currentLifecycleContext !== null) {\n currentLifecycleContext.disposers.push(dispose);\n }\n}\n","/**\n * Forma Component - Context\n *\n * Dependency injection via stack-based context.\n * Simpler than React's Provider component tree: provide() pushes a value,\n * inject() reads the top, component teardown pops automatically.\n * Zero dependencies -- native browser APIs only.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A typed dependency injection context created by {@link createContext}. */\nexport interface Context<T> {\n /** Unique identifier for this context. */\n readonly id: symbol;\n /** Value returned when no provider is active. */\n readonly defaultValue: T;\n}\n\n// ---------------------------------------------------------------------------\n// Internal storage\n// ---------------------------------------------------------------------------\n\n/**\n * Per-context value stacks.\n * Each context id maps to a stack of provided values.\n * The top of the stack is the \"current\" value.\n */\nconst contextStacks = new Map<symbol, unknown[]>();\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new context with a default value.\n *\n * ```ts\n * const ThemeCtx = createContext('light');\n * ```\n */\nexport function createContext<T>(defaultValue: T): Context<T> {\n return {\n id: Symbol('forma:context'),\n defaultValue,\n };\n}\n\n/**\n * Provide a value for a context.\n * The value is pushed onto the context's stack and will be returned by\n * inject() until it is removed via unprovide() or overridden by a nested provide().\n *\n * ```ts\n * provide(ThemeCtx, 'dark');\n * ```\n */\nexport function provide<T>(ctx: Context<T>, value: T): void {\n let stack = contextStacks.get(ctx.id);\n if (stack === undefined) {\n stack = [];\n contextStacks.set(ctx.id, stack);\n }\n stack.push(value);\n}\n\n/**\n * Read the current value of a context.\n * Returns the most recently provided value, or the default if none was provided.\n *\n * ```ts\n * const theme = inject(ThemeCtx); // 'dark' if provided, else 'light'\n * ```\n */\nexport function inject<T>(ctx: Context<T>): T {\n const stack = contextStacks.get(ctx.id);\n if (stack === undefined || stack.length === 0) {\n return ctx.defaultValue;\n }\n return stack[stack.length - 1] as T;\n}\n\n/**\n * Remove the most recent provided value for a context.\n * Used during component teardown to restore the previous scope.\n *\n * ```ts\n * unprovide(ThemeCtx);\n * ```\n */\nexport function unprovide<T>(ctx: Context<T>): void {\n const stack = contextStacks.get(ctx.id);\n if (stack !== undefined && stack.length > 0) {\n stack.pop();\n // Clean up empty stacks to avoid memory leaks\n if (stack.length === 0) {\n contextStacks.delete(ctx.id);\n }\n }\n}\n","/**\n * Forma State - Store\n *\n * Deep reactive store with path-based signal granularity.\n * Every property path (e.g. `user.name`, `items.0.done`) gets its own signal,\n * so only effects that read a specific path are notified when it changes.\n *\n * Inspired by SolidJS's createStore and Vue's reactive(), with:\n * - Lazy proxy wrapping (child objects proxied on first access)\n * - Structural sharing (replacing an object invalidates child signals)\n * - Array mutation batching (push/pop/splice/sort etc. batch their signals)\n *\n * Backed by alien-signals via forma/reactive.\n */\n\nimport { createSignal, batch, untrack, value } from 'forma/reactive';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype SignalPair = [get: () => unknown, set: (v: unknown) => void];\n\n/** Setter for a reactive store — accepts a partial update object or updater function. */\nexport type StoreSetter<T extends object> = (\n partial: Partial<T> | ((prev: T) => Partial<T>),\n) => void;\n\n// ---------------------------------------------------------------------------\n// Symbols\n// ---------------------------------------------------------------------------\n\n/** Access the underlying raw (unproxied) object from a store proxy. */\nconst RAW = Symbol('forma-raw');\n\n/** Marker: true on every store proxy so we can detect them. */\nconst PROXY = Symbol('forma-proxy');\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst ARRAY_MUTATORS = new Set([\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse',\n 'fill',\n 'copyWithin',\n]);\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n if (v == null || typeof v !== 'object') return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null || Array.isArray(v);\n}\n\nfunction shouldWrap(v: unknown): v is object {\n if (v == null || typeof v !== 'object') return false;\n // Don't wrap special built-ins (Date, RegExp, Map, Set, etc.)\n if (v instanceof Date || v instanceof RegExp || v instanceof Map ||\n v instanceof Set || v instanceof WeakMap || v instanceof WeakSet ||\n v instanceof Error || v instanceof Promise) {\n return false;\n }\n // Already a store proxy — no double wrapping\n if ((v as any)[PROXY]) return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Deep-clone helper (used for functional setter snapshots)\n// ---------------------------------------------------------------------------\n\nfunction deepClone(obj: unknown, seen?: WeakSet<object>): unknown {\n if (obj === null || typeof obj !== 'object') return obj;\n if (!seen) seen = new WeakSet();\n if (seen.has(obj as object)) return obj; // circular — return ref as-is\n seen.add(obj as object);\n if (Array.isArray(obj)) return obj.map(item => deepClone(item, seen));\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n out[key] = deepClone((obj as any)[key], seen);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a deep reactive store.\n *\n * Returns a tuple of `[getter proxy, setter function]`.\n * The getter proxy tracks reads at every property path via dedicated signals.\n * Setting a property (either via `setState()` or direct mutation like\n * `state.user.name = 'Bob'`) only notifies effects that actually read that\n * specific path.\n *\n * ```ts\n * const [state, setState] = createStore({\n * count: 0,\n * user: { name: 'Alice', age: 30 },\n * items: [{ text: 'Buy milk', done: false }],\n * });\n *\n * // Fine-grained reads\n * state.user.name; // tracked at path \"user.name\"\n * state.items[0].done; // tracked at path \"items.0.done\"\n *\n * // Setter API (batched)\n * setState({ count: 1 });\n * setState(prev => ({ count: prev.count + 1 }));\n *\n * // Direct mutation (via Proxy set trap)\n * state.user.name = 'Bob'; // only \"user.name\" subscribers notified\n * state.items[0].done = true;\n *\n * // Array mutations\n * state.items.push({ text: 'Walk dog', done: false });\n * ```\n *\n * **Limitation:** `Object.keys(state)`, `for...in`, and spread (`{...state}`)\n * are NOT reactive. Adding or removing a property will not trigger effects\n * that iterated over keys. Use signals or explicit arrays for collections\n * that need to react to membership changes.\n */\nexport function createStore<T extends object>(\n initial: T,\n): [get: T, set: StoreSetter<T>] {\n // -------------------------------------------------------------------------\n // Signal-per-path map\n // -------------------------------------------------------------------------\n\n /** Map of dot-separated paths -> signal pairs. */\n const signals = new Map<string, SignalPair>();\n\n /** Parent path -> set of direct child paths for O(1) child invalidation. */\n const children = new Map<string, Set<string>>();\n\n /**\n * Per-array-path \"version\" signals. alien-signals dedupes by identity and a\n * custom `equals` can only suppress (not force) a notify, so an in-place array\n * mutation cannot be signalled by re-setting the array reference. A monotonic\n * counter bumped with a functional updater always notifies, so effects that\n * read an array itself (iteration/.map/length) re-run on any mutation.\n */\n const arrayVersions = new Map<string, SignalPair>();\n function getArrayVersion(path: string): SignalPair {\n let p = arrayVersions.get(path);\n if (!p) { p = createSignal<unknown>(0) as SignalPair; arrayVersions.set(path, p); }\n return p;\n }\n function bumpArrayVersion(path: string): void {\n const p = arrayVersions.get(path);\n if (p) p[1]((n: number) => n + 1);\n }\n\n /**\n * Register a signal path with its parent in the adjacency map.\n * This allows walking the tree instead of scanning all signals.\n */\n function registerChild(path: string): void {\n const lastDot = path.lastIndexOf('.');\n if (lastDot === -1) return; // root-level, no parent\n const parentPath = path.substring(0, lastDot);\n let set = children.get(parentPath);\n if (!set) { set = new Set(); children.set(parentPath, set); }\n set.add(path);\n }\n\n /**\n * Get or create the signal for a given path.\n * When creating, seeds with `initialValue`.\n */\n function getSignal(path: string, initialValue?: unknown): SignalPair {\n let pair = signals.get(path);\n if (!pair) {\n pair = createSignal<unknown>(initialValue) as SignalPair;\n signals.set(path, pair);\n registerChild(path);\n }\n return pair;\n }\n\n // -------------------------------------------------------------------------\n // Proxy cache (raw object -> proxy)\n // -------------------------------------------------------------------------\n\n /**\n * Proxies keyed by (raw object -> basePath -> proxy). The two-level map is\n * required because the same raw object can be aliased at multiple paths\n * (`state.a = state.b = shared`); each path needs its own proxy so writes\n * notify the correct path signal. Entries are GC'd with the raw object.\n */\n const proxyCache = new WeakMap<object, Map<string, object>>();\n\n // -------------------------------------------------------------------------\n // Invalidation\n // -------------------------------------------------------------------------\n\n /**\n * Recursively delete all child signals using the adjacency map.\n * Called when an entire sub-tree is replaced so stale signals are not reused.\n * O(k) where k = number of descendant signals, instead of O(n) over all signals.\n */\n function invalidateChildren(parentPath: string): void {\n const childSet = children.get(parentPath);\n if (!childSet) return;\n for (const childPath of childSet) {\n // Recursively invalidate grandchildren first\n invalidateChildren(childPath);\n // Remove the signal itself\n signals.delete(childPath);\n // Clean up this child's entry in the adjacency map\n children.delete(childPath);\n }\n // Clear the parent's children set (all children have been removed)\n childSet.clear();\n }\n\n function lastSegment(path: string): string {\n const d = path.lastIndexOf('.');\n return d === -1 ? path : path.substring(d + 1);\n }\n\n /**\n * Set a path signal to a literal value. The signal setter interprets a\n * function value as a functional updater, so a stored function (e.g. an array\n * method like `items.map` read as a child path) must be wrapped with `value()`\n * or it would be called as `fn(prev)` and throw.\n */\n function setLiteral(pair: SignalPair, v: unknown): void {\n pair[1](typeof v === 'function' ? value(v) : v);\n }\n\n /**\n * NOTIFY (not delete) each existing child signal of `parentPath` with its\n * re-read value from the mutated raw parent — indices beyond a new length read\n * back undefined, notifying their effects. Recurses into surviving object\n * children; children that became primitive/absent have their subtrees deleted.\n * Walks only children.get(parentPath) (O(k)), never all signals.\n */\n function reconcileChildren(parentPath: string, rawParent: unknown): void {\n const set = children.get(parentPath);\n if (!set) return;\n for (const childPath of set) {\n const key = lastSegment(childPath);\n const nv = (rawParent as Record<string, unknown>)[key];\n const pair = signals.get(childPath);\n if (pair) setLiteral(pair, nv);\n if (nv != null && typeof nv === 'object') {\n reconcileChildren(childPath, nv);\n } else {\n invalidateChildren(childPath);\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Proxy factory (lazy, recursive)\n // -------------------------------------------------------------------------\n\n function wrap(raw: object, basePath: string): object {\n // Primitives / non-wrappable values pass through\n if (!shouldWrap(raw)) return raw;\n\n // Return the cached proxy for this (raw, basePath) pair if we have one.\n let byPath = proxyCache.get(raw);\n if (byPath) {\n const hit = byPath.get(basePath);\n if (hit) return hit;\n }\n\n const isArr = Array.isArray(raw);\n // Pre-compute the path prefix to avoid repeated string concatenation in hot paths\n const basePrefix = basePath ? basePath + '.' : '';\n\n const proxy: object = new Proxy(raw, {\n // -------------------------------------------------------------------\n // GET\n // -------------------------------------------------------------------\n get(target: any, prop: PropertyKey, receiver: unknown): unknown {\n // Escape hatches\n if (prop === RAW) return target;\n if (prop === PROXY) return true;\n\n // Symbols pass through (Symbol.iterator, Symbol.toPrimitive, etc.)\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver);\n }\n\n const key = String(prop);\n // Cache-friendly path construction: avoid template literals in hot path\n const childPath = basePrefix + key;\n\n // ------------------------------------------------------------------\n // Array mutator methods — wrap to batch signal updates\n // ------------------------------------------------------------------\n if (isArr && ARRAY_MUTATORS.has(key)) {\n return (...args: unknown[]) => {\n let result: unknown;\n batch(() => {\n // Unwrap proxy arguments (e.g. pushing a store proxy)\n const rawArgs = args.map((a) =>\n a != null && typeof a === 'object' && (a as any)[RAW]\n ? (a as any)[RAW]\n : a,\n );\n result = (target as any)[key].apply(target, rawArgs);\n\n // Notify (not delete) every child signal with its re-read value so\n // index/length/nested effects re-run instead of being orphaned.\n reconcileChildren(basePath, target);\n\n // Notify the length signal (plain set — an unchanged length, e.g.\n // splice 5->5, correctly does not re-fire length-only effects).\n const lenPair = signals.get(basePrefix + 'length');\n if (lenPair) lenPair[1]((target as unknown[]).length);\n\n // Bump the array's own-path version so iteration/.map effects re-run.\n if (basePath) bumpArrayVersion(basePath);\n });\n return result;\n };\n }\n\n // ------------------------------------------------------------------\n // Array `length` — special-case so it's always tracked\n // ------------------------------------------------------------------\n if (isArr && key === 'length') {\n const [getter] = getSignal(childPath, target.length);\n getter(); // subscribe\n return target.length;\n }\n\n // ------------------------------------------------------------------\n // Regular property access\n // ------------------------------------------------------------------\n const value = Reflect.get(target, prop);\n\n // Resolve the live signal for this path (no inline cache — it could not\n // be invalidated when invalidateChildren/deleteProperty removed the\n // signal, which split reads and writes across two signal objects).\n const pair = getSignal(childPath, value);\n pair[0](); // subscribe to this path\n\n // Subscribe array reads to the array's own-path version so any in-place\n // mutation (push/splice/sort/truncate) re-runs iteration/.map effects.\n if (Array.isArray(value)) {\n getArrayVersion(childPath)[0]();\n }\n\n // Lazily wrap child objects/arrays\n if (shouldWrap(value)) {\n return wrap(value, childPath);\n }\n\n return value;\n },\n\n // -------------------------------------------------------------------\n // SET\n // -------------------------------------------------------------------\n set(target: any, prop: PropertyKey, value: unknown): boolean {\n if (typeof prop === 'symbol') {\n return Reflect.set(target, prop, value);\n }\n\n const key = String(prop);\n const childPath = basePrefix + key;\n\n // Unwrap if the value being set is itself a proxy\n const rawValue =\n value != null && typeof value === 'object' && (value as any)[RAW]\n ? (value as any)[RAW]\n : value;\n\n // Capture the old raw value BEFORE overwriting so we can evict its proxy.\n const oldRaw = Reflect.get(target, prop);\n\n // Write to the underlying object\n Reflect.set(target, prop, rawValue);\n\n // If we're replacing with a DIFFERENT object, invalidate child signals\n // and evict the old value's proxy for this path. Guard on oldRaw !==\n // rawValue: re-assigning the identical object (state.x = state.x) must\n // NOT invalidate descendants, which would orphan their subscribers.\n if (rawValue != null && typeof rawValue === 'object' && oldRaw !== rawValue) {\n invalidateChildren(childPath);\n evictProxy(oldRaw, childPath);\n }\n\n // Update the length signal when setting indexed array elements\n if (isArr && key !== 'length') {\n const lengthPath = basePrefix + 'length';\n const lenPair = signals.get(lengthPath);\n if (lenPair) {\n lenPair[1](target.length);\n }\n }\n\n // Truncating (or growing) via `arr.length = n`: notify the dropped index\n // signals (they read back undefined) and the array's own-path version.\n if (isArr && key === 'length') {\n batch(() => {\n reconcileChildren(basePath, target);\n if (basePath) bumpArrayVersion(basePath);\n });\n }\n\n // Notify (or create) the signal for this path\n const [, setter] = getSignal(childPath, rawValue);\n setter(rawValue);\n\n return true;\n },\n\n // -------------------------------------------------------------------\n // HAS — track membership checks\n // -------------------------------------------------------------------\n has(target: any, prop: PropertyKey): boolean {\n if (typeof prop === 'symbol') {\n return Reflect.has(target, prop);\n }\n const key = String(prop);\n const childPath = basePrefix + key;\n // Subscribe so that `'x' in state` is tracked\n const [getter] = getSignal(childPath, Reflect.get(target, prop));\n getter();\n return Reflect.has(target, prop);\n },\n\n // -------------------------------------------------------------------\n // OWNKEYS — return keys from the raw target\n // -------------------------------------------------------------------\n ownKeys(target: any): (string | symbol)[] {\n return Reflect.ownKeys(target);\n },\n\n // -------------------------------------------------------------------\n // GETOWNPROPERTYDESCRIPTOR — needed for Object.keys / spread / ...\n // -------------------------------------------------------------------\n getOwnPropertyDescriptor(target: any, prop: PropertyKey) {\n return Object.getOwnPropertyDescriptor(target, prop);\n },\n\n // -------------------------------------------------------------------\n // DELETEPROPERTY — clean up signals when a key is removed\n // -------------------------------------------------------------------\n deleteProperty(target: any, prop: PropertyKey): boolean {\n if (typeof prop === 'symbol') {\n return Reflect.deleteProperty(target, prop);\n }\n\n const key = String(prop);\n const childPath = basePrefix + key;\n\n const oldRaw = Reflect.get(target, prop);\n const result = Reflect.deleteProperty(target, prop);\n\n // Notify subscribers of state.x and 'x' in state (they share childPath)\n // of the removal. KEEP the path's own signal (bound to undefined) — like\n // object-replace does via invalidateChildren — so re-adding the key\n // re-uses the same signal and its subscribers are notified. Deleting the\n // signal would orphan them (a fresh signal would be minted on re-add).\n const delPair = signals.get(childPath);\n if (delPair) delPair[1](undefined);\n\n // Evict the removed value's proxy for this path.\n evictProxy(oldRaw, childPath);\n\n // Remove DESCENDANT signals (childPath's own signal stays bound).\n invalidateChildren(childPath);\n\n return result;\n },\n });\n\n if (!byPath) { byPath = new Map(); proxyCache.set(raw, byPath); }\n byPath.set(basePath, proxy);\n return proxy;\n }\n\n /** Evict the cached proxy bound to `path` for a raw object being replaced/removed. */\n function evictProxy(oldRaw: unknown, path: string): void {\n if (oldRaw == null || typeof oldRaw !== 'object') return;\n const om = proxyCache.get(oldRaw as object);\n if (om) {\n om.delete(path);\n if (om.size === 0) proxyCache.delete(oldRaw as object);\n }\n }\n\n // -------------------------------------------------------------------------\n // Root proxy\n // -------------------------------------------------------------------------\n\n const rootProxy = wrap(initial, '') as T;\n\n // -------------------------------------------------------------------------\n // Snapshot (for functional setter)\n // -------------------------------------------------------------------------\n\n /**\n * Produce a plain-object snapshot of the store's current state.\n * Reads are untracked so calling `setState(prev => ...)` inside an effect\n * does not create additional subscriptions.\n */\n function getCurrentSnapshot(): T {\n return untrack(() => deepClone(initial) as T);\n }\n\n // -------------------------------------------------------------------------\n // Setter\n // -------------------------------------------------------------------------\n\n const setter: StoreSetter<T> = (\n partial: Partial<T> | ((prev: T) => Partial<T>),\n ) => {\n // Resolve functional updates by snapshotting current state\n const updates: Partial<T> =\n typeof partial === 'function' ? partial(getCurrentSnapshot()) : partial;\n\n // Batch all top-level key writes so effects run only once\n batch(() => {\n for (const key of Object.keys(updates) as (keyof T & string)[]) {\n (rootProxy as Record<string, unknown>)[key] = (updates as Record<string, unknown>)[key];\n }\n });\n };\n\n return [rootProxy, setter];\n}\n","/**\n * Forma State - History\n *\n * Undo/redo for any signal. Tracks changes and maintains undo/redo stacks\n * with reactive canUndo/canRedo signals.\n * Zero dependencies -- native browser APIs only.\n */\n\nimport { createSignal, internalEffect, batch } from 'forma/reactive';\n\n// ---------------------------------------------------------------------------\n// Snapshot helper — clone plain values so a later in-place mutation of a value\n// stored in (or restored from) the history stack cannot corrupt other entries.\n// Non-plain objects (Date/RegExp/Map/Set/class instances) pass by reference.\n// ---------------------------------------------------------------------------\n\nfunction cloneEntry<V>(v: V, seen?: WeakSet<object>): V {\n if (v === null || typeof v !== 'object') return v;\n const proto = Object.getPrototypeOf(v);\n if (!Array.isArray(v) && proto !== Object.prototype && proto !== null) return v;\n if (!seen) seen = new WeakSet();\n if (seen.has(v as unknown as object)) return v; // circular — return as-is\n seen.add(v as unknown as object);\n if (Array.isArray(v)) return (v.map((i) => cloneEntry(i, seen)) as unknown) as V;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v as Record<string, unknown>)) {\n out[k] = cloneEntry((v as Record<string, unknown>)[k], seen);\n }\n return out as unknown as V;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Undo/redo controls returned by {@link createHistory}. */\nexport interface HistoryControls<T> {\n /** Undo the last change, restoring the previous value. */\n undo: () => void;\n /** Redo the last undone change. */\n redo: () => void;\n /** Reactive getter: true if undo is available. */\n canUndo: () => boolean;\n /** Reactive getter: true if redo is available. */\n canRedo: () => boolean;\n /** Reactive getter: the full history stack (past + current + future). */\n history: () => T[];\n /** Reactive getter: current position in the history stack (0-based). */\n cursor: () => number;\n /** Clear all history, keeping only the current value. */\n clear: () => void;\n /** Stop tracking the source signal and release the history stack. */\n destroy: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create undo/redo history tracking for a signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const h = createHistory([count, setCount], { maxLength: 50 });\n *\n * setCount(1);\n * setCount(2);\n * h.undo(); // count() === 1\n * h.redo(); // count() === 2\n * h.canUndo(); // true (reactive)\n * ```\n *\n * **Limitation:** the source must be a signal whose getter returns a stable\n * value (a primitive or a stable object reference). A `createStore` slice whose\n * getter returns a *fresh proxy on every read* is not supported: the undo/redo\n * echo guard compares by identity, so a new proxy each read makes every\n * undo/redo look like an external change and clears the redo history. Track\n * store state with `setState`/direct mutation, not `createHistory`.\n */\nexport function createHistory<T>(\n source: [get: () => T, set: (v: T) => void],\n options?: { maxLength?: number },\n): HistoryControls<T> {\n const [sourceGet, sourceSet] = source;\n // Clamp to >= 1 so the current entry is always retained (maxLength 0 would\n // empty the stack and leave the cursor at -1).\n const maxLength = Math.max(1, options?.maxLength ?? 100);\n\n // ---------- Internal mutable state (not signals) ----------\n // We use plain arrays/numbers to avoid creating signal dependencies\n // inside the source-tracking effect, which would cause re-entrance issues.\n let _stack: T[] = [cloneEntry(sourceGet())];\n let _cursor = 0;\n\n // ---------- Reactive output signals ----------\n // These are signals that external consumers can subscribe to.\n // We update them explicitly after every mutation.\n const [stackSignal, setStackSignal] = createSignal<T[]>([..._stack]);\n const [cursorSignal, setCursorSignal] = createSignal(_cursor);\n // Separate signal for stack length so canRedo only depends on numeric\n // signals and doesn't re-fire when array reference changes but length stays.\n const [stackLenSignal, setStackLenSignal] = createSignal(_stack.length);\n\n /** Sync the reactive output signals with internal mutable state. */\n function syncSignals(): void {\n batch(() => {\n setStackSignal([..._stack]);\n setCursorSignal(_cursor);\n setStackLenSignal(_stack.length);\n });\n }\n\n // Distinguish our own undo/redo echo from a genuine external set. A bare\n // boolean assumed 1 set -> 1 effect run, which breaks under batch() (multiple\n // sets collapse to one flush) and under a custom `equals` that suppresses the\n // echo. Instead capture the exact value we restored and match it by identity.\n const NONE = Symbol('none');\n let _expected: T | typeof NONE = NONE;\n let isFirstRun = true;\n\n // Watch the source signal for external changes\n const disposeEffect = internalEffect(() => {\n const value = sourceGet();\n\n // Skip the initial effect run -- the initial value is already in the stack\n if (isFirstRun) {\n isFirstRun = false;\n return;\n }\n\n // Our own undo/redo echo — consume the guard and record nothing.\n if (_expected !== NONE && Object.is(value, _expected)) {\n _expected = NONE;\n return;\n }\n // Any other value is a real external change; clear a stale guard (so a\n // custom-equals-suppressed echo cannot eat this set) and record it.\n _expected = NONE;\n\n // Discard any \"future\" entries after the current cursor (redo is cleared)\n _stack = _stack.slice(0, _cursor + 1);\n _stack.push(cloneEntry(value));\n\n // Enforce maxLength\n if (_stack.length > maxLength) {\n _stack.splice(0, _stack.length - maxLength);\n }\n\n _cursor = _stack.length - 1;\n syncSignals();\n });\n\n const destroy = (): void => { disposeEffect(); };\n\n // Reactive derived getters\n const canUndo = (): boolean => cursorSignal() > 0;\n const canRedo = (): boolean => cursorSignal() < stackLenSignal() - 1;\n\n const undo = (): void => {\n if (_cursor <= 0) return;\n\n _cursor--;\n // Restore a clone and expect exactly that reference back, so a consumer\n // mutating the restored value cannot corrupt the stack entry.\n const restored = cloneEntry(_stack[_cursor] as T);\n _expected = restored;\n sourceSet(restored);\n syncSignals();\n };\n\n const redo = (): void => {\n if (_cursor >= _stack.length - 1) return;\n\n _cursor++;\n const restored = cloneEntry(_stack[_cursor] as T);\n _expected = restored;\n sourceSet(restored);\n syncSignals();\n };\n\n const clear = (): void => {\n const currentValue = sourceGet();\n _stack = [cloneEntry(currentValue)];\n _cursor = 0;\n syncSignals();\n };\n\n return {\n undo,\n redo,\n canUndo,\n canRedo,\n history: () => stackSignal(),\n cursor: () => cursorSignal(),\n clear,\n destroy,\n };\n}\n","/**\n * Forma State - Persist\n *\n * Auto-persist a signal to localStorage (or any Storage-compatible backend).\n * Reads stored value on creation; writes on every signal change.\n * Zero dependencies -- native browser APIs only.\n */\n\nimport { internalEffect } from 'forma/reactive';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The phase in which a persist operation failed, passed to {@link PersistOptions.onError}. */\nexport type PersistErrorPhase = 'hydrate' | 'serialize' | 'write' | 'migrate';\n\n/** Options for {@link persist} — storage backend, serialization, and validation. */\nexport interface PersistOptions<T> {\n /** Storage backend. Defaults to localStorage. */\n storage?: Storage;\n /** Custom serializer. Defaults to JSON.stringify. */\n serialize?: (v: T) => string;\n /** Custom deserializer. Defaults to JSON.parse. */\n deserialize?: (s: string) => T;\n /** Optional validator — return true if the deserialized value is valid. Rejects corrupt/tampered data. */\n validate?: (v: unknown) => v is T;\n /** Current schema version. When set, values are stored in a versioned envelope. */\n version?: number;\n /** Migrate stored data whose version is older than {@link version}. Runs before validate. */\n migrate?: (oldValue: unknown, oldVersion: number) => T;\n /** Re-hydrate when another tab writes this key. Defaults to true for localStorage. */\n syncTabs?: boolean;\n /** Report hydrate/serialize/write/migrate failures instead of swallowing them. */\n onError?: (err: unknown, phase: PersistErrorPhase) => void;\n}\n\n/** Marker key for the versioned storage envelope. */\nconst ENVELOPE_TAG = '$forma:v';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Persist a signal's value to storage.\n *\n * On creation, reads the stored value (if any) and hydrates the signal.\n * Then sets up an effect to write to storage whenever the signal changes.\n *\n * ```ts\n * const [theme, setTheme] = createSignal('light');\n * persist([theme, setTheme], 'app:theme');\n *\n * setTheme('dark'); // auto-saved to localStorage under key 'app:theme'\n * ```\n */\nexport function persist<T>(\n source: [get: () => T, set: (v: T) => void],\n key: string,\n options?: PersistOptions<T>,\n): () => void {\n const [sourceGet, sourceSet] = source;\n const storage = options?.storage ?? globalThis.localStorage;\n const serialize = options?.serialize ?? JSON.stringify;\n const deserialize = options?.deserialize ?? (JSON.parse as (s: string) => T);\n const validate = options?.validate;\n const version = options?.version;\n const migrate = options?.migrate;\n const onError = options?.onError;\n\n // Guard so external re-hydration (which calls sourceSet) does not echo a\n // write back to storage. Reset in finally so a throwing sourceSet can't wedge it.\n let writing = false;\n\n // Read a stored string, returning its value and version. A versioned envelope\n // is an object with an OWN ENVELOPE_TAG property (checked via hasOwnProperty,\n // never `in`, and never merged onto a prototype — no prototype-pollution vector).\n function unwrap(stored: string): { value: unknown; version: number } {\n const parsed = deserialize(stored) as unknown;\n if (\n parsed != null && typeof parsed === 'object' &&\n Object.prototype.hasOwnProperty.call(parsed, ENVELOPE_TAG)\n ) {\n const env = parsed as Record<string, unknown>;\n return { value: env.value, version: Number(env[ENVELOPE_TAG]) };\n }\n return { value: parsed, version: 0 }; // legacy bare value\n }\n\n function hydrate(): void {\n let stored: string | null;\n try {\n stored = storage.getItem(key);\n } catch (err) {\n onError?.(err, 'hydrate');\n return;\n }\n if (stored === null) return;\n try {\n const { value: raw, version: storedVersion } = unwrap(stored);\n let value = raw;\n if (version !== undefined && storedVersion < version) {\n if (!migrate) return; // stale and no migration path — keep current value\n try {\n value = migrate(raw, storedVersion);\n } catch (err) {\n onError?.(err, 'migrate');\n return;\n }\n }\n if (!validate || validate(value)) {\n writing = true;\n try { sourceSet(value as T); } finally { writing = false; }\n }\n } catch (err) {\n onError?.(err, 'hydrate');\n }\n }\n\n // Step 1: Hydrate from storage (before the writer effect so its first run\n // persists the hydrated value, preserving prior behavior).\n hydrate();\n\n // Step 2: Persist on change. Read the value first (to track it) then bail if\n // this run was triggered by our own hydration.\n const stopEffect = internalEffect(() => {\n const value = sourceGet();\n if (writing) return;\n try {\n const serialized = version !== undefined\n ? serialize({ [ENVELOPE_TAG]: version, value } as unknown as T)\n : serialize(value);\n storage.setItem(key, serialized);\n } catch (err) {\n onError?.(err, (err as { name?: string })?.name === 'QuotaExceededError' ? 'write' : 'serialize');\n }\n });\n\n // Step 3: Cross-tab sync (browser only). Default on for localStorage.\n const enableSync = options?.syncTabs\n ?? (typeof window !== 'undefined' && storage === globalThis.localStorage);\n let onStorage: ((e: StorageEvent) => void) | undefined;\n if (enableSync && typeof window !== 'undefined') {\n onStorage = (e: StorageEvent) => {\n if (e.storageArea !== storage) return;\n if (e.key !== null && e.key !== key) return; // null key = storage.clear()\n hydrate();\n };\n window.addEventListener('storage', onStorage);\n }\n\n return () => {\n stopEffect();\n if (onStorage && typeof window !== 'undefined') {\n window.removeEventListener('storage', onStorage);\n }\n };\n}\n","// Typed event bus — pub/sub pattern\n\n/**\n * A typed publish/subscribe event bus.\n *\n * The type parameter `T` maps event names to their payload types,\n * ensuring type-safe event emission and subscription.\n */\nexport interface EventBus<T extends Record<string, unknown>> {\n /** Subscribe to an event. Returns an unsubscribe function. */\n on<K extends keyof T>(event: K, handler: (payload: T[K]) => void): () => void;\n /** Subscribe to an event, automatically unsubscribing after the first firing. */\n once<K extends keyof T>(event: K, handler: (payload: T[K]) => void): () => void;\n /** Emit an event to all current subscribers. */\n emit<K extends keyof T>(event: K, payload: T[K]): void;\n /** Remove a specific handler from an event. */\n off<K extends keyof T>(event: K, handler: (payload: T[K]) => void): void;\n /** Remove all handlers for all events. */\n clear(): void;\n}\n\n/**\n * Create a typed event bus for publish/subscribe messaging.\n *\n * ```ts\n * type Events = { save: { id: number }; delete: { id: number } };\n * const bus = createBus<Events>();\n *\n * const unsub = bus.on('save', (payload) => console.log(payload.id));\n * bus.emit('save', { id: 42 });\n * unsub();\n * ```\n */\nexport function createBus<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(): EventBus<T> {\n const listeners = new Map<keyof T, Set<(payload: any) => void>>();\n\n function getHandlers<K extends keyof T>(event: K): Set<(payload: any) => void> {\n let set = listeners.get(event);\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n return set;\n }\n\n function on<K extends keyof T>(\n event: K,\n handler: (payload: T[K]) => void,\n ): () => void {\n const set = getHandlers(event);\n set.add(handler);\n return () => {\n set.delete(handler);\n };\n }\n\n function once<K extends keyof T>(\n event: K,\n handler: (payload: T[K]) => void,\n ): () => void {\n const wrapper = (payload: T[K]) => {\n off(event, wrapper);\n handler(payload);\n };\n return on(event, wrapper);\n }\n\n function emit<K extends keyof T>(event: K, payload: T[K]): void {\n const set = listeners.get(event);\n if (set) {\n // Iterate over a snapshot so removals during emit are safe\n for (const handler of [...set]) {\n try {\n handler(payload);\n } catch (e) {\n console.error(`[forma] Bus handler error on \"${String(event)}\":`, e);\n }\n }\n }\n }\n\n function off<K extends keyof T>(\n event: K,\n handler: (payload: T[K]) => void,\n ): void {\n const set = listeners.get(event);\n if (set) {\n set.delete(handler);\n }\n }\n\n function clear(): void {\n listeners.clear();\n }\n\n return { on, once, emit, off, clear };\n}\n","// Event delegation — single listener on parent, matches children by selector\n\n/**\n * Attach a single event listener on a parent that fires for children matching\n * a CSS selector. Efficient for large/dynamic lists — one listener instead of\n * one per child.\n *\n * ```ts\n * const unsub = delegate(ul, 'li', 'click', (e, li) => {\n * console.log('Clicked:', li.textContent);\n * });\n * ```\n *\n * @param container The parent element or document to listen on.\n * @param selector CSS selector to match against delegated targets.\n * @param event DOM event name (e.g. `'click'`, `'input'`).\n * @param handler Called with the event and the matched child element.\n * @param options Standard `addEventListener` options (capture, passive, etc.).\n * @returns An unsubscribe function that removes the listener.\n */\nexport function delegate<K extends keyof HTMLElementEventMap>(\n container: HTMLElement | Document,\n selector: string,\n event: K,\n handler: (e: HTMLElementEventMap[K], matchedEl: HTMLElement) => void,\n options?: AddEventListenerOptions,\n): () => void {\n const listener = (e: Event) => {\n const target = e.target;\n if (!(target instanceof HTMLElement)) return;\n\n const root =\n container instanceof Document ? container.documentElement : container;\n const matched = target.closest(selector);\n\n if (matched instanceof HTMLElement && root.contains(matched)) {\n handler(e as HTMLElementEventMap[K], matched);\n }\n };\n\n container.addEventListener(event, listener, options);\n\n return () => {\n container.removeEventListener(event, listener, options);\n };\n}\n","// Keyboard shortcut handler\n\ntype KeyCombo = string; // e.g., 'ctrl+s', 'shift+enter', 'escape', 'ctrl+shift+z'\n\n/** Options for the {@link onKey} keyboard shortcut handler. */\nexport interface KeyOptions {\n /** Element or document to listen on. Defaults to `document`. */\n target?: EventTarget;\n /** Whether to call `e.preventDefault()`. Defaults to `true`. */\n preventDefault?: boolean;\n}\n\ninterface ParsedCombo {\n ctrl: boolean;\n shift: boolean;\n alt: boolean;\n meta: boolean;\n key: string;\n}\n\nfunction parseCombo(combo: KeyCombo): ParsedCombo {\n const parts = combo.toLowerCase().split('+').map((p) => p.trim());\n const modifiers: ParsedCombo = {\n ctrl: false,\n shift: false,\n alt: false,\n meta: false,\n key: '',\n };\n\n for (const part of parts) {\n switch (part) {\n case 'ctrl':\n case 'control':\n modifiers.ctrl = true;\n break;\n case 'shift':\n modifiers.shift = true;\n break;\n case 'alt':\n modifiers.alt = true;\n break;\n case 'meta':\n case 'cmd':\n case 'command':\n modifiers.meta = true;\n break;\n default:\n modifiers.key = part;\n }\n }\n\n return modifiers;\n}\n\nfunction matchesCombo(e: KeyboardEvent, parsed: ParsedCombo): boolean {\n if (e.ctrlKey !== parsed.ctrl) return false;\n if (e.shiftKey !== parsed.shift) return false;\n if (e.altKey !== parsed.alt) return false;\n if (e.metaKey !== parsed.meta) return false;\n return e.key.toLowerCase() === parsed.key;\n}\n\n/**\n * Listen for a keyboard shortcut and invoke a handler when it fires.\n *\n * Supports modifier keys: `ctrl`, `shift`, `alt`, `meta`/`cmd`.\n *\n * ```ts\n * const unsub = onKey('ctrl+s', (e) => save());\n * const unsub2 = onKey('escape', () => close(), { target: modal });\n * ```\n *\n * @param combo Key combination string (e.g. `'ctrl+s'`, `'shift+enter'`).\n * @param handler Called when the combo is pressed.\n * @param options Optional target element and preventDefault behavior.\n * @returns An unsubscribe function that removes the listener.\n */\nexport function onKey(\n combo: KeyCombo,\n handler: (e: KeyboardEvent) => void,\n options?: KeyOptions,\n): () => void {\n const target: EventTarget = options?.target ?? document;\n const shouldPreventDefault = options?.preventDefault ?? true;\n const parsed = parseCombo(combo);\n\n const listener = (e: Event) => {\n if (!(e instanceof KeyboardEvent)) return;\n if (matchesCombo(e, parsed)) {\n if (shouldPreventDefault) {\n e.preventDefault();\n }\n handler(e);\n }\n };\n\n target.addEventListener('keydown', listener);\n\n return () => {\n target.removeEventListener('keydown', listener);\n };\n}\n","// Typed query helpers\n\n/**\n * Select a single element by CSS selector. Returns `null` if not found.\n *\n * ```ts\n * const btn = $<HTMLButtonElement>('.submit-btn');\n * const inner = $('span', container);\n * ```\n */\nexport function $<T extends HTMLElement = HTMLElement>(\n selector: string,\n parent?: ParentNode,\n): T | null {\n return (parent ?? document).querySelector<T>(selector);\n}\n\n/**\n * Select all elements matching a CSS selector, returned as a plain array.\n *\n * ```ts\n * const items = $$<HTMLLIElement>('ul > li');\n * items.forEach((li) => li.classList.add('active'));\n * ```\n */\nexport function $$<T extends HTMLElement = HTMLElement>(\n selector: string,\n parent?: ParentNode,\n): T[] {\n return Array.from((parent ?? document).querySelectorAll<T>(selector));\n}\n","// DOM mutation helpers\n\n/** Add one or more CSS classes to an element. */\nexport function addClass(el: HTMLElement, ...classes: string[]): void {\n el.classList.add(...classes);\n}\n\n/** Remove one or more CSS classes from an element. */\nexport function removeClass(el: HTMLElement, ...classes: string[]): void {\n el.classList.remove(...classes);\n}\n\n/** Toggle a CSS class on an element. Returns the resulting state. */\nexport function toggleClass(\n el: HTMLElement,\n className: string,\n force?: boolean,\n): boolean {\n return el.classList.toggle(className, force);\n}\n\n/**\n * Apply multiple inline styles to an element at once.\n *\n * ```ts\n * setStyle(el, { opacity: '0', transform: 'translateY(-10px)' });\n * ```\n */\nexport function setStyle(\n el: HTMLElement,\n styles: Partial<CSSStyleDeclaration>,\n): void {\n for (const [key, value] of Object.entries(styles)) {\n if (value !== undefined) {\n (el.style as any)[key] = value;\n }\n }\n}\n\n/**\n * Set or remove multiple attributes on an element.\n *\n * - `false` / `null` removes the attribute.\n * - `true` sets it as a boolean attribute (empty string).\n * - A string sets the attribute value.\n */\nexport function setAttr(\n el: HTMLElement,\n attrs: Record<string, string | boolean | null>,\n): void {\n for (const [name, value] of Object.entries(attrs)) {\n if (value === false || value === null) {\n el.removeAttribute(name);\n } else if (value === true) {\n el.setAttribute(name, '');\n } else {\n el.setAttribute(name, value);\n }\n }\n}\n\n/** Set an element's text content. Safe for user-controlled strings. */\nexport function setText(el: HTMLElement, text: string): void {\n el.textContent = text;\n}\n\n/**\n * Set raw HTML on an element. **No sanitization is performed.**\n *\n * Prefer `setText()` for user-controlled content. Only use this when you\n * trust the HTML source (e.g., server-rendered markup you control).\n */\nexport function setHTMLUnsafe(el: HTMLElement, html: string): void {\n el.innerHTML = html;\n}\n","// DOM traversal helpers\n\n/** Find the closest ancestor matching a CSS selector. */\nexport function closest<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector: string,\n): T | null {\n return el.closest<T>(selector);\n}\n\n/** Get direct child elements, optionally filtered by a CSS selector. */\nexport function children<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T[] {\n const all = Array.from(el.children) as HTMLElement[];\n if (!selector) return all as T[];\n return all.filter((child) => child.matches(selector)) as T[];\n}\n\n/** Get sibling elements (excluding the element itself), optionally filtered. */\nexport function siblings<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T[] {\n const parentEl = el.parentElement;\n if (!parentEl) return [];\n const all = Array.from(parentEl.children) as HTMLElement[];\n const sibs = all.filter((child) => child !== el);\n if (!selector) return sibs as T[];\n return sibs.filter((child) => child.matches(selector)) as T[];\n}\n\n/** Get the parent element, or `null` if detached. */\nexport function parent<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n): T | null {\n return el.parentElement as T | null;\n}\n\n/** Find the next sibling element, optionally matching a CSS selector. */\nexport function nextSibling<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T | null {\n let sib = el.nextElementSibling;\n while (sib) {\n if (sib instanceof HTMLElement) {\n if (!selector || sib.matches(selector)) {\n return sib as T;\n }\n }\n sib = sib.nextElementSibling;\n }\n return null;\n}\n\n/** Find the previous sibling element, optionally matching a CSS selector. */\nexport function prevSibling<T extends HTMLElement = HTMLElement>(\n el: HTMLElement,\n selector?: string,\n): T | null {\n let sib = el.previousElementSibling;\n while (sib) {\n if (sib instanceof HTMLElement) {\n if (!selector || sib.matches(selector)) {\n return sib as T;\n }\n }\n sib = sib.previousElementSibling;\n }\n return null;\n}\n","// Observer wrappers — clean API for ResizeObserver, IntersectionObserver, MutationObserver\n\n/**\n * Observe element size changes via `ResizeObserver`.\n *\n * @returns A disconnect function that stops observing.\n */\nexport function onResize(\n el: HTMLElement,\n handler: (entry: ResizeObserverEntry) => void,\n): () => void {\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n handler(entry);\n }\n });\n observer.observe(el);\n return () => {\n observer.disconnect();\n };\n}\n\n/**\n * Observe element visibility changes via `IntersectionObserver`.\n *\n * @returns A disconnect function that stops observing.\n */\nexport function onIntersect(\n el: HTMLElement,\n handler: (entry: IntersectionObserverEntry) => void,\n options?: IntersectionObserverInit,\n): () => void {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n handler(entry);\n }\n }, options);\n observer.observe(el);\n return () => {\n observer.disconnect();\n };\n}\n\n/**\n * Observe DOM mutations (child additions/removals, attribute changes) via\n * `MutationObserver`. Defaults to `{ childList: true, subtree: true }`.\n *\n * @returns A disconnect function that stops observing.\n */\nexport function onMutation(\n el: HTMLElement,\n handler: (mutations: MutationRecord[]) => void,\n options?: MutationObserverInit,\n): () => void {\n const observer = new MutationObserver((mutations) => {\n handler(mutations);\n });\n observer.observe(el, options ?? { childList: true, subtree: true });\n return () => {\n observer.disconnect();\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SignalGetter } from './signal-
|
|
1
|
+
import { S as SignalGetter } from './signal-CRBJYQ6B.cjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Forma Reactive - Resource
|
|
@@ -10,6 +10,11 @@ import { S as SignalGetter } from './signal-C9v4akyJ.cjs';
|
|
|
10
10
|
* React equivalent: use() + Suspense (React 19), or useSWR/react-query
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
/** Info passed to a resource fetcher — carries the AbortSignal for this fetch. */
|
|
14
|
+
interface ResourceFetcherInfo {
|
|
15
|
+
/** Aborted when the source changes / the resource refetches or is disposed. */
|
|
16
|
+
signal: AbortSignal;
|
|
17
|
+
}
|
|
13
18
|
/** An async data resource with reactive loading and error state. */
|
|
14
19
|
interface Resource<T> {
|
|
15
20
|
/** The resolved data (or undefined while loading). */
|
|
@@ -59,6 +64,6 @@ interface ResourceOptions<T> {
|
|
|
59
64
|
* );
|
|
60
65
|
* ```
|
|
61
66
|
*/
|
|
62
|
-
declare function createResource<T, S = true>(source: SignalGetter<S>, fetcher: (source: S) => Promise<T>, options?: ResourceOptions<T>): Resource<T>;
|
|
67
|
+
declare function createResource<T, S = true>(source: SignalGetter<S>, fetcher: (source: S, info: ResourceFetcherInfo) => Promise<T>, options?: ResourceOptions<T>): Resource<T>;
|
|
63
68
|
|
|
64
69
|
export { type Resource as R, type ResourceOptions as a, createResource as c };
|