@manyducks.co/dolla 2.0.0-alpha.58 → 2.0.0-alpha.59
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/core/index.d.ts +2 -2
- package/dist/i18n.js +1 -1
- package/dist/index.js +25 -24
- package/dist/jsx-dev-runtime.js +1 -1
- package/dist/jsx-runtime.js +1 -1
- package/dist/{logger-C2AJnlaL.js → logger-Ck_9LCem.js} +9 -9
- package/dist/{logger-C2AJnlaL.js.map → logger-Ck_9LCem.js.map} +1 -1
- package/dist/{markup-BJx8Fwl2.js → markup-BBa4WBj1.js} +8 -8
- package/dist/{markup-BJx8Fwl2.js.map → markup-BBa4WBj1.js.map} +1 -1
- package/dist/{router-vfGbWwl9.js → router-CaR7Xd4T.js} +3 -3
- package/dist/{router-vfGbWwl9.js.map → router-CaR7Xd4T.js.map} +1 -1
- package/dist/router.js +1 -1
- package/notes/observable.md +180 -0
- package/package.json +1 -1
- package/bun.lock +0 -207
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markup-BJx8Fwl2.js","sources":["../src/core/context.ts","../src/core/symbols.ts","../src/core/nodes/dom.ts","../src/core/nodes/dynamic.ts","../src/core/nodes/view.ts","../src/core/nodes/html.ts","../src/core/nodes/portal.ts","../src/core/nodes/repeat.ts","../src/core/markup.ts"],"sourcesContent":["import { isFunction, typeOf } from \"../typeChecking\";\nimport type { Store } from \"../types\";\nimport { getUniqueId } from \"../utils\";\nimport { createLogger, type Logger, type LoggerOptions } from \"./logger\";\nimport { effect, type EffectFn, get, type MaybeSignal, untracked, type UnsubscribeFn } from \"./signals\";\n\nexport enum LifecycleEvent {\n WILL_MOUNT,\n DID_MOUNT,\n WILL_UNMOUNT,\n DID_UNMOUNT,\n DISPOSE,\n}\n\ntype LifecycleListener = () => void;\n\nenum LifecycleState {\n Unmounted = 0,\n WillMount = 1,\n DidMount = 2,\n WillUnmount = 3,\n DidUnmount = 4,\n Disposed = 5,\n}\n\nconst NAME = Symbol(\"name\");\nconst LIFECYCLE = Symbol(\"lifecycle\");\nconst PARENT = Symbol(\"parent\");\nconst STORES = Symbol(\"stores\");\nconst STATE = Symbol(\"state\");\n\n/**\n * Manages lifecycle events for a Context.\n */\nclass ContextLifecycle {\n private context;\n\n state = LifecycleState.Unmounted;\n listeners = new Map<LifecycleEvent, Set<LifecycleListener>>();\n bound?: Set<Context>;\n\n constructor(context: Context) {\n this.context = context;\n }\n\n /**\n * Listen for a certain event to be emitted. Listeners are called when the event results in a state change.\n */\n on<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n const listeners = this.listeners.get(event);\n if (!listeners) {\n this.listeners.set(event, new Set([listener]));\n } else {\n listeners.add(listener);\n }\n }\n\n /**\n * Stop a particular listener from being called when an event is emitted.\n */\n off<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n /**\n * Advance the lifecycle state machine.\n */\n emit<E extends LifecycleEvent>(event: E) {\n switch (event) {\n case LifecycleEvent.WILL_MOUNT: {\n if (this.state < LifecycleState.WillMount) {\n this.state = LifecycleState.WillMount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to WILL_MOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DID_MOUNT: {\n if (this.state >= LifecycleState.WillMount && this.state < LifecycleState.DidMount) {\n this.state = LifecycleState.DidMount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to WILL_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.WILL_UNMOUNT: {\n if (this.state >= LifecycleState.DidMount && this.state < LifecycleState.WillUnmount) {\n this.notify(event);\n this.state = LifecycleState.WillUnmount;\n } else {\n this.context.crash(new Error(`Tried to WILL_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DID_UNMOUNT: {\n if (this.state >= LifecycleState.WillUnmount && this.state < LifecycleState.DidUnmount) {\n // Loop back to .Unmounted\n this.state = LifecycleState.DidUnmount % LifecycleState.DidUnmount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to DID_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DISPOSE: {\n if (this.state === LifecycleState.Unmounted) {\n this.notify(event);\n this.listeners.clear();\n this.bound = undefined;\n this.state = LifecycleState.Disposed;\n } else {\n this.context.crash(new Error(`Tried to DISPOSE context at state ${this.state}`));\n }\n break;\n }\n }\n }\n\n /**\n * Bind `context` to this lifecycle; when any event is emitted here it will be emitted for `context` as well.\n */\n bind(context: Context) {\n if (!this.bound) {\n this.bound = new Set([context]);\n } else {\n this.bound.add(context);\n }\n }\n\n /**\n * Call all the event's listeners and re-emit to bound contexts.\n */\n private notify<E extends LifecycleEvent>(event: E) {\n // Call listener functions.\n const listeners = this.listeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n // Emit to bound contexts.\n if (this.bound) {\n for (const context of this.bound) {\n context[LIFECYCLE].emit(event);\n }\n }\n }\n}\n\nexport interface ContextOptions {\n logger?: LoggerOptions;\n}\n\nexport interface LinkedContextOptions extends ContextOptions {\n bindLifecycleToParent?: boolean;\n}\n\nexport interface Context extends Logger {}\n\nexport class Context implements Logger {\n #name: MaybeSignal<string>;\n\n [NAME]: string;\n [LIFECYCLE] = new ContextLifecycle(this);\n [PARENT]?: Context;\n [STORES]?: Map<Store<any, any>, any>;\n [STATE]?: Map<any, any>;\n\n get isMounted() {\n const { state } = this[LIFECYCLE];\n return state >= LifecycleState.DidMount && state < LifecycleState.DidUnmount;\n }\n\n /**\n * Returns a new Context with this one as its parent.\n */\n static linked(parent: Context, name: MaybeSignal<string>, options?: LinkedContextOptions): Context {\n const context = new Context(name, options);\n context[PARENT] = parent;\n if (options?.bindLifecycleToParent) parent[LIFECYCLE].bind(context);\n return context;\n }\n\n /**\n * Emit \"will mount\" lifecycle event to `context`.\n */\n static willMount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.WILL_MOUNT);\n }\n /**\n * Emit \"did mount\" lifecycle event to `context`.\n */\n static didMount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.DID_MOUNT);\n }\n /**\n * Emit \"will unmount\" lifecycle event to `context`.\n */\n static willUnmount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.WILL_UNMOUNT);\n }\n /**\n * Emit \"did unmount\" lifecycle event to `context`.\n */\n static didUnmount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.DID_UNMOUNT);\n }\n /**\n * Emit \"dispose\" lifecycle event to `context`.\n */\n static dispose(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.DISPOSE);\n context[STATE] = undefined;\n context[STORES] = undefined;\n }\n\n /**\n * Traverses _parent contexts until arriving at one that doesn't have a parent itself.\n * Returns null if this context is the parent.\n */\n static getRoot(context: Context) {\n // This is like the programming version of \"Buffalo buffalo buffalo...\"\n let parent = context[PARENT];\n while (parent?.[PARENT]) {\n parent = parent[PARENT];\n }\n return parent ?? null;\n }\n\n constructor(name: MaybeSignal<string>, options?: ContextOptions) {\n this.#name = name;\n this[NAME] = untracked(name);\n\n // Add logger methods.\n const logger = createLogger(() => get(this.#name), options?.logger);\n const descriptors = Object.getOwnPropertyDescriptors(logger);\n for (const key in descriptors) {\n Object.defineProperty(this, key, descriptors[key]);\n }\n }\n\n /**\n * Returns the current name of this context.\n */\n getName(): string {\n return untracked(this.#name);\n }\n\n /**\n * Sets a new name for this context.\n */\n setName(name: MaybeSignal<string>) {\n this.#name = name;\n this[NAME] = untracked(name); // Try to store name as a readable string for debugging purposes.\n }\n\n /**\n * Creates an instance of a store and attaches it to this context.\n */\n addStore<T>(store: Store<any, T>, options?: any): this {\n if (this[STORES]?.get(store)) {\n let name = store.name ? `'${store.name}'` : \"this store\";\n throw this.crash(new StoreError(`An instance of ${name} was already added on this context.`));\n }\n\n const context = Context.linked(this, store.name, {\n bindLifecycleToParent: true,\n logger: { tag: getUniqueId(), tagName: \"uid\" },\n });\n try {\n if (!this[STORES]) this[STORES] = new Map();\n const result = store.call(context, options, context);\n this[STORES].set(store, result);\n } catch (error) {\n throw this.crash(error as Error);\n }\n\n return this;\n }\n\n /**\n * Retrieves the nearest instance of `store`. If this context doesn't have it, the parent context is checked. This process continues until either:\n * 1. An instance of the store is found and returned.\n * 2. No instance is found and an error is thrown.\n */\n getStore<T>(store: Store<any, T>): T {\n if (!isFunction(store)) {\n throw new StoreError(`Invalid store.`);\n }\n let context: Context = this;\n let result: unknown;\n while (true) {\n result = context[STORES]?.get(store);\n if (result == null && context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n if (result == null) {\n throw this.crash(new StoreError(`Store '${store.name}' is not provided by this context.`));\n }\n return result as T;\n }\n\n /**\n * Schedule a callback function to run just before this context is mounted.\n */\n beforeMount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.WILL_MOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.WILL_MOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run after this context is mounted.\n */\n onMount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.DID_MOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.DID_MOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run just before this context is unmounted.\n */\n beforeUnmount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.WILL_UNMOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.WILL_UNMOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run after this context is unmounted.\n */\n onUnmount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.DID_UNMOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.DID_UNMOUNT, listener);\n }\n\n effect(callback: EffectFn) {\n const fn = () => {\n try {\n return callback(); // Return callback so cleanup function passes through to effect handler\n } catch (error) {\n this.error(error);\n if (error instanceof Error) {\n this.crash(error);\n } else if (typeof error === \"string\") {\n this.crash(new Error(error));\n } else {\n this.crash(new Error(`Unknown error thrown in effect callback`));\n }\n }\n };\n\n if (this[LIFECYCLE].state >= LifecycleState.WillMount) {\n // This code is probably in a lifecycle hook; run the effect immediately and trigger unsubscribe when context unmounts.\n const unsubscribe = effect(fn);\n this[LIFECYCLE].on(LifecycleEvent.DID_UNMOUNT, unsubscribe);\n return unsubscribe;\n } else {\n // Prime the effect to run when the context is mounted and unsubscribe when unmounted, unless unsubscribed before `willMount`.\n let unsubscribe: UnsubscribeFn | undefined;\n let disposed = false;\n this[LIFECYCLE].on(LifecycleEvent.WILL_MOUNT, () => {\n if (!disposed) {\n unsubscribe = effect(fn);\n this[LIFECYCLE].on(LifecycleEvent.DID_UNMOUNT, unsubscribe);\n }\n });\n return () => {\n if (unsubscribe != null) {\n disposed = true;\n unsubscribe();\n }\n };\n }\n }\n\n /**\n * Gets the value stored at `key`, or returns the `defaultValue` if none is set.\n */\n getState<T>(key: any, defaultValue: T): T;\n\n /**\n * Gets the value stored at `key`, or throws an error if none is set.\n */\n getState<T>(key: any): T;\n\n /**\n * Returns a Map containing all state values available to this context.\n */\n getState(): Map<any, any>;\n\n getState<T>(key?: any, defaultValue?: T): T | Map<any, any> {\n if (arguments.length > 0) {\n // Get value by key\n let context: Context = this;\n let value: any;\n while (true) {\n value = context[STATE]?.get(key);\n if (value === undefined && context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n if (value === undefined) {\n if (arguments.length > 1) {\n return defaultValue!;\n } else {\n throw new Error(`Expected a value for '${String(key)}' but got undefined.`);\n }\n }\n return value;\n } else {\n // Get merged values\n let context: Context = this;\n const entries: [any, any][] = [];\n while (true) {\n if (context[STATE]) {\n entries.push(...context[STATE].entries());\n }\n if (context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n return new Map(entries.reverse());\n }\n }\n\n /**\n * Stores `value` at `key` in this context's state.\n */\n setState<T>(key: any, value: T): void;\n\n /**\n * For each tuple in `entries`, stores `value` at `key` in this context's state.\n */\n setState(entries: [key: any, value: any][]): void;\n\n setState() {\n if (!this[STATE]) {\n this[STATE] = new Map();\n }\n if (arguments.length === 2) {\n this[STATE].set(arguments[0], arguments[1]);\n } else if (typeOf(arguments[0]) === \"array\") {\n for (const [key, value] of arguments[0]) {\n if (value === undefined) {\n this[STATE].delete(key);\n } else {\n this[STATE].set(key, value);\n }\n }\n } else {\n throw new Error(`Invalid arguments.`);\n }\n\n return this;\n }\n}\n\nexport function createContext(name: MaybeSignal<string>, options?: ContextOptions) {\n return new Context(name, options);\n}\n\nexport class StoreError extends Error {}\n","// Type symbols; these are used to quickly check if a value is the expected object.\nexport const IS_MARKUP = Symbol.for(\"dollaMarkup\");\nexport const IS_MARKUP_NODE = Symbol.for(\"dollaMarkupNode\");\n","import type { MarkupNode } from \"../markup\";\nimport { IS_MARKUP_NODE } from \"../symbols\";\n\n/**\n * Wraps any plain DOM node in a MarkupNode interface.\n */\nexport class DOMNode implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root: Node;\n\n constructor(node: Node) {\n this.root = node;\n }\n\n isMounted() {\n return this.root.parentNode != null;\n }\n\n mount(parent: Element, after?: Node) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.root.parentNode && !parentIsUnmounting) {\n this.root.parentNode.removeChild(this.root);\n }\n }\n\n move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent && this.root instanceof Element) {\n try {\n (parent as any).moveBefore(this.root, after?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n}\n","import { isArray } from \"../../typeChecking.js\";\nimport type { Context } from \"../context.js\";\nimport { toMarkupNodes, type MarkupNode } from \"../markup.js\";\nimport { effect, untracked, Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\n/**\n * Displays dynamic children without a parent element.\n * Renders a Reactive value via a render function.\n *\n * This is probably the most used element type aside from HTML.\n */\nexport class Dynamic implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root = document.createTextNode(\"\");\n\n private children: MarkupNode[] = [];\n private context: Context;\n\n private $slot: Signal<any>;\n private unsubscribe?: UnsubscribeFn;\n\n constructor(context: Context, $slot: Signal<any>) {\n this.context = context;\n this.$slot = $slot;\n }\n\n isMounted() {\n return this.root.parentElement != null;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted()) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n try {\n const content = this.$slot();\n untracked(() => {\n this.update(isArray(content) ? content : [content]);\n });\n } catch (error) {\n this.context.crash(error as Error);\n }\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n this.unsubscribe?.();\n\n if (this.isMounted()) {\n this.cleanup(parentIsUnmounting);\n this.root.parentNode?.removeChild(this.root);\n }\n }\n\n move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent) {\n try {\n (parent as any).moveBefore(this.root, after?.nextSibling ?? null);\n for (let i = 0; i < this.children.length; i++) {\n this.children[i].move(parent, this.children[i - 1]?.root ?? this.root);\n }\n (parent as any).moveBefore(this.root, this.children.at(-1)?.root?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n\n private cleanup(parentIsUnmounting: boolean) {\n for (const element of this.children) {\n if (element.isMounted()) element.unmount(parentIsUnmounting);\n }\n this.children.length = 0;\n }\n\n private update(content: any[]) {\n this.cleanup(false);\n\n if (content.length === 0 || !this.isMounted()) return;\n\n const nodes = toMarkupNodes(this.context, content);\n\n for (const node of nodes) {\n const previous = this.children.at(-1)?.root || this.root;\n node.mount(this.root.parentElement!, previous);\n this.children.push(node);\n }\n\n this.moveMarker();\n }\n\n /**\n * Move marker node to end of children.\n */\n private moveMarker() {\n const parent = this.root.parentElement!;\n const lastChildNextSibling = this.children.at(-1)?.root?.nextSibling ?? null;\n if (\"moveBefore\" in parent) {\n (parent as any).moveBefore(this.root, lastChildNextSibling);\n } else {\n parent.insertBefore(this.root, lastChildNextSibling);\n }\n }\n}\n","import type { View } from \"../../types.js\";\nimport { getUniqueId } from \"../../utils.js\";\nimport { Context } from \"../context.js\";\nimport { render, type MarkupNode } from \"../markup.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\nexport const VIEW = Symbol(\"View\");\n\nexport class ViewInstance<P> implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n uniqueId = getUniqueId();\n context: Context;\n props;\n view;\n\n node?: MarkupNode;\n\n get root() {\n return this.node?.root!;\n }\n\n constructor(context: Context, view: View<P>, props: P) {\n this.context = Context.linked(context, view.name ?? \"anonymous view\", {\n logger: {\n tag: this.uniqueId,\n tagName: \"uid\",\n },\n });\n this.context.setState(VIEW, this);\n this.props = props;\n this.view = view;\n }\n\n isMounted() {\n return this.node?.isMounted() ?? false;\n }\n\n mount(parent: Element, after?: Node) {\n // Don't run lifecycle hooks or initialize if already connected.\n // Calling connect again can be used to re-order elements that are already connected to the DOM.\n const wasMounted = this.isMounted();\n\n if (!wasMounted) {\n const { context, props, view } = this;\n try {\n const result = view.call(context, props, context);\n if (result != null && result !== false) {\n this.node = render(result, context);\n }\n } catch (error) {\n if (error instanceof Error) {\n context.crash(error);\n }\n throw error;\n }\n\n Context.willMount(this.context);\n }\n\n if (this.node) {\n this.node.mount(parent, after);\n }\n\n if (!wasMounted) {\n Context.didMount(this.context);\n }\n }\n\n unmount(parentIsUnmounting = false) {\n Context.willUnmount(this.context);\n\n if (this.node) {\n this.node.unmount(parentIsUnmounting);\n }\n\n Context.didUnmount(this.context);\n Context.dispose(this.context);\n }\n\n move(parent: Element, after?: Node) {\n this.node?.move(parent, after);\n }\n}\n","import { isArray, isFunction, isObject, isString } from \"../../typeChecking.js\";\nimport { omit } from \"../../utils.js\";\nimport { Context } from \"../context.js\";\nimport { getEnv } from \"../env.js\";\nimport { toMarkupNodes, type MarkupNode } from \"../markup.js\";\nimport { effect, get, type MaybeSignal, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\nimport { VIEW, ViewInstance } from \"./view.js\";\n\nconst isCamelCaseEventName = (key: string) => /^on[A-Z]/.test(key);\n\nexport type Mixin<E extends Element = Element> = (element: E, context: Context) => void;\n\nconst IS_SVG = Symbol(\"HTML.isSVG\");\n\nexport class HTML implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root?: HTMLElement | SVGElement;\n\n private parentContext: Context;\n private context: Context;\n\n tag;\n props: Record<string, any>;\n\n private childNodes: MarkupNode[] = [];\n private unsubscribers: UnsubscribeFn[] = [];\n\n // Track the ref so we can nullify it on unmount.\n private ref?: Source<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n private canClickAway = false;\n\n constructor(context: Context, tag: string, props: Record<string, any>) {\n this.parentContext = context;\n this.tag = tag;\n this.props = props;\n\n this.context = Context.linked(this.parentContext, getLoggerName.bind(this));\n\n // This and all nested views will be created as SVG elements.\n if (tag.toLowerCase() === \"svg\") {\n this.context.setState(IS_SVG, true);\n }\n\n // Create node with the appropriate constructor.\n if (this.context.getState(IS_SVG, false)) {\n this.root = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n } else {\n this.root = document.createElement(tag);\n }\n\n // Add view name as a data attribute in development mode for better debugging.\n if (getEnv() === \"development\") {\n const view = this.context.getState<ViewInstance<any> | null>(VIEW, null);\n if (view) {\n this.root.dataset.view = view.context.getName();\n }\n }\n\n if (props.mixin) {\n const mixins = isArray(props.mixin) ? props.mixin : [props.mixin];\n for (const fn of mixins) {\n fn(\n this.root,\n Context.linked(this.context, getLoggerName.bind(this), {\n bindLifecycleToParent: true,\n logger: { tagName: fn.name === \"mixin\" ? undefined : \"mixin\", tag: fn.name },\n }),\n );\n }\n }\n\n const classes = props.className ?? props.class;\n\n this.applyProps(this.root!, omit([\"class\", \"className\", \"ref\", \"mixin\", \"children\"], props));\n if (props.style) this.applyStyles(this.root, props.style, this.unsubscribers);\n if (classes) this.applyClasses(this.root, classes, this.unsubscribers);\n\n if (props.ref) {\n if (isFunction(props.ref)) {\n this.ref = props.ref;\n this.ref(this.root);\n } else {\n throw new Error(\"Expected ref to be a function. Got: \" + props.ref);\n }\n }\n\n if (props.children) {\n this.childNodes = toMarkupNodes(this.context, props.children);\n }\n }\n\n isMounted() {\n return this.context.isMounted;\n // return this.root?.parentNode != null;\n }\n\n mount(parent: Node, after?: Node) {\n const wasMounted = this.isMounted();\n\n if (!wasMounted) {\n Context.willMount(this.context);\n\n for (let i = 0; i < this.childNodes.length; i++) {\n const child = this.childNodes[i];\n const previous = i > 0 ? this.childNodes[i - 1].root : undefined;\n child.mount(this.root!, previous);\n }\n }\n\n parent.insertBefore(this.root!, after?.nextSibling ?? null);\n\n this.canClickAway = true;\n\n if (!wasMounted) Context.didMount(this.context);\n }\n\n unmount(parentIsUnmounting = false) {\n Context.willUnmount(this.context);\n\n if (!parentIsUnmounting) {\n this.root!.parentNode?.removeChild(this.root!);\n }\n\n for (const child of this.childNodes) {\n child.unmount(true);\n }\n\n this.canClickAway = false;\n\n for (const unsubscribe of this.unsubscribers) {\n unsubscribe();\n }\n this.unsubscribers.length = 0;\n\n if (this.ref) {\n this.ref(undefined);\n }\n\n Context.didUnmount(this.context);\n Context.dispose(this.context);\n }\n\n move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent) {\n try {\n (parent as any).moveBefore(this.root!, after?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n\n private attachProp<T>(value: MaybeSignal<T>, callback: (value: T) => void) {\n if (isFunction(value)) {\n this.unsubscribers.push(\n effect(() => {\n try {\n callback((value as Signal<T>)());\n } catch (error) {\n this.context!.error(error);\n this.context!.crash(error as Error);\n }\n }),\n );\n } else {\n callback(value);\n }\n }\n\n private applyProps(element: HTMLElement | SVGElement, props: Record<string, unknown>) {\n const context = this.context!;\n\n for (const key in props) {\n const value = props[key];\n\n // TODO: If key starts with 'attr:' it is applied with .setAttribute, if 'prop:' it is set directly on the element. If 'on:' it is applied with .addEventListener\n\n if (key === \"on:clickoutside\" || key === \"onClickOutside\" || key === \"onclickoutside\") {\n const listener = (e: Event) => {\n if (this.canClickAway && !element.contains(e.target as any)) {\n (value as (e: Event) => void)(e);\n }\n };\n\n const options = { capture: true };\n\n window.addEventListener(\"click\", listener, options);\n\n this.unsubscribers.push(() => {\n window.removeEventListener(\"click\", listener, options);\n });\n } else if (isFunction(value) && isCamelCaseEventName(key)) {\n const eventName = key.slice(2).toLowerCase();\n\n const listener: (e: Event) => void = value as (e: Event) => void;\n\n element.addEventListener(eventName, listener);\n\n this.unsubscribers.push(() => {\n element.removeEventListener(eventName, listener);\n });\n } else if (key.startsWith(\"on\") && isFunction(value) && knownEventNames.includes(key.substring(2))) {\n // Event handler property (element.onsomething = function () {})\n (element as any)[key] = value;\n this.unsubscribers.push(() => {\n (element as any)[key] = undefined;\n });\n } else if (key.includes(\"-\")) {\n // Names with dashes in them are not valid prop names, so they are treated as attributes.\n this.attachProp(value, (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\n });\n } else if (!privateProps.includes(key)) {\n if (context.getState(IS_SVG, false)) {\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\n });\n } else {\n switch (key) {\n case \"contentEditable\":\n case \"value\":\n this.attachProp(value, (current) => {\n (element as any)[key] = String(current);\n });\n break;\n\n case \"for\":\n this.attachProp(value, (current) => {\n (element as any).htmlFor = current;\n });\n break;\n\n case \"innerHTML\":\n this.attachProp(value, (current) => {\n (element as any).innerHTML = current;\n });\n break;\n\n case \"title\":\n this.attachProp(value, (current) => {\n if (current == null) {\n (element as any).removeAttribute(key);\n } else {\n (element as any).setAttribute(key, String(current));\n }\n });\n\n case \"checked\":\n this.attachProp(value, (current) => {\n (element as any).checked = current;\n\n // Set attribute also or styles don't take effect.\n if (current) {\n element.setAttribute(\"checked\", \"\");\n } else {\n element.removeAttribute(\"checked\");\n }\n });\n break;\n\n case \"autocomplete\":\n case \"autocapitalize\":\n this.attachProp(value, (current) => {\n if (typeof current === \"string\") {\n (element as any)[key] = current;\n } else if (current) {\n (element as any)[key] = \"on\";\n } else {\n (element as any)[key] = \"off\";\n }\n });\n break;\n\n default: {\n if (key.startsWith(\"prop:\")) {\n const _key = key.substring(5);\n this.attachProp(value, (current) => {\n (element as any)[_key] = current;\n });\n } else if (key.startsWith(\"on:\")) {\n const _key = key.substring(3);\n let _prev: EventListener | undefined;\n if (isFunction(value)) {\n element.addEventListener(_key, value as EventListener);\n this.unsubscribers.push(() => {\n element.removeEventListener(_key, value as EventListener);\n });\n } else {\n this.attachProp(value as MaybeSignal<EventListener>, (current) => {\n if (!current && _prev) {\n element.removeEventListener(_key, _prev);\n } else if (current != null) {\n if (_prev && _prev !== current) {\n element.removeEventListener(_key, _prev);\n }\n element.addEventListener(_key, current);\n }\n _prev = current;\n });\n }\n } else if (key.startsWith(\"attr:\")) {\n const _key = key.substring(5).toLowerCase();\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(_key, String(current));\n } else {\n element.removeAttribute(_key);\n }\n });\n } else {\n this.attachProp(value, (current) => {\n (element as any)[key] = current;\n });\n }\n\n break;\n }\n }\n }\n }\n }\n }\n\n private applyStyles(element: HTMLElement | SVGElement, styles: unknown, unsubscribers: UnsubscribeFn[]) {\n const propUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(styles)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.style.cssText = \"\";\n unapply = this.applyStyles(element, get(styles), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getStyleMap(styles);\n\n for (const name in mapped) {\n const { value, priority } = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.style.setProperty(name, String(get(value)), priority);\n } else {\n element.style.removeProperty(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else if (value != undefined) {\n element.style.setProperty(name, String(value));\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of propUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n\n private applyClasses(element: HTMLElement | SVGElement, classes: unknown, unsubscribers: UnsubscribeFn[]) {\n const classUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(classes)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.removeAttribute(\"class\");\n unapply = this.applyClasses(element, get(classes), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getClassMap(classes);\n\n for (const name in mapped) {\n const value = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.classList.add(name);\n } else {\n element.classList.remove(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else if (value) {\n element.classList.add(name);\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of classUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n}\n\n/**\n * Parse classes into a single object. Classes can be passed as a string, an object with class keys can boolean values, or an array with a mix of both.\n */\nfunction getClassMap(classes: unknown) {\n let mapped: Record<string, boolean> = {};\n\n if (isString(classes)) {\n // Support multiple classes in one string like HTML.\n const names = classes.split(\" \");\n for (const name of names) {\n mapped[name] = true;\n }\n } else if (isObject(classes)) {\n Object.assign(mapped, classes);\n } else if (Array.isArray(classes)) {\n Array.from(classes)\n .filter(Boolean)\n .forEach((item) => {\n Object.assign(mapped, getClassMap(item));\n });\n }\n\n // Delete undefined keys. These are usually the result of a class that is not specified in the stylesheet and would have no effect on appearance.\n delete mapped[\"undefined\"];\n\n return mapped;\n}\n\n/**\n * Parse styles into a single object.\n */\nfunction getStyleMap(styles: unknown) {\n let mapped: Record<string, { value: unknown; priority?: string }> = {};\n\n if (isString(styles)) {\n const lines = styles.split(\";\").filter((line) => line.trim() !== \"\");\n for (const line of lines) {\n const [key, _value] = line.split(\":\");\n const entry: { value: unknown; priority?: string } = {\n value: _value,\n };\n if (_value.includes(\"!important\")) {\n entry.priority = \"important\";\n entry.value = _value.replace(\"!important\", \"\").trim();\n } else {\n entry.value = _value.trim();\n }\n mapped[camelToKebab(key.trim())] = entry;\n }\n }\n if (isObject(styles)) {\n for (const key in styles) {\n if (key.startsWith(\"--\")) {\n // Pass through variable names without processing.\n mapped[key] = { value: styles[key] };\n } else {\n mapped[camelToKebab(key)] = { value: styles[key] };\n }\n }\n } else if (Array.isArray(styles)) {\n Array.from(styles)\n .filter((item) => item != null)\n .forEach((item) => {\n Object.assign(mapped, getStyleMap(item));\n });\n }\n\n return mapped;\n}\n\nfunction getLoggerName(this: HTML) {\n if (this.root == null) return this.tag;\n let name = this.root.tagName.toLowerCase();\n if (this.root.id) {\n name += `#${this.root.id}`;\n }\n if (this.root.classList.length > 0) {\n for (const className of this.root.classList.values()) {\n name += `.${className}`;\n }\n }\n return name;\n}\n\n/**\n * Converts a camelCase string to kebab-case.\n */\nfunction camelToKebab(value: string): string {\n return value.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? \"-\" : \"\") + $.toLowerCase());\n}\n\n// Attributes in this list will not be forwarded to the DOM node.\nconst privateProps = [\"ref\", \"children\", \"class\", \"style\", \"data\", \"mixin\"];\n\n// A list of all known event names. These will be handled as event listeners.\nconst knownEventNames = [\n // Element\n \"animationcancel\",\n \"animationend\",\n \"animationiteration\",\n \"animationstart\",\n \"auxclick\",\n \"beforeinput\",\n \"beforematch\",\n \"beforexrselect\",\n \"blur\",\n \"click\",\n \"compositionend\",\n \"compositionstart\",\n \"compositionupdate\",\n \"contentvisibilityautostatechange\",\n \"contextmenu\",\n \"copy\",\n \"cut\",\n \"dblclick\",\n \"focus\",\n \"focusin\",\n \"focusout\",\n \"fullscreenchange\",\n \"fullscreenerror\",\n \"gotpointercapture\",\n \"input\",\n \"keydown\",\n \"keyup\",\n \"lostpointercapture\",\n \"mousedown\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n \"paste\",\n \"pointercancel\",\n \"pointerdown\",\n \"pointerenter\",\n \"pointerleave\",\n \"pointermove\",\n \"pointerout\",\n \"pointerover\",\n \"pointerrawupdate\",\n \"pointerup\",\n \"scroll\",\n \"scrollend\",\n \"scrollsnapchange\",\n \"scrollsnapchanging\",\n \"securitypolicyviolation\",\n \"touchcancel\",\n \"touchend\",\n \"touchmove\",\n \"touchstart\",\n \"transitioncancel\",\n \"transitionend\",\n \"transitionrun\",\n \"transitionstart\",\n \"webkitmouseforcechanged\",\n \"webkitmouseforcedown\",\n \"webkitmouseforceup\",\n \"webkimouseforcewillbegin\",\n \"wheel\",\n\n // HTMLElement\n \"beforetoggle\",\n \"change\",\n \"command\",\n \"drag\",\n \"dragend\",\n \"dragenter\",\n \"dragleave\",\n \"dragover\",\n \"dragstart\",\n \"drop\",\n \"error\",\n \"load\",\n \"toggle\",\n\n // HTMLInputElement\n \"cancel\",\n \"invalid\",\n \"search\",\n \"select\",\n \"selectionchange\",\n\n // HTMLFormElement\n \"formdata\",\n \"reset\",\n \"submit\",\n];\n","import type { Renderable } from \"../../types.js\";\nimport { Context } from \"../context.js\";\nimport { render, type MarkupNode } from \"../markup.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\n/**\n * Renders content into a specified parent node.\n */\nexport class Portal implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n private context;\n private content;\n private parent;\n\n private element?: MarkupNode;\n\n constructor(context: Context, content: Renderable, parent: Element) {\n this.context = context;\n this.content = content;\n this.parent = parent;\n }\n\n isMounted() {\n if (!this.element) {\n return false;\n }\n return this.element.isMounted();\n }\n\n mount(_parent: Element, _after?: Node) {\n this.element = render(this.content, this.context);\n this.element.mount(this.parent);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.element?.isMounted()) {\n // Portals MUST unmount DOM nodes because they won't be removed by parents unmounting.\n this.element.unmount(false);\n }\n }\n\n move(_parent: Element, _after?: Node) {}\n}\n","import type { Renderable } from \"../../types.js\";\nimport { deepEqual } from \"../../utils.js\";\nimport type { Context } from \"../context.js\";\nimport type { MarkupNode } from \"../markup.js\";\nimport { $, batch, effect, untracked, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\nimport { ViewInstance } from \"./view.js\";\n\n// ----- Types ----- //\n\nexport type Key = string | number | symbol;\n\nexport type KeyFn<T> = (item: T, index: number) => Key;\nexport type RenderFn<T> = (item: Signal<T>, index: Signal<number>, ctx: Context) => Renderable;\n\ntype ConnectedItem<T> = {\n key: any;\n $item: Source<T>;\n $index: Source<number>;\n node: MarkupNode;\n};\n\n// ----- Code ----- //\n\nexport class Repeat<T> implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root = document.createTextNode(\"\");\n\n private context;\n\n private items: Signal<T[]>;\n private key: KeyFn<T>;\n private render: RenderFn<T>;\n\n private unsubscribe: UnsubscribeFn | null = null;\n private connectedItems: Map<Key, ConnectedItem<T>> = new Map();\n\n constructor(context: Context, items: Signal<T[]>, key: KeyFn<T>, render: RenderFn<T>) {\n this.context = context;\n\n this.items = items;\n this.key = key;\n this.render = render;\n }\n\n isMounted() {\n return this.root.parentElement != null;\n }\n\n mount(parent: Element, after?: Node) {\n if (!this.isMounted()) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n let value = this.items();\n\n if (value == null) {\n value = [];\n this.context.warn(\"repeat() received empty value for items\", value);\n }\n\n untracked(() => {\n this._update(Array.from(value));\n });\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n if (!parentIsUnmounting && this.isMounted()) {\n this.root.parentNode?.removeChild(this.root);\n }\n\n this._cleanup(parentIsUnmounting);\n }\n\n move(parent: Element, after?: Node) {\n // TODO:\n return this.mount(parent, after);\n }\n\n private _cleanup(parentIsUnmounting: boolean) {\n for (const item of this.connectedItems.values()) {\n item.node.unmount(parentIsUnmounting);\n }\n this.connectedItems.clear();\n }\n\n private _update(value: T[]) {\n if (value.length === 0 || !this.isMounted()) {\n return this._cleanup(false);\n }\n\n type UpdateItem = { key: string | number | symbol; value: T; index: number };\n\n const potentialItems = new Map<string | number | symbol, UpdateItem>();\n let index = 0;\n\n for (const item of value) {\n const key = this.key(item, index);\n potentialItems.set(key, {\n key,\n value: item,\n index: index++,\n });\n }\n\n const newItems: ConnectedItem<T>[] = [];\n\n // Remove views for items that no longer exist in the new list.\n for (const connected of this.connectedItems.values()) {\n if (!potentialItems.has(connected.key) && connected.node.isMounted()) {\n connected.node.unmount(false);\n }\n }\n\n batch(() => {\n // Add new views and update state for existing ones.\n for (const potential of potentialItems.values()) {\n const connected = this.connectedItems.get(potential.key);\n\n if (connected && connected.node.isMounted()) {\n connected.$item(potential.value);\n connected.$index(potential.index);\n\n newItems[potential.index] = connected;\n } else {\n // deepEqual avoids running update code again if the data is equivalent. In list updates this happens a lot.\n const $item = $(potential.value, { equals: deepEqual });\n const $index = $(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n $item,\n $index,\n node: new ViewInstance(this.context, RepeatItemView, {\n $item: () => $item(),\n $index: () => $index(),\n render: this.render,\n }),\n };\n }\n }\n });\n\n // Reconnect to ensure order. Lifecycle hooks won't be run again if the view is already connected.\n // TODO: Use a smarter inline reordering method. This causes scrollbars to jump.\n for (let i = 0; i < newItems.length; i++) {\n const item = newItems[i];\n const previous = newItems[i - 1]?.node.root ?? this.root;\n\n const connected = this.connectedItems.get(item.key);\n if (connected && connected.node.isMounted()) {\n item.node.move(this.root.parentElement!, previous);\n } else {\n item.node.mount(this.root.parentElement!, previous);\n }\n }\n\n this.connectedItems.clear();\n for (const item of newItems) {\n this.connectedItems.set(item.key, item);\n }\n\n // Move marker node to end.\n const lastItem = newItems.at(-1)?.node.root ?? this.root;\n this.root.parentNode?.insertBefore(this.root, lastItem.nextSibling);\n }\n}\n\ninterface ListItemProps {\n $item: Signal<any>;\n $index: Signal<number>;\n render: (item: Signal<any>, index: Signal<number>, context: Context) => Renderable;\n}\n\nfunction RepeatItemView(props: ListItemProps, context: Context) {\n context.setName(\"@RepeatItemView\");\n return props.render.call(context, props.$item, props.$index, context);\n}\n","import { isFunction, isString } from \"../typeChecking.js\";\nimport type { Renderable, View } from \"../types.js\";\nimport { Context } from \"./context.js\";\nimport { DOMNode } from \"./nodes/dom.js\";\nimport { Dynamic } from \"./nodes/dynamic.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { KeyFn, RenderFn, Repeat } from \"./nodes/repeat.js\";\nimport { ViewInstance } from \"./nodes/view.js\";\nimport { $, get, type MaybeSignal, type Signal } from \"./signals.js\";\nimport { IS_MARKUP_NODE } from \"./symbols.js\";\n\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\n/**\n * Markup is a set of element metadata that hasn't been constructed into a MarkupElement yet.\n */\nexport class Markup<P = any> {\n /**\n * In the case of a view, type will be the View function itself. It can also hold an identifier for special nodes like \"$cond\", \"$repeat\", etc.\n * DOM nodes can be created by name, such as HTML elements like \"div\", \"ul\" or \"span\", SVG elements like \"\"\n */\n type;\n\n /**\n * Data that will be passed to a new MarkupNode instance when it is constructed.\n * Includes a `children` prop if children were passed.\n */\n props;\n\n constructor(type: string | View<P>, props?: P) {\n this.type = type;\n this.props = props;\n }\n}\n\n/**\n * A mountable node that has been constructed from Markup metadata.\n */\nexport interface MarkupNode {\n /**\n *\n */\n readonly root?: Node;\n\n /**\n *\n */\n isMounted(): boolean;\n\n /**\n *\n */\n mount(parent: Element, after?: Node): void;\n\n /**\n *\n */\n unmount(parentIsUnmounting?: boolean): void;\n\n /**\n * Moves a node without unmounting and remounting (if the browser supports Element.moveBefore).\n */\n move(parent: Element, after?: Node): void;\n}\n\nexport function isMarkupNode(value: any): value is MarkupNode {\n return value?.[IS_MARKUP_NODE] === true;\n}\n\nexport enum MarkupType {\n Text = \"$text\",\n Repeat = \"$repeat\",\n Dynamic = \"$dynamic\",\n DOM = \"$dom\",\n Portal = \"$portal\",\n}\n\nexport interface MarkupProps {\n [MarkupType.Text]: { value: any };\n [MarkupType.Repeat]: {\n items: Signal<any[]>;\n key: KeyFn<any>;\n render: RenderFn<any>;\n };\n [MarkupType.Dynamic]: {\n source: Signal<any>;\n };\n [MarkupType.DOM]: {\n value: Node;\n };\n [MarkupType.Portal]: {\n content: Renderable;\n parent: Element;\n };\n\n [tag: string]: Record<string, any>;\n}\n\nexport function m<T extends keyof MarkupProps>(type: T, props: MarkupProps[T]): Markup;\n\nexport function m<P extends {}>(type: View<P>, props?: P): Markup;\nexport function m<P>(type: View<P>, props: P): Markup;\n\nexport function m(type: string | View<any>, props?: any) {\n return new Markup(type, props ?? {});\n}\n\n/*===========================*\\\n|| View Helpers ||\n\\*===========================*/\n\n/**\n * If `condition` is truthy, displays `thenContent`, otherwise `elseContent`.\n */\nexport function when(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return m(MarkupType.Dynamic, {\n source: $<Renderable>(() => {\n const value = get(condition);\n\n if (value && thenContent) {\n return thenContent;\n } else if (!value && elseContent) {\n return elseContent;\n }\n return null;\n }),\n });\n}\n\n/**\n * Inverted `when`. If `condition` is falsy, displays `thenContent`, otherwise `elseContent`.\n */\nexport function unless(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return when(condition, elseContent, thenContent);\n}\n\n/**\n * Calls `render` for each item in `items`. Dynamically adds and removes views as items change.\n * The result of `key` is used to compare items and decide if item was added, removed or updated.\n */\nexport function repeat<T>(items: MaybeSignal<T[]>, key: KeyFn<T>, render: RenderFn<T>): Markup {\n return m(MarkupType.Repeat, { items: () => get(items), key, render });\n}\n\n/**\n * Renders `content` into a `parent` node anywhere in the page, rather than its usual position in the view.\n */\nexport function portal(parent: Element, content: Renderable): Markup {\n return m(MarkupType.Portal, { parent, content });\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\nexport function render(content: Renderable, context = new Context(\"$\")): MarkupNode {\n const nodes = toMarkupNodes(context, [content]);\n if (nodes.length === 1) {\n return nodes[0];\n }\n return new Dynamic(context, () => nodes);\n}\n\n/**\n * Convert basically anything into a set of MarkupElements.\n */\nexport function toMarkupNodes(context: Context, ...content: any[]): MarkupNode[] {\n const items = content.flat(Infinity);\n const elements: MarkupNode[] = [];\n\n for (const item of items) {\n if (item === null || item === undefined || item === false) {\n continue;\n }\n\n if (item instanceof Node) {\n elements.push(new DOMNode(item));\n continue;\n }\n\n if (item instanceof Markup) {\n if (isFunction(item.type)) {\n elements.push(new ViewInstance(context, item.type as View<any>, item.props));\n continue;\n } else if (isString(item.type)) {\n switch (item.type) {\n case MarkupType.DOM: {\n const attrs = item.props! as MarkupProps[MarkupType.DOM];\n elements.push(new DOMNode(attrs.value));\n continue;\n }\n case MarkupType.Text: {\n const attrs = item.props! as MarkupProps[MarkupType.Text];\n elements.push(new DOMNode(document.createTextNode(String(attrs.value))));\n continue;\n }\n case MarkupType.Repeat: {\n const attrs = item.props! as MarkupProps[MarkupType.Repeat];\n elements.push(new Repeat(context, attrs.items, attrs.key, attrs.render));\n continue;\n }\n case MarkupType.Dynamic: {\n const attrs = item.props! as MarkupProps[MarkupType.Dynamic];\n elements.push(new Dynamic(context, attrs.source));\n continue;\n }\n case MarkupType.Portal: {\n const attrs = item.props! as MarkupProps[MarkupType.Portal];\n elements.push(new Portal(context, attrs.content, attrs.parent));\n continue;\n }\n default:\n // Handle type as an HTML tag.\n elements.push(new HTML(context, item.type, item.props));\n continue;\n }\n } else {\n throw new TypeError(`Expected a string or view function. Got: ${item.type}`);\n }\n }\n\n if (isMarkupNode(item)) {\n elements.push(item);\n continue;\n }\n\n if (isFunction(item)) {\n elements.push(new Dynamic(context, item));\n continue;\n }\n\n // fallback to displaying value as text\n elements.push(new DOMNode(document.createTextNode(String(item))));\n }\n\n return elements;\n}\n"],"names":["NAME","LIFECYCLE","PARENT","STORES","STATE","ContextLifecycle","context","__publicField","event","listener","listeners","_e","_d","_c","_b","_a","_Context","name","options","__privateAdd","_name","__privateSet","untracked","logger","createLogger","get","__privateGet","descriptors","key","state","parent","store","StoreError","getUniqueId","result","error","isFunction","callback","fn","unsubscribe","effect","disposed","defaultValue","value","entries","typeOf","Context","createContext","IS_MARKUP_NODE","DOMNode","node","after","parentIsUnmounting","Dynamic","$slot","content","isArray","i","element","nodes","toMarkupNodes","previous","lastChildNextSibling","VIEW","ViewInstance","view","props","wasMounted","render","isCamelCaseEventName","IS_SVG","HTML","tag","getLoggerName","getEnv","mixins","classes","omit","child","e","eventName","knownEventNames","current","privateProps","_key","_prev","styles","unsubscribers","propUnsubscribers","unapply","mapped","getStyleMap","priority","classUnsubscribers","getClassMap","isString","names","isObject","item","lines","line","_value","entry","camelToKebab","className","$","ofs","Portal","_parent","_after","Repeat","items","potentialItems","index","newItems","connected","batch","potential","$item","deepEqual","$index","RepeatItemView","lastItem","Markup","type","isMarkupNode","m","when","condition","thenContent","elseContent","unless","repeat","portal","elements","attrs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markup-BBa4WBj1.js","sources":["../src/core/context.ts","../src/core/symbols.ts","../src/core/nodes/dom.ts","../src/core/nodes/dynamic.ts","../src/core/nodes/view.ts","../src/core/nodes/html.ts","../src/core/nodes/portal.ts","../src/core/nodes/repeat.ts","../src/core/markup.ts"],"sourcesContent":["import { isFunction, typeOf } from \"../typeChecking\";\nimport type { Store } from \"../types\";\nimport { getUniqueId } from \"../utils\";\nimport { createLogger, type Logger, type LoggerOptions } from \"./logger\";\nimport { effect, type EffectFn, get, type MaybeSignal, untracked, type UnsubscribeFn } from \"./signals\";\n\nexport enum LifecycleEvent {\n WILL_MOUNT,\n DID_MOUNT,\n WILL_UNMOUNT,\n DID_UNMOUNT,\n DISPOSE,\n}\n\ntype LifecycleListener = () => void;\n\nenum LifecycleState {\n Unmounted = 0,\n WillMount = 1,\n DidMount = 2,\n WillUnmount = 3,\n DidUnmount = 4,\n Disposed = 5,\n}\n\nconst NAME = Symbol(\"name\");\nconst LIFECYCLE = Symbol(\"lifecycle\");\nconst PARENT = Symbol(\"parent\");\nconst STORES = Symbol(\"stores\");\nconst STATE = Symbol(\"state\");\n\n/**\n * Manages lifecycle events for a Context.\n */\nclass ContextLifecycle {\n private context;\n\n state = LifecycleState.Unmounted;\n listeners = new Map<LifecycleEvent, Set<LifecycleListener>>();\n bound?: Set<Context>;\n\n constructor(context: Context) {\n this.context = context;\n }\n\n /**\n * Listen for a certain event to be emitted. Listeners are called when the event results in a state change.\n */\n on<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n const listeners = this.listeners.get(event);\n if (!listeners) {\n this.listeners.set(event, new Set([listener]));\n } else {\n listeners.add(listener);\n }\n }\n\n /**\n * Stop a particular listener from being called when an event is emitted.\n */\n off<E extends LifecycleEvent>(event: E, listener: LifecycleListener) {\n const listeners = this.listeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n /**\n * Advance the lifecycle state machine.\n */\n emit<E extends LifecycleEvent>(event: E) {\n switch (event) {\n case LifecycleEvent.WILL_MOUNT: {\n if (this.state < LifecycleState.WillMount) {\n this.state = LifecycleState.WillMount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to WILL_MOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DID_MOUNT: {\n if (this.state >= LifecycleState.WillMount && this.state < LifecycleState.DidMount) {\n this.state = LifecycleState.DidMount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to WILL_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.WILL_UNMOUNT: {\n if (this.state >= LifecycleState.DidMount && this.state < LifecycleState.WillUnmount) {\n this.notify(event);\n this.state = LifecycleState.WillUnmount;\n } else {\n this.context.crash(new Error(`Tried to WILL_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DID_UNMOUNT: {\n if (this.state >= LifecycleState.WillUnmount && this.state < LifecycleState.DidUnmount) {\n // Loop back to .Unmounted\n this.state = LifecycleState.DidUnmount % LifecycleState.DidUnmount;\n this.notify(event);\n } else {\n this.context.crash(new Error(`Tried to DID_UNMOUNT context at state ${this.state}`));\n }\n break;\n }\n case LifecycleEvent.DISPOSE: {\n if (this.state === LifecycleState.Unmounted) {\n this.notify(event);\n this.listeners.clear();\n this.bound = undefined;\n this.state = LifecycleState.Disposed;\n } else {\n this.context.crash(new Error(`Tried to DISPOSE context at state ${this.state}`));\n }\n break;\n }\n }\n }\n\n /**\n * Bind `context` to this lifecycle; when any event is emitted here it will be emitted for `context` as well.\n */\n bind(context: Context) {\n if (!this.bound) {\n this.bound = new Set([context]);\n } else {\n this.bound.add(context);\n }\n }\n\n /**\n * Call all the event's listeners and re-emit to bound contexts.\n */\n private notify<E extends LifecycleEvent>(event: E) {\n // Call listener functions.\n const listeners = this.listeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n // Emit to bound contexts.\n if (this.bound) {\n for (const context of this.bound) {\n context[LIFECYCLE].emit(event);\n }\n }\n }\n}\n\nexport interface ContextOptions {\n logger?: LoggerOptions;\n}\n\nexport interface LinkedContextOptions extends ContextOptions {\n bindLifecycleToParent?: boolean;\n}\n\nexport interface Context extends Logger {}\n\nexport class Context implements Logger {\n #name: MaybeSignal<string>;\n\n [NAME]: string;\n [LIFECYCLE] = new ContextLifecycle(this);\n [PARENT]?: Context;\n [STORES]?: Map<Store<any, any>, any>;\n [STATE]?: Map<any, any>;\n\n get isMounted() {\n const { state } = this[LIFECYCLE];\n return state >= LifecycleState.DidMount && state < LifecycleState.DidUnmount;\n }\n\n /**\n * Returns a new Context with this one as its parent.\n */\n static linked(parent: Context, name: MaybeSignal<string>, options?: LinkedContextOptions): Context {\n const context = new Context(name, options);\n context[PARENT] = parent;\n if (options?.bindLifecycleToParent) parent[LIFECYCLE].bind(context);\n return context;\n }\n\n /**\n * Emit \"will mount\" lifecycle event to `context`.\n */\n static willMount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.WILL_MOUNT);\n }\n /**\n * Emit \"did mount\" lifecycle event to `context`.\n */\n static didMount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.DID_MOUNT);\n }\n /**\n * Emit \"will unmount\" lifecycle event to `context`.\n */\n static willUnmount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.WILL_UNMOUNT);\n }\n /**\n * Emit \"did unmount\" lifecycle event to `context`.\n */\n static didUnmount(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.DID_UNMOUNT);\n }\n /**\n * Emit \"dispose\" lifecycle event to `context`.\n */\n static dispose(context: Context) {\n context[LIFECYCLE].emit(LifecycleEvent.DISPOSE);\n context[STATE] = undefined;\n context[STORES] = undefined;\n }\n\n /**\n * Traverses _parent contexts until arriving at one that doesn't have a parent itself.\n * Returns null if this context is the parent.\n */\n static getRoot(context: Context) {\n // This is like the programming version of \"Buffalo buffalo buffalo...\"\n let parent = context[PARENT];\n while (parent?.[PARENT]) {\n parent = parent[PARENT];\n }\n return parent ?? null;\n }\n\n constructor(name: MaybeSignal<string>, options?: ContextOptions) {\n this.#name = name;\n this[NAME] = untracked(name);\n\n // Add logger methods.\n const logger = createLogger(() => get(this.#name), options?.logger);\n const descriptors = Object.getOwnPropertyDescriptors(logger);\n for (const key in descriptors) {\n Object.defineProperty(this, key, descriptors[key]);\n }\n }\n\n /**\n * Returns the current name of this context.\n */\n getName(): string {\n return untracked(this.#name);\n }\n\n /**\n * Sets a new name for this context.\n */\n setName(name: MaybeSignal<string>) {\n this.#name = name;\n this[NAME] = untracked(name); // Try to store name as a readable string for debugging purposes.\n }\n\n /**\n * Creates an instance of a store and attaches it to this context.\n */\n addStore<T>(store: Store<any, T>, options?: any): this {\n if (this[STORES]?.get(store)) {\n let name = store.name ? `'${store.name}'` : \"this store\";\n throw this.crash(new StoreError(`An instance of ${name} was already added on this context.`));\n }\n\n const context = Context.linked(this, store.name, {\n bindLifecycleToParent: true,\n logger: { tag: getUniqueId(), tagName: \"uid\" },\n });\n try {\n if (!this[STORES]) this[STORES] = new Map();\n const result = store.call(context, options, context);\n this[STORES].set(store, result);\n } catch (error) {\n throw this.crash(error as Error);\n }\n\n return this;\n }\n\n /**\n * Retrieves the nearest instance of `store`. If this context doesn't have it, the parent context is checked. This process continues until either:\n * 1. An instance of the store is found and returned.\n * 2. No instance is found and an error is thrown.\n */\n getStore<T>(store: Store<any, T>): T {\n if (!isFunction(store)) {\n throw new StoreError(`Invalid store.`);\n }\n let context: Context = this;\n let result: unknown;\n while (true) {\n result = context[STORES]?.get(store);\n if (result == null && context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n if (result == null) {\n throw this.crash(new StoreError(`Store '${store.name}' is not provided by this context.`));\n }\n return result as T;\n }\n\n /**\n * Schedule a callback function to run just before this context is mounted.\n */\n beforeMount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.WILL_MOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.WILL_MOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run after this context is mounted.\n */\n onMount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.DID_MOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.DID_MOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run just before this context is unmounted.\n */\n beforeUnmount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.WILL_UNMOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.WILL_UNMOUNT, listener);\n }\n\n /**\n * Schedule a callback function to run after this context is unmounted.\n */\n onUnmount(listener: LifecycleListener) {\n this[LIFECYCLE].on(LifecycleEvent.DID_UNMOUNT, listener);\n return () => this[LIFECYCLE].off(LifecycleEvent.DID_UNMOUNT, listener);\n }\n\n effect(callback: EffectFn) {\n const fn = () => {\n try {\n return callback(); // Return callback so cleanup function passes through to effect handler\n } catch (error) {\n this.error(error);\n if (error instanceof Error) {\n this.crash(error);\n } else if (typeof error === \"string\") {\n this.crash(new Error(error));\n } else {\n this.crash(new Error(`Unknown error thrown in effect callback`));\n }\n }\n };\n\n if (this[LIFECYCLE].state >= LifecycleState.WillMount) {\n // This code is probably in a lifecycle hook; run the effect immediately and trigger unsubscribe when context unmounts.\n const unsubscribe = effect(fn);\n this[LIFECYCLE].on(LifecycleEvent.DID_UNMOUNT, unsubscribe);\n return unsubscribe;\n } else {\n // Prime the effect to run when the context is mounted and unsubscribe when unmounted, unless unsubscribed before `willMount`.\n let unsubscribe: UnsubscribeFn | undefined;\n let disposed = false;\n this[LIFECYCLE].on(LifecycleEvent.WILL_MOUNT, () => {\n if (!disposed) {\n unsubscribe = effect(fn);\n this[LIFECYCLE].on(LifecycleEvent.DID_UNMOUNT, unsubscribe);\n }\n });\n return () => {\n if (unsubscribe != null) {\n disposed = true;\n unsubscribe();\n }\n };\n }\n }\n\n /**\n * Gets the value stored at `key`, or returns the `defaultValue` if none is set.\n */\n getState<T>(key: any, defaultValue: T): T;\n\n /**\n * Gets the value stored at `key`, or throws an error if none is set.\n */\n getState<T>(key: any): T;\n\n /**\n * Returns a Map containing all state values available to this context.\n */\n getState(): Map<any, any>;\n\n getState<T>(key?: any, defaultValue?: T): T | Map<any, any> {\n if (arguments.length > 0) {\n // Get value by key\n let context: Context = this;\n let value: any;\n while (true) {\n value = context[STATE]?.get(key);\n if (value === undefined && context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n if (value === undefined) {\n if (arguments.length > 1) {\n return defaultValue!;\n } else {\n throw new Error(`Expected a value for '${String(key)}' but got undefined.`);\n }\n }\n return value;\n } else {\n // Get merged values\n let context: Context = this;\n const entries: [any, any][] = [];\n while (true) {\n if (context[STATE]) {\n entries.push(...context[STATE].entries());\n }\n if (context[PARENT] != null) {\n context = context[PARENT];\n } else {\n break;\n }\n }\n return new Map(entries.reverse());\n }\n }\n\n /**\n * Stores `value` at `key` in this context's state.\n */\n setState<T>(key: any, value: T): void;\n\n /**\n * For each tuple in `entries`, stores `value` at `key` in this context's state.\n */\n setState(entries: [key: any, value: any][]): void;\n\n setState() {\n if (!this[STATE]) {\n this[STATE] = new Map();\n }\n if (arguments.length === 2) {\n this[STATE].set(arguments[0], arguments[1]);\n } else if (typeOf(arguments[0]) === \"array\") {\n for (const [key, value] of arguments[0]) {\n if (value === undefined) {\n this[STATE].delete(key);\n } else {\n this[STATE].set(key, value);\n }\n }\n } else {\n throw new Error(`Invalid arguments.`);\n }\n\n return this;\n }\n}\n\nexport function createContext(name: MaybeSignal<string>, options?: ContextOptions) {\n return new Context(name, options);\n}\n\nexport class StoreError extends Error {}\n","// Type symbols; these are used to quickly check if a value is the expected object.\nexport const IS_MARKUP = Symbol.for(\"dollaMarkup\");\nexport const IS_MARKUP_NODE = Symbol.for(\"dollaMarkupNode\");\n","import type { MarkupNode } from \"../markup\";\nimport { IS_MARKUP_NODE } from \"../symbols\";\n\n/**\n * Wraps any plain DOM node in a MarkupNode interface.\n */\nexport class DOMNode implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root: Node;\n\n constructor(node: Node) {\n this.root = node;\n }\n\n isMounted() {\n return this.root.parentNode != null;\n }\n\n mount(parent: Element, after?: Node) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.root.parentNode && !parentIsUnmounting) {\n this.root.parentNode.removeChild(this.root);\n }\n }\n\n move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent && this.root instanceof Element) {\n try {\n (parent as any).moveBefore(this.root, after?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n}\n","import { isArray } from \"../../typeChecking.js\";\nimport type { Context } from \"../context.js\";\nimport { toMarkupNodes, type MarkupNode } from \"../markup.js\";\nimport { effect, untracked, Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\n/**\n * Displays dynamic children without a parent element.\n * Renders a Reactive value via a render function.\n *\n * This is probably the most used element type aside from HTML.\n */\nexport class Dynamic implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root = document.createTextNode(\"\");\n\n private children: MarkupNode[] = [];\n private context: Context;\n\n private $slot: Signal<any>;\n private unsubscribe?: UnsubscribeFn;\n\n constructor(context: Context, $slot: Signal<any>) {\n this.context = context;\n this.$slot = $slot;\n }\n\n isMounted() {\n return this.root.parentElement != null;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted()) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n try {\n const content = this.$slot();\n untracked(() => {\n this.update(isArray(content) ? content : [content]);\n });\n } catch (error) {\n this.context.crash(error as Error);\n }\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n this.unsubscribe?.();\n\n if (this.isMounted()) {\n this.cleanup(parentIsUnmounting);\n this.root.parentNode?.removeChild(this.root);\n }\n }\n\n move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent) {\n try {\n (parent as any).moveBefore(this.root, after?.nextSibling ?? null);\n for (let i = 0; i < this.children.length; i++) {\n this.children[i].move(parent, this.children[i - 1]?.root ?? this.root);\n }\n (parent as any).moveBefore(this.root, this.children.at(-1)?.root?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n\n private cleanup(parentIsUnmounting: boolean) {\n for (const element of this.children) {\n if (element.isMounted()) element.unmount(parentIsUnmounting);\n }\n this.children.length = 0;\n }\n\n private update(content: any[]) {\n this.cleanup(false);\n\n if (content.length === 0 || !this.isMounted()) return;\n\n const nodes = toMarkupNodes(this.context, content);\n\n for (const node of nodes) {\n const previous = this.children.at(-1)?.root || this.root;\n node.mount(this.root.parentElement!, previous);\n this.children.push(node);\n }\n\n this.moveMarker();\n }\n\n /**\n * Move marker node to end of children.\n */\n private moveMarker() {\n const parent = this.root.parentElement!;\n const lastChildNextSibling = this.children.at(-1)?.root?.nextSibling ?? null;\n if (\"moveBefore\" in parent) {\n (parent as any).moveBefore(this.root, lastChildNextSibling);\n } else {\n parent.insertBefore(this.root, lastChildNextSibling);\n }\n }\n}\n","import type { View } from \"../../types.js\";\nimport { getUniqueId } from \"../../utils.js\";\nimport { Context } from \"../context.js\";\nimport { render, type MarkupNode } from \"../markup.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\nexport const VIEW = Symbol(\"View\");\n\nexport class ViewInstance<P> implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n uniqueId = getUniqueId();\n context: Context;\n props;\n view;\n\n node?: MarkupNode;\n\n get root() {\n return this.node?.root!;\n }\n\n constructor(context: Context, view: View<P>, props: P) {\n this.context = Context.linked(context, view.name ?? \"anonymous view\", {\n logger: {\n tag: this.uniqueId,\n tagName: \"uid\",\n },\n });\n this.context.setState(VIEW, this);\n this.props = props;\n this.view = view;\n }\n\n isMounted() {\n return this.node?.isMounted() ?? false;\n }\n\n mount(parent: Element, after?: Node) {\n // Don't run lifecycle hooks or initialize if already connected.\n // Calling connect again can be used to re-order elements that are already connected to the DOM.\n const wasMounted = this.isMounted();\n\n if (!wasMounted) {\n const { context, props, view } = this;\n try {\n const result = view.call(context, props, context);\n if (result != null && result !== false) {\n this.node = render(result, context);\n }\n } catch (error) {\n if (error instanceof Error) {\n context.crash(error);\n }\n throw error;\n }\n\n Context.willMount(this.context);\n }\n\n if (this.node) {\n this.node.mount(parent, after);\n }\n\n if (!wasMounted) {\n Context.didMount(this.context);\n }\n }\n\n unmount(parentIsUnmounting = false) {\n Context.willUnmount(this.context);\n\n if (this.node) {\n this.node.unmount(parentIsUnmounting);\n }\n\n Context.didUnmount(this.context);\n Context.dispose(this.context);\n }\n\n move(parent: Element, after?: Node) {\n this.node?.move(parent, after);\n }\n}\n","import { isArray, isFunction, isObject, isString } from \"../../typeChecking.js\";\nimport { omit } from \"../../utils.js\";\nimport { Context } from \"../context.js\";\nimport { getEnv } from \"../env.js\";\nimport { toMarkupNodes, type MarkupNode } from \"../markup.js\";\nimport { effect, get, type MaybeSignal, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\nimport { VIEW, ViewInstance } from \"./view.js\";\n\nconst isCamelCaseEventName = (key: string) => /^on[A-Z]/.test(key);\n\nexport type Mixin<E extends Element = Element> = (element: E, context: Context) => void;\n\nconst IS_SVG = Symbol(\"HTML.isSVG\");\n\nexport class HTML implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root?: HTMLElement | SVGElement;\n\n private parentContext: Context;\n private context: Context;\n\n tag;\n props: Record<string, any>;\n\n private childNodes: MarkupNode[] = [];\n private unsubscribers: UnsubscribeFn[] = [];\n\n // Track the ref so we can nullify it on unmount.\n private ref?: Source<any>;\n\n // Prevents 'onClickOutside' handlers from firing in the same cycle in which the element is connected.\n private canClickAway = false;\n\n constructor(context: Context, tag: string, props: Record<string, any>) {\n this.parentContext = context;\n this.tag = tag;\n this.props = props;\n\n this.context = Context.linked(this.parentContext, getLoggerName.bind(this));\n\n // This and all nested views will be created as SVG elements.\n if (tag.toLowerCase() === \"svg\") {\n this.context.setState(IS_SVG, true);\n }\n\n // Create node with the appropriate constructor.\n if (this.context.getState(IS_SVG, false)) {\n this.root = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n } else {\n this.root = document.createElement(tag);\n }\n\n // Add view name as a data attribute in development mode for better debugging.\n if (getEnv() === \"development\") {\n const view = this.context.getState<ViewInstance<any> | null>(VIEW, null);\n if (view) {\n this.root.dataset.view = view.context.getName();\n }\n }\n\n if (props.mixin) {\n const mixins = isArray(props.mixin) ? props.mixin : [props.mixin];\n for (const fn of mixins) {\n fn(\n this.root,\n Context.linked(this.context, getLoggerName.bind(this), {\n bindLifecycleToParent: true,\n logger: { tagName: fn.name === \"mixin\" ? undefined : \"mixin\", tag: fn.name },\n }),\n );\n }\n }\n\n const classes = props.className ?? props.class;\n\n this.applyProps(this.root!, omit([\"class\", \"className\", \"ref\", \"mixin\", \"children\"], props));\n if (props.style) this.applyStyles(this.root, props.style, this.unsubscribers);\n if (classes) this.applyClasses(this.root, classes, this.unsubscribers);\n\n if (props.ref) {\n if (isFunction(props.ref)) {\n this.ref = props.ref;\n this.ref(this.root);\n } else {\n throw new Error(\"Expected ref to be a function. Got: \" + props.ref);\n }\n }\n\n if (props.children) {\n this.childNodes = toMarkupNodes(this.context, props.children);\n }\n }\n\n isMounted() {\n return this.context.isMounted;\n // return this.root?.parentNode != null;\n }\n\n mount(parent: Node, after?: Node) {\n const wasMounted = this.isMounted();\n\n if (!wasMounted) {\n Context.willMount(this.context);\n\n for (let i = 0; i < this.childNodes.length; i++) {\n const child = this.childNodes[i];\n const previous = i > 0 ? this.childNodes[i - 1].root : undefined;\n child.mount(this.root!, previous);\n }\n }\n\n parent.insertBefore(this.root!, after?.nextSibling ?? null);\n\n this.canClickAway = true;\n\n if (!wasMounted) Context.didMount(this.context);\n }\n\n unmount(parentIsUnmounting = false) {\n Context.willUnmount(this.context);\n\n if (!parentIsUnmounting) {\n this.root!.parentNode?.removeChild(this.root!);\n }\n\n for (const child of this.childNodes) {\n child.unmount(true);\n }\n\n this.canClickAway = false;\n\n for (const unsubscribe of this.unsubscribers) {\n unsubscribe();\n }\n this.unsubscribers.length = 0;\n\n if (this.ref) {\n this.ref(undefined);\n }\n\n Context.didUnmount(this.context);\n Context.dispose(this.context);\n }\n\n move(parent: Element, after?: Node) {\n if (\"moveBefore\" in parent) {\n try {\n (parent as any).moveBefore(this.root!, after?.nextSibling ?? null);\n } catch {\n this.mount(parent, after);\n }\n } else {\n this.mount(parent, after);\n }\n }\n\n private attachProp<T>(value: MaybeSignal<T>, callback: (value: T) => void) {\n if (isFunction(value)) {\n this.unsubscribers.push(\n effect(() => {\n try {\n callback((value as Signal<T>)());\n } catch (error) {\n this.context!.error(error);\n this.context!.crash(error as Error);\n }\n }),\n );\n } else {\n callback(value);\n }\n }\n\n private applyProps(element: HTMLElement | SVGElement, props: Record<string, unknown>) {\n const context = this.context!;\n\n for (const key in props) {\n const value = props[key];\n\n // TODO: If key starts with 'attr:' it is applied with .setAttribute, if 'prop:' it is set directly on the element. If 'on:' it is applied with .addEventListener\n\n if (key === \"on:clickoutside\" || key === \"onClickOutside\" || key === \"onclickoutside\") {\n const listener = (e: Event) => {\n if (this.canClickAway && !element.contains(e.target as any)) {\n (value as (e: Event) => void)(e);\n }\n };\n\n const options = { capture: true };\n\n window.addEventListener(\"click\", listener, options);\n\n this.unsubscribers.push(() => {\n window.removeEventListener(\"click\", listener, options);\n });\n } else if (isFunction(value) && isCamelCaseEventName(key)) {\n const eventName = key.slice(2).toLowerCase();\n\n const listener: (e: Event) => void = value as (e: Event) => void;\n\n element.addEventListener(eventName, listener);\n\n this.unsubscribers.push(() => {\n element.removeEventListener(eventName, listener);\n });\n } else if (key.startsWith(\"on\") && isFunction(value) && knownEventNames.includes(key.substring(2))) {\n // Event handler property (element.onsomething = function () {})\n (element as any)[key] = value;\n this.unsubscribers.push(() => {\n (element as any)[key] = undefined;\n });\n } else if (key.includes(\"-\")) {\n // Names with dashes in them are not valid prop names, so they are treated as attributes.\n this.attachProp(value, (current) => {\n if (current == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(current));\n }\n });\n } else if (!privateProps.includes(key)) {\n if (context.getState(IS_SVG, false)) {\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(key, String(props[key]));\n } else {\n element.removeAttribute(key);\n }\n });\n } else {\n switch (key) {\n case \"contentEditable\":\n case \"value\":\n this.attachProp(value, (current) => {\n (element as any)[key] = String(current);\n });\n break;\n\n case \"for\":\n this.attachProp(value, (current) => {\n (element as any).htmlFor = current;\n });\n break;\n\n case \"innerHTML\":\n this.attachProp(value, (current) => {\n (element as any).innerHTML = current;\n });\n break;\n\n case \"title\":\n this.attachProp(value, (current) => {\n if (current == null) {\n (element as any).removeAttribute(key);\n } else {\n (element as any).setAttribute(key, String(current));\n }\n });\n\n case \"checked\":\n this.attachProp(value, (current) => {\n (element as any).checked = current;\n\n // Set attribute also or styles don't take effect.\n if (current) {\n element.setAttribute(\"checked\", \"\");\n } else {\n element.removeAttribute(\"checked\");\n }\n });\n break;\n\n case \"autocomplete\":\n case \"autocapitalize\":\n this.attachProp(value, (current) => {\n if (typeof current === \"string\") {\n (element as any)[key] = current;\n } else if (current) {\n (element as any)[key] = \"on\";\n } else {\n (element as any)[key] = \"off\";\n }\n });\n break;\n\n default: {\n if (key.startsWith(\"prop:\")) {\n const _key = key.substring(5);\n this.attachProp(value, (current) => {\n (element as any)[_key] = current;\n });\n } else if (key.startsWith(\"on:\")) {\n const _key = key.substring(3);\n let _prev: EventListener | undefined;\n if (isFunction(value)) {\n element.addEventListener(_key, value as EventListener);\n this.unsubscribers.push(() => {\n element.removeEventListener(_key, value as EventListener);\n });\n } else {\n this.attachProp(value as MaybeSignal<EventListener>, (current) => {\n if (!current && _prev) {\n element.removeEventListener(_key, _prev);\n } else if (current != null) {\n if (_prev && _prev !== current) {\n element.removeEventListener(_key, _prev);\n }\n element.addEventListener(_key, current);\n }\n _prev = current;\n });\n }\n } else if (key.startsWith(\"attr:\")) {\n const _key = key.substring(5).toLowerCase();\n this.attachProp(value, (current) => {\n if (current != null) {\n element.setAttribute(_key, String(current));\n } else {\n element.removeAttribute(_key);\n }\n });\n } else {\n this.attachProp(value, (current) => {\n (element as any)[key] = current;\n });\n }\n\n break;\n }\n }\n }\n }\n }\n }\n\n private applyStyles(element: HTMLElement | SVGElement, styles: unknown, unsubscribers: UnsubscribeFn[]) {\n const propUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(styles)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.style.cssText = \"\";\n unapply = this.applyStyles(element, get(styles), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getStyleMap(styles);\n\n for (const name in mapped) {\n const { value, priority } = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.style.setProperty(name, String(get(value)), priority);\n } else {\n element.style.removeProperty(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n propUnsubscribers.push(unsubscribe);\n } else if (value != undefined) {\n element.style.setProperty(name, String(value));\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of propUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n\n private applyClasses(element: HTMLElement | SVGElement, classes: unknown, unsubscribers: UnsubscribeFn[]) {\n const classUnsubscribers: UnsubscribeFn[] = [];\n\n if (isFunction(classes)) {\n let unapply: () => void;\n\n const unsubscribe = effect(() => {\n if (isFunction(unapply)) {\n unapply();\n }\n element.removeAttribute(\"class\");\n unapply = this.applyClasses(element, get(classes), unsubscribers);\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else {\n const mapped = getClassMap(classes);\n\n for (const name in mapped) {\n const value = mapped[name];\n\n if (isFunction(value)) {\n const unsubscribe = effect(() => {\n if (get(value)) {\n element.classList.add(name);\n } else {\n element.classList.remove(name);\n }\n });\n\n unsubscribers.push(unsubscribe);\n classUnsubscribers.push(unsubscribe);\n } else if (value) {\n element.classList.add(name);\n }\n }\n }\n\n return function unapply() {\n for (const unsubscribe of classUnsubscribers) {\n unsubscribe();\n unsubscribers.splice(unsubscribers.indexOf(unsubscribe), 1);\n }\n };\n }\n}\n\n/**\n * Parse classes into a single object. Classes can be passed as a string, an object with class keys can boolean values, or an array with a mix of both.\n */\nfunction getClassMap(classes: unknown) {\n let mapped: Record<string, boolean> = {};\n\n if (isString(classes)) {\n // Support multiple classes in one string like HTML.\n const names = classes.split(\" \");\n for (const name of names) {\n mapped[name] = true;\n }\n } else if (isObject(classes)) {\n Object.assign(mapped, classes);\n } else if (Array.isArray(classes)) {\n Array.from(classes)\n .filter(Boolean)\n .forEach((item) => {\n Object.assign(mapped, getClassMap(item));\n });\n }\n\n // Delete undefined keys. These are usually the result of a class that is not specified in the stylesheet and would have no effect on appearance.\n delete mapped[\"undefined\"];\n\n return mapped;\n}\n\n/**\n * Parse styles into a single object.\n */\nfunction getStyleMap(styles: unknown) {\n let mapped: Record<string, { value: unknown; priority?: string }> = {};\n\n if (isString(styles)) {\n const lines = styles.split(\";\").filter((line) => line.trim() !== \"\");\n for (const line of lines) {\n const [key, _value] = line.split(\":\");\n const entry: { value: unknown; priority?: string } = {\n value: _value,\n };\n if (_value.includes(\"!important\")) {\n entry.priority = \"important\";\n entry.value = _value.replace(\"!important\", \"\").trim();\n } else {\n entry.value = _value.trim();\n }\n mapped[camelToKebab(key.trim())] = entry;\n }\n }\n if (isObject(styles)) {\n for (const key in styles) {\n if (key.startsWith(\"--\")) {\n // Pass through variable names without processing.\n mapped[key] = { value: styles[key] };\n } else {\n mapped[camelToKebab(key)] = { value: styles[key] };\n }\n }\n } else if (Array.isArray(styles)) {\n Array.from(styles)\n .filter((item) => item != null)\n .forEach((item) => {\n Object.assign(mapped, getStyleMap(item));\n });\n }\n\n return mapped;\n}\n\nfunction getLoggerName(this: HTML) {\n if (this.root == null) return this.tag;\n let name = this.root.tagName.toLowerCase();\n if (this.root.id) {\n name += `#${this.root.id}`;\n }\n if (this.root.classList.length > 0) {\n for (const className of this.root.classList.values()) {\n name += `.${className}`;\n }\n }\n return name;\n}\n\n/**\n * Converts a camelCase string to kebab-case.\n */\nfunction camelToKebab(value: string): string {\n return value.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? \"-\" : \"\") + $.toLowerCase());\n}\n\n// Attributes in this list will not be forwarded to the DOM node.\nconst privateProps = [\"ref\", \"children\", \"class\", \"style\", \"data\", \"mixin\"];\n\n// A list of all known event names. These will be handled as event listeners.\nconst knownEventNames = [\n // Element\n \"animationcancel\",\n \"animationend\",\n \"animationiteration\",\n \"animationstart\",\n \"auxclick\",\n \"beforeinput\",\n \"beforematch\",\n \"beforexrselect\",\n \"blur\",\n \"click\",\n \"compositionend\",\n \"compositionstart\",\n \"compositionupdate\",\n \"contentvisibilityautostatechange\",\n \"contextmenu\",\n \"copy\",\n \"cut\",\n \"dblclick\",\n \"focus\",\n \"focusin\",\n \"focusout\",\n \"fullscreenchange\",\n \"fullscreenerror\",\n \"gotpointercapture\",\n \"input\",\n \"keydown\",\n \"keyup\",\n \"lostpointercapture\",\n \"mousedown\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n \"paste\",\n \"pointercancel\",\n \"pointerdown\",\n \"pointerenter\",\n \"pointerleave\",\n \"pointermove\",\n \"pointerout\",\n \"pointerover\",\n \"pointerrawupdate\",\n \"pointerup\",\n \"scroll\",\n \"scrollend\",\n \"scrollsnapchange\",\n \"scrollsnapchanging\",\n \"securitypolicyviolation\",\n \"touchcancel\",\n \"touchend\",\n \"touchmove\",\n \"touchstart\",\n \"transitioncancel\",\n \"transitionend\",\n \"transitionrun\",\n \"transitionstart\",\n \"webkitmouseforcechanged\",\n \"webkitmouseforcedown\",\n \"webkitmouseforceup\",\n \"webkimouseforcewillbegin\",\n \"wheel\",\n\n // HTMLElement\n \"beforetoggle\",\n \"change\",\n \"command\",\n \"drag\",\n \"dragend\",\n \"dragenter\",\n \"dragleave\",\n \"dragover\",\n \"dragstart\",\n \"drop\",\n \"error\",\n \"load\",\n \"toggle\",\n\n // HTMLInputElement\n \"cancel\",\n \"invalid\",\n \"search\",\n \"select\",\n \"selectionchange\",\n\n // HTMLFormElement\n \"formdata\",\n \"reset\",\n \"submit\",\n];\n","import type { Renderable } from \"../../types.js\";\nimport { Context } from \"../context.js\";\nimport { render, type MarkupNode } from \"../markup.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\n\n/**\n * Renders content into a specified parent node.\n */\nexport class Portal implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n private context;\n private content;\n private parent;\n\n private element?: MarkupNode;\n\n constructor(context: Context, content: Renderable, parent: Element) {\n this.context = context;\n this.content = content;\n this.parent = parent;\n }\n\n isMounted() {\n if (!this.element) {\n return false;\n }\n return this.element.isMounted();\n }\n\n mount(_parent: Element, _after?: Node) {\n this.element = render(this.content, this.context);\n this.element.mount(this.parent);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.element?.isMounted()) {\n // Portals MUST unmount DOM nodes because they won't be removed by parents unmounting.\n this.element.unmount(false);\n }\n }\n\n move(_parent: Element, _after?: Node) {}\n}\n","import type { Renderable } from \"../../types.js\";\nimport { deepEqual } from \"../../utils.js\";\nimport type { Context } from \"../context.js\";\nimport type { MarkupNode } from \"../markup.js\";\nimport { $, batch, effect, untracked, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_NODE } from \"../symbols.js\";\nimport { ViewInstance } from \"./view.js\";\n\n// ----- Types ----- //\n\nexport type Key = string | number | symbol;\n\nexport type KeyFn<T> = (item: T, index: number) => Key;\nexport type RenderFn<T> = (item: Signal<T>, index: Signal<number>, ctx: Context) => Renderable;\n\ntype ConnectedItem<T> = {\n key: any;\n $item: Source<T>;\n $index: Source<number>;\n node: MarkupNode;\n};\n\n// ----- Code ----- //\n\nexport class Repeat<T> implements MarkupNode {\n [IS_MARKUP_NODE] = true;\n\n root = document.createTextNode(\"\");\n\n private context;\n\n private items: Signal<T[]>;\n private key: KeyFn<T>;\n private render: RenderFn<T>;\n\n private unsubscribe: UnsubscribeFn | null = null;\n private connectedItems: Map<Key, ConnectedItem<T>> = new Map();\n\n constructor(context: Context, items: Signal<T[]>, key: KeyFn<T>, render: RenderFn<T>) {\n this.context = context;\n\n this.items = items;\n this.key = key;\n this.render = render;\n }\n\n isMounted() {\n return this.root.parentElement != null;\n }\n\n mount(parent: Element, after?: Node) {\n if (!this.isMounted()) {\n parent.insertBefore(this.root, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n let value = this.items();\n\n if (value == null) {\n value = [];\n this.context.warn(\"repeat() received empty value for items\", value);\n }\n\n untracked(() => {\n this._update(Array.from(value));\n });\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n\n if (!parentIsUnmounting && this.isMounted()) {\n this.root.parentNode?.removeChild(this.root);\n }\n\n this._cleanup(parentIsUnmounting);\n }\n\n move(parent: Element, after?: Node) {\n // TODO:\n return this.mount(parent, after);\n }\n\n private _cleanup(parentIsUnmounting: boolean) {\n for (const item of this.connectedItems.values()) {\n item.node.unmount(parentIsUnmounting);\n }\n this.connectedItems.clear();\n }\n\n private _update(value: T[]) {\n if (value.length === 0 || !this.isMounted()) {\n return this._cleanup(false);\n }\n\n type UpdateItem = { key: string | number | symbol; value: T; index: number };\n\n const potentialItems = new Map<string | number | symbol, UpdateItem>();\n let index = 0;\n\n for (const item of value) {\n const key = this.key(item, index);\n potentialItems.set(key, {\n key,\n value: item,\n index: index++,\n });\n }\n\n const newItems: ConnectedItem<T>[] = [];\n\n // Remove views for items that no longer exist in the new list.\n for (const connected of this.connectedItems.values()) {\n if (!potentialItems.has(connected.key) && connected.node.isMounted()) {\n connected.node.unmount(false);\n }\n }\n\n batch(() => {\n // Add new views and update state for existing ones.\n for (const potential of potentialItems.values()) {\n const connected = this.connectedItems.get(potential.key);\n\n if (connected && connected.node.isMounted()) {\n connected.$item(potential.value);\n connected.$index(potential.index);\n\n newItems[potential.index] = connected;\n } else {\n // deepEqual avoids running update code again if the data is equivalent. In list updates this happens a lot.\n const $item = $(potential.value, { equals: deepEqual });\n const $index = $(potential.index);\n\n newItems[potential.index] = {\n key: potential.key,\n $item,\n $index,\n node: new ViewInstance(this.context, RepeatItemView, {\n $item: () => $item(),\n $index: () => $index(),\n render: this.render,\n }),\n };\n }\n }\n });\n\n // Reconnect to ensure order. Lifecycle hooks won't be run again if the view is already connected.\n // TODO: Use a smarter inline reordering method. This causes scrollbars to jump.\n for (let i = 0; i < newItems.length; i++) {\n const item = newItems[i];\n const previous = newItems[i - 1]?.node.root ?? this.root;\n\n const connected = this.connectedItems.get(item.key);\n if (connected && connected.node.isMounted()) {\n item.node.move(this.root.parentElement!, previous);\n } else {\n item.node.mount(this.root.parentElement!, previous);\n }\n }\n\n this.connectedItems.clear();\n for (const item of newItems) {\n this.connectedItems.set(item.key, item);\n }\n\n // Move marker node to end.\n const lastItem = newItems.at(-1)?.node.root ?? this.root;\n this.root.parentNode?.insertBefore(this.root, lastItem.nextSibling);\n }\n}\n\ninterface ListItemProps {\n $item: Signal<any>;\n $index: Signal<number>;\n render: (item: Signal<any>, index: Signal<number>, context: Context) => Renderable;\n}\n\nfunction RepeatItemView(props: ListItemProps, context: Context) {\n context.setName(\"@RepeatItemView\");\n return props.render.call(context, props.$item, props.$index, context);\n}\n","import { isFunction, isString } from \"../typeChecking.js\";\nimport type { Renderable, View } from \"../types.js\";\nimport { Context } from \"./context.js\";\nimport { DOMNode } from \"./nodes/dom.js\";\nimport { Dynamic } from \"./nodes/dynamic.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { KeyFn, RenderFn, Repeat } from \"./nodes/repeat.js\";\nimport { ViewInstance } from \"./nodes/view.js\";\nimport { $, get, type MaybeSignal, type Signal } from \"./signals.js\";\nimport { IS_MARKUP_NODE } from \"./symbols.js\";\n\n/*===========================*\\\n|| Markup ||\n\\*===========================*/\n\n/**\n * Markup is a set of element metadata that hasn't been constructed into a MarkupElement yet.\n */\nexport class Markup<P = any> {\n /**\n * In the case of a view, type will be the View function itself. It can also hold an identifier for special nodes like \"$cond\", \"$repeat\", etc.\n * DOM nodes can be created by name, such as HTML elements like \"div\", \"ul\" or \"span\", SVG elements like \"\"\n */\n type;\n\n /**\n * Data that will be passed to a new MarkupNode instance when it is constructed.\n * Includes a `children` prop if children were passed.\n */\n props;\n\n constructor(type: string | View<P>, props?: P) {\n this.type = type;\n this.props = props;\n }\n}\n\n/**\n * A mountable node that has been constructed from Markup metadata.\n */\nexport interface MarkupNode {\n /**\n *\n */\n readonly root?: Node;\n\n /**\n *\n */\n isMounted(): boolean;\n\n /**\n *\n */\n mount(parent: Element, after?: Node): void;\n\n /**\n *\n */\n unmount(parentIsUnmounting?: boolean): void;\n\n /**\n * Moves a node without unmounting and remounting (if the browser supports Element.moveBefore).\n */\n move(parent: Element, after?: Node): void;\n}\n\nexport function isMarkupNode(value: any): value is MarkupNode {\n return value?.[IS_MARKUP_NODE] === true;\n}\n\nexport enum MarkupType {\n Text = \"$text\",\n Repeat = \"$repeat\",\n Dynamic = \"$dynamic\",\n DOM = \"$dom\",\n Portal = \"$portal\",\n}\n\nexport interface MarkupProps {\n [MarkupType.Text]: { value: any };\n [MarkupType.Repeat]: {\n items: Signal<any[]>;\n key: KeyFn<any>;\n render: RenderFn<any>;\n };\n [MarkupType.Dynamic]: {\n source: Signal<any>;\n };\n [MarkupType.DOM]: {\n value: Node;\n };\n [MarkupType.Portal]: {\n content: Renderable;\n parent: Element;\n };\n\n [tag: string]: Record<string, any>;\n}\n\nexport function m<T extends keyof MarkupProps>(type: T, props: MarkupProps[T]): Markup;\n\nexport function m<P extends {}>(type: View<P>, props?: P): Markup;\nexport function m<P>(type: View<P>, props: P): Markup;\n\nexport function m(type: string | View<any>, props?: any) {\n return new Markup(type, props ?? {});\n}\n\n/*===========================*\\\n|| View Helpers ||\n\\*===========================*/\n\n/**\n * If `condition` is truthy, displays `thenContent`, otherwise `elseContent`.\n */\nexport function when(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return m(MarkupType.Dynamic, {\n source: $<Renderable>(() => {\n const value = get(condition);\n\n if (value && thenContent) {\n return thenContent;\n } else if (!value && elseContent) {\n return elseContent;\n }\n return null;\n }),\n });\n}\n\n/**\n * Inverted `when`. If `condition` is falsy, displays `thenContent`, otherwise `elseContent`.\n */\nexport function unless(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return when(condition, elseContent, thenContent);\n}\n\n/**\n * Calls `render` for each item in `items`. Dynamically adds and removes views as items change.\n * The result of `key` is used to compare items and decide if item was added, removed or updated.\n */\nexport function repeat<T>(items: MaybeSignal<T[]>, key: KeyFn<T>, render: RenderFn<T>): Markup {\n return m(MarkupType.Repeat, { items: () => get(items), key, render });\n}\n\n/**\n * Renders `content` into a `parent` node anywhere in the page, rather than its usual position in the view.\n */\nexport function portal(parent: Element, content: Renderable): Markup {\n return m(MarkupType.Portal, { parent, content });\n}\n\n/*===========================*\\\n|| Render ||\n\\*===========================*/\n\nexport function render(content: Renderable, context = new Context(\"$\")): MarkupNode {\n const nodes = toMarkupNodes(context, [content]);\n if (nodes.length === 1) {\n return nodes[0];\n }\n return new Dynamic(context, () => nodes);\n}\n\n/**\n * Convert basically anything into a set of MarkupElements.\n */\nexport function toMarkupNodes(context: Context, ...content: any[]): MarkupNode[] {\n const items = content.flat(Infinity);\n const elements: MarkupNode[] = [];\n\n for (const item of items) {\n if (item === null || item === undefined || item === false) {\n continue;\n }\n\n if (item instanceof Node) {\n elements.push(new DOMNode(item));\n continue;\n }\n\n if (item instanceof Markup) {\n if (isFunction(item.type)) {\n elements.push(new ViewInstance(context, item.type as View<any>, item.props));\n continue;\n } else if (isString(item.type)) {\n switch (item.type) {\n case MarkupType.DOM: {\n const attrs = item.props! as MarkupProps[MarkupType.DOM];\n elements.push(new DOMNode(attrs.value));\n continue;\n }\n case MarkupType.Text: {\n const attrs = item.props! as MarkupProps[MarkupType.Text];\n elements.push(new DOMNode(document.createTextNode(String(attrs.value))));\n continue;\n }\n case MarkupType.Repeat: {\n const attrs = item.props! as MarkupProps[MarkupType.Repeat];\n elements.push(new Repeat(context, attrs.items, attrs.key, attrs.render));\n continue;\n }\n case MarkupType.Dynamic: {\n const attrs = item.props! as MarkupProps[MarkupType.Dynamic];\n elements.push(new Dynamic(context, attrs.source));\n continue;\n }\n case MarkupType.Portal: {\n const attrs = item.props! as MarkupProps[MarkupType.Portal];\n elements.push(new Portal(context, attrs.content, attrs.parent));\n continue;\n }\n default:\n // Handle type as an HTML tag.\n elements.push(new HTML(context, item.type, item.props));\n continue;\n }\n } else {\n throw new TypeError(`Expected a string or view function. Got: ${item.type}`);\n }\n }\n\n if (isMarkupNode(item)) {\n elements.push(item);\n continue;\n }\n\n if (isFunction(item)) {\n elements.push(new Dynamic(context, item));\n continue;\n }\n\n // fallback to displaying value as text\n elements.push(new DOMNode(document.createTextNode(String(item))));\n }\n\n return elements;\n}\n"],"names":["NAME","LIFECYCLE","PARENT","STORES","STATE","ContextLifecycle","context","__publicField","event","listener","listeners","_e","_d","_c","_b","_a","_Context","name","options","__privateAdd","_name","__privateSet","untracked","logger","createLogger","get","__privateGet","descriptors","key","state","parent","store","StoreError","getUniqueId","result","error","isFunction","callback","fn","unsubscribe","effect","disposed","defaultValue","value","entries","typeOf","Context","createContext","IS_MARKUP_NODE","DOMNode","node","after","parentIsUnmounting","Dynamic","$slot","content","isArray","i","element","nodes","toMarkupNodes","previous","lastChildNextSibling","VIEW","ViewInstance","view","props","wasMounted","render","isCamelCaseEventName","IS_SVG","HTML","tag","getLoggerName","getEnv","mixins","classes","omit","child","e","eventName","knownEventNames","current","privateProps","_key","_prev","styles","unsubscribers","propUnsubscribers","unapply","mapped","getStyleMap","priority","classUnsubscribers","getClassMap","isString","names","isObject","item","lines","line","_value","entry","camelToKebab","className","$","ofs","Portal","_parent","_after","Repeat","items","potentialItems","index","newItems","connected","batch","potential","$item","deepEqual","$index","RepeatItemView","lastItem","Markup","type","isMarkupNode","m","when","condition","thenContent","elseContent","unless","repeat","portal","elements","attrs"],"mappings":";;;;;;;;;AAyBA,MAAMA,IAAO,OAAO,MAAM,GACpBC,IAAY,OAAO,WAAW,GAC9BC,IAAS,OAAO,QAAQ,GACxBC,IAAS,OAAO,QAAQ,GACxBC,IAAQ,OAAO,OAAO;AAK5B,MAAMC,GAAiB;AAAA,EAOrB,YAAYC,GAAkB;AANtB,IAAAC,EAAA;AAER,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,uCAAgB,IAA4C;AAC5D,IAAAA,EAAA;AAGE,SAAK,UAAUD;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,GAA6BE,GAAUC,GAA6B;AAClE,UAAMC,IAAY,KAAK,UAAU,IAAIF,CAAK;AAC1C,IAAKE,IAGHA,EAAU,IAAID,CAAQ,IAFjB,KAAA,UAAU,IAAID,GAAO,oBAAI,IAAI,CAACC,CAAQ,CAAC,CAAC;AAAA,EAG/C;AAAA;AAAA;AAAA;AAAA,EAMF,IAA8BD,GAAUC,GAA6B;AACnE,UAAMC,IAAY,KAAK,UAAU,IAAIF,CAAK;AAC1C,IAAIE,MACFA,EAAU,OAAOD,CAAQ,GACrBC,EAAU,SAAS,KAChB,KAAA,UAAU,OAAOF,CAAK;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA,EAMF,KAA+BA,GAAU;AACvC,YAAQA,GAAO;AAAA,MACb,KAAK,GAA2B;AAC1B,QAAA,KAAK,QAAQ,KACf,KAAK,QAAQ,GACb,KAAK,OAAOA,CAAK,KAEZ,KAAA,QAAQ,MAAM,IAAI,MAAM,wCAAwC,KAAK,KAAK,EAAE,CAAC;AAEpF;AAAA,MAAA;AAAA,MAEF,KAAK,GAA0B;AAC7B,QAAI,KAAK,SAAS,KAA4B,KAAK,QAAQ,KACzD,KAAK,QAAQ,GACb,KAAK,OAAOA,CAAK,KAEZ,KAAA,QAAQ,MAAM,IAAI,MAAM,0CAA0C,KAAK,KAAK,EAAE,CAAC;AAEtF;AAAA,MAAA;AAAA,MAEF,KAAK,GAA6B;AAChC,QAAI,KAAK,SAAS,KAA2B,KAAK,QAAQ,KACxD,KAAK,OAAOA,CAAK,GACjB,KAAK,QAAQ,KAER,KAAA,QAAQ,MAAM,IAAI,MAAM,0CAA0C,KAAK,KAAK,EAAE,CAAC;AAEtF;AAAA,MAAA;AAAA,MAEF,KAAK,GAA4B;AAC/B,QAAI,KAAK,SAAS,KAA8B,KAAK,QAAQ,KAE3D,KAAK,QAAQ,IAA4B,GACzC,KAAK,OAAOA,CAAK,KAEZ,KAAA,QAAQ,MAAM,IAAI,MAAM,yCAAyC,KAAK,KAAK,EAAE,CAAC;AAErF;AAAA,MAAA;AAAA,MAEF,KAAK,GAAwB;AACvB,QAAA,KAAK,UAAU,KACjB,KAAK,OAAOA,CAAK,GACjB,KAAK,UAAU,MAAM,GACrB,KAAK,QAAQ,QACb,KAAK,QAAQ,KAER,KAAA,QAAQ,MAAM,IAAI,MAAM,qCAAqC,KAAK,KAAK,EAAE,CAAC;AAEjF;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMF,KAAKF,GAAkB;AACjB,IAAC,KAAK,QAGH,KAAA,MAAM,IAAIA,CAAO,IAFtB,KAAK,QAAQ,oBAAI,IAAI,CAACA,CAAO,CAAC;AAAA,EAGhC;AAAA;AAAA;AAAA;AAAA,EAMM,OAAiCE,GAAU;AAEjD,UAAME,IAAY,KAAK,UAAU,IAAIF,CAAK;AAC1C,QAAIE;AACF,iBAAWD,KAAYC;AACZ,QAAAD,EAAA;AAIb,QAAI,KAAK;AACI,iBAAAH,KAAW,KAAK;AACjB,QAAAA,EAAAL,CAAS,EAAE,KAAKO,CAAK;AAAA,EAEjC;AAEJ;;AAeGG,IAAAX,GACAY,IAAAX,GACAY,IAAAX,GACAY,IAAAX,GACAY,IAAAX;AAPI,MAAMY,IAAN,MAAMA,EAA0B;AAAA,EAsErC,YAAYC,GAA2BC,GAA0B;AArEjE,IAAAC,EAAA,MAAAC;AAEA,IAAAb,EAAA,MAACI;AACD,IAAAJ,EAAA,MAACK,GAAa,IAAIP,GAAiB,IAAI;AACvC,IAAAE,EAAA,MAACM;AACD,IAAAN,EAAA,MAACO;AACD,IAAAP,EAAA,MAACQ;AAgEC,IAAAM,EAAA,MAAKD,GAAQH,IACR,KAAAjB,CAAI,IAAIsB,EAAUL,CAAI;AAGrB,UAAAM,IAASC,GAAa,MAAMC,EAAIC,EAAA,MAAKN,EAAK,GAAGF,KAAA,gBAAAA,EAAS,MAAM,GAC5DS,IAAc,OAAO,0BAA0BJ,CAAM;AAC3D,eAAWK,KAAOD;AAChB,aAAO,eAAe,MAAMC,GAAKD,EAAYC,CAAG,CAAC;AAAA,EACnD;AAAA,EAtEF,IAAI,YAAY;AACd,UAAM,EAAE,OAAAC,EAAA,IAAU,KAAK5B,CAAS;AACzB,WAAA4B,KAAS,KAA2BA,IAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMrD,OAAO,OAAOC,GAAiBb,GAA2BC,GAAyC;AACjG,UAAMZ,IAAU,IAAIU,EAAQC,GAAMC,CAAO;AACzC,WAAAZ,EAAQJ,CAAM,IAAI4B,GACdZ,KAAA,QAAAA,EAAS,yBAAuBY,EAAO7B,CAAS,EAAE,KAAKK,CAAO,GAC3DA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMT,OAAO,UAAUA,GAAkB;AACzB,IAAAA,EAAAL,CAAS,EAAE;AAAA,MAAK;AAAA;AAAA,IAAyB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,OAAO,SAASK,GAAkB;AACxB,IAAAA,EAAAL,CAAS,EAAE;AAAA,MAAK;AAAA;AAAA,IAAwB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKlD,OAAO,YAAYK,GAAkB;AAC3B,IAAAA,EAAAL,CAAS,EAAE;AAAA,MAAK;AAAA;AAAA,IAA2B;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKrD,OAAO,WAAWK,GAAkB;AAC1B,IAAAA,EAAAL,CAAS,EAAE;AAAA,MAAK;AAAA;AAAA,IAA0B;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKpD,OAAO,QAAQK,GAAkB;AACvB,IAAAA,EAAAL,CAAS,EAAE;AAAA,MAAK;AAAA;AAAA,IAAsB,GAC9CK,EAAQF,CAAK,IAAI,QACjBE,EAAQH,CAAM,IAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpB,OAAO,QAAQG,GAAkB;AAE3B,QAAAwB,IAASxB,EAAQJ,CAAM;AACpB,WAAA4B,KAAA,QAAAA,EAAS5B;AACd,MAAA4B,IAASA,EAAO5B,CAAM;AAExB,WAAO4B,KAAU;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAkBnB,UAAkB;AACT,WAAAR,EAAUI,EAAA,MAAKN,EAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,QAAQH,GAA2B;AACjC,IAAAI,EAAA,MAAKD,GAAQH,IACR,KAAAjB,CAAI,IAAIsB,EAAUL,CAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,SAAYc,GAAsBb,GAAqB;;AACrD,SAAIH,IAAA,KAAKZ,CAAM,MAAX,QAAAY,EAAc,IAAIgB,IAAQ;AAC5B,UAAId,IAAOc,EAAM,OAAO,IAAIA,EAAM,IAAI,MAAM;AAC5C,YAAM,KAAK,MAAM,IAAIC,EAAW,kBAAkBf,CAAI,qCAAqC,CAAC;AAAA,IAAA;AAG9F,UAAMX,IAAUU,EAAQ,OAAO,MAAMe,EAAM,MAAM;AAAA,MAC/C,uBAAuB;AAAA,MACvB,QAAQ,EAAE,KAAKE,GAAY,GAAG,SAAS,MAAM;AAAA,IAAA,CAC9C;AACG,QAAA;AACE,MAAC,KAAK9B,CAAM,WAAQA,CAAM,wBAAQ,IAAI;AAC1C,YAAM+B,IAASH,EAAM,KAAKzB,GAASY,GAASZ,CAAO;AACnD,WAAKH,CAAM,EAAE,IAAI4B,GAAOG,CAAM;AAAA,aACvBC,GAAO;AACR,YAAA,KAAK,MAAMA,CAAc;AAAA,IAAA;AAG1B,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQT,SAAYJ,GAAyB;;AAC/B,QAAA,CAACK,EAAWL,CAAK;AACb,YAAA,IAAIC,EAAW,gBAAgB;AAEvC,QAAI1B,IAAmB,MACnB4B;AACJ,WACEA,KAASnB,IAAAT,EAAQH,CAAM,MAAd,gBAAAY,EAAiB,IAAIgB,IAC1BG,KAAU,QAAQ5B,EAAQJ,CAAM,KAAK;AACvC,MAAAI,IAAUA,EAAQJ,CAAM;AAK5B,QAAIgC,KAAU;AACN,YAAA,KAAK,MAAM,IAAIF,EAAW,UAAUD,EAAM,IAAI,oCAAoC,CAAC;AAEpF,WAAAG;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMT,YAAYzB,GAA6B;AACvC,gBAAKR,CAAS,EAAE,GAAG,GAA2BQ,CAAQ,GAC/C,MAAM,KAAKR,CAAS,EAAE,IAAI,GAA2BQ,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMtE,QAAQA,GAA6B;AACnC,gBAAKR,CAAS,EAAE,GAAG,GAA0BQ,CAAQ,GAC9C,MAAM,KAAKR,CAAS,EAAE,IAAI,GAA0BQ,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMrE,cAAcA,GAA6B;AACzC,gBAAKR,CAAS,EAAE,GAAG,GAA6BQ,CAAQ,GACjD,MAAM,KAAKR,CAAS,EAAE,IAAI,GAA6BQ,CAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMxE,UAAUA,GAA6B;AACrC,gBAAKR,CAAS,EAAE,GAAG,GAA4BQ,CAAQ,GAChD,MAAM,KAAKR,CAAS,EAAE,IAAI,GAA4BQ,CAAQ;AAAA,EAAA;AAAA,EAGvE,OAAO4B,GAAoB;AACzB,UAAMC,IAAK,MAAM;AACX,UAAA;AACF,eAAOD,EAAS;AAAA,eACTF,GAAO;AACd,aAAK,MAAMA,CAAK,GACZA,aAAiB,QACnB,KAAK,MAAMA,CAAK,IACP,OAAOA,KAAU,WAC1B,KAAK,MAAM,IAAI,MAAMA,CAAK,CAAC,IAE3B,KAAK,MAAM,IAAI,MAAM,yCAAyC,CAAC;AAAA,MACjE;AAAA,IAEJ;AAEA,QAAI,KAAKlC,CAAS,EAAE,SAAS,GAA0B;AAE/C,YAAAsC,IAAcC,EAAOF,CAAE;AAC7B,kBAAKrC,CAAS,EAAE,GAAG,GAA4BsC,CAAW,GACnDA;AAAA,IAAA,OACF;AAED,UAAAA,GACAE,IAAW;AACf,kBAAKxC,CAAS,EAAE,GAAG,GAA2B,MAAM;AAClD,QAAKwC,MACHF,IAAcC,EAAOF,CAAE,GACvB,KAAKrC,CAAS,EAAE,GAAG,GAA4BsC,CAAW;AAAA,MAC5D,CACD,GACM,MAAM;AACX,QAAIA,KAAe,SACNE,IAAA,IACCF,EAAA;AAAA,MAEhB;AAAA,IAAA;AAAA,EACF;AAAA,EAkBF,SAAYX,GAAWc,GAAqC;;AACtD,QAAA,UAAU,SAAS,GAAG;AAExB,UAAIpC,IAAmB,MACnBqC;AACJ,aACEA,KAAQ5B,IAAAT,EAAQF,CAAK,MAAb,gBAAAW,EAAgB,IAAIa,IACxBe,MAAU,UAAarC,EAAQJ,CAAM,KAAK;AAC5C,QAAAI,IAAUA,EAAQJ,CAAM;AAK5B,UAAIyC,MAAU,QAAW;AACnB,YAAA,UAAU,SAAS;AACd,iBAAAD;AAEP,cAAM,IAAI,MAAM,yBAAyB,OAAOd,CAAG,CAAC,sBAAsB;AAAA,MAC5E;AAEK,aAAAe;AAAA,IAAA,OACF;AAEL,UAAIrC,IAAmB;AACvB,YAAMsC,IAAwB,CAAC;AAC/B,aACMtC,EAAQF,CAAK,KACfwC,EAAQ,KAAK,GAAGtC,EAAQF,CAAK,EAAE,SAAS,GAEtCE,EAAQJ,CAAM,KAAK;AACrB,QAAAI,IAAUA,EAAQJ,CAAM;AAK5B,aAAO,IAAI,IAAI0C,EAAQ,SAAS;AAAA,IAAA;AAAA,EAClC;AAAA,EAaF,WAAW;AAIL,QAHC,KAAKxC,CAAK,MACR,KAAAA,CAAK,IAAI,oBAAI,IAAI,IAEpB,UAAU,WAAW;AAClB,WAAAA,CAAK,EAAE,IAAI,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAAA,aACjCyC,GAAO,UAAU,CAAC,CAAC,MAAM;AAClC,iBAAW,CAACjB,GAAKe,CAAK,KAAK,UAAU,CAAC;AACpC,QAAIA,MAAU,SACP,KAAAvC,CAAK,EAAE,OAAOwB,CAAG,IAEtB,KAAKxB,CAAK,EAAE,IAAIwB,GAAKe,CAAK;AAAA;AAIxB,YAAA,IAAI,MAAM,oBAAoB;AAG/B,WAAA;AAAA,EAAA;AAEX;AA7SEvB,IAAA;AADK,IAAM0B,IAAN9B;AAgTS,SAAA+B,GAAc9B,GAA2BC,GAA0B;AAC1E,SAAA,IAAI4B,EAAQ7B,GAAMC,CAAO;AAClC;AAEO,MAAMc,UAAmB,MAAM;AAAC;ACzd1B,MAAAgB,IAAiB,OAAO,IAAI,iBAAiB;;ACKvDjC,IAAAiC;AADI,MAAMC,EAA8B;AAAA,EAKzC,YAAYC,GAAY;AAJxB,IAAA3C,EAAA,MAACQ,GAAkB;AAEnB,IAAAR,EAAA;AAGE,SAAK,OAAO2C;AAAA,EAAA;AAAA,EAGd,YAAY;AACH,WAAA,KAAK,KAAK,cAAc;AAAA,EAAA;AAAA,EAGjC,MAAMpB,GAAiBqB,GAAc;AACnC,IAAArB,EAAO,aAAa,KAAK,OAAMqB,KAAA,gBAAAA,EAAO,gBAAe,IAAI;AAAA,EAAA;AAAA,EAG3D,QAAQC,IAAqB,IAAO;AAClC,IAAI,KAAK,KAAK,cAAc,CAACA,KAC3B,KAAK,KAAK,WAAW,YAAY,KAAK,IAAI;AAAA,EAC5C;AAAA,EAGF,KAAKtB,GAAiBqB,GAAc;AAClC,QAAI,gBAAgBrB,KAAU,KAAK,gBAAgB;AAC7C,UAAA;AACD,QAAAA,EAAe,WAAW,KAAK,OAAMqB,KAAA,gBAAAA,EAAO,gBAAe,IAAI;AAAA,MAAA,QAC1D;AACD,aAAA,MAAMrB,GAAQqB,CAAK;AAAA,MAAA;AAAA;AAGrB,WAAA,MAAMrB,GAAQqB,CAAK;AAAA,EAC1B;AAEJ;;AC3BGpC,IAAAiC;AADI,MAAMK,EAA8B;AAAA,EAWzC,YAAY/C,GAAkBgD,GAAoB;AAVlD,IAAA/C,EAAA,MAACQ,GAAkB;AAEnB,IAAAR,EAAA,cAAO,SAAS,eAAe,EAAE;AAEzB,IAAAA,EAAA,kBAAyB,CAAC;AAC1B,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,UAAUD,GACf,KAAK,QAAQgD;AAAA,EAAA;AAAA,EAGf,YAAY;AACH,WAAA,KAAK,KAAK,iBAAiB;AAAA,EAAA;AAAA,EAGpC,MAAMxB,GAAcqB,GAAc;AAC5B,IAAC,KAAK,gBACRrB,EAAO,aAAa,KAAK,OAAMqB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAEpD,KAAA,cAAcX,EAAO,MAAM;AAC1B,UAAA;AACI,cAAAe,IAAU,KAAK,MAAM;AAC3B,QAAAjC,EAAU,MAAM;AACd,eAAK,OAAOkC,EAAQD,CAAO,IAAIA,IAAU,CAACA,CAAO,CAAC;AAAA,QAAA,CACnD;AAAA,eACMpB,GAAO;AACT,aAAA,QAAQ,MAAMA,CAAc;AAAA,MAAA;AAAA,IACnC,CACD;AAAA,EACH;AAAA,EAGF,QAAQiB,IAAqB,IAAO;;AAClC,KAAArC,IAAA,KAAK,gBAAL,QAAAA,EAAA,YAEI,KAAK,gBACP,KAAK,QAAQqC,CAAkB,IAC/BtC,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,YAAY,KAAK;AAAA,EACzC;AAAA,EAGF,KAAKgB,GAAiBqB,GAAc;;AAClC,QAAI,gBAAgBrB;AACd,UAAA;AACD,QAAAA,EAAe,WAAW,KAAK,OAAMqB,KAAA,gBAAAA,EAAO,gBAAe,IAAI;AAChE,iBAASM,IAAI,GAAGA,IAAI,KAAK,SAAS,QAAQA;AACxC,eAAK,SAASA,CAAC,EAAE,KAAK3B,KAAQf,IAAA,KAAK,SAAS0C,IAAI,CAAC,MAAnB,gBAAA1C,EAAsB,SAAQ,KAAK,IAAI;AAEtE,QAAAe,EAAe,WAAW,KAAK,QAAMjB,KAAAC,IAAA,KAAK,SAAS,GAAG,EAAE,MAAnB,gBAAAA,EAAsB,SAAtB,gBAAAD,EAA4B,gBAAe,IAAI;AAAA,MAAA,QAC/E;AACD,aAAA,MAAMiB,GAAQqB,CAAK;AAAA,MAAA;AAAA;AAGrB,WAAA,MAAMrB,GAAQqB,CAAK;AAAA,EAC1B;AAAA,EAGM,QAAQC,GAA6B;AAChC,eAAAM,KAAW,KAAK;AACzB,MAAIA,EAAQ,UAAA,KAAaA,EAAQ,QAAQN,CAAkB;AAE7D,SAAK,SAAS,SAAS;AAAA,EAAA;AAAA,EAGjB,OAAOG,GAAgB;;AAG7B,QAFA,KAAK,QAAQ,EAAK,GAEdA,EAAQ,WAAW,KAAK,CAAC,KAAK,YAAa;AAE/C,UAAMI,IAAQC,EAAc,KAAK,SAASL,CAAO;AAEjD,eAAWL,KAAQS,GAAO;AACxB,YAAME,MAAW9C,IAAA,KAAK,SAAS,GAAG,EAAE,MAAnB,gBAAAA,EAAsB,SAAQ,KAAK;AACpD,MAAAmC,EAAK,MAAM,KAAK,KAAK,eAAgBW,CAAQ,GACxC,KAAA,SAAS,KAAKX,CAAI;AAAA,IAAA;AAGzB,SAAK,WAAW;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMV,aAAa;;AACb,UAAApB,IAAS,KAAK,KAAK,eACnBgC,MAAuBhD,KAAAC,IAAA,KAAK,SAAS,GAAG,EAAE,MAAnB,gBAAAA,EAAsB,SAAtB,gBAAAD,EAA4B,gBAAe;AACxE,IAAI,gBAAgBgB,IACjBA,EAAe,WAAW,KAAK,MAAMgC,CAAoB,IAEnDhC,EAAA,aAAa,KAAK,MAAMgC,CAAoB;AAAA,EACrD;AAEJ;ACvGa,MAAAC,KAAO,OAAO,MAAM;;AAG9BhD,IAAAiC;AADI,MAAMgB,GAAsC;AAAA,EAcjD,YAAY1D,GAAkB2D,GAAeC,GAAU;AAbvD,IAAA3D,EAAA,MAACQ,GAAkB;AAEnB,IAAAR,EAAA,kBAAW0B,GAAY;AACvB,IAAA1B,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AAOE,SAAK,UAAUuC,EAAQ,OAAOxC,GAAS2D,EAAK,QAAQ,kBAAkB;AAAA,MACpE,QAAQ;AAAA,QACN,KAAK,KAAK;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,IACX,CACD,GACI,KAAA,QAAQ,SAASF,IAAM,IAAI,GAChC,KAAK,QAAQG,GACb,KAAK,OAAOD;AAAA,EAAA;AAAA,EAbd,IAAI,OAAO;;AACT,YAAOlD,IAAA,KAAK,SAAL,gBAAAA,EAAW;AAAA,EAAA;AAAA,EAepB,YAAY;;AACH,aAAAA,IAAA,KAAK,SAAL,gBAAAA,EAAW,gBAAe;AAAA,EAAA;AAAA,EAGnC,MAAMe,GAAiBqB,GAAc;AAG7B,UAAAgB,IAAa,KAAK,UAAU;AAElC,QAAI,CAACA,GAAY;AACf,YAAM,EAAE,SAAA7D,GAAS,OAAA4D,GAAO,MAAAD,EAAS,IAAA;AAC7B,UAAA;AACF,cAAM/B,IAAS+B,EAAK,KAAK3D,GAAS4D,GAAO5D,CAAO;AAC5C,QAAA4B,KAAU,QAAQA,MAAW,OAC1B,KAAA,OAAOkC,GAAOlC,GAAQ5B,CAAO;AAAA,eAE7B6B,GAAO;AACd,cAAIA,aAAiB,SACnB7B,EAAQ,MAAM6B,CAAK,GAEfA;AAAA,MAAA;AAGA,MAAAW,EAAA,UAAU,KAAK,OAAO;AAAA,IAAA;AAGhC,IAAI,KAAK,QACF,KAAA,KAAK,MAAMhB,GAAQqB,CAAK,GAG1BgB,KACKrB,EAAA,SAAS,KAAK,OAAO;AAAA,EAC/B;AAAA,EAGF,QAAQM,IAAqB,IAAO;AAC1B,IAAAN,EAAA,YAAY,KAAK,OAAO,GAE5B,KAAK,QACF,KAAA,KAAK,QAAQM,CAAkB,GAG9BN,EAAA,WAAW,KAAK,OAAO,GACvBA,EAAA,QAAQ,KAAK,OAAO;AAAA,EAAA;AAAA,EAG9B,KAAKhB,GAAiBqB,GAAc;;AAC7B,KAAApC,IAAA,KAAA,SAAA,QAAAA,EAAM,KAAKe,GAAQqB;AAAA,EAAK;AAEjC;AC1EA,MAAMkB,KAAuB,CAACzC,MAAgB,WAAW,KAAKA,CAAG,GAI3D0C,IAAS,OAAO,YAAY;;AAG/BvD,IAAAiC;AADI,MAAMuB,GAA2B;AAAA,EAoBtC,YAAYjE,GAAkBkE,GAAaN,GAA4B;AAnBvE,IAAA3D,EAAA,MAACQ,GAAkB;AAEnB,IAAAR,EAAA;AAEQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AAER,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEQ,IAAAA,EAAA,oBAA2B,CAAC;AAC5B,IAAAA,EAAA,uBAAiC,CAAC;AAGlC;AAAA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,sBAAe;AAsBjB,QAnBJ,KAAK,gBAAgBD,GACrB,KAAK,MAAMkE,GACX,KAAK,QAAQN,GAER,KAAA,UAAUpB,EAAQ,OAAO,KAAK,eAAe2B,EAAc,KAAK,IAAI,CAAC,GAGtED,EAAI,YAAY,MAAM,SACnB,KAAA,QAAQ,SAASF,GAAQ,EAAI,GAIhC,KAAK,QAAQ,SAASA,GAAQ,EAAK,IACrC,KAAK,OAAO,SAAS,gBAAgB,8BAA8BE,CAAG,IAEjE,KAAA,OAAO,SAAS,cAAcA,CAAG,GAIpCE,SAAa,eAAe;AAC9B,YAAMT,IAAO,KAAK,QAAQ,SAAmCF,IAAM,IAAI;AACvE,MAAIE,MACF,KAAK,KAAK,QAAQ,OAAOA,EAAK,QAAQ,QAAQ;AAAA,IAChD;AAGF,QAAIC,EAAM,OAAO;AACT,YAAAS,IAASnB,EAAQU,EAAM,KAAK,IAAIA,EAAM,QAAQ,CAACA,EAAM,KAAK;AAChE,iBAAW5B,KAAMqC;AACf,QAAArC;AAAA,UACE,KAAK;AAAA,UACLQ,EAAQ,OAAO,KAAK,SAAS2B,EAAc,KAAK,IAAI,GAAG;AAAA,YACrD,uBAAuB;AAAA,YACvB,QAAQ,EAAE,SAASnC,EAAG,SAAS,UAAU,SAAY,SAAS,KAAKA,EAAG,KAAK;AAAA,UAC5E,CAAA;AAAA,QACH;AAAA,IACF;AAGI,UAAAsC,IAAUV,EAAM,aAAaA,EAAM;AAMzC,QAJA,KAAK,WAAW,KAAK,MAAOW,GAAK,CAAC,SAAS,aAAa,OAAO,SAAS,UAAU,GAAGX,CAAK,CAAC,GACvFA,EAAM,SAAY,KAAA,YAAY,KAAK,MAAMA,EAAM,OAAO,KAAK,aAAa,GACxEU,KAAc,KAAA,aAAa,KAAK,MAAMA,GAAS,KAAK,aAAa,GAEjEV,EAAM;AACJ,UAAA9B,EAAW8B,EAAM,GAAG;AACtB,aAAK,MAAMA,EAAM,KACZ,KAAA,IAAI,KAAK,IAAI;AAAA;AAElB,cAAM,IAAI,MAAM,yCAAyCA,EAAM,GAAG;AAItE,IAAIA,EAAM,aACR,KAAK,aAAaN,EAAc,KAAK,SAASM,EAAM,QAAQ;AAAA,EAC9D;AAAA,EAGF,YAAY;AACV,WAAO,KAAK,QAAQ;AAAA,EAAA;AAAA,EAItB,MAAMpC,GAAcqB,GAAc;AAC1B,UAAAgB,IAAa,KAAK,UAAU;AAElC,QAAI,CAACA,GAAY;AACP,MAAArB,EAAA,UAAU,KAAK,OAAO;AAE9B,eAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AACzC,cAAAgC,IAAQ,KAAK,WAAW,CAAC,GACzBjB,IAAW,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,EAAE,OAAO;AACjD,QAAAiB,EAAA,MAAM,KAAK,MAAOjB,CAAQ;AAAA,MAAA;AAAA,IAClC;AAGF,IAAA/B,EAAO,aAAa,KAAK,OAAOqB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAE1D,KAAK,eAAe,IAEfgB,KAAoBrB,EAAA,SAAS,KAAK,OAAO;AAAA,EAAA;AAAA,EAGhD,QAAQM,IAAqB,IAAO;;AAC1B,IAAAN,EAAA,YAAY,KAAK,OAAO,GAE3BM,MACHrC,IAAA,KAAK,KAAM,eAAX,QAAAA,EAAuB,YAAY,KAAK;AAG/B,eAAA+D,KAAS,KAAK;AACvB,MAAAA,EAAM,QAAQ,EAAI;AAGpB,SAAK,eAAe;AAET,eAAAvC,KAAe,KAAK;AACjB,MAAAA,EAAA;AAEd,SAAK,cAAc,SAAS,GAExB,KAAK,OACP,KAAK,IAAI,MAAS,GAGZO,EAAA,WAAW,KAAK,OAAO,GACvBA,EAAA,QAAQ,KAAK,OAAO;AAAA,EAAA;AAAA,EAG9B,KAAKhB,GAAiBqB,GAAc;AAClC,QAAI,gBAAgBrB;AACd,UAAA;AACD,QAAAA,EAAe,WAAW,KAAK,OAAOqB,KAAA,gBAAAA,EAAO,gBAAe,IAAI;AAAA,MAAA,QAC3D;AACD,aAAA,MAAMrB,GAAQqB,CAAK;AAAA,MAAA;AAAA;AAGrB,WAAA,MAAMrB,GAAQqB,CAAK;AAAA,EAC1B;AAAA,EAGM,WAAcR,GAAuBN,GAA8B;AACrE,IAAAD,EAAWO,CAAK,IAClB,KAAK,cAAc;AAAA,MACjBH,EAAO,MAAM;AACP,YAAA;AACF,UAAAH,EAAUM,GAAqB;AAAA,iBACxBR,GAAO;AACT,eAAA,QAAS,MAAMA,CAAK,GACpB,KAAA,QAAS,MAAMA,CAAc;AAAA,QAAA;AAAA,MAErC,CAAA;AAAA,IACH,IAEAE,EAASM,CAAK;AAAA,EAChB;AAAA,EAGM,WAAWe,GAAmCQ,GAAgC;AACpF,UAAM5D,IAAU,KAAK;AAErB,eAAWsB,KAAOsC,GAAO;AACjB,YAAAvB,IAAQuB,EAAMtC,CAAG;AAIvB,UAAIA,MAAQ,qBAAqBA,MAAQ,oBAAoBA,MAAQ,kBAAkB;AAC/E,cAAAnB,IAAW,CAACsE,MAAa;AAC7B,UAAI,KAAK,gBAAgB,CAACrB,EAAQ,SAASqB,EAAE,MAAa,KACvDpC,EAA6BoC,CAAC;AAAA,QAEnC,GAEM7D,IAAU,EAAE,SAAS,GAAK;AAEzB,eAAA,iBAAiB,SAAST,GAAUS,CAAO,GAE7C,KAAA,cAAc,KAAK,MAAM;AACrB,iBAAA,oBAAoB,SAAST,GAAUS,CAAO;AAAA,QAAA,CACtD;AAAA,iBACQkB,EAAWO,CAAK,KAAK0B,GAAqBzC,CAAG,GAAG;AACzD,cAAMoD,IAAYpD,EAAI,MAAM,CAAC,EAAE,YAAY,GAErCnB,IAA+BkC;AAE7B,QAAAe,EAAA,iBAAiBsB,GAAWvE,CAAQ,GAEvC,KAAA,cAAc,KAAK,MAAM;AACpB,UAAAiD,EAAA,oBAAoBsB,GAAWvE,CAAQ;AAAA,QAAA,CAChD;AAAA,MACQ,WAAAmB,EAAI,WAAW,IAAI,KAAKQ,EAAWO,CAAK,KAAKsC,GAAgB,SAASrD,EAAI,UAAU,CAAC,CAAC;AAE9F,QAAA8B,EAAgB9B,CAAG,IAAIe,GACnB,KAAA,cAAc,KAAK,MAAM;AAC3B,UAAAe,EAAgB9B,CAAG,IAAI;AAAA,QAAA,CACzB;AAAA,eACQA,EAAI,SAAS,GAAG;AAEpB,aAAA,WAAWe,GAAO,CAACuC,MAAY;AAClC,UAAIA,KAAW,OACbxB,EAAQ,gBAAgB9B,CAAG,IAE3B8B,EAAQ,aAAa9B,GAAK,OAAOsD,CAAO,CAAC;AAAA,QAC3C,CACD;AAAA,eACQ,CAACC,GAAa,SAASvD,CAAG;AACnC,YAAItB,EAAQ,SAASgE,GAAQ,EAAK;AAC3B,eAAA,WAAW3B,GAAO,CAACuC,MAAY;AAClC,YAAIA,KAAW,OACbxB,EAAQ,aAAa9B,GAAK,OAAOsC,EAAMtC,CAAG,CAAC,CAAC,IAE5C8B,EAAQ,gBAAgB9B,CAAG;AAAA,UAC7B,CACD;AAAA;AAED,kBAAQA,GAAK;AAAA,YACX,KAAK;AAAA,YACL,KAAK;AACE,mBAAA,WAAWe,GAAO,CAACuC,MAAY;AACjC,gBAAAxB,EAAgB9B,CAAG,IAAI,OAAOsD,CAAO;AAAA,cAAA,CACvC;AACD;AAAA,YAEF,KAAK;AACE,mBAAA,WAAWvC,GAAO,CAACuC,MAAY;AACjC,gBAAAxB,EAAgB,UAAUwB;AAAA,cAAA,CAC5B;AACD;AAAA,YAEF,KAAK;AACE,mBAAA,WAAWvC,GAAO,CAACuC,MAAY;AACjC,gBAAAxB,EAAgB,YAAYwB;AAAA,cAAA,CAC9B;AACD;AAAA,YAEF,KAAK;AACE,mBAAA,WAAWvC,GAAO,CAACuC,MAAY;AAClC,gBAAIA,KAAW,OACZxB,EAAgB,gBAAgB9B,CAAG,IAEnC8B,EAAgB,aAAa9B,GAAK,OAAOsD,CAAO,CAAC;AAAA,cACpD,CACD;AAAA,YAEH,KAAK;AACE,mBAAA,WAAWvC,GAAO,CAACuC,MAAY;AACjC,gBAAAxB,EAAgB,UAAUwB,GAGvBA,IACMxB,EAAA,aAAa,WAAW,EAAE,IAElCA,EAAQ,gBAAgB,SAAS;AAAA,cACnC,CACD;AACD;AAAA,YAEF,KAAK;AAAA,YACL,KAAK;AACE,mBAAA,WAAWf,GAAO,CAACuC,MAAY;AAC9B,gBAAA,OAAOA,KAAY,WACpBxB,EAAgB9B,CAAG,IAAIsD,IACfA,IACRxB,EAAgB9B,CAAG,IAAI,OAEvB8B,EAAgB9B,CAAG,IAAI;AAAA,cAC1B,CACD;AACD;AAAA,YAEF,SAAS;AACH,kBAAAA,EAAI,WAAW,OAAO,GAAG;AACrB,sBAAAwD,IAAOxD,EAAI,UAAU,CAAC;AACvB,qBAAA,WAAWe,GAAO,CAACuC,MAAY;AACjC,kBAAAxB,EAAgB0B,CAAI,IAAIF;AAAA,gBAAA,CAC1B;AAAA,cACQ,WAAAtD,EAAI,WAAW,KAAK,GAAG;AAC1B,sBAAAwD,IAAOxD,EAAI,UAAU,CAAC;AACxB,oBAAAyD;AACA,gBAAAjD,EAAWO,CAAK,KACVe,EAAA,iBAAiB0B,GAAMzC,CAAsB,GAChD,KAAA,cAAc,KAAK,MAAM;AACpB,kBAAAe,EAAA,oBAAoB0B,GAAMzC,CAAsB;AAAA,gBAAA,CACzD,KAEI,KAAA,WAAWA,GAAqC,CAACuC,MAAY;AAC5D,kBAAA,CAACA,KAAWG,IACN3B,EAAA,oBAAoB0B,GAAMC,CAAK,IAC9BH,KAAW,SAChBG,KAASA,MAAUH,KACbxB,EAAA,oBAAoB0B,GAAMC,CAAK,GAEjC3B,EAAA,iBAAiB0B,GAAMF,CAAO,IAEhCG,IAAAH;AAAA,gBAAA,CACT;AAAA,cAEM,WAAAtD,EAAI,WAAW,OAAO,GAAG;AAClC,sBAAMwD,IAAOxD,EAAI,UAAU,CAAC,EAAE,YAAY;AACrC,qBAAA,WAAWe,GAAO,CAACuC,MAAY;AAClC,kBAAIA,KAAW,OACbxB,EAAQ,aAAa0B,GAAM,OAAOF,CAAO,CAAC,IAE1CxB,EAAQ,gBAAgB0B,CAAI;AAAA,gBAC9B,CACD;AAAA,cAAA;AAEI,qBAAA,WAAWzC,GAAO,CAACuC,MAAY;AACjC,kBAAAxB,EAAgB9B,CAAG,IAAIsD;AAAA,gBAAA,CACzB;AAGH;AAAA,YAAA;AAAA,UACF;AAAA,IAGN;AAAA,EACF;AAAA,EAGM,YAAYxB,GAAmC4B,GAAiBC,GAAgC;AACtG,UAAMC,IAAqC,CAAC;AAExC,QAAApD,EAAWkD,CAAM,GAAG;AAClB,UAAAG;AAEE,YAAAlD,IAAcC,EAAO,MAAM;AAC3B,QAAAJ,EAAWqD,CAAO,KACZA,EAAA,GAEV/B,EAAQ,MAAM,UAAU,IACxB+B,IAAU,KAAK,YAAY/B,GAASjC,EAAI6D,CAAM,GAAGC,CAAa;AAAA,MAAA,CAC/D;AAED,MAAAA,EAAc,KAAKhD,CAAW,GAC9BiD,EAAkB,KAAKjD,CAAW;AAAA,IAAA,OAC7B;AACC,YAAAmD,IAASC,GAAYL,CAAM;AAEjC,iBAAWrE,KAAQyE,GAAQ;AACzB,cAAM,EAAE,OAAA/C,GAAO,UAAAiD,MAAaF,EAAOzE,CAAI;AAEnC,YAAAmB,EAAWO,CAAK,GAAG;AACf,gBAAAJ,IAAcC,EAAO,MAAM;AAC3B,YAAAf,EAAIkB,CAAK,IACHe,EAAA,MAAM,YAAYzC,GAAM,OAAOQ,EAAIkB,CAAK,CAAC,GAAGiD,CAAQ,IAEpDlC,EAAA,MAAM,eAAezC,CAAI;AAAA,UACnC,CACD;AAED,UAAAsE,EAAc,KAAKhD,CAAW,GAC9BiD,EAAkB,KAAKjD,CAAW;AAAA,QAAA,MACpC,CAAWI,KAAS,QAClBe,EAAQ,MAAM,YAAYzC,GAAM,OAAO0B,CAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAGF,WAAO,WAAmB;AACxB,iBAAWJ,KAAeiD;AACZ,QAAAjD,EAAA,GACZgD,EAAc,OAAOA,EAAc,QAAQhD,CAAW,GAAG,CAAC;AAAA,IAE9D;AAAA,EAAA;AAAA,EAGM,aAAamB,GAAmCkB,GAAkBW,GAAgC;AACxG,UAAMM,IAAsC,CAAC;AAEzC,QAAAzD,EAAWwC,CAAO,GAAG;AACnB,UAAAa;AAEE,YAAAlD,IAAcC,EAAO,MAAM;AAC3B,QAAAJ,EAAWqD,CAAO,KACZA,EAAA,GAEV/B,EAAQ,gBAAgB,OAAO,GAC/B+B,IAAU,KAAK,aAAa/B,GAASjC,EAAImD,CAAO,GAAGW,CAAa;AAAA,MAAA,CACjE;AAED,MAAAA,EAAc,KAAKhD,CAAW,GAC9BsD,EAAmB,KAAKtD,CAAW;AAAA,IAAA,OAC9B;AACC,YAAAmD,IAASI,GAAYlB,CAAO;AAElC,iBAAW3D,KAAQyE,GAAQ;AACnB,cAAA/C,IAAQ+C,EAAOzE,CAAI;AAErB,YAAAmB,EAAWO,CAAK,GAAG;AACf,gBAAAJ,IAAcC,EAAO,MAAM;AAC3B,YAAAf,EAAIkB,CAAK,IACHe,EAAA,UAAU,IAAIzC,CAAI,IAElByC,EAAA,UAAU,OAAOzC,CAAI;AAAA,UAC/B,CACD;AAED,UAAAsE,EAAc,KAAKhD,CAAW,GAC9BsD,EAAmB,KAAKtD,CAAW;AAAA,eAC1BI,KACDe,EAAA,UAAU,IAAIzC,CAAI;AAAA,MAC5B;AAAA,IACF;AAGF,WAAO,WAAmB;AACxB,iBAAWsB,KAAesD;AACZ,QAAAtD,EAAA,GACZgD,EAAc,OAAOA,EAAc,QAAQhD,CAAW,GAAG,CAAC;AAAA,IAE9D;AAAA,EAAA;AAEJ;AAKA,SAASuD,GAAYlB,GAAkB;AACrC,MAAIc,IAAkC,CAAC;AAEnC,MAAAK,EAASnB,CAAO,GAAG;AAEf,UAAAoB,IAAQpB,EAAQ,MAAM,GAAG;AAC/B,eAAW3D,KAAQ+E;AACjB,MAAAN,EAAOzE,CAAI,IAAI;AAAA,EACjB,MACF,CAAWgF,GAASrB,CAAO,IAClB,OAAA,OAAOc,GAAQd,CAAO,IACpB,MAAM,QAAQA,CAAO,KACxB,MAAA,KAAKA,CAAO,EACf,OAAO,OAAO,EACd,QAAQ,CAACsB,MAAS;AACjB,WAAO,OAAOR,GAAQI,GAAYI,CAAI,CAAC;AAAA,EAAA,CACxC;AAIL,gBAAOR,EAAO,WAEPA;AACT;AAKA,SAASC,GAAYL,GAAiB;AACpC,MAAII,IAAgE,CAAC;AAEjE,MAAAK,EAAST,CAAM,GAAG;AACd,UAAAa,IAAQb,EAAO,MAAM,GAAG,EAAE,OAAO,CAACc,MAASA,EAAK,KAAK,MAAM,EAAE;AACnE,eAAWA,KAAQD,GAAO;AACxB,YAAM,CAACvE,GAAKyE,CAAM,IAAID,EAAK,MAAM,GAAG,GAC9BE,IAA+C;AAAA,QACnD,OAAOD;AAAA,MACT;AACI,MAAAA,EAAO,SAAS,YAAY,KAC9BC,EAAM,WAAW,aACjBA,EAAM,QAAQD,EAAO,QAAQ,cAAc,EAAE,EAAE,KAAK,KAE9CC,EAAA,QAAQD,EAAO,KAAK,GAE5BX,EAAOa,EAAa3E,EAAI,KAAM,CAAA,CAAC,IAAI0E;AAAA,IAAA;AAAA,EACrC;AAEE,MAAAL,GAASX,CAAM;AACjB,eAAW1D,KAAO0D;AACZ,MAAA1D,EAAI,WAAW,IAAI,IAErB8D,EAAO9D,CAAG,IAAI,EAAE,OAAO0D,EAAO1D,CAAG,EAAE,IAE5B8D,EAAAa,EAAa3E,CAAG,CAAC,IAAI,EAAE,OAAO0D,EAAO1D,CAAG,EAAE;AAAA,MAG5C,CAAA,MAAM,QAAQ0D,CAAM,KACvB,MAAA,KAAKA,CAAM,EACd,OAAO,CAACY,MAASA,KAAQ,IAAI,EAC7B,QAAQ,CAACA,MAAS;AACjB,WAAO,OAAOR,GAAQC,GAAYO,CAAI,CAAC;AAAA,EAAA,CACxC;AAGE,SAAAR;AACT;AAEA,SAASjB,IAA0B;AACjC,MAAI,KAAK,QAAQ,KAAM,QAAO,KAAK;AACnC,MAAIxD,IAAO,KAAK,KAAK,QAAQ,YAAY;AAIzC,MAHI,KAAK,KAAK,OACJA,KAAA,IAAI,KAAK,KAAK,EAAE,KAEtB,KAAK,KAAK,UAAU,SAAS;AAC/B,eAAWuF,KAAa,KAAK,KAAK,UAAU;AAC1C,MAAAvF,KAAQ,IAAIuF,CAAS;AAGlB,SAAAvF;AACT;AAKA,SAASsF,EAAa5D,GAAuB;AACpC,SAAAA,EAAM,QAAQ,0BAA0B,CAAC8D,GAAGC,OAASA,IAAM,MAAM,MAAMD,EAAE,YAAA,CAAa;AAC/F;AAGA,MAAMtB,KAAe,CAAC,OAAO,YAAY,SAAS,SAAS,QAAQ,OAAO,GAGpEF,KAAkB;AAAA;AAAA,EAEtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AACF;;AClmBGlE,IAAAiC;AADI,MAAM2D,GAA6B;AAAA,EASxC,YAAYrG,GAAkBiD,GAAqBzB,GAAiB;AARpE,IAAAvB,EAAA,MAACQ,GAAkB;AAEX,IAAAR,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AAGN,SAAK,UAAUD,GACf,KAAK,UAAUiD,GACf,KAAK,SAASzB;AAAA,EAAA;AAAA,EAGhB,YAAY;AACN,WAAC,KAAK,UAGH,KAAK,QAAQ,UAAU,IAFrB;AAAA,EAEqB;AAAA,EAGhC,MAAM8E,GAAkBC,GAAe;AACrC,SAAK,UAAUzC,GAAO,KAAK,SAAS,KAAK,OAAO,GAC3C,KAAA,QAAQ,MAAM,KAAK,MAAM;AAAA,EAAA;AAAA,EAGhC,QAAQhB,IAAqB,IAAO;;AAC9B,KAAArC,IAAA,KAAK,YAAL,QAAAA,EAAc,eAEX,KAAA,QAAQ,QAAQ,EAAK;AAAA,EAC5B;AAAA,EAGF,KAAK6F,GAAkBC,GAAe;AAAA,EAAA;AACxC;;AClBG9F,IAAAiC;AADI,MAAM8D,GAAgC;AAAA,EAc3C,YAAYxG,GAAkByG,GAAoBnF,GAAewC,GAAqB;AAbtF,IAAA7D,EAAA,MAACQ,GAAkB;AAEnB,IAAAR,EAAA,cAAO,SAAS,eAAe,EAAE;AAEzB,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA,qBAAoC;AACpC,IAAAA,EAAA,4CAAiD,IAAI;AAG3D,SAAK,UAAUD,GAEf,KAAK,QAAQyG,GACb,KAAK,MAAMnF,GACX,KAAK,SAASwC;AAAA,EAAA;AAAA,EAGhB,YAAY;AACH,WAAA,KAAK,KAAK,iBAAiB;AAAA,EAAA;AAAA,EAGpC,MAAMtC,GAAiBqB,GAAc;AAC/B,IAAC,KAAK,gBACRrB,EAAO,aAAa,KAAK,OAAMqB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAEpD,KAAA,cAAcX,EAAO,MAAM;AAC1B,UAAAG,IAAQ,KAAK,MAAM;AAEvB,MAAIA,KAAS,SACXA,IAAQ,CAAC,GACJ,KAAA,QAAQ,KAAK,2CAA2CA,CAAK,IAGpErB,EAAU,MAAM;AACd,aAAK,QAAQ,MAAM,KAAKqB,CAAK,CAAC;AAAA,MAAA,CAC/B;AAAA,IAAA,CACF;AAAA,EACH;AAAA,EAGF,QAAQS,IAAqB,IAAO;;AAClC,IAAI,KAAK,gBACP,KAAK,YAAY,GACjB,KAAK,cAAc,OAGjB,CAACA,KAAsB,KAAK,iBAC9BrC,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,YAAY,KAAK,QAGzC,KAAK,SAASqC,CAAkB;AAAA,EAAA;AAAA,EAGlC,KAAKtB,GAAiBqB,GAAc;AAE3B,WAAA,KAAK,MAAMrB,GAAQqB,CAAK;AAAA,EAAA;AAAA,EAGzB,SAASC,GAA6B;AAC5C,eAAW8C,KAAQ,KAAK,eAAe,OAAA;AAChC,MAAAA,EAAA,KAAK,QAAQ9C,CAAkB;AAEtC,SAAK,eAAe,MAAM;AAAA,EAAA;AAAA,EAGpB,QAAQT,GAAY;;AAC1B,QAAIA,EAAM,WAAW,KAAK,CAAC,KAAK;AACvB,aAAA,KAAK,SAAS,EAAK;AAKtB,UAAAqE,wBAAqB,IAA0C;AACrE,QAAIC,IAAQ;AAEZ,eAAWf,KAAQvD,GAAO;AACxB,YAAMf,IAAM,KAAK,IAAIsE,GAAMe,CAAK;AAChC,MAAAD,EAAe,IAAIpF,GAAK;AAAA,QACtB,KAAAA;AAAA,QACA,OAAOsE;AAAA,QACP,OAAOe;AAAA,MAAA,CACR;AAAA,IAAA;AAGH,UAAMC,IAA+B,CAAC;AAGtC,eAAWC,KAAa,KAAK,eAAe,OAAA;AACtC,MAAA,CAACH,EAAe,IAAIG,EAAU,GAAG,KAAKA,EAAU,KAAK,eAC7CA,EAAA,KAAK,QAAQ,EAAK;AAIhC,IAAAC,GAAM,MAAM;AAEC,iBAAAC,KAAaL,EAAe,UAAU;AAC/C,cAAMG,IAAY,KAAK,eAAe,IAAIE,EAAU,GAAG;AAEvD,YAAIF,KAAaA,EAAU,KAAK,UAAA;AACpB,UAAAA,EAAA,MAAME,EAAU,KAAK,GACrBF,EAAA,OAAOE,EAAU,KAAK,GAEvBH,EAAAG,EAAU,KAAK,IAAIF;AAAA,aACvB;AAEL,gBAAMG,IAAQb,EAAEY,EAAU,OAAO,EAAE,QAAQE,IAAW,GAChDC,IAASf,EAAEY,EAAU,KAAK;AAEvB,UAAAH,EAAAG,EAAU,KAAK,IAAI;AAAA,YAC1B,KAAKA,EAAU;AAAA,YACf,OAAAC;AAAA,YACA,QAAAE;AAAA,YACA,MAAM,IAAIxD,GAAa,KAAK,SAASyD,IAAgB;AAAA,cACnD,OAAO,MAAMH,EAAM;AAAA,cACnB,QAAQ,MAAME,EAAO;AAAA,cACrB,QAAQ,KAAK;AAAA,YACd,CAAA;AAAA,UACH;AAAA,QAAA;AAAA,MACF;AAAA,IACF,CACD;AAID,aAAS/D,IAAI,GAAGA,IAAIyD,EAAS,QAAQzD,KAAK;AAClC,YAAAyC,IAAOgB,EAASzD,CAAC,GACjBI,MAAW9C,IAAAmG,EAASzD,IAAI,CAAC,MAAd,gBAAA1C,EAAiB,KAAK,SAAQ,KAAK,MAE9CoG,IAAY,KAAK,eAAe,IAAIjB,EAAK,GAAG;AAClD,MAAIiB,KAAaA,EAAU,KAAK,UAAA,IAC9BjB,EAAK,KAAK,KAAK,KAAK,KAAK,eAAgBrC,CAAQ,IAEjDqC,EAAK,KAAK,MAAM,KAAK,KAAK,eAAgBrC,CAAQ;AAAA,IACpD;AAGF,SAAK,eAAe,MAAM;AAC1B,eAAWqC,KAAQgB;AACjB,WAAK,eAAe,IAAIhB,EAAK,KAAKA,CAAI;AAIxC,UAAMwB,MAAW5G,IAAAoG,EAAS,GAAG,EAAE,MAAd,gBAAApG,EAAiB,KAAK,SAAQ,KAAK;AACpD,KAAAD,IAAA,KAAK,KAAK,eAAV,QAAAA,EAAsB,aAAa,KAAK,MAAM6G,EAAS;AAAA,EAAW;AAEtE;AAQA,SAASD,GAAevD,GAAsB5D,GAAkB;AAC9D,SAAAA,EAAQ,QAAQ,iBAAiB,GAC1B4D,EAAM,OAAO,KAAK5D,GAAS4D,EAAM,OAAOA,EAAM,QAAQ5D,CAAO;AACtE;ACtKO,MAAMqH,GAAgB;AAAA,EAa3B,YAAYC,GAAwB1D,GAAW;AAR/C;AAAA;AAAA;AAAA;AAAA,IAAA3D,EAAA;AAMA;AAAA;AAAA;AAAA;AAAA,IAAAA,EAAA;AAGE,SAAK,OAAOqH,GACZ,KAAK,QAAQ1D;AAAA,EAAA;AAEjB;AAgCO,SAAS2D,GAAalF,GAAiC;AACrD,UAAAA,KAAA,gBAAAA,EAAQK,QAAoB;AACrC;AAoCgB,SAAA8E,EAAEF,GAA0B1D,GAAa;AACvD,SAAO,IAAIyD,GAAOC,GAAM1D,KAAS,CAAA,CAAE;AACrC;AASgB,SAAA6D,GAAKC,GAA6BC,GAA0BC,GAAkC;AAC5G,SAAOJ,EAAE,YAAoB;AAAA,IAC3B,QAAQrB,EAAc,MAAM;AACpB,YAAA9D,IAAQlB,EAAIuG,CAAS;AAE3B,aAAIrF,KAASsF,IACJA,IACE,CAACtF,KAASuF,IACZA,IAEF;AAAA,IACR,CAAA;AAAA,EAAA,CACF;AACH;AAKgB,SAAAC,GAAOH,GAA6BC,GAA0BC,GAAkC;AACvG,SAAAH,GAAKC,GAAWE,GAAaD,CAAW;AACjD;AAMgB,SAAAG,GAAUrB,GAAyBnF,GAAewC,GAA6B;AACtF,SAAA0D,EAAE,WAAmB,EAAE,OAAO,MAAMrG,EAAIsF,CAAK,GAAG,KAAAnF,GAAK,QAAAwC,GAAQ;AACtE;AAKgB,SAAAiE,GAAOvG,GAAiByB,GAA6B;AACnE,SAAOuE,EAAE,WAAmB,EAAE,QAAAhG,GAAQ,SAAAyB,GAAS;AACjD;AAMO,SAASa,GAAOb,GAAqBjD,IAAU,IAAIwC,EAAQ,GAAG,GAAe;AAClF,QAAMa,IAAQC,EAActD,GAAS,CAACiD,CAAO,CAAC;AAC1C,SAAAI,EAAM,WAAW,IACZA,EAAM,CAAC,IAET,IAAIN,EAAQ/C,GAAS,MAAMqD,CAAK;AACzC;AAKgB,SAAAC,EAActD,MAAqBiD,GAA8B;AACzE,QAAAwD,IAAQxD,EAAQ,KAAK,KAAQ,GAC7B+E,IAAyB,CAAC;AAEhC,aAAWpC,KAAQa;AACjB,QAAI,EAAAb,KAAS,QAA8BA,MAAS,KAIpD;AAAA,UAAIA,aAAgB,MAAM;AACxB,QAAAoC,EAAS,KAAK,IAAIrF,EAAQiD,CAAI,CAAC;AAC/B;AAAA,MAAA;AAGF,UAAIA,aAAgByB;AACd,YAAAvF,EAAW8D,EAAK,IAAI,GAAG;AAChB,UAAAoC,EAAA,KAAK,IAAItE,GAAa1D,GAAS4F,EAAK,MAAmBA,EAAK,KAAK,CAAC;AAC3E;AAAA,QACS,WAAAH,EAASG,EAAK,IAAI;AAC3B,kBAAQA,EAAK,MAAM;AAAA,YACjB,KAAK,QAAgB;AACnB,oBAAMqC,IAAQrC,EAAK;AACnB,cAAAoC,EAAS,KAAK,IAAIrF,EAAQsF,EAAM,KAAK,CAAC;AACtC;AAAA,YAAA;AAAA,YAEF,KAAK,SAAiB;AACpB,oBAAMA,IAAQrC,EAAK;AACV,cAAAoC,EAAA,KAAK,IAAIrF,EAAQ,SAAS,eAAe,OAAOsF,EAAM,KAAK,CAAC,CAAC,CAAC;AACvE;AAAA,YAAA;AAAA,YAEF,KAAK,WAAmB;AACtB,oBAAMA,IAAQrC,EAAK;AACV,cAAAoC,EAAA,KAAK,IAAIxB,GAAOxG,GAASiI,EAAM,OAAOA,EAAM,KAAKA,EAAM,MAAM,CAAC;AACvE;AAAA,YAAA;AAAA,YAEF,KAAK,YAAoB;AACvB,oBAAMA,IAAQrC,EAAK;AACnB,cAAAoC,EAAS,KAAK,IAAIjF,EAAQ/C,GAASiI,EAAM,MAAM,CAAC;AAChD;AAAA,YAAA;AAAA,YAEF,KAAK,WAAmB;AACtB,oBAAMA,IAAQrC,EAAK;AACV,cAAAoC,EAAA,KAAK,IAAI3B,GAAOrG,GAASiI,EAAM,SAASA,EAAM,MAAM,CAAC;AAC9D;AAAA,YAAA;AAAA,YAEF;AAEW,cAAAD,EAAA,KAAK,IAAI/D,GAAKjE,GAAS4F,EAAK,MAAMA,EAAK,KAAK,CAAC;AACtD;AAAA,UAAA;AAAA;AAGJ,gBAAM,IAAI,UAAU,4CAA4CA,EAAK,IAAI,EAAE;AAI3E,UAAA2B,GAAa3B,CAAI,GAAG;AACtB,QAAAoC,EAAS,KAAKpC,CAAI;AAClB;AAAA,MAAA;AAGE,UAAA9D,EAAW8D,CAAI,GAAG;AACpB,QAAAoC,EAAS,KAAK,IAAIjF,EAAQ/C,GAAS4F,CAAI,CAAC;AACxC;AAAA,MAAA;AAIO,MAAAoC,EAAA,KAAK,IAAIrF,EAAQ,SAAS,eAAe,OAAOiD,CAAI,CAAC,CAAC,CAAC;AAAA;AAG3D,SAAAoC;AACT;"}
|
|
@@ -13,8 +13,8 @@ var F = (n, t, e, r) => ({
|
|
|
13
13
|
return c(n, t, r);
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
|
-
import {
|
|
17
|
-
import { D as _, V as tt, m as et } from "./markup-
|
|
16
|
+
import { h as Z, $ as E, s as I, u as D } from "./logger-Ck_9LCem.js";
|
|
17
|
+
import { D as _, V as tt, m as et } from "./markup-BBa4WBj1.js";
|
|
18
18
|
import { d as rt, e as K, c as N, f as nt, g as it, i as st, b as P } from "./typeChecking-BJ-ymQ2F.js";
|
|
19
19
|
function x(n) {
|
|
20
20
|
return K(n, "Expected `path` to be a string. Got type: %t, value: %v"), n.split("/").map((t) => t.trim()).filter((t) => t !== "");
|
|
@@ -487,4 +487,4 @@ export {
|
|
|
487
487
|
kt as R,
|
|
488
488
|
mt as U
|
|
489
489
|
};
|
|
490
|
-
//# sourceMappingURL=router-
|
|
490
|
+
//# sourceMappingURL=router-CaR7Xd4T.js.map
|