{"version":3,"file":"fml.min.mjs","sources":["../src/ftl/ast.mjs","../src/ftl/expressions-parser.peggy","../src/ftl/expressions.mjs","../src/ftl/dom.mjs","../src/ftl/template.mjs","../src/ftl/registry.mjs","../src/ftl/templates.mjs","../src/ftl/rendering.mjs","../src/ftl/parsed-element.mjs","../src/httpc/failure.mjs","../src/httpc/encodings.mjs","../src/httpc/http-client.mjs","../src/ful/storage.mjs","../src/ful/events/async.mjs","../src/ful/timing.mjs","../src/ful/elements/bindings.mjs","../src/ful/elements/form.mjs","../src/ful/elements/input.mjs","../src/ful/elements/temporals.mjs","../src/ful/elements/files.mjs","../src/ful/elements/select.mjs","../src/ful/elements/radio.mjs","../src/ful/elements/checkbox.mjs","../src/ful/elements/spinner.mjs","../src/ful/elements/table.mjs","../src/ful/elements/filters.mjs","../src/ful/elements/l10n.mjs","../src/ful/elements/plugin.mjs","../src/index.mjs"],"sourcesContent":["const nodes = {\n    ter: Symbol('ternary'),\n    elv: Symbol('elvis'),\n    nullc: Symbol('null-coalescence'),\n    or: Symbol('or'),\n    and: Symbol('and'),\n    eq: Symbol('eq'),\n    cmp: Symbol('cmp'),\n    not: Symbol('not'),\n    access: Symbol('access'),\n    member: Symbol('access-member'),\n    subscript: Symbol('access-subscript'),\n    method: Symbol('access-method-call'),\n    call: Symbol('module-function-call'),\n    tstring: Symbol('tstring'),\n    literal: Symbol('literal'),\n    array: Symbol('array-literal'),\n    dict: Symbol('dict-literal'),\n    function: Symbol('module-function'),\n    symbol: Symbol('symbol'),\n    templated: {\n        ten: Symbol('templated-node'),\n        teh: Symbol('templated-html'),\n        tet: Symbol('templated-text'),\n        tel: Symbol('templated-literal'),\n    },\n    dom: {\n        t: Symbol('text'),\n        h: Symbol('html'),\n        n: Symbol('node'),\n    },\n};\n\nexport { nodes };\n","{{\n    import { nodes } from \"./ast.mjs\";\n}}\n\nTemplatedRoot = TemplatedExpression*\n\nTemplatedExpression = value:(BeginNode @ExpressionRoot EndNode) { return {type:nodes.templated.ten, value}}\n\t/ value:(BeginHtml @ExpressionRoot EndHtml) { return {type:nodes.templated.teh, value}}\n\t/ value:(BeginText @ExpressionRoot EndText) { return {type:nodes.templated.tet, value}} \n\t/ value:TemplatedText { return {type:nodes.templated.tel, value}}\n\nBeginNode = '{{{{'\nEndNode = '}}}}'\t\nBeginHtml = '{{{'\nEndHtml = '}}}'\nBeginText = '{{'\nEndText = '}}'\n\nTemplatedText\n    = parts:(\n        $( [^\\\\{]+ )       // normal text\n        / '\\\\' c:. { return c; } //escaped\n        / '{' !'{'           // single brace that isn't a delimiter\n    )+ { return parts.join(''); }\n\nExpressionRoot\n    = _ r:Expression _ { return r; }\n\nExpression = TernaryExpression\n\nTernaryExpression \n    = cond:ElvisExpression _ \"?\" _ ifTrue:TernaryExpression _ \":\" _ ifFalse:TernaryExpression { return {type:nodes.ter, cond, ifTrue, ifFalse}; }\n    / ElvisExpression\n\nElvisExpression\n    = cond:NullCoalescingExpression _ \"?:\" _ ifFalse:ElvisExpression {return {type:nodes.elv, cond, ifFalse}; }\n    / NullCoalescingExpression\n\nNullCoalescingExpression\n    = lhs:OrExpression _ \"??\" _ rhs:NullCoalescingExpression { return {type:nodes.nullc, lhs, rhs}; } \n    / OrExpression\n\nOrExpression \n    = head:AndExpression tail:(_ \"||\" _ @rhs:AndExpression)* {\n        let result = head;\n        for (const rhs of tail) {\n            result = {type: nodes.or, lhs: result, rhs};\n        }\n        return result;\n    }\n\nAndExpression\n    = head:EqExpression tail:(_ \"&&\" _ @rhs:EqExpression)* { \n        let result = head;\n        for (const rhs of tail) {\n            result = {type: nodes.and, lhs: result, rhs};\n        }\n        return result;\n    }\n\nEqExpression\n    = head:RelExpression tail:(_ op:EqualityOp _ rhs:RelExpression {return {op, rhs};})* { \n        let result = head;\n        for (const element of tail) {\n            result = {type: nodes.eq, op: element.op, lhs: result, rhs: element.rhs};\n        }\n        return result;\n    }\n\nRelExpression\n    = head:NotExpression tail:(_ op:RelationalOp _ rhs:NotExpression {return {op, rhs};})* {\n        let result = head;\n        for (const element of tail) {\n            result = {type: nodes.cmp, op: element.op, lhs: result, rhs: element.rhs};\n        }\n        return result;\n    }\n\n\nNotExpression\n    = \"!\" _ expr:NotExpression { return {type:nodes.not, expr} }\n    / Access\n\n\nAccess    \n    = lhs:GroupingExpression _ rhs:(@AccessExpression _)+ { return {type: nodes.access, lhs, rhs} }   \n    / GroupingExpression\n\n\nAccessExpression \n    = AccessMember\n    / AccessSubscript \n    / AccessMethodCall\n    \nAccessMember \"member\"\n    = op:(\"?.\"/\".\") _ rhs:Symbol { \n        return {type: nodes.member, ns: op === '?.', rhs: rhs.value}; \n    }\n\nAccessSubscript \"subscript\" \n    = op:\"?.\"? \"[\" _ rhs:Expression _ \"]\"  { \n        return {type: nodes.subscript, ns: op !== null, rhs}; \n    } \n\nAccessMethodCall \"method-call\" \n    = op:\"?.\"? \"(\" _ h:(@Expression _)? t:(\",\" _ @Expression _)* \")\" { \n        return {type: nodes.method, ns: op !== null, args: h === null ? [] : [h, ...t]}; \n    }\n\nGroupingExpression \n    = \"(\" _ e:Expression _ \")\" { return e }\n    / ModuleFunctionCall \n    / AnyLiteral\n    / Symbol\n\n\nModuleFunctionCall \"module-function-call\" \n    = fn:ModuleFunction \"(\" _ h:(@Expression _)? t:(\",\" _ @Expression _)* \")\" {\n        const args = h === null ? [] : [h, ...t];\n        return {type: nodes.call, value: fn, args};\n    }\n\nAnyLiteral\n    = NumberLiteral\n    / BooleanLiteral\n    / NullLiteral\n    / UndefinedLiteral\n    / StringLiteral\n    / ArrayLiteral\n    / DictLiteral\n\nBooleanLiteral \"boolean-literal\"\n    = \"true\" { \n        return {type: nodes.literal, value: true}; \n    }\n    / \"false\" { \n        return {type: nodes.literal, value: false}; \n    }\n\nNullLiteral \"null-literal\"\n    = \"null\" {\n        return {type: nodes.literal, value: null};\n    }\n\nUndefinedLiteral \"undefined-literal\"  // <--- Add this\n    = \"undefined\" {\n        return {type: nodes.literal, value: undefined};\n    }    \n\nNumberLiteral \"number-literal\" \n    = value:$( '-'? ([0-9]+ ('.' [0-9]*)? / '.' [0-9]+ ) ) {\n        return { type: nodes.literal, value: parseFloat(value) };\n    }\n\nStringLiteral \"string-literal\"\n    = \"'\" value:$[^']* \"'\"  { return {type: nodes.literal, value}; }\n    / '\"' value:$[^\"]* '\"'  { return {type: nodes.literal, value}; }\n    / \"`\" parts:(TemplateStringExpression / TemplateStringLiteral)* \"`\" { \n        return {type: nodes.tstring, parts}; \n    }\n\nTemplateStringExpression \"tstring-expression\"\n    = \"{\" _ expr:Expression _ \"}\" { \n        return expr; \n    }\n\nTemplateStringLiteral \"tstring-literal\"\n    = parts:(\n        $([^\\\\`{]+)\n        / \"\\\\\" c:. { return c; }\n    )+ {\n        return { type: nodes.literal, value: parts.join('') };\n    }\n    / char:$(\"{\") { \n        return { type: nodes.literal, value: char }; \n    }\n\nArrayLiteral \"array-literal\" \n    = \"[\" _ h:(Expression)? _ t:(\",\" _ @Expression _)* \"]\" { \n        const value = h === null ? [] : [h, ...t];\n        return {type: nodes.array, value};\n    }\n\nDictLiteral \"dict-literal\" \n    = \"{\" _ h:(@StringLiteral _ \":\" _ @Expression)? _ t:(\",\" _ @StringLiteral _ \":\" _ @Expression _)* \"}\" {\n        var value = []\n        if (h !== null){\n            value.push(h);\n        }\n        value.push.apply(value, t);\n        return {type: nodes.dict, value};   \n    }\n\nModuleFunction \"module-function\"\n    = '#' module:(@$([a-zA-Z$_][a-zA-Z$_0-9_]*) ':')? v:$([a-zA-Z$_][a-zA-Z$_0-9_]*) {\n        return {type: nodes.function, module, value: v}\n    }\n\nSymbol \"symbol\"\n    = s:$([a-zA-Z$_][a-zA-Z$_0-9_]*) { \n        return {type: nodes.symbol, value: s}; \n    }\n    \nEqualityOp\n    = \"==\"\n    / \"!=\"\n\nRelationalOp\n    = \">=\"\n    / \">\"\n    / \"<=\"\n    / \"<\"\n\n_ \"whitespaces\"\n    = [ \\t\\n\\r]*\n\n","import { parse } from './expressions-parser.peggy';\nimport { nodes } from './ast.mjs';\n\nclass EvaluatingVisitor {\n    #modules;\n    #dataStack;\n    constructor(modules, dataStack) {\n        this.#modules = modules;\n        this.#dataStack = dataStack;\n    }\n    #resolve(prop) {\n        if (prop === 'self') {\n            return this.#dataStack[this.#dataStack.length - 1];\n        }\n        for (let i = this.#dataStack.length - 1; i >= 0; i--) {\n            const overlay = this.#dataStack[i];\n            if (overlay != null && (typeof overlay === 'object' || typeof overlay === 'function')) {\n                if (prop in overlay) {\n                    return overlay[prop];\n                }\n            }\n        }\n        return undefined;\n    }\n\n    #cached_resolve_proxy;\n    #resolve_proxy() {\n        if (!this.#cached_resolve_proxy) {\n            this.#cached_resolve_proxy = new Proxy(this.#dataStack, {\n                get: (target, prop) => this.#resolve(prop)\n            });\n        }\n        return this.#cached_resolve_proxy;\n    }\n    [nodes.and](node) {\n        return this.visit(node.lhs) && this.visit(node.rhs);\n    }\n    [nodes.or](node) {\n        return this.visit(node.lhs) || this.visit(node.rhs);\n    }\n    [nodes.nullc](node) {\n        const lhs = this.visit(node.lhs);\n        return lhs !== null && lhs !== undefined ? lhs : this.visit(node.rhs);\n    }\n    [nodes.not](node) {\n        return !this.visit(node.expr);\n    }\n    [nodes.eq](node) {\n        const lhs = this.visit(node.lhs);\n        const rhs = this.visit(node.rhs);\n        const eq = lhs === rhs;\n        return node.op === '==' ? eq : !eq;\n    }\n    [nodes.cmp](node) {\n        const lhs = this.visit(node.lhs);\n        const rhs = this.visit(node.rhs);\n        switch (node.op) {\n            case '>':\n                return lhs > rhs;\n            case '<':\n                return lhs < rhs;\n            case '>=':\n                return lhs >= rhs;\n            case '<=':\n                return lhs <= rhs;\n            default:\n                throw new Error('unknown cmp op ' + node.op);\n        }\n    }\n    [nodes.call](node) {\n        const fnRef = node.value;\n        const module = fnRef.module === null ? this.#modules : this.#modules?.[fnRef.module];\n        if (!module) {\n            throw new Error(`Module \"${fnRef.module}\" not found`);\n        }\n        const fn = module[fnRef.value];\n        if (!fn) {\n            throw new Error(`Function \"#${fnRef.module === null ? '' : fnRef.module + ':'}${fnRef.value}\" not found`);\n        }\n        const args = node.args.map((arg) => this.visit(arg));\n        return fn.apply(this.#resolve_proxy(), args);\n    }\n    [nodes.literal](node) {\n        return node.value;\n    }\n    [nodes.tstring](node) {\n        let result = '';\n        const parts = node.parts;\n        for (let i = 0, len = parts.length; i < len; i++) {\n            const evaluated = this.visit(parts[i]);\n            if (evaluated !== null && evaluated !== undefined) {\n                result += evaluated;\n            }\n        }\n        return result;\n    }\n    [nodes.symbol](node) {\n        return this.#resolve(node.value);\n    }\n    [nodes.dict](node) {\n        return Object.fromEntries(node.value.map((entry) => [entry[0].value, this.visit(entry[1])]));\n    }\n    [nodes.array](node) {\n        return node.value.map((v) => this.visit(v));\n    }\n    [nodes.ter](node) {\n        return this.visit(node.cond) ? this.visit(node.ifTrue) : this.visit(node.ifFalse);\n    }\n    [nodes.elv](node) {\n        const cond = this.visit(node.cond);\n        return cond ? cond : this.visit(node.ifFalse);\n    }\n    [nodes.access](node) {\n        let prev = undefined;\n        let cur = this.visit(node.lhs);\n        for (let i = 0; i !== node.rhs.length; ++i) {\n            const rhs = node.rhs[i];\n            if (rhs.ns && cur == null) {\n                return undefined;\n            }\n            let value = undefined;\n            switch (rhs.type) {\n                case nodes.member: {\n                    value = cur[rhs.rhs];\n                    break;\n                }\n                case nodes.subscript: {\n                    value = cur[this.visit(rhs.rhs)];\n                    break;\n                }\n                case nodes.method: {\n                    if (!cur) {\n                        throw new Error(`Method missing \"${node.rhs[i - 1].rhs}\"`);\n                    }\n                    const args = rhs.args.map((arg) => this.visit(arg));\n                    value = cur.apply(prev, args);\n                    break;\n                }\n            }\n            prev = cur;\n            cur = value;\n        }\n        return cur;\n    }\n    visit(node, ...args) {\n        return this[node.type](node, ...args);\n    }\n    visitRoot(ast, templated) {\n        return !templated\n            ? this.visit(ast)\n            : ast.map((node) => {\n                switch (node.type) {\n                    case nodes.templated.tel:\n                        return { type: nodes.dom.t, value: node.value };\n                    case nodes.templated.tet:\n                        return { type: nodes.dom.t, value: this.visit(node.value) };\n                    case nodes.templated.teh:\n                        return { type: nodes.dom.h, value: this.visit(node.value) };\n                    case nodes.templated.ten:\n                        return { type: nodes.dom.n, value: this.visit(node.value) };\n                    default:\n                        throw new Error('unknown node type ' + node.type.toString());\n                }\n            });\n    }\n}\n\nclass Expressions {\n    static MODE_EXPRESSION = Symbol('MODE_EXPRESSION');\n    static MODE_TEMPLATED = Symbol('MODE_TEMPLATED');\n\n    static #astCache = new Map();\n    static #MAX_CACHE_SIZE = 1000;\n\n    /**\n     * Parses an expression.\n     * @param {string} expression\n     * @param {(typeof Expressions.MODE_EXPRESSION | typeof Expressions.MODE_TEMPLATED)?} [mode]\n     * @returns the ast\n     */\n    static parse(expression, mode) {\n        const key = mode?.toString() + expression;\n\n        if (!this.#astCache.has(key)) {\n            if (this.#astCache.size >= this.#MAX_CACHE_SIZE) {\n                const oldestKey = this.#astCache.keys().next().value;\n                this.#astCache.delete(oldestKey);\n            }\n            this.#astCache.set(key, parse(expression, {\n                startRule: mode === Expressions.MODE_TEMPLATED ? 'TemplatedRoot' : 'ExpressionRoot',\n            }));\n        }\n\n        return this.#astCache.get(key);\n    }\n    /**\n     * Evaluates an expression.\n     * @param {{[k: string]: any } | null | undefined } modules\n     * @param {any[]} dataStack\n     * @param {any} ast\n     * @param {(typeof Expressions.MODE_EXPRESSION | typeof Expressions.MODE_TEMPLATED)?} [mode]\n     * @returns the result\n     */\n    static evaluate(modules, dataStack, ast, mode) {\n        return new EvaluatingVisitor(modules, dataStack).visitRoot(ast, mode === Expressions.MODE_TEMPLATED);\n    }\n    /**\n     * Parses and evaluates an expression.\n     * @param {{ [x: string]: any; } | null | undefined} modules\n     * @param {any[]} dataStack\n     * @param {string} expression\n     * @param {(typeof Expressions.MODE_EXPRESSION | typeof Expressions.MODE_TEMPLATED)?} [mode]\n     * @returns the result\n     */\n    static interpret(modules, dataStack, expression, mode) {\n        return Expressions.evaluate(modules, dataStack, Expressions.parse(expression, mode), mode);\n    }\n}\n\nclass ExpressionEvaluator {\n    #modules;\n    #dataStack;\n    constructor(modules, dataStack) {\n        this.#modules = modules;\n        this.#dataStack = dataStack;\n    }\n    withModule(name, value) {\n        const module = name ? { [name]: value } : value;\n        return new ExpressionEvaluator({ ...this.#modules, ...module }, this.#dataStack);\n    }\n    withOverlay(...data) {\n        return new ExpressionEvaluator(\n            this.#modules,\n            data.length === 0 ? this.#dataStack : [...this.#dataStack, ...data],\n        );\n    }\n    evaluate(expression, mode) {\n        return Expressions.interpret(this.#modules, this.#dataStack, expression, mode);\n    }\n    evaluateExpression(expression) {\n        return this.evaluate(expression, Expressions.MODE_EXPRESSION);\n    }\n    evaluateTemplated(expression) {\n        return this.evaluate(expression, Expressions.MODE_TEMPLATED);\n    }\n}\n\nexport { Expressions, ExpressionEvaluator };\n","class Fragments {\n    /**\n     * Creates a DocumentFragment from an string.\n     * @param  {...string} html\n     * @returns {DocumentFragment} the fragment\n     */\n    static fromHtml(...html) {\n        const el = document.createElement('template');\n        el.innerHTML = html.map((h) => h.trim()).join('');\n        return document.adoptNode(el.content);\n    }\n    /**\n     * Creates a string representation (HTML) of a DocumentFragment.\n     * @param {DocumentFragment} fragment\n     * @returns {string} the html\n     */\n    static toHtml(fragment) {\n        var el = document.createElement('template');\n        el.content.appendChild(fragment);\n        return el.innerHTML;\n    }\n    /**\n     * Checks if a fragment contains only blank text nodes\n     * @param {DocumentFragment} fragment\n     * @returns {boolean} true if the fragment is blank\n     */\n    static isBlank(fragment) {\n        return fragment.childElementCount === 0 && fragment.textContent.trim() === '';\n    }\n    /**\n     * Creates a DocumentFragment from nodes.\n     * @param  {...Node} nodes\n     * @returns {DocumentFragment} the fragment\n     */\n    static from(...nodes) {\n        const fragment = new DocumentFragment();\n        for (const node of nodes) {\n            fragment.appendChild(node);\n        }\n        return fragment;\n    }\n    /**\n     * Creates a DocumentFragment from childNodes of an element.\n     * @param {Node} el\n     * @returns {DocumentFragment} the fragment\n     */\n    static fromChildNodes(el) {\n        const fragment = new DocumentFragment();\n        while (el.firstChild) {\n            fragment.appendChild(el.firstChild);\n        }\n        return fragment;\n    }\n}\n\nclass Attributes {\n    static id = 0;\n    /**\n     * Creates a unique id with the given prefix.\n     * @param {string} prefix\n     * @returns\n     */\n    static uid(prefix) {\n        return `${prefix}-${++Attributes.id}`;\n    }\n    /**\n     * Sets an attribute if not present.\n     * @param {Element} el\n     * @param {string} k\n     * @param {string} v\n     * @returns\n     */\n    static defaultValue(el, k, v) {\n        if (!el.hasAttribute(k)) {\n            el.setAttribute(k, v);\n        }\n        return el.getAttribute(k);\n    }\n    /**\n     * Forwards prefixed attributes from an element to another (removing the prefix).\n     * @param {string} prefix\n     * @param {Element} from\n     * @param {Element} to\n     */\n    static forward(prefix, from, to) {\n        from.getAttributeNames()\n            .filter((a) => a.startsWith(prefix))\n            .forEach((a) => {\n                const target = a.substring(prefix.length);\n                if (target === 'class') {\n                    const classes = from.getAttribute(prefix + 'class')?.split(/\\s+/).filter((a) => a.length) ?? [];\n                    to.classList.add(...classes);\n                    return;\n                }\n                to.setAttribute(target, /** @type {string} */(from.getAttribute(a)));\n            });\n    }\n    /**\n     * Changes the presence of an attribute.\n     * @param {Element} el\n     * @param {string} attr\n     * @param {boolean} value\n     */\n    static toggle(el, attr, value) {\n        if (value) {\n            el.setAttribute(attr, '');\n        } else {\n            el.removeAttribute(attr);\n        }\n    }\n    /**\n     * Changes the presence of an attribute based on its current state.\n     * @param {Element} el\n     * @param {string} attr\n     */\n    static flip(el, attr) {\n        if (el.hasAttribute(attr)) {\n            el.removeAttribute(attr);\n        } else {\n            el.setAttribute(attr, '');\n        }\n    }\n    /**\n     * Sets the value of an attribute. nullish values remove the attribute.\n     * @param {Element} el\n     * @param {string} attr\n     * @param {string | null | undefined} value\n     */\n    static set(el, attr, value) {\n        if (value == null) {\n            el.removeAttribute(attr);\n        } else {\n            el.setAttribute(attr, value);\n        }\n    }\n}\n\nclass LightSlots {\n    /**\n     * Extracts light slots from an element. For non default slots in a template tag, the content is extracted.\n     * @param {Element} el\n     * @returns the slots\n     */\n    static from(el) {\n        /** @type [string, Element|DocumentFragment][] */\n        const namedSlots = Array.from(el.children)\n            .filter((el) => el.matches('[slot]'))\n            .map((el) => {\n                el.remove();\n                const slot = el.getAttribute('slot') || 'unnamed';\n                el.removeAttribute('slot');\n                return [slot, LightSlots.slotFromNode(el)];\n            });\n        const slots = {};\n        slots.default = new DocumentFragment();\n        slots.default.append(...el.childNodes);\n        for (const [name, el] of namedSlots) {\n            if (!(name in slots)) {\n                slots[name] = new DocumentFragment();\n            }\n            slots[name].append(el);\n        }\n        return slots;\n    }\n    static slotFromNode(el) {\n        if (el instanceof HTMLTemplateElement) {\n            return document.adoptNode(el.content);\n        }\n        if (el instanceof HTMLScriptElement && el.type !== '' && el.type !== 'text/javascript') {\n            return Fragments.fromHtml(el.innerHTML);\n        }\n        return el;\n    }\n}\n\nclass Nodes {\n    /**\n     * Checks if an element is already parsed.\n     * @param {Element} el\n     * @returns\n     */\n    static isParsed(el) {\n        //@ts-ignore\n        for (let c = el; c; c = c.parentNode) {\n            if (c.nextSibling) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    static waitParsed(el) {\n        if (el.ownerDocument.readyState === 'complete' || Nodes.isParsed(el)) {\n            return Promise.resolve(el);\n        }\n        return new Promise((resolve) => {\n            const ac = new AbortController();\n            const clearAndQueue = () => {\n                ac.abort();\n                observer.disconnect();\n                resolve(el);\n            };\n            el.ownerDocument.addEventListener('DOMContentLoaded', clearAndQueue, { signal: ac.signal });\n            const observer = new MutationObserver(() => {\n                if (!Nodes.isParsed(el)) {\n                    return;\n                }\n                clearAndQueue();\n            });\n            const parent = /** @type {Node} */ (el.parentNode);\n            observer.observe(parent, { childList: true });\n        });\n    }\n\n    /**\n     * Returns the first child of the element element (if exists) matching the selector.\n     * @param {Element} el\n     * @param {string} selector\n     * @returns\n     */\n    static queryChildren(el, selector) {\n        for (const c of el.children) {\n            if (c.matches(selector)) {\n                return c;\n            }\n        }\n        return null;\n    }\n    /**\n     * Returns all children of the element matching the selector.\n     * @param {Element} el\n     * @param {string} selector\n     * @returns\n     */\n    static queryChildrenAll(el, selector) {\n        const r = [];\n        for (const c of el.children) {\n            if (c.matches(selector)) {\n                r.push(c);\n            }\n        }\n        return r;\n    }\n}\n\nexport { Fragments, Attributes, LightSlots, Nodes };\n","import { nodes } from './ast.mjs';\nimport { Attributes, Fragments } from './dom.mjs';\nimport { Expressions, ExpressionEvaluator } from './expressions.mjs';\n\nclass NodeOperations {\n    #forRemoval;\n    constructor() {\n        this.#forRemoval = [];\n    }\n    removed(node) {\n        return this.#forRemoval.includes(node);\n    }\n    remove(node) {\n        node.replaceChildren?.();\n        Object.keys(node.dataset || {})\n            .filter((k) => k.startsWith('tpl'))\n            .forEach((k) => delete node.dataset[k]);\n        this.#forRemoval.push(node);\n    }\n    popData(node, key) {\n        const v = node.dataset[key];\n        delete node.dataset[key];\n        return v;\n    }\n    prepend(ref, node) {\n        ref.parentNode.insertBefore(node, ref);\n    }\n    append(ref, node) {\n        ref.parentNode.insertBefore(node, ref.nextSibling);\n    }\n    replace(ref, node) {\n        this.prepend(ref, node);\n        this.remove(ref);\n    }\n    cleanup() {\n        while (this.#forRemoval.length) {\n            this.#forRemoval.pop().remove();\n        }\n    }\n}\n\nclass CommandsHandler {\n    static ORDERED_COMMANDS = [\n        'tplIf',\n        'tplWith',\n        'tplEach',\n        'tplWhen',\n        'tplClassAppend',\n        'tplAttrAppend',\n        'tplText',\n        'tplHtml',\n        'tplRemove',\n        'tplVerbatim',\n    ];\n    static tplIf(node, expression, ops, modules, dataStack) {\n        const accept = Expressions.interpret(modules, dataStack, expression);\n        if (!accept) {\n            ops.remove(node);\n        }\n    }\n    static tplWith(node, expression, ops, modules, dataStack) {\n        const evaluated = Expressions.interpret(modules, dataStack, expression);\n        const varName = ops.popData(node, 'tplVar');\n        const newNode = new Template(node, modules, dataStack)\n            .withOverlay(varName ? { [varName]: evaluated } : evaluated)\n            .render();\n        ops.replace(node, newNode);\n    }\n    static tplEach(node, expression, ops, modules, dataStack) {\n        const varName = ops.popData(node, 'tplVar');\n        const template = new Template(node, modules, dataStack);\n        const evaluated = Expressions.interpret(modules, dataStack, expression);\n        if (!evaluated?.[Symbol.iterator]) {\n            throw new Error(`Expected an iterable got '${evaluated}'`);\n        }\n        for (const v of evaluated) {\n            ops.prepend(node, template.withOverlay(varName ? { [varName]: v } : v).render());\n        }\n        ops.remove(node);\n    }\n    static tplWhen(node, expression, ops, modules, dataStack) {\n        const accept = Expressions.interpret(modules, dataStack, expression);\n        if (!accept) {\n            ops.remove(node);\n        }\n    }\n    static tplVerbatim(node, expression, ops, modules, dataStack) {\n        const newNode = node.cloneNode(true);\n        ops.replace(node, newNode);\n    }\n    static tplRemove(node, value, ops, modules, dataStack) {\n        switch (value.toLowerCase()) {\n            case 'tag':\n                const fragment = new DocumentFragment();\n                while (node.firstChild) {\n                    fragment.appendChild(node.firstChild);\n                }\n                if ('tplVerbatim' in node.dataset) {\n                    //we are removing the parent element so we have to handle the lower priority commands\n                    ops.popData(node, 'tplVerbatim');\n                    ops.replace(node, fragment);\n                } else {\n                    ops.append(node, fragment);\n                    ops.remove(node);\n                }\n                break;\n            case 'body':\n                node.replaceChildren();\n                break;\n            case 'all':\n                ops.remove(node);\n                break;\n        }\n    }\n    static tplText(node, expression, ops, modules, dataStack) {\n        const text = Expressions.interpret(modules, dataStack, expression);\n        const newNode = node.cloneNode();\n        newNode.replaceChildren(text == null ? '' : text);\n        ops.replace(node, newNode);\n    }\n    static tplHtml(node, expression, ops, modules, dataStack) {\n        const html = Expressions.interpret(modules, dataStack, expression);\n        const newNode = node.cloneNode();\n        newNode.innerHTML = html == null ? '' : html;\n        ops.replace(node, newNode);\n    }\n    static tplClassAppend(node, expression, ops, modules, dataStack) {\n        const classes = Expressions.interpret(modules, dataStack, expression);\n        if (!classes) {\n            return;\n        }\n        const classesAsArray = Array.isArray(classes) ? classes : [classes];\n        const cleanClasses = classesAsArray\n            .flatMap(c => typeof c === 'string' ? c.split(' ') : c)\n            .filter(Boolean);\n        if (cleanClasses.length === 0) {\n            return;\n        }\n        node.classList.add(...cleanClasses);\n    }\n    static tplAttrAppend(node, expression, ops, modules, dataStack) {\n        const attributesAndValues = Expressions.interpret(modules, dataStack, expression);\n        if (!attributesAndValues || attributesAndValues.length === 0) {\n            return;\n        }\n        const tuples = Array.isArray(attributesAndValues[0]) ? attributesAndValues : [attributesAndValues];\n        tuples.forEach(([k, v]) => {\n            node.setAttribute(k, v);\n        });\n    }\n    static textNode(node, expression, ops, modules, dataStack) {\n        for (const v of Expressions.interpret(modules, dataStack, expression, Expressions.MODE_TEMPLATED)) {\n            if (v.value == null) {\n                continue;\n            }\n            switch (v.type) {\n                case nodes.dom.t:\n                    ops.prepend(node, document.createTextNode(v.value));\n                    break;\n                case nodes.dom.h:\n                    ops.prepend(node, Fragments.fromHtml(v.value));\n                    break;\n                case nodes.dom.n:\n                    ops.prepend(node, v.value);\n                    break;\n            }\n        }\n        ops.remove(node);\n    }\n}\n\n// Module-isolated string cache for dataset-to-attribute conversions\nconst attributeCache = new Map();\n\n/**\n * Converts a tpl camelCase dataset key into a kebab-case attribute name.\n * Uses a cache lookup to avoid repetitive regex/string splitting.\n * @param {string} dataSetKey\n * @returns {string}\n */\nfunction toAttr(dataSetKey) {\n    let cached = attributeCache.get(dataSetKey);\n    if (!cached) {\n        cached = dataSetKey\n            .substring(3)\n            .split(/(?=[A-Z])/)\n            .join('-')\n            .toLowerCase();\n        attributeCache.set(dataSetKey, cached);\n    }\n    return cached;\n}\n\nclass Template {\n    /**\n     * Creates a template from a string.\n     * @param {string} html\n     * @param {{ [k: string] : any }?} [modules]\n     * @param {...*} data\n     * @returns the template\n     */\n    static fromHtml(html, modules, ...data) {\n        return new Template(Fragments.fromHtml(html), modules, data);\n    }\n\n    /**\n     * Creates a template from the content of the first template element matching the selector.\n     * @param {string} selector for an HTMLTemplateElement\n     * @param {{ [k: string] : any }?} [modules]\n     * @param {...*} data\n     * @returns the template\n     */\n    static fromSelector(selector, modules, ...data) {\n        const templateEl = document.querySelector(selector);\n        if (!(templateEl instanceof HTMLTemplateElement)) {\n            throw new Error('template selector does not match any template tag');\n        }\n        const fragment = document.adoptNode(templateEl.content);\n        return new Template(fragment, modules, data);\n    }\n\n    /**\n     * Creates a template from the content of an HTMLTemplateElement.\n     * @param {HTMLTemplateElement} templateEl\n     * @param {{ [k: string] : any }?} [modules]\n     * @param {...*} data\n     * @returns the template\n     */\n    static fromTemplate(templateEl, modules, ...data) {\n        const fragment = document.adoptNode(templateEl.content);\n        return new Template(fragment, modules, data);\n    }\n\n    /**\n     * Creates a template from a DocumentFragment.\n     * @param {DocumentFragment} fragment\n     * @param { { [k: string] : any }? } [modules]\n     * @param {...*} data\n     * @returns the template\n     */\n    static fromFragment(fragment, modules, ...data) {\n        return new Template(fragment, modules, data);\n    }\n    #fragment;\n    #modules;\n    #dataStack;\n    /**\n     * Creates a template.\n     * @param {DocumentFragment} fragment\n     * @param {{ [x: string]: any; } | null | undefined} modules\n     * @param {any[]} dataStack\n     */\n    constructor(fragment, modules, dataStack) {\n        this.#fragment = fragment;\n        this.#modules = modules;\n        this.#dataStack = dataStack;\n    }\n    /**\n     * Creates a new Template replacing the modules and dataStack from a context.\n     * @param {{modules: { [x: string]: any; } | null | undefined, data: any[]}} context\n     */\n    withContext({ modules, data }) {\n        return new Template(this.#fragment, modules, data);\n    }\n    /**\n     * Creates a new Template replacing the modules and dataStack from a registry.\n     * @param any registry\n     */\n    withContextFrom(registry) {\n        return this.withContext(registry.context());\n    }\n    /**\n     * Creates a new Template replacing the fragment.\n     * @param {DocumentFragment} fragment\n     */\n    withFragment(fragment) {\n        return new Template(fragment, this.#modules, this.#dataStack);\n    }\n    /**\n     * Creates a new Template with a new module added.\n     * @param {string?} name\n     * @param {{[k: string]: any}} value\n     */\n    withModule(name, value) {\n        const module = name ? { [name]: value } : value;\n        return new Template(this.#fragment, { ...this.#modules, ...module }, this.#dataStack);\n    }\n    /**\n     * Creates a new Template replacing the modules.\n     * @param {{ [x: string]: any; }?} modules\n     */\n    withModules(modules) {\n        return new Template(this.#fragment, modules, this.#dataStack);\n    }\n    /**\n     * Creates a new Template replacing the data stack.\n     * @param {any[]} dataStack the dataStack\n     */\n    withData(dataStack) {\n        return new Template(this.#fragment, this.#modules, dataStack);\n    }\n    /**\n     * Creates a new Template with new a data overlay added to the stack.\n     * @param {...*} data\n     */\n    withOverlay(...data) {\n        return new Template(\n            this.#fragment,\n            this.#modules,\n            data.length === 0 ? this.#dataStack : [...this.#dataStack, ...data],\n        );\n    }\n    /**\n     * Evaluates an expression using the configured modules and data.\n     * @param {string} expression\n     * @param {(typeof Expressions.MODE_EXPRESSION | typeof Expressions.MODE_TEMPLATED)?} [mode]\n     * @param {...*} data\n     */\n    evaluate(expression, mode, ...data) {\n        new ExpressionEvaluator(this.#modules, this.#dataStack).withOverlay(...data).evaluate(expression, mode);\n    }\n    /**\n     * Returns an expression evaluator with bound modules and dataStack.\n     */\n    evaluator() {\n        return new ExpressionEvaluator(this.#modules, this.#dataStack);\n    }\n    /**\n     * Renders the template.\n     * @returns a DocumentFragment\n     */\n    render() {\n        try {\n            const ops = new NodeOperations();\n            const imported = document.importNode(this.#fragment, true);\n            const fragment =\n                imported.nodeType === Node.DOCUMENT_FRAGMENT_NODE\n                    ? imported\n                    : (() => {\n                        const d = new DocumentFragment();\n                        d.appendChild(imported);\n                        return d;\n                    })();\n            const iterator = document.createNodeIterator(\n                fragment,\n                NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n                Template.#NODE_FILTER,\n            );\n            let node;\n            while ((node = iterator.nextNode()) !== null) {\n                ops.cleanup();\n                if (node.nodeType === Node.TEXT_NODE) {\n                    try {\n                        CommandsHandler.textNode(node, node.nodeValue, ops, this.#modules, this.#dataStack);\n                    } catch (ex) {\n                        throw new RenderError('Error evaluating text node', node, ex);\n                    }\n                    continue;\n                }\n                const el = /** @type {HTMLElement} */ (node);\n                for (const command of CommandsHandler.ORDERED_COMMANDS) {\n                    if (!(command in el.dataset)) {\n                        continue;\n                    }\n                    const value = ops.popData(el, command);\n                    try {\n                        CommandsHandler[command](el, value, ops, this.#modules, this.#dataStack);\n                    } catch (ex) {\n                        throw new RenderError(`Error evaluating command ${command}`, el, ex);\n                    }\n                    if (ops.removed(el)) {\n                        break;\n                    }\n                }\n                for (const dataSetKey of Object.keys(el.dataset || {})) {\n                    if (!dataSetKey.startsWith('tpl')) {\n                        continue;\n                    }\n                    const attributeName = toAttr(dataSetKey);\n                    try {\n                        const expression = ops.popData(el, dataSetKey);\n                        const evaluated = Expressions.interpret(this.#modules, this.#dataStack, expression);\n                        if (typeof evaluated === 'boolean') {\n                            Attributes.toggle(el, attributeName, evaluated);\n                            continue;\n                        }\n                        if (evaluated !== null && evaluated !== undefined) {\n                            el.setAttribute(attributeName, evaluated);\n                        }\n                    } catch (ex) {\n                        throw new RenderError(`Error evaluating command ${dataSetKey}`, el, ex);\n                    }\n                }\n            }\n            ops.cleanup();\n            return fragment;\n        } catch (ex) {\n            throw new RenderError('Error rendering template', this.#fragment, ex);\n        }\n    }\n    /**\n     * Renders this template on the Element (replacing children).\n     * @param {Element} el\n     */\n    renderTo(el) {\n        el.replaceChildren(this.render());\n    }\n    /**\n     * Renders this template appending the resulting fragment to the Element.\n     * @param {Element} el\n     */\n    appendTo(el) {\n        el.appendChild(this.render());\n    }\n    /**\n     * Renders this template appending the resulting fragment to the first Element maching the selector, if exists.\n     * @param {string} selector\n     */\n    renderToSelector(selector) {\n        const el = document.querySelector(selector);\n        if (el) {\n            this.renderTo(el);\n        }\n    }\n    /**\n     * Renders this template appending the resulting fragment to the Element maching the selector, if exists.\n     * @param {string} selector\n     */\n    appendToSelector(selector) {\n        const el = document.querySelector(selector);\n        if (el) {\n            this.appendTo(el);\n        }\n    }\n    static #NODE_FILTER(node) {\n        if (node.nodeType === Node.TEXT_NODE) {\n            return node.nodeValue.includes('{{') && node.nodeValue.includes('}}')\n                ? NodeFilter.FILTER_ACCEPT\n                : NodeFilter.FILTER_REJECT;\n        }\n        for (const attr of node.attributes) {\n            if (attr.name.startsWith('data-tpl-')) {\n                return NodeFilter.FILTER_ACCEPT;\n            }\n        }\n        return NodeFilter.FILTER_SKIP;\n    }\n}\n\nclass RenderError extends Error {\n    constructor(message, nodeOrFragment, cause) {\n        super(`${message} in \\`${RenderError.stringify(nodeOrFragment)}\\``, { cause });\n        this.name = 'RenderError';\n        this.node = nodeOrFragment.cloneNode(true);\n    }\n    static stringify(nodeOrFragment) {\n        const t = document.createElement('template');\n        t.content.appendChild(RenderError.#cleanup(nodeOrFragment.cloneNode(true)));\n        return t.innerHTML;\n    }\n    static #cleanup(node) {\n        if (node.nodeType === Node.TEXT_NODE) {\n            node.nodeValue = node.nodeValue.trim();\n        }\n        for (var n = 0; n < node.childNodes.length; n++) {\n            var child = node.childNodes[n];\n            if (child.nodeType === Node.TEXT_NODE) {\n                child.nodeValue = child.nodeValue.trim();\n                if (child.nodeValue.length === 0) {\n                    node.removeChild(child);\n                    n--;\n                }\n            } else if (child.nodeType === Node.ELEMENT_NODE) {\n                RenderError.#cleanup(child);\n            }\n        }\n        return node;\n    }\n}\n\nexport { Template, RenderError };\n","import { Nodes } from './dom.mjs';\nimport { ExpressionEvaluator } from './expressions.mjs';\nimport { Template } from './template.mjs';\n\nclass UpgradeQueue {\n    #q = new Map();\n    constructor() {\n        document.addEventListener('DOMContentLoaded', async () => {\n            const pending = Array.from(this.entries).map(([child, promise]) => promise);\n            await Promise.all(pending);\n            document.dispatchEvent(\n                new CustomEvent('ftl:ready', {\n                    bubbles: false,\n                    cancelable: false,\n                }),\n            );\n        });\n    }\n    enqueue(el) {\n        if (this.#q.has(el)) {\n            //already upgrading, can happen when disconnecting an element\n            //while it's already queued for upgrade (e.g.: ful-form)\n            return;\n        }\n        const promise = Nodes.waitParsed(el)\n            .then(() => el.upgrade())\n            .finally(() => this.#q.delete(el));\n        this.#q.set(el, promise);\n    }\n    get entries() {\n        return this.#q.entries();\n    }\n}\n\n\nclass Registry {\n    #tagToClass = {};\n    #configured = false;\n    #mappers = {\n        string: {\n            unmarshal(str, name, el) {\n                return str;\n            },\n            marshal(value, name, el) {\n                return value == null ? null : String(value);\n            },\n        },\n        number: {\n            unmarshal(str, name, el) {\n                return str === null ? null : Number(str);\n            },\n            marshal(value, name, el) {\n                return value == null ? null : String(value);\n            },\n        },\n        presence: {\n            unmarshal(str, name, el) {\n                return str !== null;\n            },\n            marshal(value, name, el) {\n                return value ? '' : null;\n            },\n        },\n        bool: {\n            unmarshal(str, name, el) {\n                return str === 'true';\n            },\n            marshal(value, name, el) {\n                return value == null ? null : String(value === true);\n            },\n        },\n        json: {\n            unmarshal(str, name, el) {\n                return str === null ? null : JSON.parse(str);\n            },\n            marshal(value, name, el) {\n                return value == null ? null : JSON.stringify(value);\n            },\n        },\n        csv: {\n            unmarshal(str, name, el) {\n                return str === null\n                    ? []\n                    : str\n                          .split(',')\n                          .map((e) => e.trim())\n                          .filter((e) => e);\n            },\n            marshal(value, name, el) {\n                return value == null ? null : value.join(',');\n            },\n        },\n        csvm: {\n            unmarshal(str, name, el) {\n                if (el.hasAttribute('multiple')) {\n                    return str === null\n                        ? []\n                        : str\n                              .split(',')\n                              .map((e) => e.trim())\n                              .filter((e) => e);\n                }\n                return str === null || str === '' ? null : str;\n            },\n            marshal(value, name, el) {\n                if (el.hasAttribute('multiple')) {\n                    return value === null ? null : value.join(',');\n                }\n                return value == null ? null : String(value);\n            },\n        },\n    };\n    #components = {};\n    #modules;\n    #data = [];\n    #upgradeQueue = new UpgradeQueue();\n    defineElement(tag, klass) {\n        if (!this.#configured) {\n            this.#tagToClass[tag] = klass;\n            return this;\n        }\n        this.#augmentAndDefineElement(tag, klass);\n        return this;\n    }\n    #augmentAndDefineElement(tag, klass) {\n        const { observed, attributes, template, templates, slots, mappers } = klass;\n        const observedNames = (observed ?? []).map((a) => a.split(':')[0]);\n        const attrToMapper = [...(attributes ?? []), ...(observed ?? [])].reduce((acc, a) => {\n            const [attr, maybeType] = a.split(':');\n            const type = maybeType?.trim() ?? 'string';\n            if (!(type in this.#mappers) && !(type in (mappers ?? {}))) {\n                throw new Error(`unsupported attribute type: ${type}`);\n            }\n            acc[attr.trim()] = mappers?.[type] ?? this.#mappers[type];\n            return acc;\n        }, {});\n\n        const namesAndTemplates = Object.entries(\n            Object.assign({}, templates, template ? { default: template } : {}),\n        ).map(([k, v]) => [k, Template.fromHtml(v)]);\n        const nameToTemplate = Object.fromEntries(namesAndTemplates);\n\n        klass.BITS = {\n            enqueue: (el) => this.#upgradeQueue.enqueue(el),\n            SLOTS: slots,\n            OBSERVED: observedNames,\n            ATTR_TO_MAPPER: attrToMapper,\n            TEMPLATES: nameToTemplate,\n        };\n        customElements.define(tag, klass);\n    }\n    defineModule(name, value) {\n        const module = name ? { [name]: value } : value;\n        this.#modules = { ...this.#modules, ...module };\n        return this;\n    }\n    defineModules(ms) {\n        this.#modules = ms;\n        return this;\n    }\n    defineComponent(name, value) {\n        this.#components[name] = value;\n        return this;\n    }\n    defineData(...data) {\n        this.#data = data;\n        return this;\n    }\n    defineOverlay(...data) {\n        this.#data = [...this.#data, ...data];\n        return this;\n    }\n    defineMapper(k, v) {\n        this.#mappers[k] = v;\n        return this;\n    }\n    plugin(p) {\n        p.configure(this);\n        return this;\n    }\n    configure() {\n        for (const [tag, klass] of Object.entries(this.#tagToClass)) {\n            this.#augmentAndDefineElement(tag, klass);\n            delete this.#tagToClass[tag];\n        }\n        this.#configured = true;\n        return this;\n    }\n    get upgrades() {\n        return this.#upgradeQueue.entries;\n    }\n    context() {\n        return { modules: this.#modules, data: this.#data };\n    }\n    evaluator() {\n        return new ExpressionEvaluator(this.#modules, this.#data);\n    }\n    component(name) {\n        return this.#components[name];\n    }\n}\n\nconst registry = new Registry();\n\nexport { Registry, registry };\n","import { registry } from './registry.mjs';\nimport { Template } from './template.mjs';\n\nclass Templates {\n    static fromHtml(html) {\n        const { modules, data } = registry.context();\n        return Template.fromHtml(html, modules, ...data);\n    }\n    static fromSelector(selector) {\n        const { modules, data } = registry.context();\n        return Template.fromSelector(selector, modules, ...data);\n    }\n    static fromTemplate(templateEl) {\n        const { modules, data } = registry.context();\n        return Template.fromTemplate(templateEl, modules, ...data);\n    }\n    static fromFragment(fragment) {\n        const { modules, data } = registry.context();\n        return Template.fromFragment(fragment, modules, ...data);\n    }\n}\n\nexport { Templates };\n","import { registry } from './registry.mjs';\n\nclass Rendering {\n    static async waitFor(el) {\n        const pending = Array.from(registry.upgrades)\n            .filter(([child, promise]) => el.contains(child))\n            .map(([child, promise]) => promise);\n        await Promise.all(pending);\n    }\n    static async waitForChildren(el) {\n        const pending = Array.from(registry.upgrades)\n            .filter(([child, promise]) => el !== child && el.contains(child))\n            .map(([child, promise]) => promise);\n        await Promise.all(pending);\n    }\n}\n\nexport { Rendering };\n","import { Attributes, LightSlots } from './dom.mjs';\nimport { registry } from './registry.mjs';\n\n/**\n * An attribute Mapper.\n *\n * @typedef {object} Mapper\n * @property {(val: string|null|undefined, name: string, el: Element) => any} unmarshal\n * @property {(val: any, name: string, el: Element) => string|null} marshal\n */\n\n\nclass ParsedElement extends HTMLElement {\n    static BITS = {\n        enqueue: (el) => {},\n        SLOTS: false,\n        OBSERVED: [],\n        /** @type {Record<string, Mapper>} */\n        ATTR_TO_MAPPER: {},\n        TEMPLATES: {},\n    };\n    static get observedAttributes() {\n        return this.BITS.OBSERVED;\n    }\n    #parsed = false;\n    #reflecting = 0;\n    #bits() {\n        return /** @type {typeof ParsedElement} */ (this.constructor).BITS;\n    }\n    unmarshal(attr, str) {\n        return this.#bits().ATTR_TO_MAPPER[attr].unmarshal(str, attr, this);\n    }\n    marshal(attr, value) {\n        return this.#bits().ATTR_TO_MAPPER[attr].marshal(value, attr, this);\n    }\n    /**\n     * @param {string} [name] - The name of the template target, defaults to 'default'\n     */\n    template(name) {\n        const { modules, data } = registry.context();\n        let t = this.#bits().TEMPLATES[name ?? 'default'].withData(data).withModules(modules);\n        for (let k of ['l10n', 'config']) {\n            const v = this.constructor[k];\n            if (v) {\n                t = t.withOverlay({ [k]: v });\n            }\n        }\n        return t;\n    }\n    connectedCallback() {\n        if (this.#parsed) {\n            return;\n        }\n        this.#bits().enqueue(this);\n    }\n    attributeChangedCallback(attr, oldValue, newValue) {\n        if (!this.#parsed || oldValue === newValue) {\n            return;\n        }\n        if (this.#reflecting > 0) {\n            return;\n        }\n        this[attr] = this.unmarshal(attr, newValue);\n    }\n    #disabledBeforeParsed = null;\n    formDisabledCallback(disabled) {\n        if (!this.#parsed) {\n            this.#disabledBeforeParsed = disabled;\n            return;\n        }\n        Reflect.set(this, 'disabled', disabled);\n    }\n    async upgrade() {\n        if (this.#parsed) {\n            return;\n        }\n        this.#parsed = true;\n        const slots = this.#bits().SLOTS ? LightSlots.from(this) : undefined;\n        const observed = Object.fromEntries(\n            this.#bits().OBSERVED.map((attribute) => [\n                attribute,\n                this.unmarshal(attribute, this.getAttribute(attribute)),\n            ]),\n        );\n        const disabled = this.#disabledBeforeParsed ?? false;\n        await this.render({ slots, observed, disabled });\n    }\n    render(c) {}\n    reflect(fn) {\n        ++this.#reflecting;\n        try {\n            fn();\n        } finally {\n            --this.#reflecting;\n        }\n    }\n    reflectTo(attr, value) {\n        ++this.#reflecting;\n        try {\n            Attributes.set(this, attr, this.marshal(attr, value));\n        } finally {\n            --this.#reflecting;\n        }\n    }\n}\n\nexport { ParsedElement };\n","/**\n * @typedef {{ type: string; context: string?; reason: string; details: any?; }} Problem\n */\nclass Failure extends Error {\n    /**\n     *\n     * @param {string} message\n     * @param {Problem[]} problems\n     * @param {*} cause\n     */\n    constructor(message, problems, cause) {\n        super(message, { cause });\n        this.name = 'Failure';\n        this.problems = problems;\n    }\n    dropping(prefix) {\n        return new Failure(this.message, Failure.dropProblemsContext(this.problems, prefix), this);\n    }\n    static dropProblemsContext(problems, prefix) {\n        return problems.map(({ type, context, reason, details }) => {\n            const nctx = context?.startsWith(prefix) ? context.substring(prefix.length) : context;\n            return { type, context: nctx, reason, details };\n        });\n    }\n}\n\nexport { Failure };\n","class Base64 {\n    static encode(arrayBuffer, dialect) {\n        const d = dialect || Base64.URL_SAFE;\n        const len = arrayBuffer.byteLength;\n        const view = new Uint8Array(arrayBuffer);\n        let res = '';\n        for (let i = 0; i < len; i += 3) {\n            const v1 = d[view[i] >> 2];\n            const v2 = d[((view[i] & 3) << 4) | (view[i + 1] >> 4)];\n            const v3 = d[((view[i + 1] & 15) << 2) | (view[i + 2] >> 6)];\n            const v4 = d[view[i + 2] & 63];\n            res += v1 + v2 + v3 + v4;\n        }\n        if (len % 3 === 2) {\n            res = res.substring(0, res.length - 1);\n        } else if (len % 3 === 1) {\n            res = res.substring(0, res.length - 2);\n        }\n        return res;\n    }\n    static decode(str, dialect) {\n        const d = dialect || Base64.URL_SAFE;\n        let nbytes = Math.floor(str.length * 0.75);\n        for (let i = 0; i !== str.length; ++i) {\n            if (str[str.length - i - 1] !== '=') {\n                break;\n            }\n            --nbytes;\n        }\n        const view = new Uint8Array(nbytes);\n\n        let vi = 0;\n        let si = 0;\n        while (vi < str.length * 0.75) {\n            const v1 = d.indexOf(str.charAt(si++));\n            const v2 = d.indexOf(str.charAt(si++));\n            const v3 = d.indexOf(str.charAt(si++));\n            const v4 = d.indexOf(str.charAt(si++));\n            view[vi++] = (v1 << 2) | (v2 >> 4);\n            view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n            view[vi++] = ((v3 & 3) << 6) | v4;\n        }\n\n        return view.buffer;\n    }\n}\n\nBase64.STANDARD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nBase64.URL_SAFE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\nclass Hex {\n    static decode(hex) {\n        if (hex.length % 2 !== 0) {\n            throw new Error('invalid length');\n        }\n        const lenInBytes = hex.length / 2;\n        return new Uint8Array(lenInBytes).map((e, i) => {\n            const offset = i * 2;\n            const octet = hex.substring(offset, offset + 2);\n            return parseInt(octet, 16);\n        });\n    }\n    static encode(bytes, upper) {\n        return Array.from(bytes)\n            .map((b) => b.toString(16))\n            .map((b) => (upper ? b.toUpperCase() : b))\n            .map((o) => o.padStart(2, 0))\n            .join('');\n    }\n}\n\nexport { Base64, Hex };\n","import { Failure } from './failure.mjs';\n\nclass MediaType {\n    #type;\n    #subtype;\n    constructor(type, subtype) {\n        this.#type = type;\n        this.#subtype = subtype;\n    }\n    get normalized() {\n        return `${this.#type}/${this.#subtype}`;\n    }\n    get type() {\n        return this.#type;\n    }\n    get subtype() {\n        return this.#subtype;\n    }\n    /**\n     *\n     * @param {string|null|undefined} v\n     * @returns\n     */\n    static parse(v) {\n        if (!v) {\n            return new MediaType('unknown', 'unknown');\n        }\n        const [prefix, _] = v.split(';');\n        const [ptype, psubtype] = prefix.trim().split('/');\n        return new MediaType(ptype.toLowerCase(), psubtype?.toLowerCase());\n    }\n}\n\n/**\n * @typedef {Int8Array| Uint8Array| Uint8ClampedArray| Int16Array| Uint16Array| Int32Array| Uint32Array| Float32Array| Float64Array| BigInt64Array| BigUint64Array} TypedArray\n */\n/**\n * @typedef {object} HttpInterceptor\n * @property {(url: URL, init: RequestInit|undefined, chain: HttpInterceptorChain) => Promise<Response>} intercept\n */\n\nclass HttpClientError extends Failure {\n    /**\n     * @param {string} message\n     * @param {number} status\n     * @param {{ type: string; context: string?; reason: string; details: any?; }[]} problems\n     * @param {Error|undefined} [cause]\n     */\n    constructor(message, status, problems, cause) {\n        super(message, problems, cause);\n        this.name = 'HttpClientError';\n        this.status = status;\n    }\n    dropping(prefix) {\n        return new HttpClientError(this.message, this.status, Failure.dropProblemsContext(this.problems, prefix), this);\n    }\n    /**\n     *\n     * @param {string} type\n     * @param {any} cause\n     * @returns\n     */\n    static of(type, cause) {\n        return new HttpClientError(\n            cause.message,\n            0,\n            [\n                {\n                    type,\n                    context: null,\n                    reason: cause.message,\n                    details: null,\n                },\n            ],\n            cause,\n        );\n    }\n    /**\n     * Creates an HttpClientError from a Response.\n     * @param {Response} response\n     * @returns an HttpClientError\n     */\n    static async fromResponse(response) {\n        switch (MediaType.parse(response.headers.get('Content-Type')).normalized) {\n            case 'application/failures+json': {\n                const data = await response.json();\n                const message = `${response.status} ${response.statusText}: ${data.length} failures`;\n                return new HttpClientError(message, response.status, data);\n            }\n            case 'application/problem+json': {\n                const data = await response.json();\n                const message = `${response.status} ${response.statusText}: ${data.title} ${data.detail}`;\n                return new HttpClientError(\n                    message,\n                    response.status,\n                    data.problems || [\n                        {\n                            type: 'GENERIC_PROBLEM',\n                            context: null,\n                            reason: message,\n                            details: null,\n                        },\n                    ],\n                );\n            }\n            default: {\n                const text = await response.text();\n                const message = `${response.status} ${response.statusText}: ${text}`;\n                return new HttpClientError(message, response.status, [\n                    {\n                        type: 'GENERIC_PROBLEM',\n                        context: null,\n                        reason: message,\n                        details: null,\n                    },\n                ]);\n            }\n        }\n    }\n}\n\n/**\n * @implements {HttpInterceptor}\n */\nclass CsrfTokenInterceptor {\n    #k;\n    #v;\n    constructor() {\n        this.#k = document.querySelector(\"meta[name='_csrf_header']\")?.getAttribute('content');\n        this.#v = document.querySelector(\"meta[name='_csrf']\")?.getAttribute('content');\n    }\n    async intercept(url, request, chain) {\n        if (this.#k && this.#v) {\n            request.headers.set(this.#k, this.#v);\n        }\n        return await chain.proceed(url, request);\n    }\n}\n/**\n * @implements {HttpInterceptor}\n */\nclass RedirectOnUnauthorizedInterceptor {\n    #redirectUri;\n    /**\n     * @param {string} redirectUri\n     */\n    constructor(redirectUri) {\n        this.#redirectUri = redirectUri;\n    }\n    async intercept(url, request, chain) {\n        const response = await chain.proceed(url, request);\n        if (response.status === 401) {\n            window.location.href = this.#redirectUri;\n            return new Promise(() => {});\n        }\n        return response;\n    }\n}\n\nclass HttpClientBuilder {\n    /**\n     * @type {HttpInterceptor[]}\n     */\n    #interceptors;\n    constructor() {\n        this.#interceptors = [];\n    }\n    withCsrfToken() {\n        this.#interceptors.push(new CsrfTokenInterceptor());\n        return this;\n    }\n    withRedirectOnUnauthorized(redirectUri) {\n        this.#interceptors.push(new RedirectOnUnauthorizedInterceptor(redirectUri));\n        return this;\n    }\n    /**\n     * @param {...HttpInterceptor} interceptors\n     */\n    withInterceptors(...interceptors) {\n        this.#interceptors.push(...interceptors);\n        return this;\n    }\n    build() {\n        return new HttpClient(this.#interceptors);\n    }\n}\n\n/**\n * @implements {HttpInterceptor}\n */\nclass HttpCall {\n    async intercept(url, request, chain) {\n        return await fetch(url, request);\n    }\n}\n\nclass HttpInterceptorChain {\n    #interceptors;\n    #current;\n    /**\n     *\n     * @param {HttpInterceptor[]} interceptors\n     * @param {number} current\n     */\n    constructor(interceptors, current) {\n        this.#interceptors = interceptors;\n        this.#current = current;\n    }\n    /**\n     *\n     * @param {URL} url\n     * @param {RequestInit} request\n     * @returns {Promise<Response>} the response\n     */\n    async proceed(url, request) {\n        const interceptor = this.#interceptors[this.#current];\n        return await interceptor.intercept(\n            url,\n            request,\n            new HttpInterceptorChain(this.#interceptors, this.#current + 1),\n        );\n    }\n}\n\nclass HttpClient {\n    #interceptors;\n    /**\n     * Creates a builder for an HttpClient.\n     * @returns {HttpClientBuilder} the client builder\n     */\n    static builder() {\n        return new HttpClientBuilder();\n    }\n    /**\n     * Creates an HttpClient.\n     * @param {HttpInterceptor[]|undefined} interceptors - a list of interceptors to be registered for every request performed by the created client.\n     */\n    constructor(interceptors) {\n        this.#interceptors = interceptors || [];\n    }\n    /**\n     * Performs an HTTP exchange.\n     * @async\n     * @param {string} uri - the (possibly relative) request url\n     * @param {RequestInit|undefined} options - fetch options\n     * @param {HttpInterceptor[]|undefined} interceptors - the HttpInterceptors to be registered for this exchange.\n     * @returns {Promise<Response>} the response\n     */\n    async exchange(uri, options, interceptors) {\n        const is = [...this.#interceptors, ...(interceptors || []), new HttpCall()];\n        const chain = new HttpInterceptorChain(is, 0);\n        const url = new URL(new Request(uri).url);\n        return await chain.proceed(url, options ?? {});\n    }\n    /**\n     * Creates a request builder.\n     * @param {string} method - the HTTP method to be used\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the request builder\n     */\n    request(method, uri) {\n        return HttpRequestBuilder.create(this, method, uri);\n    }\n    /**\n     * Creates a request builder.\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the request builder\n     */\n    get(uri) {\n        return HttpRequestBuilder.create(this, 'GET', uri);\n    }\n    /**\n     * Creates a request builder.\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the request builder\n     */\n    head(uri) {\n        return HttpRequestBuilder.create(this, 'HEAD', uri);\n    }\n    /**\n     * Creates a request builder.\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the request builder\n     */\n    post(uri) {\n        return HttpRequestBuilder.create(this, 'POST', uri);\n    }\n    /**\n     * Creates a request builder.\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the request builder\n     */\n    put(uri) {\n        return HttpRequestBuilder.create(this, 'PUT', uri);\n    }\n    /**\n     * Creates a request builder.\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the request builder\n     */\n    patch(uri) {\n        return HttpRequestBuilder.create(this, 'PATCH', uri);\n    }\n    /**\n     * Creates a request builder.\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the request builder\n     */\n    delete(uri) {\n        return HttpRequestBuilder.create(this, 'DELETE', uri);\n    }\n}\n\n/**\n *\n * @param {Response} response\n * @param {'text'|'json'|'blob'|'arrayBuffer'} type\n * @returns\n */\nconst unmarshal = async (response, type) => {\n    try {\n        return await response[type]();\n    } catch (ex) {\n        throw HttpClientError.of('UNMARSHALING_PROBLEM', ex);\n    }\n};\n\nclass HttpRequestBuilder {\n    #client;\n    #method;\n    #uri;\n    #params;\n    #headers;\n    #body;\n    #options;\n    #interceptors;\n    /**\n     * Creates an HttpRequestBuilder.\n     * @param {HttpClient} client\n     * @param {string} method - the HTTP method to be used\n     * @param {string} uri - the (possibly relative) request url\n     * @returns {HttpRequestBuilder} the builder\n     */\n    static create(client, method, uri) {\n        const [baseUri, queryString = ''] = uri.split('?');\n        return new HttpRequestBuilder(\n            client,\n            method,\n            baseUri,\n            new URLSearchParams(queryString),\n            new Headers(),\n            undefined,\n            {},\n            [],\n        );\n    }\n    /**\n     * Creates an HttpRequestBuilder.\n     * @param {HttpClient} client\n     * @param {string} method - the HTTP method to be used\n     * @param {string} uri - the (possibly relative) request url\n     * @param {URLSearchParams} params\n     * @param {Headers} headers\n     * @param {any} body\n     * @param {Omit<RequestInit,\"headers\"|\"method\"|\"body\">} options\n     * @param {HttpInterceptor[]} interceptors\n     */\n    constructor(client, method, uri, params, headers, body, options, interceptors) {\n        this.#client = client;\n        this.#method = method;\n        this.#uri = uri;\n        this.#params = params;\n        this.#body = body;\n        this.#headers = headers;\n        this.#options = options;\n        this.#interceptors = interceptors;\n    }\n    /**\n     * Add all passed headers to the request, overriding existing ones if that key already exists. Null and undefined values cause the key to be removed.\n     * @param {HeadersInit} hs\n     * @returns {HttpRequestBuilder} this builder\n     */\n    headers(hs) {\n        for (const [k, v] of new Headers(hs).entries()) {\n            if (v == null) {\n                this.#headers.delete(k);\n            } else {\n                this.#headers.set(k, v);\n            }\n        }\n        return this;\n    }\n    /**\n     * Adds an header to the request, overriding it if it already exists. Null and undefined values cause the key to be removed\n     * @param {string} k\n     * @param {string} v\n     * @returns {HttpRequestBuilder} this builder\n     */\n    header(k, v) {\n        if (v == null) {\n            this.#headers.delete(k);\n        } else {\n            this.#headers.set(k, v);\n        }\n        return this;\n    }\n    /**\n     * Add all query parameters to the request, overriding existing ones if that key already exists. Null and undefined values cause the key to be removed\n     * @param {URLSearchParams|Record<string,string>|string[][]|string} ps\n     * @returns {HttpRequestBuilder} this builder\n     */\n    params(ps) {\n        for (const [k, v] of new URLSearchParams(ps).entries()) {\n            if (v == null) {\n                this.#params.delete(k);\n            } else {\n                this.#params.set(k, v);\n            }\n        }\n        return this;\n    }\n    /**\n     * Adds a query parameter to the request, overriding it if it already exists. Empty vs, or a single null or undefined value cause the key to be removed.\n     * @param {string} k\n     * @param {...string} vs\n     * @returns {HttpRequestBuilder} this builder\n     */\n    param(k, ...vs) {\n        if (vs.length === 0 || vs[0] == null) {\n            this.#params.delete(k);\n            return this;\n        }\n        for (const v of vs) {\n            this.#params.append(k, v);\n        }\n        return this;\n    }\n    /**\n     * Sets the request body.\n     * `Content-Type: multipart/form-data` header is automatically added by fetch when data is a FormData instance if not explicitly set.\n     * `Content-Type: application/x-www-form-urlencoded` header is automatically added by fetch when data is an URLSearchParams instance if not explicitly set.\n     * `Content-Type: text/plain` header is automatically added by fetch when data is a string instance if not explicitly set.\n     * @param {string|ArrayBuffer|Blob|DataView|File|FormData|TypedArray|URLSearchParams|ReadableStream} data\n     * @returns {HttpRequestBuilder} this builder\n     */\n    body(data) {\n        this.#body = data;\n        return this;\n    }\n    /**\n     * Sets the request body that will be serialized as json. Calling this method adds the `Content-Type application/json` header for the request.\n     * @param {any} body - the body to be serialized as json\n     * @returns {HttpRequestBuilder} this builder\n     */\n    json(body) {\n        this.#headers.set('Content-Type', 'application/json');\n        this.#body = JSON.stringify(body);\n        return this;\n    }\n    /**\n     * Sets the request body as a FormData configured using the callback.\n     * `Content-Type: multipart/form-data` header is automatically added by fetch if not explicitly set.\n     * @param {function(HttpMultipartRequestCustomizer):void} callback\n     */\n    multipart(callback) {\n        const formData = new FormData();\n        const builder = new HttpMultipartRequestCustomizer(formData);\n        callback(builder);\n        this.#body = formData;\n        return this;\n    }\n    /**\n     * Sets a fetch options for the request.\n     * @param {Omit<RequestInit,\"headers\"|\"method\"|\"body\">} kvs\n     * @returns {HttpRequestBuilder} this builder\n     */\n    options(kvs) {\n        for (const [k, v] of Object.entries(kvs)) {\n            this.#options[k] = v;\n        }\n        return this;\n    }\n    /**\n     * Sets a fetch option for the request.\n     * @param {keyof Omit<RequestInit,\"headers\"|\"method\"|\"body\">} k\n     * @param {*} v\n     * @returns {HttpRequestBuilder} this builder\n     */\n    option(k, v) {\n        this.#options[k] = v;\n        return this;\n    }\n    /**\n     * Adds interceptors to the request.\n     * @param {[HttpInterceptor]} is - the interceptor to be regisered\n     * @returns {HttpRequestBuilder} this builder\n     */\n    interceptors(is) {\n        for (const i of is) {\n            this.#interceptors.push(i);\n        }\n        return this;\n    }\n    /**\n     * Adds an interceptor to the request.\n     * @param {HttpInterceptor} i - the interceptor to be regisered\n     * @returns {HttpRequestBuilder} this builder\n     */\n    interceptor(i) {\n        this.#interceptors.push(i);\n        return this;\n    }\n    /**\n     * Performs an HTTP exchange using the configured client, request and interceptors.\n     * @returns {Promise<Response>} the response\n     */\n    async exchange() {\n        const uri = this.#params.size ? `${this.#uri}?${this.#params}` : this.#uri;\n        const opts = {\n            ...this.#options,\n            headers: this.#headers,\n            method: this.#method,\n            body: this.#body,\n        };\n        return await this.#client.exchange(uri, opts, this.#interceptors);\n    }\n    /**\n     * Performs an HTTP exchange using the configured client request, and interceptos throwing a failure when response status is not in the 200-299 range.\n     * @returns {Promise<Response>} the response\n     */\n    async fetch() {\n        const uri = this.#params.size ? `${this.#uri}?${this.#params}` : this.#uri;\n        const opts = {\n            ...this.#options,\n            headers: this.#headers,\n            method: this.#method,\n            body: this.#body,\n        };\n        try {\n            const response = await this.#client.exchange(uri, opts, this.#interceptors);\n            if (!response.ok) {\n                throw await HttpClientError.fromResponse(response);\n            }\n            return response;\n        } catch (ex) {\n            if (ex instanceof Failure) {\n                throw ex;\n            }\n            throw HttpClientError.of('CONNECTION_PROBLEM', ex);\n        }\n    }\n    /**\n     * Performs an HTTP exchange using the configured client request, and interceptos throwing a failure when response status is not in the 200-299 range.\n     * @returns {Promise<string>} the response body, as text\n     */\n    async fetchText() {\n        const response = await this.fetch();\n        return await unmarshal(response, 'text');\n    }\n    /**\n     * Performs an HTTP exchange using the configured client request, and interceptos throwing a failure when response status is not in the 200-299 range.\n     * @returns {Promise<any>} the response body, deserialized as JSON\n     */\n    async fetchJson() {\n        const response = await this.fetch();\n        return await unmarshal(response, 'json');\n    }\n    /**\n     * Performs an HTTP exchange using the configured client request, and interceptos throwing a failure when response status is not in the 200-299 range.\n     * @returns {Promise<Blob>} the response body, as a Blob\n     */\n    async fetchBlob() {\n        const response = await this.fetch();\n        return await unmarshal(response, 'blob');\n    }\n    /**\n     * Performs an HTTP exchange using the configured client request, and interceptos throwing a failure when response status is not in the 200-299 range.\n     * @returns {Promise<ArrayBuffer>} the response body, as an ArrayBuffer\n     */\n    async fetchArrayBuffer() {\n        const response = await this.fetch();\n        return await unmarshal(response, 'arrayBuffer');\n    }\n}\n\nclass HttpMultipartRequestCustomizer {\n    #formData;\n    /**\n     *\n     * @param {FormData} formData\n     */\n    constructor(formData) {\n        this.#formData = formData;\n    }\n    /**\n     * Appends a value to the FormData.\n     * @param {string} name\n     * @param {*} value\n     * @returns this builder\n     */\n    field(name, value) {\n        this.#formData.append(name, value);\n        return this;\n    }\n    /**\n     * Appends a Blob to the FormData.\n     * If `filename` is omitted, FormData defaults are applied:\n     * The default filename for Blob objects is \"blob\";\n     * The default filename for File objects is the file's filename.\n     * @param {string} name\n     * @param {Blob} value\n     * @param {string|undefined} filename\n     * @returns this builder\n     */\n    blob(name, value, filename) {\n        this.#formData.append(name, value, filename);\n        return this;\n    }\n    /**\n     * Appends multiple Blobs to the FormData with the same name.\n     * The default filename for Blob objects is \"blob\";\n     * The default filename for File objects is the file's filename.\n     * @param {string} name\n     * @param {Blob[]} values\n     * @returns this builder\n     */\n    blobs(name, values) {\n        for (let v of values) {\n            this.#formData.append(name, v);\n        }\n        return this;\n    }\n    /**\n     * Appends a JSON serialized blob to the FormData.\n     * @param {string} name\n     * @param {any} value\n     * @param {string|undefined} filename\n     * @returns this builder\n     */\n    json(name, value, filename) {\n        const blob = new Blob([JSON.stringify(value)], { type: 'application/json' });\n        this.#formData.append(name, blob, filename);\n        return this;\n    }\n}\n\nexport { MediaType, HttpClient, HttpClientError };\n","class LocalStorage extends Storage {\n    static save(k, v) {\n        localStorage.setItem(k, JSON.stringify(v));\n    }\n    static load(k) {\n        const got = localStorage.getItem(k);\n        return got === null ? undefined : JSON.parse(got);\n    }\n    static remove(k) {\n        localStorage.removeItem(k);\n    }\n    static pop(k) {\n        const decoded = LocalStorage.load(k);\n        LocalStorage.remove(k);\n        return decoded;\n    }\n}\n\nclass SessionStorage extends Storage {\n    static save(k, v) {\n        sessionStorage.setItem(k, JSON.stringify(v));\n    }\n    static load(k) {\n        const got = sessionStorage.getItem(k);\n        return got === null ? undefined : JSON.parse(got);\n    }\n    static remove(k) {\n        sessionStorage.removeItem(k);\n    }\n    static pop(k) {\n        const decoded = SessionStorage.load(k);\n        SessionStorage.remove(k);\n        return decoded;\n    }\n}\n\nclass VersionedLocalStorage {\n    static save(key, revision, data) {\n        LocalStorage.save(key, { revision, data });\n    }\n    static load(key, revision) {\n        const stored = LocalStorage.load(key);\n        if (stored === undefined) {\n            return undefined;\n        }\n        if (stored.revision !== revision) {\n            localStorage.removeItem(key);\n            return undefined;\n        }\n        return stored.data;\n    }\n}\n\nclass VersionedSessionStorage {\n    static save(key, revision, data) {\n        SessionStorage.save(key, { revision, data });\n    }\n    static load(key, revision) {\n        const stored = SessionStorage.load(key);\n        if (stored === undefined) {\n            return undefined;\n        }\n        if (stored.revision !== revision) {\n            localStorage.removeItem(key);\n            return undefined;\n        }\n        return stored.data;\n    }\n}\n\nexport { LocalStorage, VersionedLocalStorage, SessionStorage, VersionedSessionStorage };\n","/**\n * @typedef {Object} AsyncExtension\n * @property {Promise<any>[]} promises\n * @typedef {Event & { async?: AsyncExtension }} AsyncEvent\n */\nclass AsyncEvents {\n    /**\n     * Dispatches an event and handles asynchronous resolution based on the execution mode.\n     * @param {HTMLElement} el - The target element dispatching the event.\n     * @param {AsyncEvent} evt - The event instance.\n     * @param {{mode?: 'broadcast' | 'pipeline' | 'delegate'}} [options] - Configuration options (defaults to 'broadcast').\n     * @returns {Promise<any>} Resolves with an array of values for broadcasts, a single value for pipelines/delegates, or undefined.\n     */\n    static async fireAsync(el, evt, options) {\n        el.dispatchEvent(evt);\n        const promises = evt.async?.promises ?? [];\n        const mode = options?.mode ?? 'broadcast';\n        if (mode === 'pipeline' && promises.length > 1) {\n            throw new Error(\n                `[AsyncEvents] Event \"${evt.type}\" is configured in 'pipeline' mode and expects at most one async listener, but ${promises.length} listeners were triggered on this element.`,\n            );\n        }\n        if (mode === 'delegate' && promises.length !== 1) {\n            throw new Error(\n                `[AsyncEvents] Event \"${evt.type}\" is configured in 'delegate' mode and requires exactly one async listener, but ${promises.length} were registered.`,\n            );\n        }\n        return mode === 'broadcast' ? Promise.all(promises) : Promise.resolve(promises[0]);\n    }\n\n    /**\n     * Registers an asynchronous event listener wrapper.\n     * @param {HTMLElement} el - The target element.\n     * @param {string} type - The event name/type.\n     * @param {Function} fn - The async listener middleware function returning the execution result.\n     * @param {AddEventListenerOptions} [options] - Native addEventListener options.\n     * @returns {EventListener} The underlying proxy listener function needed for cleanup via asyncOff.\n     */\n    static asyncOn(el, type, fn, options) {\n        /** @type {(evt: Event) => Promise<void>} */\n        const listener = async (event) => {\n            const ae = /** @type {AsyncEvent} */ (event);\n            if (!ae.async) {\n                ae.async = { promises: [] };\n            }\n            const { promise, resolve, reject } = Promise.withResolvers();\n            ae.async.promises.push(promise);\n            try {\n                resolve(await fn(ae));\n            } catch (e) {\n                reject(e);\n            }\n        };\n\n        el.addEventListener(type, listener, options);\n        return listener;\n    }\n\n    /**\n     * Unregisters an asynchronous event listener proxy.\n     * @param {HTMLElement} el - The target element.\n     * @param {string} type - The event name/type.\n     * @param {EventListener} listener - The proxy listener instance previously returned by asyncOn.\n     * @param {EventListenerOptions} [options] - Native removeEventListener options.\n     */\n    static asyncOff(el, type, listener, options) {\n        el.removeEventListener(type, listener, options);\n    }\n\n    /**\n     * Mixes the asynchronous execution engine extensions into target class prototypes.\n     * @param {...Function} classes - The target class constructors to decorate.\n     */\n    static mixInto(...classes) {\n        for (const k of classes) {\n            Object.assign(k.prototype, {\n                /**\n                 * @this {HTMLElement}\n                 * @param {AsyncEvent} evt\n                 * @param {{mode?: 'broadcast' | 'pipeline' | 'delegate'}} [options]\n                 * @returns {Promise<any>}\n                 */\n                async fireAsync(evt, options) {\n                    return await AsyncEvents.fireAsync(this, evt, options);\n                },\n\n                /**\n                 * @this {HTMLElement}\n                 * @param {string} type\n                 * @param {Function} fn\n                 * @param {AddEventListenerOptions} [options]\n                 * @returns {EventListener}\n                 */\n                asyncOn(type, fn, options) {\n                    return AsyncEvents.asyncOn(this, type, fn, options);\n                },\n\n                /**\n                 * @this {HTMLElement}\n                 * @param {string} type\n                 * @param {EventListener} listener\n                 * @param {EventListenerOptions} [options]\n                 * @returns {void}\n                 */\n                asyncOff(type, listener, options) {\n                    AsyncEvents.asyncOff(this, type, listener, options);\n                },\n            });\n        }\n    }\n}\n\nexport { AsyncEvents };\n","class Timing {\n    static sleep(ms) {\n        return new Promise((resolve) => setTimeout(resolve, ms));\n    }\n    static DEBOUNCE_DEFAULT = 0;\n    static DEBOUNCE_IMMEDIATE = 1;\n    /**\n     * Executes only after a period of inactivity (pause in events).\n     * Respond to the \"end\" of a series of events.\n     * @param {*} timeoutMs\n     * @param {*} func\n     * @param {*} [options]\n     * @returns {[function, function]}\n     */\n    static debounce(timeoutMs, func, options) {\n        const opts = options ?? Timing.DEBOUNCE_DEFAULT;\n        let tid = null;\n        let args = [];\n        let previousTimestamp = 0;\n\n        const later = () => {\n            const elapsed = performance.now() - previousTimestamp;\n            if (timeoutMs > elapsed) {\n                tid = setTimeout(later, timeoutMs - elapsed);\n                return;\n            }\n            tid = null;\n            if (opts !== Timing.DEBOUNCE_IMMEDIATE) {\n                func(...args);\n            }\n            // This check is needed because `func` can recursively invoke `debounced`.\n            if (tid === null) {\n                args = [];\n            }\n        };\n\n        const debounced = function () {\n            args = [...arguments];\n            previousTimestamp = performance.now();\n            if (tid === null) {\n                tid = setTimeout(later, timeoutMs);\n                if (opts === Timing.DEBOUNCE_IMMEDIATE) {\n                    func(...args);\n                }\n            }\n        };\n        const abort = () => clearTimeout(tid);\n        return [debounced, abort];\n    }\n    static THROTTLE_DEFAULT = 0;\n    static THROTTLE_NO_LEADING = 1;\n    static THROTTLE_NO_TRAILING = 2;\n    /**\n     * Executes at most once per specified time interval, regardless of ongoing events.\n     * @param {*} timeoutMs\n     * @param {*} func\n     * @param {*} [options]\n     * @returns {[function, function]}\n     */\n    static throttle(timeoutMs, func, options) {\n        const opts = options ?? Timing.THROTTLE_DEFAULT;\n        let tid = null;\n        let args = [];\n        let previousTimestamp = 0;\n\n        const later = () => {\n            previousTimestamp = opts & Timing.THROTTLE_NO_LEADING ? 0 : performance.now();\n            tid = null;\n            func(...args);\n            if (tid === null) {\n                args = [];\n            }\n        };\n        const throttled = function () {\n            const now = performance.now();\n            if (!previousTimestamp && opts & Timing.THROTTLE_NO_LEADING) {\n                previousTimestamp = now;\n            }\n            const remaining = previousTimestamp === 0 ? 0 : timeoutMs - (now - previousTimestamp);\n            args = [...arguments];\n            if (remaining <= 0 || remaining > timeoutMs) {\n                if (tid !== null) {\n                    clearTimeout(tid);\n                    tid = null;\n                }\n                previousTimestamp = now;\n                func(...args);\n                if (tid === null) {\n                    args = [];\n                }\n            } else if (tid === null && !(opts & Timing.THROTTLE_NO_TRAILING)) {\n                tid = setTimeout(later, remaining);\n            }\n        };\n        const abort = () => clearTimeout(tid);\n        return [throttled, abort];\n    }\n}\n\nexport { Timing };\n","class Bindings {\n    /**\n     * @param {{ [x: string]: any; }} obj\n     * @param {string} prefix\n     * @param {Set<String>} stops\n     * @return {{ [x: string]: any; }}\n     */\n    static flatten(obj, prefix, stops) {\n        return Object.keys(obj).reduce((acc, k) => {\n            const pre = prefix.length ? prefix + '.' + k : k;\n            if (!stops.has(pre) && typeof obj[k] === 'object' && obj[k] !== null) {\n                Object.assign(acc, Bindings.flatten(obj[k], pre, stops));\n            } else {\n                acc[pre] = obj[k];\n            }\n            return acc;\n        }, {});\n    }\n\n    /**\n     * @param {any} result\n     * @param {string} path\n     * @param {any} value\n     */\n    static providePath(result, path, value) {\n        const keys = path.split('.').map((k) => (/^[0-9]+$/.test(k) ? +k : k));\n        let current = result ?? {};\n        let previous = null;\n        for (let i = 0; ; ++i) {\n            const ckey = keys[i];\n            const pkey = keys[i - 1];\n            if (Number.isInteger(ckey) && !Array.isArray(current)) {\n                if (previous !== null) {\n                    previous[pkey] = current = [];\n                } else {\n                    result = current = [];\n                }\n            }\n            if (i === keys.length - 1) {\n                //when value is undefined we only want to define the property if it's not defined\n                current[ckey] = value !== undefined ? value : ckey in current ? current[ckey] : null;\n                return result;\n            }\n            if (current[ckey] === undefined) {\n                current[ckey] = {};\n            }\n            previous = current;\n            current = current[ckey];\n        }\n    }\n    /**\n     *\n     * @param {Element & {dataset?: any} & {checked?: boolean} & {value?: any}} el\n     * @returns\n     */\n    static extract(el) {\n        if (el.getAttribute('type') === 'radio') {\n            if (!el.checked) {\n                return undefined;\n            }\n            return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n        }\n        if (el.getAttribute('type') === 'checkbox') {\n            return el.checked;\n        }\n        if (el.dataset['fulBindType'] === 'boolean') {\n            return !el.value ? null : el.value === 'true';\n        }\n        if (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA') {\n            return el.value === '' || el.value === undefined ? null : el.value;\n        }\n        return el.value;\n    }\n\n    /**\n     *\n     * @param {HTMLFormElement} form\n     * @param {HTMLElement} [submitter]\n     * @returns\n     */\n    static extractFrom(form, submitter) {\n        let result = {};\n        for (const el of form.elements) {\n            // we are assuming submitters are disabled during submit.\n            if (!el.hasAttribute('name') || (el.matches(':disabled') && el !== submitter)) {\n                continue;\n            }\n            result = Bindings.providePath(\n                result,\n                /** @type {string} */ (el.getAttribute('name')),\n                Bindings.extract(el),\n            );\n        }\n        return result;\n    }\n\n    /**\n     *\n     * @param {Element  & {checked?: boolean} & {value?: any}} el\n     * @returns\n     */\n    static mutate(el, raw) {\n        if (el.getAttribute('type') === 'radio') {\n            el.checked = el.getAttribute('value') === raw;\n            return;\n        }\n        if (el.getAttribute('type') === 'checkbox') {\n            el.checked = raw;\n            return;\n        }\n        el.value = raw;\n    }\n\n    static mutateIn(form, values) {\n        const names = Array.from(form.elements)\n            .map((el) => el.getAttribute('name'))\n            .filter((n) => n);\n        for (const [flattenedKey, value] of Object.entries(Bindings.flatten(values, '', new Set(names)))) {\n            for (const el of form.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`)) {\n                Bindings.mutate(el, value);\n            }\n        }\n    }\n\n    static errors(form, es, scrollOnError) {\n        const fieldErrors = es.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT');\n        const globalErrors = es.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n        form.querySelectorAll(`[name]`).forEach((el) => el.setCustomValidity?.(''));\n        form.querySelectorAll('ful-errors').forEach((el) => {\n            el.replaceChildren();\n            el.setAttribute('hidden', '');\n        });\n        fieldErrors.forEach((e) => {\n            const name = e.context.replace(/\\[/g, '.').replace(/\\]\\./g, '.').replace(/\\]/g, '')\n            const parts = name.split('.');\n            for (let i = parts.length; i != 0; --i) {\n                const prefix = parts.slice(0, i).join('.');\n                const suffix = parts.slice(i, parts.length).join('.');\n                form.querySelectorAll(`[name='${CSS.escape(prefix)}']`).forEach((input) =>\n                    input.setCustomValidity?.(e.reason, suffix),\n                );\n            }\n        });\n        form.querySelectorAll('ful-errors').forEach((el) => {\n            const hel = /** @type HTMLElement} */ (el);\n            hel.innerText = globalErrors.map((e) => e.reason).join('\\n');\n            if (globalErrors.length !== 0) {\n                el.removeAttribute('hidden');\n            }\n        });\n        if (es.length == 0 || !scrollOnError) {\n            return;\n        }\n        Array.from(form.querySelectorAll(`:invalid`))\n            .sort((a, b) => a.getBoundingClientRect().y - b.getBoundingClientRect().y)[0]\n            ?.focus();\n    }\n}\n\nexport { Bindings };\n","import { Attributes, ParsedElement, registry } from '../../ftl/index.mjs';\nimport { Failure } from '../../httpc/index.mjs';\nimport { Bindings } from './bindings.mjs';\nimport { AsyncEvents } from '../events/async.mjs';\n\nclass RemoteJsonFormLoader {\n    #http;\n    #url;\n    #method;\n    #requestMapper;\n    #responseMapper;\n    constructor(http, url, method, requestMapper, responseMapper) {\n        this.#http = http;\n        this.#url = url;\n        this.#method = method;\n        this.#requestMapper = requestMapper;\n        this.#responseMapper = responseMapper;\n    }\n    prepare(values, form) {\n        return this.#requestMapper(values, form);\n    }\n    async submit(values, form) {\n        return await this.#http.request(this.#method, this.#url).json(values).fetch();\n    }\n    transform(response, form) {\n        return this.#responseMapper(response, form);\n    }\n}\n\nclass LocalFormLoader {\n    #requestMapper;\n    #responseMapper;\n    constructor(requestMapper, responseMapper) {\n        this.#requestMapper = requestMapper;\n        this.#responseMapper = responseMapper;\n    }\n    async prepare(values, form) {\n        return await this.#requestMapper(values, form);\n    }\n    async submit(values, form, response) {\n        return response;\n    }\n    async transform(response, form) {\n        return await this.#responseMapper(response, form);\n    }\n}\n\nclass FormLoader {\n    static create(el, conf) {\n        const http = registry.component('http-client');\n        const requestMapper = el.hasAttribute('request-mapper')\n            ? registry.component(el.getAttribute('request-mapper'))\n            : (v) => v;\n        const responseMapper = el.hasAttribute('response-mapper')\n            ? registry.component(el.getAttribute('response-mapper'))\n            : (v) => v;\n        const url = el.getAttribute('action');\n        if (!url) {\n            return new LocalFormLoader(requestMapper, responseMapper);\n        }\n        const method = el.getAttribute('method') ?? 'POST';\n        return new RemoteJsonFormLoader(http, url, method, requestMapper, responseMapper);\n    }\n}\n\nclass Form extends ParsedElement {\n    form;\n    render() {\n        const form = (this.form = document.createElement('form'));\n        form.setAttribute('novalidate', '');\n        Attributes.forward('form-', this, form);\n        form.replaceChildren(...this.childNodes);\n        form.addEventListener('submit', async (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            await this.submit(e.submitter ?? undefined);\n        });\n        if (this.hasAttribute('clear-invalid-on-change')) {\n            this.addEventListener('change', (/** @type any */ evt) => {\n                evt.target.setCustomValidity?.('');\n            });\n        }\n        this.replaceChildren(form);\n    }\n    /**\n     *\n     * @param {HTMLElement} [submitter]\n     * @returns\n     */\n    async submit(submitter) {\n        this.spinner(true);\n        try {\n            const loader = registry.component(this.getAttribute('loader') ?? 'loaders:form').create(this);\n            const values = Bindings.extractFrom(this.form, submitter);\n            let request = await loader.prepare(values, this);\n            try {\n                const se = new CustomEvent('submit', {\n                    bubbles: true,\n                    cancelable: true,\n                    detail: { submitter, values, request },\n                });\n                if (!this.dispatchEvent(se)) {\n                    return;\n                }\n                this.errors = [];\n                const sre = new CustomEvent('submit:requested', {\n                    bubbles: true,\n                    cancelable: false,\n                    detail: { submitter, values: se.detail.values, request: se.detail.request },\n                });\n                let response = await AsyncEvents.fireAsync(this, sre, { mode: 'pipeline' });\n                request = sre.detail.request;\n\n                response = await loader.submit(request, this, response);\n                const mapped = await loader.transform(response, this);\n                this.dispatchEvent(\n                    new CustomEvent('submit:success', {\n                        bubbles: true,\n                        cancelable: false,\n                        detail: { submitter, values, request, response: mapped },\n                    }),\n                );\n            } catch (e) {\n                this.dispatchEvent(\n                    new CustomEvent('submit:failure', {\n                        bubbles: true,\n                        cancelable: false,\n                        detail: { submitter, values, request, exception: e },\n                    }),\n                );\n                if (e instanceof Failure) {\n                    this.errors = e.problems;\n                }\n                console.warn('failed to submit form', this, 'reason:', e);\n            }\n        } finally {\n            this.spinner(false);\n        }\n    }\n    reset() {\n        this.form.reset();\n    }\n    spinner(spin) {\n        this.querySelectorAll('ful-spinner').forEach((el) => {\n            const hel = /** @type HTMLElement */ (el);\n            hel.hidden = !spin;\n        });\n        this.querySelectorAll('input,button').forEach((el) => {\n            const hel = /** @type HTMLButtonElement|HTMLInputElement */ (el);\n            if (hel.type !== 'submit' && hel.type !== 'reset') {\n                return;\n            }\n            if (spin) {\n                hel.dataset.wd = String(hel.disabled);\n                hel.disabled = true;\n            } else {\n                hel.disabled = hel.dataset.wd === 'true';\n                delete hel.dataset.wd;\n            }\n        });\n    }\n    set values(vs) {\n        Bindings.mutateIn(this.form, vs);\n    }\n    get values() {\n        return Bindings.extractFrom(this.form);\n    }\n    set errors(es) {\n        Bindings.errors(this.form, es, this.hasAttribute('scroll-on-error'));\n    }\n}\n\nexport { FormLoader, Form };\n","import { Attributes, ParsedElement } from '../../ftl/index.mjs';\n\nclass Input extends ParsedElement {\n    static observed = ['value', 'readonly:presence', 'required:presence'];\n    static slots = true;\n    static template = `\n        <div class=\"form-label\">\n            <label>{{{{ slots.default }}}}</label>\n            {{{{ slots.info }}}}\n        </div>\n        <div class=\"input-group\">\n            <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n            {{{{ slots.before }}}}\n            <input data-tpl-if=\"type != 'textarea'\" class=\"form-control\" data-tpl-type=\"type\" placeholder=\" \" form=\"\">\n            <textarea data-tpl-if=\"type == 'textarea'\" class=\"form-control\" placeholder=\" \" form=\"\"></textarea>\n            {{{{ slots.after }}}}\n            <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n        </div>\n        <ful-field-error></ful-field-error>\n    `;\n    static formAssociated = true;\n    _input;\n    _fieldError;\n    constructor() {\n        super();\n        this.internals = this.attachInternals();\n        this.internals.role = 'presentation';\n    }\n    _type() {\n        return this.getAttribute('type') ?? 'text';\n    }\n    _fragment(type, slots) {\n        return this.template().withOverlay({ type, slots }).render();\n    }\n    render({ slots, observed, disabled, skipObservedSetup }) {\n        const type = this._type();\n        const fragment = this._fragment(type, slots);\n        this._input = fragment.querySelector('input,textarea');\n\n        Attributes.forward('input-', this, this._input);\n        if (!skipObservedSetup) {\n            this.disabled = disabled;\n            this.readonly = observed.readonly;\n            this.required = observed.required;\n            this.value = observed.value;\n        }\n        this._input.addEventListener('keydown', (evt) => {\n            if (evt.key !== 'Enter' || this._type() === 'textarea') {\n                return;\n            }\n            const form = this.internals.form;\n            if (!form) {\n                return;\n            }\n            const candidates = /** @type [HTMLButtonElement|HTMLInputElement] */ (\n                Array.from(form.querySelectorAll('button:not(:disabled), input:not(:disabled)'))\n            );\n            const submitter = candidates.find((el) => el.type === 'submit');\n            form.requestSubmit(submitter);\n        });\n        this._input.addEventListener('input', (evt) => {\n            const re = this.getAttribute('mask');\n            if (!re) {\n                return;\n            }\n            const before = evt.target.value;\n            const after = before.replace(new RegExp(re, 'g'), '');\n            if (before === after) {\n                return;\n            }\n            const start = evt.target.selectionStart;\n            const offset = before.length - after.length;\n            evt.target.value = after;\n            evt.target.setSelectionRange(start - offset, start - offset);\n        });\n        this._input.addEventListener('change', (evt) => {\n            evt.stopPropagation();\n            this.dispatchEvent(\n                new CustomEvent('change', {\n                    bubbles: true,\n                    cancelable: false,\n                    detail: {\n                        value: this.value,\n                    },\n                }),\n            );\n        });\n        const label = fragment.querySelector('label');\n        label.addEventListener('click', () => this.focus());\n        this._fieldError = fragment.querySelector('ful-field-error');\n        this._input.ariaDescribedByElements = [this._fieldError];\n        this._input.ariaLabelledByElements = [label];\n        this.replaceChildren(fragment);\n    }\n    get value() {\n        const uppercase = this.hasAttribute('uppercase');\n        const trim = this.hasAttribute('trim');\n        const v = this._input.value;\n        const uppercased = uppercase ? v.toUpperCase() : v;\n        const trimmed = trim ? uppercased.trim() : uppercased;\n        return trimmed === '' ? null : trimmed;\n    }\n    set value(value) {\n        this._input.value = value === '' ? null : value;\n    }\n    get readonly() {\n        return this._input.readOnly;\n    }\n    set readonly(v) {\n        this._input.readOnly = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'readonly', v);\n        });\n    }\n    get disabled() {\n        return this._input.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        Attributes.toggle(this._input, 'disabled', d);\n    }\n    get required() {\n        return this._input.getAttribute('aria-required') === 'true';\n    }\n    set required(d) {\n        Attributes.set(this._input, 'aria-required', d ? 'true' : null);\n        this.reflect(() => {\n            Attributes.toggle(this, 'required', d);\n        });\n    }\n    focus(options) {\n        this._input.focus(options);\n    }\n    setCustomValidity(error) {\n        if (!error) {\n            this.internals.setValidity({});\n            this._fieldError.innerText = '';\n            return;\n        }\n        this.internals.setValidity({ customError: true }, ' ');\n        this._fieldError.innerText = error;\n    }\n    formResetCallback() {\n        this.value = this.unmarshal('value', this.getAttribute('value'));\n    }\n}\n\nexport { Input };\n","import { ParsedElement } from '../../ftl/index.mjs';\nimport { Input } from './input.mjs';\n\nclass LocalDate extends ParsedElement {\n    render() {\n        const content = this.innerHTML.trim();\n        if (content === '') {\n            this.innerHTML = this.getAttribute('default') ?? '';\n            return;\n        }\n        const locale = this.getAttribute('locale') ?? Intl.DateTimeFormat().resolvedOptions().locale;\n        const formatter = new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'numeric', day: 'numeric' });\n        const [y, m, d] = content.split('-').map(Number);\n        this.innerHTML = formatter.format(new Date(y, m - 1, d));\n    }\n}\n\nclass Instant extends ParsedElement {\n    render() {\n        const content = this.innerHTML.trim();\n        if (content === '') {\n            this.innerHTML = this.getAttribute('default') ?? '';\n            return;\n        }\n        const locale = this.getAttribute('locale') ?? Intl.DateTimeFormat().resolvedOptions().locale;\n        const format = new Intl.DateTimeFormat(locale, {\n            year: 'numeric',\n            month: 'numeric',\n            day: 'numeric',\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric',\n            hour12: false,\n        });\n        this.innerHTML = format.format(new Date(Instant.isoToLocal(content)));\n    }\n    static isoToLocal(iso) {\n        //this is so sad\n        const d = new Date(iso);\n        const pad = (n, v) => String(v).padStart(n, '0');\n        const date = `${d.getFullYear()}-${pad(2, d.getMonth() + 1)}-${pad(2, d.getDate())}`;\n        const time = `${pad(2, d.getHours())}:${pad(2, d.getMinutes())}:${pad(2, d.getSeconds())}.${pad(3, d.getMilliseconds())}`;\n        return `${date}T${time}`;\n    }\n}\n\nclass InputLocalDate extends Input {\n    static observed = ['value', 'readonly:presence', 'required:presence', 'min', 'max', 'step'];\n    _type() {\n        return 'date';\n    }\n    render(conf) {\n        const { observed } = conf;\n        super.render(conf);\n        this.min = observed.min;\n        this.max = observed.max;\n        this.step = observed.step;\n    }\n    get min() {\n        const v = this._input.min;\n        return v === '' ? null : v;\n    }\n    set min(v) {\n        this._input.min = InputLocalDate.#fromIsoOrOffset(v);\n    }\n    get max() {\n        const v = this._input.max;\n        return v === '' ? null : v;\n    }\n    set max(v) {\n        this._input.max = InputLocalDate.#fromIsoOrOffset(v);\n    }\n    get step() {\n        const v = this._input.step;\n        return v === '' ? null : v;\n    }\n    set step(v) {\n        this._input.step = v ?? '';\n    }\n    static #fromIsoOrOffset(v) {\n        if (!v) {\n            return '';\n        }\n        //this could be date.toLocaleDateString('en-CA')\n        const formatLocalDate = (date) =>\n            new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().split('T')[0];\n        if (v === 'now') {\n            return formatLocalDate(new Date());\n        }\n        const re = /^([+-])(\\d+)([dmy])$/;\n        const match = re.exec(v);\n        if (!match) {\n            return v;\n        }\n        const sign = match[1] === '-' ? -1 : 1;\n        const offset = +match[2];\n        const r = new Date();\n        r.setHours(0, 0, 0, 0);\n        switch (match[3]) {\n            case 'd':\n                r.setDate(r.getDate() + offset * sign);\n                break;\n            case 'm':\n                const originalDay = r.getDate();\n                r.setMonth(r.getMonth() + offset * sign);\n                if (r.getDate() !== originalDay) {\n                    r.setDate(0);\n                }\n                break;\n            case 'y':\n                r.setFullYear(r.getFullYear() + offset * sign);\n                break;\n        }\n        return formatLocalDate(r);\n    }\n}\n\nclass InputLocalTime extends InputLocalDate {\n    _type() {\n        return 'time';\n    }\n}\n\nclass InputInstant extends Input {\n    static observed = ['value', 'readonly:presence', 'required:presence', 'min', 'max', 'step'];\n    _type() {\n        return 'datetime-local';\n    }\n    render(conf) {\n        const { observed } = conf;\n        super.render(conf);\n        this.min = observed.min;\n        this.max = observed.max;\n        this.step = observed.step;\n    }\n    get value() {\n        const v = this._input.value;\n        return v === '' ? null : new Date(v).toISOString();\n    }\n    set value(v) {\n        this._input.value = v ? Instant.isoToLocal(v) : '';\n    }\n    get min() {\n        const v = this._input.min;\n        return v === '' ? null : new Date(v).toISOString();\n    }\n    set min(v) {\n        this._input.min = v ? Instant.isoToLocal(v) : '';\n    }\n    get max() {\n        const v = this._input.max;\n        return v === '' ? null : new Date(v).toISOString();\n    }\n    set max(v) {\n        this._input.max = v ? Instant.isoToLocal(v) : '';\n    }\n    get step() {\n        const v = this._input.step;\n        return v === '' ? null : v;\n    }\n    set step(v) {\n        this._input.step = v ?? '';\n    }\n}\n\nexport { Instant, LocalDate, InputLocalDate, InputLocalTime, InputInstant };\n","import { Attributes } from '../../ftl/index.mjs';\nimport { Input } from './input.mjs';\n\nclass InputFile extends Input {\n    static l10n = {\n        en: {\n            dropzonelabel: 'Click or drop your files here',\n            unaccepptablefiletype: 'Only files of type {0} are supported',\n            maxfilesizeexceeded: 'Maximum supported file size is {0}',\n            maxtotalsizeexceeded: 'Maximum supported total file size is {0}',\n            maxfilesexceeded: 'Maximum files count exceeded',\n        },\n        it: {\n            dropzonelabel: 'Clicca o trascina i file qui',\n            unaccepptablefiletype: 'Solo i file di tipo {0} sono supportati',\n            maxfilesizeexceeded: 'La dimensione massima di un file è di {0}',\n            maxtotalsizeexceeded: 'La dimensione massima complessiva dei file è di {0}',\n            maxfilesexceeded: 'Numero massimo di file superato',\n        },\n        es: {\n            dropzonelabel: 'Haz clic o arrastra tus archivos aquí',\n            unaccepptablefiletype: 'Solo se admiten archivos de tipo {0}',\n            maxfilesizeexceeded: 'El tamaño máximo de archivo admitido es {0}',\n            maxtotalsizeexceeded: 'El tamaño total máximo admitido es {0}',\n            maxfilesexceeded: 'Se ha superado el número máximo de archivos',\n        },\n        fr: {\n            dropzonelabel: 'Cliquez ou déposez vos fichiers ici',\n            unaccepptablefiletype: 'Seuls les fichiers de type {0} sont pris en charge',\n            maxfilesizeexceeded: 'La taille maximale de fichier prise en charge est {0}',\n            maxtotalsizeexceeded: 'La taille totale maximale prise en charge est {0}',\n            maxfilesexceeded: 'Nombre maximal de fichiers dépassé',\n        },\n    };\n    static observed = [\n        'value',\n        'readonly:presence',\n        'required:presence',\n        'accept:csv',\n        'multiple:presence',\n        'itemlist:presence',\n        'dropzone:presence',\n        'maxfiles:number',\n        'maxfilesize:number',\n        'maxtotalsize:number',\n    ];\n    #accept;\n    #items;\n    #dropzone;\n    #warnings;\n    _type() {\n        return 'file';\n    }\n    static template = `\n        <div class=\"form-label\">\n            <label>{{{{ slots.default }}}}</label>\n            {{{{ slots.info }}}}\n        </div>\n        <div class=\"input-group\">\n            <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n            {{{{ slots.before }}}}\n            <input class=\"form-control\" data-tpl-type=\"type\" placeholder=\" \" form=\"\">\n            {{{{ slots.after }}}}\n            <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n        </div>\n        <div data-ref=\"dropzone\" class=\"dropzone\" data-tpl-if=\"slots.dropzone\">\n            {{{{ slots.dropzone }}}}\n        </div>\n        <div data-ref=\"dropzone\" class=\"default-dropzone\" data-tpl-if=\"!slots.dropzone\">\n            {{ #l10n:t('dropzonelabel') }}\n        </div>\n        <ful-item-list></ful-item-list>\n        <ful-field-warnings></ful-field-warnings>\n        <ful-field-error></ful-field-error>\n    `;\n    static templates = {\n        items: `\n            <ful-item data-tpl-each=\"files\" data-tpl-var=\"file\" data-tpl-data-name=\"file.name\">\n                <div>{{ file.name }}</div>\n                <div>{{ #bytes:format(file.size) }}</div>\n                <button type=\"button\" class=\"btn btn-sm btn-outline-danger bi bi-x-lg\" alt=\"Rimuovi\"></button>\n            </ful-item>\n        `,\n        warning: `<ful-field-warning>{{ #l10n:t(key, args) }}</ful-field-warning>`,\n    };\n    render(conf) {\n        const { observed } = conf;\n        super.render(conf);\n        this.#items = this.querySelector('ful-item-list');\n        this.#dropzone = this.querySelector('[data-ref=dropzone]');\n        this.#warnings = this.querySelector('ful-field-warnings');\n        this.accept = observed.accept;\n        this.multiple = observed.multiple;\n        this.itemlist = observed.itemlist;\n        this.dropzone = observed.dropzone;\n        this.maxfiles = observed.maxfiles;\n        this.maxfilesize = observed.maxfilesize;\n        this.maxtotalsize = observed.maxtotalsize;\n        this.#warnings.addEventListener('animationend', (e) => {\n            e.target.remove();\n        });\n        this.#items.addEventListener('click', (e) => {\n            if (!e.target.closest('button')) {\n                return;\n            }\n            const fileName = e.target.closest('ful-item').dataset.name;\n            const dt = new DataTransfer();\n            [...this.files].filter((f) => f.name !== fileName).forEach((f) => dt.items.add(f));\n            this.files = dt.files;\n            this.#update();\n        });\n        this.#dropzone.addEventListener('click', (e) => {\n            this.querySelector('input')?.click();\n        });\n\n        this.#dropzone.addEventListener('dragover', (e) => {\n            e.preventDefault();\n        });\n        this.#dropzone.addEventListener('drop', (e) => {\n            e.preventDefault();\n            const dt = new DataTransfer();\n            [...e.dataTransfer.items].filter((i) => i.kind === 'file').forEach((i) => dt.items.add(i.getAsFile()));\n            this.files = dt.files;\n            this.#update();\n        });\n        this._input.addEventListener('change', (e) => {\n            this.#update();\n        });\n    }\n    #formatByteSize(v) {\n        return v > 1024 * 1024\n            ? `${Math.round((v / 1024 / 1024) * 100) / 100}MiB`\n            : v > 1024\n              ? `${Math.round((v / 1024) * 100) / 100}KiB`\n              : `${v}B`;\n    }\n    #update() {\n        this.setCustomValidity();\n        this.#ensureAcceptable();\n        this.#ensureFileSizes();\n        this.#ensureTotalSize();\n        this.#ensureFilesCount();\n        this.template('items')\n            .withOverlay({ files: this.files })\n            .withModule('bytes', { format: this.#formatByteSize })\n            .renderTo(this.#items);\n    }\n    warning(key, args) {\n        this.template('warning').withOverlay({ key, args }).renderTo(this.#warnings);\n    }\n    #ensureAcceptable() {\n        if (!this.#accept.length) {\n            return;\n        }\n        const unacceptable = [...this.files].filter(\n            (file) => !this.#accept.some((type) => file.name.toLowerCase().endsWith(type.toLowerCase())),\n        );\n\n        if (unacceptable.length === 0) {\n            return;\n        }\n        this.warning('unaccepptablefiletype', this.#accept.join(', '));\n        const dt = new DataTransfer();\n        [...this.files].filter((f) => !unacceptable.includes(f)).forEach((f) => dt.items.add(f));\n        this.files = dt.files;\n    }\n    #ensureFilesCount() {\n        if (this.#maxfiles === null) {\n            return;\n        }\n        if (this.files.length <= this.#maxfiles) {\n            return;\n        }\n        this.warning('maxfilesexceeded');\n        const dt = new DataTransfer();\n        this.files = dt.files;\n    }\n\n    #ensureFileSizes() {\n        if (this.#maxfilesize === null) {\n            return;\n        }\n        const oversized = [...this.files].filter((file) => file.size > this.#maxfilesize);\n        if (oversized.length === 0) {\n            return;\n        }\n        this.warning('maxfilesizeexceeded', this.#formatByteSize(this.#maxfilesize));\n        const dt = new DataTransfer();\n        [...this.files].filter((f) => !oversized.includes(f)).forEach((f) => dt.items.add(f));\n        this.files = dt.files;\n    }\n    #ensureTotalSize() {\n        if (this.#maxtotalsize === null) {\n            return;\n        }\n        const totalSize = [...this.files].reduce((acc, file) => acc + file.size, 0);\n        if (totalSize <= this.#maxtotalsize) {\n            return;\n        }\n        this.warning('maxtotalsizeexceeded', this.#formatByteSize(this.#maxtotalsize));\n        this.files = new DataTransfer().files;\n    }\n    get accept() {\n        return this.#accept;\n    }\n    set accept(vs) {\n        this._input.accept = vs.join(',');\n        this.#accept = vs;\n        this.reflect(() => {\n            this.setAttribute('accept', this._input.accept);\n        });\n    }\n    get multiple() {\n        return this._input.multiple;\n    }\n    set multiple(v) {\n        this._input.multiple = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'multiple', v);\n        });\n    }\n    get files() {\n        return this._input.files;\n    }\n    set files(vs) {\n        this._input.files = vs;\n    }\n    get file() {\n        return this.files[0] ?? null;\n    }\n    set file(v) {\n        const dt = new DataTransfer();\n        if (v) {\n            dt.items.add(v);\n        }\n        this.files = dt.files;\n    }\n    get value() {\n        const names = Array.from(this._input.files).map((f) => f.name);\n        return this.multiple ? names : (names[0] ?? null);\n    }\n    set value(v) {\n        if (v) {\n            return;\n        }\n        this.files = new DataTransfer().files;\n        this.#update();\n    }\n    get totalsize() {\n        return Array.from(this.files).reduce((a, f) => a + f.size, 0);\n    }\n    #maxfiles;\n    get maxfiles() {\n        return this.#maxfiles;\n    }\n    set maxfiles(v) {\n        this.#maxfiles = v;\n        this.reflect(() => {\n            Attributes.set(this, 'maxfiles', v);\n        });\n    }\n    #maxfilesize;\n    get maxfilesize() {\n        return this.#maxfilesize;\n    }\n    set maxfilesize(v) {\n        this.#maxfilesize = v;\n        this.reflect(() => {\n            Attributes.set(this, 'maxfilesize', v);\n        });\n    }\n    #maxtotalsize;\n    get maxtotalsize() {\n        return this.#maxtotalsize;\n    }\n    set maxtotalsize(v) {\n        this.#maxtotalsize = v;\n        this.reflect(() => {\n            Attributes.set(this, 'maxtotalsize', v);\n        });\n    }\n    #useItemlist;\n    get itemlist() {\n        return this.#useItemlist;\n    }\n    set itemlist(v) {\n        this.#useItemlist = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'itemlist', v);\n        });\n    }\n    #useDropzone;\n    get dropzone() {\n        return this.#useDropzone;\n    }\n    set dropzone(v) {\n        this.#useDropzone = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'dropzone', v);\n        });\n    }\n}\n\nexport { InputFile };\n","import { Attributes, Fragments, ParsedElement, registry, Templates } from '../../ftl/index.mjs';\nimport { VersionedLocalStorage } from '../storage.mjs';\nimport { Timing } from '../timing.mjs';\n\nclass RemoteLoader {\n    #http;\n    #url;\n    #method;\n    #responseMapper;\n    #prefetch;\n    #revision;\n    #data;\n    constructor({ http, url, method, responseMapper, prefetch, revision }) {\n        this.#http = http;\n        this.#url = url;\n        this.#method = method;\n        this.#responseMapper = responseMapper;\n        this.#prefetch = prefetch;\n        this.#revision = revision;\n        this.#data = null;\n    }\n    async prefetch() {\n        if (!this.#prefetch) {\n            return;\n        }\n        await this.#ensureFetched();\n    }\n    async exact(...keys) {\n        await this.#ensureFetched();\n        return this.#data.filter(([k, v]) => keys.some((r) => r == k));\n    }\n    async load(needle) {\n        await this.#ensureFetched();\n        return this.#data.filter(([k, v]) => (v ?? '').toLowerCase().includes(needle?.toLowerCase()));\n    }\n    async reconfigureUrl(url) {\n        this.#data = null;\n        this.#url = url;\n    }\n    async #ensureFetched() {\n        if (this.#data !== null) {\n            return;\n        }\n        const raw = await RemoteLoader.#revisionedData(this.#http, this.#method, this.#url, this.#revision);\n        this.#data = this.#responseMapper(raw);\n    }\n    static async #revisionedData(http, method, url, revision) {\n        const storageKey = `${method}@${url}`;\n        if (revision !== null) {\n            const data = VersionedLocalStorage.load(storageKey, revision);\n            if (data !== undefined) {\n                return data;\n            }\n        }\n        const data = await http.request(method, url).fetchJson();\n        if (revision !== null) {\n            VersionedLocalStorage.save(storageKey, revision, data);\n        }\n        return data;\n    }\n}\n\nclass PartialRemoteLoader {\n    #http;\n    #url;\n    #method;\n    #responseMapper;\n    constructor({ http, url, method, responseMapper }) {\n        this.#http = http;\n        this.#url = url;\n        this.#method = method;\n        this.#responseMapper = responseMapper;\n    }\n    async exact(...keys) {\n        const response = await this.#http\n            .request(this.#method, this.#url)\n            .param('k', ...keys)\n            .fetchJson();\n        return this.#responseMapper(response);\n    }\n    async load(needle) {\n        const response = await this.#http.request(this.#method, this.#url).param('s', needle).fetchJson();\n        return this.#responseMapper(response);\n    }\n}\n\nclass InMemoryLoader {\n    #data;\n    constructor(data) {\n        this.#data = data;\n    }\n    update(data) {\n        this.#data = data;\n    }\n    exact(...keys) {\n        return this.#data.filter(([k, v]) => keys.some((r) => r == k));\n    }\n    load(needle) {\n        return this.#data.filter(([k, v]) => (v ?? '').toLowerCase().includes(needle?.toLowerCase()));\n    }\n}\n\nclass SelectLoader {\n    static create(el, conf) {\n        if (!el.hasAttribute('src')) {\n            const els = Array.from(conf.options?.querySelectorAll('option') ?? []);\n            const data = els.map((e) => {\n                return [e.getAttribute('value') ?? e.innerText.trim(), e.innerText.trim()];\n            });\n            return new InMemoryLoader(data);\n        }\n        const http = registry.component('http-client');\n        const responseMapper = SelectLoader.#responseMapperFrom(el);\n\n        if ('chunked' == el.getAttribute('mode')) {\n            return new PartialRemoteLoader({\n                http,\n                url: el.getAttribute('src'),\n                method: el.getAttribute('method') ?? 'POST',\n                responseMapper,\n            });\n        }\n        return new RemoteLoader({\n            http,\n            url: el.getAttribute('src'),\n            method: el.getAttribute('method') ?? 'POST',\n            responseMapper,\n            prefetch: el.hasAttribute('preload'),\n            revision: el.getAttribute('revision'),\n        });\n    }\n    static #responseMapperFrom(el) {\n        if (el.hasAttribute('k-expr') && el.hasAttribute('l-expr')) {\n            return (response) => {\n                const rows = registry\n                    .evaluator()\n                    .withOverlay(response)\n                    .evaluateExpression(el.getAttribute('d-expr') ?? 'self');\n                return rows.map((row) => {\n                    const evaluator = registry.evaluator().withOverlay(row);\n                    return [\n                        evaluator.evaluateExpression(el.getAttribute('k-expr')),\n                        evaluator.evaluateExpression(el.getAttribute('l-expr')),\n                        evaluator.evaluateExpression(el.getAttribute('m-expr') ?? 'self'),\n                    ];\n                });\n            };\n        }\n        if (el.hasAttribute('response-mapper')) {\n            return registry.component(el.getAttribute('response-mapper'));\n        }\n        return (response) => response;\n    }\n}\n\nclass Dropdown extends ParsedElement {\n    static slots = true;\n    static template = `\n        <ful-spinner class=\"centered\" hidden></ful-spinner>\n        <menu tabindex=\"-1\" role=\"listbox\" hidden></menu>\n    `;\n    static templates = {\n        options: `\n            <li data-tpl-each=\"self\" data-tpl-selected=\"index == 0\" data-tpl-value=\"index\" role=\"option\" data-tpl-aria-selected=\"index == 0 ? 'true' : 'false'\">\n                {{ label }}\n            </li>\n        `,\n    };\n    #spinner;\n    #menu;\n    #optionstemplate;\n    #options = new Map();\n    render({ slots }) {\n        const fragment = this.template().render();\n        this.#optionstemplate = Fragments.isBlank(slots.default)\n            ? this.template('options')\n            : Templates.fromFragment(slots.default);\n        this.#spinner = fragment.querySelector('ful-spinner');\n        this.#menu = fragment.querySelector('menu');\n        this.#menu.addEventListener('click', (evt) => {\n            evt.stopPropagation();\n            const li = evt.target.closest('li');\n            if (!li) {\n                this.hide();\n                return;\n            }\n            this.#change(li);\n        });\n        this.replaceChildren(fragment);\n    }\n    acceptSelection() {\n        const selected = this.#menu.querySelector('[selected]') ?? this.#menu.firstElementChild;\n        this.#change(selected);\n    }\n    update(values) {\n        if (values === undefined) {\n            throw new Error('null data');\n        }\n        this.#options = new Map(values.map((v, i) => [String(i), v]));\n        const data = values.map(([key, label, metadata], index) => ({ index, key, label, metadata }));\n        this.#optionstemplate.withOverlay(data).renderTo(this.#menu);\n    }\n    #change(target) {\n        const index = target.getAttribute('value');\n        const data = this.#options.get(index);\n        this.hide();\n        this.dispatchEvent(\n            new CustomEvent('change', {\n                bubbles: true,\n                cancelable: false,\n                detail: { index, data },\n            }),\n        );\n    }\n    hide() {\n        this.setAttribute('hidden', '');\n    }\n    get shown() {\n        return !this.hasAttribute('hidden');\n    }\n    async show(loader) {\n        this.removeAttribute('hidden');\n        this.#menu.setAttribute('hidden', '');\n        this.#spinner.removeAttribute('hidden');\n        try {\n            const data = await loader();\n            this.update(data);\n        } finally {\n            this.#spinner.setAttribute('hidden', '');\n            this.#menu.removeAttribute('hidden');\n        }\n    }\n    async moveOrShow(forward, loader) {\n        if (this.shown) {\n            const selected = this.#menu.querySelector('[selected]') ?? this.#menu.firstElementChild;\n            const candidate = selected[`${forward ? 'next' : 'previous'}ElementSibling`];\n            if (candidate) {\n                selected.removeAttribute('selected');\n                candidate.setAttribute('selected', '');\n                candidate.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n            }\n            return;\n        }\n        await this.show(loader);\n    }\n}\n\nclass Select extends ParsedElement {\n    static observed = ['value:csvm', 'readonly:presence', 'required:presence', 'itemlist:presence'];\n    static slots = true;\n    static template = `\n        <div class=\"form-label\">\n            <label>{{{{ slots.default }}}}</label>\n            {{{{ slots.info }}}}\n        </div>\n        <div class=\"input-group flex-nowrap\" tabindex=\"-1\">\n            <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n            {{{{ slots.before }}}}\n            <div class=\"ful-select-input-container\">\n                <div class=\"ful-select-input\">\n                    <badges></badges>\n                    <input type=\"text\" form=\"\" role=\"combobox\" aria-autocomplete=\"list\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n                </div>\n                <ful-dropdown hidden popover=\"manual\">{{{{ slots.dropdown }}}}</ful-dropdown>\n            </div>\n            {{{{ slots.after }}}}\n            <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n        </div>\n        <ful-item-list></ful-item-list>\n        <ful-field-error></ful-field-error>\n    `;\n    static templates = {\n        items: `\n            <ful-item data-tpl-each=\"entries\" data-tpl-var=\"entry\" data-tpl-data-key=\"entry[0]\">\n                <div>{{ entry[1][0] }}</div>\n                <button type=\"button\" class=\"btn btn-sm btn-outline-danger bi bi-x-lg\"></button>\n            </ful-item>\n        `,\n    };\n    static formAssociated = true;\n    internals;\n    #loader;\n    #badges;\n    #ddmenu;\n    #input;\n    #items;\n    #multiple;\n    #fieldError;\n    #values = new Map();\n    constructor() {\n        super();\n        this.internals = this.attachInternals();\n        this.internals.role = 'presentation';\n    }\n    async render({ slots, observed, disabled }) {\n        const name = this.getAttribute('name');\n        this.#loader = registry\n            .component(this.getAttribute('loader') ?? 'loaders:select')\n            .create(this, { options: slots.options });\n\n        this.#multiple = this.hasAttribute('multiple');\n        await this.#loader.prefetch?.();\n        const fragment = this.template().withOverlay({ slots, name }).render();\n        this.#input = fragment.querySelector('input');\n        this.#items = fragment.querySelector('ful-item-list');\n        Attributes.forward('input-', this, this.#input);\n        this.#badges = fragment.querySelector('badges');\n\n        this.value = observed.value;\n        this.disabled = disabled;\n        this.readonly = observed.readonly;\n        this.required = observed.required;\n        this.itemlist = observed.itemlist;\n\n        this.#ddmenu = fragment.querySelector('ful-dropdown');\n        const label = fragment.querySelector('label');\n        label.addEventListener('click', () => this.focus());\n        this.#fieldError = fragment.querySelector('ful-field-error');\n        this.#input.ariaDescribedByElements = [this.#fieldError];\n        this.#input.ariaLabelledByElements = [label];\n\n        const self = this;\n        const [dload, abortdload] = Timing.throttle(400, () => {\n            self.#input.setAttribute('aria-expanded', 'true');\n            self.#ddmenu.show(() => self.#loader.load(self.#input.value));\n        });\n        this.addEventListener('click', (/** @type any */ e) => {\n            if (e.target.matches('input')) {\n                return;\n            }\n            if (this.disabled || this.readonly) {\n                return;\n            }\n            if (this.#ddmenu.shown) {\n                this.#input.setAttribute('aria-expanded', 'false');\n                this.#ddmenu.hide();\n                return;\n            }\n            this.#input.focus();\n            dload();\n        });\n        this.#items.addEventListener('click', (e) => {\n            e.stopPropagation();\n            if (!e.target.closest('button')) {\n                return;\n            }\n            if (this.disabled || this.readonly) {\n                return;\n            }\n            const idx = [...this.#items.children].indexOf(e.target.closest('ful-item'));\n            if (idx === -1) {\n                return;\n            }\n            this.#values.delete(Array.from(this.#values.keys())[idx]);\n            this.#changed();\n            this.#syncBadges();\n        });\n        this.#badges.addEventListener('click', (e) => {\n            e.stopPropagation();\n            if (this.disabled || this.readonly) {\n                return;\n            }\n            const idx = [...this.#badges.children].indexOf(e.target);\n            if (idx === -1) {\n                return;\n            }\n            this.#values.delete(Array.from(this.#values.keys())[idx]);\n            this.#changed();\n            this.#syncBadges();\n        });\n        this.#input.addEventListener('change', (e) => {\n            e.stopPropagation();\n        });\n        this.#input.addEventListener('blur', (e) => {\n            e.stopPropagation();\n            if (e.relatedTarget && this.contains(e.relatedTarget)) {\n                return;\n            }\n            abortdload();\n            this.#input.setAttribute('aria-expanded', 'false');\n            this.#ddmenu.hide();\n            this.#input.value = '';\n        });\n        this.#input.addEventListener('keydown', (e) => {\n            if (this.disabled || this.readonly) {\n                return;\n            }\n            switch (e.code) {\n                case 'ArrowUp': {\n                    e.preventDefault();\n                    this.#input.setAttribute('aria-expanded', 'true');\n                    this.#ddmenu.moveOrShow(false, () => self.#loader.load(self.#input.value));\n                    break;\n                }\n                case 'ArrowDown': {\n                    e.preventDefault();\n                    this.#input.setAttribute('aria-expanded', 'true');\n                    this.#ddmenu.moveOrShow(true, () => self.#loader.load(self.#input.value));\n                    break;\n                }\n                case 'Escape': {\n                    this.#input.setAttribute('aria-expanded', 'false');                    \n                    this.#ddmenu.hide();\n                    break;\n                }\n                case 'Enter': {\n                    e.preventDefault();\n                    this.#input.setAttribute('aria-expanded', 'false');\n                    this.#ddmenu.acceptSelection();\n                    this.#input.value = '';\n                    break;\n                }\n                case 'Backspace': {\n                    //remove last if caret at position 0\n                    if (this.#values.size && this.#input.selectionStart === 0 && this.#input.selectionEnd === 0) {\n                        this.#values.delete(Array.from(this.#values.keys()).pop());\n                        this.#changed();\n                        this.#syncBadges();\n                    }\n                    break;\n                }\n                case 'Tab': {\n                    this.#input.setAttribute('aria-expanded', 'false');\n                    this.#ddmenu.hide();\n                    abortdload();\n                    break;\n                }\n            }\n        });\n        this.#input.addEventListener('input', (e) => {\n            e.stopPropagation();\n            if (this.disabled || this.readonly) {\n                return;\n            }\n            dload();\n        });\n        this.#ddmenu.addEventListener('change', (e) => {\n            e.stopPropagation();\n            if (!this.#multiple) {\n                this.#values.clear();\n            }\n            this.#values.set(e.detail.data[0], e.detail.data.slice(1));\n            this.#changed();\n            this.#syncBadges();\n            this.#input.focus();\n            this.#input.setAttribute('aria-expanded', 'false');\n            this.#ddmenu.hide();\n            this.#input.value = '';\n        });\n        this.replaceChildren(fragment);\n    }\n    async withLoader(fn) {\n        return await fn(this.#loader);\n    }\n    #changed() {\n        const selection = [...this.#values.entries()].map((e) => ({\n            key: e[0],\n            label: e[1][0],\n            metadata: e[1].slice(1),\n        }));\n        const value = this.#multiple ? selection : (selection[0] ?? null);\n        this.dispatchEvent(\n            new CustomEvent('change', {\n                bubbles: true,\n                cancelable: false,\n                detail: { value },\n            }),\n        );\n    }\n    #syncBadges() {\n        const badges = Array.from(this.#values.entries()).map(([k, v]) => {\n            const b = document.createElement('badge');\n            b.setAttribute('role', 'button');\n            b.setAttribute('value', k);\n            b.innerText = v[0];\n            return b;\n        });\n        this.#badges.replaceChildren();\n        this.#badges.append(...badges);\n        this.#items.replaceChildren();\n        this.template('items').withOverlay({ entries: this.#values.entries() }).renderTo(this.#items);\n    }\n    set value(vs) {\n        if (vs === null) {\n            this.#values = new Map();\n            this.#syncBadges();\n            return;\n        }\n        (async () => {\n            const entries = await (this.#multiple ? this.#loader.exact(...vs) : this.#loader.exact(vs));\n            this.#values = new Map(entries.map((e) => [e[0], e.slice(1)]));\n            this.#syncBadges();\n        })();\n    }\n    get value() {\n        if (this.#multiple) {\n            return [...this.#values.keys()];\n        }\n        return [...this.#values.keys()][0] ?? null;\n    }\n    get entry() {\n        if (this.#multiple) {\n            return [...this.#values.entries()];\n        }\n        return [...this.#values.entries()][0] ?? null;\n    }\n    get disabled() {\n        return this.#input.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        Attributes.toggle(this.#input, 'disabled', d);\n    }\n    get readonly() {\n        return this.#input.readOnly;\n    }\n    set readonly(v) {\n        this.#input.readOnly = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'readonly', v);\n        });\n    }\n    get required() {\n        return this.#input.getAttribute('aria-required') === 'true';\n    }\n    set required(d) {\n        Attributes.set(this.#input, 'aria-required', d ? 'true' : null);\n        this.reflect(() => {\n            Attributes.toggle(this, 'required', d);\n        });\n    }\n    #useItemlist;\n    get itemlist() {\n        return this.#useItemlist;\n    }\n    set itemlist(v) {\n        this.#useItemlist = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'itemlist', v);\n        });\n    }\n    focus(options) {\n        this.#input.focus(options);\n    }\n    setCustomValidity(error) {\n        if (!error) {\n            this.internals.setValidity({});\n            this.#fieldError.innerText = '';\n            return;\n        }\n        this.internals.setValidity({ customError: true }, ' ');\n        this.#fieldError.innerText = error;\n    }\n}\n\nexport { Dropdown, Select, SelectLoader };\n","import { Attributes, Fragments, ParsedElement } from '../../ftl/index.mjs';\n\nclass RadioGroup extends ParsedElement {\n    static observed = ['value', 'readonly:presence', 'required:presence'];\n    static slots = true;\n    static template = `\n        <fieldset>\n            <legend class=\"form-label\">\n                {{{{ slots.default }}}}\n            </legend>\n            <header data-tpl-if=\"slots.header\">\n                {{{{ slots.header }}}}\n            </header>\n            <section>\n                <div class=\"label-wrapper\" data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n                    <label>\n                        {{{{ ial[0] }}}}\n                        <div>{{{{ ial[1] }}}}</div>\n                    </label>\n                </div>\n            </section>\n            <ful-field-error></ful-field-error>\n            <footer data-tpl-if=\"slots.footer\">\n                {{{{ slots.footer }}}}\n            </footer>\n        </fieldset>\n    `;\n    static formAssociated = true;\n    #fieldset;\n    #fieldError;\n    #firstRadio;\n    #booleanType;\n    constructor() {\n        super();\n        this.internals = this.attachInternals();\n        this.internals.role = 'radiogroup';\n    }\n    render({ slots, observed, disabled }) {\n        const name = this.getAttribute('name') ?? Attributes.uid('ful-radiogroup');\n        const radioEls = Array.from(slots.default.querySelectorAll('ful-radio'));\n        const inputsAndLabels = radioEls.map((el) => {\n            const input = document.createElement('input');\n            input.setAttribute('type', 'radio');\n            Attributes.forward('input-', this, input);\n            Attributes.forward('', el, input);\n            input.setAttribute('name', `${name}-ignore`);\n            input.setAttribute('form', ``);\n            input.addEventListener('change', (evt) => {\n                evt.stopPropagation();\n                //change is not cancelable\n                this.dispatchEvent(\n                    new CustomEvent('change', {\n                        bubbles: true,\n                        cancelable: false,\n                        detail: {\n                            value: this.value,\n                        },\n                    }),\n                );\n            });\n            const label = Fragments.fromChildNodes(el);\n            return [input, label];\n        });\n\n        radioEls.forEach((el) => el.remove());\n        this.template().withOverlay({ name, slots, inputsAndLabels }).renderTo(this);\n        this.#fieldset = this.firstElementChild;\n        this.disabled = disabled;\n        this.readonly = observed.readonly;\n        this.required = observed.required;\n        this.value = observed.value;\n        this.#fieldError = this.querySelector('ful-field-error');\n        this.ariaDescribedByElements = [this.#fieldError];\n        this.#firstRadio = this.querySelector('input[type=radio]');\n        this.#booleanType = this.getAttribute('type') === 'boolean';\n    }\n    get value() {\n        /** @type {HTMLInputElement|null} */\n        const checked = this.querySelector('input[type=radio]:checked');\n        return checked ? (this.#booleanType ? checked.value === 'true' : checked.value) : null;\n    }\n    set value(value) {\n        if (value === null) {\n            this.querySelectorAll(`input[type=radio]`).forEach((el) => {\n                /** @type {HTMLInputElement} */ (el).checked = false;\n            });\n            return;\n        }\n        /** @type {HTMLInputElement|null} */\n        const el = this.querySelector(`input[type=radio][value=${CSS.escape(String(value))}]`);\n        if (el) {\n            el.checked = true;\n        }\n    }\n    get readonly() {\n        return this.#fieldset.inert;\n    }\n    set readonly(v) {\n        this.#fieldset.inert = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'readonly', v);\n        });\n    }\n    get disabled() {\n        return this.#fieldset.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        Attributes.toggle(this.#fieldset, 'disabled', d);\n    }\n    get required() {\n        return this.#fieldset.getAttribute('aria-required') === 'true';\n    }\n    set required(d) {\n        Attributes.set(this.#fieldset, 'aria-required', d ? 'true' : null);\n        this.reflect(() => {\n            Attributes.toggle(this, 'required', d);\n        });\n    }\n    focus(options) {\n        this.#firstRadio.focus(options);\n    }\n    setCustomValidity(error) {\n        if (!error) {\n            this.internals.setValidity({});\n            this.#fieldError.innerText = '';\n            return;\n        }\n        this.internals.setValidity({ customError: true }, ' ');\n        this.#fieldError.innerText = error;\n    }\n}\n\nexport { RadioGroup };\n","import { Attributes, ParsedElement } from '../../ftl/index.mjs';\n\nclass Checkbox extends ParsedElement {\n    static observed = ['value:bool', 'readonly:presence', 'required:presence'];\n    static slots = true;\n    static template = `\n        <div data-tpl-class=\"klass\">\n            <div class=\"input-container\">\n                <input class=\"form-check-input\" type=\"checkbox\" data-tpl-role=\"isSwitch ? 'switch' : false\" form=\"\" placeholder=\" \">\n            </div>\n            <div class=\"form-check-label\">\n                <label>{{{{ slots.default }}}}</label>\n                {{{{ slots.info }}}}\n            </div>\n        </div>\n        <ful-field-error></ful-field-error>\n    `;\n    #container;\n    #input;\n    #fieldError;\n    static formAssociated = true;\n    constructor() {\n        super();\n        this.internals = this.attachInternals();\n        this.internals.role = 'presentation';\n    }\n    render({ slots, observed, disabled }) {\n        const isSwitch = this.getAttribute('type') == 'switch';\n        const klass = isSwitch ? 'form-check form-switch' : 'form-check';\n        const fragment = this.template().withOverlay({ slots, klass, isSwitch }).render();\n        this.#container = fragment.firstElementChild;\n        this.#input = fragment.querySelector('input');\n        Attributes.forward('input-', this, this.#input);\n        this.disabled = disabled;\n        this.readonly = observed.readonly;\n        this.required = observed.required;\n        this.value = observed.value;\n        this.#input.addEventListener('change', (evt) => {\n            evt.stopPropagation();\n            this.dispatchEvent(\n                new CustomEvent('change', {\n                    bubbles: true,\n                    cancelable: false,\n                    detail: {\n                        value: this.value,\n                    },\n                }),\n            );\n        });\n        const label = fragment.querySelector('label');\n        label.addEventListener('click', () => {\n            this.focus();\n            if (this.disabled || this.readonly) {\n                return;\n            }\n            this.value = !this.value;\n            this.dispatchEvent(\n                new CustomEvent('change', {\n                    bubbles: true,\n                    cancelable: false,\n                    detail: {\n                        value: this.value,\n                    },\n                }),\n            );\n        });\n        this.#fieldError = fragment.querySelector('ful-field-error');\n        this.#input.ariaDescribedByElements = [this.#fieldError];\n        this.#input.ariaLabelledByElements = [label];\n        this.replaceChildren(fragment);\n    }\n    get value() {\n        return this.#input.checked;\n    }\n    set value(value) {\n        this.#input.checked = value;\n    }\n    get readonly() {\n        return this.#container.inert;\n    }\n    set readonly(v) {\n        this.#container.inert = v;\n        this.reflect(() => {\n            Attributes.toggle(this, 'readonly', v);\n        });\n    }\n    get disabled() {\n        return this.#input.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        Attributes.toggle(this.#input, 'disabled', d);\n    }\n    get required() {\n        return this.#input.getAttribute('aria-required') === 'true';\n    }\n    set required(d) {\n        Attributes.set(this.#input, 'aria-required', d ? 'true' : null);\n        this.reflect(() => {\n            Attributes.toggle(this, 'required', d);\n        });\n    }\n    focus(options) {\n        this.#input.focus(options);\n    }\n    setCustomValidity(error) {\n        if (!error) {\n            this.internals.setValidity({});\n            this.#fieldError.innerText = '';\n            return;\n        }\n        this.internals.setValidity({ customError: true }, ' ');\n        this.#fieldError.innerText = error;\n    }\n}\n\nexport { Checkbox };\n","import { ParsedElement } from '../../ftl/index.mjs';\n\nclass Spinner extends ParsedElement {\n    static slots = true;\n    static template = `\n        <div class=\"ful-spinner-wrapper\" role=\"status\">\n            <div class=\"ful-spinner-text\">{{{{ slots.default }}}}</div>\n            <div class=\"ful-spinner-icon\"></div>\n        </div>\n    `;\n    render({ slots }) {\n        this.template().withOverlay({ slots }).renderTo(this);\n    }\n}\n\nexport { Spinner };\n","import { Attributes, Fragments, Nodes, ParsedElement, registry, Rendering } from '../../ftl/index.mjs';\n\nclass SortButton extends ParsedElement {\n    static observed = ['order'];\n    #order;\n    render() {\n        const sorter = this.getAttribute('sorter');\n        const orders = ['asc', 'desc', null];\n        this.addEventListener('click', () => {\n            const nextOrder = orders[(orders.indexOf(this.order) + 1) % 3];\n            this.dispatchEvent(\n                new CustomEvent('sort-requested', {\n                    bubbles: true,\n                    cancelable: true,\n                    detail: {\n                        value: { sorter, order: nextOrder },\n                    },\n                }),\n            );\n        });\n    }\n\n    get order() {\n        return this.#order || null;\n    }\n\n    set order(value) {\n        this.#order = value || null;\n        this.reflect(() => {\n            if (this.#order) {\n                this.setAttribute('order', value);\n            } else {\n                this.removeAttribute('order');\n            }\n        });\n    }\n}\n\nclass Pagination extends ParsedElement {\n    static observed = ['total:number', 'current:number'];\n    static l10n = {\n        en: {\n            showing: 'Page {0} of {1}',\n            navigation: 'Page navigation',\n            previous: 'Previous',\n            next: 'Next',\n        },\n        it: {\n            showing: 'Pagina {0} di {1}',\n            navigation: 'Navigazione pagine',\n            previous: 'Precedente',\n            next: 'Successivo',\n        },\n        es: {\n            showing: 'Página {0} de {1}',\n            navigation: 'Navegación de páginas',\n            previous: 'Anterior',\n            next: 'Siguiente',\n        },\n        fr: {\n            showing: 'Page {0} sur {1}',\n            navigation: 'Navigation des pages',\n            previous: 'Précédent',\n            next: 'Suivant',\n        },\n    };\n    static config = {\n        prevIcon: 'bi bi-chevron-left',\n        nextIcon: 'bi bi-chevron-right',\n        reloadIcon: 'bi bi-arrow-clockwise',\n    };\n    static template = `\n        <nav data-tpl-aria-label=\"#l10n:t('navigation')\" class=\"user-select-none\">\n            <ul class=\"pagination\">\n                <li class=\"page-item ms-auto me-2 pagination-index\"> {{ #l10n:t('showing', curr.label, total) }}</li>\n                <li class=\"page-item me-2 reload\"><a role=\"button\"><i data-tpl-class=\"config.reloadIcon\"></i></a></li>\n                <li class=\"page-item prev\">\n                    <a data-tpl-class=\"prev.enabled?'page-link':'page-link disabled'\" data-tpl-aria-label=\"#l10n:t('previous')\" role=\"button\" data-tpl-data-page=\"prev.index\">\n                        <i aria-hidden=\"true\" data-tpl-class=\"config.prevIcon\"></i>\n                    </a>\n                </li>\n                <li class=\"page-item\" data-tpl-each=\"pages\" data-tpl-var=\"page\">\n                    <a data-tpl-class=\"curr.index != page.index ? 'page-link': 'page-link disabled'\" role=\"button\" data-tpl-data-page=\"page.index\" >\n                        {{ page.label }}\n                    </a>\n                </li>\n                <li class=\"page-item next\">\n                    <a data-tpl-class=\"next.enabled?'page-link':'page-link disabled'\" data-tpl-aria-label=\"#l10n:t('next')\" role=\"button\" data-tpl-data-page=\"next.index\">\n                        <i aria-hidden=\"true\" data-tpl-class=\"config.nextIcon\"></i>\n                    </a>\n                </li>\n            </ul>\n        </nav>\n    `;\n    #total = 0;\n    #current = 0;\n    render({ observed }) {\n        this.update(observed.current ?? 0, observed.total ?? 0);\n        this.addEventListener('click', (/** @type any */ evt) => {\n            const el = evt.target.closest('a');\n            if (!el) {\n                return;\n            }\n            this.dispatchEvent(\n                new CustomEvent('page-requested', {\n                    bubbles: true,\n                    cancelable: true,\n                    detail: {\n                        value: Number(el.dataset.page ?? this.#current),\n                    },\n                }),\n            );\n        });\n    }\n    update(current, total) {\n        const maxRender = Number(this.getAttribute('pages') ?? '5');\n        const prev = { index: Math.max(0, current - 1), enabled: current > 0 };\n        const curr = { index: current, label: current + 1 };\n        const next = { index: Math.min(total, current + 1), enabled: current + 1 < total };\n        const pages = [\n            {\n                index: current,\n                label: current + 1,\n            },\n        ];\n        for (let mid = current, offset = 1; offset !== maxRender && pages.length != maxRender; ++offset) {\n            const p = mid - offset;\n            if (p >= 0) {\n                pages.unshift({ index: p, label: p + 1 });\n            }\n            const n = mid + offset;\n            if (n < total) {\n                pages.push({ index: n, label: n + 1 });\n            }\n        }\n        this.template().withOverlay({ total, prev, curr, next, pages }).renderTo(this);\n    }\n    get total() {\n        return this.#total;\n    }\n    set total(value) {\n        this.#total = value;\n        this.reflect(() => {\n            this.setAttribute('total', String(value));\n            this.update(this.#current ?? 0, this.#total);\n        });\n    }\n    get current() {\n        return this.#current;\n    }\n    set current(value) {\n        this.#current = value;\n        this.reflect(() => {\n            this.setAttribute('current', String(value));\n            this.update(this.#current, this.#total ?? 0);\n        });\n    }\n}\n\nclass TableSchemaParser {\n    static parse(nodeOrFragment, template) {\n        const schema = Nodes.queryChildren(nodeOrFragment, 'schema');\n        if (!schema) {\n            throw new Error(`missing expected <schema> in ${nodeOrFragment}`);\n        }\n        const headersTr = document.createElement('tr');\n        const rowsTr = document.createElement('tr');\n        rowsTr.setAttribute('data-tpl-each', 'rows');\n        for (const attr of schema.getAttributeNames()) {\n            const value = schema.getAttribute(attr);\n            headersTr.setAttribute(attr, value ?? '');\n            rowsTr.setAttribute(attr, value ?? '');\n        }\n        const columns = Nodes.queryChildrenAll(schema, 'column');\n        const sort =\n            columns\n                .filter((v) => v.hasAttribute('order'))\n                .map((v) => ({ sorter: v.getAttribute('sorter'), order: v.getAttribute('order') }))[0] ?? null;\n        for (var column of columns) {\n            const maybeTitleTag = Nodes.queryChildren(column, 'title');\n            const sorter = column.getAttribute('sorter');\n            const order = column.getAttribute('order');\n            const titleNode = maybeTitleTag ?? document.createTextNode(column.getAttribute('title') ?? '');\n            maybeTitleTag?.remove();\n            column.removeAttribute('sorter');\n            column.removeAttribute('order');\n            column.removeAttribute('title');\n            const wrappedTitleNode =\n                !sorter && !order\n                    ? titleNode\n                    : (() => {\n                          const fulSorter = document.createElement('ful-sorter');\n                          if (sorter) {\n                              fulSorter.setAttribute('sorter', sorter);\n                          }\n                          if (order) {\n                              fulSorter.setAttribute('order', order);\n                          }\n                          fulSorter.append(titleNode);\n                          return fulSorter;\n                      })();\n            const th = document.createElement('th');\n            const td = document.createElement('td');\n            for (const attr of column.getAttributeNames()) {\n                const value = column.getAttribute(attr);\n                th.setAttribute(attr, value ?? '');\n                td.setAttribute(attr, value ?? '');\n            }\n            th.append(wrappedTitleNode);\n            td.append(...column.childNodes);\n            headersTr.append(th);\n            rowsTr.append(td);\n        }\n\n        return {\n            headersTemplate: template\n                .withOverlay({ inHeaders: true, inRows: false })\n                .withFragment(Fragments.from(headersTr)),\n            rowsTemplate: template.withOverlay({ inHeaders: false, inRows: true }).withFragment(Fragments.from(rowsTr)),\n            sort: sort,\n            length: columns.length,\n        };\n    }\n}\n\nclass InMemoryTableLoader {\n    #data;\n    constructor(data) {\n        this.#data = data;\n    }\n    async load(pageRequest, sortRequest, filterRequest) {\n        const begin = pageRequest.page * pageRequest.size;\n        const end = begin + pageRequest.size;\n        const page = this.#data.slice(begin, end);\n        const totalElements = this.#data.length;\n        return {\n            data: page,\n            size: totalElements\n        };\n    }\n    update(data) {\n        this.#data = data;\n    }\n}\n\nclass RemoteTableLoader {\n    #http;\n    #url;\n    #method;\n    constructor(http, url, method) {\n        this.#http = http;\n        this.#url = url;\n        this.#method = method;\n    }\n    async load(pageRequest, sortRequest, filterRequest) {\n        const filters = Object.entries(filterRequest).filter(([k, v]) => v);\n        return await this.#http\n            .request(this.#method, this.#url)\n            .param('page', pageRequest.page)\n            .param('size', pageRequest.size)\n            .param('sort', sortRequest ? `${sortRequest.sorter},${sortRequest.order}` : null)\n            .param('filters', filters.length > 0 ? JSON.stringify(Object.fromEntries(filters)) : null)\n            .fetchJson();\n    }\n}\n\nclass TableLoader {\n    static create(el, conf) {\n        const url = el.getAttribute('src');\n        if (url) {\n            const http = registry.component('http-client');\n            const method = el.getAttribute('method') ?? 'GET';\n            return new RemoteTableLoader(http, url, method);\n        }\n        return new InMemoryTableLoader([]);\n    }\n}\n\nclass Table extends ParsedElement {\n    static slots = true;\n    static l10n = {\n        en: {\n            initial: 'Start searching to see results.',\n            error: 'Error while loading data:',\n            nodata: 'No elements found.',\n        },\n        it: {\n            initial: 'Avvia la ricerca per visualizzare i risultati.',\n            error: 'Errore nel caricamento dei dati:',\n            nodata: 'Nessun elemento trovato.',\n        },\n        es: {\n            initial: 'Inicia la búsqueda para ver los resultados.',\n            error: 'Error al cargar los datos:',\n            nodata: 'No se encontraron elementos.',\n        },\n        fr: {\n            initial: 'Lancez la recherche pour voir les résultats.',\n            error: 'Erreur lors du chargement des données :',\n            nodata: 'Aucun élément trouvé.',\n        },\n    };\n    static config = {\n        searchIcon: 'bi bi-search',\n    };\n    static template = `\n        <ful-form data-tpl-if=\"slots.filters\">\n            {{{{ slots.filters }}}}\n        </ful-form>\n        <div class=\"table-wrapper\">\n            <table class=\"table\">\n                <caption data-tpl-if=\"slots.caption\">{{{{ slots.caption }}}}</caption>\n                <thead></thead>\n                <tbody></tbody>\n                <tbody data-ref=\"initial\">\n                    <tr>\n                        <td data-tpl-colspan=\"schema.length\">\n                            <div>\n                                <p data-tpl-if=\"config.searchIcon\"><i data-tpl-class=\"config.searchIcon\"></i></p>\n                                {{{ #l10n:t('initial') }}}\n                            </div>\n                        </td>\n                    </tr>\n                </tbody>\n                <tbody data-ref=\"loading\" hidden>\n                    <tr>\n                        <td data-tpl-colspan=\"schema.length\">\n                            <ful-spinner class=\"big\"></ful-spinner>\n                        </td>\n                    </tr>\n                </tbody>\n                <tbody data-ref=\"feedback\" hidden>\n                    <tr>\n                        <td data-tpl-colspan=\"schema.length\">\n                            <div class=\"alert alert-danger\">\n                                <p>{{ #l10n:t('error') }}</p>\n                                <div data-ref=\"feedback-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                </tbody>\n                <tfoot data-tpl-if=\"slots.footer\">\n                    {{{{ slots.footer }}}}\n                </tfoot>\n            </table>\n        </div>\n        <ful-pagination current=\"0\" total=\"1\"></ful-pagination>\n    `;\n    static templates = {\n        row: `\n            <tr data-tpl-if=\"pageResponse.data.length == 0\">\n                <td data-tpl-colspan=\"schema.length\" class=\"text-center align-middle p-4\">\n                    {{ #l10n:t('nodata') }}\n                </td>\n            </tr>\n            {{{{ schema.rowsTemplate.withOverlay({'rows': pageResponse.data}).render() }}}}\n        `,\n    };\n    #loader;\n    #schema;\n    #body;\n    #loading;\n    #noAutoload;\n    #feedback;\n    #paginator;\n    #sorters;\n    #latestRequest;\n    async render({ slots, observed }) {\n        const template = this.template();\n        const schema = TableSchemaParser.parse(slots.schema, template);\n        const fragment = template.withOverlay({ slots, schema }).render();\n        const tableWrapper = /** @type HTMLTableElement */ (Nodes.queryChildren(fragment, '.table-wrapper'));\n        const table = /** @type HTMLTableElement */ (tableWrapper.querySelector('table'));\n        Attributes.forward('table-', this, table);\n        this.#loader = registry.component(this.getAttribute('loader') ?? 'loaders:table').create(this);\n\n        this.#schema = schema;\n        this.#body = table.querySelector(':scope > tbody');\n        this.#loading = table.querySelector(':scope > tbody[data-ref=loading]');\n        this.#noAutoload = table.querySelector(':scope > tbody[data-ref=initial]');\n        this.#feedback = table.querySelector(':scope > tbody[data-ref=feedback]');\n        this.#paginator = Nodes.queryChildren(fragment, 'ful-pagination');\n        this.#sorters = table.querySelectorAll(':scope > thead ful-sorter') ?? [];\n        this.replaceChildren(fragment);\n        schema.headersTemplate.renderTo(this.querySelector('thead'));\n        await Rendering.waitForChildren(this);\n\n        const maybeForm = /** @type any */ (Nodes.queryChildren(this, 'ful-form'));\n        this.#latestRequest = {\n            pageRequest: {\n                page: 0,\n                size: this.getAttribute('page-size') ? Number(this.getAttribute('page-size')) : 10,\n            },\n            sortRequest: schema.sort,\n            filterRequest: maybeForm?.values ?? {},\n        };\n        maybeForm?.addEventListener('submit:success', async (evt) => {\n            await this.load(\n                {\n                    page: 0,\n                    size: this.#latestRequest.pageRequest.size,\n                },\n                this.#latestRequest.sortRequest,\n                evt.detail.request,\n            );\n        });\n        this.addEventListener('page-requested', async (/** @type any */ e) => {\n            await this.load(\n                {\n                    page: e.detail.value,\n                    size: this.#latestRequest.pageRequest.size,\n                },\n                this.#latestRequest.sortRequest,\n                this.#latestRequest.filterRequest,\n            );\n        });\n        this.addEventListener('sort-requested', async (/** @type any */ e) => {\n            const sortRequest = e.detail.value.order ? e.detail.value : null;\n            await this.load(this.#latestRequest.pageRequest, sortRequest, this.#latestRequest.filterRequest);\n            this.#sorters.forEach((s) => (s.order = null));\n            e.target.order = e.detail.value.order;\n        });\n        if (this.hasAttribute('autoload')) {\n            await this.reload();\n        }\n    }\n\n    async reload() {\n        return await this.load(\n            this.#latestRequest.pageRequest,\n            this.#latestRequest.sortRequest,\n            this.#latestRequest.filterRequest,\n        );\n    }\n    async load(pageRequest, sortRequest, filterRequest) {\n        this.#body.replaceChildren();\n        this.#loading.removeAttribute('hidden', '');\n        this.#feedback.setAttribute('hidden', '');\n        this.#noAutoload.setAttribute('hidden', '');\n        try {\n            const pageResponse = await this.#loader.load(pageRequest, sortRequest, filterRequest);\n            this.#latestRequest = { pageRequest, sortRequest, filterRequest };\n            this.#update(pageRequest, sortRequest, filterRequest, pageResponse);\n        } catch (/** @type any */ error) {\n            this.#loading.setAttribute('hidden', '');\n            this.#feedback.removeAttribute('hidden', '');\n            if (!error.problems) {\n                this.#feedback.querySelector('[data-ref=feedback-error]').textContent = error;\n            } else {\n                this.#feedback.querySelector('[data-ref=feedback-error]').textContent = error.problems.map(\n                    (p) => `${p.reason}`,\n                );\n            }\n            throw error;\n        }\n    }\n    async withLoader(fn) {\n        return await fn(this.#loader);\n    }\n    async resetWithFilter(filterRequest) {\n        return await this.load(\n            {\n                page: 0,\n                size: this.#latestRequest.pageRequest.size,\n            },\n            this.#latestRequest.sortRequest,\n            filterRequest,\n        );\n    }\n    #update(pageRequest, sortRequest, filterRequest, pageResponse) {\n        this.#loading.setAttribute('hidden', '');\n        this.#body.replaceChildren(\n            this.template('row')\n                .withOverlay({\n                    schema: this.#schema,\n                    pageRequest,\n                    filterRequest,\n                    pageResponse,\n                })\n                .render(),\n        );\n        this.#paginator.current = pageRequest.page;\n        this.#paginator.total = Math.ceil(pageResponse.size / pageRequest.size);\n    }\n}\n\nexport { TableLoader, SortButton, Table, TableSchemaParser, Pagination };\n","import { Attributes } from '../../ftl/index.mjs';\nimport { Instant } from './temporals.mjs';\nimport { Input } from './input.mjs';\n\nclass InstantFilter extends Input {\n    static observed = ['value:json', 'readonly:presence', 'required:presence'];\n    static template = `\n        <div class=\"form-label\">\n            <label>{{{{ slots.default }}}}</label>\n            {{{{ slots.info }}}}\n        </div>\n        <div class=\"input-group\">\n            <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n            {{{{ slots.before }}}}\n            <button data-ref=\"operator\" class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" value=\"LTE\" form=\"\">&PrecedesSlantEqual;</button>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"EQ\">=</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"NEQ\">&ne;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"LT\">&prec;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"GT\">&succ;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"LTE\">&PrecedesSlantEqual;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"GTE\">&SucceedsSlantEqual;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"BETWEEN\">&LeftRightArrow;</a></li>\n            </ul>\n            <input data-ref=\"value1\" type=\"datetime-local\" class=\"form-control\" form=\"\">\n            <input data-ref=\"value2\" type=\"datetime-local\" class=\"form-control\" form=\"\" hidden>\n            {{{{ slots.after }}}}\n            <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n        </div>\n        <ful-field-error></ful-field-error>\n    `;\n    #operator;\n    #value1;\n    #value2;\n    render(conf) {\n        super.render({ ...conf, skipObservedSetup: true });\n        this.#operator = this.querySelector('[data-ref=operator]');\n        this.#value1 = this.querySelector('[data-ref=value1]');\n        this.#value2 = this.querySelector('[data-ref=value2]');\n\n        this.disabled = conf.disabled;\n        this.readonly = conf.observed.readonly;\n        this.required = conf.observed.required;\n        this.value = conf.observed.value;\n\n        this.addEventListener('click', (evt) => {\n            const target = /** @type HTMLElement */ (evt.target);\n            if (!target.matches('ul > li > a')) {\n                return;\n            }\n            const btn = /** @type HTMLButtonElement */ (target.closest('ul')?.previousElementSibling);\n            const value = /** @type String */ (target.getAttribute('value'));\n            Attributes.toggle(this.#value2, 'hidden', value !== 'BETWEEN');\n            btn.setAttribute('value', value);\n            btn.innerHTML = target.innerHTML;\n        });\n    }\n\n    get value() {\n        const operator = this.#operator.getAttribute('value');\n        const values = operator === 'BETWEEN' ? [this.#value1.value, this.#value2.value] : [this.#value1.value];\n        return values.some((v) => v === '') ? undefined : [operator, ...values.map((v) => new Date(v).toISOString())];\n    }\n    set value(v) {\n        if (v == null) {\n            this.#value1.value = '';\n            this.#value2.value = '';\n            return;\n        }\n        const [operator, ...values] = v;\n        this.#operator.setAttribute('value', operator);\n        this.#value1.value = values[0] ? Instant.isoToLocal(values[0]) : values[0];\n        this.#value2.value = values[1] ? Instant.isoToLocal(values[1]) : values[1];\n    }\n    set readonly(v) {\n        this.#value2.readOnly = v;\n        super.readonly = v;\n    }\n    set disabled(d) {\n        Attributes.toggle(this.#value2, 'disabled', d);\n        super.disabled = d;\n    }\n}\n\nclass LocalDateFilter extends Input {\n    static observed = ['value:json', 'readonly:presence', 'required:presence'];\n    static template = `\n        <div class=\"form-label\">\n            <label>{{{{ slots.default }}}}</label>\n            {{{{ slots.info }}}}\n        </div>\n        <div class=\"input-group\">\n            <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n            {{{{ slots.before }}}}\n            <button data-ref=\"operator\" class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" value=\"EQ\" form=\"\">=</button>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"EQ\">=</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"NEQ\">&ne;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"LT\">&prec;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"GT\">&succ;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"LTE\">&PrecedesSlantEqual;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"GTE\">&SucceedsSlantEqual;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"BETWEEN\">&LeftRightArrow;</a></li>\n            </ul>\n            <input data-ref=\"value1\" type=\"date\" class=\"form-control\" form=\"\">\n            <input data-ref=\"value2\" type=\"date\" class=\"form-control\" form=\"\" hidden>\n            {{{{ slots.after }}}}\n            <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n        </div>\n        <ful-field-error></ful-field-error>\n    `;\n    #operator;\n    #value1;\n    #value2;\n    render(conf) {\n        super.render({ ...conf, skipObservedSetup: true });\n\n        this.#operator = this.querySelector('[data-ref=operator]');\n        this.#value1 = this.querySelector('[data-ref=value1]');\n        this.#value2 = this.querySelector('[data-ref=value2]');\n\n        this.disabled = conf.disabled;\n        this.readonly = conf.observed.readonly;\n        this.required = conf.observed.required;\n        this.value = conf.observed.value;\n\n        this.addEventListener('click', (evt) => {\n            const target = /** @type HTMLElement */ (evt.target);\n            if (!target.matches('ul > li > a')) {\n                return;\n            }\n            const btn = /** @type HTMLButtonElement */ (target.closest('ul')?.previousElementSibling);\n            const value = /** @type String */ (target.getAttribute('value'));\n            Attributes.toggle(this.#value2, 'hidden', value !== 'BETWEEN');\n            btn.setAttribute('value', value);\n            btn.innerHTML = target.innerHTML;\n        });\n    }\n    get value() {\n        const operator = this.#operator.getAttribute('value');\n        const values = operator == 'BETWEEN' ? [this.#value1.value, this.#value2.value] : [this.#value1.value];\n        return values.some((v) => v === '') ? undefined : [operator, ...values];\n    }\n    set value(v) {\n        if (v == null) {\n            this.#value1.value = '';\n            this.#value2.value = '';\n            return;\n        }\n        const [operator, ...values] = v;\n        this.#operator.setAttribute('value', operator);\n        this.#value1.value = values[0];\n        this.#value2.value = values[1];\n    }\n    set readonly(v) {\n        this.#value2.readOnly = v;\n        super.readonly = v;\n    }\n    set disabled(d) {\n        Attributes.toggle(this.#value2, 'disabled', d);\n        super.disabled = d;\n    }\n}\n\nclass TextFilter extends Input {\n    static observed = ['value:json', 'readonly:presence', 'required:presence'];\n    static template = `\n        <div class=\"form-label\">\n            <label>{{{{ slots.default }}}}</label>\n            {{{{ slots.info }}}}\n        </div>\n        <div class=\"input-group\">\n            <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n            {{{{ slots.before }}}}\n            <button data-ref=\"operator\" class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" value=\"CONTAINS\" form=\"\">&mldr;a&mldr;</button>\n            <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"CONTAINS\">&mldr;a&mldr;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"STARTS_WITH\">a&mldr;</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"ENDS_WITH\">&mldr;a</a></li>\n                <li><a class=\"dropdown-item\" role=\"button\" value=\"EQ\">=</a></li>\n            </ul>\n            <input data-ref=\"value\" type=\"text\" class=\"form-control\" form=\"\">\n            {{{{ slots.after }}}}\n            <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n        </div>\n        <ful-field-error></ful-field-error>\n    `;\n    #operator;\n    #value;\n    render(conf) {\n        super.render({ ...conf, skipObservedSetup: true });\n\n        this.#operator = this.querySelector('[data-ref=operator]');\n        this.#value = this.querySelector('[data-ref=value]');\n\n        this.disabled = conf.disabled;\n        this.readonly = conf.observed.readonly;\n        this.required = conf.observed.required;\n        this.value = conf.observed.value;\n\n        this.addEventListener('click', (evt) => {\n            const target = /** @type HTMLElement */ (evt.target);\n            if (!target.matches('ul > li > a')) {\n                return;\n            }\n            const btn = /** @type HTMLButtonElement */ (target.closest('ul')?.previousElementSibling);\n            const value = /** @type String */ (target.getAttribute('value'));\n            btn.setAttribute('value', value);\n            btn.innerHTML = target.innerHTML;\n        });\n    }\n    get value() {\n        const operator = this.#operator.getAttribute('value');\n        return this.#value.value === '' ? undefined : [operator, 'IGNORE_CASE', this.#value.value];\n    }\n    set value(v) {\n        if (v == null) {\n            this.#value.value = '';\n            return;\n        }\n        const [operator, sensitivity, value] = v;\n        this.#operator.setAttribute('value', operator);\n        this.#value.value = value;\n    }\n}\n\nexport { InstantFilter, LocalDateFilter, TextFilter };\n","class LocalizationModule {\n    static t(k, ...args) {\n        //@ts-ignore\n        const format = this.l10n?.[this.language]?.[k] ?? this.l10n?.['en']?.[k] ?? k;\n        if (args.length === 0) {\n            return format;\n        }\n        return format.replace(/{(\\d+)}/g, (m, is) => {\n            return args[Number(is)];\n        });\n    }\n    static tl(k, args = []) {\n        return LocalizationModule.t.apply(this, [k, ...args]);\n    }\n}\n\nexport { LocalizationModule };\n","import { HttpClient } from '../../httpc/index.mjs';\nimport { Checkbox } from './checkbox.mjs';\nimport { LocalDate, Instant, InputLocalDate, InputLocalTime, InputInstant } from './temporals.mjs';\nimport { InstantFilter, LocalDateFilter, TextFilter } from './filters.mjs';\nimport { FormLoader, Form } from './form.mjs';\nimport { Input } from './input.mjs';\nimport { InputFile } from './files.mjs';\nimport { RadioGroup } from './radio.mjs';\nimport { SelectLoader, Dropdown, Select } from './select.mjs';\nimport { Spinner } from './spinner.mjs';\nimport { TableLoader, Table, Pagination, SortButton } from './table.mjs';\nimport { LocalizationModule } from './l10n.mjs';\n\nclass Plugin {\n    configure(registry) {\n        const httpClient = HttpClient.builder().withCsrfToken().withRedirectOnUnauthorized('/').build();\n        registry\n            .defineModule('l10n', LocalizationModule)\n            .defineComponent('http-client', httpClient)\n            .defineElement('ful-spinner', Spinner)\n            .defineElement('ful-form', Form)\n            .defineElement('ful-checkbox', Checkbox)\n            .defineElement('ful-input', Input)\n            .defineElement('ful-input-file', InputFile)\n            .defineElement('ful-local-date', LocalDate)\n            .defineElement('ful-instant', Instant)\n            .defineElement('ful-input-local-date', InputLocalDate)\n            .defineElement('ful-input-local-time', InputLocalTime)\n            .defineElement('ful-input-instant', InputInstant)\n            .defineElement('ful-radio-group', RadioGroup)\n            .defineElement('ful-table', Table)\n            .defineElement('ful-pagination', Pagination)\n            .defineElement('ful-sorter', SortButton)\n            .defineElement('ful-filter-instant', InstantFilter)\n            .defineElement('ful-filter-local-date', LocalDateFilter)\n            .defineElement('ful-filter-text', TextFilter)\n            .defineElement('ful-select', Select)\n            .defineElement('ful-dropdown', Dropdown)\n            .defineComponent('loaders:select', SelectLoader)\n            .defineComponent('loaders:form', FormLoader)\n            .defineComponent('loaders:table', TableLoader)\n            .defineOverlay({\n                language: navigator?.language?.split('-')?.[0] ?? 'en',\n            });\n    }\n}\n\nexport { Plugin };\n","import * as ftl from './ftl/index.mjs';\nimport * as httpc from './httpc/index.mjs';\nimport * as ful from './ful/index.mjs';\n\nif (typeof window !== 'undefined') {\n    window['ftl'] = ftl;\n    window['httpc'] = httpc;\n    window['ful'] = ful;\n}\n\nexport * from './ftl/index.mjs';\nexport * from './httpc/index.mjs';\nexport * from './ful/index.mjs';\n"],"names":["nodes","ter","Symbol","elv","nullc","or","and","eq","cmp","not","access","member","subscript","method","call","tstring","literal","array","dict","function","symbol","templated","ten","teh","tet","tel","dom","t","h","n","peg$f4","c","peg$f12","head","op","rhs","peg$f14","peg$f32","TemplatedRoot","s0","s1","peg$parseTemplatedExpression","peg$FAILED","push","TemplatedExpression","peg$currPos","value","s2","input","substr","peg$c1","peg$silentFails","peg$fail","peg$e0","peg$parseBeginNode","s3","peg$parseExpressionRoot","s4","peg$c2","peg$e1","peg$parseEndNode","type","peg$c3","peg$e2","peg$parseBeginHtml","peg$c4","peg$e3","peg$parseEndHtml","peg$f1","peg$c5","peg$e4","peg$parseBeginText","peg$c6","peg$e5","peg$parseEndText","peg$f2","parts","charAt","peg$r0","test","peg$e6","substring","charCodeAt","peg$c7","peg$e7","length","peg$e8","peg$c9","peg$e9","s5","undefined","join","peg$parseTemplatedText","peg$f3","ExpressionRoot","peg$parse_","r","peg$parseTernaryExpression","TernaryExpression","cond","peg$parseElvisExpression","peg$c13","peg$e10","ifTrue","s7","peg$c15","peg$e11","ifFalse","s9","ElvisExpression","peg$parseNullCoalescingExpression","peg$c17","peg$e12","NullCoalescingExpression","lhs","peg$parseOrExpression","peg$c19","peg$e13","OrExpression","peg$parseAndExpression","tail","peg$c22","peg$e14","result","peg$f10","AndExpression","peg$parseEqExpression","peg$c24","peg$e15","peg$f11","EqExpression","peg$parseRelExpression","peg$parseEqualityOp","element","peg$f13","RelExpression","peg$parseNotExpression","peg$parseRelationalOp","peg$f15","NotExpression","peg$c26","peg$e16","expr","peg$parseGroupingExpression","peg$parseAccessExpression","peg$parseAccess","AccessExpression","peg$c28","peg$e18","peg$c29","peg$e19","peg$parseSymbol","ns","peg$e17","peg$parseAccessMember","peg$c30","peg$e21","s6","peg$c31","peg$e22","peg$e20","peg$parseAccessSubscript","peg$c32","peg$e24","peg$c34","peg$e25","peg$c36","peg$e26","args","peg$e23","peg$parseAccessMethodCall","GroupingExpression","e","fn","peg$c49","peg$e51","module","peg$r5","peg$e52","peg$r6","peg$e53","v","peg$e50","peg$parseModuleFunction","peg$f22","peg$e27","peg$parseModuleFunctionCall","peg$c43","peg$e36","peg$r1","peg$e37","s8","parseFloat","peg$e35","peg$parseNumberLiteral","peg$c39","peg$e29","peg$c40","peg$e30","peg$e28","peg$parseBooleanLiteral","peg$c41","peg$e32","peg$e31","peg$parseNullLiteral","peg$c42","peg$e34","peg$e33","peg$parseUndefinedLiteral","peg$parseStringLiteral","peg$f35","peg$e48","peg$parseArrayLiteral","s11","s13","peg$c47","peg$e45","apply","peg$e49","peg$parseDictLiteral","peg$parseAnyLiteral","StringLiteral","peg$c44","peg$e39","peg$r2","peg$e40","peg$c45","peg$e41","peg$r3","peg$e42","peg$f29","peg$c46","peg$e43","peg$parseTemplateStringExpression","peg$parseTemplateStringLiteral","peg$e38","TemplateStringExpression","peg$e44","TemplateStringLiteral","peg$r4","peg$e47","char","peg$e46","s","peg$e54","EqualityOp","peg$c53","peg$e55","peg$c54","peg$e56","RelationalOp","peg$c55","peg$e57","peg$c56","peg$e58","peg$c57","peg$e59","peg$c58","peg$e60","_","peg$r7","peg$e61","EvaluatingVisitor","modules","dataStack","constructor","this","resolve","prop","i","overlay","cached_resolve_proxy","resolve_proxy","Proxy","get","target","node","visit","Error","fnRef","map","arg","len","evaluated","Object","fromEntries","entry","prev","cur","visitRoot","ast","toString","Expressions","static","Map","parse","expression","mode","key","astCache","has","size","MAX_CACHE_SIZE","oldestKey","keys","next","delete","set","startRule","MODE_TEMPLATED","evaluate","interpret","ExpressionEvaluator","withModule","name","withOverlay","data","evaluateExpression","MODE_EXPRESSION","evaluateTemplated","Fragments","fromHtml","html","el","document","createElement","innerHTML","trim","adoptNode","content","toHtml","fragment","appendChild","isBlank","childElementCount","textContent","from","DocumentFragment","fromChildNodes","firstChild","Attributes","uid","prefix","id","defaultValue","k","hasAttribute","setAttribute","getAttribute","forward","to","getAttributeNames","filter","a","startsWith","forEach","classes","split","classList","add","toggle","attr","removeAttribute","flip","LightSlots","namedSlots","Array","children","matches","remove","slot","slotFromNode","slots","default","append","childNodes","HTMLTemplateElement","HTMLScriptElement","Nodes","isParsed","parentNode","nextSibling","waitParsed","ownerDocument","readyState","Promise","ac","AbortController","clearAndQueue","abort","observer","disconnect","addEventListener","signal","MutationObserver","parent","observe","childList","queryChildren","selector","queryChildrenAll","NodeOperations","forRemoval","removed","includes","replaceChildren","dataset","popData","prepend","ref","insertBefore","replace","cleanup","pop","CommandsHandler","tplIf","ops","tplWith","varName","newNode","Template","render","tplEach","template","iterator","tplWhen","tplVerbatim","cloneNode","tplRemove","toLowerCase","tplText","text","tplHtml","tplClassAppend","cleanClasses","isArray","flatMap","Boolean","tplAttrAppend","attributesAndValues","textNode","createTextNode","attributeCache","toAttr","dataSetKey","cached","fromSelector","templateEl","querySelector","fromTemplate","fromFragment","withContext","withContextFrom","registry","context","withFragment","withModules","withData","evaluator","imported","importNode","nodeType","Node","DOCUMENT_FRAGMENT_NODE","d","createNodeIterator","NodeFilter","SHOW_ELEMENT","SHOW_TEXT","NODE_FILTER","nextNode","TEXT_NODE","nodeValue","ex","RenderError","command","ORDERED_COMMANDS","attributeName","renderTo","appendTo","renderToSelector","appendToSelector","FILTER_ACCEPT","FILTER_REJECT","attributes","FILTER_SKIP","message","nodeOrFragment","cause","super","stringify","child","removeChild","ELEMENT_NODE","UpgradeQueue","q","async","pending","entries","promise","all","dispatchEvent","CustomEvent","bubbles","cancelable","enqueue","then","upgrade","finally","Registry","tagToClass","configured","mappers","string","unmarshal","str","marshal","String","number","Number","presence","bool","json","JSON","csv","csvm","components","upgradeQueue","defineElement","tag","klass","augmentAndDefineElement","observed","templates","observedNames","attrToMapper","reduce","acc","maybeType","namesAndTemplates","assign","nameToTemplate","BITS","SLOTS","OBSERVED","ATTR_TO_MAPPER","TEMPLATES","customElements","define","defineModule","defineModules","ms","defineComponent","defineData","defineOverlay","defineMapper","plugin","p","configure","upgrades","component","Templates","Rendering","waitFor","contains","waitForChildren","ParsedElement","HTMLElement","observedAttributes","parsed","reflecting","bits","connectedCallback","attributeChangedCallback","oldValue","newValue","disabledBeforeParsed","formDisabledCallback","disabled","Reflect","attribute","reflect","reflectTo","Failure","problems","dropping","dropProblemsContext","reason","details","Base64","encode","arrayBuffer","dialect","URL_SAFE","byteLength","view","Uint8Array","res","decode","nbytes","Math","floor","vi","si","v1","indexOf","v2","v3","v4","buffer","STANDARD","Hex","hex","lenInBytes","offset","octet","parseInt","bytes","upper","b","toUpperCase","o","padStart","MediaType","subtype","normalized","ptype","psubtype","HttpClientError","status","of","fromResponse","response","headers","statusText","title","detail","CsrfTokenInterceptor","intercept","url","request","chain","proceed","RedirectOnUnauthorizedInterceptor","redirectUri","window","location","href","HttpClientBuilder","interceptors","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","uri","options","is","URL","Request","HttpRequestBuilder","create","post","put","patch","client","params","body","baseUri","queryString","URLSearchParams","Headers","hs","header","ps","param","vs","multipart","callback","formData","FormData","HttpMultipartRequestCustomizer","kvs","option","opts","ok","fetchText","fetchJson","fetchBlob","fetchArrayBuffer","field","blob","filename","blobs","values","Blob","LocalStorage","Storage","save","localStorage","setItem","load","got","getItem","removeItem","decoded","SessionStorage","sessionStorage","VersionedLocalStorage","revision","stored","VersionedSessionStorage","AsyncEvents","fireAsync","evt","promises","asyncOn","listener","event","ae","reject","withResolvers","asyncOff","removeEventListener","mixInto","prototype","Timing","sleep","setTimeout","debounce","timeoutMs","func","DEBOUNCE_DEFAULT","tid","previousTimestamp","later","elapsed","performance","now","DEBOUNCE_IMMEDIATE","arguments","clearTimeout","throttle","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","remaining","THROTTLE_NO_TRAILING","Bindings","flatten","obj","stops","pre","providePath","path","previous","ckey","pkey","isInteger","extract","checked","tagName","extractFrom","form","submitter","elements","mutate","raw","mutateIn","names","flattenedKey","Set","querySelectorAll","CSS","escape","errors","es","scrollOnError","fieldErrors","globalErrors","setCustomValidity","slice","suffix","innerText","sort","getBoundingClientRect","y","focus","RemoteJsonFormLoader","http","requestMapper","responseMapper","prepare","submit","transform","LocalFormLoader","FormLoader","conf","Form","preventDefault","stopPropagation","spinner","loader","se","sre","mapped","exception","console","warn","reset","spin","hidden","hel","wd","Input","_input","_fieldError","internals","attachInternals","role","_type","_fragment","skipObservedSetup","readonly","required","find","requestSubmit","re","before","after","RegExp","start","selectionStart","setSelectionRange","label","ariaDescribedByElements","ariaLabelledByElements","uppercase","uppercased","trimmed","readOnly","error","setValidity","customError","formResetCallback","LocalDate","locale","Intl","DateTimeFormat","resolvedOptions","formatter","year","month","day","m","format","Date","Instant","hour","minute","second","hour12","isoToLocal","iso","pad","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","InputLocalDate","min","max","step","fromIsoOrOffset","formatLocalDate","date","getTime","getTimezoneOffset","toISOString","match","exec","sign","setHours","setDate","originalDay","setMonth","setFullYear","InputLocalTime","InputInstant","InputFile","en","dropzonelabel","unaccepptablefiletype","maxfilesizeexceeded","maxtotalsizeexceeded","maxfilesexceeded","it","fr","accept","items","dropzone","warnings","warning","multiple","itemlist","maxfiles","maxfilesize","maxtotalsize","closest","fileName","dt","DataTransfer","files","f","update","click","dataTransfer","kind","getAsFile","formatByteSize","round","ensureAcceptable","ensureFileSizes","ensureTotalSize","ensureFilesCount","unacceptable","file","some","endsWith","oversized","totalsize","useItemlist","useDropzone","RemoteLoader","prefetch","ensureFetched","exact","needle","reconfigureUrl","revisionedData","storageKey","PartialRemoteLoader","InMemoryLoader","SelectLoader","responseMapperFrom","row","Dropdown","menu","optionstemplate","li","change","hide","acceptSelection","selected","firstElementChild","metadata","index","shown","show","moveOrShow","candidate","scrollIntoView","block","behavior","Select","badges","ddmenu","fieldError","self","dload","abortdload","idx","changed","syncBadges","relatedTarget","code","selectionEnd","clear","withLoader","selection","RadioGroup","fieldset","firstRadio","booleanType","radioEls","inputsAndLabels","inert","Checkbox","container","isSwitch","Spinner","SortButton","order","sorter","orders","nextOrder","Pagination","showing","navigation","prevIcon","nextIcon","reloadIcon","total","page","maxRender","enabled","curr","pages","mid","unshift","TableSchemaParser","schema","headersTr","rowsTr","columns","column","maybeTitleTag","titleNode","wrappedTitleNode","fulSorter","th","td","headersTemplate","inHeaders","inRows","rowsTemplate","InMemoryTableLoader","pageRequest","sortRequest","filterRequest","begin","end","RemoteTableLoader","filters","TableLoader","Table","initial","nodata","searchIcon","loading","noAutoload","feedback","paginator","sorters","latestRequest","table","maybeForm","reload","pageResponse","resetWithFilter","ceil","InstantFilter","operator","value1","value2","btn","previousElementSibling","LocalDateFilter","TextFilter","sensitivity","LocalizationModule","l10n","language","tl","Plugin","httpClient","navigator","ftl","httpc","ful"],"mappings":"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"}