{"version":3,"file":"index.cjs","sources":["../src/utils.ts","../src/dispose.ts","../src/observable.ts","../src/react-to.ts","../src/prop.ts","../src/role.ts","../src/follow.ts"],"sourcesContent":["type DebugSpec = boolean | \"verbose\";\n\nlet debug : DebugSpec = false;\n\n/** Set debug messaging to true, false, or \"verbose\". */\nexport const setDebug = (\n    value : DebugSpec = true\n) => debug = value; \n\n/** Get current debug configuration value. */\nexport const getDebug = () => debug;\n\n/** Debounce a function */\nexport const debounce = (\n    func : (...args : any[]) => void, \n    delay = 100\n) : any => {\n    let timeoutId : number;\n    \n    return (...args : any) => {\n        clearTimeout(timeoutId);\n        timeoutId = setTimeout(() => queueMicrotask(() => func(...args)), delay);\n    };\n}\n\nconst idMap = new Map();\n\n/** Create an ID, potentially with a reference name and format. */\nexport const id = (\n    idName = \"\", \n    idFormat : ((\n        id: string, \n        idName? : string\n    ) => string) = (id, idName?) => `${idName}${idName ? \"-\" : \"\"}${id}`\n) => {\n    const uniqueId = Math.random().toString(36).substring(2, 11);\n    const id = idFormat(uniqueId, idName);\n    idMap.set(idName, id);\n    return id;\n}\n\n/** Get an ID by reference name. */\nexport const getId = (\n    idName = \"\"\n) => idMap.get(idName);\n\n/** Log message helper function. */\nexport const logMessage = (\n    value : any, \n    func : any\n) => {\n    let strValue = JSON.stringify(value) ?? \"undefined\";\n    if(strValue.length > 80) {\n        strValue = strValue.slice(0,77) + \"...\";\n    }\n    let strFunc = `${func}`;\n    if(func.length > 80) {\n        strFunc = strFunc.slice(0,77) + \"...\";\n    }\n    return `${strValue} ➤ ${strFunc}`;\n}\n\n/** Is the obj an instance of a function. */\nexport const isFunction = (\n    obj : any\n) => obj instanceof Function;\n\n/** A value or a function that returns a value. */\nexport type Factor<T> = T | (() => T);\n\n/** Evaluate a factor */\nexport const evalFactor = <T>(\n    val : Factor<T>\n) => isFunction(val) ? (val as () => T)() : val as T;\n\n/** Typescript filter to specify the key of an object has a certain value type. */\nexport type KeyOf<Obj, Type> = {\n    [K in keyof Obj]: Obj[K] extends Type ? K : never;\n}[keyof Obj];\n\n","import { getDebug } from \"./utils.ts\";\n\nconst disposables = new WeakMap<any, Set<(() => any)>>();\n\nlet currentDisposable = Symbol(\"global\");\n\n/** Register a dispose function. */\nexport const shouldDispose = (\n    disposer : () => any\n) => {\n    const disposers = disposables.get(currentDisposable) ?? new Set<(() => any)>();\n    disposers.add(disposer);\n    disposables.set(currentDisposable, disposers)\n    return disposer;\n}\n\n/** Dispose all items associated with an object. */\nexport const dispose = (\n    obj : any, \n    additionalInfo : any = \"\"\n) => {\n    const disposers = disposables.get(obj) ?? new Set<(() => any)>();\n    disposables.delete(obj);\n    if(getDebug() === \"verbose\" && disposers.size) {\n        console.log(`disposing ${obj.toString()} ${additionalInfo}`);\n    }\n    for(const disposer of [...disposers]) {\n        if(getDebug() === \"verbose\" && disposers.size) {\n            console.log(`disposing ${obj.toString()} ${disposer}`);\n        }\n        disposer();\n    }\n}\n\n/** Associate disposable items (created by an initializer) with an object. */\nexport const disposable = (\n    obj : any, \n    initializer : () => any\n) => {\n    const save = currentDisposable;\n    currentDisposable = obj;\n    try {\n        return initializer();\n    } finally {\n        currentDisposable = save;\n    }\n}","import { shouldDispose } from \"./dispose.ts\";\nimport { getDebug } from \"./utils.ts\";\n\nexport type GetEvent = {\n    action : string;\n    proxy: any;\n    prop: string | symbol;\n}\n\nexport type GetHook = (event: GetEvent) => any;\n\nexport type SubscribeEvent<Target, Value> = {\n    action : string;\n    target : Target;\n    prop : string | symbol;\n    value? : Value;\n    oldValue : Value;\n}\n\nexport type SubscribeCallback<Target, Value> = (event: SubscribeEvent<Target, Value>) => any;\n\nconst targetSymbol = Symbol(\"target\");\nlet nextTargetId = 1;\n\nlet getHook : GetHook | undefined;\n\n/** Monitor observable get events. */\nexport const setGetHook = (hook? : GetHook) => getHook = hook;\n\n/** Get the unique identifier for a observable target. */\nexport const getTargetId = (p : any) => p?.[targetSymbol];\n\nconst isSameTarget = (a : any, b : any) => (getTargetId(a) ?? a) === (getTargetId(b) ?? b);\n\nconst targetProxy = new Map();\nconst subscriberTargets = new Map();\n\n/** Subscribe to changes made to an observable. */\nexport const subscribe = <Target, Value>(\n    proxy : Target, \n    prop : string | symbol | null, \n    callback : SubscribeCallback<Target, Value>\n) => {\n    const targetId = getTargetId(proxy);\n\n    if(!targetId) {\n        throw new Error(\"Object must be observable.\")\n    }\n\n    const subscriber = {\n        prop,\n        callback\n    }\n\n    if(!subscriberTargets.has(targetId)) {\n        subscriberTargets.set(targetId, new Set());\n    }\n\n    subscriberTargets.get(targetId).add(subscriber);\n\n    return shouldDispose(() => subscriberTargets.get(targetId)?.delete(subscriber));\n}\n\nconst onChange = <Target, Value>({ action, target, prop, value, oldValue } : SubscribeEvent<Target, Value>) => {\n    if(subscriberTargets.has(getTargetId(target))) {\n        const subscribers = [...subscriberTargets.get(getTargetId(target))].filter(s => prop == s.prop || !s.prop);\n\n        if(getDebug() === \"verbose\") {\n            console.log({ count: subscribers.length, action, targetId: getTargetId(target), prop, value, oldValue })\n        }\n\n        for(const subscriber of subscribers) {\n            queueMicrotask(() => subscriber.callback({ action, prop, value, oldValue }));\n        }\n    }\n}\n\n/** Make a \"plain old JS object\" into an observable object. */\nexport const observable = <Target>(target : Target) : Target => {\n \n    const createProxy = (target : any) => {\n\n        let targetId = Reflect.get(target, targetSymbol, target);\n        if(!targetId) {\n            targetId = nextTargetId++;\n\n            Reflect.defineProperty(target, targetSymbol, {\n                value: targetId,\n                writable: false,\n                enumerable: false,\n                configurable: false\n            });\n        }\n\n        const current = new Proxy(target, {\n            get: (target, prop, receiver) => {\n\n                if(prop === targetSymbol) {\n                    return targetId;\n                }\n                getHook?.({ action: \"get\", proxy: current, prop })\n            \n                const value = target[prop];\n\n                if (typeof value === 'object' && value !== null) {\n                    return targetProxy.get(getTargetId(value)) ?? createProxy(value);\n                }\n\n                return Reflect.get(target, prop, receiver);\n            },\n            set: (target, prop, value, receiver) => {\n                const oldValue = Reflect.get(target, prop, receiver);\n\n                if(isSameTarget(value, oldValue)) {\n                    return true;\n                }\n\n                const result = Reflect.set(target, prop, value, receiver);\n\n                onChange({action: \"set\", target, prop, value, oldValue});\n\n                return result;\n            },\n            deleteProperty: (target, prop) => {\n                const oldValue = Reflect.get(target, prop);\n                const result = Reflect.deleteProperty(target, prop);\n\n                onChange({ action: \"delete\", target, prop, oldValue});\n\n                return result;\n            }\n        });\n\n        targetProxy.set(getTargetId(target), current);\n\n        return current;\n    }\n\n    return createProxy(target);\n}","import {\n    disposable, dispose, shouldDispose\n} from \"./dispose.ts\";\n\nimport {\n    getTargetId, observable, setGetHook, subscribe,\n    type GetEvent\n} from \"./observable.ts\";\n\nimport {\n    debounce, evalFactor, getDebug, logMessage, type Factor\n} from \"./utils.ts\";\n\n/** API returned by reactTo. */\ntype ReactToApi<T> = {\n    /** React to a value change with a callback */\n    with : (\n        withCallback: (value?: T) => any, \n        options? : { reset? : boolean }\n    ) => ReactToApi<T>;\n\n    /** React to a value change with a complete reinitialization. */\n    withReset : (\n        withCallback: (value?: T) => any\n    ) => ReactToApi<T>;\n}\n\n/** React to a changing value */\nexport const reactTo = <T>(\n    func : Factor<T>, \n    delay = 0\n) => {\n    const state = observable({\n        computed: undefined as T\n    });\n\n    const events : GetEvent[] = [];\n\n    const hook = (\n        event : GetEvent\n    ) => {\n        if(!events.some(e => getTargetId(e.proxy) === getTargetId(event.proxy) && e.prop === event.prop)) {\n            events.push(event);\n            subscribe(event.proxy, event.prop, compute);\n        }\n    }\n\n    const reactToObj = Symbol(\"reactTo\");\n    shouldDispose(() => dispose(reactToObj, func));\n\n    let compute = () => {\n        return disposable(reactToObj, () => {\n            try {\n                setGetHook(hook);\n                state.computed = evalFactor(func);\n                setGetHook();\n            } finally {\n                setGetHook();\n            } \n        });   \n    }\n\n    compute();\n\n    const withObj = Symbol(\"with\");\n    shouldDispose(() => dispose(withObj));\n\n    const reactToApi = {\n        with: (\n            withCallback: (value?: T) => any, \n            { reset } : { reset? : boolean } = {}\n        ) => {\n            const wrapped = () => {\n                if(reset) {\n                    dispose(withObj, withCallback);\n                }\n                disposable(withObj, () => withCallback(state.computed));\n            }\n            disposable(reactToObj, () => {\n                subscribe(state, \"computed\", debounce(({ value }) => {\n                    if(getDebug()) {\n                        console.log(logMessage(value, func));\n                    }\n                    wrapped();\n                }, delay));\n                wrapped(); \n            })\n            return reactToApi;\n        },\n\n        withReset: (\n            withCallback: (value?: T) => any\n        ) => reactToApi.with(withCallback, { reset: true })\n\n    } as ReactToApi<T>;\n\n    return reactToApi;\n}\n\n// export const compute = <Target, Value>(\n//     target : Factor<Target>, \n//     prop : KeyOf<Target, Value | undefined>) => ({\n//     with: (value : () => Value) => reactTo(value).with((v) => {\n//         const t = evalFactor(target) as Target;\n//         if(t) {\n//             (t as any)[prop] = v;\n//         }\n//     })\n// });\n\n/** Log changes to a value */\nexport const log = (\n    signal : Factor<any>\n) => reactTo(signal).with(v => console.log(logMessage(v, signal)));\n","import { reactTo } from \"./react-to.ts\";\nimport { evalFactor, type Factor, type KeyOf } from \"./utils.ts\";\n\n/** A property has value property, and is also a getter function. */\nexport type Property<Value> = { \n    value : Value;\n    compute : (func: () => Value) => Property<Value>;\n} & (() => Value);\n\n/** Create a property from a target object and a property name. */\nexport const prop = <Target, Value>(\n    target : Factor<Target>, \n    prop : KeyOf<Target, Value>\n) : Property<Value> => {\n    const getTarget = () => evalFactor(target);\n    const getProp = () => getTarget()?.[prop];\n    \n    Object.defineProperty(getProp, \"value\", {\n        get: getProp,\n        set: (value : Value) => (getTarget() as any)[prop] = value\n    });\n\n    getProp.compute = (funct : () => Value) => { \n        reactTo(() => getTarget() && funct())\n            .with((value : Value | undefined) => { \n                if(getTarget()) {\n                    (getTarget() as any)[prop] = value; \n                }\n            }); \n        return getProp;\n    };\n\n    return getProp as Property<Value>;\n}","import { disposable, dispose, shouldDispose } from \"./dispose.ts\";\nimport { getTargetId, subscribe } from \"./observable.ts\";\nimport { reactTo } from \"./react-to.ts\";\nimport { type Property } from \"./prop.ts\";\nimport { evalFactor, type Factor } from \"./utils.ts\";\n\n/** Event listener helper that disposes listeners properly */\nexport const on = (\n    el : any, \n    eventNames : string, \n    handler : (event : Event) => any, options? : any\n) => {\n    for(const eventName of eventNames.split(\" \")) {\n        el.addEventListener(eventName, handler, options);\n        shouldDispose(() => el.removeEventListener(eventName, handler));\n    }\n}\n\nlet hideClass = \"\";\n\n/** Set configuration to hide elements using a class name instead of \"display: none;\" */\nexport const hideWithClass = (\n    className : string\n) => hideClass = className;\n\n/** HTMLElement wrapper with reactive helper functions. */\nexport type RoleApi<El extends Element | null> = {\n    readonly el : El; \n\n    /** Select a child of the current root element. */\n    select: <ChildEl extends Element | null>(\n        selector : string, \n        options? : { optional? : boolean; }\n    ) => RoleApi<ChildEl>;\n\n    /** Iterate over a selection of elements contained in current root element. */\n    selectAll: <ChildEl extends Element | null>(\n        selector : string, \n        child : (api : RoleApi<ChildEl>) => any\n    ) =>  RoleApi<El>;\n\n    /** Select an element by data-role. */\n    role: <ChildEl extends Element | null>(\n        roleName : string, \n        options? : { optional? : boolean; }\n    ) => RoleApi<ChildEl>;\n\n    /** Call a connector to delegate connecting. */\n    connect: (\n        connector: (api : RoleApi<El>) => any\n    ) => RoleApi<El>;\n\n    /** Connect a class */\n    class: (\n        className : string, \n        hasClass : Factor<any>\n    ) => RoleApi<El>;\n\n    /** Connect a style of the current element. */\n    style: (\n        styleName : string, \n        styleValue : Factor<string | null>\n    ) => RoleApi<El>;\n\n    /** Show/Hide the current element */\n    show: (\n        isShown : Factor<any>\n    ) => RoleApi<El>;\n\n    /** Connect an attribute of the current element. */\n    attribute: (\n        attributeName : string, \n        attributeValue : Factor<string | null>\n    ) => RoleApi<El>;\n\n    /** React to an attribute change. */\n    onAttribute: (\n        attributeName : string, \n        func : (value: string | null) => any\n    ) => RoleApi<El>;\n\n    /** Connect the value of the current element. */\n    value: (\n        value : Factor<any>\n    ) => RoleApi<El>;\n\n    /** Connect the text content of the current element. */\n    text: (\n        text : Factor<string>\n    ) => RoleApi<El>;\n\n    /** Connect the inner HTML of the current element. */\n    html: (\n        html: Factor<string>\n    ) => RoleApi<El>;\n\n    /** React to an event on the current element. */\n    on: (\n        eventNames : string, \n        handler : (event : Event) => any, \n        options? : any\n    ) => RoleApi<El>;\n\n    /** Connect a property to an element that allows input. */\n    model: <Value>(\n        p : Property<Value>\n    ) => RoleApi<El>;\n\n    /** Connect an iterated set items, creating child elements via template. */\n    for: <ChildEl extends Element, T>(\n        items : Factor<Array<T> | undefined>, \n        itemConnector? : (root : RoleApi<ChildEl>, context: T) => any\n    ) => RoleApi<El>,\n}\n\nexport const createApi = <El extends Element | null>(\n    element : El = null as El\n) : RoleApi<El> => {\n\n    const api : RoleApi<El> = {\n        get el() { return element; },\n\n        select: <ChildEl extends Element | null>(\n            selector : string, \n            { optional } : { optional? : boolean } = {}\n        ) => {\n            if(!api.el) return createApi();\n\n            const element = api.el.querySelector(selector) as ChildEl;\n            if(!element && !optional) {\n                throw new Error(`Element not found for selector: \"${selector}\"`)\n            }\n\n            return createApi<ChildEl>(element);\n        },\n\n        selectAll: <ChildEl extends Element | null>(\n            selector : string, \n            connect : (api : RoleApi<ChildEl>) => any\n        ) => {\n            if(!api.el) return createApi();\n\n            const elements = [...api.el.querySelectorAll(selector)] as ChildEl[];\n\n            elements.forEach((e) => connect(createApi<ChildEl>(e)));\n\n            return api;\n        },\n\n        role: (\n            roleName : string, \n            options?: { optional? : boolean; } \n        ) => api.select(`[data-role='${roleName}']`, options),\n\n        connect: (\n            connector: (api : RoleApi<El>) => any\n        ) => {\n            if(!api.el) return createApi();\n\n            connector(api);\n            return api; \n        },\n\n        class: (\n            className : string, \n            hasClass : Factor<any>\n        ) => {\n            if(api.el) {\n                const el = api.el as Element;\n\n                reactTo(hasClass).with(value => {\n                    if(value) {\n                        el.classList.add(className);\n                    } else {\n                        el.classList.remove(className);\n                        if (el.classList.length === 0) {\n                            el.removeAttribute('class');\n                        }\n                    }\n                });\n            }\n            return api;\n        },\n\n        style: (\n            styleName : string, \n            styleValue : Factor<string | null> \n        ) => {\n            if(api.el) {\n                reactTo(styleValue).with(value => (api.el as HTMLElement).style.setProperty(styleName, value ?? null));\n            }\n            return api;\n        },\n\n        show: (\n            condition : () => Factor<any>\n        ) => {\n            if(hideClass) {\n                return api.class(hideClass, () => !evalFactor(condition));\n            } else {\n                return api.style(\"display\", () => evalFactor(condition) ? null : \"none\");\n            }\n        },\n\n        attribute: (\n            attributeName : string, \n            attributeValue? : Factor<string | null>\n        ) => {\n            if(api.el) {\n                const el = api.el as Element;\n\n                reactTo(attributeValue).with(value => {\n                    if(value == null) {\n                        el.removeAttribute(attributeName);\n                    } else {\n                        el.setAttribute(attributeName, value);\n                    }\n                });\n            }\n            return api;\n        },\n\n        onAttribute: (\n            attributeName : string, \n            func : (value: string | null) => any\n        ) => {\n            if(api.el) {\n                const f = () => func(api.el?.getAttribute(attributeName) ?? null);\n\n                const observer = new MutationObserver(f);\n                observer.observe(api.el, {attributes: true, attributeFilter: [attributeName]})\n                shouldDispose(() => observer.disconnect());\n                \n                f();\n            }\n            return api;\n        },\n\n        value: (\n            value: Factor<any>\n        ) => {\n            if(api.el) {\n                reactTo(value).with(value => (api.el as HTMLInputElement).value = value);\n            }\n            return api;\n        },\n\n        text: (\n            text: Factor<string>\n        ) => {\n            if(api.el) {\n                reactTo(text).with(text => (api.el as Element).textContent = text ?? null);\n            }\n            return api;\n        },\n\n        html: (\n            html: Factor<string>\n        ) => {\n            if(api.el) {\n                reactTo(html).with(html => (api.el as Element).innerHTML = html ?? \"\");\n            }\n            return api;\n        },\n\n        on: (\n            eventNames : string, \n            handler : (event : Event) => any, \n            options? : any\n        ) => {\n            if(api.el) {\n                on(api.el as Element, eventNames, handler, options);\n            }\n            return api;\n        },\n\n        model: (\n            prop : Property<any>\n        ) => {\n            if(api.el) {\n                const el = api.el as HTMLInputElement;\n                const type = el.getAttribute(\"type\")?.toUpperCase();\n\n                if(api.el.tagName === \"INPUT\" && type === \"CHECKBOX\") {\n                    reactTo(prop).with(value => el.checked = !!value);\n                    api.on(\"change\", () => prop.value = el.checked);\n                } else if(api.el.tagName === \"INPUT\" && type === \"RADIO\") {\n                    api.attribute(\"checked\", () => prop.value == el.getAttribute(\"value\") ? \"\" : null)\n                    api.on(\"change\", () => prop.value = el.value);\n                } else if((el.getAttribute(\"contenteditable\") || \"false\").toLowerCase() !== \"false\" ) {\n                    reactTo(prop).with(value => {\n                        if(value != el.innerHTML) {\n                            el.innerHTML = value?.toString() ?? \"\"; \n                        }\n                    });\n                    api.on(\"blur\", () => prop.value = el.innerHTML);\n                } else {\n                    api.value(() => prop.value?.toString() ?? \"\");\n                    api.on(\"change\", () => prop.value = el.value);\n                }\n            }\n            return api;\n        },\n\n        for: <ChildEl extends Element, T>(\n            items : Factor<Array<T> | undefined>, \n            itemConnector : (root : RoleApi<ChildEl>, \n            context: T) => any = () => {}\n        ) => {\n            if(api.el) {\n                const el = api.el as Element;\n                const template =  [...(api.el.children)].filter(c => c.tagName === \"TEMPLATE\")[0] as HTMLTemplateElement;\n\n                if(!template) {\n                    throw new Error(`\"for\" requires a template.`);\n                }\n\n                const targetToElement = new Map();\n\n                const disposer = () => {\n                    while(el.childElementCount - 1 > 0) {\n                        dispose(el.lastElementChild, \"for, dispose all\");\n                        el.lastElementChild?.remove();\n                    }\n                    targetToElement.clear(); \n                }\n                \n\n                reactTo(items).withReset((items) => {\n                    shouldDispose(disposer)\n\n                    if(!items) {\n                        disposer();\n                        return;\n                    }\n\n                    const createChildComponent = (item : any) => {\n                        const clone = template.content.cloneNode(true);\n                        const div =  document.createElement(\"div\");\n                        div.appendChild(clone);\n\n                        const element = div.lastElementChild as ChildEl;\n\n                        const targetId = getTargetId(item);\n                \n                        if(targetId) {\n                            targetToElement.set(targetId, element);\n                        }\n                \n                        disposable(element, () => {\n                            itemConnector(createApi(element), item);\n                        });\n                \n                        return element;\n                    }\n                \n                    for(const item of items) {\n                        el.appendChild(createChildComponent(item));\n                    }\n\n                    shouldDispose(subscribe(items, \"\", () => {\n                        let i = 0;\n                        for(const item of items) {\n                            let newElement = targetToElement.get(getTargetId(item));\n                            if(!newElement) {\n                                newElement = createChildComponent(item);\n                            }\n\n                            if(i >= el.children.length - 1) {\n                                el.appendChild(newElement);\n                            } else {\n                                const oldElement = el.children[i + 1];\n                                if(oldElement != newElement) {\n                                    oldElement.replaceWith(newElement);\n                                }\n                            }\n                            i++;\n                        }\n                        while(el.childElementCount - 1 > i) {\n                            el.lastElementChild?.remove();\n                        }\n            \n                        const extras = [...targetToElement].filter(e => ![...el.children].includes(e[1]));\n            \n                        for(const e of extras) {\n                            dispose(e[1], \"for\");\n                            targetToElement.delete(e[0]);\n                        }\n\n                    }));\n                });\n            }\n            return api;\n        }\n    }\n    return api;\n};\n\n/** Short-hand RoleApi type suitable for most cases */\nexport type Role = RoleApi<Element | null>;\n\nexport const { \n    /** Select an element by role. */\n    role, \n    /** Select an element by selector. */\n    select, \n    /** Select element by selector. */\n    selectAll \n} = createApi(document as unknown as Element);\n\n\n\n","import {\n    disposable, dispose, shouldDispose\n} from \"./dispose.ts\";\n\nimport {\n    getTargetId, setGetHook, subscribe,\n    type GetEvent\n} from \"./observable.ts\";\n\nimport {\n    debounce, evalFactor, type Factor\n} from \"./utils.ts\";\n\n\n/** Follow changing values */\nexport const follow = (\n    func : () => void, \n    delay = 0\n) => {\n    const events : GetEvent[] = [];\n\n    const hook = (\n        event : GetEvent\n    ) => {\n        if(!events.some(e => getTargetId(e.proxy) === getTargetId(event.proxy) && e.prop === event.prop)) {\n            events.push(event);\n            subscribe(event.proxy, event.prop, compute);\n        }\n    }\n\n    const followObj = Symbol(\"follow\");\n    shouldDispose(() => dispose(followObj, func));\n\n    let compute = debounce(() => disposable(followObj, () => {\n        try {\n            setGetHook(hook);\n            func();\n        } finally {\n            setGetHook();\n        }\n    }), delay)\n\n    compute();\n}\n"],"names":["debug","setDebug","value","getDebug","debounce","func","delay","timeoutId","args","clearTimeout","setTimeout","queueMicrotask","idMap","Map","id","idName","idFormat","uniqueId","Math","random","toString","substring","set","getId","get","logMessage","strValue","JSON","stringify","length","slice","strFunc","isFunction","obj","Function","evalFactor","val","disposables","WeakMap","currentDisposable","Symbol","shouldDispose","disposer","disposers","Set","add","dispose","additionalInfo","delete","size","console","log","disposable","initializer","save","targetSymbol","nextTargetId","getHook","setGetHook","hook","getTargetId","p","isSameTarget","a","b","targetProxy","subscriberTargets","subscribe","proxy","prop","callback","targetId","Error","subscriber","has","onChange","action","target","oldValue","subscribers","filter","s","count","observable","createProxy","Reflect","defineProperty","writable","enumerable","configurable","current","Proxy","receiver","result","deleteProperty","reactTo","state","computed","undefined","events","event","some","e","push","compute","reactToObj","withObj","reactToApi","with","withCallback","reset","wrapped","withReset","signal","v","getTarget","getProp","Object","funct","on","el","eventNames","handler","options","eventName","split","addEventListener","removeEventListener","hideClass","hideWithClass","className","createApi","element","api","select","selector","optional","querySelector","selectAll","connect","elements","querySelectorAll","forEach","role","roleName","connector","class","hasClass","classList","remove","removeAttribute","style","styleName","styleValue","setProperty","show","condition","attribute","attributeName","attributeValue","setAttribute","onAttribute","f","getAttribute","observer","MutationObserver","observe","attributes","attributeFilter","disconnect","text","textContent","html","innerHTML","model","type","toUpperCase","tagName","checked","toLowerCase","for","items","itemConnector","template","c","targetToElement","childElementCount","lastElementChild","clear","createChildComponent","item","clone","content","cloneNode","div","document","createElement","appendChild","i","newElement","children","oldElement","replaceWith","extras","includes","follow","followObj"],"mappings":";;AAEA,IAAIA,QAAoB;;AAGZ,MAACC,WAAW,CACpBC,QAAoB,SACnBF,QAAQE;;AAGN,MAAMC,WAAW,MAAMH;;AAGvB,MAAMI,WAAW,CACpBC,MACAC,QAAQ;IAER,IAAIC;IAEJ,OAAO,IAAIC;QACPC,aAAaF;QACbA,YAAYG,WAAW,MAAMC,eAAe,MAAMN,QAAQG,QAAQF;;;;AAI1E,MAAMM,QAAQ,IAAIC;;AAGN,MAACC,KAAK,CACdC,SAAS,IACTC,WAGe,CAACF,IAAIC,WAAY,GAAGA,SAASA,SAAS,MAAM,KAAKD;IAEhE,MAAMG,WAAWC,KAAKC,SAASC,SAAS,IAAIC,UAAU,GAAG;IACzD,MAAMP,KAAKE,SAASC,UAAUF;IAC9BH,MAAMU,IAAIP,QAAQD;IAClB,OAAOA;;;AAIC,MAACS,QAAQ,CACjBR,SAAS,OACRH,MAAMY,IAAIT;;AAGR,MAAMU,aAAa,CACtBvB,OACAG;IAEA,IAAIqB,WAAWC,KAAKC,UAAU1B,UAAU;IACxC,IAAGwB,SAASG,SAAS,IAAI;QACrBH,WAAWA,SAASI,MAAM,GAAE,MAAM;AACtC;IACA,IAAIC,UAAU,GAAG1B;IACjB,IAAGA,KAAKwB,SAAS,IAAI;QACjBE,UAAUA,QAAQD,MAAM,GAAE,MAAM;AACpC;IACA,OAAO,GAAGJ,cAAcK;;;AAIrB,MAAMC,aACTC,OACCA,eAAeC;;AAMb,MAAMC,aACTC,OACCJ,WAAWI,OAAO,QAAqBA;;ACvE5C,MAAMC,cAAc,IAAIC;;AAExB,IAAIC,oBAAoBC,OAAO;;AAGnB,MAACC,gBACTC;IAEA,MAAMC,YAAYN,YAAYb,IAAIe,sBAAsB,IAAIK;IAC5DD,UAAUE,IAAIH;IACdL,YAAYf,IAAIiB,mBAAmBI;IACnC,OAAOD;;;AAIC,MAACI,UAAU,CACnBb,KACAc,iBAAuB;IAEvB,MAAMJ,YAAYN,YAAYb,IAAIS,QAAQ,IAAIW;IAC9CP,YAAYW,OAAOf;IACnB,IAAG9B,eAAe,aAAawC,UAAUM,MAAM;QAC3CC,QAAQC,IAAI,aAAalB,IAAIb,cAAc2B;AAC/C;IACA,KAAI,MAAML,YAAY,KAAIC,aAAY;QAClC,IAAGxC,eAAe,aAAawC,UAAUM,MAAM;YAC3CC,QAAQC,IAAI,aAAalB,IAAIb,cAAcsB;AAC/C;QACAA;AACJ;;;AAIQ,MAACU,aAAa,CACtBnB,KACAoB;IAEA,MAAMC,OAAOf;IACbA,oBAAoBN;IACpB;QACI,OAAOoB;AACX,MAAC;QACGd,oBAAoBe;AACxB;;;ACxBJ,MAAMC,eAAef,OAAO;;AAC5B,IAAIgB,eAAe;;AAEnB,IAAIC;;AAGG,MAAMC,aAAcC,QAAoBF,UAAUE;;AAGlD,MAAMC,cAAeC,KAAYA,IAAIN;;AAE5C,MAAMO,eAAe,CAACC,GAASC,OAAaJ,YAAYG,MAAMA,QAAQH,YAAYI,MAAMA;;AAExF,MAAMC,cAAc,IAAIpD;;AACxB,MAAMqD,oBAAoB,IAAIrD;;AAGvB,MAAMsD,YAA2B,CACpCC,OACAC,MACAC;IAEA,MAAMC,WAAWX,YAAYQ;IAE7B,KAAIG,UAAU;QACV,MAAM,IAAIC,MAAM;AACpB;IAEA,MAAMC,aAAa;QACfJ;QACAC;;IAGJ,KAAIJ,kBAAkBQ,IAAIH,WAAW;QACjCL,kBAAkB5C,IAAIiD,UAAU,IAAI3B;AACxC;IAEAsB,kBAAkB1C,IAAI+C,UAAU1B,IAAI4B;IAEpC,OAAOhC,cAAc,MAAMyB,kBAAkB1C,IAAI+C,WAAWvB,OAAOyB;;;AAGvE,MAAME,WAA0B,EAAGC,gBAAQC,gBAAQR,YAAMnE,cAAO4E;IAC5D,IAAGZ,kBAAkBQ,IAAId,YAAYiB,UAAU;QAC3C,MAAME,cAAc,KAAIb,kBAAkB1C,IAAIoC,YAAYiB,WAAUG,OAAOC,KAAKZ,QAAQY,EAAEZ,SAASY,EAAEZ;QAErG,IAAGlE,eAAe,WAAW;YACzB+C,QAAQC,IAAI;gBAAE+B,OAAOH,YAAYlD;gBAAQ+C;gBAAQL,UAAUX,YAAYiB;gBAASR;gBAAMnE;gBAAO4E;;AACjG;QAEA,KAAI,MAAML,cAAcM,aAAa;YACjCpE,eAAe,MAAM8D,WAAWH,SAAS;gBAAEM;gBAAQP;gBAAMnE;gBAAO4E;;AACpE;AACJ;;;AAIQ,MAACK,aAAsBN;IAE/B,MAAMO,cAAeP;QAEjB,IAAIN,WAAWc,QAAQ7D,IAAIqD,QAAQtB,cAAcsB;QACjD,KAAIN,UAAU;YACVA,WAAWf;YAEX6B,QAAQC,eAAeT,QAAQtB,cAAc;gBACzCrD,OAAOqE;gBACPgB,UAAU;gBACVC,YAAY;gBACZC,cAAc;;AAEtB;QAEA,MAAMC,UAAU,IAAIC,MAAMd,QAAQ;YAC9BrD,KAAK,CAACqD,QAAQR,MAAMuB;gBAEhB,IAAGvB,SAASd,cAAc;oBACtB,OAAOgB;AACX;gBACAd,UAAU;oBAAEmB,QAAQ;oBAAOR,OAAOsB;oBAASrB;;gBAE3C,MAAMnE,QAAQ2E,OAAOR;gBAErB,WAAWnE,UAAU,YAAYA,UAAU,MAAM;oBAC7C,OAAO+D,YAAYzC,IAAIoC,YAAY1D,WAAWkF,YAAYlF;AAC9D;gBAEA,OAAOmF,QAAQ7D,IAAIqD,QAAQR,MAAMuB;;YAErCtE,KAAK,CAACuD,QAAQR,MAAMnE,OAAO0F;gBACvB,MAAMd,WAAWO,QAAQ7D,IAAIqD,QAAQR,MAAMuB;gBAE3C,IAAG9B,aAAa5D,OAAO4E,WAAW;oBAC9B,OAAO;AACX;gBAEA,MAAMe,SAASR,QAAQ/D,IAAIuD,QAAQR,MAAMnE,OAAO0F;gBAEhDjB,SAAS;oBAACC,QAAQ;oBAAOC;oBAAQR;oBAAMnE;oBAAO4E;;gBAE9C,OAAOe;;YAEXC,gBAAgB,CAACjB,QAAQR;gBACrB,MAAMS,WAAWO,QAAQ7D,IAAIqD,QAAQR;gBACrC,MAAMwB,SAASR,QAAQS,eAAejB,QAAQR;gBAE9CM,SAAS;oBAAEC,QAAQ;oBAAUC;oBAAQR;oBAAMS;;gBAE3C,OAAOe;;;QAIf5B,YAAY3C,IAAIsC,YAAYiB,SAASa;QAErC,OAAOA;;IAGX,OAAON,YAAYP;;;AC9GX,MAACkB,UAAa,CACtB1F,MACAC,QAAQ;IAER,MAAM0F,QAAQb,WAAW;QACrBc,UAAUC;;IAGd,MAAMC,SAAsB;IAE5B,MAAMxC,OACFyC;QAEA,KAAID,OAAOE,KAAKC,KAAK1C,YAAY0C,EAAElC,WAAWR,YAAYwC,MAAMhC,UAAUkC,EAAEjC,SAAS+B,MAAM/B,OAAO;YAC9F8B,OAAOI,KAAKH;YACZjC,UAAUiC,MAAMhC,OAAOgC,MAAM/B,MAAMmC;AACvC;;IAGJ,MAAMC,aAAajE,OAAO;IAC1BC,cAAc,MAAMK,QAAQ2D,YAAYpG;IAExC,IAAImG,UAAU,MACHpD,WAAWqD,YAAY;QAC1B;YACI/C,WAAWC;YACXqC,MAAMC,WAAW9D,WAAW9B;YAC5BqD;AACJ,UAAC;YACGA;AACJ;;IAIR8C;IAEA,MAAME,UAAUlE,OAAO;IACvBC,cAAc,MAAMK,QAAQ4D;IAE5B,MAAMC,aAAa;QACfC,MAAM,CACFC,eACEC,gBAAiC,CAAA;YAEnC,MAAMC,UAAU;gBACZ,IAAGD,OAAO;oBACNhE,QAAQ4D,SAASG;AACrB;gBACAzD,WAAWsD,SAAS,MAAMG,aAAab,MAAMC;;YAEjD7C,WAAWqD,YAAY;gBACnBtC,UAAU6B,OAAO,YAAY5F,SAAS,EAAGF;oBACrC,IAAGC,YAAY;wBACX+C,QAAQC,IAAI1B,WAAWvB,OAAOG;AAClC;oBACA0G;mBACDzG;gBACHyG;;YAEJ,OAAOJ;;QAGXK,WACIH,gBACCF,WAAWC,KAAKC,cAAc;YAAEC,OAAO;;;IAIhD,OAAOH;;;AAeC,MAACxD,MACT8D,UACClB,QAAQkB,QAAQL,KAAKM,KAAKhE,QAAQC,IAAI1B,WAAWyF,GAAGD;;ACvG7C,MAAC5C,OAAsB,CAC/BQ,QACAR;IAEA,MAAM8C,YAAY,MAAMhF,WAAW0C;IACnC,MAAMuC,UAAU,MAAMD,cAAc9C;IAEpCgD,OAAO/B,eAAe8B,SAAS,SAAS;QACpC5F,KAAK4F;QACL9F,KAAMpB,SAAmBiH,YAAoB9C,QAAQnE;;IAGzDkH,QAAQZ,UAAWc;QACfvB,QAAQ,MAAMoB,eAAeG,SACxBV,KAAM1G;YACH,IAAGiH,aAAa;gBACXA,YAAoB9C,QAAQnE;AACjC;;QAER,OAAOkH;;IAGX,OAAOA;;;ACzBC,MAACG,KAAK,CACdC,IACAC,YACAC,SAAkCC;IAElC,KAAI,MAAMC,aAAaH,WAAWI,MAAM,MAAM;QAC1CL,GAAGM,iBAAiBF,WAAWF,SAASC;QACxClF,cAAc,MAAM+E,GAAGO,oBAAoBH,WAAWF;AAC1D;;;AAGJ,IAAIM,YAAY;;AAGJ,MAACC,gBACTC,aACCF,YAAYE;;AA4FV,MAAMC,YAAuC,CAChDC,UAAe;IAGf,MAAMC,MAAoB;QACtB,MAAIb;YAAO,OAAOY;AAAS;QAE3BE,QAAwC,CACpCC,WACEC,sBAAuC,CAAA;YAEzC,KAAIH,IAAIb,IAAI,OAAOW;YAEnB,MAAMC,UAAUC,IAAIb,GAAGiB,cAAcF;YACrC,KAAIH,YAAYI,UAAU;gBACtB,MAAM,IAAIhE,MAAM,oCAAoC+D;AACxD;YAEA,OAAOJ,UAAmBC;;QAG9BM,WAA2C,CACvCH,UACAI;YAEA,KAAIN,IAAIb,IAAI,OAAOW;YAEnB,MAAMS,WAAW,KAAIP,IAAIb,GAAGqB,iBAAiBN;YAE7CK,SAASE,QAASxC,KAAMqC,QAAQR,UAAmB7B;YAEnD,OAAO+B;;QAGXU,MAAM,CACFC,UACArB,YACCU,IAAIC,OAAO,eAAeU,cAAcrB;QAE7CgB,SACIM;YAEA,KAAIZ,IAAIb,IAAI,OAAOW;YAEnBc,UAAUZ;YACV,OAAOA;;QAGXa,OAAO,CACHhB,WACAiB;YAEA,IAAGd,IAAIb,IAAI;gBACP,MAAMA,KAAKa,IAAIb;gBAEfzB,QAAQoD,UAAUvC,KAAK1G;oBACnB,IAAGA,OAAO;wBACNsH,GAAG4B,UAAUvG,IAAIqF;AACrB,2BAAO;wBACHV,GAAG4B,UAAUC,OAAOnB;wBACpB,IAAIV,GAAG4B,UAAUvH,WAAW,GAAG;4BAC3B2F,GAAG8B,gBAAgB;AACvB;AACJ;;AAER;YACA,OAAOjB;;QAGXkB,OAAO,CACHC,WACAC;YAEA,IAAGpB,IAAIb,IAAI;gBACPzB,QAAQ0D,YAAY7C,KAAK1G,SAAUmI,IAAM,GAAiBkB,MAAMG,YAAYF,WAAWtJ,SAAS;AACpG;YACA,OAAOmI;;QAGXsB,MACIC;YAEA,IAAG5B,WAAW;gBACV,OAAOK,IAAIa,MAAMlB,WAAW,OAAO7F,WAAWyH;AAClD,mBAAO;gBACH,OAAOvB,IAAIkB,MAAM,WAAW,MAAMpH,WAAWyH,aAAa,OAAO;AACrE;;QAGJC,WAAW,CACPC,eACAC;YAEA,IAAG1B,IAAIb,IAAI;gBACP,MAAMA,KAAKa,IAAIb;gBAEfzB,QAAQgE,gBAAgBnD,KAAK1G;oBACzB,IAAGA,SAAS,MAAM;wBACdsH,GAAG8B,gBAAgBQ;AACvB,2BAAO;wBACHtC,GAAGwC,aAAaF,eAAe5J;AACnC;;AAER;YACA,OAAOmI;;QAGX4B,aAAa,CACTH,eACAzJ;YAEA,IAAGgI,IAAIb,IAAI;gBACP,MAAM0C,IAAI,MAAM7J,KAAKgI,IAAIb,IAAI2C,aAAaL,kBAAkB;gBAE5D,MAAMM,WAAW,IAAIC,iBAAiBH;gBACtCE,SAASE,QAAQjC,IAAIb,IAAI;oBAAC+C,YAAY;oBAAMC,iBAAiB,EAACV;;gBAC9DrH,cAAc,MAAM2H,SAASK;gBAE7BP;AACJ;YACA,OAAO7B;;QAGXnI,OACIA;YAEA,IAAGmI,IAAIb,IAAI;gBACPzB,QAAQ7F,OAAO0G,KAAK1G,SAAUmI,OAA4BnI,QAAQA;AACtE;YACA,OAAOmI;;QAGXqC,MACIA;YAEA,IAAGrC,IAAIb,IAAI;gBACPzB,QAAQ2E,MAAM9D,KAAK8D,QAASrC,IAAM,GAAasC,cAAcD,QAAQ;AACzE;YACA,OAAOrC;;QAGXuC,MACIA;YAEA,IAAGvC,IAAIb,IAAI;gBACPzB,QAAQ6E,MAAMhE,KAAKgE,QAASvC,IAAM,GAAawC,YAAYD,QAAQ;AACvE;YACA,OAAOvC;;QAGXd,IAAI,CACAE,YACAC,SACAC;YAEA,IAAGU,IAAIb,IAAI;gBACPD,GAAGc,IAAIb,IAAeC,YAAYC,SAASC;AAC/C;YACA,OAAOU;;QAGXyC,OACIzG;YAEA,IAAGgE,IAAIb,IAAI;gBACP,MAAMA,KAAKa,IAAIb;gBACf,MAAMuD,OAAOvD,GAAG2C,aAAa,SAASa;gBAEtC,IAAG3C,IAAIb,GAAGyD,YAAY,WAAWF,SAAS,YAAY;oBAClDhF,QAAQ1B,MAAMuC,KAAK1G,SAASsH,GAAG0D,YAAYhL;oBAC3CmI,IAAId,GAAG,UAAU,MAAMlD,KAAKnE,QAAQsH,GAAG0D;AAC3C,uBAAO,IAAG7C,IAAIb,GAAGyD,YAAY,WAAWF,SAAS,SAAS;oBACtD1C,IAAIwB,UAAU,WAAW,MAAMxF,KAAKnE,SAASsH,GAAG2C,aAAa,WAAW,KAAK;oBAC7E9B,IAAId,GAAG,UAAU,MAAMlD,KAAKnE,QAAQsH,GAAGtH;AAC3C,uBAAO,KAAIsH,GAAG2C,aAAa,sBAAsB,SAASgB,kBAAkB,SAAU;oBAClFpF,QAAQ1B,MAAMuC,KAAK1G;wBACf,IAAGA,SAASsH,GAAGqD,WAAW;4BACtBrD,GAAGqD,YAAY3K,OAAOkB,cAAc;AACxC;;oBAEJiH,IAAId,GAAG,QAAQ,MAAMlD,KAAKnE,QAAQsH,GAAGqD;AACzC,uBAAO;oBACHxC,IAAInI,MAAM,MAAMmE,KAAKnE,OAAOkB,cAAc;oBAC1CiH,IAAId,GAAG,UAAU,MAAMlD,KAAKnE,QAAQsH,GAAGtH;AAC3C;AACJ;YACA,OAAOmI;;QAGX+C,KAAiC,CAC7BC,OACAC,gBACqB;YAErB,IAAGjD,IAAIb,IAAI;gBACP,MAAMA,KAAKa,IAAIb;gBACf,MAAM+D,WAAY,KAAKlD,IAAIb,GAAW,WAAGxC,OAAOwG,KAAKA,EAAEP,YAAY,YAAY;gBAE/E,KAAIM,UAAU;oBACV,MAAM,IAAI/G,MAAM;AACpB;gBAEA,MAAMiH,kBAAkB,IAAI5K;gBAE5B,MAAM6B,WAAW;oBACb,OAAM8E,GAAGkE,oBAAoB,IAAI,GAAG;wBAChC5I,QAAQ0E,GAAGmE,kBAAkB;wBAC7BnE,GAAGmE,kBAAkBtC;AACzB;oBACAoC,gBAAgBG;;gBAIpB7F,QAAQsF,OAAOrE,UAAWqE;oBACtB5I,cAAcC;oBAEd,KAAI2I,OAAO;wBACP3I;wBACA;AACJ;oBAEA,MAAMmJ,uBAAwBC;wBAC1B,MAAMC,QAAQR,SAASS,QAAQC,UAAU;wBACzC,MAAMC,MAAOC,SAASC,cAAc;wBACpCF,IAAIG,YAAYN;wBAEhB,MAAM3D,UAAU8D,IAAIP;wBAEpB,MAAMpH,WAAWX,YAAYkI;wBAE7B,IAAGvH,UAAU;4BACTkH,gBAAgBnK,IAAIiD,UAAU6D;AAClC;wBAEAhF,WAAWgF,SAAS;4BAChBkD,cAAcnD,UAAUC,UAAU0D;;wBAGtC,OAAO1D;;oBAGX,KAAI,MAAM0D,QAAQT,OAAO;wBACrB7D,GAAG6E,YAAYR,qBAAqBC;AACxC;oBAEArJ,cAAc0B,UAAUkH,OAAO,IAAI;wBAC/B,IAAIiB,IAAI;wBACR,KAAI,MAAMR,QAAQT,OAAO;4BACrB,IAAIkB,aAAad,gBAAgBjK,IAAIoC,YAAYkI;4BACjD,KAAIS,YAAY;gCACZA,aAAaV,qBAAqBC;AACtC;4BAEA,IAAGQ,KAAK9E,GAAGgF,SAAS3K,SAAS,GAAG;gCAC5B2F,GAAG6E,YAAYE;AACnB,mCAAO;gCACH,MAAME,aAAajF,GAAGgF,SAASF,IAAI;gCACnC,IAAGG,cAAcF,YAAY;oCACzBE,WAAWC,YAAYH;AAC3B;AACJ;4BACAD;AACJ;wBACA,OAAM9E,GAAGkE,oBAAoB,IAAIY,GAAG;4BAChC9E,GAAGmE,kBAAkBtC;AACzB;wBAEA,MAAMsD,SAAS,KAAIlB,kBAAiBzG,OAAOsB,MAAM,KAAIkB,GAAGgF,WAAUI,SAAStG,EAAE;wBAE7E,KAAI,MAAMA,KAAKqG,QAAQ;4BACnB7J,QAAQwD,EAAE,IAAI;4BACdmF,gBAAgBzI,OAAOsD,EAAE;AAC7B;;;AAIZ;YACA,OAAO+B;;;IAGf,OAAOA;;;AAMC,OAACU,MAETA,MAAIT,QAEJA,QAAMI,WAENA,aACAP,UAAUgE;;ACzYF,MAACU,SAAS,CAClBxM,MACAC,QAAQ;IAER,MAAM6F,SAAsB;IAE5B,MAAMxC,OACFyC;QAEA,KAAID,OAAOE,KAAKC,KAAK1C,YAAY0C,EAAElC,WAAWR,YAAYwC,MAAMhC,UAAUkC,EAAEjC,SAAS+B,MAAM/B,OAAO;YAC9F8B,OAAOI,KAAKH;YACZjC,UAAUiC,MAAMhC,OAAOgC,MAAM/B,MAAMmC;AACvC;;IAGJ,MAAMsG,YAAYtK,OAAO;IACzBC,cAAc,MAAMK,QAAQgK,WAAWzM;IAEvC,IAAImG,UAAUpG,SAAS,MAAMgD,WAAW0J,WAAW;QAC/C;YACIpJ,WAAWC;YACXtD;AACJ,UAAC;YACGqD;AACJ;QACApD;IAEJkG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}