@manyducks.co/dolla 2.0.0-alpha.54 → 2.0.0-alpha.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +1 -12
  2. package/dist/core/context.d.ts +80 -54
  3. package/dist/core/index.d.ts +8 -8
  4. package/dist/core/logger.d.ts +1 -1
  5. package/dist/core/markup.d.ts +10 -10
  6. package/dist/core/mount.d.ts +11 -6
  7. package/dist/core/nodes/dynamic.d.ts +3 -3
  8. package/dist/core/nodes/html.d.ts +5 -5
  9. package/dist/core/nodes/outlet.d.ts +3 -4
  10. package/dist/core/nodes/portal.d.ts +2 -2
  11. package/dist/core/nodes/repeat.d.ts +6 -6
  12. package/dist/core/nodes/view.d.ts +13 -81
  13. package/dist/core/symbols.d.ts +0 -2
  14. package/dist/core/views/fragment.d.ts +2 -2
  15. package/dist/fragment-VXM-P2tT.js +7 -0
  16. package/dist/fragment-VXM-P2tT.js.map +1 -0
  17. package/dist/http.js +1 -1
  18. package/dist/i18n.js +14 -14
  19. package/dist/i18n.js.map +1 -1
  20. package/dist/index.js +45 -59
  21. package/dist/index.js.map +1 -1
  22. package/dist/jsx-dev-runtime.js +8 -8
  23. package/dist/jsx-dev-runtime.js.map +1 -1
  24. package/dist/jsx-runtime.js +9 -9
  25. package/dist/jsx-runtime.js.map +1 -1
  26. package/dist/{logger-CBfhf3fA.js → logger-CXdzxt1e.js} +74 -73
  27. package/dist/{logger-CBfhf3fA.js.map → logger-CXdzxt1e.js.map} +1 -1
  28. package/dist/markup-yTuFdC0t.js +923 -0
  29. package/dist/markup-yTuFdC0t.js.map +1 -0
  30. package/dist/router/router.d.ts +9 -6
  31. package/dist/router-B-rtBG7i.js +488 -0
  32. package/dist/router-B-rtBG7i.js.map +1 -0
  33. package/dist/router.js +1 -1
  34. package/dist/router.js.map +1 -1
  35. package/dist/{typeChecking-EAVNeFyB.js → typeChecking-lgllKIVq.js} +5 -5
  36. package/dist/{typeChecking-EAVNeFyB.js.map → typeChecking-lgllKIVq.js.map} +1 -1
  37. package/dist/types.d.ts +1 -1
  38. package/docs/mixins.md +1 -1
  39. package/docs/ref.md +93 -0
  40. package/notes/scratch.md +24 -0
  41. package/package.json +2 -2
  42. package/dist/core/mixin.d.ts +0 -62
  43. package/dist/core/store.d.ts +0 -57
  44. package/dist/core/views/passthrough.d.ts +0 -5
  45. package/dist/fragment-CmWsN-4Y.js +0 -8
  46. package/dist/fragment-CmWsN-4Y.js.map +0 -1
  47. package/dist/router-BoJac1lD.js +0 -482
  48. package/dist/router-BoJac1lD.js.map +0 -1
  49. package/dist/view-BKpHFpWG.js +0 -1044
  50. package/dist/view-BKpHFpWG.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markup-yTuFdC0t.js","sources":["../src/core/context.ts","../src/core/symbols.ts","../src/core/nodes/dom.ts","../src/core/nodes/view.ts","../src/core/nodes/dynamic.ts","../src/core/nodes/fragment.ts","../src/core/nodes/html.ts","../src/core/nodes/outlet.ts","../src/core/nodes/portal.ts","../src/core/nodes/repeat.ts","../src/core/markup.ts"],"sourcesContent":["import { isFunction, typeOf } from \"../typeChecking\";\nimport { getUniqueId } from \"../utils\";\nimport { createLogger, Logger, LoggerOptions } from \"./logger\";\nimport { effect, type EffectFn, get, type MaybeSignal, peek, type UnsubscribeFn } from \"./signals\";\n\n/**\n *\n */\nexport type Store<Options, Value> = (this: Context, options: Options, context: Context) => Value;\n\ntype StoreMap = Map<Store<any, any>, any>;\nexport const globalStores: StoreMap = new Map();\n\ntype LifecycleListener = () => void;\ntype ContextLifecycleListeners = {\n willMount?: LifecycleListener[];\n didMount?: LifecycleListener[];\n willUnmount?: LifecycleListener[];\n didUnmount?: LifecycleListener[];\n};\n\nenum LifecycleState {\n Unmounted = 0,\n WillMount = 1,\n WillMountByDependent = 2,\n DidMount = 3,\n DidMountByDependent = 4,\n WillUnmount = 5,\n WillUnmountByDependent = 6,\n DidUnmount = 7,\n}\n\n/**\n * Manages lifecycle events for a Context.\n */\nclass ContextLifecycle {\n state = LifecycleState.Unmounted;\n dependents = 0;\n\n #listeners: ContextLifecycleListeners = {};\n\n on<E extends keyof ContextLifecycleListeners>(event: E, listener: LifecycleListener) {\n if (!this.#listeners[event]) {\n this.#listeners[event] = [listener];\n } else if (this.#listeners[event].indexOf(listener) === -1) {\n this.#listeners[event].push(listener);\n }\n }\n\n off<E extends keyof ContextLifecycleListeners>(event: E, listener: LifecycleListener) {\n if (this.#listeners[event]) {\n this.#listeners[event].splice(this.#listeners[event].indexOf(listener), 1);\n\n if (this.#listeners[event].length === 0) {\n delete this.#listeners[event];\n }\n }\n }\n\n willMount(dependent = false) {\n if (dependent) this.dependents++;\n\n if (this.state < LifecycleState.WillMount) {\n if (this.#listeners.willMount) {\n for (const listener of this.#listeners.willMount) {\n listener();\n }\n }\n this.state = dependent ? LifecycleState.WillMountByDependent : LifecycleState.WillMount;\n }\n }\n didMount(dependent = false) {\n if (this.state >= LifecycleState.WillMount && this.state < LifecycleState.DidMount) {\n this.state += 2;\n if (this.#listeners.didMount) {\n for (const listener of this.#listeners.didMount) {\n listener();\n }\n }\n }\n }\n willUnmount(dependent = false) {\n if (dependent) {\n this.dependents--;\n if (!this.dependents) {\n this.willUnmount();\n }\n } else if (this.state >= LifecycleState.DidMount && this.state < LifecycleState.WillUnmount) {\n if (this.#listeners.willUnmount) {\n for (const listener of this.#listeners.willUnmount) {\n listener();\n }\n }\n this.state += 2;\n }\n }\n didUnmount(dependent = false) {\n if (dependent) {\n if (!this.dependents && this.state === LifecycleState.WillUnmountByDependent) {\n this.didUnmount();\n }\n } else if (this.state >= LifecycleState.WillUnmount && this.state < LifecycleState.DidUnmount) {\n // Loop back to .Unmounted\n this.state = LifecycleState.DidUnmount % LifecycleState.DidUnmount;\n if (this.#listeners.didUnmount) {\n for (const listener of this.#listeners.didUnmount) {\n listener();\n }\n }\n }\n }\n\n dispose() {\n this.willUnmount();\n this.didUnmount();\n this.#listeners = {};\n }\n}\n\nexport interface ContextOptions {\n logger?: LoggerOptions;\n}\n\nexport interface InheritedContextOptions extends ContextOptions {\n bindLifecycleToParent?: boolean;\n}\n\nexport interface Context extends Logger {}\n\nexport class Context implements Logger {\n _name!: string;\n _parent?: Context;\n _lifecycle = new ContextLifecycle();\n _stores: StoreMap = new Map();\n _state = new Map();\n #name!: MaybeSignal<string>;\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 inherit(parent: Context, name: MaybeSignal<string>, options?: InheritedContextOptions): Context {\n const context = new Context(name, options);\n context._parent = parent;\n\n if (options?.bindLifecycleToParent) {\n parent._lifecycle.on(\"willMount\", () => {\n context._lifecycle.willMount();\n });\n parent._lifecycle.on(\"didMount\", () => {\n context._lifecycle.didMount();\n });\n parent._lifecycle.on(\"willUnmount\", () => {\n context._lifecycle.willUnmount();\n });\n parent._lifecycle.on(\"didUnmount\", () => {\n context._lifecycle.didUnmount();\n });\n } else {\n context._lifecycle.on(\"willMount\", () => {\n parent._lifecycle.willMount(true);\n });\n context._lifecycle.on(\"didMount\", () => {\n parent._lifecycle.didMount(true);\n });\n context._lifecycle.on(\"willUnmount\", () => {\n parent._lifecycle.willUnmount(true);\n });\n context._lifecycle.on(\"didUnmount\", () => {\n parent._lifecycle.didUnmount(true);\n });\n }\n return context;\n }\n\n constructor(name: MaybeSignal<string>, options?: ContextOptions) {\n this.setName(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 peek(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 = peek(name); // Try to store name as a readable string for debugging purposes.\n }\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 this.warn(`An instance of ${name} was already added on this context.`);\n return this;\n }\n\n const context = Context.inherit(this, store.name, {\n bindLifecycleToParent: true,\n logger: { tag: getUniqueId(), tagName: \"uid\" },\n });\n try {\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 getStore<T>(store: Store<any, T>): T {\n if (!isFunction(store)) {\n throw new StoreError(`Invalid store.`);\n }\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 result = globalStores.get(store);\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 beforeMount(listener: LifecycleListener) {\n this._lifecycle.on(\"willMount\", listener);\n return () => this._lifecycle.off(\"willMount\", listener);\n }\n\n onMount(listener: LifecycleListener) {\n this._lifecycle.on(\"didMount\", listener);\n return () => this._lifecycle.off(\"didMount\", listener);\n }\n\n beforeUnmount(listener: LifecycleListener) {\n this._lifecycle.on(\"willUnmount\", listener);\n return () => this._lifecycle.off(\"willUnmount\", listener);\n }\n\n onUnmount(listener: LifecycleListener) {\n this._lifecycle.on(\"didUnmount\", listener);\n return () => this._lifecycle.off(\"didUnmount\", listener);\n }\n\n effect(callback: EffectFn) {\n const fn = () => {\n try {\n // Return callback so cleanup function passes through\n return callback();\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 // If called when the component is connected, we assume this code is in a lifecycle hook\n // where it will be triggered at some point again after the component is reconnected.\n const unsubscribe = effect(fn);\n this._lifecycle.on(\"didUnmount\", unsubscribe);\n return unsubscribe;\n } else {\n // This should only happen if called in the body of the component function.\n // This code is not always re-run between when a component is unmounted and remounted.\n let unsubscribe: UnsubscribeFn | undefined;\n let disposed = false;\n this._lifecycle.on(\"willMount\", () => {\n if (!disposed) {\n unsubscribe = effect(fn);\n this._lifecycle.on(\"didUnmount\", 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 * Gets all 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 one\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 all\n let context: Context = this;\n const entries: [any, any][] = [];\n while (true) {\n entries.push(...context._state.entries());\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 setState<T>(key: any, value: T): void;\n // setState(values: Partial<Record<any, any>>): void;\n setState(entries: [any, any][]): void;\n\n setState() {\n if (arguments.length === 2) {\n this._state.set(arguments[0], arguments[1]);\n } else if (typeOf(arguments[0]) === \"object\") {\n for (const key in arguments[0]) {\n const value = arguments[0][key];\n if (value === undefined) {\n this._state.delete(key);\n } else {\n this._state.set(key, value);\n }\n }\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_ELEMENT = Symbol.for(\"dollaMarkupElement\");\n","import type { MarkupElement } from \"../markup\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols\";\n\n/**\n * Wraps any plain DOM node in a MarkupElement interface.\n */\nexport class DOMNode implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode: Node;\n\n get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor(node: Node) {\n this.domNode = node;\n }\n\n mount(parent: Node, after?: Node) {\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.domNode.parentNode && !parentIsUnmounting) {\n this.domNode.parentNode.removeChild(this.domNode);\n }\n }\n}\n","import { isArrayOf, isFunction, typeOf } from \"../../typeChecking.js\";\nimport { getUniqueId } from \"../../utils.js\";\nimport { Context } from \"../context.js\";\nimport { isMarkup, m, render, type Markup, type MarkupElement } from \"../markup.js\";\nimport { $, type Signal } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\n/*=====================================*\\\n|| Types ||\n\\*=====================================*/\n\nexport const ROUTE = Symbol(\"View.route\");\nexport const VIEW = Symbol(\"View\");\n\n/**\n * Any valid value that a View can return.\n */\nexport type ViewResult = Node | Signal<any> | Markup | Markup[] | null;\n\n/**\n *\n */\nexport type View<P> = (this: Context, props: P, context: Context) => ViewResult;\n\n/**\n * A view that has been constructed into DOM nodes.\n */\n// export interface ViewElement extends MarkupElement {\n// setRouteView(view: ViewFn<{}>): ViewElement;\n// }\n\nexport class ViewInstance<P> implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n uniqueId = getUniqueId();\n context: Context;\n props;\n fn;\n\n element?: MarkupElement;\n\n $name = $(\"\");\n\n constructor(context: Context, fn: View<P>, props: P, children?: Markup[]) {\n this.$name(fn.name || \"🌇 anonymous view\");\n this.context = Context.inherit(context, this.$name, {\n logger: {\n tag: this.uniqueId,\n tagName: \"uid\",\n },\n });\n this.context.setState(VIEW, this);\n this.props = {\n ...props,\n children,\n };\n this.fn = fn;\n }\n\n /*===============================*\\\n || \"Public\" API ||\n \\*===============================*/\n\n get domNode() {\n return this.element?.domNode!;\n }\n\n isMounted = false;\n\n mount(parent: Node, 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 wasConnected = this.isMounted;\n\n if (!wasConnected) {\n this._initialize();\n this.context._lifecycle.willMount();\n }\n\n if (this.element) {\n this.element.mount(parent, after);\n }\n\n if (!wasConnected) {\n this.isMounted = true;\n\n requestAnimationFrame(() => {\n this.context._lifecycle.didMount();\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n this.context._lifecycle.willUnmount();\n\n if (this.element) {\n // parentIsUnmounting is forwarded to the element because the view acts as a proxy for an element.\n this.element.unmount(parentIsUnmounting);\n }\n\n this.isMounted = false;\n\n this.context._lifecycle.didUnmount();\n }\n\n // setRouteView(fn: View<{}>) {\n // const node = new ViewInstance(this.context, fn, {});\n\n // const $route = this.context.getState(ROUTE) as Source<ViewInstance<{}>>;\n // $route(node);\n\n // return node;\n // }\n\n /*===============================*\\\n || Internal ||\n \\*===============================*/\n\n private _initialize() {\n const { context } = this;\n\n let result: ViewResult;\n try {\n result = this.fn.call(context, this.props, context);\n } catch (error) {\n if (error instanceof Error) {\n this.context.crash(error);\n }\n throw error;\n }\n\n if (result === null) {\n // Do nothing.\n } else if (result instanceof Node) {\n this.element = render(m(\"$node\", { value: result }), this.context);\n } else if (isFunction(result)) {\n this.element = render(m(\"$dynamic\", { source: result }), this.context);\n } else if (isMarkup(result) || isArrayOf<Markup>(isMarkup, result)) {\n this.element = render(result, this.context);\n } else {\n const error = new TypeError(\n `Expected '${\n this.fn.name\n }' function to return a DOM node, Markup element, Signal or null. Got: ${typeOf(result)}`,\n );\n this.context.crash(error);\n }\n }\n}\n","import { isArray, typeOf } from \"../../typeChecking.js\";\nimport type { Renderable } from \"../../types.js\";\nimport type { Context } from \"../context.js\";\nimport { isMarkupElement, isRenderable, toMarkup, toMarkupElements, type MarkupElement } from \"../markup.js\";\nimport { effect, peek, Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\nimport { ViewInstance, VIEW } from \"./view.js\";\n\ninterface DynamicOptions {\n source: Signal<Renderable>;\n context: Context;\n}\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 MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n private children: MarkupElement[] = [];\n private context: Context;\n\n private source: Signal<Renderable>;\n private unsubscribe?: UnsubscribeFn;\n\n get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor(options: DynamicOptions) {\n this.source = options.source;\n this.context = options.context;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n try {\n const content = this.source();\n\n if (!isRenderable(content)) {\n console.error(content);\n throw new TypeError(\n `Dynamic received invalid value to render. Got type: ${typeOf(content)}, value: ${content}`,\n );\n }\n\n peek(() => {\n this.update(isArray(content) ? content : [content]);\n });\n } catch (error) {\n const logger = this.context.getState<ViewInstance<any>>(VIEW).context;\n logger.error(error);\n logger.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.domNode.parentNode?.removeChild(this.domNode);\n }\n }\n\n cleanup(parentIsUnmounting: boolean) {\n for (const element of this.children) {\n element.unmount(parentIsUnmounting);\n }\n this.children = [];\n }\n\n update(children: Renderable[]) {\n this.cleanup(false);\n\n if (children == null || children.length === 0 || !this.isMounted) {\n return;\n }\n\n const newElements: MarkupElement[] = children.flatMap((c) => {\n if (isMarkupElement(c)) {\n return c as MarkupElement;\n } else {\n return toMarkupElements(this.context, toMarkup(c));\n }\n });\n\n // console.log(\"$dynamic update\", newElements, children);\n\n for (const element of newElements) {\n const previous = this.children.at(-1)?.domNode || this.domNode;\n element.mount(this.domNode.parentNode!, previous);\n this.children.push(element);\n }\n\n // Move marker node to end.\n const parent = this.domNode.parentNode!;\n const lastChildNextSibling = this.children.at(-1)?.domNode?.nextSibling ?? null;\n if (\"moveBefore\" in parent) {\n (parent.moveBefore as any)(this.domNode, lastChildNextSibling);\n } else {\n parent.insertBefore(this.domNode, lastChildNextSibling);\n }\n }\n}\n","import { isFunction } from \"../../typeChecking.js\";\nimport { type MarkupElement } from \"../markup.js\";\nimport { effect, get, peek, type MaybeSignal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\n/**\n * Manages several MarkupElements as one.\n */\nexport class Fragment implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n isMounted = false;\n\n private source: MaybeSignal<MarkupElement[]>;\n private elements: MarkupElement[] = [];\n\n private unsubscribe?: UnsubscribeFn;\n\n constructor(source: MaybeSignal<MarkupElement[]>) {\n this.source = source;\n }\n\n mount(parent: Node, after?: Node | undefined) {\n if (!this.isMounted) {\n this.isMounted = true;\n\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n if (isFunction(this.source)) {\n this.unsubscribe = effect(() => {\n const value = get(this.source);\n peek(() => {\n this.update(value);\n });\n });\n } else {\n this.update(this.elements);\n }\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = undefined;\n }\n\n if (this.isMounted) {\n this.cleanup(parentIsUnmounting);\n this.isMounted = false;\n }\n }\n\n private cleanup(parentIsUnmounting: boolean) {\n for (const element of this.elements) {\n element.unmount(parentIsUnmounting);\n }\n this.elements = [];\n }\n\n private update(newElements: MarkupElement[]) {\n this.cleanup(false);\n\n if (newElements.length > 0) {\n for (let i = 0; i < newElements.length; i++) {\n const element = newElements[i];\n const previous = i > 0 ? this.elements[i - 1] : undefined;\n element.mount(this.domNode.parentElement!, previous?.domNode);\n this.elements.push(element);\n }\n\n this.domNode.parentNode?.insertBefore(this.domNode, this.elements.at(-1)?.domNode ?? null);\n }\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 { Logger } from \"../logger.js\";\nimport { toMarkup, toMarkupElements, type Markup, type MarkupElement } from \"../markup.js\";\nimport { effect, get, peek, type MaybeSignal, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\nimport { ViewInstance, VIEW } 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// const IS_SVG = \"__IS_SVG__\";\n\ntype HTMLOptions = {\n context: Context;\n tag: string;\n props: Record<string, any>;\n children?: any[];\n};\n\nexport class HTML implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode;\n context: Context;\n\n private props: Record<string, any>;\n private childMarkup: Markup[] = [];\n private children: MarkupElement[] = [];\n private unsubscribers: UnsubscribeFn[] = [];\n\n private logger: Logger;\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 get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor({ tag, props, children, context }: HTMLOptions) {\n this.context = Context.inherit(context, tag);\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 const view = this.context.getState<ViewInstance<unknown>>(VIEW);\n this.logger = view.context;\n\n // Create node with the appropriate constructor.\n if (this.context.getState(IS_SVG, false)) {\n this.domNode = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n } else {\n this.domNode = document.createElement(tag);\n }\n\n if (getEnv() === \"development\" && peek(view.$name)) {\n this.domNode.dataset.view = peek(view.$name);\n }\n\n if (props.ref) {\n if (isFunction(props.ref)) {\n this.ref = props.ref;\n this.ref(this.domNode);\n } else {\n throw new Error(\"Expected ref to be a function. Got: \" + props.ref);\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.domNode,\n Context.inherit(this.context, () => getLoggerName(this), {\n bindLifecycleToParent: true,\n logger: { tagName: fn.name === \"mixin\" ? undefined : \"mixin\", tag: fn.name },\n }),\n );\n }\n }\n\n this.props = {\n ...omit([\"ref\", \"class\", \"className\", \"mixin\"], props),\n class: props.className ?? props.class,\n };\n\n if (children) {\n this.childMarkup = toMarkup(children);\n }\n }\n\n mount(parent: Node, after?: Node) {\n if (parent == null) {\n throw new Error(`HTML element requires a parent element as the first argument to connect. Got: ${parent}`);\n }\n\n const wasMounted = this.isMounted;\n\n if (!wasMounted) {\n this.context._lifecycle.willMount();\n\n if (this.childMarkup.length > 0) {\n this.children = toMarkupElements(this.context, this.childMarkup);\n }\n\n for (let i = 0; i < this.children.length; i++) {\n const child = this.children[i];\n const previous = i > 0 ? this.children[i - 1].domNode : undefined;\n child.mount(this.domNode, previous);\n }\n\n this.applyProps(this.domNode, this.props);\n if (this.props.style) this.applyStyles(this.domNode, this.props.style, this.unsubscribers);\n if (this.props.class) this.applyClasses(this.domNode, this.props.class, this.unsubscribers);\n }\n\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n queueMicrotask(() => {\n this.canClickAway = true;\n\n if (!wasMounted) this.context._lifecycle.didMount();\n });\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.isMounted) {\n this.context._lifecycle.willUnmount();\n\n if (!parentIsUnmounting) {\n this.domNode.parentNode?.removeChild(this.domNode);\n }\n\n for (const child of this.children) {\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 this.context._lifecycle.didUnmount();\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.logger.error(error);\n this.logger.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 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 (isFunction(value) && eventProps.includes(key)) {\n const _key = key.substring(2);\n element.addEventListener(_key, value as EventListener);\n this.unsubscribers.push(() => {\n element.removeEventListener(_key, value as EventListener);\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 (this.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 \"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\n/**\n * Converts a camelCase string to kebab-case.\n */\nexport function 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\nconst eventProps = [\"onsubmit\", \"onclick\", \"ontransitionend\"];\n\nfunction getLoggerName(html: HTML) {\n let name = html.domNode.tagName.toLowerCase();\n if (html.domNode.id) {\n name += `#${html.domNode.id}`;\n }\n if (html.domNode.classList.length > 0) {\n for (const className of html.domNode.classList.values()) {\n name += `.${className}`;\n }\n }\n return name;\n}\n","import { type MarkupElement } from \"../markup.js\";\nimport { effect, peek, type Signal, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\n/**\n * Renders the subroute of the nearest view.\n */\nexport class Outlet implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n isMounted = false;\n\n private $slot: Signal<MarkupElement | undefined>;\n private mounted?: MarkupElement;\n\n private unsubscribe?: UnsubscribeFn;\n\n constructor($slot: Signal<MarkupElement | undefined>) {\n this.$slot = $slot;\n }\n\n mount(parent: Node, after?: Node | undefined) {\n if (!this.isMounted) {\n this.isMounted = true;\n\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n const element = this.$slot();\n peek(() => {\n this.update(element);\n });\n });\n }\n }\n\n unmount(parentIsUnmounting = false) {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = undefined;\n }\n\n if (this.isMounted) {\n this.cleanup(parentIsUnmounting);\n this.isMounted = false;\n }\n }\n\n private cleanup(parentIsUnmounting: boolean) {\n if (this.mounted) {\n this.mounted.unmount(parentIsUnmounting);\n }\n this.mounted = undefined;\n }\n\n private update(element?: MarkupElement) {\n this.cleanup(false);\n\n if (element) {\n element.mount(this.domNode.parentElement!, this.domNode);\n this.mounted = element;\n }\n }\n}\n","import type { Renderable } from \"../../types.js\";\nimport { Context } from \"../context.js\";\nimport { toMarkupElements, groupElements, isMarkupElement, toMarkup, type MarkupElement } from \"../markup.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\n\ninterface PortalConfig {\n content: Renderable;\n parent: Node;\n context: Context;\n}\n\n/**\n * Renders content into a specified parent node.\n */\nexport class Portal implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n private config: PortalConfig;\n private element?: MarkupElement;\n\n get isMounted() {\n if (!this.element) {\n return false;\n }\n return this.element.isMounted;\n }\n\n constructor(config: PortalConfig) {\n this.config = config;\n }\n\n mount(_parent: Node, _after?: Node) {\n const { content, parent } = this.config;\n\n if (isMarkupElement(content)) {\n this.element = content;\n } else {\n this.element = groupElements(toMarkupElements(this.config.context, toMarkup(content)));\n }\n\n this.element.mount(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","import { deepEqual } from \"../../utils.js\";\nimport { type Context } from \"../context.js\";\nimport { type MarkupElement } from \"../markup.js\";\nimport { $, effect, peek, type Signal, type Source, type UnsubscribeFn } from \"../signals.js\";\nimport { IS_MARKUP_ELEMENT } from \"../symbols.js\";\nimport { ViewInstance, type ViewResult } from \"./view.js\";\n\n// ----- Types ----- //\n\ninterface RepeatOptions<T> {\n context: Context;\n items: Signal<T[]>;\n keyFn: (item: T, index: number) => string | number | symbol;\n renderFn: (item: Signal<T>, index: Signal<number>, ctx: Context) => ViewResult;\n}\n\ntype ConnectedItem<T> = {\n key: any;\n item: Source<T>;\n index: Source<number>;\n element: MarkupElement;\n};\n\n// ----- Code ----- //\n\nexport class Repeat<T> implements MarkupElement {\n [IS_MARKUP_ELEMENT] = true;\n\n domNode = document.createTextNode(\"\");\n private items: Signal<T[]>;\n private unsubscribe: UnsubscribeFn | null = null;\n private connectedItems: ConnectedItem<T>[] = [];\n private context;\n private renderFn: (this: Context, value: Signal<T>, index: Signal<number>, context: Context) => ViewResult;\n private keyFn: (value: T, index: number) => string | number | symbol;\n\n get isMounted() {\n return this.domNode.parentNode != null;\n }\n\n constructor({ context, items, renderFn, keyFn }: RepeatOptions<T>) {\n this.context = context;\n\n this.items = items;\n this.renderFn = renderFn;\n this.keyFn = keyFn;\n }\n\n mount(parent: Node, after?: Node) {\n if (!this.isMounted) {\n parent.insertBefore(this.domNode, after?.nextSibling ?? null);\n\n this.unsubscribe = effect(() => {\n let value = this.items();\n\n if (value == null) {\n value = [];\n console.log(\"repeat received empty value\", value, this);\n }\n\n peek(() => {\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.domNode.parentNode?.removeChild(this.domNode);\n }\n\n this._cleanup(parentIsUnmounting);\n }\n\n private _cleanup(parentIsUnmounting: boolean) {\n for (const item of this.connectedItems) {\n item.element.unmount(parentIsUnmounting);\n }\n this.connectedItems = [];\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: UpdateItem[] = [];\n let index = 0;\n\n for (const item of value) {\n potentialItems.push({\n key: this.keyFn(item, index),\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) {\n const potentialItem = potentialItems.find((p) => p.key === connected.key);\n\n if (!potentialItem) {\n connected.element.unmount(false);\n }\n }\n\n // Add new views and update state for existing ones.\n for (const potential of potentialItems) {\n const connected = this.connectedItems.find((item) => item.key === potential.key);\n\n if (connected) {\n connected.item(potential.value);\n connected.index(potential.index);\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 element: new ViewInstance(this.context, RepeatItemView, {\n item: () => item(),\n index: () => index(),\n renderFn: this.renderFn,\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]?.element.domNode ?? this.domNode;\n item.element.mount(this.domNode.parentNode!, previous);\n }\n\n this.connectedItems = newItems;\n\n // Move marker node to end.\n const lastItem = newItems.at(-1)?.element.domNode ?? this.domNode;\n this.domNode.parentNode?.insertBefore(this.domNode, lastItem.nextSibling);\n }\n}\n\ninterface ListItemProps {\n item: Signal<any>;\n index: Signal<number>;\n renderFn: (item: Signal<any>, index: Signal<number>, context: Context) => ViewResult;\n}\n\nfunction RepeatItemView(props: ListItemProps, context: Context) {\n context.setName(\"@RepeatItem\");\n return props.renderFn.call(context, props.item, props.index, context);\n}\n","import { isArray, isArrayOf, isFunction, isNumber, isString } from \"../typeChecking.js\";\nimport type { Mountable, Renderable } from \"../types.js\";\nimport { Context } from \"./context.js\";\nimport { DOMNode } from \"./nodes/dom.js\";\nimport { Dynamic } from \"./nodes/dynamic.js\";\nimport { Fragment } from \"./nodes/fragment.js\";\nimport { HTML } from \"./nodes/html.js\";\nimport { Outlet } from \"./nodes/outlet.js\";\nimport { Portal } from \"./nodes/portal.js\";\nimport { Repeat } from \"./nodes/repeat.js\";\nimport { ViewInstance, type View, type ViewResult } from \"./nodes/view.js\";\nimport { $, get, type MaybeSignal, type Signal } from \"./signals.js\";\nimport { IS_MARKUP_ELEMENT } 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 interface Markup {\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: string | View<any>;\n /**\n * Data that will be passed to a new MarkupElement instance when it is constructed.\n */\n props?: Record<string, any>;\n /**\n *\n */\n children?: any[];\n}\n\n// export class Markup {\n// type;\n// props;\n// children;\n\n// constructor(type: string | View<any>, props?: Record<string, any>, children?: any[]) {\n// this.type = type;\n// this.props = props;\n// this.children = children;\n// }\n// }\n\n/**\n * A DOM node that has been constructed from a Markup object.\n */\nexport interface MarkupElement extends Mountable {\n readonly domNode?: Node;\n\n readonly isMounted: boolean;\n}\n\nexport function isMarkup(value: any): value is Markup {\n return value instanceof VNode;\n}\n\nexport function isMarkupElement(value: any): value is MarkupElement {\n return value?.[IS_MARKUP_ELEMENT] === true;\n}\n\nexport function toMarkup(renderables: Renderable | Renderable[]): Markup[] {\n if (!isArray(renderables)) {\n renderables = [renderables];\n }\n\n const results: Markup[] = [];\n\n for (const x of renderables) {\n if (x === null || x === undefined || x === false) {\n continue;\n }\n\n if (x instanceof Node) {\n results.push(m(\"$node\", { value: x }));\n continue;\n }\n\n if (isMarkup(x)) {\n results.push(x);\n continue;\n }\n\n if (isFunction(x)) {\n results.push(m(\"$dynamic\", { source: x }));\n continue;\n }\n\n if (isArray(x)) {\n results.push(...toMarkup(x));\n continue;\n }\n\n // fallback to displaying value as text\n results.push(m(\"$text\", { value: x }));\n }\n\n return results;\n}\n\nexport enum MarkupType {\n Text = \"$text\",\n Repeat = \"$repeat\",\n Dynamic = \"$dynamic\",\n Outlet = \"$outlet\",\n Fragment = \"$fragment\",\n Node = \"$node\",\n Portal = \"$portal\",\n}\n\nexport interface MarkupAttributes {\n [MarkupType.Text]: { value: any };\n [MarkupType.Repeat]: {\n items: Signal<any[]>;\n keyFn: (value: any, index: number) => string | number | symbol;\n renderFn: (item: Signal<any>, index: Signal<number>, ctx: Context) => ViewResult;\n };\n [MarkupType.Dynamic]: {\n source: Signal<Renderable>;\n };\n [MarkupType.Outlet]: {\n view: Signal<ViewInstance<{}> | undefined>;\n };\n [MarkupType.Fragment]: {\n children: MaybeSignal<MarkupElement[]>;\n };\n [MarkupType.Node]: {\n value: Node;\n };\n [MarkupType.Portal]: {\n content: Renderable;\n parent: Node;\n };\n\n [tag: string]: Record<string, any>;\n}\n\nexport function m<T extends keyof MarkupAttributes>(\n type: T,\n attributes: MarkupAttributes[T],\n ...children: Renderable[]\n): Markup;\n\nexport function m<I>(type: View<I>, attributes?: I, ...children: any[]): Markup;\n\nexport function m<P>(type: string | View<P>, props?: P, ...children: any[]) {\n return new VNode(type, props as any, ...children);\n}\n\nclass VNode<P extends Record<any, any>> implements Markup {\n type;\n props;\n children;\n\n constructor(type: string | View<P>, props?: P, ...children: Renderable[]) {\n this.type = type;\n this.props = props;\n this.children = children;\n }\n}\n\n/*===========================*\\\n|| View Helpers ||\n\\*===========================*/\n\n/**\n * Displays `thenContent` when `condition` is truthy and `elseContent` when falsy.\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`. Displays `thenContent` when `condition` is falsy and `elseContent` when truthy.\n */\nexport function unless(condition: MaybeSignal<any>, thenContent?: Renderable, elseContent?: Renderable): Markup {\n return when(condition, elseContent, thenContent);\n}\n\n/**\n * Calls `renderFn` for each item in `items`. Dynamically adds and removes views as items change.\n * The result of `keyFn` is used to compare items and decide if item was added, removed or updated.\n */\nexport function repeat<T>(\n items: MaybeSignal<T[]>,\n keyFn: (value: T, index: number) => string | number | symbol,\n renderFn: (item: Signal<T>, index: Signal<number>, ctx: Context) => ViewResult,\n): Markup {\n return m(MarkupType.Repeat, { items: () => get(items), keyFn, renderFn });\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: Node, 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(\"$\")): MarkupElement {\n return groupElements(toMarkupElements(context, toMarkup(content)));\n}\n\n/**\n * Construct Markup metadata into a set of MarkupElements.\n */\nexport function toMarkupElements(context: Context, markup: Markup | Markup[]): MarkupElement[] {\n const items = isArray(markup) ? markup : [markup];\n\n return items.map((item) => {\n if (isFunction(item.type)) {\n return new ViewInstance(context, item.type as View<any>, item.props, item.children);\n } else if (isString(item.type)) {\n switch (item.type) {\n case MarkupType.Node: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Node];\n return new DOMNode(attrs.value);\n }\n case MarkupType.Text: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Text];\n return new DOMNode(document.createTextNode(String(attrs.value)));\n }\n case MarkupType.Repeat: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Repeat];\n return new Repeat({\n items: attrs.items,\n keyFn: attrs.keyFn,\n renderFn: attrs.renderFn,\n context,\n });\n }\n case MarkupType.Dynamic: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Dynamic];\n return new Dynamic({\n source: attrs.source,\n context,\n });\n }\n case MarkupType.Fragment: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Fragment];\n return new Fragment(attrs.children);\n }\n case MarkupType.Outlet: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Outlet];\n return new Outlet(attrs.view);\n }\n case MarkupType.Portal: {\n const attrs = item.props! as MarkupAttributes[MarkupType.Portal];\n return new Portal({\n content: attrs.content,\n parent: attrs.parent,\n context,\n });\n }\n default:\n // Handle type as an HTML tag.\n return new HTML({\n tag: item.type,\n props: item.props ?? {},\n children: item.children,\n context,\n });\n }\n } else {\n throw new TypeError(`Expected a string or view function. Got: ${item.type}`);\n }\n });\n}\n\n/**\n * Combines one or more MarkupElements into a single MarkupElement.\n */\nexport function groupElements(elements: MarkupElement[]): MarkupElement {\n if (elements.length === 1) {\n return elements[0];\n }\n\n return new Fragment(elements);\n}\n\nexport function isRenderable(value: unknown): value is Renderable {\n return (\n value == null ||\n value === false ||\n isFunction(value.toString) ||\n isFunction(value) ||\n isString(value) ||\n isNumber(value) ||\n isMarkup(value) ||\n isArrayOf(isRenderable, value)\n );\n}\n"],"names":["globalStores","ContextLifecycle","__publicField","__privateAdd","_listeners","event","listener","__privateGet","dependent","__privateSet","_Context","name","options","_name","logger","createLogger","get","descriptors","key","state","parent","context","peek","store","getUniqueId","result","error","isFunction","StoreError","callback","fn","unsubscribe","effect","disposed","defaultValue","value","entries","typeOf","Context","createContext","IS_MARKUP_ELEMENT","_a","DOMNode","node","after","parentIsUnmounting","VIEW","ViewInstance","props","children","$","wasConnected","render","m","isMarkup","isArrayOf","Dynamic","content","isRenderable","isArray","_b","element","newElements","c","isMarkupElement","toMarkupElements","toMarkup","previous","lastChildNextSibling","_c","Fragment","source","isCamelCaseEventName","IS_SVG","HTML","tag","view","getEnv","mixins","getLoggerName","omit","wasMounted","child","e","eventName","eventProps","_key","current","privateProps","_prev","styles","unsubscribers","propUnsubscribers","unapply","mapped","getStyleMap","priority","classes","classUnsubscribers","getClassMap","isString","names","isObject","item","lines","line","_value","entry","camelToKebab","ofs","html","className","Outlet","$slot","Portal","config","_parent","_after","groupElements","Repeat","items","renderFn","keyFn","potentialItems","index","newItems","connected","p","potential","deepEqual","RepeatItemView","i","lastItem","VNode","renderables","results","x","type","when","condition","thenContent","elseContent","unless","repeat","portal","markup","attrs","elements","isNumber"],"mappings":";;;;;;;;;AAWa,MAAAA,yBAA6B,IAAI;;AAwB9C,MAAMC,GAAiB;AAAA,EAAvB;AACE,IAAAC,EAAA,eAAQ;AACR,IAAAA,EAAA,oBAAa;AAEb,IAAAC,EAAA,MAAAC,GAAwC,CAAC;AAAA;AAAA,EAEzC,GAA8CC,GAAUC,GAA6B;AACnF,IAAKC,EAAA,MAAKH,GAAWC,CAAK,IAEfE,EAAA,MAAKH,GAAWC,CAAK,EAAE,QAAQC,CAAQ,MAAM,MACtDC,EAAA,MAAKH,GAAWC,CAAK,EAAE,KAAKC,CAAQ,IAFpCC,EAAA,MAAKH,GAAWC,CAAK,IAAI,CAACC,CAAQ;AAAA,EAGpC;AAAA,EAGF,IAA+CD,GAAUC,GAA6B;AAChF,IAAAC,EAAA,MAAKH,GAAWC,CAAK,MAClBE,EAAA,MAAAH,GAAWC,CAAK,EAAE,OAAOE,EAAA,MAAKH,GAAWC,CAAK,EAAE,QAAQC,CAAQ,GAAG,CAAC,GAErEC,EAAA,MAAKH,GAAWC,CAAK,EAAE,WAAW,KAC7B,OAAAE,EAAA,MAAKH,GAAWC,CAAK;AAAA,EAEhC;AAAA,EAGF,UAAUG,IAAY,IAAO;AAGvB,QAFAA,KAAgB,KAAA,cAEhB,KAAK,QAAQ,GAA0B;AACrC,UAAAD,EAAA,MAAKH,GAAW;AACP,mBAAAE,KAAYC,EAAA,MAAKH,GAAW;AAC5B,UAAAE,EAAA;AAGR,WAAA,QAAQE,IAAY,IAAsC;AAAA,IAAA;AAAA,EACjE;AAAA,EAEF,SAASA,IAAY,IAAO;AAC1B,QAAI,KAAK,SAAS,KAA4B,KAAK,QAAQ,MACzD,KAAK,SAAS,GACVD,EAAA,MAAKH,GAAW;AACP,iBAAAE,KAAYC,EAAA,MAAKH,GAAW;AAC5B,QAAAE,EAAA;AAAA,EAGf;AAAA,EAEF,YAAYE,IAAY,IAAO;AAC7B,QAAIA;AACG,WAAA,cACA,KAAK,cACR,KAAK,YAAY;AAAA,aAEV,KAAK,SAAS,KAA2B,KAAK,QAAQ,GAA4B;AACvF,UAAAD,EAAA,MAAKH,GAAW;AACP,mBAAAE,KAAYC,EAAA,MAAKH,GAAW;AAC5B,UAAAE,EAAA;AAGb,WAAK,SAAS;AAAA,IAAA;AAAA,EAChB;AAAA,EAEF,WAAWE,IAAY,IAAO;AAC5B,QAAIA;AACF,MAAI,CAAC,KAAK,cAAc,KAAK,UAAU,KACrC,KAAK,WAAW;AAAA,aAET,KAAK,SAAS,KAA8B,KAAK,QAAQ,MAElE,KAAK,QAAQ,IAA4B,GACrCD,EAAA,MAAKH,GAAW;AACP,iBAAAE,KAAYC,EAAA,MAAKH,GAAW;AAC5B,QAAAE,EAAA;AAAA,EAGf;AAAA,EAGF,UAAU;AACR,SAAK,YAAY,GACjB,KAAK,WAAW,GAChBG,EAAA,MAAKL,GAAa,CAAC;AAAA,EAAA;AAEvB;AA9EEA,IAAA;;AA0FK,MAAMM,IAAN,MAAMA,EAA0B;AAAA,EAkDrC,YAAYC,GAA2BC,GAA0B;AAjDjE,IAAAV,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,oBAAa,IAAID,GAAiB;AAClC,IAAAC,EAAA,qCAAwB,IAAI;AAC5B,IAAAA,EAAA,oCAAa,IAAI;AACjB,IAAAC,EAAA,MAAAU;AA6CE,SAAK,QAAQF,CAAI;AAGX,UAAAG,IAASC,GAAa,MAAMC,EAAIT,EAAA,MAAKM,EAAK,GAAGD,KAAA,gBAAAA,EAAS,MAAM,GAC5DK,IAAc,OAAO,0BAA0BH,CAAM;AAC3D,eAAWI,KAAOD;AAChB,aAAO,eAAe,MAAMC,GAAKD,EAAYC,CAAG,CAAC;AAAA,EACnD;AAAA,EAlDF,IAAI,YAAY;AACR,UAAA,EAAE,OAAAC,MAAU,KAAK;AAChB,WAAAA,KAAS,KAA2BA,IAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMrD,OAAO,QAAQC,GAAiBT,GAA2BC,GAA4C;AACrG,UAAMS,IAAU,IAAIX,EAAQC,GAAMC,CAAO;AACzC,WAAAS,EAAQ,UAAUD,GAEdR,KAAA,QAAAA,EAAS,yBACJQ,EAAA,WAAW,GAAG,aAAa,MAAM;AACtC,MAAAC,EAAQ,WAAW,UAAU;AAAA,IAAA,CAC9B,GACMD,EAAA,WAAW,GAAG,YAAY,MAAM;AACrC,MAAAC,EAAQ,WAAW,SAAS;AAAA,IAAA,CAC7B,GACMD,EAAA,WAAW,GAAG,eAAe,MAAM;AACxC,MAAAC,EAAQ,WAAW,YAAY;AAAA,IAAA,CAChC,GACMD,EAAA,WAAW,GAAG,cAAc,MAAM;AACvC,MAAAC,EAAQ,WAAW,WAAW;AAAA,IAAA,CAC/B,MAEOA,EAAA,WAAW,GAAG,aAAa,MAAM;AAChC,MAAAD,EAAA,WAAW,UAAU,EAAI;AAAA,IAAA,CACjC,GACOC,EAAA,WAAW,GAAG,YAAY,MAAM;AAC/B,MAAAD,EAAA,WAAW,SAAS,EAAI;AAAA,IAAA,CAChC,GACOC,EAAA,WAAW,GAAG,eAAe,MAAM;AAClC,MAAAD,EAAA,WAAW,YAAY,EAAI;AAAA,IAAA,CACnC,GACOC,EAAA,WAAW,GAAG,cAAc,MAAM;AACjC,MAAAD,EAAA,WAAW,WAAW,EAAI;AAAA,IAAA,CAClC,IAEIC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAiBT,UAAkB;AACT,WAAAC,EAAKf,EAAA,MAAKM,EAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,QAAQF,GAA2B;AACjC,IAAAF,EAAA,MAAKI,GAAQF,IACR,KAAA,QAAQW,EAAKX,CAAI;AAAA,EAAA;AAAA,EAGxB,SAAYY,GAAsBX,GAAqB;AACrD,QAAI,KAAK,QAAQ,IAAIW,CAAK,GAAG;AAC3B,UAAIZ,IAAOY,EAAM,OAAO,IAAIA,EAAM,IAAI,MAAM;AACvC,kBAAA,KAAK,kBAAkBZ,CAAI,qCAAqC,GAC9D;AAAA,IAAA;AAGT,UAAMU,IAAUX,EAAQ,QAAQ,MAAMa,EAAM,MAAM;AAAA,MAChD,uBAAuB;AAAA,MACvB,QAAQ,EAAE,KAAKC,EAAY,GAAG,SAAS,MAAM;AAAA,IAAA,CAC9C;AACG,QAAA;AACF,YAAMC,IAASF,EAAM,KAAKF,GAAST,GAASS,CAAO;AAC9C,WAAA,QAAQ,IAAIE,GAAOE,CAAM;AAAA,aACvBC,GAAO;AACR,YAAA,KAAK,MAAMA,CAAc;AAAA,IAAA;AAG1B,WAAA;AAAA,EAAA;AAAA,EAGT,SAAYH,GAAyB;AAC/B,QAAA,CAACI,EAAWJ,CAAK;AACb,YAAA,IAAIK,EAAW,gBAAgB;AAGvC,QAAIP,IAAmB,MACnBI;AACJ,WACWA,IAAAJ,EAAQ,QAAQ,IAAIE,CAAK,GAC9BE,KAAU,QAAQJ,EAAQ,WAAW;AACvC,MAAAA,IAAUA,EAAQ;AAQtB,QAHII,KAAU,SACHA,IAAAzB,GAAa,IAAIuB,CAAK,IAE7BE,KAAU;AACN,YAAA,KAAK,MAAM,IAAIG,EAAW,UAAUL,EAAM,IAAI,oCAAoC,CAAC;AAEpF,WAAAE;AAAA,EAAA;AAAA,EAGT,YAAYnB,GAA6B;AAClC,gBAAA,WAAW,GAAG,aAAaA,CAAQ,GACjC,MAAM,KAAK,WAAW,IAAI,aAAaA,CAAQ;AAAA,EAAA;AAAA,EAGxD,QAAQA,GAA6B;AAC9B,gBAAA,WAAW,GAAG,YAAYA,CAAQ,GAChC,MAAM,KAAK,WAAW,IAAI,YAAYA,CAAQ;AAAA,EAAA;AAAA,EAGvD,cAAcA,GAA6B;AACpC,gBAAA,WAAW,GAAG,eAAeA,CAAQ,GACnC,MAAM,KAAK,WAAW,IAAI,eAAeA,CAAQ;AAAA,EAAA;AAAA,EAG1D,UAAUA,GAA6B;AAChC,gBAAA,WAAW,GAAG,cAAcA,CAAQ,GAClC,MAAM,KAAK,WAAW,IAAI,cAAcA,CAAQ;AAAA,EAAA;AAAA,EAGzD,OAAOuB,GAAoB;AACzB,UAAMC,IAAK,MAAM;AACX,UAAA;AAEF,eAAOD,EAAS;AAAA,eACTH,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;AAEI,QAAA,KAAK,WAAW,SAAS,GAA0B;AAG/C,YAAAK,IAAcC,EAAOF,CAAE;AACxB,kBAAA,WAAW,GAAG,cAAcC,CAAW,GACrCA;AAAA,IAAA,OACF;AAGD,UAAAA,GACAE,IAAW;AACV,kBAAA,WAAW,GAAG,aAAa,MAAM;AACpC,QAAKA,MACHF,IAAcC,EAAOF,CAAE,GAClB,KAAA,WAAW,GAAG,cAAcC,CAAW;AAAA,MAC9C,CACD,GACM,MAAM;AACX,QAAIA,KAAe,SACNE,IAAA,IACCF,EAAA;AAAA,MAEhB;AAAA,IAAA;AAAA,EACF;AAAA,EAkBF,SAAYb,GAAWgB,GAAqC;AACtD,QAAA,UAAU,SAAS,GAAG;AAExB,UAAIb,IAAmB,MACnBc;AACJ,aACUA,IAAAd,EAAQ,OAAO,IAAIH,CAAG,GAC1BiB,MAAU,UAAad,EAAQ,WAAW;AAC5C,QAAAA,IAAUA,EAAQ;AAKtB,UAAIc,MAAU,QAAW;AACnB,YAAA,UAAU,SAAS;AACd,iBAAAD;AAEP,cAAM,IAAI,MAAM,yBAAyB,OAAOhB,CAAG,CAAC,sBAAsB;AAAA,MAC5E;AAEK,aAAAiB;AAAA,IAAA,OACF;AAEL,UAAId,IAAmB;AACvB,YAAMe,IAAwB,CAAC;AAC/B,aACEA,EAAQ,KAAK,GAAGf,EAAQ,OAAO,SAAS,GACpCA,EAAQ,WAAW;AACrB,QAAAA,IAAUA,EAAQ;AAKtB,aAAO,IAAI,IAAIe,EAAQ,SAAS;AAAA,IAAA;AAAA,EAClC;AAAA,EAOF,WAAW;AACL,QAAA,UAAU,WAAW;AACvB,WAAK,OAAO,IAAI,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAAA,aACjCC,EAAO,UAAU,CAAC,CAAC,MAAM;AACvB,iBAAAnB,KAAO,UAAU,CAAC,GAAG;AAC9B,cAAMiB,IAAQ,UAAU,CAAC,EAAEjB,CAAG;AAC9B,QAAIiB,MAAU,SACP,KAAA,OAAO,OAAOjB,CAAG,IAEjB,KAAA,OAAO,IAAIA,GAAKiB,CAAK;AAAA,MAC5B;AAAA,aAEOE,EAAO,UAAU,CAAC,CAAC,MAAM;AAClC,iBAAW,CAACnB,GAAKiB,CAAK,KAAK,UAAU,CAAC;AACpC,QAAIA,MAAU,SACP,KAAA,OAAO,OAAOjB,CAAG,IAEjB,KAAA,OAAO,IAAIA,GAAKiB,CAAK;AAAA;AAIxB,YAAA,IAAI,MAAM,oBAAoB;AAG/B,WAAA;AAAA,EAAA;AAEX;AApQEtB,IAAA;AANK,IAAMyB,IAAN5B;AA4QS,SAAA6B,GAAc5B,GAA2BC,GAA0B;AAC1E,SAAA,IAAI0B,EAAQ3B,GAAMC,CAAO;AAClC;AAEO,MAAMgB,UAAmB,MAAM;AAAC;AC/Y1B,MAAAY,IAAoB,OAAO,IAAI,oBAAoB;;ACK7DC,IAAAD;AADI,MAAME,EAAiC;AAAA,EAS5C,YAAYC,GAAY;AARxB,IAAAzC,EAAA,MAACuC,GAAqB;AAEtB,IAAAvC,EAAA;AAOE,SAAK,UAAUyC;AAAA,EAAA;AAAA,EALjB,IAAI,YAAY;AACP,WAAA,KAAK,QAAQ,cAAc;AAAA,EAAA;AAAA,EAOpC,MAAMvB,GAAcwB,GAAc;AAChC,IAAAxB,EAAO,aAAa,KAAK,UAASwB,KAAA,gBAAAA,EAAO,gBAAe,IAAI;AAAA,EAAA;AAAA,EAG9D,QAAQC,IAAqB,IAAO;AAClC,IAAI,KAAK,QAAQ,cAAc,CAACA,KAC9B,KAAK,QAAQ,WAAW,YAAY,KAAK,OAAO;AAAA,EAClD;AAEJ;AChBa,MAAAC,IAAO,OAAO,MAAM;;AAoB9BL,IAAAD;AADI,MAAMO,EAAyC;AAAA,EAYpD,YAAY1B,GAAkBS,GAAakB,GAAUC,GAAqB;AAX1E,IAAA/C,EAAA,MAACuC,GAAqB;AAEtB,IAAAvC,EAAA,kBAAWsB,EAAY;AACvB,IAAAtB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AAEA,IAAAA,EAAA,eAAQgD,EAAE,EAAE;AA0BZ,IAAAhD,EAAA,mBAAY;AAvBL,SAAA,MAAM4B,EAAG,QAAQ,mBAAmB,GACzC,KAAK,UAAUQ,EAAQ,QAAQjB,GAAS,KAAK,OAAO;AAAA,MAClD,QAAQ;AAAA,QACN,KAAK,KAAK;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,IACX,CACD,GACI,KAAA,QAAQ,SAASyB,GAAM,IAAI,GAChC,KAAK,QAAQ;AAAA,MACX,GAAGE;AAAA,MACH,UAAAC;AAAA,IACF,GACA,KAAK,KAAKnB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,IAAI,UAAU;;AACZ,YAAOW,IAAA,KAAK,YAAL,gBAAAA,EAAc;AAAA,EAAA;AAAA,EAKvB,MAAMrB,GAAcwB,GAAc;AAGhC,UAAMO,IAAe,KAAK;AAE1B,IAAKA,MACH,KAAK,YAAY,GACZ,KAAA,QAAQ,WAAW,UAAU,IAGhC,KAAK,WACF,KAAA,QAAQ,MAAM/B,GAAQwB,CAAK,GAG7BO,MACH,KAAK,YAAY,IAEjB,sBAAsB,MAAM;AACrB,WAAA,QAAQ,WAAW,SAAS;AAAA,IAAA,CAClC;AAAA,EACH;AAAA,EAGF,QAAQN,IAAqB,IAAO;AAC7B,SAAA,QAAQ,WAAW,YAAY,GAEhC,KAAK,WAEF,KAAA,QAAQ,QAAQA,CAAkB,GAGzC,KAAK,YAAY,IAEZ,KAAA,QAAQ,WAAW,WAAW;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgB7B,cAAc;AACd,UAAA,EAAE,SAAAxB,MAAY;AAEhB,QAAAI;AACA,QAAA;AACF,MAAAA,IAAS,KAAK,GAAG,KAAKJ,GAAS,KAAK,OAAOA,CAAO;AAAA,aAC3CK,GAAO;AACd,YAAIA,aAAiB,SACd,KAAA,QAAQ,MAAMA,CAAK,GAEpBA;AAAA,IAAA;AAGR,QAAID,MAAW,KAEf,KAAWA,aAAkB;AACtB,WAAA,UAAU2B,EAAOC,EAAE,SAAS,EAAE,OAAO5B,EAAQ,CAAA,GAAG,KAAK,OAAO;AAAA,aACxDE,EAAWF,CAAM;AACrB,WAAA,UAAU2B,EAAOC,EAAE,YAAY,EAAE,QAAQ5B,EAAQ,CAAA,GAAG,KAAK,OAAO;AAAA,aAC5D6B,EAAS7B,CAAM,KAAK8B,EAAkBD,GAAU7B,CAAM;AAC/D,WAAK,UAAU2B,EAAO3B,GAAQ,KAAK,OAAO;AAAA,SACrC;AACL,YAAMC,IAAQ,IAAI;AAAA,QAChB,aACE,KAAK,GAAG,IACV,yEAAyEW,EAAOZ,CAAM,CAAC;AAAA,MACzF;AACK,WAAA,QAAQ,MAAMC,CAAK;AAAA,IAAA;AAAA,EAC1B;AAEJ;;AChIGe,IAAAD;AADI,MAAMgB,GAAiC;AAAA,EAc5C,YAAY5C,GAAyB;AAbrC,IAAAV,EAAA,MAACuC,GAAqB;AAEtB,IAAAvC,EAAA,iBAAU,SAAS,eAAe,EAAE;AAC5B,IAAAA,EAAA,kBAA4B,CAAC;AAC7B,IAAAA,EAAA;AAEA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAON,SAAK,SAASU,EAAQ,QACtB,KAAK,UAAUA,EAAQ;AAAA,EAAA;AAAA,EANzB,IAAI,YAAY;AACP,WAAA,KAAK,QAAQ,cAAc;AAAA,EAAA;AAAA,EAQpC,MAAMQ,GAAcwB,GAAc;AAC5B,IAAC,KAAK,cACRxB,EAAO,aAAa,KAAK,UAASwB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAEvD,KAAA,cAAcZ,EAAO,MAAM;AAC1B,UAAA;AACI,cAAAyB,IAAU,KAAK,OAAO;AAExB,YAAA,CAACC,GAAaD,CAAO;AACvB,wBAAQ,MAAMA,CAAO,GACf,IAAI;AAAA,YACR,uDAAuDpB,EAAOoB,CAAO,CAAC,YAAYA,CAAO;AAAA,UAC3F;AAGF,QAAAnC,EAAK,MAAM;AACT,eAAK,OAAOqC,EAAQF,CAAO,IAAIA,IAAU,CAACA,CAAO,CAAC;AAAA,QAAA,CACnD;AAAA,eACM/B,GAAO;AACd,cAAMZ,IAAS,KAAK,QAAQ,SAA4BgC,CAAI,EAAE;AAC9D,QAAAhC,EAAO,MAAMY,CAAK,GAClBZ,EAAO,MAAMY,CAAc;AAAA,MAAA;AAAA,IAC7B,CACD;AAAA,EACH;AAAA,EAGF,QAAQmB,IAAqB,IAAO;;AAClC,KAAAJ,IAAA,KAAK,gBAAL,QAAAA,EAAA,YAEI,KAAK,cACP,KAAK,QAAQI,CAAkB,IAC/Be,IAAA,KAAK,QAAQ,eAAb,QAAAA,EAAyB,YAAY,KAAK;AAAA,EAC5C;AAAA,EAGF,QAAQf,GAA6B;AACxB,eAAAgB,KAAW,KAAK;AACzB,MAAAA,EAAQ,QAAQhB,CAAkB;AAEpC,SAAK,WAAW,CAAC;AAAA,EAAA;AAAA,EAGnB,OAAOI,GAAwB;;AAG7B,QAFA,KAAK,QAAQ,EAAK,GAEdA,KAAY,QAAQA,EAAS,WAAW,KAAK,CAAC,KAAK;AACrD;AAGF,UAAMa,IAA+Bb,EAAS,QAAQ,CAACc,MACjDC,GAAgBD,CAAC,IACZA,IAEAE,EAAiB,KAAK,SAASC,EAASH,CAAC,CAAC,CAEpD;AAID,eAAWF,KAAWC,GAAa;AACjC,YAAMK,MAAW1B,IAAA,KAAK,SAAS,GAAG,EAAE,MAAnB,gBAAAA,EAAsB,YAAW,KAAK;AACvD,MAAAoB,EAAQ,MAAM,KAAK,QAAQ,YAAaM,CAAQ,GAC3C,KAAA,SAAS,KAAKN,CAAO;AAAA,IAAA;AAItB,UAAAzC,IAAS,KAAK,QAAQ,YACtBgD,MAAuBC,KAAAT,IAAA,KAAK,SAAS,GAAG,EAAE,MAAnB,gBAAAA,EAAsB,YAAtB,gBAAAS,EAA+B,gBAAe;AAC3E,IAAI,gBAAgBjD,IACjBA,EAAO,WAAmB,KAAK,SAASgD,CAAoB,IAEtDhD,EAAA,aAAa,KAAK,SAASgD,CAAoB;AAAA,EACxD;AAEJ;;ACxGG3B,IAAAD;AADI,MAAM8B,GAAkC;AAAA,EAW7C,YAAYC,GAAsC;AAVlD,IAAArE,EAAA,MAACuC,GAAqB;AAEtB,IAAAvC,EAAA,iBAAU,SAAS,eAAe,EAAE;AACpC,IAAAA,EAAA,mBAAY;AAEJ,IAAAA,EAAA;AACA,IAAAA,EAAA,kBAA4B,CAAC;AAE7B,IAAAA,EAAA;AAGN,SAAK,SAASqE;AAAA,EAAA;AAAA,EAGhB,MAAMnD,GAAcwB,GAA0B;AACxC,IAAC,KAAK,cACR,KAAK,YAAY,IAEjBxB,EAAO,aAAa,KAAK,UAASwB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAExDjB,EAAW,KAAK,MAAM,IACnB,KAAA,cAAcK,EAAO,MAAM;AACxB,YAAAG,IAAQnB,EAAI,KAAK,MAAM;AAC7B,MAAAM,EAAK,MAAM;AACT,aAAK,OAAOa,CAAK;AAAA,MAAA,CAClB;AAAA,IAAA,CACF,IAEI,KAAA,OAAO,KAAK,QAAQ;AAAA,EAE7B;AAAA,EAGF,QAAQU,IAAqB,IAAO;AAClC,IAAI,KAAK,gBACP,KAAK,YAAY,GACjB,KAAK,cAAc,SAGjB,KAAK,cACP,KAAK,QAAQA,CAAkB,GAC/B,KAAK,YAAY;AAAA,EACnB;AAAA,EAGM,QAAQA,GAA6B;AAChC,eAAAgB,KAAW,KAAK;AACzB,MAAAA,EAAQ,QAAQhB,CAAkB;AAEpC,SAAK,WAAW,CAAC;AAAA,EAAA;AAAA,EAGX,OAAOiB,GAA8B;;AAGvC,QAFJ,KAAK,QAAQ,EAAK,GAEdA,EAAY,SAAS,GAAG;AAC1B,eAAS,IAAI,GAAG,IAAIA,EAAY,QAAQ,KAAK;AACrC,cAAAD,IAAUC,EAAY,CAAC,GACvBK,IAAW,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI;AAChD,QAAAN,EAAQ,MAAM,KAAK,QAAQ,eAAgBM,KAAA,gBAAAA,EAAU,OAAO,GACvD,KAAA,SAAS,KAAKN,CAAO;AAAA,MAAA;AAGvB,OAAAD,IAAA,KAAA,QAAQ,eAAR,QAAAA,EAAoB,aAAa,KAAK,WAASnB,IAAA,KAAK,SAAS,GAAG,EAAE,MAAnB,gBAAAA,EAAsB,YAAW;AAAA,IAAI;AAAA,EAC3F;AAEJ;ACjEA,MAAM+B,KAAuB,CAACtD,MAAgB,WAAW,KAAKA,CAAG,GAI3DuD,IAAS,OAAO,YAAY;;AAW/BhC,IAAAD;AADI,MAAMkC,GAA8B;AAAA,EAuBzC,YAAY,EAAE,KAAAC,GAAK,OAAA3B,GAAO,UAAAC,GAAU,SAAA5B,KAAwB;AAtB5D,IAAAnB,EAAA,MAACuC,GAAqB;AAEtB,IAAAvC,EAAA;AACA,IAAAA,EAAA;AAEQ,IAAAA,EAAA;AACA,IAAAA,EAAA,qBAAwB,CAAC;AACzB,IAAAA,EAAA,kBAA4B,CAAC;AAC7B,IAAAA,EAAA,uBAAiC,CAAC;AAElC,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA;AAGA;AAAA,IAAAA,EAAA,sBAAe;AAOrB,SAAK,UAAUoC,EAAQ,QAAQjB,GAASsD,CAAG,GAGvCA,EAAI,YAAY,MAAM,SACnB,KAAA,QAAQ,SAASF,GAAQ,EAAI;AAGpC,UAAMG,IAAO,KAAK,QAAQ,SAAgC9B,CAAI;AAc9D,QAbA,KAAK,SAAS8B,EAAK,SAGf,KAAK,QAAQ,SAASH,GAAQ,EAAK,IACrC,KAAK,UAAU,SAAS,gBAAgB,8BAA8BE,CAAG,IAEpE,KAAA,UAAU,SAAS,cAAcA,CAAG,GAGvCE,GAAa,MAAA,iBAAiBvD,EAAKsD,EAAK,KAAK,MAC/C,KAAK,QAAQ,QAAQ,OAAOtD,EAAKsD,EAAK,KAAK,IAGzC5B,EAAM;AACJ,UAAArB,EAAWqB,EAAM,GAAG;AACtB,aAAK,MAAMA,EAAM,KACZ,KAAA,IAAI,KAAK,OAAO;AAAA;AAErB,cAAM,IAAI,MAAM,yCAAyCA,EAAM,GAAG;AAItE,QAAIA,EAAM,OAAO;AACT,YAAA8B,IAASnB,EAAQX,EAAM,KAAK,IAAIA,EAAM,QAAQ,CAACA,EAAM,KAAK;AAChE,iBAAWlB,KAAMgD;AACf,QAAAhD;AAAA,UACE,KAAK;AAAA,UACLQ,EAAQ,QAAQ,KAAK,SAAS,MAAMyC,GAAc,IAAI,GAAG;AAAA,YACvD,uBAAuB;AAAA,YACvB,QAAQ,EAAE,SAASjD,EAAG,SAAS,UAAU,SAAY,SAAS,KAAKA,EAAG,KAAK;AAAA,UAC5E,CAAA;AAAA,QACH;AAAA,IACF;AAGF,SAAK,QAAQ;AAAA,MACX,GAAGkD,GAAK,CAAC,OAAO,SAAS,aAAa,OAAO,GAAGhC,CAAK;AAAA,MACrD,OAAOA,EAAM,aAAaA,EAAM;AAAA,IAClC,GAEIC,MACG,KAAA,cAAciB,EAASjB,CAAQ;AAAA,EACtC;AAAA,EAvDF,IAAI,YAAY;AACP,WAAA,KAAK,QAAQ,cAAc;AAAA,EAAA;AAAA,EAyDpC,MAAM7B,GAAcwB,GAAc;AAChC,QAAIxB,KAAU;AACZ,YAAM,IAAI,MAAM,iFAAiFA,CAAM,EAAE;AAG3G,UAAM6D,IAAa,KAAK;AAExB,QAAI,CAACA,GAAY;AACV,WAAA,QAAQ,WAAW,UAAU,GAE9B,KAAK,YAAY,SAAS,MAC5B,KAAK,WAAWhB,EAAiB,KAAK,SAAS,KAAK,WAAW;AAGjE,eAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AACvC,cAAAiB,IAAQ,KAAK,SAAS,CAAC,GACvBf,IAAW,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,UAAU;AAClD,QAAAe,EAAA,MAAM,KAAK,SAASf,CAAQ;AAAA,MAAA;AAGpC,WAAK,WAAW,KAAK,SAAS,KAAK,KAAK,GACpC,KAAK,MAAM,SAAY,KAAA,YAAY,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,aAAa,GACrF,KAAK,MAAM,SAAY,KAAA,aAAa,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,aAAa;AAAA,IAAA;AAG5F,IAAA/C,EAAO,aAAa,KAAK,UAASwB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAE5D,eAAe,MAAM;AACnB,WAAK,eAAe,IAEfqC,KAAiB,KAAA,QAAQ,WAAW,SAAS;AAAA,IAAA,CACnD;AAAA,EAAA;AAAA,EAGH,QAAQpC,IAAqB,IAAO;;AAClC,QAAI,KAAK,WAAW;AACb,WAAA,QAAQ,WAAW,YAAY,GAE/BA,MACHJ,IAAA,KAAK,QAAQ,eAAb,QAAAA,EAAyB,YAAY,KAAK;AAGjC,iBAAAyC,KAAS,KAAK;AACvB,QAAAA,EAAM,QAAQ,EAAI;AAGpB,WAAK,eAAe;AAET,iBAAAnD,KAAe,KAAK;AACjB,QAAAA,EAAA;AAEd,WAAK,cAAc,SAAS,GAExB,KAAK,OACP,KAAK,IAAI,MAAS,GAGf,KAAA,QAAQ,WAAW,WAAW;AAAA,IAAA;AAAA,EACrC;AAAA,EAGM,WAAcI,GAAuBN,GAA8B;AACrE,IAAAF,EAAWQ,CAAK,IAClB,KAAK,cAAc;AAAA,MACjBH,EAAO,MAAM;AACP,YAAA;AACF,UAAAH,EAAUM,GAAqB;AAAA,iBACxBT,GAAO;AACT,eAAA,OAAO,MAAMA,CAAK,GAClB,KAAA,OAAO,MAAMA,CAAc;AAAA,QAAA;AAAA,MAEnC,CAAA;AAAA,IACH,IAEAG,EAASM,CAAK;AAAA,EAChB;AAAA,EAGM,WAAW0B,GAAmCb,GAAgC;AACpF,eAAW9B,KAAO8B,GAAO;AACjB,YAAAb,IAAQa,EAAM9B,CAAG;AAIvB,UAAIA,MAAQ,qBAAqBA,MAAQ,oBAAoBA,MAAQ,kBAAkB;AAC/E,cAAAZ,IAAW,CAAC6E,MAAa;AAC7B,UAAI,KAAK,gBAAgB,CAACtB,EAAQ,SAASsB,EAAE,MAAa,KACvDhD,EAA6BgD,CAAC;AAAA,QAEnC,GAEMvE,IAAU,EAAE,SAAS,GAAK;AAEzB,eAAA,iBAAiB,SAASN,GAAUM,CAAO,GAE7C,KAAA,cAAc,KAAK,MAAM;AACrB,iBAAA,oBAAoB,SAASN,GAAUM,CAAO;AAAA,QAAA,CACtD;AAAA,iBACQe,EAAWQ,CAAK,KAAKqC,GAAqBtD,CAAG,GAAG;AACzD,cAAMkE,IAAYlE,EAAI,MAAM,CAAC,EAAE,YAAY,GAErCZ,IAA+B6B;AAE7B,QAAA0B,EAAA,iBAAiBuB,GAAW9E,CAAQ,GAEvC,KAAA,cAAc,KAAK,MAAM;AACpB,UAAAuD,EAAA,oBAAoBuB,GAAW9E,CAAQ;AAAA,QAAA,CAChD;AAAA,MAAA,WACQqB,EAAWQ,CAAK,KAAKkD,GAAW,SAASnE,CAAG,GAAG;AAClD,cAAAoE,IAAOpE,EAAI,UAAU,CAAC;AACpB,QAAA2C,EAAA,iBAAiByB,GAAMnD,CAAsB,GAChD,KAAA,cAAc,KAAK,MAAM;AACpB,UAAA0B,EAAA,oBAAoByB,GAAMnD,CAAsB;AAAA,QAAA,CACzD;AAAA,MACQ,WAAAjB,EAAI,SAAS,GAAG;AAEpB,aAAA,WAAWiB,GAAO,CAACoD,MAAY;AAClC,UAAIA,KAAW,OACb1B,EAAQ,gBAAgB3C,CAAG,IAE3B2C,EAAQ,aAAa3C,GAAK,OAAOqE,CAAO,CAAC;AAAA,QAC3C,CACD;AAAA,eACQ,CAACC,GAAa,SAAStE,CAAG;AACnC,YAAI,KAAK,QAAQ,SAASuD,GAAQ,EAAK;AAChC,eAAA,WAAWtC,GAAO,CAACoD,MAAY;AAClC,YAAIA,KAAW,OACb1B,EAAQ,aAAa3C,GAAK,OAAO8B,EAAM9B,CAAG,CAAC,CAAC,IAE5C2C,EAAQ,gBAAgB3C,CAAG;AAAA,UAC7B,CACD;AAAA;AAED,kBAAQA,GAAK;AAAA,YACX,KAAK;AAAA,YACL,KAAK;AACE,mBAAA,WAAWiB,GAAO,CAACoD,MAAY;AACjC,gBAAA1B,EAAgB3C,CAAG,IAAI,OAAOqE,CAAO;AAAA,cAAA,CACvC;AACD;AAAA,YAEF,KAAK;AACE,mBAAA,WAAWpD,GAAO,CAACoD,MAAY;AACjC,gBAAA1B,EAAgB,UAAU0B;AAAA,cAAA,CAC5B;AACD;AAAA,YAEF,KAAK;AACE,mBAAA,WAAWpD,GAAO,CAACoD,MAAY;AAClC,gBAAIA,KAAW,OACZ1B,EAAgB,gBAAgB3C,CAAG,IAEnC2C,EAAgB,aAAa3C,GAAK,OAAOqE,CAAO,CAAC;AAAA,cACpD,CACD;AAAA,YAEH,KAAK;AACE,mBAAA,WAAWpD,GAAO,CAACoD,MAAY;AACjC,gBAAA1B,EAAgB,UAAU0B,GAGvBA,IACM1B,EAAA,aAAa,WAAW,EAAE,IAElCA,EAAQ,gBAAgB,SAAS;AAAA,cACnC,CACD;AACD;AAAA,YAEF,KAAK;AAAA,YACL,KAAK;AACE,mBAAA,WAAW1B,GAAO,CAACoD,MAAY;AAC9B,gBAAA,OAAOA,KAAY,WACpB1B,EAAgB3C,CAAG,IAAIqE,IACfA,IACR1B,EAAgB3C,CAAG,IAAI,OAEvB2C,EAAgB3C,CAAG,IAAI;AAAA,cAC1B,CACD;AACD;AAAA,YAEF,SAAS;AACH,kBAAAA,EAAI,WAAW,OAAO,GAAG;AACrB,sBAAAoE,IAAOpE,EAAI,UAAU,CAAC;AACvB,qBAAA,WAAWiB,GAAO,CAACoD,MAAY;AACjC,kBAAA1B,EAAgByB,CAAI,IAAIC;AAAA,gBAAA,CAC1B;AAAA,cACQ,WAAArE,EAAI,WAAW,KAAK,GAAG;AAC1B,sBAAAoE,IAAOpE,EAAI,UAAU,CAAC;AACxB,oBAAAuE;AACA,gBAAA9D,EAAWQ,CAAK,KACV0B,EAAA,iBAAiByB,GAAMnD,CAAsB,GAChD,KAAA,cAAc,KAAK,MAAM;AACpB,kBAAA0B,EAAA,oBAAoByB,GAAMnD,CAAsB;AAAA,gBAAA,CACzD,KAEI,KAAA,WAAWA,GAAqC,CAACoD,MAAY;AAC5D,kBAAA,CAACA,KAAWE,IACN5B,EAAA,oBAAoByB,GAAMG,CAAK,IAC9BF,KAAW,SAChBE,KAASA,MAAUF,KACb1B,EAAA,oBAAoByB,GAAMG,CAAK,GAEjC5B,EAAA,iBAAiByB,GAAMC,CAAO,IAEhCE,IAAAF;AAAA,gBAAA,CACT;AAAA,cAEM,WAAArE,EAAI,WAAW,OAAO,GAAG;AAClC,sBAAMoE,IAAOpE,EAAI,UAAU,CAAC,EAAE,YAAY;AACrC,qBAAA,WAAWiB,GAAO,CAACoD,MAAY;AAClC,kBAAIA,KAAW,OACb1B,EAAQ,aAAayB,GAAM,OAAOC,CAAO,CAAC,IAE1C1B,EAAQ,gBAAgByB,CAAI;AAAA,gBAC9B,CACD;AAAA,cAAA;AAEI,qBAAA,WAAWnD,GAAO,CAACoD,MAAY;AACjC,kBAAA1B,EAAgB3C,CAAG,IAAIqE;AAAA,gBAAA,CACzB;AAGH;AAAA,YAAA;AAAA,UACF;AAAA,IAGN;AAAA,EACF;AAAA,EAGM,YAAY1B,GAAmC6B,GAAiBC,GAAgC;AACtG,UAAMC,IAAqC,CAAC;AAExC,QAAAjE,EAAW+D,CAAM,GAAG;AAClB,UAAAG;AAEE,YAAA9D,IAAcC,EAAO,MAAM;AAC3B,QAAAL,EAAWkE,CAAO,KACZA,EAAA,GAEVhC,EAAQ,MAAM,UAAU,IACxBgC,IAAU,KAAK,YAAYhC,GAAS7C,EAAI0E,CAAM,GAAGC,CAAa;AAAA,MAAA,CAC/D;AAED,MAAAA,EAAc,KAAK5D,CAAW,GAC9B6D,EAAkB,KAAK7D,CAAW;AAAA,IAAA,OAC7B;AACC,YAAA+D,IAASC,GAAYL,CAAM;AAEjC,iBAAW/E,KAAQmF,GAAQ;AACzB,cAAM,EAAE,OAAA3D,GAAO,UAAA6D,MAAaF,EAAOnF,CAAI;AAEnC,YAAAgB,EAAWQ,CAAK,GAAG;AACf,gBAAAJ,IAAcC,EAAO,MAAM;AAC3B,YAAAhB,EAAImB,CAAK,IACH0B,EAAA,MAAM,YAAYlD,GAAM,OAAOK,EAAImB,CAAK,CAAC,GAAG6D,CAAQ,IAEpDnC,EAAA,MAAM,eAAelD,CAAI;AAAA,UACnC,CACD;AAED,UAAAgF,EAAc,KAAK5D,CAAW,GAC9B6D,EAAkB,KAAK7D,CAAW;AAAA,QAAA,MACpC,CAAWI,KAAS,QAClB0B,EAAQ,MAAM,YAAYlD,GAAM,OAAOwB,CAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAGF,WAAO,WAAmB;AACxB,iBAAWJ,KAAe6D;AACZ,QAAA7D,EAAA,GACZ4D,EAAc,OAAOA,EAAc,QAAQ5D,CAAW,GAAG,CAAC;AAAA,IAE9D;AAAA,EAAA;AAAA,EAGM,aAAa8B,GAAmCoC,GAAkBN,GAAgC;AACxG,UAAMO,IAAsC,CAAC;AAEzC,QAAAvE,EAAWsE,CAAO,GAAG;AACnB,UAAAJ;AAEE,YAAA9D,IAAcC,EAAO,MAAM;AAC3B,QAAAL,EAAWkE,CAAO,KACZA,EAAA,GAEVhC,EAAQ,gBAAgB,OAAO,GAC/BgC,IAAU,KAAK,aAAahC,GAAS7C,EAAIiF,CAAO,GAAGN,CAAa;AAAA,MAAA,CACjE;AAED,MAAAA,EAAc,KAAK5D,CAAW,GAC9BmE,EAAmB,KAAKnE,CAAW;AAAA,IAAA,OAC9B;AACC,YAAA+D,IAASK,GAAYF,CAAO;AAElC,iBAAWtF,KAAQmF,GAAQ;AACnB,cAAA3D,IAAQ2D,EAAOnF,CAAI;AAErB,YAAAgB,EAAWQ,CAAK,GAAG;AACf,gBAAAJ,IAAcC,EAAO,MAAM;AAC3B,YAAAhB,EAAImB,CAAK,IACH0B,EAAA,UAAU,IAAIlD,CAAI,IAElBkD,EAAA,UAAU,OAAOlD,CAAI;AAAA,UAC/B,CACD;AAED,UAAAgF,EAAc,KAAK5D,CAAW,GAC9BmE,EAAmB,KAAKnE,CAAW;AAAA,eAC1BI,KACD0B,EAAA,UAAU,IAAIlD,CAAI;AAAA,MAC5B;AAAA,IACF;AAGF,WAAO,WAAmB;AACxB,iBAAWoB,KAAemE;AACZ,QAAAnE,EAAA,GACZ4D,EAAc,OAAOA,EAAc,QAAQ5D,CAAW,GAAG,CAAC;AAAA,IAE9D;AAAA,EAAA;AAEJ;AAKA,SAASoE,GAAYF,GAAkB;AACrC,MAAIH,IAAkC,CAAC;AAEnC,MAAAM,EAASH,CAAO,GAAG;AAEf,UAAAI,IAAQJ,EAAQ,MAAM,GAAG;AAC/B,eAAWtF,KAAQ0F;AACjB,MAAAP,EAAOnF,CAAI,IAAI;AAAA,EACjB,MACF,CAAW2F,EAASL,CAAO,IAClB,OAAA,OAAOH,GAAQG,CAAO,IACpB,MAAM,QAAQA,CAAO,KACxB,MAAA,KAAKA,CAAO,EACf,OAAO,OAAO,EACd,QAAQ,CAACM,MAAS;AACjB,WAAO,OAAOT,GAAQK,GAAYI,CAAI,CAAC;AAAA,EAAA,CACxC;AAIL,gBAAOT,EAAO,WAEPA;AACT;AAKA,SAASC,GAAYL,GAAiB;AACpC,MAAII,IAAgE,CAAC;AAEjE,MAAAM,EAASV,CAAM,GAAG;AACd,UAAAc,IAAQd,EAAO,MAAM,GAAG,EAAE,OAAO,CAACe,MAASA,EAAK,KAAK,MAAM,EAAE;AACnE,eAAWA,KAAQD,GAAO;AACxB,YAAM,CAACtF,GAAKwF,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,GAE5BZ,EAAOc,EAAa1F,EAAI,KAAM,CAAA,CAAC,IAAIyF;AAAA,IAAA;AAAA,EACrC;AAEE,MAAAL,EAASZ,CAAM;AACjB,eAAWxE,KAAOwE;AACZ,MAAAxE,EAAI,WAAW,IAAI,IAErB4E,EAAO5E,CAAG,IAAI,EAAE,OAAOwE,EAAOxE,CAAG,EAAE,IAE5B4E,EAAAc,EAAa1F,CAAG,CAAC,IAAI,EAAE,OAAOwE,EAAOxE,CAAG,EAAE;AAAA,MAG5C,CAAA,MAAM,QAAQwE,CAAM,KACvB,MAAA,KAAKA,CAAM,EACd,OAAO,CAACa,MAASA,KAAQ,IAAI,EAC7B,QAAQ,CAACA,MAAS;AACjB,WAAO,OAAOT,GAAQC,GAAYQ,CAAI,CAAC;AAAA,EAAA,CACxC;AAGE,SAAAT;AACT;AAKO,SAASc,EAAazE,GAAuB;AAC3C,SAAAA,EAAM,QAAQ,0BAA0B,CAACe,GAAG2D,OAASA,IAAM,MAAM,MAAM3D,EAAE,YAAA,CAAa;AAC/F;AAGA,MAAMsC,KAAe,CAAC,OAAO,YAAY,SAAS,SAAS,QAAQ,OAAO,GAEpEH,KAAa,CAAC,YAAY,WAAW,iBAAiB;AAE5D,SAASN,GAAc+B,GAAY;AACjC,MAAInG,IAAOmG,EAAK,QAAQ,QAAQ,YAAY;AAI5C,MAHIA,EAAK,QAAQ,OACPnG,KAAA,IAAImG,EAAK,QAAQ,EAAE,KAEzBA,EAAK,QAAQ,UAAU,SAAS;AAClC,eAAWC,KAAaD,EAAK,QAAQ,UAAU;AAC7C,MAAAnG,KAAQ,IAAIoG,CAAS;AAGlB,SAAApG;AACT;;ACjgBG8B,IAAAD;AADI,MAAMwE,GAAgC;AAAA,EAW3C,YAAYC,GAA0C;AAVtD,IAAA/G,EAAA,MAACuC,GAAqB;AAEtB,IAAAvC,EAAA,iBAAU,SAAS,eAAe,EAAE;AACpC,IAAAA,EAAA,mBAAY;AAEJ,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA,IAAAA,EAAA;AAGN,SAAK,QAAQ+G;AAAA,EAAA;AAAA,EAGf,MAAM7F,GAAcwB,GAA0B;AACxC,IAAC,KAAK,cACR,KAAK,YAAY,IAEjBxB,EAAO,aAAa,KAAK,UAASwB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAEvD,KAAA,cAAcZ,EAAO,MAAM;AACxB,YAAA6B,IAAU,KAAK,MAAM;AAC3B,MAAAvC,EAAK,MAAM;AACT,aAAK,OAAOuC,CAAO;AAAA,MAAA,CACpB;AAAA,IAAA,CACF;AAAA,EACH;AAAA,EAGF,QAAQhB,IAAqB,IAAO;AAClC,IAAI,KAAK,gBACP,KAAK,YAAY,GACjB,KAAK,cAAc,SAGjB,KAAK,cACP,KAAK,QAAQA,CAAkB,GAC/B,KAAK,YAAY;AAAA,EACnB;AAAA,EAGM,QAAQA,GAA6B;AAC3C,IAAI,KAAK,WACF,KAAA,QAAQ,QAAQA,CAAkB,GAEzC,KAAK,UAAU;AAAA,EAAA;AAAA,EAGT,OAAOgB,GAAyB;AACtC,SAAK,QAAQ,EAAK,GAEdA,MACFA,EAAQ,MAAM,KAAK,QAAQ,eAAgB,KAAK,OAAO,GACvD,KAAK,UAAUA;AAAA,EACjB;AAEJ;;ACjDGpB,IAAAD;AADI,MAAM0E,GAAgC;AAAA,EAa3C,YAAYC,GAAsB;AAZlC,IAAAjH,EAAA,MAACuC,GAAqB;AAEd,IAAAvC,EAAA;AACA,IAAAA,EAAA;AAUN,SAAK,SAASiH;AAAA,EAAA;AAAA,EARhB,IAAI,YAAY;AACV,WAAC,KAAK,UAGH,KAAK,QAAQ,YAFX;AAAA,EAEW;AAAA,EAOtB,MAAMC,GAAeC,GAAe;AAClC,UAAM,EAAE,SAAA5D,GAAS,QAAArC,EAAO,IAAI,KAAK;AAE7B,IAAA4C,GAAgBP,CAAO,IACzB,KAAK,UAAUA,IAEV,KAAA,UAAU6D,GAAcrD,EAAiB,KAAK,OAAO,SAASC,EAAST,CAAO,CAAC,CAAC,GAGlF,KAAA,QAAQ,MAAMrC,CAAM;AAAA,EAAA;AAAA,EAG3B,QAAQyB,IAAqB,IAAO;;AAC9B,KAAAJ,IAAA,KAAK,YAAL,QAAAA,EAAc,aAEX,KAAA,QAAQ,QAAQ,EAAK;AAAA,EAC5B;AAEJ;;ACvBGA,IAAAD;AADI,MAAM+E,GAAmC;AAAA,EAe9C,YAAY,EAAE,SAAAlG,GAAS,OAAAmG,GAAO,UAAAC,GAAU,OAAAC,KAA2B;AAdnE,IAAAxH,EAAA,MAACuC,GAAqB;AAEtB,IAAAvC,EAAA,iBAAU,SAAS,eAAe,EAAE;AAC5B,IAAAA,EAAA;AACA,IAAAA,EAAA,qBAAoC;AACpC,IAAAA,EAAA,wBAAqC,CAAC;AACtC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAON,SAAK,UAAUmB,GAEf,KAAK,QAAQmG,GACb,KAAK,WAAWC,GAChB,KAAK,QAAQC;AAAA,EAAA;AAAA,EATf,IAAI,YAAY;AACP,WAAA,KAAK,QAAQ,cAAc;AAAA,EAAA;AAAA,EAWpC,MAAMtG,GAAcwB,GAAc;AAC5B,IAAC,KAAK,cACRxB,EAAO,aAAa,KAAK,UAASwB,KAAA,gBAAAA,EAAO,gBAAe,IAAI,GAEvD,KAAA,cAAcZ,EAAO,MAAM;AAC1B,UAAAG,IAAQ,KAAK,MAAM;AAEvB,MAAIA,KAAS,SACXA,IAAQ,CAAC,GACD,QAAA,IAAI,+BAA+BA,GAAO,IAAI,IAGxDb,EAAK,MAAM;AACT,aAAK,QAAQ,MAAM,KAAKa,CAAK,CAAC;AAAA,MAAA,CAC/B;AAAA,IAAA,CACF;AAAA,EACH;AAAA,EAGF,QAAQU,IAAqB,IAAO;;AAClC,IAAI,KAAK,gBACP,KAAK,YAAY,GACjB,KAAK,cAAc,OAGjB,CAACA,KAAsB,KAAK,eAC9BJ,IAAA,KAAK,QAAQ,eAAb,QAAAA,EAAyB,YAAY,KAAK,WAG5C,KAAK,SAASI,CAAkB;AAAA,EAAA;AAAA,EAG1B,SAASA,GAA6B;AACjC,eAAA0D,KAAQ,KAAK;AACjB,MAAAA,EAAA,QAAQ,QAAQ1D,CAAkB;AAEzC,SAAK,iBAAiB,CAAC;AAAA,EAAA;AAAA,EAGjB,QAAQV,GAAY;;AAC1B,QAAIA,EAAM,WAAW,KAAK,CAAC,KAAK;AACvB,aAAA,KAAK,SAAS,EAAK;AAK5B,UAAMwF,IAA+B,CAAC;AACtC,QAAIC,IAAQ;AAEZ,eAAWrB,KAAQpE;AACjB,MAAAwF,EAAe,KAAK;AAAA,QAClB,KAAK,KAAK,MAAMpB,GAAMqB,CAAK;AAAA,QAC3B,OAAOrB;AAAA,QACP,OAAOqB;AAAA,MAAA,CACR;AAGH,UAAMC,IAA+B,CAAC;AAG3B,eAAAC,KAAa,KAAK;AAG3B,MAFsBH,EAAe,KAAK,CAACI,MAAMA,EAAE,QAAQD,EAAU,GAAG,KAG5DA,EAAA,QAAQ,QAAQ,EAAK;AAKnC,eAAWE,KAAaL,GAAgB;AAChC,YAAAG,IAAY,KAAK,eAAe,KAAK,CAACvB,MAASA,EAAK,QAAQyB,EAAU,GAAG;AAE/E,UAAIF;AACQ,QAAAA,EAAA,KAAKE,EAAU,KAAK,GACpBF,EAAA,MAAME,EAAU,KAAK,GACtBH,EAAAG,EAAU,KAAK,IAAIF;AAAA,WACvB;AAEL,cAAMvB,IAAOrD,EAAE8E,EAAU,OAAO,EAAE,QAAQC,IAAW,GAC/CL,IAAQ1E,EAAE8E,EAAU,KAAK;AAEtB,QAAAH,EAAAG,EAAU,KAAK,IAAI;AAAA,UAC1B,KAAKA,EAAU;AAAA,UACf,MAAAzB;AAAA,UACA,OAAAqB;AAAAA,UACA,SAAS,IAAI7E,EAAa,KAAK,SAASmF,IAAgB;AAAA,YACtD,MAAM,MAAM3B,EAAK;AAAA,YACjB,OAAO,MAAMqB,EAAM;AAAA,YACnB,UAAU,KAAK;AAAA,UAChB,CAAA;AAAA,QACH;AAAA,MAAA;AAAA,IACF;AAKF,aAASO,IAAI,GAAGA,IAAIN,EAAS,QAAQM,KAAK;AAClC,YAAA5B,IAAOsB,EAASM,CAAC,GACjBhE,MAAW1B,IAAAoF,EAASM,IAAI,CAAC,MAAd,gBAAA1F,EAAiB,QAAQ,YAAW,KAAK;AAC1D,MAAA8D,EAAK,QAAQ,MAAM,KAAK,QAAQ,YAAapC,CAAQ;AAAA,IAAA;AAGvD,SAAK,iBAAiB0D;AAGtB,UAAMO,MAAWxE,IAAAiE,EAAS,GAAG,EAAE,MAAd,gBAAAjE,EAAiB,QAAQ,YAAW,KAAK;AAC1D,KAAAS,IAAA,KAAK,QAAQ,eAAb,QAAAA,EAAyB,aAAa,KAAK,SAAS+D,EAAS;AAAA,EAAW;AAE5E;AAQA,SAASF,GAAelF,GAAsB3B,GAAkB;AAC9D,SAAAA,EAAQ,QAAQ,aAAa,GACtB2B,EAAM,SAAS,KAAK3B,GAAS2B,EAAM,MAAMA,EAAM,OAAO3B,CAAO;AACtE;AC7GO,SAASiC,EAASnB,GAA6B;AACpD,SAAOA,aAAiBkG;AAC1B;AAEO,SAASrE,GAAgB7B,GAAoC;AAC3D,UAAAA,KAAA,gBAAAA,EAAQK,QAAuB;AACxC;AAEO,SAAS0B,EAASoE,GAAkD;AACrE,EAAC3E,EAAQ2E,CAAW,MACtBA,IAAc,CAACA,CAAW;AAG5B,QAAMC,IAAoB,CAAC;AAE3B,aAAWC,KAAKF;AACd,QAAI,EAAAE,KAAM,QAA2BA,MAAM,KAI3C;AAAA,UAAIA,aAAa,MAAM;AACrB,QAAAD,EAAQ,KAAKlF,EAAE,SAAS,EAAE,OAAOmF,EAAA,CAAG,CAAC;AACrC;AAAA,MAAA;AAGE,UAAAlF,EAASkF,CAAC,GAAG;AACf,QAAAD,EAAQ,KAAKC,CAAC;AACd;AAAA,MAAA;AAGE,UAAA7G,EAAW6G,CAAC,GAAG;AACjB,QAAAD,EAAQ,KAAKlF,EAAE,YAAY,EAAE,QAAQmF,EAAA,CAAG,CAAC;AACzC;AAAA,MAAA;AAGE,UAAA7E,EAAQ6E,CAAC,GAAG;AACd,QAAAD,EAAQ,KAAK,GAAGrE,EAASsE,CAAC,CAAC;AAC3B;AAAA,MAAA;AAIF,MAAAD,EAAQ,KAAKlF,EAAE,SAAS,EAAE,OAAOmF,EAAA,CAAG,CAAC;AAAA;AAGhC,SAAAD;AACT;AA+CgB,SAAAlF,EAAKoF,GAAwBzF,MAAcC,GAAiB;AAC1E,SAAO,IAAIoF,GAAMI,GAAMzF,GAAc,GAAGC,CAAQ;AAClD;AAEA,MAAMoF,GAAoD;AAAA,EAKxD,YAAYI,GAAwBzF,MAAcC,GAAwB;AAJ1E,IAAA/C,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGE,SAAK,OAAOuI,GACZ,KAAK,QAAQzF,GACb,KAAK,WAAWC;AAAA,EAAA;AAEpB;AASgB,SAAAyF,GAAKC,GAA6BC,GAA0BC,GAAkC;AAC5G,SAAOxF,EAAE,YAAoB;AAAA,IAC3B,QAAQH,EAAc,MAAM;AACpB,YAAAf,IAAQnB,EAAI2H,CAAS;AAE3B,aAAIxG,KAASyG,IACJA,IACE,CAACzG,KAAS0G,IACZA,IAEF;AAAA,IACR,CAAA;AAAA,EAAA,CACF;AACH;AAKgB,SAAAC,GAAOH,GAA6BC,GAA0BC,GAAkC;AACvG,SAAAH,GAAKC,GAAWE,GAAaD,CAAW;AACjD;AAMgB,SAAAG,GACdvB,GACAE,GACAD,GACQ;AACD,SAAApE,EAAE,WAAmB,EAAE,OAAO,MAAMrC,EAAIwG,CAAK,GAAG,OAAAE,GAAO,UAAAD,GAAU;AAC1E;AAKgB,SAAAuB,GAAO5H,GAAcqC,GAA6B;AAChE,SAAOJ,EAAE,WAAmB,EAAE,QAAAjC,GAAQ,SAAAqC,GAAS;AACjD;AAMO,SAASL,EAAOK,GAAqBpC,IAAU,IAAIiB,EAAQ,GAAG,GAAkB;AACrF,SAAOgF,GAAcrD,EAAiB5C,GAAS6C,EAAST,CAAO,CAAC,CAAC;AACnE;AAKgB,SAAAQ,EAAiB5C,GAAkB4H,GAA4C;AAGtF,UAFOtF,EAAQsF,CAAM,IAAIA,IAAS,CAACA,CAAM,GAEnC,IAAI,CAAC1C,MAAS;AACrB,QAAA5E,EAAW4E,EAAK,IAAI;AACf,aAAA,IAAIxD,EAAa1B,GAASkF,EAAK,MAAmBA,EAAK,OAAOA,EAAK,QAAQ;AACzE,QAAAH,EAASG,EAAK,IAAI;AAC3B,cAAQA,EAAK,MAAM;AAAA,QACjB,KAAK,SAAiB;AACpB,gBAAM2C,IAAQ3C,EAAK;AACZ,iBAAA,IAAI7D,EAAQwG,EAAM,KAAK;AAAA,QAAA;AAAA,QAEhC,KAAK,SAAiB;AACpB,gBAAMA,IAAQ3C,EAAK;AACZ,iBAAA,IAAI7D,EAAQ,SAAS,eAAe,OAAOwG,EAAM,KAAK,CAAC,CAAC;AAAA,QAAA;AAAA,QAEjE,KAAK,WAAmB;AACtB,gBAAMA,IAAQ3C,EAAK;AACnB,iBAAO,IAAIgB,GAAO;AAAA,YAChB,OAAO2B,EAAM;AAAA,YACb,OAAOA,EAAM;AAAA,YACb,UAAUA,EAAM;AAAA,YAChB,SAAA7H;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,KAAK,YAAoB;AACvB,gBAAM6H,IAAQ3C,EAAK;AACnB,iBAAO,IAAI/C,GAAQ;AAAA,YACjB,QAAQ0F,EAAM;AAAA,YACd,SAAA7H;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,KAAK,aAAqB;AACxB,gBAAM6H,IAAQ3C,EAAK;AACZ,iBAAA,IAAIjC,GAAS4E,EAAM,QAAQ;AAAA,QAAA;AAAA,QAEpC,KAAK,WAAmB;AACtB,gBAAMA,IAAQ3C,EAAK;AACZ,iBAAA,IAAIS,GAAOkC,EAAM,IAAI;AAAA,QAAA;AAAA,QAE9B,KAAK,WAAmB;AACtB,gBAAMA,IAAQ3C,EAAK;AACnB,iBAAO,IAAIW,GAAO;AAAA,YAChB,SAASgC,EAAM;AAAA,YACf,QAAQA,EAAM;AAAA,YACd,SAAA7H;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH;AAEE,iBAAO,IAAIqD,GAAK;AAAA,YACd,KAAK6B,EAAK;AAAA,YACV,OAAOA,EAAK,SAAS,CAAC;AAAA,YACtB,UAAUA,EAAK;AAAA,YACf,SAAAlF;AAAA,UAAA,CACD;AAAA,MAAA;AAAA;AAGL,YAAM,IAAI,UAAU,4CAA4CkF,EAAK,IAAI,EAAE;AAAA,EAC7E,CACD;AACH;AAKO,SAASe,GAAc6B,GAA0C;AAClE,SAAAA,EAAS,WAAW,IACfA,EAAS,CAAC,IAGZ,IAAI7E,GAAS6E,CAAQ;AAC9B;AAEO,SAASzF,GAAavB,GAAqC;AAE9D,SAAAA,KAAS,QACTA,MAAU,MACVR,EAAWQ,EAAM,QAAQ,KACzBR,EAAWQ,CAAK,KAChBiE,EAASjE,CAAK,KACdiH,GAASjH,CAAK,KACdmB,EAASnB,CAAK,KACdoB,EAAUG,IAAcvB,CAAK;AAEjC;"}
@@ -1,4 +1,7 @@
1
- import { type ViewElement, type ViewFunction } from "../core/nodes/view.js";
1
+ import { Context } from "../core/context.js";
2
+ import { MarkupElement } from "../core/markup.js";
3
+ import { ViewInstance, type View } from "../core/nodes/view.js";
4
+ import { Source } from "../core/signals.js";
2
5
  import type { Stringable } from "../types.js";
3
6
  export interface RouteMatchContext {
4
7
  path: string;
@@ -26,7 +29,7 @@ export interface Route {
26
29
  /**
27
30
  * View to display when this route is matched.
28
31
  */
29
- view?: ViewFunction<any>;
32
+ view?: View<any>;
30
33
  /**
31
34
  * Subroutes.
32
35
  */
@@ -48,7 +51,7 @@ export interface RouteConfig {
48
51
  }
49
52
  export interface RouteLayer {
50
53
  id: number;
51
- view: ViewFunction<{}>;
54
+ view: View<{}>;
52
55
  }
53
56
  /**
54
57
  * Object passed to redirect callbacks. Contains information useful for determining how to redirect.
@@ -96,7 +99,7 @@ export declare const UNMOUNT: unique symbol;
96
99
  export declare const ROOT_VIEW: unique symbol;
97
100
  export declare class Router {
98
101
  #private;
99
- [ROOT_VIEW]: ViewElement;
102
+ $slot: Source<ViewInstance<{}> | undefined>;
100
103
  /**
101
104
  * The currently matched route pattern, if any.
102
105
  */
@@ -110,11 +113,11 @@ export declare class Router {
110
113
  */
111
114
  readonly $params: import("../core/signals.js").Signal<Record<string, string>>;
112
115
  /**
113
- * The current query params. Changes to this object will be reflected in the URL.
116
+ * The current query params.
114
117
  */
115
118
  readonly $query: import("../core/signals.js").Signal<Record<string, string>>;
116
119
  constructor(options: RouterOptions);
117
- [MOUNT](parent: Element): Promise<void>;
120
+ [MOUNT](parent: Element, context: Context): Promise<MarkupElement>;
118
121
  [UNMOUNT](): Promise<void>;
119
122
  /**
120
123
  * Navigate backward. Pass a number of steps to hit the back button that many times.