{"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 ;\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 ;\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        for (let c = /** @type {Node | null} */ (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 = new Set();\n    removed(node) {\n        return this.#forRemoval.has(node);\n    }\n    remove(node) {\n        node.replaceChildren?.();\n        Object.keys(node.dataset || {})\n            .filter((k) => k.startsWith('tpl'))\n            .forEach((k) => {\n                delete node.dataset[k];\n            });\n        this.#forRemoval.add(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        for (const node of this.#forRemoval) {\n            node.remove();\n        }\n        this.#forRemoval.clear();\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            }\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, bounded with\n// FIFO eviction like the expression ast cache\nconst attributeCache = new Map();\nconst ATTRIBUTE_CACHE_MAX_SIZE = 1000;\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        if (attributeCache.size >= ATTRIBUTE_CACHE_MAX_SIZE) {\n            attributeCache.delete(attributeCache.keys().next().value);\n        }\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     * @returns the evaluated expression result\n     */\n    evaluate(expression, mode, ...data) {\n        return 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 (let n = 0; n < node.childNodes.length; n++) {\n            const 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            await this.settle();\n            document.dispatchEvent(\n                new CustomEvent('ftl:ready', {\n                    bubbles: false,\n                    cancelable: false,\n                }),\n            );\n        });\n    }\n    #finished = new Map();\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        //settling waits on a signal that only ever resolves, so nothing here attaches a\n        //rejection handler to the upgrade itself: a component that fails is still\n        //reported the way it always was\n        const { promise: finished, resolve: markFinished } = /** @type {PromiseWithResolvers<void>} */ (\n            Promise.withResolvers()\n        );\n        const promise = Nodes.waitParsed(el)\n            .then(() => el.upgrade())\n            .finally(() => {\n                this.#q.delete(el);\n                this.#finished.delete(el);\n                markFinished();\n            });\n        this.#q.set(el, promise);\n        this.#finished.set(el, finished);\n    }\n    /**\n     * Waits for every queued upgrade to settle, including the ones enqueued while\n     * waiting: a component is only queued once its parent connects it, so a single pass\n     * would miss everything nested. A component that fails to upgrade does not hold the\n     * others back, readiness means the queue drained rather than that everything worked.\n     */\n    async settle() {\n        while (this.#finished.size !== 0) {\n            await Promise.all(Array.from(this.#finished.values()));\n        }\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\n/**\n * Waits for the queued upgrades matching the filter, including the ones enqueued while\n * waiting: a component is only queued once its parent connects it, so a single pass\n * would miss everything nested.\n * @param {(el: Element) => boolean} accept\n */\nconst settle = async (accept) => {\n    for (;;) {\n        const pending = Array.from(registry.upgrades)\n            .filter(([child]) => accept(child))\n            .map(([, promise]) => promise);\n        if (pending.length === 0) {\n            return;\n        }\n        await Promise.all(pending);\n    }\n};\n\nclass Rendering {\n    static async waitFor(el) {\n        await settle((child) => el.contains(child));\n    }\n    static async waitForChildren(el) {\n        await settle((child) => el !== child && el.contains(child));\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 (const 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    /**\n     * The disabled protocol follows the semantics of a native form control:\n     *\n     * - the `disabled` attribute on the host is the field's own claim, and nothing\n     *   but its author ever writes or removes it, in markup or through the property.\n     *   The framework never claims on the form's behalf, so there is nothing to\n     *   unclaim and nothing to lose: a field declared disabled inside a disabled\n     *   `<fieldset>` stays disabled when the fieldset comes back, exactly like a\n     *   native input keeps its attribute.\n     * - the effective state is the claim OR a disabled fieldset ancestry, which the\n     *   platform maintains on its own: `:disabled` matches both, a disabled field is\n     *   left out of the submitted values, and the inner native controls are reached\n     *   by the ancestry as descendants of the fieldset.\n     * - the `disabled` property reflects the claim only, like a native input's: a\n     *   field disabled by its ancestry reads `false` while `matches(':disabled')`\n     *   tells the effective state. Un-claiming inside a disabled fieldset cannot\n     *   enable the field.\n     * - the inner controls mirror the claim and nothing else: the ancestry state is\n     *   never written anywhere, so it can never go stale, and the browser composes\n     *   the two on its own when it disables and re-enables a fieldset's descendants.\n     *\n     * Because of this, formDisabledCallback carries nothing the framework needs to\n     * apply, and the protocol does not define it.\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        //the declared claim is what render receives: the ancestry state is not\n        //passed around, it is already where it needs to be\n        await this.render({ slots, observed, disabled: this.hasAttribute('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        //every group yields three bytes, but a padded input stops short of the last\n        //one or two: writing them anyway would rely on typed arrays dropping writes\n        //past their length\n        while (vi < nbytes) {\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            if (vi === nbytes) {\n                break;\n            }\n            view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n            if (vi === nbytes) {\n                break;\n            }\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\n/**\n * Yields the entries of a headers or params initializer preserving nullish values:\n * normalizing through `Headers`/`URLSearchParams` first would stringify them to\n * \"null\"/\"undefined\" instead of removing the key.\n * @param {any} source\n * @returns {Iterable<[string, any]>}\n */\nconst rawEntries = (source) => {\n    if (source == null) {\n        return [];\n    }\n    if (typeof source === 'string') {\n        return new URLSearchParams(source);\n    }\n    if (typeof source[Symbol.iterator] === 'function') {\n        return source;\n    }\n    return Object.entries(source);\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|Record<string,string|null|undefined>} hs\n     * @returns {HttpRequestBuilder} this builder\n     */\n    headers(hs) {\n        for (const [k, v] of rawEntries(hs)) {\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|null|undefined>|string[][]|string} ps\n     * @returns {HttpRequestBuilder} this builder\n     */\n    params(ps) {\n        for (const [k, v] of rawEntries(ps)) {\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        //overriding, as header, headers and params all do: pass every value in one\n        //call to get a multi valued parameter\n        this.#params.delete(k);\n        if (vs.length === 0 || vs[0] == null) {\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 {(c: 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 (const 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        if (got === null) {\n            return undefined;\n        }\n        try {\n            return JSON.parse(got);\n        } catch {\n            //not what save wrote: drop it, otherwise every later read fails the same way\n            localStorage.removeItem(k);\n            return undefined;\n        }\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        if (got === null) {\n            return undefined;\n        }\n        try {\n            return JSON.parse(got);\n        } catch {\n            //not what save wrote: drop it, otherwise every later read fails the same way\n            sessionStorage.removeItem(k);\n            return undefined;\n        }\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.remove(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            SessionStorage.remove(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 = /** @type {number | null} */ (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 = (...called) => {\n            args = called;\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 = () => {\n            clearTimeout(tid ?? undefined);\n            tid = null;\n            args = [];\n        };\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 = /** @type {number | null} */ (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 = (...called) => {\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 = called;\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 = () => {\n            clearTimeout(tid ?? undefined);\n            tid = null;\n            args = [];\n        };\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 = /** @type {any} */ (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 & {dataset?: any} & {checked?: boolean} & {value?: any}} el\n     * @returns\n     */\n    static mutate(el, raw) {\n        if (el.getAttribute('type') === 'radio') {\n            //values are matched as strings, as ful-radio-group does: extract decodes\n            //boolean radios, and payloads carry numbers where the attribute is text\n            el.checked = raw != null && el.getAttribute('value') === String(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) => {\n            el.setCustomValidity?.('');\n        });\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 = document.createElement('form');\n        this.form = 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        //one try: building the loader and preparing the request are as much part of a\n        //submit as sending it, and a mapper that throws is how a caller reports a\n        //problem with the values\n        let values;\n        let request;\n        try {\n            const loader = registry.component(this.getAttribute('loader') ?? 'loaders:form').create(this);\n            values = Bindings.extractFrom(this.form, submitter);\n            request = await loader.prepare(values, this);\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        } finally {\n            this.spinner(false);\n        }\n    }\n    reset() {\n        this.form.reset();\n    }\n    #spinning = 0;\n    spinner(spin) {\n        //submits can overlap: only the outermost one saves and restores the button states\n        if (spin) {\n            ++this.#spinning;\n            if (this.#spinning !== 1) {\n                return;\n            }\n        } else {\n            this.#spinning = Math.max(0, this.#spinning - 1);\n            if (this.#spinning !== 0) {\n                return;\n            }\n        }\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', 'placeholder'];\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        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 mask = this.getAttribute('mask');\n            if (!mask) {\n                return;\n            }\n            const strip = (v) => v.replace(new RegExp(mask, 'g'), '');\n            const before = evt.target.value;\n            const after = strip(before);\n            if (before === after) {\n                return;\n            }\n            const start = evt.target.selectionStart;\n            evt.target.value = after;\n            if (start === null) {\n                //email, number and the date types have no selection to restore\n                return;\n            }\n            //the caret keeps its place among the characters that survived, so only the\n            //ones stripped before it count\n            const caret = strip(before.slice(0, start)).length;\n            evt.target.setSelectionRange(caret, caret);\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        if (!skipObservedSetup) {\n            // biome-ignore lint/complexity/noUselessThisAlias: keeps checkJs from seeing these as class fields\n            const el = this;\n            el.disabled = disabled;\n            el.readonly = observed.readonly;\n            el.required = observed.required;\n            el.placeholder = observed.placeholder;\n            el.value = observed.value;\n        }\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        //the claim only, like a native input: the effective state, claim or disabled\n        //ancestry, is what :disabled matches\n        return this.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        //the claim belongs to the author alone, nothing else ever writes it\n        Attributes.toggle(this, 'disabled', d);\n        //the inner control carries the claim as a native input would: a disabled\n        //fieldset ancestry is left to the browser, which reaches the inner control\n        //as a descendant of the fieldset and re-enables it on its own\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    get placeholder() {\n        const v = this._input.getAttribute('placeholder');\n        return v === ' ' ? null : v;\n    }\n    set placeholder(d) {\n        //without a placeholder :placeholder-shown never matches, and floating labels\n        //rely on it, so a blank one stands in for none\n        Attributes.set(this._input, 'placeholder', d ?? ' ');\n        this.reflect(() => {\n            Attributes.set(this, 'placeholder', 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.textContent.trim();\n        if (content === '') {\n            this.replaceChildren(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.replaceChildren(formatter.format(new Date(y, m - 1, d)));\n    }\n}\n\nclass Instant extends ParsedElement {\n    render() {\n        const content = this.textContent.trim();\n        if (content === '') {\n            this.replaceChildren(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.replaceChildren(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', 'placeholder', 'min', 'max', 'step'];\n    _type() {\n        return 'date';\n    }\n    render(conf) {\n        const { observed } = conf;\n        super.render(conf);\n        //step first: on a time input min and max are snapped to its grid\n        this.step = observed.step;\n        this.min = observed.min;\n        this.max = observed.max;\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            }\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    get min() {\n        const v = this._input.min;\n        return v === '' ? null : v;\n    }\n    set min(v) {\n        this._input.min = this.#fromNowOrOffset(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 = this.#fromNowOrOffset(v);\n    }\n    /**\n     * Resolves `now` and hour or minute offsets against the current time, wrapping\n     * around midnight. `m` is minutes here, unlike the date offsets of the parent where\n     * it is months: months mean nothing on a time. Anything else is passed through.\n     */\n    #fromNowOrOffset(v) {\n        if (!v) {\n            return '';\n        }\n        const resolved = new Date();\n        if (v !== 'now') {\n            const re = /^([+-])(\\d+)([hm])$/;\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] * sign;\n            if (match[3] === 'h') {\n                resolved.setHours(resolved.getHours() + offset);\n            } else {\n                resolved.setMinutes(resolved.getMinutes() + offset);\n            }\n        }\n        return InputLocalTime.#snapped(resolved, Number(this._input.step) || 60);\n    }\n    /**\n     * Truncates a time to the step grid: min anchors that grid, so a bound that is not\n     * on it makes every value on it invalid.\n     */\n    static #snapped(date, stepSeconds) {\n        const pad = (n) => String(n).padStart(2, '0');\n        const seconds = date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();\n        const snapped = Math.floor(seconds / stepSeconds) * stepSeconds;\n        const hh = pad(Math.floor(snapped / 3600));\n        const mm = pad(Math.floor((snapped % 3600) / 60));\n        return stepSeconds % 60 === 0 ? `${hh}:${mm}` : `${hh}:${mm}:${pad(snapped % 60)}`;\n    }\n}\n\nclass InputInstant extends Input {\n    static observed = ['value', 'readonly:presence', 'required:presence', 'placeholder', '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            unacceptablefiletype: '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            unacceptablefiletype: '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            unacceptablefiletype: '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            unacceptablefiletype: '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        'placeholder',\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, skipObservedSetup: true });\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\n        this.disabled = conf.disabled;\n        this.readonly = observed.readonly;\n        this.required = observed.required;\n        this.placeholder = observed.placeholder;\n        this.value = observed.value;\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 idx = [...this.#items.children].indexOf(e.target.closest('ful-item'));\n            if (idx === -1) {\n                return;\n            }\n            const dt = new DataTransfer();\n            [...this.files]\n                .filter((f, i) => i !== idx)\n                .forEach((f) => {\n                    dt.items.add(f);\n                });\n            this.files = dt.files;\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 dropped = [...e.dataTransfer.items].filter((i) => i.kind === 'file');\n            if (dropped.length === 0) {\n                return;\n            }\n            const dt = new DataTransfer();\n            dropped.forEach((i) => {\n                dt.items.add(i.getAsFile());\n            });\n            this.files = dt.files;\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.#warnings.replaceChildren();\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 }).appendTo(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('unacceptablefiletype', this.#accept.join(', '));\n        const dt = new DataTransfer();\n        [...this.files]\n            .filter((f) => !unacceptable.includes(f))\n            .forEach((f) => {\n                dt.items.add(f);\n            });\n        this._input.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        this._input.files = new DataTransfer().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]\n            .filter((f) => !oversized.includes(f))\n            .forEach((f) => {\n                dt.items.add(f);\n            });\n        this._input.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._input.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        this.#update();\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    }\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    #selected() {\n        return this.#menu?.querySelector('[selected]') ?? this.#menu?.firstElementChild ?? null;\n    }\n    acceptSelection() {\n        const selected = this.#selected();\n        if (!selected) {\n            return;\n        }\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        } catch (e) {\n            this.hide();\n            throw e;\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.#selected();\n            const candidate = selected?.[`${forward ? 'next' : 'previous'}ElementSibling`];\n            if (selected && 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    #token = 0;\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        try {\n            await this.#loader.prefetch?.();\n        } catch (/** @type any */ e) {\n            console.warn('failed to prefetch select options', this, 'reason:', e);\n        }\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        const [dload, abortdload] = Timing.throttle(400, () => {\n            this.#input.setAttribute('aria-expanded', 'true');\n            this.#ddmenu.show(() => this.#loader.load(this.#input.value));\n        });\n        this.addEventListener('click', (/** @type any */ e) => {\n            if (e.target.matches('input')) {\n                return;\n            }\n            //badges and other chrome are not form controls, the guard must ask the\n            //effective state\n            if (this.matches(':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.matches(':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.matches(':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.matches(':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, () => this.#loader.load(this.#input.value));\n                    break;\n                }\n                case 'ArrowDown': {\n                    e.preventDefault();\n                    this.#input.setAttribute('aria-expanded', 'true');\n                    this.#ddmenu.moveOrShow(true, () => this.#loader.load(this.#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                    if (!this.#ddmenu.shown) {\n                        //nothing to accept: submit the form as ful-input does. the inner\n                        //input carries form=\"\" so it never submits one on its own\n                        this.#requestSubmit();\n                        return;\n                    }\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.matches(':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(this.#coerceKey(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    #requestSubmit() {\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        form.requestSubmit(candidates.find((el) => el.type === 'submit'));\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    /**\n     * Coerces a key to the type declared by `k-type`. Keys reach the element from\n     * both worlds: the `value` attribute is text, a loader returns whatever its\n     * endpoint carries. One canonical type keeps the internal Map, which compares\n     * keys strictly, consistent. A key that does not decode is left as it is.\n     */\n    #coerceKey(k) {\n        switch (this.getAttribute('k-type')) {\n            case 'number': {\n                const n = k === '' ? Number.NaN : Number(k);\n                return Number.isNaN(n) ? k : n;\n            }\n            case 'boolean': {\n                if (k === true || k === 'true') {\n                    return true;\n                }\n                if (k === false || k === 'false') {\n                    return false;\n                }\n                return k;\n            }\n            default:\n                return String(k);\n        }\n    }\n\n    set value(vs) {\n        //the csvm mapper yields [] for a missing multiple value, an empty string is\n        //left alone: it is a usable key for an <option value=\"\">\n        const keys = (vs == null ? [] : Array.isArray(vs) ? vs : [vs]).map((k) => this.#coerceKey(k));\n        //the keys are known synchronously and are all `value` reads, so they are applied\n        //now: only the labels need the loader, until then a key stands in for its own\n        this.#values = new Map(keys.map((k) => [k, [k]]));\n        this.#syncBadges();\n        const token = ++this.#token;\n        if (keys.length === 0) {\n            return;\n        }\n        this.#resolve(keys, token);\n    }\n    /**\n     * Resolves the labels of the assigned keys. A failed lookup is left to reject so\n     * that it is reported like any other failure: the keys stay applied either way.\n     */\n    async #resolve(keys, token) {\n        const entries = await this.#loader.exact(...keys);\n        if (token !== this.#token) {\n            //a newer assignment has been made in the meantime\n            return;\n        }\n        //label the keys that are still selected: a removal made while the lookup was in\n        //flight must not be undone by it, and a key the loader does not know is dropped\n        //the loader keys are coerced too, so they line up with the assigned ones\n        const resolved = new Map(entries.map((e) => [this.#coerceKey(e[0]), e.slice(1)]));\n        for (const key of keys) {\n            if (!this.#values.has(key)) {\n                continue;\n            }\n            if (resolved.has(key)) {\n                this.#values.set(key, resolved.get(key));\n            } else {\n                this.#values.delete(key);\n            }\n        }\n        this.#syncBadges();\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        //the claim only, like a native input: the effective state, claim or disabled\n        //ancestry, is what :disabled matches\n        return this.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        //the claim belongs to the author alone, nothing else ever writes it\n        Attributes.toggle(this, 'disabled', d);\n        //the inner control carries the claim as a native input would: a disabled\n        //fieldset ancestry is left to the browser, which reaches the inner control\n        //as a descendant of the fieldset and re-enables it on its own\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) => {\n            el.remove();\n        });\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        //the claim only, like a native input: the effective state, claim or disabled\n        //ancestry, is what :disabled matches\n        return this.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        //the claim belongs to the author alone, nothing else ever writes it\n        Attributes.toggle(this, 'disabled', d);\n        //the group disables through its own fieldset, which carries the claim like\n        //a native input would: a disabled outer ancestry is left to the browser,\n        //which reaches the radios as descendants and re-enables them on its own\n        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            //a label is not a form control, the guard must ask the effective state\n            if (this.matches(':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        //the claim only, like a native input: the effective state, claim or disabled\n        //ancestry, is what :disabled matches\n        return this.hasAttribute('disabled');\n    }\n    set disabled(d) {\n        //the claim belongs to the author alone, nothing else ever writes it\n        Attributes.toggle(this, 'disabled', d);\n        //the inner control carries the claim as a native input would: a disabled\n        //fieldset ancestry is left to the browser, which reaches the inner control\n        //as a descendant of the fieldset and re-enables it on its own\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({ observed }) {\n        const sorter = this.getAttribute('sorter');\n        const orders = ['asc', 'desc', null];\n        this.order = observed.order;\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.total = observed.total ?? 0;\n        this.current = observed.current ?? 0;\n        this.addEventListener('click', (/** @type any */ evt) => {\n            const el = evt.target.closest('a');\n            if (!el || el.classList.contains('disabled')) {\n                //a disabled link leads nowhere: the page it would ask for does not exist\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 hasPrev = current > 0;\n        const hasNext = current + 1 < total;\n        //a disabled arrow carries no page: there is nothing valid for it to point at\n        const prev = { index: hasPrev ? current - 1 : null, enabled: hasPrev };\n        const curr = { index: current, label: current + 1 };\n        const next = { index: hasNext ? current + 1 : null, enabled: hasNext };\n        //the window holds at most maxRender pages, centered on the current one and slid\n        //back towards the end so it stays full on the last pages\n        const rendered = Math.max(1, Math.min(maxRender, total));\n        const first = Math.max(0, Math.min(current - Math.floor((rendered - 1) / 2), total - rendered));\n        const pages = Array.from({ length: rendered }, (_, offset) => ({\n            index: first + offset,\n            label: first + offset + 1,\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        //nodeOrFragment is undefined when the slot is missing altogether\n        const schema = nodeOrFragment ? Nodes.queryChildren(nodeOrFragment, 'schema') : null;\n        if (!schema) {\n            throw new Error('missing expected <schema>: ful-table needs a <template slot=\"schema\"> holding one');\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.replaceChildren(fragment);\n        const thead = /** @type HTMLTableSectionElement */ (this.querySelector('thead'));\n        schema.headersTemplate.renderTo(thead);\n        this.#sorters = thead.querySelectorAll('ful-sorter');\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) => {\n                s.order = null;\n            });\n            e.target.order = e.detail.value.order;\n        });\n        if (this.hasAttribute('autoload')) {\n            //not awaited: the first load must not hold up the upgrade, and a loader that\n            //fails or never answers must not keep ftl:ready from firing for the page.\n            //load renders its own error state and lets the failure reject, so it is reported\n            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', 'placeholder'];\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        //Input.render only re-dispatches changes coming from the first operand\n        this.#value2.addEventListener('change', (evt) => {\n            evt.stopPropagation();\n            this.#notifyChange();\n        });\n\n        this.disabled = conf.disabled;\n        this.readonly = conf.observed.readonly;\n        this.required = conf.observed.required;\n        this.placeholder = conf.observed.placeholder;\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            const previous = btn.getAttribute('value');\n            Attributes.toggle(this.#value2, 'hidden', value !== 'BETWEEN');\n            btn.setAttribute('value', value);\n            btn.innerHTML = target.innerHTML;\n            if (previous !== value) {\n                this.#notifyChange();\n            }\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.#showOperator(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    #showOperator(operator) {\n        this.#operator.setAttribute('value', operator);\n        const items = Array.from(this.#operator.nextElementSibling?.querySelectorAll('li > a[value]') ?? []);\n        const item = items.find((a) => a.getAttribute('value') === operator);\n        if (item) {\n            this.#operator.innerHTML = item.innerHTML;\n        }\n        Attributes.toggle(this.#value2, 'hidden', operator !== 'BETWEEN');\n    }\n    #notifyChange() {\n        this.dispatchEvent(\n            new CustomEvent('change', {\n                bubbles: true,\n                cancelable: false,\n                detail: {\n                    value: this.value,\n                },\n            }),\n        );\n    }\n    get readonly() {\n        return super.readonly;\n    }\n    set readonly(v) {\n        this.#value2.readOnly = v;\n        super.readonly = v;\n    }\n    get disabled() {\n        return super.disabled;\n    }\n    set disabled(d) {\n        //the claim and the first operand are the base's, the second operand mirrors\n        //the claim like the first one does\n        super.disabled = d;\n        Attributes.toggle(this.#value2, 'disabled', d);\n    }\n}\n\nclass LocalDateFilter extends Input {\n    static observed = ['value:json', 'readonly:presence', 'required:presence', 'placeholder'];\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        //Input.render only re-dispatches changes coming from the first operand\n        this.#value2.addEventListener('change', (evt) => {\n            evt.stopPropagation();\n            this.#notifyChange();\n        });\n\n        this.disabled = conf.disabled;\n        this.readonly = conf.observed.readonly;\n        this.required = conf.observed.required;\n        this.placeholder = conf.observed.placeholder;\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            const previous = btn.getAttribute('value');\n            Attributes.toggle(this.#value2, 'hidden', value !== 'BETWEEN');\n            btn.setAttribute('value', value);\n            btn.innerHTML = target.innerHTML;\n            if (previous !== value) {\n                this.#notifyChange();\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];\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.#showOperator(operator);\n        this.#value1.value = values[0];\n        this.#value2.value = values[1];\n    }\n    #showOperator(operator) {\n        this.#operator.setAttribute('value', operator);\n        const items = Array.from(this.#operator.nextElementSibling?.querySelectorAll('li > a[value]') ?? []);\n        const item = items.find((a) => a.getAttribute('value') === operator);\n        if (item) {\n            this.#operator.innerHTML = item.innerHTML;\n        }\n        Attributes.toggle(this.#value2, 'hidden', operator !== 'BETWEEN');\n    }\n    #notifyChange() {\n        this.dispatchEvent(\n            new CustomEvent('change', {\n                bubbles: true,\n                cancelable: false,\n                detail: {\n                    value: this.value,\n                },\n            }),\n        );\n    }\n    get readonly() {\n        return super.readonly;\n    }\n    set readonly(v) {\n        this.#value2.readOnly = v;\n        super.readonly = v;\n    }\n    get disabled() {\n        return super.disabled;\n    }\n    set disabled(d) {\n        //the claim and the first operand are the base's, the second operand mirrors\n        //the claim like the first one does\n        super.disabled = d;\n        Attributes.toggle(this.#value2, 'disabled', d);\n    }\n}\n\nclass TextFilter extends Input {\n    static observed = ['value:json', 'readonly:presence', 'required:presence', 'placeholder'];\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    //the sensitivity has no control of its own: it is carried through from whoever set the value\n    #sensitivity = 'IGNORE_CASE';\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.placeholder = conf.observed.placeholder;\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            const previous = btn.getAttribute('value');\n            btn.setAttribute('value', value);\n            btn.innerHTML = target.innerHTML;\n            if (previous !== value) {\n                this.#notifyChange();\n            }\n        });\n    }\n    get value() {\n        const operator = this.#operator.getAttribute('value');\n        return this.#value.value === '' ? undefined : [operator, this.#sensitivity, 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.#showOperator(operator);\n        this.#sensitivity = sensitivity ?? 'IGNORE_CASE';\n        this.#value.value = value;\n    }\n    #showOperator(operator) {\n        this.#operator.setAttribute('value', operator);\n        const items = Array.from(this.#operator.nextElementSibling?.querySelectorAll('li > a[value]') ?? []);\n        const item = items.find((a) => a.getAttribute('value') === operator);\n        if (item) {\n            this.#operator.innerHTML = item.innerHTML;\n        }\n    }\n    #notifyChange() {\n        this.dispatchEvent(\n            new CustomEvent('change', {\n                bubbles: true,\n                cancelable: false,\n                detail: {\n                    value: this.value,\n                },\n            }),\n        );\n    }\n}\n\nexport { InstantFilter, LocalDateFilter, TextFilter };\n","class LocalizationModule {\n    static t(k, ...args) {\n        //@ts-expect-error l10n and language come from the element class and the data stack\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    // biome-ignore-start lint/complexity/useLiteralKeys: checkJs rejects unknown properties on Window\n    window['ftl'] = ftl;\n    window['httpc'] = httpc;\n    window['ful'] = ful;\n    // biome-ignore-end lint/complexity/useLiteralKeys: checkJs rejects unknown properties on Window\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","Set","removed","replaceChildren","dataset","popData","prepend","ref","insertBefore","replace","cleanup","clear","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","includes","FILTER_ACCEPT","FILTER_REJECT","attributes","FILTER_SKIP","message","nodeOrFragment","cause","super","stringify","child","removeChild","ELEMENT_NODE","UpgradeQueue","q","async","settle","dispatchEvent","CustomEvent","bubbles","cancelable","finished","enqueue","promise","markFinished","withResolvers","then","upgrade","finally","all","values","entries","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","accept","pending","Rendering","waitFor","contains","waitForChildren","ParsedElement","HTMLElement","observedAttributes","parsed","reflecting","bits","connectedCallback","attributeChangedCallback","oldValue","newValue","attribute","disabled","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","rawEntries","source","URLSearchParams","client","params","body","baseUri","queryString","Headers","hs","header","ps","param","vs","multipart","callback","formData","FormData","HttpMultipartRequestCustomizer","kvs","option","opts","ok","fetchText","fetchJson","fetchBlob","fetchArrayBuffer","field","blob","filename","blobs","Blob","LocalStorage","Storage","save","localStorage","setItem","load","got","getItem","removeItem","pop","decoded","SessionStorage","sessionStorage","VersionedLocalStorage","revision","stored","VersionedSessionStorage","AsyncEvents","fireAsync","evt","promises","asyncOn","listener","event","ae","reject","asyncOff","removeEventListener","mixInto","prototype","Timing","sleep","setTimeout","debounce","timeoutMs","func","DEBOUNCE_DEFAULT","tid","previousTimestamp","later","elapsed","performance","now","DEBOUNCE_IMMEDIATE","called","clearTimeout","throttle","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","remaining","THROTTLE_NO_TRAILING","Bindings","flatten","obj","stops","pre","providePath","path","previous","ckey","pkey","isInteger","extract","checked","fulBindType","tagName","extractFrom","form","submitter","elements","mutate","raw","mutateIn","names","flattenedKey","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","spinning","spin","max","hidden","hel","wd","Input","_input","_fieldError","internals","attachInternals","role","_type","_fragment","skipObservedSetup","find","requestSubmit","mask","strip","RegExp","before","after","start","selectionStart","caret","setSelectionRange","label","ariaDescribedByElements","ariaLabelledByElements","readonly","required","placeholder","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","step","min","fromIsoOrOffset","formatLocalDate","date","getTime","getTimezoneOffset","toISOString","match","exec","sign","setHours","setDate","originalDay","setMonth","setFullYear","InputLocalTime","fromNowOrOffset","resolved","setMinutes","snapped","stepSeconds","seconds","hh","mm","InputInstant","InputFile","en","dropzonelabel","unacceptablefiletype","maxfilesizeexceeded","maxtotalsizeexceeded","maxfilesexceeded","it","fr","items","dropzone","warnings","warning","multiple","itemlist","maxfiles","maxfilesize","maxtotalsize","closest","idx","dt","DataTransfer","files","f","click","dropped","dataTransfer","kind","getAsFile","update","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","selected","firstElementChild","acceptSelection","metadata","index","shown","show","moveOrShow","candidate","scrollIntoView","block","behavior","Select","badges","ddmenu","fieldError","token","dload","abortdload","changed","syncBadges","relatedTarget","code","selectionEnd","coerceKey","withLoader","candidates","selection","NaN","isNaN","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","hasPrev","hasNext","enabled","curr","rendered","first","pages","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","thead","maybeForm","reload","pageResponse","resetWithFilter","ceil","InstantFilter","operator","value1","value2","notifyChange","btn","previousElementSibling","showOperator","item","nextElementSibling","LocalDateFilter","TextFilter","sensitivity","LocalizationModule","l10n","language","tl","Plugin","httpClient","navigator","ftl","httpc","ful"],"mappings":"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"}