{"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    }\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\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 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,k) => {\n                    // remove kth child\n                    const node = parent.childNodes[k+1];\n                    // out of bounds\n                    if (!node || node === endAnchor || node === startAnchor){\n                        return;\n                    }\n                    node.remove();\n                },\n                onNewEntry(v,k,p)  {\n                    // if kth child exists, replace, otherwise append at end\n                    const current = parent.childNodes[k+1];\n                    if (current && current != endAnchor) parent.replaceChild(v, current);\n                    else {\n                        // fill gap if k is larger than current children\n                        if (k > parent.childNodes.length-2) {\n                            for (let i = parent.childNodes.length-2; i < 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 = 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\") {\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        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:out\" || attr == \"value:in\" || attr == \"value\")) {\n\n            const event = isSelectElement ? 'change' : 'input';\n            const inputElement = element as unknown as HTMLInputElement;\n\n            // out\n            if (attr == \"value\" || attr == \"value:out\") {\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, () => this.handleSetVal(value, inputElement, inputElement.value, \"number\"))\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                    handleSetVal(new Time((element as unknown as HTMLInputElement).valueAsDate ?? new Date((element as unknown as HTMLInputElement).value)))\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            // in\n            if (attr == \"value\" || attr == \"value:in\") {\n                const valid = 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)\n                            const handler = isolatedScope(v => {\n                                use(\"allow-globals\", this, logger, rootPath, element)\n                                const deref = element.deref();\n                                if (!deref) {\n                                    logger.warn(\"Undetected garbage collection (uix-w0001)\");\n                                    return;\n                                }\n                                this.setAttribute(deref, \"value\", v, rootPath);\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\")) 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                (element as HTMLInputElement).value = this.formatAttributeValue(val, root_path, element)\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, 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\" && 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, root_path, element));\n            }\n            \n        }\n    \n        // normal attribute\n        else {\n            if (val === false) element.removeAttribute(attr);\n            else if (val === true) element.setAttribute(attr, \"\");\n            else element.setAttribute(attr, this.formatAttributeValue(val, root_path, element));\n        }\n\n    \n        return true;\n        \n    }\n\n    formatAttributeValue(val:any, root_path?:string|URL, element?:Element): string {\n        if (root_path==undefined) return val?.toString?.() ?? \"\"\n        else if (typeof val == \"string\" && (val.startsWith(\"./\") || val.startsWith(\"../\"))) return new URL(val, root_path).toString();\n        else if (val instanceof Date) {\n            if ((element as HTMLInputElement).type == \"datetime-local\") return new Date(val.getTime() + new Date().getTimezoneOffset() * -60 * 1000).toISOString().slice(0,-8);\n            else return val.toISOString().slice(0,10);\n        }\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        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):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))\n                    // @ts-ignore style property access\n                    else element.style[property] = this.getCSSProperty(v);\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):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 px\n        if (typeof value == \"number\") return value.toString() + \"px\";\n\n        else if (use_css_variables) return value?.toString() ?? '';\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 color_names[<keyof typeof color_names>value.toString().toLowerCase()] ?? ''\n            // normal string value\n            else return value.toString()\n        }\n        else return '';\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\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.log(\"Error binding node\", ref, ref.val, prevNodeDeref)\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","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","iterableHandler","map","v","k","node","valueToDOMNode","onEntryRemoved","childNodes","remove","onNewEntry","p","current","replaceChild","length","i","insertBefore","onEmpty","nextSibling","removing","removeChild","DISPOSABLES","HTMLTemplateElement","toLowerCase","reactiveProps","find","e","setLiveAttribute","child","appendElementOrShadowRoot","setElementAttribute","attr","value","rootPath","startsWith","includes","HTMLInputElement","getAttribute","Promise","then","pointerifyValue","lazy_pointer","onLoad","setAttribute","handleSetVal","type","number","isNaN","Number","setCustomValidity","reportValidity","bigint","match","Boolean","BigInt","setVal","isInputElement","isSelectElement","isTextareaElement","Type","ofValue","Conjunction","t","event","matchesType","std","addEventListener","inputElement","decimal","integer","boolean","void","null","time","valueAsDate","Date","Error","valid","use","handler","deref","_","checked","currentVal","args","isNormalFunction","fnSrc","root_path","endsWith","HTMLMediaElement","muted","functionIsAsync","createAsync","fn","source","deps","create","option","HTMLOptionElement","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","URL","getTime","getTimezoneOffset","toISOString","slice","setCSS","properties_object_or_property","properties","Value","property","enableCSSPropertyWeakBinding","weak","weakBinding","x","style","removeProperty","CSS","supports","setProperty","getCSSProperty","use_css_variables","pointer","Theme","colors","getComputedStyle","documentElement","getPropertyValue","valuesToDOMElement","values","fragment","forEach","c","loadPromise","newNode","addProxy","callLazy","lazyPtr","resolve","placeholder","replaceWith","Node","getNode","contentVal","createTextNode","bindNode","textContent","prevNode","prevNodeDeref","WeakRef","Text","error","newContent","lazy","anchor","appendAll","insertAfterAnchor","onAppend","appendedContent","candidate","hasAttribute","shadowRoot","attachShadow","mode","push","parentElement","target","events","options","split","addDelegatedEventListener","selector","closest","$"],"mappings":"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","sourceRoot":"/lib/uix-0.3.30/src/uix-dom/datex-bindings/","file":"dom-utils.ts"}