{"version":3,"sources":["dom-utils.ts"],"sourcesContent":["import { Datex } from \"datex-core-legacy\"\nimport { defaultElementAttributes, elementEventHandlerAttributes, htmlElementAttributes, mathMLTags, svgElementAttributes, svgElementAttributesLowercase, svgTags } from \"../attributes.ts\";\n\nimport { IterableHandler } from \"datex-core-legacy/utils/iterable-handler.ts\";\nimport { DX_VALUE, DX_REPLACE, PointerProperty } from \"datex-core-legacy/datex_all.ts\";\nimport type { DOMContext } from \"../dom/DOMContext.ts\";\nimport { JSTransferableFunction } from \"datex-core-legacy/types/js-function.ts\";\nimport { client_type } from \"datex-core-legacy/utils/constants.ts\";\nimport { weakAction } from \"datex-core-legacy/utils/weak-action.ts\";\nimport { LazyPointer } from \"datex-core-legacy/runtime/lazy-pointer.ts\";\nimport { isolatedScope } from \"datex-core-legacy/utils/isolated-scope.ts\";\nimport { Time } from \"datex-core-legacy/types/time.ts\";\nexport const JSX_INSERT_STRING: unique symbol = Symbol(\"JSX_INSERT_STRING\");\n\n\nconst logger = new Datex.Logger(\"UIX\");\n\ntype appendableContentBase = Datex.RefOrValue<Element|DocumentFragment|string|number|bigint|boolean>|Promise<appendableContent>;\nexport type appendableContent = appendableContentBase|Promise<appendableContentBase>\n\n\n// deno-lint-ignore no-namespace\nexport namespace DOMUtils {\n    export type elWithUIXAttributes = Element & {\n        [DOMUtils.EVENT_LISTENERS]:Map<keyof HTMLElementEventMap, Set<[(...args:any)=>any, boolean]>>\n        [DOMUtils.ATTR_BINDINGS]:Map<string, Datex.ReactiveValue>,\n        [DOMUtils.ATTR_DX_VALUES]:Map<string, Datex.ReactiveValue>,\n        [DOMUtils.STYLE_DX_VALUES]:Map<string, Datex.ReactiveValue<string>>,\n        [DOMUtils.STYLE_WEAK_PROPS]:Map<string, boolean>,\n        [DOMUtils.CHILDREN_DX_VALUES]:Set<Datex.ReactiveValue>,        \n        [DOMUtils.DATEX_UPDATE_TYPE]?: string,\n        [DOMUtils.ATTR_SELECTED_BINDING]?: Datex.ReactiveValue\n    }\n}\n\ntype InputValidation = {\n    message: Datex.RefOrValue<string>,\n    enabled: boolean\n}\n\nexport class DOMUtils {\n\n    static readonly EVENT_LISTENERS: unique symbol = Symbol.for(\"DOMUtils.EVENT_LISTENERS\");\n    static readonly ATTR_BINDINGS: unique symbol = Symbol.for(\"DOMUtils.ATTR_BINDINGS\");\n    static readonly ATTR_DX_VALUES: unique symbol = Symbol.for(\"DOMUtils.ATTR_DX_VALUES\");\n    static readonly STYLE_DX_VALUES: unique symbol = Symbol.for(\"DOMUtils.STYLE_DX_VALUES\");\n    static readonly STYLE_WEAK_PROPS: unique symbol = Symbol.for(\"DOMUtils.STYLE_WEAK_PROPS\");\n    static readonly CHILDREN_DX_VALUES: unique symbol = Symbol.for(\"DOMUtils.CHILDREN_DX_VALUES\");\n    static readonly ATTR_SELECTED_BINDING: unique symbol = Symbol.for(\"DOMUtils.ATTR_SELECTED_BINDING\");\n\n    static readonly DATEX_UPDATE_TYPE: unique symbol = Symbol.for(\"DOMUtils.DATEX_UPDATE_TYPE\");\n    static readonly PLACEHOLDER_CONTENT: unique symbol = Symbol.for(\"DOMUtils.PLACEHOLDER_CONTENT\");\n\n    readonly svgNS = \"http://www.w3.org/2000/svg\"\n\treadonly mathMLNS = \"http://www.w3.org/1998/Math/MathML\"\n\t\n\tconstructor(public readonly context: DOMContext) {}\n    get document() {return this.context.document}\n\n\n    /**\n     * Global settings for input validation.\n     * Per default, input values bound to number references are validated.\n     * Input validation for specific types can be disabled by setting the 'enabled' property to false,\n     * and custom validation messages can be set.\n     */\n    public defaultInputValidation: Record<'number'|'bigint', InputValidation> = {\n        'number': {\n            message: \"Invalid number\",\n            enabled: true,\n        },\n        'bigint': {\n            message: \"Invalid integer\",\n            enabled: true,\n        }\n    }\n\n\tescapeHtml(str:string) {\n        if (typeof str != \"string\") return \"\";\n        return str.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replaceAll('\"', '&quot;').replaceAll(\"'\", '&#039;').replace('\\u0009', '&#9;')\n    }\n\n\n    createHTMLElement(html?:string, content?:Datex.RefOrValue<HTMLElement>|(Datex.RefOrValue<HTMLElement>)[]):HTMLElement {\n        if (html == undefined) html = \"<div></div>\";\n        const template = this.document.createElement('template');\n        html = html.trim();\n        template.innerHTML = html;\n        const element = <HTMLElement>template.content.firstChild;\n\n        if (content != undefined) {\n            // set html\n            if (Datex.ReactiveValue.collapseValue(content,true,true) instanceof this.context.HTMLElement) this.setElementHTML(element, <HTMLElement>content);\n            // set child nodes\n            if (content instanceof Array) {\n                for (const el of content){\n                    if (Datex.ReactiveValue.collapseValue(el,true,true) instanceof this.context.HTMLElement) element.append(Datex.ReactiveValue.collapseValue(el,true,true))\n                    else {\n                        const container = this.document.createElement(\"div\");\n                        this.setElementText(container, el);\n                        element.append(container);\n                    }\n                }\n            }\n            // set text\n            else this.setElementText(element, content);\n        }\n        return element;\n    }\n\n    // remember which values are currently synced with element content - for unobserve\n    private element_bound_html_values = new WeakMap<Element, Datex.Value>();\n    private element_bound_text_values = new WeakMap<Element, Datex.Value>();\n\n    private updateElementHTML = function (this:Element, html:Element|string){\n        if (html instanceof Element) {\n            this.innerHTML = '';\n            this.append(html)\n        } \n        else this.innerHTML = html ?? '';\n    }\n\n    private updateElementText = function (this:HTMLElement, text:unknown){\n        if (this instanceof Datex.ReactiveValue) console.warn(\"update text invalid\", this, text)\n        \n        if (text instanceof Datex.Markdown) {\n            this.innerHTML = (text.getHTML() as HTMLElement).children[0].innerHTML;\n        }\n        // @ts-ignore _use_markdown\n        else if (this._use_markdown && typeof text == \"string\") {\n            this.innerHTML = (new Datex.Markdown(text).getHTML() as HTMLElement).children[0].innerHTML;\n        }\n        else this.innerText = ((<any>text)?.toString()) ?? ''\n    }\n\n    setElementHTML<T extends Element>(element:T, html:Datex.RefOrValue<string|boolean|Element>):T {\n        // unobserve?\n        this.element_bound_html_values.get(element)?.unobserve(element);\n        this.element_bound_text_values.get(element)?.unobserve(element);\n\n        // none\n        if (html == undefined || html === false) element.innerHTML = '';\n\n        // DatexValue\n        if (html instanceof Datex.ReactiveValue) {\n            this.updateElementHTML.call(element, html.val);\n\n            // @ts-ignore: TODO: fix?\n            html.observe(this.updateElementHTML, element);\n            this.element_bound_html_values.set(element, html);\n        }\n        // default\n        else this.updateElementHTML.call(element, html);\n\n        return element;\n    }\n\n    setElementText<T extends HTMLElement>(element:T, text:Datex.RefOrValue<unknown>, markdown = false):T{\n        // unobserve?\n        this.element_bound_html_values.get(element)?.unobserve(element);\n        this.element_bound_text_values.get(element)?.unobserve(element);\n\n        // @ts-ignore markdown flag\n        element._use_markdown = markdown;\n\n        // none\n        if (text == undefined || text === false) element.innerText = '';\n\n        // Datexv Ref\n        else if (text instanceof Datex.ReactiveValue) {\n            \n            this.updateElementText.call(element, text.val);\n\n            text.observe(this.updateElementText, element);\n            this.element_bound_text_values.set(element, text);\n        }\n        // default\n        else this.updateElementText.call(element, text);\n\n        return element;\n    }\n\n\n\tcreateElement(tagName:string): SVGElement|MathMLElement|HTMLElement {\n\t\tif (svgTags.has(tagName as any)) return this.document.createElementNS(this.svgNS, tagName as any) as SVGElement;\n\t\telse if (mathMLTags.has(tagName as any)) return this.document.createElementNS(this.mathMLNS, tagName as any) as MathMLElement;\n\t\telse return this.document.createElement(tagName as any) as HTMLElement;\n\t}\n\n\n    /**\n     * Append children to a parent, updates children dynamically if pointer of iterable provided\n     * @param parent \n     * @param children \n     * @returns \n     */\n    append<T extends Element|DocumentFragment>(parent:T, children:appendableContent|appendableContent[]):T | undefined {\n\n        // @ts-ignore extract children ref iterable from DocumentFragment\n        if (children instanceof this.context.DocumentFragment && children._uix_children) children = children._uix_children;\n\n        const collapsedChildren = Datex.ReactiveValue.collapseValue(children);\n\n        // is ref and iterable/element\n        if (!(parent instanceof this.context.DocumentFragment) && Datex.ReactiveValue.isRef(children) && (collapsedChildren instanceof Array || collapsedChildren instanceof Map || collapsedChildren instanceof Set)) {\n            // is iterable ref\n            // TODO: support promises\n            children = collapsedChildren;\n\n            const ref:Datex.ReactiveValue = children instanceof Datex.ReactiveValue ? children : Datex.Pointer.getByValue(children)!;\n\n            if (!(<DOMUtils.elWithUIXAttributes><unknown>parent)[DOMUtils.CHILDREN_DX_VALUES]) \n                (<DOMUtils.elWithUIXAttributes><unknown>parent)[DOMUtils.CHILDREN_DX_VALUES] = new Set<Datex.ReactiveValue>();\n            (<DOMUtils.elWithUIXAttributes><unknown>parent)[DOMUtils.CHILDREN_DX_VALUES].add(ref)\n\n            const startAnchor = new this.context.Comment(\"start \" + Datex.Pointer.getByValue(children)?.idString())\n            const endAnchor = new this.context.Comment(\"end \" + Datex.Pointer.getByValue(children)?.idString())\n            parent.append(startAnchor, endAnchor)\n\n            const Comment = this.context.Comment;\n\n            const getAbsoluteOffset = (k: number) => {\n                const startOffset = Array.from(parent.childNodes).indexOf(startAnchor);\n                return startOffset + 1 + k;\n            };\n            const iterableHandler = new IterableHandler<appendableContent, Node>(children as appendableContent[], {\n                map: (v,k) => {\n                    const {node: el} = this.valueToDOMNode(v);\n                    return el;\n                },\n                onEntryRemoved: (v, relative_k) => {\n                    // remove kth child\n                    const k = getAbsoluteOffset(relative_k);\n                    const node = parent.childNodes[k];\n                    // out of bounds\n                    if (!node || node === endAnchor || node === startAnchor){\n                        return;\n                    }\n                    node.remove();\n                },\n                onNewEntry(v, relative_k, p)  {\n                    // if kth child exists, replace, otherwise append at end\n                    const k = getAbsoluteOffset(relative_k);\n                    const current = parent.childNodes[k];\n                    if (current && current != endAnchor) parent.replaceChild(v, current);\n                    else {\n                        // fill gap if k is larger than current children\n                        const childrenArray = Array.from(parent.childNodes);\n                        const startAnchorIndex = childrenArray.indexOf(startAnchor);\n                        const endAnchorIndex = childrenArray.indexOf(endAnchor);\n                        const totalParentSectionLength = endAnchorIndex - startAnchorIndex - 1;\n                        \n                        if (relative_k > totalParentSectionLength) {\n                            for (let i = totalParentSectionLength; i < relative_k; i++) {\n                                parent.insertBefore(new Comment(\"empty\"), endAnchor);\n                            }\n                        }\n                        parent.insertBefore(v, endAnchor);\n                    }\n                },\n                onEmpty: () => {\n                    let current:Node|null|undefined = startAnchor.nextSibling;\n                    while (current && current !== endAnchor) {\n                        const removing = current;\n                        current = current?.nextSibling\n                        parent.removeChild(removing);\n                    }\n                }\n            })\n\n            // workaround: prevent iterableHandler GC \n            parent[Datex.Pointer.DISPOSABLES] = iterableHandler\n\n            // TODO: element references updating required?\n            // else if (children instanceof Element) {\n            //     const scheduler = new TaskScheduler(true);\n            //     let lastChildren: Node[] = [];\n    \n            //     Datex.ReactiveValue.observeAndInit(children, () => {\n            //         scheduler.schedule(\n            //                 Task(resolve => {\n            //                     appendNew(parent, Array.isArray(children) ? children : [children], lastChildren, (e) => {\n            //                         lastChildren = e;\n            //                         resolve();\n            //                     });\n            //                 })\n            //             ); \n            //         },\n            //         undefined,\n            //         null, \n            //         {\n            //             recursive: false,\n            //             types: [Datex.ReactiveValue.UPDATE_TYPE.INIT]\n            //         }\n            //     )\n            // }\n        }\n\n        // is iterable (no ref, collapse recursive)\n        // else if (children instanceof Array) {\n        //     for (const child of children) {\n        //         this.append(parent, child);\n        //     }\n        // }\n\n        // is not a ref iterable\n        else return this._append(parent, Array.isArray(children) ? children : [children]);\n    }\n\n\n    _append<T extends Element|DocumentFragment>(parent:T, children:appendableContent[]):T {\n        // use content if parent is <template>\n        const element = parent instanceof this.context.HTMLTemplateElement ? parent.content : parent;\n\n        // Handle HTMLTextAreaElement element body\n        if (element?.tagName?.toLowerCase?.() === \"textarea\") {\n            const reactiveProps = children.find(e => e instanceof Datex.ReactiveValue);\n            if (reactiveProps) {\n                this.setLiveAttribute(element, \"value\", reactiveProps);\n                return parent;\n            }\n        }\n\n        for (let child of children) {\n            child = (child as any)?.[JSX_INSERT_STRING] ? (child as any).val : child; // collapse safely injected strings\n\n            const {node} = this.valueToDOMNode(child);\n\n            // set shadow root or append\n            this.appendElementOrShadowRoot(element, node);\n        }\n\n        return parent;\n    }\n\n\tsetElementAttribute<T extends Element>(element:T, attr:string, value:Datex.RefOrValue<unknown>|LazyPointer<unknown>|((...args:unknown[])=>unknown)|{[JSX_INSERT_STRING]:true, val:string}, rootPath?:string|URL):boolean|Promise<boolean> {\n        \n        // not an element (e.g DocumentFragment)\n        if (!(element instanceof this.context.Element)) return false;\n\n        // valid attribute name?\n        // not an HTML attribute\n        if (!(\n            // if one of the following is true, the attribute is added\n            attr.startsWith(\"data-\") ||\n            attr.startsWith(\"aria-\") ||\n            (!element.tagName.startsWith(\"UIX-\") && element.tagName.includes(\"-\")) || // is custom element, but not a UIX component\n            defaultElementAttributes.includes(<typeof defaultElementAttributes[number]>attr) || \n            elementEventHandlerAttributes.includes(<typeof elementEventHandlerAttributes[number]>attr) ||\n            (<readonly string[]>htmlElementAttributes[<keyof typeof htmlElementAttributes>element.tagName.toLowerCase()])?.includes(<typeof htmlElementAttributes[keyof typeof htmlElementAttributes][number]>attr) ||\n            (<readonly string[]>svgElementAttributesLowercase[<keyof typeof svgElementAttributesLowercase>element.tagName.toLowerCase()])?.includes(<typeof svgElementAttributes[keyof typeof svgElementAttributes][number]>attr) )) {\n                return false;\n        }\n\n        // warnings for invalid attribute usage\n        // setting the 'value' attribute of a <input> checkbox element\n        if (element instanceof this.context.HTMLInputElement && attr == \"value\" && element.getAttribute(\"type\") == \"checkbox\" && typeof Datex.ReactiveValue.collapseValue(value, true, true) == \"boolean\") {\n            logger.warn(`You are assigning the \"value\" attribute of an <input type=\"checkbox\"> to a boolean value. This has no effect on the checkbox state. Did you mean to use the \"checked\" attribute instead\\\\?`)\n        }\n\n        // value:selected is only allowed for input type=\"radio\"\n        else if (attr == \"value:selected\" && !(element instanceof this.context.HTMLInputElement && (element as HTMLInputElement).type == \"radio\")) {\n            throw new Error(\"The \\\"value:selected\\\" attribute is only allowed for <input type=\\\"radio\\\"> elements\");\n        }\n        \n        value = value?.[JSX_INSERT_STRING] ? value.val : value; // collapse safely injected strings\n\n        // first await, if value is promise\n        if (value instanceof Promise) return value.then(v=>this.setElementAttribute(element, attr, v, rootPath))\n\n        if (!element) return false;\n        value = Datex.Pointer.pointerifyValue(value)\n\n        // LazyPointer or lazy pointer property\n        if (\n            value instanceof LazyPointer ||\n            (value instanceof PointerProperty && value.lazy_pointer)\n        ) {\n            value.onLoad(() => {\n                this.setElementAttribute(element, attr, value, rootPath)\n            })\n            return true;\n        }\n\n        // Datex Ref\n        else if (value instanceof Datex.ReactiveValue) {\n            return this.setLiveAttribute(element, attr, value, rootPath);\n        }\n\n        // default\n        else return this.setAttribute(element, attr, value, rootPath)\n    }\n\n    private async handleSetVal(ref: Datex.ReactiveValue, element: HTMLInputElement, val:any, type?: \"number\"|\"bigint\"|\"boolean\"|\"time\") {\n        if (this.defaultInputValidation.number?.enabled && type == \"number\") {\n            if (isNaN(Number(val))) {\n                element.setCustomValidity(Datex.ReactiveValue.collapseValue(this.defaultInputValidation.number.message, true, true) as string)\n                element.reportValidity()\n                return;\n            }\n        }\n\n        if (this.defaultInputValidation.bigint?.enabled && type == \"bigint\") {\n            if (!val.match(/^-?\\d+$/)) {\n                element.setCustomValidity(Datex.ReactiveValue.collapseValue(this.defaultInputValidation.bigint.message, true, true) as string)\n                element.reportValidity()\n                return;\n            }\n        }\n\n        if (type == \"boolean\") val = Boolean(val);\n        else if (type == \"bigint\") val = BigInt(val);\n        else if (type == \"number\") val = Number(val);\n\n        try {\n            await ref.setVal(val)\n            element.setCustomValidity(\"\")\n            element.reportValidity()\n        }\n        catch (e) {\n            const message = e?.message ?? e?.toString()\n            element.setCustomValidity(message)\n            element.reportValidity()\n        }\n    }\n\n\n    private setLiveAttribute<T extends Element>(element:T, attr:string, value:Datex.RefLike<unknown>, rootPath?:string|URL):boolean {\n        const isInputElement = element.tagName.toLowerCase() === \"input\";\n        const isSelectElement = element.tagName.toLowerCase() === \"select\";\n        const isTextareaElement = element.tagName.toLowerCase() === \"textarea\";\n        const isDateInput = isInputElement && (\n            (element as unknown as HTMLInputElement).type == \"datetime-local\" ||\n            (element as unknown as HTMLInputElement).type == \"date\" ||\n            (element as unknown as HTMLInputElement).type == \"time\" ||\n            (element as unknown as HTMLInputElement).type == \"month\" ||\n            (element as unknown as HTMLInputElement).type == \"week\"\n        );\n\n        let type = Datex.Type.ofValue(value);\n        if (type instanceof Datex.Conjunction) {\n            // find a type that is a Datex.Type\n            for (const t of type) {\n                if (t instanceof Datex.Type) {\n                    type = t;\n                    break;\n                }\n            }\n        }\n\n        // bind value (used for datex-over-http updates)\n        if (attr == \"value\" || attr == \"checked\") {\n            if (!(<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.ATTR_BINDINGS]) \n                (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.ATTR_BINDINGS] = new Map<string, Datex.ReactiveValue>();\n            (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.ATTR_BINDINGS].set(attr, value)\n        }\n        else {\n            if (!(<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.ATTR_DX_VALUES]) \n                (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.ATTR_DX_VALUES] = new Map<string, Datex.ReactiveValue>();\n            (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.ATTR_DX_VALUES].set(attr, value)\n        }\n \n        // :out attributes\n        if ((isSelectElement || isInputElement || isTextareaElement) && (attr == \"value:selected\" || attr == \"value:out\" || attr == \"value:in\" || attr == \"value\")) {\n\n            const event = isSelectElement ? 'change' : 'input';\n            const inputElement = element as unknown as HTMLInputElement;\n            // out\n            if (attr == \"value\" || attr == \"value:out\" || attr == \"value:selected\") {\n                if (!(type instanceof Datex.Type)) {\n                    console.warn(\"Value has no type\", value);\n                }\n                else if (type.matchesType(Datex.Type.std.text)) element.addEventListener(event, () => this.handleSetVal(value, inputElement, inputElement.value))\n                else if (type.matchesType(Datex.Type.std.decimal)) element.addEventListener(event, () => {\n                    // date input\n                    if (isDateInput) {\n                        this.handleSetVal(value, inputElement, new Time((element as unknown as HTMLInputElement).valueAsDate ?? new Date((element as unknown as HTMLInputElement).value)), \"number\")\n                    }\n                    // normal input\n                    else {\n                        this.handleSetVal(value, inputElement, inputElement.value, \"number\")\n                    }\n                })\n                else if (type.matchesType(Datex.Type.std.integer)) element.addEventListener(event, () => this.handleSetVal(value, inputElement, inputElement.value, \"bigint\"))\n                else if (type.matchesType(Datex.Type.std.boolean)) element.addEventListener(event, () => this.handleSetVal(value, inputElement, inputElement.value, \"boolean\"))\n                else if (type.matchesType(Datex.Type.std.void) || type.matchesType(Datex.Type.std.null)) {console.warn(\"setting value attribute to \" + type, element)}\n                else if (type.matchesType(Datex.Type.std.time)) element.addEventListener(event, () => {\n                    this.handleSetVal(value, inputElement, new Time((element as unknown as HTMLInputElement).valueAsDate ?? new Date((element as unknown as HTMLInputElement).value)), \"time\")\n                })\n                else throw new Error(\"The type \"+type+\" is not supported for the '\"+attr+\"' attribute of the <\"+element.tagName.toLowerCase()+\"> element\");\n\n\n                // for all input elements that support a max, min or step attribute: listen for attribute changes and update the output value\n                if (isInputElement && (inputElement.type == \"number\" || inputElement.type == \"range\")) {\n                    const observer = new MutationObserver(() => {\n                        if (type.matchesType(Datex.Type.std.decimal)) this.handleSetVal(value, inputElement, inputElement.value, \"number\");\n                        else if (type.matchesType(Datex.Type.std.integer)) this.handleSetVal(value, inputElement, inputElement.value, \"bigint\");\n                    });\n                    observer.observe(inputElement, {attributes: true, attributeFilter: [\"max\", \"min\", \"step\"]})\n                }\n\n            }\n\n            // value:selected initial state\n            if (attr == \"value:selected\") {\n                (<DOMUtils.elWithUIXAttributes><unknown>inputElement)[DOMUtils.ATTR_SELECTED_BINDING] = value;\n                // check if the defined value of the input is equal to the value of the pointer\n                if (inputElement.value == value.val) inputElement.checked = true;\n            }\n            \n            // in\n            if (attr == \"value\" || attr == \"value:in\" || attr == \"value:selected\") {\n                const valid = attr==\"value:selected\" ? true : this.setAttribute(element, \"value\", value.val, rootPath)\n                const val = value;\n                if (valid) {\n                    weakAction(\n                        // weak dependencies for init\n                        {element}, \n                        // init (called once)\n                        ({element}) => {\n                            use(\"allow-globals\", this, logger, val, rootPath, isolatedScope, attr)\n                            const handler = isolatedScope(v => {\n                                use(\"allow-globals\", this, logger, rootPath, element, attr)\n                                const deref = element.deref();\n                                if (!deref) {\n                                    logger.warn(\"Undetected garbage collection (uix-w0001)\");\n                                    return;\n                                }\n                                // if value:selected, only update selection state\n                                if (attr == \"value:selected\") {\n                                    if (deref.value == v) deref.checked = true;\n                                }\n                                // set value attribute\n                                else {\n                                    this.setAttribute(deref, \"value\", v, rootPath);\n                                }\n                            })\n                            val.observe(handler);\n                            return handler;\n                        }, \n                        // deinit (called when a weak init dependency is removed) - not guaranteed to be called\n                        (handler, _, {val}) => val.unobserve(handler),\n                        // weak deinit dependencies (allow gc)\n                        {val}\n                    );\n                }\n                return valid;\n            }\n\n            return true;\n        }\n\n        // checked attribute\n        if (isInputElement && element.getAttribute(\"type\") === \"checkbox\" && attr == \"checked\") {\n            if (!(element instanceof this.context.HTMLInputElement)) throw new Error(\"the 'checked' attribute is only supported for <input> elements\");\n\n            const inputElement = element as HTMLInputElement;\n\n            if (type.matchesType(Datex.Type.std.boolean)) inputElement.addEventListener('change', () => this.handleSetVal(value, inputElement, inputElement.checked, \"boolean\"))\n            else if (type.matchesType(Datex.Type.std.void)) {console.warn(\"setting checked attribute to void\")}\n            else throw new Error(\"The type \"+type+\" is not supported for the 'checked' attribute of the <input> element\");\n        }\n\n        // default attributes\n\n        const currentVal = value.val;\n        const valid = this.setAttribute(element, attr, currentVal, rootPath)\n        // observe pointer value (TODO: this observe currently only works if value is a primitive pointer, otherwise only internal updates are reflected reactively, e.g. for style objects or arrays - this is handled in setAttribute)\n        const isPrimitive = (typeof currentVal != \"object\" || currentVal === null) && typeof currentVal != \"function\";\n        if (isPrimitive && valid) {\n            const val = value;\n            \n            weakAction({element}, \n                ({element}) => {\n                    use(\"allow-globals\", this, attr, rootPath, logger, val, isolatedScope);\n\n                    const handler = isolatedScope((v:any,...args) => {\n                        use(\"allow-globals\", this, logger, rootPath, element, attr);\n                        const deref = element.deref();\n                        if (!deref) {\n                            logger.warn(\"Undetected garbage collection (uix-w0001)\");\n                            return;\n                        }\n                        this.setAttribute(deref, attr, v, rootPath);\n                    });\n                    val.observe(handler);\n                    return handler;\n                },\n                (handler, _, {val}) => val.unobserve(handler),\n                {val}\n            );\n        }\n        return valid;\n    }\n\n    private isNormalFunction(fnSrc:string) {\n        return !!fnSrc.match(/^(async\\s+)?function(\\(| |\\*)/)\n    }\n\n\tprivate setAttribute(element: Element, attr:string, val:unknown, root_path?:string|URL): boolean {\n\n        // special suffixes:\n\n        // non-module-relative paths if :route suffix\n        if (attr.endsWith(\":route\")) {\n            attr = attr.replace(\":route\", \"\");\n            root_path = undefined;\n        }\n\n        // strip :in suffix\n        if (attr.endsWith(\":in\")) {\n            attr = attr.replace(\":in\", \"\");\n        }\n\n\n        // special attributes--------------\n\n        // update checkbox checked property (bug?)\n        if (element instanceof HTMLInputElement && attr == \"checked\") {\n            element.checked = val as boolean;\n        }\n\n        // update muted property\n        else if (element instanceof HTMLMediaElement && attr == \"muted\") {\n            element.muted = val as boolean;\n        }\n\n        // --------------------------------\n\n        // display context event handler function\n        if (attr.endsWith(\":frontend\")) {\n            if (typeof val !== \"function\") throw new Error(`Invalid value for attribute \"${attr}\" - must be a function`)\n            if (client_type == \"browser\" || val instanceof JSTransferableFunction) {\n                // don't change, already a JSTransferableFunction or in frontend context\n            }\n            else if (JSTransferableFunction.functionIsAsync(val as (...args: unknown[]) => unknown)) {\n                // async! (always returns true, doesn't await promise)\n                JSTransferableFunction\n                    .createAsync(val as (...args: unknown[]) => Promise<unknown>)\n                    .then(fn => {\n                        this.setAttribute(element, attr, fn, root_path)\n                        // auto-inject 'this' context\n                        if (this.isNormalFunction(fn.source)) fn.deps['this'] = element\n                    })\n                return true;\n            }\n            else {\n                val = JSTransferableFunction.create(val as (...args: unknown[]) => unknown);\n                \n                // auto-inject 'this' context\n                if (this.isNormalFunction((val as JSTransferableFunction).source)) (val as JSTransferableFunction).deps['this'] = element\n            }\n            attr = attr.replace(\":frontend\", \"\");\n\n        }\n\n        // invalid :out attributes here\n        if (attr.endsWith(\":out\") || attr.endsWith(\":selected\")) throw new Error(\"Invalid value for \"+attr+\" attribute - must be a pointer\");\n\n        // value attribute\n        else if (attr == \"value\") {\n            // handle select options\n            if (element.tagName.toLowerCase() === \"select\") {\n                for (const option of element.childNodes) {\n                    if (option instanceof this.context.HTMLOptionElement) {\n                        if (option.value == val) {\n                            option.setAttribute(\"selected\",\"\");\n                            break;\n                        }\n                    }\n                }\n            }\n            // set value property\n            else {\n                // if date input and value < 0, ignore\n                if (element instanceof HTMLInputElement && (element as HTMLInputElement).type == \"datetime-local\" && !(new Date(val as any).getTime() > 0)) return;\n                const newValue = this.formatAttributeValue(val, attr, root_path, element);\n                if ((element as HTMLInputElement).value !== newValue) (element as HTMLInputElement).value = newValue;\n            }\n\n            // handle DOMUtils.ATTR_SELECTED_BINDING\n            if ((<DOMUtils.elWithUIXAttributes>element)[DOMUtils.ATTR_SELECTED_BINDING]) {\n                if ((<DOMUtils.elWithUIXAttributes>element)[DOMUtils.ATTR_SELECTED_BINDING].val == val) {\n                    (element as HTMLInputElement).checked = true;\n                }\n            }\n        }\n\n        // set datex-update\n        else if (attr == \"datex-update\") {\n            (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.DATEX_UPDATE_TYPE] = val as string;\n        }\n\n        // set stylesheet\n        else if (attr == \"stylesheet\") {\n            element.append(this.createHTMLElement(`<link rel=\"stylesheet\" href=\"${this.formatAttributeValue(val, attr, root_path, element)}?scope\"/>`))\n        }\n\n        // update checkbox checked property (bug?)\n        else if (element instanceof this.context.HTMLDialogElement && attr == \"open\") {\n\n            const theVal = val;\n\n            weakAction({element}, \n                ({element}) => {\n                    use(\"allow-globals\", theVal, logger, Datex, isolatedScope);\n                    const handler = isolatedScope((val:any) => {\n                        use(\"allow-globals\", logger, element);\n                        const deref = element.deref();\n                        if (!deref) {\n                            logger.warn(\"Undetected garbage collection (uix-w0001)\");\n                            return;\n                        }\n                        if (val) deref.showModal();\n                        else deref.close()\n                    });\n                    Datex.ReactiveValue.observeAndInit(theVal, handler);\n                    return handler;\n                }, \n                (handler) => use(\"allow-globals\", Datex, theVal) && Datex.ReactiveValue.unobserve(theVal, handler)\n            );\n            \n        }\n\n        // display shorthand for style.display\n        else if (attr == \"display\") {\n            this.setCSSProperty(element as HTMLElement, \"display\", val as boolean);\n        }\n\n        // class mapping\n        else if (attr == \"class\" && typeof val == \"object\") {\n\n            const update = (key:string, val:Datex.RefOrValue<boolean>) => {\n                if (Datex.ReactiveValue.collapseValue(val, true, true)) element.classList.add(key);\n                else element.classList.remove(key);\n            }\n            const updateAll = (obj: Record<string, Datex.RefOrValue<boolean>>) => {\n                for (const [key, val] of Object.entries(obj)) update(key, val);\n            }\n\n            // handle array updates\n            let previousArray = [] as Array<string>;\n            const updateArray = (arr: Array<string>) => {\n                if (previousArray) {\n                    for (const key of previousArray) {\n                        if (!arr.includes(key)) {\n                            element.classList.remove(key);\n                        }\n                    }\n                }\n                element.classList.add(...arr);\n                previousArray = [...arr];\n            }\n            \n            if (Datex.ReactiveValue.isRef(val)) {\n                Datex.ReactiveValue.observeAndInit(val, (v, k, t) => {\n                    // update class list from array\n                    if (val instanceof Array) updateArray(val);\n                    // update class list from object\n                    else {\n                        if (t == Datex.Pointer.UPDATE_TYPE.INIT) updateAll(v);\n                        else if (typeof k == \"string\") update(k, v);\n                    }  \n                })\n            }\n            // simple object with pointers as properties\n            else {\n                if (val instanceof Array) updateArray(val);\n                else {\n                    updateAll(val);\n                    for (const [key, value] of Object.entries(val)) {\n                        if (value instanceof Datex.ReactiveValue) value.observe(v => update(key, v));\n                    }\n                }\n            }\n            \n        }\n    \n\n        // special attribute values\n        else if (val === false) element.removeAttribute(attr);\n        else if (val === true || val === undefined) element.setAttribute(attr,\"\");\n\n        // video src => srcObject\n        else if (element instanceof this.context.HTMLVideoElement && attr === \"src\" && globalThis.MediaStream && val instanceof MediaStream) {\n            element.srcObject = val;\n        }\n\n        // src path with import map specifier\n        // TODO: currently only enabled for specific folder names to keep backwards compatibility, this should be enabled for all paths\n        else if ((attr === \"src\" || attr === \"href\") && typeof val == \"string\" && (val.startsWith(\"common/\") || val.startsWith(\"frontend/\"))) {\n            element.setAttribute(attr, `/@uix/src/${val}`);\n        }\n\n        // event listener\n        else if (attr.startsWith(\"on\")) {\n            for (const handler of ((val instanceof Array || val instanceof Set) ? val : [val])) {\n                if (typeof handler == \"function\") {\n                    const eventName = <keyof HTMLElementEventMap & string>attr.replace(\"on\",\"\").toLowerCase();\n                    element.addEventListener(eventName, handler as any);\n                    // save in [DOMUtils.EVENT_LISTENERS]\n                    if (!(<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS]) (<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS] = new Map<keyof HTMLElementEventMap, [Set<Function>, boolean]>();\n                    // clear previous standalone listeners for this event\n                    for (const [listener, isStandalone] of (<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS].get(eventName) ?? []) {\n                        if (isStandalone) element.removeEventListener(eventName, listener as any);\n                    }\n                    if (!(<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS].has(eventName)) (<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS].set(eventName, new Set());\n                    (<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS].get(eventName)!.add([handler, false]);\n                }\n                else if (typeof handler == \"string\") element.setAttribute(attr, handler);\n                else {\n                    console.log(attr,handler)\n                    throw new Error(\"Cannot set event listener for element attribute '\"+attr+\"'\")\n                }\n            }\n            \n        }\n        // special form 'action' callback\n        else if (element instanceof this.context.HTMLFormElement && attr === \"action\") {\n            for (const handler of ((val instanceof Array || val instanceof Set) ? val : [val])) {\n                // action callback function\n                if (typeof handler == \"function\") {\n                    const eventName = \"submit\";\n\n                    // backend function\n                    let ptr = Datex.Pointer.getByValue(handler);\n\n                    if (!ptr) {\n                        if (client_type == \"deno\") {\n                            ptr = Datex.Pointer.createOrGet(handler);\n                            ptr.is_persistent = true;\n                            // TODO: garbage collection for ptr when form element is garbage collected\n                        }\n                        else {\n                            console.warn(\"Frontend functions for form action are not supported yet\")\n                        }\n                    }\n\n                    if (client_type == \"browser\" && ptr?.is_origin) {\n                        console.warn(\"Frontend functions for form action are not supported yet\")\n                    }\n                    else {\n                        element.setAttribute(\"action\", `/@uix/form-action/${ptr.idString()}`);\n                    }\n\n                    // save in [DOMUtils.EVENT_LISTENERS]\n                    if (!(<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS]) (<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS] = new Map<keyof HTMLElementEventMap, [Set<Function>, boolean]>();\n                    if (!(<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS].has(eventName)) (<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS].set(eventName, new Set());\n                    (<DOMUtils.elWithUIXAttributes>element)[DOMUtils.EVENT_LISTENERS].get(eventName)!.add([handler, false]);\n                }\n                // default \"action\" (path)\n                else element.setAttribute(attr, this.formatAttributeValue(val, attr, root_path, element));\n            }\n            \n        }\n    \n        // normal attribute\n        else {\n            if (val === false) {\n                if (element.hasAttribute(attr)) element.removeAttribute(attr);\n            }\n            else if (val === true) {\n                if (!element.hasAttribute(attr)) element.setAttribute(attr, \"\");\n            }\n            else {\n                const newValue = this.formatAttributeValue(val, attr, root_path, element);\n                if (element.getAttribute(attr) !== newValue) element.setAttribute(attr, newValue);\n            }\n        }\n\n    \n        return true;\n        \n    }\n\n    getFormattedWeek(d: Date) {\n        d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n        d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));\n        const yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1)).getTime();\n        const weekNo = Math.ceil(( ( (d.getTime() - yearStart) / 86400000) + 1)/7);\n        return `${d.getUTCFullYear()}-W${weekNo.toString().padStart(2,\"0\")}`;\n    }\n\n    getDateFromFormattedWeek(weekString: string) {\n        const [year, week] = weekString.split(\"-W\").map(Number)\n\n        if (week < 1 || week > 53) {\n          throw new RangeError(\"ISO 8601 weeks are numbered from 1 to 53\");\n        } else if (!Number.isInteger(week)) {\n          throw new TypeError(\"Week must be an integer\");\n        } else if (!Number.isInteger(year)) {\n          throw new TypeError(\"Year must be an integer\");\n        }\n        const simple = new Date(year, 0, 1 + (week - 1) * 7);\n        const dayOfWeek = simple.getDay();\n        const isoWeekStart = simple;\n        isoWeekStart.setDate(simple.getDate() - dayOfWeek + 1);\n        if (dayOfWeek > 4) {\n            isoWeekStart.setDate(isoWeekStart.getDate() + 7);\n        }\n        if (isoWeekStart.getFullYear() > year ||\n            (isoWeekStart.getFullYear() == year &&\n             isoWeekStart.getMonth() == 11 &&\n             isoWeekStart.getDate() > 28)) {\n            throw new RangeError(`${year} has no ISO week ${week}`);\n        }\n    \n        return isoWeekStart;\n    }\n    \n    formatAttributeValue(val:any, attr: string, root_path?:string|URL, element?:Element): string {\n        if (root_path==undefined) return val?.toString?.() ?? \"\"\n        else if (attr == \"value\" && element instanceof HTMLInputElement) {\n            if (element.type == \"datetime-local\") {\n                const unixTime = val instanceof Date ? val.getTime() : new Date(val).getTime();\n                const showSeconds = element.step && Number(element.step) < 60;\n                return new Date(unixTime + new Date(unixTime).getTimezoneOffset() * -60 * 1000).toISOString().slice(0,showSeconds ? -5 : -8);\n            }\n            else if (element.type == \"month\") {\n                const date = val instanceof Date ? val : new Date(val);\n                return date.toISOString().slice(0,7)\n            }\n            else if (element.type == \"week\") {\n                try {\n                    let date = val instanceof Date ? val : new Date(val);\n                    // if invalid date, use getDateFromFormattedWeek\n                    if (isNaN(date.getTime())) date = this.getDateFromFormattedWeek(val);\n                    return this.getFormattedWeek(date);\n                }\n                catch {\n                    // return current value of input if invalid\n                    return element.value;\n                }\n            }\n            else if (element.type == \"date\") {\n                const date = val instanceof Date ? val : new Date(val);\n                return date.toISOString().slice(0,10)\n            }\n            else if (element.type == \"time\") {\n                // empty value\n                if (!val) return \"\";\n\n                // if already in time (e.g. HH:mm:ss) format, return directly\n                if (typeof val == \"string\" && val.match(/^\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?$/)) return val;\n\n                // handle conversion from Date or number\n                const date = val instanceof Date ? val : new Date(val);\n                // show seconds if step is < 60\n                if (element.step && Number(element.step) < 60) return date.toISOString().slice(11,19)\n                else return date.toISOString().slice(11,16)\n            }\n            else {\n                return val?.toString?.() ?? \"\"\n            }\n        } \n        else if (typeof val == \"string\" && (val.startsWith(\"./\") || val.startsWith(\"../\"))) return new URL(val, root_path).toString();\n        else return val?.toString?.() ?? \"\"\n    }\n\n\n    setCSS<T extends HTMLElement>(element:T, property:string, value?:Datex.CompatValue<string|number>):T\n    setCSS<T extends HTMLElement>(element:T, properties:{[property:string]:Datex.CompatValue<string|number>}):T\n    setCSS<T extends HTMLElement>(element:T, style:Datex.CompatValue<string>):T\n    setCSS<T extends HTMLElement>(element:T, properties_object_or_property:{[property:string]:Datex.CompatValue<string|number>}|Datex.CompatValue<string>, value?:Datex.CompatValue<string|number>):T {\n        let properties:{[property:string]:Datex.RefOrValue<string|number|undefined>};\n        if (typeof properties_object_or_property == \"string\" && value != undefined) properties = {[properties_object_or_property]:value};\n        else if (typeof properties_object_or_property == \"string\" || (properties_object_or_property instanceof Datex.Value && Datex.Type.ofValue(properties_object_or_property) == Datex.Type.std.text)) {\n            this.setElementAttribute(element, \"style\", properties_object_or_property)\n            return element;\n        }\n        else properties = Datex.ReactiveValue.collapseValue(properties_object_or_property,true,true) as {[property:string]:Datex.CompatValue<string|number|undefined>};\n\n        if (properties) {\n            for (const [property, value] of Object.entries(properties)) {\n                this.setCSSProperty(element, property, value);\n            }\n        }\n\n        if (properties_object_or_property instanceof Datex.ReactiveValue && typeof properties_object_or_property == \"object\") {\n            Datex.ReactiveValue.observe(properties_object_or_property, () => {\n                for (const [property, value] of Object.entries(properties_object_or_property.val)) {\n                    this.setCSSProperty(element, property, value);\n                }\n            });\n        }\n\n        return element;\n    }\n\n    /**\n     * When enabled, the binding is not preserved when transferring the element to another context\n     */\n    enableCSSPropertyWeakBinding<T extends HTMLElement>(element:T, property:string, weak = true) {\n        if (!(<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.STYLE_WEAK_PROPS]) \n            (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.STYLE_WEAK_PROPS] = new Map<string, boolean>();\n        (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.STYLE_WEAK_PROPS].set(property, weak)\n    }\n\n    /**\n     * Set css property of an element, updates reactively if pointer\n     * If weakBinding is true, the binding is not preserved when transferring the element to another context\n     */\n    setCSSProperty<T extends HTMLElement>(element:T, property:string, value:Datex.RefOrValue<string|number|undefined|boolean>, weakBinding = false, unit?: string):T{\n        // convert camelCase to kebab-case\n        property = property?.replace(/[A-Z]/g, x => `-${x.toLowerCase()}`);\n        // none\n        if (value == undefined) {\n            if (element.style.removeProperty) element.style.removeProperty(property);\n            // @ts-ignore style property access\n            else delete element.style[property];\n        }\n\n        // // UIX color\n        // else if (value instanceof Datex.PointerProperty && value.pointer.val == Theme.colors) {\n        //     if (element.style.setProperty) element.style.setProperty(property, `var(--${value.key})`); // autmatically updated css variable\n        //     // @ts-ignore style property access\n        //     else element.style[property] = `var(--${value.key})`\n        // }\n        // other Datex CompatValue\n        else {\n\n            // remember style ref binding\n            if (!weakBinding && Datex.ReactiveValue.isRef(value)) {\n                if (!(<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.STYLE_DX_VALUES]) \n                    (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.STYLE_DX_VALUES] = new Map<string, Datex.ReactiveValue>();\n                (<DOMUtils.elWithUIXAttributes><unknown>element)[DOMUtils.STYLE_DX_VALUES].set(property, value)\n            }\n            \n            Datex.ReactiveValue.observeAndInit(value, (v,k,t) => {\n                if (property == \"display\" && typeof v == \"boolean\") {\n                    v = v ? (globalThis.CSS?.supports(\"display: revert-layer\") ? \"revert-layer\" : \"revert\") : \"none\";\n                }\n\n                if (v == undefined) {\n                    if (element.style.removeProperty) element.style.removeProperty(property);\n                    // @ts-ignore style property access\n                    else delete element.style[property];\n                }\n                else {\n                    if (!element.style) {\n                        // TODO: handle this case if trying to set global css variable on document (for reactive css)\n                        return;\n                    }\n                    if (element.style.setProperty) element.style.setProperty(property, this.getCSSProperty(<string>v, undefined, unit));\n                    // @ts-ignore style property access\n                    else element.style[property] = this.getCSSProperty(v, undefined, unit);\n                }\n            }, undefined, undefined);\n        }\n        return element;\n    }\n\n    readonly color_names = {\"aliceblue\":\"#f0f8ff\",\"antiquewhite\":\"#faebd7\",\"aqua\":\"#00ffff\",\"aquamarine\":\"#7fffd4\",\"azure\":\"#f0ffff\",\n        \"beige\":\"#f5f5dc\",\"bisque\":\"#ffe4c4\",\"black\":\"#000000\",\"blanchedalmond\":\"#ffebcd\",\"blue\":\"#0000ff\",\"blueviolet\":\"#8a2be2\",\"brown\":\"#a52a2a\",\"burlywood\":\"#deb887\",\n        \"cadetblue\":\"#5f9ea0\",\"chartreuse\":\"#7fff00\",\"chocolate\":\"#d2691e\",\"coral\":\"#ff7f50\",\"cornflowerblue\":\"#6495ed\",\"cornsilk\":\"#fff8dc\",\"crimson\":\"#dc143c\",\"cyan\":\"#00ffff\",\n        \"darkblue\":\"#00008b\",\"darkcyan\":\"#008b8b\",\"darkgoldenrod\":\"#b8860b\",\"darkgray\":\"#a9a9a9\",\"darkgreen\":\"#006400\",\"darkkhaki\":\"#bdb76b\",\"darkmagenta\":\"#8b008b\",\"darkolivegreen\":\"#556b2f\",\n        \"darkorange\":\"#ff8c00\",\"darkorchid\":\"#9932cc\",\"darkred\":\"#8b0000\",\"darksalmon\":\"#e9967a\",\"darkseagreen\":\"#8fbc8f\",\"darkslateblue\":\"#483d8b\",\"darkslategray\":\"#2f4f4f\",\"darkturquoise\":\"#00ced1\",\n        \"darkviolet\":\"#9400d3\",\"deeppink\":\"#ff1493\",\"deepskyblue\":\"#00bfff\",\"dimgray\":\"#696969\",\"dodgerblue\":\"#1e90ff\",\n        \"firebrick\":\"#b22222\",\"floralwhite\":\"#fffaf0\",\"forestgreen\":\"#228b22\",\"fuchsia\":\"#ff00ff\",\n        \"gainsboro\":\"#dcdcdc\",\"ghostwhite\":\"#f8f8ff\",\"gold\":\"#ffd700\",\"goldenrod\":\"#daa520\",\"gray\":\"#808080\",\"green\":\"#008000\",\"greenyellow\":\"#adff2f\",\n        \"honeydew\":\"#f0fff0\",\"hotpink\":\"#ff69b4\",\n        \"indianred \":\"#cd5c5c\",\"indigo\":\"#4b0082\",\"ivory\":\"#fffff0\",\"khaki\":\"#f0e68c\",\n        \"lavender\":\"#e6e6fa\",\"lavenderblush\":\"#fff0f5\",\"lawngreen\":\"#7cfc00\",\"lemonchiffon\":\"#fffacd\",\"lightblue\":\"#add8e6\",\"lightcoral\":\"#f08080\",\"lightcyan\":\"#e0ffff\",\"lightgoldenrodyellow\":\"#fafad2\",\n        \"lightgrey\":\"#d3d3d3\",\"lightgreen\":\"#90ee90\",\"lightpink\":\"#ffb6c1\",\"lightsalmon\":\"#ffa07a\",\"lightseagreen\":\"#20b2aa\",\"lightskyblue\":\"#87cefa\",\"lightslategray\":\"#778899\",\"lightsteelblue\":\"#b0c4de\",\n        \"lightyellow\":\"#ffffe0\",\"lime\":\"#00ff00\",\"limegreen\":\"#32cd32\",\"linen\":\"#faf0e6\",\n        \"magenta\":\"#ff00ff\",\"maroon\":\"#800000\",\"mediumaquamarine\":\"#66cdaa\",\"mediumblue\":\"#0000cd\",\"mediumorchid\":\"#ba55d3\",\"mediumpurple\":\"#9370d8\",\"mediumseagreen\":\"#3cb371\",\"mediumslateblue\":\"#7b68ee\",\n        \"mediumspringgreen\":\"#00fa9a\",\"mediumturquoise\":\"#48d1cc\",\"mediumvioletred\":\"#c71585\",\"midnightblue\":\"#191970\",\"mintcream\":\"#f5fffa\",\"mistyrose\":\"#ffe4e1\",\"moccasin\":\"#ffe4b5\",\n        \"navajowhite\":\"#ffdead\",\"navy\":\"#000080\",\n        \"oldlace\":\"#fdf5e6\",\"olive\":\"#808000\",\"olivedrab\":\"#6b8e23\",\"orange\":\"#ffa500\",\"orangered\":\"#ff4500\",\"orchid\":\"#da70d6\",\n        \"palegoldenrod\":\"#eee8aa\",\"palegreen\":\"#98fb98\",\"paleturquoise\":\"#afeeee\",\"palevioletred\":\"#d87093\",\"papayawhip\":\"#ffefd5\",\"peachpuff\":\"#ffdab9\",\"peru\":\"#cd853f\",\"pink\":\"#ffc0cb\",\"plum\":\"#dda0dd\",\"powderblue\":\"#b0e0e6\",\"purple\":\"#800080\",\n        \"rebeccapurple\":\"#663399\",\"red\":\"#ff0000\",\"rosybrown\":\"#bc8f8f\",\"royalblue\":\"#4169e1\",\n        \"saddlebrown\":\"#8b4513\",\"salmon\":\"#fa8072\",\"sandybrown\":\"#f4a460\",\"seagreen\":\"#2e8b57\",\"seashell\":\"#fff5ee\",\"sienna\":\"#a0522d\",\"silver\":\"#c0c0c0\",\"skyblue\":\"#87ceeb\",\"slateblue\":\"#6a5acd\",\"slategray\":\"#708090\",\"snow\":\"#fffafa\",\"springgreen\":\"#00ff7f\",\"steelblue\":\"#4682b4\",\n        \"tan\":\"#d2b48c\",\"teal\":\"#008080\",\"thistle\":\"#d8bfd8\",\"tomato\":\"#ff6347\",\"turquoise\":\"#40e0d0\",\n        \"violet\":\"#ee82ee\",\n        \"wheat\":\"#f5deb3\",\"white\":\"#ffffff\",\"whitesmoke\":\"#f5f5f5\",\n        \"yellow\":\"#ffff00\",\"yellowgreen\":\"#9acd32\"\n    };\n\n    // convert DatexCompatValue to css property\n    getCSSProperty(value:Datex.RefOrValue<number|string>, use_css_variables = true, unit?: string):string {\n        // UIX color value\n        // if (use_css_variables && value instanceof Datex.PointerProperty && value.pointer.val == Theme.colors) {\n        //     value = `var(--${value.key})`; // autmatically updated css variable\n        // }\n\n        // number value to unit (default px)\n        if (typeof value == \"number\") return value.toString() + (unit||\"px\");\n\n        else if (use_css_variables) return this.escapeCSSValue(value) ?? '';\n        // try to collapse value\n        else if (value!=undefined) {\n            // css variable\n            if (value.toString().startsWith('var(--')) return this.context.getComputedStyle(this.document.documentElement).getPropertyValue(value?.toString().replace('var(','').replace(')','')).trim();\n            // css color name\n            else if (!value.toString().startsWith(\"#\")) return this.color_names[<keyof typeof this.color_names>value.toString().toLowerCase()] ?? ''\n            // normal string value\n            else return this.escapeCSSValue(value);\n        }\n        else return '';\n    }\n\n\n    escapeCSSValue(value: any) {\n        return (value?.toString() as string).replace(/(;[\\S\\s]*)$/, (_, p1) => {\n            return '/*' + p1.replace(/\\*\\//, \"* /\") + '*/';\n        })\n    }\n    \n\n    valuesToDOMElement(...values:any[]): Node|DocumentFragment {\n        \n        if (values.length == 1) {\n            return this.valueToDOMNode(values[0]).node;\n        }\n        else {\n            const fragment = new this.context.DocumentFragment();\n            values\n                .map(v => this.valueToDOMNode(v).node)\n                .forEach(c=>this.append(fragment, c))\n            return fragment;\n        }\n    }\n\n    valueToDOMNode(value: unknown) {\n\n        let loadPromise: Promise<Node>|undefined\n        let newNode: any;\n\n        // is function\n\n        // collapse pointer if function\n        if (value instanceof Datex.ReactiveValue && typeof value.val == \"function\") {\n            value = value.val;\n        }\n\n        if (typeof value == \"function\") {\n            if (client_type == \"deno\") {\n                newNode = document.createElement(\"uix-placeholder\");\n                this.addProxy(newNode);\n                if ((value as any)[DOMUtils.PLACEHOLDER_CONTENT]) {\n                    this.append(newNode, (value as any)[DOMUtils.PLACEHOLDER_CONTENT]);\n                }\n                newNode![DX_REPLACE] = value;\n            }\n            else {\n                if (value instanceof JSTransferableFunction) {\n                    // waits until lazy dependencies are loaded\n                    value = value.callLazy()\n                }\n                else {\n                    value = value()\n                }\n            }\n        }\n\n        // wait for lazyPointer or lazy pointer property (convert to promise)\n        if (\n            value instanceof LazyPointer ||\n            (value instanceof Datex.PointerProperty && value.lazy_pointer)\n        ) {\n            const lazyPtr = value;\n            value = new Promise(resolve => lazyPtr.onLoad(v => resolve(v)));\n        }\n\n\n        // wait for promise\n        if (value instanceof Promise) {\n            loadPromise = value.then(v=>{\n                const node = this.valuesToDOMElement(v);\n                placeholder.replaceWith(node)\n                return node;\n            });\n\n            const placeholder = this.document.createElement(\"uix-placeholder\")\n            this.addProxy(placeholder);\n            newNode = placeholder;\n        }\n        else if (newNode == undefined) {\n            newNode = value;\n        }\n\n        // // is uix-fragment: no additional reactive wrapper needed, just return the fragment\n        // if (newNode instanceof Datex.ReactiveValue && newNode.val instanceof HTMLElement && newNode.val.tagName.toLowerCase() == \"uix-fragment\") {\n        //     newNode = newNode.val;\n        // }\n\n        // unsupported value - create text/content node\n        if (!(newNode instanceof this.context.Node || newNode instanceof this.context.DocumentFragment || newNode instanceof this.context.Comment)) {\n            newNode = this.getNode(newNode);\n        }\n\n        return {\n            node: newNode,\n            loadPromise\n        }\n    }\n\n    getNode(content:any) {\n        const contentVal = val(content);\n        // either use existing node or create new text node\n        const node = contentVal instanceof Node ? contentVal : this.document.createTextNode(\"\") as unknown as Text;\n        (node as any)[DX_VALUE] = content;\n\n        // lazy pointer or lazy pointer property\n        if (\n            content instanceof LazyPointer || \n            (content instanceof PointerProperty && content.lazy_pointer)\n        ) {\n            content.onLoad(() => {\n                this.bindNode(node, content)\n            })\n        }\n        // ref\n        else if (content instanceof Datex.ReactiveValue) {\n            this.bindNode(node, content)\n        }     \n       \n        else {\n            node.textContent = (content!=undefined && content!==false) ? (<any>content).toString() : ''\n        }\n\n        return node;\n    }\n\n    bindNode(node: Node, ref:Datex.RefLike<unknown>) {\n\n        weakAction({node}, \n            ({node}) => {\n                use(\"allow-globals\", logger, Datex, isolatedScope, ref);\n\n                let prevNode:{node?:WeakRef<Node>} = {node};\n\n                // TODO: dont reference 'ref' in handler, use args from handler\n                const handler = isolatedScope((...args:any[]) => {\n                    use(\"allow-globals\", logger, ref, prevNode);\n\n                    let prevNodeDeref = prevNode.node?.deref();\n                    if (!prevNodeDeref) return;\n\n                    try {\n                        let val = ref.val;\n\n                        // replace previous node if it is a node, otherwise update text content\n                        if (val instanceof Node) {\n                            if (val instanceof DocumentFragment) {\n                                const childNodes = val.childNodes;\n                                val = document.createElement(\"uix-fragment\");\n                                val.append(...childNodes);\n                            }\n                            prevNode.node = new WeakRef(val);\n                            prevNodeDeref.replaceWith(val);\n                        }\n                        else {\n                            if (!(prevNodeDeref instanceof Text)) {\n                                const node = document.createTextNode(\"\");\n                                prevNode.node = new WeakRef(node);\n                                prevNodeDeref.replaceWith(node);\n                                prevNodeDeref = node;\n                            }\n                            prevNodeDeref.textContent = (val!=undefined && val!==false) ? (<any>val).toString() : ''\n                        }\n                        \n                    }\n                    catch (e) {\n                        // console.error(e)\n                    }  \n                });\n\n                // TODO: potential memory leak\n                if (ref instanceof Datex.Pointer) ref.is_persistent = true;\n\n                Datex.ReactiveValue.observeAndInit(ref, handler);\n                return handler;\n            }, \n            (handler, _, deps) => {\n                use(\"allow-globals\", Datex, ref);\n                ref.is_persistent = false;\n                Datex.ReactiveValue.unobserve(ref, handler)\n            }\n        );   \n    }\n\n    replaceWith(node: Element, newContent: any, lazy = false) {\n\n        const {node: newNode, loadPromise} = this.valueToDOMNode(newContent)\n\n        // only replace when loaded\n        if (lazy && loadPromise) {\n            return loadPromise.then(v => {\n                node.replaceWith(v)\n            })\n        }\n        // replace immediately\n        else node.replaceWith(newNode);\n    }\n\n    /**\n     * \n     * @param anchor \n     * @param element \n     * @param appendAll if false, only shadowRoot is set, other elements are ignored\n     * @returns true if element appended\n     */\n    appendElementOrShadowRoot(anchor: Element|DocumentFragment, element: Element|DocumentFragment|Text, appendAll = true, insertAfterAnchor = false, onAppend?: ((list: (Node)[]) => void)) {\n        const appendedContent: Node[] = [];\n\n        for (const candidate of (element instanceof this.context.DocumentFragment ? [...(element.childNodes as any)] : [element]) as unknown as Node[]) {\n            if (anchor instanceof this.context.HTMLElement && candidate instanceof this.context.HTMLTemplateElement && candidate.hasAttribute(\"shadowrootmode\")) {\n                if (anchor.shadowRoot) throw new Error(\"element <\"+anchor.tagName.toLowerCase()+\"> already has a shadow root\")\n                const shadowRoot = anchor.attachShadow({mode: (candidate.getAttribute(\"shadowrootmode\")??\"open\") as \"open\"|\"closed\"});\n                shadowRoot.append((candidate as HTMLTemplateElement).content);\n                appendedContent.push(shadowRoot);\n                if (!appendAll) {\n                    onAppend?.(appendedContent);\n                    return true;\n                }\n            }\n            else if (appendAll) {\n                if (insertAfterAnchor)\n                    anchor.parentElement?.insertBefore(candidate, anchor.nextSibling); // anchor is sibbling (e.g. old elem)\n                else anchor.append(candidate); // anchor is parent\n                appendedContent.push(candidate)\n            }\n        }\n        onAppend?.(appendedContent);\n        return appendAll;\n    }\n\n    // jquery-like event listener (multiple events at once)\n    addEventListener<E extends HTMLElement>(target:E, events:string, listener: (this: HTMLElement, ev: Event) => any, options?: boolean | AddEventListenerOptions){\n        for (const event of events.split(\" \")){\n            target.addEventListener(event.trim(), listener, options);\n        }\n    }\n\n    removeEventListener<E extends HTMLElement>(target:E, events:string, listener: (this: HTMLElement, ev: Event) => any, options?: boolean | AddEventListenerOptions){\n        for (const event of events.split(\" \")){\n            target.removeEventListener(event.trim(), listener, options);\n        }\n    }\n\n    // jquery-like event listener (multiple events at once + delegate with query selector)\n    addDelegatedEventListener<E extends Element>(target:E, events:string, selector:string,  listener: (this: Element, ev: Event) => any, options?: boolean | AddEventListenerOptions){\n        for (const event of events.split(\" \")){\n            target.addEventListener(event.trim(), (event) => {\n                if (event.target && event.target instanceof this.context.Element && event.target.closest(selector)) {\n                    listener.call(event.target, event)\n                }\n            }, options);\n        }\n    }\n\n    addProxy(element:Element) {\n        return $(element)\n    }\n}\n"],"names":["Datex","defaultElementAttributes","elementEventHandlerAttributes","htmlElementAttributes","mathMLTags","svgElementAttributesLowercase","svgTags","IterableHandler","DX_VALUE","DX_REPLACE","PointerProperty","JSTransferableFunction","client_type","weakAction","LazyPointer","isolatedScope","Time","JSX_INSERT_STRING","Symbol","logger","Logger","DOMUtils","EVENT_LISTENERS","for","ATTR_BINDINGS","ATTR_DX_VALUES","STYLE_DX_VALUES","STYLE_WEAK_PROPS","CHILDREN_DX_VALUES","ATTR_SELECTED_BINDING","DATEX_UPDATE_TYPE","PLACEHOLDER_CONTENT","svgNS","mathMLNS","constructor","context","defaultInputValidation","message","enabled","element_bound_html_values","WeakMap","element_bound_text_values","updateElementHTML","html","Element","innerHTML","append","updateElementText","text","ReactiveValue","console","warn","Markdown","getHTML","children","_use_markdown","innerText","toString","color_names","document","escapeHtml","str","replace","replaceAll","createHTMLElement","content","undefined","template","createElement","trim","element","firstChild","collapseValue","HTMLElement","setElementHTML","Array","el","container","setElementText","get","unobserve","call","val","observe","set","markdown","tagName","has","createElementNS","parent","DocumentFragment","_uix_children","collapsedChildren","isRef","Map","Set","_append","isArray","ref","Pointer","getByValue","add","startAnchor","Comment","idString","endAnchor","getAbsoluteOffset","k","startOffset","from","childNodes","indexOf","iterableHandler","map","v","node","valueToDOMNode","onEntryRemoved","relative_k","remove","onNewEntry","p","current","replaceChild","childrenArray","startAnchorIndex","totalParentSectionLength","endAnchorIndex","i","insertBefore","onEmpty","nextSibling","removing","removeChild","DISPOSABLES","HTMLTemplateElement","toLowerCase","reactiveProps","find","e","setLiveAttribute","child","appendElementOrShadowRoot","setElementAttribute","attr","value","rootPath","startsWith","includes","HTMLInputElement","getAttribute","type","Error","Promise","then","pointerifyValue","lazy_pointer","onLoad","setAttribute","handleSetVal","number","isNaN","Number","setCustomValidity","reportValidity","bigint","match","Boolean","BigInt","setVal","isInputElement","isSelectElement","isTextareaElement","isDateInput","Type","ofValue","Conjunction","t","event","matchesType","std","addEventListener","inputElement","decimal","valueAsDate","Date","integer","boolean","void","null","time","observer","MutationObserver","attributes","attributeFilter","checked","valid","use","handler","deref","_","currentVal","args","isNormalFunction","fnSrc","root_path","endsWith","HTMLMediaElement","muted","functionIsAsync","createAsync","fn","source","deps","create","option","HTMLOptionElement","getTime","newValue","formatAttributeValue","HTMLDialogElement","theVal","showModal","close","observeAndInit","setCSSProperty","update","key","classList","updateAll","obj","Object","entries","previousArray","updateArray","arr","UPDATE_TYPE","INIT","removeAttribute","HTMLVideoElement","globalThis","MediaStream","srcObject","eventName","listener","isStandalone","removeEventListener","log","HTMLFormElement","ptr","createOrGet","is_persistent","is_origin","hasAttribute","getFormattedWeek","d","UTC","getFullYear","getMonth","getDate","setUTCDate","getUTCDate","getUTCDay","yearStart","getUTCFullYear","weekNo","Math","ceil","padStart","getDateFromFormattedWeek","weekString","year","week","split","RangeError","isInteger","TypeError","simple","dayOfWeek","getDay","isoWeekStart","setDate","unixTime","showSeconds","step","getTimezoneOffset","toISOString","slice","date","URL","setCSS","properties_object_or_property","properties","Value","property","enableCSSPropertyWeakBinding","weak","weakBinding","unit","x","style","removeProperty","CSS","supports","setProperty","getCSSProperty","use_css_variables","escapeCSSValue","getComputedStyle","documentElement","getPropertyValue","p1","valuesToDOMElement","values","length","fragment","forEach","c","loadPromise","newNode","addProxy","callLazy","lazyPtr","resolve","placeholder","replaceWith","Node","getNode","contentVal","createTextNode","bindNode","textContent","prevNode","prevNodeDeref","WeakRef","Text","newContent","lazy","anchor","appendAll","insertAfterAnchor","onAppend","appendedContent","candidate","shadowRoot","attachShadow","mode","push","parentElement","target","events","options","addDelegatedEventListener","selector","closest","$"],"mappings":"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","sourceRoot":"/lib/uix-0.4.39/src/uix-dom/datex-bindings/","file":"dom-utils.ts"}