@optionfactory/fml 8.0.3 → 9.0.0-rc10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +87 -0
  3. package/dist/client-errors.iife.js +30 -9
  4. package/dist/client-errors.iife.js.map +1 -1
  5. package/dist/client-errors.iife.min.js +1 -1
  6. package/dist/client-errors.iife.min.js.map +1 -1
  7. package/dist/custom-elements.json +1622 -415
  8. package/dist/fml.css +21 -10
  9. package/dist/fml.css.map +1 -1
  10. package/dist/fml.d.mts +3 -1322
  11. package/dist/fml.iife.js +5767 -2313
  12. package/dist/fml.iife.js.map +1 -1
  13. package/dist/fml.iife.min.js +1 -1
  14. package/dist/fml.iife.min.js.map +1 -1
  15. package/dist/fml.min.mjs +1 -1
  16. package/dist/fml.min.mjs.map +1 -1
  17. package/dist/fml.mjs +6 -8737
  18. package/dist/fml.mjs.map +1 -1
  19. package/dist/ftl.d.mts +430 -92
  20. package/dist/ftl.iife.js +1314 -809
  21. package/dist/ftl.iife.js.map +1 -1
  22. package/dist/ftl.iife.min.js +1 -1
  23. package/dist/ftl.iife.min.js.map +1 -1
  24. package/dist/ftl.min.mjs +1 -1
  25. package/dist/ftl.min.mjs.map +1 -1
  26. package/dist/ftl.mjs +1313 -810
  27. package/dist/ftl.mjs.map +1 -1
  28. package/dist/ful.css +21 -10
  29. package/dist/ful.css.map +1 -1
  30. package/dist/ful.d.mts +973 -252
  31. package/dist/ful.iife.js +4176 -1416
  32. package/dist/ful.iife.js.map +1 -1
  33. package/dist/ful.iife.min.js +1 -1
  34. package/dist/ful.iife.min.js.map +1 -1
  35. package/dist/ful.min.mjs +1 -1
  36. package/dist/ful.min.mjs.map +1 -1
  37. package/dist/ful.mjs +4163 -1416
  38. package/dist/ful.mjs.map +1 -1
  39. package/dist/httpc.d.mts +114 -19
  40. package/dist/httpc.iife.js +253 -83
  41. package/dist/httpc.iife.js.map +1 -1
  42. package/dist/httpc.iife.min.js +1 -1
  43. package/dist/httpc.iife.min.js.map +1 -1
  44. package/dist/httpc.min.mjs +1 -1
  45. package/dist/httpc.min.mjs.map +1 -1
  46. package/dist/httpc.mjs +250 -84
  47. package/dist/httpc.mjs.map +1 -1
  48. package/dist/vscode.html-custom-data.json +660 -58
  49. package/dist/web-types.json +1577 -354
  50. package/package.json +16 -8
package/dist/ful.min.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{ParsedElement as e,Attributes as t,registry as s,Fragments as i,Templates as r,Nodes as a,Rendering as n}from"./ftl.min.mjs";import{Failure as l,HttpClient as o}from"./httpc.min.mjs";class d extends Storage{static save(e,t){localStorage.setItem(e,JSON.stringify(t))}static load(e){const t=localStorage.getItem(e);if(null!==t)try{return JSON.parse(t)}catch{return void localStorage.removeItem(e)}}static remove(e){localStorage.removeItem(e)}static pop(e){const t=d.load(e);return d.remove(e),t}}class u extends Storage{static save(e,t){sessionStorage.setItem(e,JSON.stringify(t))}static load(e){const t=sessionStorage.getItem(e);if(null!==t)try{return JSON.parse(t)}catch{return void sessionStorage.removeItem(e)}}static remove(e){sessionStorage.removeItem(e)}static pop(e){const t=u.load(e);return u.remove(e),t}}class c{static save(e,t,s){d.save(e,{revision:t,data:s})}static load(e,t){const s=d.load(e);if(void 0!==s){if(s.revision===t)return s.data;d.remove(e)}}}class h{static save(e,t,s){u.save(e,{revision:t,data:s})}static load(e,t){const s=u.load(e);if(void 0!==s){if(s.revision===t)return s.data;u.remove(e)}}}class p{static async fireAsync(e,t,s){e.dispatchEvent(t);const i=t.async?.promises??[],r=s?.mode??"broadcast";if("pipeline"===r&&i.length>1)throw new Error(`[AsyncEvents] Event "${t.type}" is configured in 'pipeline' mode and expects at most one async listener, but ${i.length} listeners were triggered on this element.`);if("delegate"===r&&1!==i.length)throw new Error(`[AsyncEvents] Event "${t.type}" is configured in 'delegate' mode and requires exactly one async listener, but ${i.length} were registered.`);return"broadcast"===r?Promise.all(i):Promise.resolve(i[0])}static asyncOn(e,t,s,i){const r=async e=>{const t=e;t.async||(t.async={promises:[]});const{promise:i,resolve:r,reject:a}=Promise.withResolvers();t.async.promises.push(i);try{r(await s(t))}catch(e){a(e)}};return e.addEventListener(t,r,i),r}static asyncOff(e,t,s,i){e.removeEventListener(t,s,i)}static mixInto(...e){for(const t of e)Object.assign(t.prototype,{async fireAsync(e,t){return await p.fireAsync(this,e,t)},asyncOn(e,t,s){return p.asyncOn(this,e,t,s)},asyncOff(e,t,s){p.asyncOff(this,e,t,s)}})}}class f{static sleep(e){return new Promise(t=>setTimeout(t,e))}static DEBOUNCE_DEFAULT=0;static DEBOUNCE_IMMEDIATE=1;static debounce(e,t,s){const i=s??f.DEBOUNCE_DEFAULT;let r=null,a=[],n=0;const l=()=>{const s=performance.now()-n;e>s?r=setTimeout(l,e-s):(r=null,i!==f.DEBOUNCE_IMMEDIATE&&t(...a),null===r&&(a=[]))};return[(...s)=>{a=s,n=performance.now(),null===r&&(r=setTimeout(l,e),i===f.DEBOUNCE_IMMEDIATE&&t(...a))},()=>{clearTimeout(r??void 0),r=null,a=[]}]}static THROTTLE_DEFAULT=0;static THROTTLE_NO_LEADING=1;static THROTTLE_NO_TRAILING=2;static throttle(e,t,s){const i=s??f.THROTTLE_DEFAULT;let r=null,a=[],n=0;const l=()=>{n=i&f.THROTTLE_NO_LEADING?0:performance.now(),r=null,t(...a),null===r&&(a=[])};return[(...s)=>{const o=performance.now();!n&&i&f.THROTTLE_NO_LEADING&&(n=o);const d=0===n?0:e-(o-n);a=s,d<=0||d>e?(null!==r&&(clearTimeout(r),r=null),n=o,t(...a),null===r&&(a=[])):null!==r||i&f.THROTTLE_NO_TRAILING||(r=setTimeout(l,d))},()=>{clearTimeout(r??void 0),r=null,a=[]}]}}class m{static flatten(e,t,s){return Object.keys(e).reduce((i,r)=>{const a=t.length?`${t}.${r}`:r;return s.has(a)||"object"!=typeof e[r]||null===e[r]?i[a]=e[r]:Object.assign(i,m.flatten(e[r],a,s)),i},{})}static providePath(e,t,s){const i=t.split(".").map(e=>/^[0-9]+$/.test(e)?+e:e);let r=e??{},a=null;for(let t=0;;++t){const n=i[t],l=i[t-1];if(Number.isInteger(n)&&!Array.isArray(r)&&(null!==a?a[l]=r=[]:e=r=[]),t===i.length-1)return r[n]=void 0!==s?s:n in r?r[n]:null,e;void 0===r[n]&&(r[n]={}),a=r,r=r[n]}}static extract(e){if("radio"===e.getAttribute("type")){if(!e.checked)return;return"boolean"===e.dataset.fulBindType?"true"===e.value:e.value}return"checkbox"===e.getAttribute("type")?e.checked:"boolean"===e.dataset.fulBindType?e.value?"true"===e.value:null:!("INPUT"!==e.tagName&&"SELECT"!==e.tagName&&"TEXTAREA"!==e.tagName||""!==e.value&&void 0!==e.value)?null:e.value}static extractFrom(e,t){let s={};for(const i of e.elements)!i.hasAttribute("name")||i.matches(":disabled")&&i!==t||(s=m.providePath(s,i.getAttribute("name"),m.extract(i)));return s}static mutate(e,t){"radio"!==e.getAttribute("type")?"checkbox"!==e.getAttribute("type")?e.value=t:e.checked=t:e.checked=null!=t&&e.getAttribute("value")===String(t)}static mutateIn(e,t){const s=Array.from(e.elements).map(e=>e.getAttribute("name")).filter(e=>e);for(const[i,r]of Object.entries(m.flatten(t,"",new Set(s))))for(const t of e.querySelectorAll(`[name='${CSS.escape(i)}']`))m.mutate(t,r)}static errors(e,t,s){const i=t.filter(e=>"FIELD_ERROR"===e.type||"INVALID_FORMAT"===e.type),r=t.filter(e=>"FIELD_ERROR"!==e.type&&"INVALID_FORMAT"!==e.type);e.querySelectorAll("[name]").forEach(e=>{e.setCustomValidity?.("")}),e.querySelectorAll("ful-errors").forEach(e=>{e.replaceChildren(),e.setAttribute("hidden","")}),i.forEach(t=>{const s=t.context.replace(/\[/g,".").replace(/\]\./g,".").replace(/\]/g,"").split(".");for(let i=s.length;0!==i;--i){const r=s.slice(0,i).join("."),a=s.slice(i,s.length).join(".");e.querySelectorAll(`[name='${CSS.escape(r)}']`).forEach(e=>{e.setCustomValidity?.(t.reason,a)})}}),e.querySelectorAll("ful-errors").forEach(e=>{e.innerText=r.map(e=>e.reason).join("\n"),0!==r.length&&e.removeAttribute("hidden")}),0!==t.length&&s&&Array.from(e.querySelectorAll(":invalid")).sort((e,t)=>e.getBoundingClientRect().y-t.getBoundingClientRect().y)[0]?.focus()}}class b{#e;#t;#s;#i;#r;constructor(e,t,s,i,r){this.#e=e,this.#t=t,this.#s=s,this.#i=i,this.#r=r}prepare(e,t){return this.#i(e,t)}async submit(e,t){return await this.#e.request(this.#s,this.#t).json(e).fetch()}transform(e,t){return this.#r(e,t)}}class v{#i;#r;constructor(e,t){this.#i=e,this.#r=t}async prepare(e,t){return await this.#i(e,t)}async submit(e,t,s){return s}async transform(e,t){return await this.#r(e,t)}}class g{static create(e,t){const i=s.component("http-client"),r=e.hasAttribute("request-mapper")?s.component(e.getAttribute("request-mapper")):e=>e,a=e.hasAttribute("response-mapper")?s.component(e.getAttribute("response-mapper")):e=>e,n=e.getAttribute("action");if(!n)return new v(r,a);const l=e.getAttribute("method")??"POST";return new b(i,n,l,r,a)}}class y extends e{form;render(){const e=document.createElement("form");this.form=e,e.setAttribute("novalidate",""),t.forward("form-",this,e),e.replaceChildren(...this.childNodes),e.addEventListener("submit",async e=>{e.preventDefault(),e.stopPropagation(),await this.submit(e.submitter??void 0)}),this.hasAttribute("clear-invalid-on-change")&&this.addEventListener("change",e=>{e.target.setCustomValidity?.("")}),this.replaceChildren(e)}async submit(e){let t,i;this.spinner(!0);try{const r=s.component(this.getAttribute("loader")??"loaders:form").create(this);t=m.extractFrom(this.form,e),i=await r.prepare(t,this);const a=new CustomEvent("submit",{bubbles:!0,cancelable:!0,detail:{submitter:e,values:t,request:i}});if(!this.dispatchEvent(a))return;this.errors=[];const n=new CustomEvent("submit:requested",{bubbles:!0,cancelable:!1,detail:{submitter:e,values:a.detail.values,request:a.detail.request}});let l=await p.fireAsync(this,n,{mode:"pipeline"});i=n.detail.request,l=await r.submit(i,this,l);const o=await r.transform(l,this);this.dispatchEvent(new CustomEvent("submit:success",{bubbles:!0,cancelable:!1,detail:{submitter:e,values:t,request:i,response:o}}))}catch(s){this.dispatchEvent(new CustomEvent("submit:failure",{bubbles:!0,cancelable:!1,detail:{submitter:e,values:t,request:i,exception:s}})),s instanceof l&&(this.errors=s.problems),console.warn("failed to submit form",this,"reason:",s)}finally{this.spinner(!1)}}reset(){this.form.reset()}#a=0;spinner(e){if(e){if(++this.#a,1!==this.#a)return}else if(this.#a=Math.max(0,this.#a-1),0!==this.#a)return;this.querySelectorAll("ful-spinner").forEach(t=>{t.hidden=!e}),this.querySelectorAll("input,button").forEach(t=>{const s=t;"submit"!==s.type&&"reset"!==s.type||(e?(s.dataset.wd=String(s.disabled),s.disabled=!0):(s.disabled="true"===s.dataset.wd,delete s.dataset.wd))})}set values(e){m.mutateIn(this.form,e)}get values(){return m.extractFrom(this.form)}set errors(e){m.errors(this.form,e,this.hasAttribute("scroll-on-error"))}}class E extends e{static observed=["value","readonly:presence","required:presence","placeholder"];static slots=!0;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 ';static formAssociated=!0;_input;_fieldError;constructor(){super(),this.internals=this.attachInternals(),this.internals.role="presentation"}_type(){return this.getAttribute("type")??"text"}_fragment(e,t){return this.template().withOverlay({type:e,slots:t}).render()}render({slots:e,observed:s,disabled:i,skipObservedSetup:r}){const a=this._type(),n=this._fragment(a,e);this._input=n.querySelector("input,textarea"),t.forward("input-",this,this._input),this._input.addEventListener("keydown",e=>{if("Enter"!==e.key||"textarea"===this._type())return;const t=this.internals.form;if(!t)return;const s=Array.from(t.querySelectorAll("button:not(:disabled), input:not(:disabled)")).find(e=>"submit"===e.type);t.requestSubmit(s)}),this._input.addEventListener("input",e=>{const t=this.getAttribute("mask");if(!t)return;const s=e=>e.replace(new RegExp(t,"g"),""),i=e.target.value,r=s(i);if(i===r)return;const a=e.target.selectionStart;if(e.target.value=r,null===a)return;const n=s(i.slice(0,a)).length;e.target.setSelectionRange(n,n)}),this._input.addEventListener("change",e=>{e.stopPropagation(),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value}}))});const l=n.querySelector("label");if(l.addEventListener("click",()=>this.focus()),this._fieldError=n.querySelector("ful-field-error"),this._input.ariaDescribedByElements=[this._fieldError],this._input.ariaLabelledByElements=[l],this.replaceChildren(n),!r){const e=this;e.disabled=i,e.readonly=s.readonly,e.required=s.required,e.placeholder=s.placeholder,e.value=s.value}}get value(){const e=this.hasAttribute("uppercase"),t=this.hasAttribute("trim"),s=this._input.value,i=e?s.toUpperCase():s,r=t?i.trim():i;return""===r?null:r}set value(e){this._input.value=""===e?null:e}get readonly(){return this._input.readOnly}set readonly(e){this._input.readOnly=e,this.reflect(()=>{t.toggle(this,"readonly",e)})}get disabled(){return this.hasAttribute("disabled")}set disabled(e){t.toggle(this,"disabled",e),t.toggle(this._input,"disabled",e)}get required(){return"true"===this._input.getAttribute("aria-required")}set required(e){t.set(this._input,"aria-required",e?"true":null),this.reflect(()=>{t.toggle(this,"required",e)})}get placeholder(){const e=this._input.getAttribute("placeholder");return" "===e?null:e}set placeholder(e){t.set(this._input,"placeholder",e??" "),this.reflect(()=>{t.set(this,"placeholder",e)})}focus(e){this._input.focus(e)}setCustomValidity(e){if(!e)return this.internals.setValidity({}),void(this._fieldError.innerText="");this.internals.setValidity({customError:!0}," "),this._fieldError.innerText=e}formResetCallback(){this.value=this.unmarshal("value",this.getAttribute("value"))}}class w extends e{render(){const e=this.textContent.trim();if(""===e)return void this.replaceChildren(this.getAttribute("default")??"");const t=this.getAttribute("locale")??Intl.DateTimeFormat().resolvedOptions().locale,s=new Intl.DateTimeFormat(t,{year:"numeric",month:"numeric",day:"numeric"}),[i,r,a]=e.split("-").map(Number);this.replaceChildren(s.format(new Date(i,r-1,a)))}}class x extends e{render(){const e=this.textContent.trim();if(""===e)return void this.replaceChildren(this.getAttribute("default")??"");const t=this.getAttribute("locale")??Intl.DateTimeFormat().resolvedOptions().locale,s=new Intl.DateTimeFormat(t,{year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric",hour12:!1});this.replaceChildren(s.format(new Date(x.isoToLocal(e))))}static isoToLocal(e){const t=new Date(e),s=(e,t)=>String(t).padStart(e,"0");return`${`${t.getFullYear()}-${s(2,t.getMonth()+1)}-${s(2,t.getDate())}`}T${`${s(2,t.getHours())}:${s(2,t.getMinutes())}:${s(2,t.getSeconds())}.${s(3,t.getMilliseconds())}`}`}}class A extends E{static observed=["value","readonly:presence","required:presence","placeholder","min","max","step"];_type(){return"date"}render(e){const{observed:t}=e;super.render(e),this.step=t.step,this.min=t.min,this.max=t.max}get min(){const e=this._input.min;return""===e?null:e}set min(e){this._input.min=A.#n(e)}get max(){const e=this._input.max;return""===e?null:e}set max(e){this._input.max=A.#n(e)}get step(){const e=this._input.step;return""===e?null:e}set step(e){this._input.step=e??""}static#n(e){if(!e)return"";const t=e=>new Date(e.getTime()-6e4*e.getTimezoneOffset()).toISOString().split("T")[0];if("now"===e)return t(new Date);const s=/^([+-])(\d+)([dmy])$/.exec(e);if(!s)return e;const i="-"===s[1]?-1:1,r=+s[2],a=new Date;switch(a.setHours(0,0,0,0),s[3]){case"d":a.setDate(a.getDate()+r*i);break;case"m":{const e=a.getDate();a.setMonth(a.getMonth()+r*i),a.getDate()!==e&&a.setDate(0);break}case"y":a.setFullYear(a.getFullYear()+r*i)}return t(a)}}class q extends A{_type(){return"time"}get min(){const e=this._input.min;return""===e?null:e}set min(e){this._input.min=this.#l(e)}get max(){const e=this._input.max;return""===e?null:e}set max(e){this._input.max=this.#l(e)}#l(e){if(!e)return"";const t=new Date;if("now"!==e){const s=/^([+-])(\d+)([hm])$/.exec(e);if(!s)return e;const i="-"===s[1]?-1:1,r=+s[2]*i;"h"===s[3]?t.setHours(t.getHours()+r):t.setMinutes(t.getMinutes()+r)}return q.#o(t,Number(this._input.step)||60)}static#o(e,t){const s=e=>String(e).padStart(2,"0"),i=3600*e.getHours()+60*e.getMinutes()+e.getSeconds(),r=Math.floor(i/t)*t,a=s(Math.floor(r/3600)),n=s(Math.floor(r%3600/60));return t%60==0?`${a}:${n}`:`${a}:${n}:${s(r%60)}`}}class S extends E{static observed=["value","readonly:presence","required:presence","placeholder","min","max","step"];_type(){return"datetime-local"}render(e){const{observed:t}=e;super.render(e),this.min=t.min,this.max=t.max,this.step=t.step}get value(){const e=this._input.value;return""===e?null:new Date(e).toISOString()}set value(e){this._input.value=e?x.isoToLocal(e):""}get min(){const e=this._input.min;return""===e?null:new Date(e).toISOString()}set min(e){this._input.min=e?x.isoToLocal(e):""}get max(){const e=this._input.max;return""===e?null:new Date(e).toISOString()}set max(e){this._input.max=e?x.isoToLocal(e):""}get step(){const e=this._input.step;return""===e?null:e}set step(e){this._input.step=e??""}}class T extends E{static l10n={en:{dropzonelabel:"Click or drop your files here",unacceptablefiletype:"Only files of type {0} are supported",maxfilesizeexceeded:"Maximum supported file size is {0}",maxtotalsizeexceeded:"Maximum supported total file size is {0}",maxfilesexceeded:"Maximum files count exceeded"},it:{dropzonelabel:"Clicca o trascina i file qui",unacceptablefiletype:"Solo i file di tipo {0} sono supportati",maxfilesizeexceeded:"La dimensione massima di un file è di {0}",maxtotalsizeexceeded:"La dimensione massima complessiva dei file è di {0}",maxfilesexceeded:"Numero massimo di file superato"},es:{dropzonelabel:"Haz clic o arrastra tus archivos aquí",unacceptablefiletype:"Solo se admiten archivos de tipo {0}",maxfilesizeexceeded:"El tamaño máximo de archivo admitido es {0}",maxtotalsizeexceeded:"El tamaño total máximo admitido es {0}",maxfilesexceeded:"Se ha superado el número máximo de archivos"},fr:{dropzonelabel:"Cliquez ou déposez vos fichiers ici",unacceptablefiletype:"Seuls les fichiers de type {0} sont pris en charge",maxfilesizeexceeded:"La taille maximale de fichier prise en charge est {0}",maxtotalsizeexceeded:"La taille totale maximale prise en charge est {0}",maxfilesexceeded:"Nombre maximal de fichiers dépassé"}};static observed=["value","readonly:presence","required:presence","placeholder","accept:csv","multiple:presence","itemlist:presence","dropzone:presence","maxfiles:number","maxfilesize:number","maxtotalsize:number"];#d;#u;#c;#h;_type(){return"file"}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 ';static templates={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 ',warning:"<ful-field-warning>{{ #l10n:t(key, args) }}</ful-field-warning>"};render(e){const{observed:t}=e;super.render({...e,skipObservedSetup:!0}),this.#u=this.querySelector("ful-item-list"),this.#c=this.querySelector("[data-ref=dropzone]"),this.#h=this.querySelector("ful-field-warnings"),this.accept=t.accept,this.multiple=t.multiple,this.itemlist=t.itemlist,this.dropzone=t.dropzone,this.maxfiles=t.maxfiles,this.maxfilesize=t.maxfilesize,this.maxtotalsize=t.maxtotalsize,this.disabled=e.disabled,this.readonly=t.readonly,this.required=t.required,this.placeholder=t.placeholder,this.value=t.value,this.#h.addEventListener("animationend",e=>{e.target.remove()}),this.#u.addEventListener("click",e=>{if(!e.target.closest("button"))return;const t=[...this.#u.children].indexOf(e.target.closest("ful-item"));if(-1===t)return;const s=new DataTransfer;[...this.files].filter((e,s)=>s!==t).forEach(e=>{s.items.add(e)}),this.files=s.files}),this.#c.addEventListener("click",e=>{this.querySelector("input")?.click()}),this.#c.addEventListener("dragover",e=>{e.preventDefault()}),this.#c.addEventListener("drop",e=>{e.preventDefault();const t=[...e.dataTransfer.items].filter(e=>"file"===e.kind);if(0===t.length)return;const s=new DataTransfer;t.forEach(e=>{s.items.add(e.getAsFile())}),this.files=s.files}),this._input.addEventListener("change",e=>{this.#p()})}#f(e){return e>1048576?Math.round(e/1024/1024*100)/100+"MiB":e>1024?Math.round(e/1024*100)/100+"KiB":`${e}B`}#p(){this.setCustomValidity(),this.#h.replaceChildren(),this.#m(),this.#b(),this.#v(),this.#g(),this.template("items").withOverlay({files:this.files}).withModule("bytes",{format:this.#f}).renderTo(this.#u)}warning(e,t){this.template("warning").withOverlay({key:e,args:t}).appendTo(this.#h)}#m(){if(!this.#d.length)return;const e=[...this.files].filter(e=>!this.#d.some(t=>e.name.toLowerCase().endsWith(t.toLowerCase())));if(0===e.length)return;this.warning("unacceptablefiletype",this.#d.join(", "));const t=new DataTransfer;[...this.files].filter(t=>!e.includes(t)).forEach(e=>{t.items.add(e)}),this._input.files=t.files}#g(){null!==this.#y&&(this.files.length<=this.#y||(this.warning("maxfilesexceeded"),this._input.files=(new DataTransfer).files))}#b(){if(null===this.#E)return;const e=[...this.files].filter(e=>e.size>this.#E);if(0===e.length)return;this.warning("maxfilesizeexceeded",this.#f(this.#E));const t=new DataTransfer;[...this.files].filter(t=>!e.includes(t)).forEach(e=>{t.items.add(e)}),this._input.files=t.files}#v(){if(null===this.#w)return;[...this.files].reduce((e,t)=>e+t.size,0)<=this.#w||(this.warning("maxtotalsizeexceeded",this.#f(this.#w)),this._input.files=(new DataTransfer).files)}get accept(){return this.#d}set accept(e){this._input.accept=e.join(","),this.#d=e,this.reflect(()=>{this.setAttribute("accept",this._input.accept)})}get multiple(){return this._input.multiple}set multiple(e){this._input.multiple=e,this.reflect(()=>{t.toggle(this,"multiple",e)})}get files(){return this._input.files}set files(e){this._input.files=e,this.#p()}get file(){return this.files[0]??null}set file(e){const t=new DataTransfer;e&&t.items.add(e),this.files=t.files}get value(){const e=Array.from(this._input.files).map(e=>e.name);return this.multiple?e:e[0]??null}set value(e){e||(this.files=(new DataTransfer).files)}get totalsize(){return Array.from(this.files).reduce((e,t)=>e+t.size,0)}#y;get maxfiles(){return this.#y}set maxfiles(e){this.#y=e,this.reflect(()=>{t.set(this,"maxfiles",e)})}#E;get maxfilesize(){return this.#E}set maxfilesize(e){this.#E=e,this.reflect(()=>{t.set(this,"maxfilesize",e)})}#w;get maxtotalsize(){return this.#w}set maxtotalsize(e){this.#w=e,this.reflect(()=>{t.set(this,"maxtotalsize",e)})}#x;get itemlist(){return this.#x}set itemlist(e){this.#x=e,this.reflect(()=>{t.toggle(this,"itemlist",e)})}#A;get dropzone(){return this.#A}set dropzone(e){this.#A=e,this.reflect(()=>{t.toggle(this,"dropzone",e)})}}class O{#e;#t;#s;#r;#q;#S;#T;constructor({http:e,url:t,method:s,responseMapper:i,prefetch:r,revision:a}){this.#e=e,this.#t=t,this.#s=s,this.#r=i,this.#q=r,this.#S=a,this.#T=null}async prefetch(){this.#q&&await this.#O()}async exact(...e){return await this.#O(),this.#T.filter(([t,s])=>e.some(e=>e==t))}async load(e){return await this.#O(),this.#T.filter(([t,s])=>(s??"").toLowerCase().includes(e?.toLowerCase()))}async reconfigureUrl(e){this.#T=null,this.#t=e}async#O(){if(null!==this.#T)return;const e=await O.#L(this.#e,this.#s,this.#t,this.#S);this.#T=this.#r(e)}static async#L(e,t,s,i){const r=`${t}@${s}`;if(null!==i){const e=c.load(r,i);if(void 0!==e)return e}const a=await e.request(t,s).fetchJson();return null!==i&&c.save(r,i,a),a}}class L{#e;#t;#s;#r;constructor({http:e,url:t,method:s,responseMapper:i}){this.#e=e,this.#t=t,this.#s=s,this.#r=i}async exact(...e){const t=await this.#e.request(this.#s,this.#t).param("k",...e).fetchJson();return this.#r(t)}async load(e){const t=await this.#e.request(this.#s,this.#t).param("s",e).fetchJson();return this.#r(t)}}class z{#T;constructor(e){this.#T=e}update(e){this.#T=e}exact(...e){return this.#T.filter(([t,s])=>e.some(e=>e==t))}load(e){return this.#T.filter(([t,s])=>(s??"").toLowerCase().includes(e?.toLowerCase()))}}class C{static create(e,t){if(!e.hasAttribute("src")){const e=Array.from(t.options?.querySelectorAll("option")??[]).map(e=>[e.getAttribute("value")??e.innerText.trim(),e.innerText.trim()]);return new z(e)}const i=s.component("http-client"),r=C.#z(e);return"chunked"===e.getAttribute("mode")?new L({http:i,url:e.getAttribute("src"),method:e.getAttribute("method")??"POST",responseMapper:r}):new O({http:i,url:e.getAttribute("src"),method:e.getAttribute("method")??"POST",responseMapper:r,prefetch:e.hasAttribute("preload"),revision:e.getAttribute("revision")})}static#z(e){return e.hasAttribute("k-expr")&&e.hasAttribute("l-expr")?t=>s.evaluator().withOverlay(t).evaluateExpression(e.getAttribute("d-expr")??"self").map(t=>{const i=s.evaluator().withOverlay(t);return[i.evaluateExpression(e.getAttribute("k-expr")),i.evaluateExpression(e.getAttribute("l-expr")),i.evaluateExpression(e.getAttribute("m-expr")??"self")]}):e.hasAttribute("response-mapper")?s.component(e.getAttribute("response-mapper")):e=>e}}class k extends e{static slots=!0;static template='\n <ful-spinner class="centered" hidden></ful-spinner>\n <menu tabindex="-1" role="listbox" hidden></menu>\n ';static templates={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 '};#C;#k;#_;#M=new Map;render({slots:e}){const t=this.template().render();this.#_=i.isBlank(e.default)?this.template("options"):r.fromFragment(e.default),this.#C=t.querySelector("ful-spinner"),this.#k=t.querySelector("menu"),this.#k.addEventListener("click",e=>{e.stopPropagation();const t=e.target.closest("li");t?this.#N(t):this.hide()}),this.replaceChildren(t)}#R(){return this.#k?.querySelector("[selected]")??this.#k?.firstElementChild??null}acceptSelection(){const e=this.#R();e&&this.#N(e)}update(e){if(void 0===e)throw new Error("null data");this.#M=new Map(e.map((e,t)=>[String(t),e]));const t=e.map(([e,t,s],i)=>({index:i,key:e,label:t,metadata:s}));this.#_.withOverlay(t).renderTo(this.#k)}#N(e){const t=e.getAttribute("value"),s=this.#M.get(t);this.hide(),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{index:t,data:s}}))}hide(){this.setAttribute("hidden","")}get shown(){return!this.hasAttribute("hidden")}async show(e){this.removeAttribute("hidden"),this.#k.setAttribute("hidden",""),this.#C.removeAttribute("hidden");try{const t=await e();this.update(t)}catch(e){throw this.hide(),e}finally{this.#C.setAttribute("hidden",""),this.#k.removeAttribute("hidden")}}async moveOrShow(e,t){if(this.shown){const t=this.#R(),s=t?.[(e?"next":"previous")+"ElementSibling"];return void(t&&s&&(t.removeAttribute("selected"),s.setAttribute("selected",""),s.scrollIntoView({block:"nearest",behavior:"smooth"})))}await this.show(t)}}class _ extends e{static observed=["value:csvm","readonly:presence","required:presence","itemlist:presence"];static slots=!0;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 ';static templates={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 '};static formAssociated=!0;internals;#I;#D;#B;#F;#u;#P;#$;#H=new Map;#j=0;constructor(){super(),this.internals=this.attachInternals(),this.internals.role="presentation"}async render({slots:e,observed:i,disabled:r}){const a=this.getAttribute("name");this.#I=s.component(this.getAttribute("loader")??"loaders:select").create(this,{options:e.options}),this.#P=this.hasAttribute("multiple");try{await(this.#I.prefetch?.())}catch(e){console.warn("failed to prefetch select options",this,"reason:",e)}const n=this.template().withOverlay({slots:e,name:a}).render();this.#F=n.querySelector("input"),this.#u=n.querySelector("ful-item-list"),t.forward("input-",this,this.#F),this.#D=n.querySelector("badges"),this.value=i.value,this.disabled=r,this.readonly=i.readonly,this.required=i.required,this.itemlist=i.itemlist,this.#B=n.querySelector("ful-dropdown");const l=n.querySelector("label");l.addEventListener("click",()=>this.focus()),this.#$=n.querySelector("ful-field-error"),this.#F.ariaDescribedByElements=[this.#$],this.#F.ariaLabelledByElements=[l];const[o,d]=f.throttle(400,()=>{this.#F.setAttribute("aria-expanded","true"),this.#B.show(()=>this.#I.load(this.#F.value))});this.addEventListener("click",e=>{if(!e.target.matches("input")&&!this.matches(":disabled")&&!this.readonly){if(this.#B.shown)return this.#F.setAttribute("aria-expanded","false"),void this.#B.hide();this.#F.focus(),o()}}),this.#u.addEventListener("click",e=>{if(e.stopPropagation(),!e.target.closest("button"))return;if(this.matches(":disabled")||this.readonly)return;const t=[...this.#u.children].indexOf(e.target.closest("ful-item"));-1!==t&&(this.#H.delete(Array.from(this.#H.keys())[t]),this.#V(),this.#U())}),this.#D.addEventListener("click",e=>{if(e.stopPropagation(),this.matches(":disabled")||this.readonly)return;const t=[...this.#D.children].indexOf(e.target);-1!==t&&(this.#H.delete(Array.from(this.#H.keys())[t]),this.#V(),this.#U())}),this.#F.addEventListener("change",e=>{e.stopPropagation()}),this.#F.addEventListener("blur",e=>{e.stopPropagation(),e.relatedTarget&&this.contains(e.relatedTarget)||(d(),this.#F.setAttribute("aria-expanded","false"),this.#B.hide(),this.#F.value="")}),this.#F.addEventListener("keydown",e=>{if(!this.matches(":disabled")&&!this.readonly)switch(e.code){case"ArrowUp":e.preventDefault(),this.#F.setAttribute("aria-expanded","true"),this.#B.moveOrShow(!1,()=>this.#I.load(this.#F.value));break;case"ArrowDown":e.preventDefault(),this.#F.setAttribute("aria-expanded","true"),this.#B.moveOrShow(!0,()=>this.#I.load(this.#F.value));break;case"Escape":this.#F.setAttribute("aria-expanded","false"),this.#B.hide();break;case"Enter":if(!this.#B.shown)return void this.#G();e.preventDefault(),this.#F.setAttribute("aria-expanded","false"),this.#B.acceptSelection(),this.#F.value="";break;case"Backspace":this.#H.size&&0===this.#F.selectionStart&&0===this.#F.selectionEnd&&(this.#H.delete(Array.from(this.#H.keys()).pop()),this.#V(),this.#U());break;case"Tab":this.#F.setAttribute("aria-expanded","false"),this.#B.hide(),d()}}),this.#F.addEventListener("input",e=>{e.stopPropagation(),this.matches(":disabled")||this.readonly||o()}),this.#B.addEventListener("change",e=>{e.stopPropagation(),this.#P||this.#H.clear(),this.#H.set(this.#W(e.detail.data[0]),e.detail.data.slice(1)),this.#V(),this.#U(),this.#F.focus(),this.#F.setAttribute("aria-expanded","false"),this.#B.hide(),this.#F.value=""}),this.replaceChildren(n)}async withLoader(e){return await e(this.#I)}#G(){const e=this.internals.form;if(!e)return;const t=Array.from(e.querySelectorAll("button:not(:disabled), input:not(:disabled)"));e.requestSubmit(t.find(e=>"submit"===e.type))}#V(){const e=[...this.#H.entries()].map(e=>({key:e[0],label:e[1][0],metadata:e[1].slice(1)})),t=this.#P?e:e[0]??null;this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:t}}))}#U(){const e=Array.from(this.#H.entries()).map(([e,t])=>{const s=document.createElement("badge");return s.setAttribute("role","button"),s.setAttribute("value",e),s.innerText=t[0],s});this.#D.replaceChildren(),this.#D.append(...e),this.#u.replaceChildren(),this.template("items").withOverlay({entries:this.#H.entries()}).renderTo(this.#u)}#W(e){switch(this.getAttribute("k-type")){case"number":{const t=""===e?Number.NaN:Number(e);return Number.isNaN(t)?e:t}case"boolean":return!0===e||"true"===e||!1!==e&&"false"!==e&&e;default:return String(e)}}set value(e){const t=(null==e?[]:Array.isArray(e)?e:[e]).map(e=>this.#W(e));this.#H=new Map(t.map(e=>[e,[e]])),this.#U();const s=++this.#j;0!==t.length&&this.#J(t,s)}async#J(e,t){const s=await this.#I.exact(...e);if(t!==this.#j)return;const i=new Map(s.map(e=>[this.#W(e[0]),e.slice(1)]));for(const t of e)this.#H.has(t)&&(i.has(t)?this.#H.set(t,i.get(t)):this.#H.delete(t));this.#U()}get value(){return this.#P?[...this.#H.keys()]:[...this.#H.keys()][0]??null}get entry(){return this.#P?[...this.#H.entries()]:[...this.#H.entries()][0]??null}get disabled(){return this.hasAttribute("disabled")}set disabled(e){t.toggle(this,"disabled",e),t.toggle(this.#F,"disabled",e)}get readonly(){return this.#F.readOnly}set readonly(e){this.#F.readOnly=e,this.reflect(()=>{t.toggle(this,"readonly",e)})}get required(){return"true"===this.#F.getAttribute("aria-required")}set required(e){t.set(this.#F,"aria-required",e?"true":null),this.reflect(()=>{t.toggle(this,"required",e)})}#x;get itemlist(){return this.#x}set itemlist(e){this.#x=e,this.reflect(()=>{t.toggle(this,"itemlist",e)})}focus(e){this.#F.focus(e)}setCustomValidity(e){if(!e)return this.internals.setValidity({}),void(this.#$.innerText="");this.internals.setValidity({customError:!0}," "),this.#$.innerText=e}}class M extends e{static observed=["value","readonly:presence","required:presence"];static slots=!0;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 ';static formAssociated=!0;#Q;#$;#K;#Y;constructor(){super(),this.internals=this.attachInternals(),this.internals.role="radiogroup"}render({slots:e,observed:s,disabled:r}){const a=this.getAttribute("name")??t.uid("ful-radiogroup"),n=Array.from(e.default.querySelectorAll("ful-radio")),l=n.map(e=>{const s=document.createElement("input");s.setAttribute("type","radio"),t.forward("input-",this,s),t.forward("",e,s),s.setAttribute("name",`${a}-ignore`),s.setAttribute("form",""),s.addEventListener("change",e=>{e.stopPropagation(),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value}}))});return[s,i.fromChildNodes(e)]});n.forEach(e=>{e.remove()}),this.template().withOverlay({name:a,slots:e,inputsAndLabels:l}).renderTo(this),this.#Q=this.firstElementChild,this.disabled=r,this.readonly=s.readonly,this.required=s.required,this.value=s.value,this.#$=this.querySelector("ful-field-error"),this.ariaDescribedByElements=[this.#$],this.#K=this.querySelector("input[type=radio]"),this.#Y="boolean"===this.getAttribute("type")}get value(){const e=this.querySelector("input[type=radio]:checked");return e?this.#Y?"true"===e.value:e.value:null}set value(e){if(null===e)return void this.querySelectorAll("input[type=radio]").forEach(e=>{e.checked=!1});const t=this.querySelector(`input[type=radio][value=${CSS.escape(String(e))}]`);t&&(t.checked=!0)}get readonly(){return this.#Q.inert}set readonly(e){this.#Q.inert=e,this.reflect(()=>{t.toggle(this,"readonly",e)})}get disabled(){return this.hasAttribute("disabled")}set disabled(e){t.toggle(this,"disabled",e),this.#Q.disabled=e}get required(){return"true"===this.#Q.getAttribute("aria-required")}set required(e){t.set(this.#Q,"aria-required",e?"true":null),this.reflect(()=>{t.toggle(this,"required",e)})}focus(e){this.#K.focus(e)}setCustomValidity(e){if(!e)return this.internals.setValidity({}),void(this.#$.innerText="");this.internals.setValidity({customError:!0}," "),this.#$.innerText=e}}class N extends e{static observed=["value:bool","readonly:presence","required:presence"];static slots=!0;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 ';#X;#F;#$;static formAssociated=!0;constructor(){super(),this.internals=this.attachInternals(),this.internals.role="presentation"}render({slots:e,observed:s,disabled:i}){const r="switch"===this.getAttribute("type"),a=r?"form-check form-switch":"form-check",n=this.template().withOverlay({slots:e,klass:a,isSwitch:r}).render();this.#X=n.firstElementChild,this.#F=n.querySelector("input"),t.forward("input-",this,this.#F),this.disabled=i,this.readonly=s.readonly,this.required=s.required,this.value=s.value,this.#F.addEventListener("change",e=>{e.stopPropagation(),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value}}))});const l=n.querySelector("label");l.addEventListener("click",()=>{this.focus(),this.matches(":disabled")||this.readonly||(this.value=!this.value,this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value}})))}),this.#$=n.querySelector("ful-field-error"),this.#F.ariaDescribedByElements=[this.#$],this.#F.ariaLabelledByElements=[l],this.replaceChildren(n)}get value(){return this.#F.checked}set value(e){this.#F.checked=e}get readonly(){return this.#X.inert}set readonly(e){this.#X.inert=e,this.reflect(()=>{t.toggle(this,"readonly",e)})}get disabled(){return this.hasAttribute("disabled")}set disabled(e){t.toggle(this,"disabled",e),t.toggle(this.#F,"disabled",e)}get required(){return"true"===this.#F.getAttribute("aria-required")}set required(e){t.set(this.#F,"aria-required",e?"true":null),this.reflect(()=>{t.toggle(this,"required",e)})}focus(e){this.#F.focus(e)}setCustomValidity(e){if(!e)return this.internals.setValidity({}),void(this.#$.innerText="");this.internals.setValidity({customError:!0}," "),this.#$.innerText=e}}class R extends e{static slots=!0;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 ';render({slots:e}){this.template().withOverlay({slots:e}).renderTo(this)}}class I extends e{static observed=["order"];#Z;render({observed:e}){const t=this.getAttribute("sorter"),s=["asc","desc",null];this.order=e.order,this.addEventListener("click",()=>{const e=s[(s.indexOf(this.order)+1)%3];this.dispatchEvent(new CustomEvent("sort-requested",{bubbles:!0,cancelable:!0,detail:{value:{sorter:t,order:e}}}))})}get order(){return this.#Z||null}set order(e){this.#Z=e||null,this.reflect(()=>{this.#Z?this.setAttribute("order",e):this.removeAttribute("order")})}}class D extends e{static observed=["total:number","current:number"];static l10n={en:{showing:"Page {0} of {1}",navigation:"Page navigation",previous:"Previous",next:"Next"},it:{showing:"Pagina {0} di {1}",navigation:"Navigazione pagine",previous:"Precedente",next:"Successivo"},es:{showing:"Página {0} de {1}",navigation:"Navegación de páginas",previous:"Anterior",next:"Siguiente"},fr:{showing:"Page {0} sur {1}",navigation:"Navigation des pages",previous:"Précédent",next:"Suivant"}};static config={prevIcon:"bi bi-chevron-left",nextIcon:"bi bi-chevron-right",reloadIcon:"bi bi-arrow-clockwise"};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 ';#ee=0;#te=0;render({observed:e}){this.total=e.total??0,this.current=e.current??0,this.addEventListener("click",e=>{const t=e.target.closest("a");t&&!t.classList.contains("disabled")&&this.dispatchEvent(new CustomEvent("page-requested",{bubbles:!0,cancelable:!0,detail:{value:Number(t.dataset.page??this.#te)}}))})}update(e,t){const s=Number(this.getAttribute("pages")??"5"),i=e>0,r=e+1<t,a={index:i?e-1:null,enabled:i},n={index:e,label:e+1},l={index:r?e+1:null,enabled:r},o=Math.max(1,Math.min(s,t)),d=Math.max(0,Math.min(e-Math.floor((o-1)/2),t-o)),u=Array.from({length:o},(e,t)=>({index:d+t,label:d+t+1}));this.template().withOverlay({total:t,prev:a,curr:n,next:l,pages:u}).renderTo(this)}get total(){return this.#ee}set total(e){this.#ee=e,this.reflect(()=>{this.setAttribute("total",String(e)),this.update(this.#te??0,this.#ee)})}get current(){return this.#te}set current(e){this.#te=e,this.reflect(()=>{this.setAttribute("current",String(e)),this.update(this.#te,this.#ee??0)})}}class B{static parse(e,t){const s=e?a.queryChildren(e,"schema"):null;if(!s)throw new Error('missing expected <schema>: ful-table needs a <template slot="schema"> holding one');const r=document.createElement("tr"),n=document.createElement("tr");n.setAttribute("data-tpl-each","rows");for(const e of s.getAttributeNames()){const t=s.getAttribute(e);r.setAttribute(e,t??""),n.setAttribute(e,t??"")}const l=a.queryChildrenAll(s,"column"),o=l.filter(e=>e.hasAttribute("order")).map(e=>({sorter:e.getAttribute("sorter"),order:e.getAttribute("order")}))[0]??null;for(var d of l){const e=a.queryChildren(d,"title"),t=d.getAttribute("sorter"),s=d.getAttribute("order"),i=e??document.createTextNode(d.getAttribute("title")??"");e?.remove(),d.removeAttribute("sorter"),d.removeAttribute("order"),d.removeAttribute("title");const l=t||s?(()=>{const e=document.createElement("ful-sorter");return t&&e.setAttribute("sorter",t),s&&e.setAttribute("order",s),e.append(i),e})():i,o=document.createElement("th"),u=document.createElement("td");for(const e of d.getAttributeNames()){const t=d.getAttribute(e);o.setAttribute(e,t??""),u.setAttribute(e,t??"")}o.append(l),u.append(...d.childNodes),r.append(o),n.append(u)}return{headersTemplate:t.withOverlay({inHeaders:!0,inRows:!1}).withFragment(i.from(r)),rowsTemplate:t.withOverlay({inHeaders:!1,inRows:!0}).withFragment(i.from(n)),sort:o,length:l.length}}}class F{#T;constructor(e){this.#T=e}async load(e,t,s){const i=e.page*e.size,r=i+e.size;return{data:this.#T.slice(i,r),size:this.#T.length}}update(e){this.#T=e}}class P{#e;#t;#s;constructor(e,t,s){this.#e=e,this.#t=t,this.#s=s}async load(e,t,s){const i=Object.entries(s).filter(([e,t])=>t);return await this.#e.request(this.#s,this.#t).param("page",e.page).param("size",e.size).param("sort",t?`${t.sorter},${t.order}`:null).param("filters",i.length>0?JSON.stringify(Object.fromEntries(i)):null).fetchJson()}}class ${static create(e,t){const i=e.getAttribute("src");if(i){const t=s.component("http-client"),r=e.getAttribute("method")??"GET";return new P(t,i,r)}return new F([])}}class H extends e{static slots=!0;static l10n={en:{initial:"Start searching to see results.",error:"Error while loading data:",nodata:"No elements found."},it:{initial:"Avvia la ricerca per visualizzare i risultati.",error:"Errore nel caricamento dei dati:",nodata:"Nessun elemento trovato."},es:{initial:"Inicia la búsqueda para ver los resultados.",error:"Error al cargar los datos:",nodata:"No se encontraron elementos."},fr:{initial:"Lancez la recherche pour voir les résultats.",error:"Erreur lors du chargement des données :",nodata:"Aucun élément trouvé."}};static config={searchIcon:"bi bi-search"};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 ';static templates={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 '};#I;#se;#ie;#re;#ae;#ne;#le;#oe;#de;async render({slots:e,observed:i}){const r=this.template(),l=B.parse(e.schema,r),o=r.withOverlay({slots:e,schema:l}).render(),d=a.queryChildren(o,".table-wrapper").querySelector("table");t.forward("table-",this,d),this.#I=s.component(this.getAttribute("loader")??"loaders:table").create(this),this.#se=l,this.#ie=d.querySelector(":scope > tbody"),this.#re=d.querySelector(":scope > tbody[data-ref=loading]"),this.#ae=d.querySelector(":scope > tbody[data-ref=initial]"),this.#ne=d.querySelector(":scope > tbody[data-ref=feedback]"),this.#le=a.queryChildren(o,"ful-pagination"),this.replaceChildren(o);const u=this.querySelector("thead");l.headersTemplate.renderTo(u),this.#oe=u.querySelectorAll("ful-sorter"),await n.waitForChildren(this);const c=a.queryChildren(this,"ful-form");this.#de={pageRequest:{page:0,size:this.getAttribute("page-size")?Number(this.getAttribute("page-size")):10},sortRequest:l.sort,filterRequest:c?.values??{}},c?.addEventListener("submit:success",async e=>{await this.load({page:0,size:this.#de.pageRequest.size},this.#de.sortRequest,e.detail.request)}),this.addEventListener("page-requested",async e=>{await this.load({page:e.detail.value,size:this.#de.pageRequest.size},this.#de.sortRequest,this.#de.filterRequest)}),this.addEventListener("sort-requested",async e=>{const t=e.detail.value.order?e.detail.value:null;await this.load(this.#de.pageRequest,t,this.#de.filterRequest),this.#oe.forEach(e=>{e.order=null}),e.target.order=e.detail.value.order}),this.hasAttribute("autoload")&&this.reload()}async reload(){return await this.load(this.#de.pageRequest,this.#de.sortRequest,this.#de.filterRequest)}async load(e,t,s){this.#ie.replaceChildren(),this.#re.removeAttribute("hidden"),this.#ne.setAttribute("hidden",""),this.#ae.setAttribute("hidden","");try{const i=await this.#I.load(e,t,s);this.#de={pageRequest:e,sortRequest:t,filterRequest:s},this.#p(e,t,s,i)}catch(e){throw this.#re.setAttribute("hidden",""),this.#ne.removeAttribute("hidden"),e.problems?this.#ne.querySelector("[data-ref=feedback-error]").textContent=e.problems.map(e=>`${e.reason}`):this.#ne.querySelector("[data-ref=feedback-error]").textContent=e,e}}async withLoader(e){return await e(this.#I)}async resetWithFilter(e){return await this.load({page:0,size:this.#de.pageRequest.size},this.#de.sortRequest,e)}#p(e,t,s,i){this.#re.setAttribute("hidden",""),this.#ie.replaceChildren(this.template("row").withOverlay({schema:this.#se,pageRequest:e,filterRequest:s,pageResponse:i}).render()),this.#le.current=e.page,this.#le.total=Math.ceil(i.size/e.size)}}class j extends E{static observed=["value:json","readonly:presence","required:presence","placeholder"];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 ';#ue;#ce;#he;render(e){super.render({...e,skipObservedSetup:!0}),this.#ue=this.querySelector("[data-ref=operator]"),this.#ce=this.querySelector("[data-ref=value1]"),this.#he=this.querySelector("[data-ref=value2]"),this.#he.addEventListener("change",e=>{e.stopPropagation(),this.#pe()}),this.disabled=e.disabled,this.readonly=e.observed.readonly,this.required=e.observed.required,this.placeholder=e.observed.placeholder,this.value=e.observed.value,this.addEventListener("click",e=>{const s=e.target;if(!s.matches("ul > li > a"))return;const i=s.closest("ul")?.previousElementSibling,r=s.getAttribute("value"),a=i.getAttribute("value");t.toggle(this.#he,"hidden","BETWEEN"!==r),i.setAttribute("value",r),i.innerHTML=s.innerHTML,a!==r&&this.#pe()})}get value(){const e=this.#ue.getAttribute("value"),t="BETWEEN"===e?[this.#ce.value,this.#he.value]:[this.#ce.value];return t.some(e=>""===e)?void 0:[e,...t.map(e=>new Date(e).toISOString())]}set value(e){if(null==e)return this.#ce.value="",void(this.#he.value="");const[t,...s]=e;this.#fe(t),this.#ce.value=s[0]?x.isoToLocal(s[0]):s[0],this.#he.value=s[1]?x.isoToLocal(s[1]):s[1]}#fe(e){this.#ue.setAttribute("value",e);const s=Array.from(this.#ue.nextElementSibling?.querySelectorAll("li > a[value]")??[]).find(t=>t.getAttribute("value")===e);s&&(this.#ue.innerHTML=s.innerHTML),t.toggle(this.#he,"hidden","BETWEEN"!==e)}#pe(){this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value}}))}get readonly(){return super.readonly}set readonly(e){this.#he.readOnly=e,super.readonly=e}get disabled(){return super.disabled}set disabled(e){super.disabled=e,t.toggle(this.#he,"disabled",e)}}class V extends E{static observed=["value:json","readonly:presence","required:presence","placeholder"];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 ';#ue;#ce;#he;render(e){super.render({...e,skipObservedSetup:!0}),this.#ue=this.querySelector("[data-ref=operator]"),this.#ce=this.querySelector("[data-ref=value1]"),this.#he=this.querySelector("[data-ref=value2]"),this.#he.addEventListener("change",e=>{e.stopPropagation(),this.#pe()}),this.disabled=e.disabled,this.readonly=e.observed.readonly,this.required=e.observed.required,this.placeholder=e.observed.placeholder,this.value=e.observed.value,this.addEventListener("click",e=>{const s=e.target;if(!s.matches("ul > li > a"))return;const i=s.closest("ul")?.previousElementSibling,r=s.getAttribute("value"),a=i.getAttribute("value");t.toggle(this.#he,"hidden","BETWEEN"!==r),i.setAttribute("value",r),i.innerHTML=s.innerHTML,a!==r&&this.#pe()})}get value(){const e=this.#ue.getAttribute("value"),t="BETWEEN"===e?[this.#ce.value,this.#he.value]:[this.#ce.value];return t.some(e=>""===e)?void 0:[e,...t]}set value(e){if(null==e)return this.#ce.value="",void(this.#he.value="");const[t,...s]=e;this.#fe(t),this.#ce.value=s[0],this.#he.value=s[1]}#fe(e){this.#ue.setAttribute("value",e);const s=Array.from(this.#ue.nextElementSibling?.querySelectorAll("li > a[value]")??[]).find(t=>t.getAttribute("value")===e);s&&(this.#ue.innerHTML=s.innerHTML),t.toggle(this.#he,"hidden","BETWEEN"!==e)}#pe(){this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value}}))}get readonly(){return super.readonly}set readonly(e){this.#he.readOnly=e,super.readonly=e}get disabled(){return super.disabled}set disabled(e){super.disabled=e,t.toggle(this.#he,"disabled",e)}}class U extends E{static observed=["value:json","readonly:presence","required:presence","placeholder"];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 ';#ue;#me;#be="IGNORE_CASE";render(e){super.render({...e,skipObservedSetup:!0}),this.#ue=this.querySelector("[data-ref=operator]"),this.#me=this.querySelector("[data-ref=value]"),this.disabled=e.disabled,this.readonly=e.observed.readonly,this.required=e.observed.required,this.placeholder=e.observed.placeholder,this.value=e.observed.value,this.addEventListener("click",e=>{const t=e.target;if(!t.matches("ul > li > a"))return;const s=t.closest("ul")?.previousElementSibling,i=t.getAttribute("value"),r=s.getAttribute("value");s.setAttribute("value",i),s.innerHTML=t.innerHTML,r!==i&&this.#pe()})}get value(){const e=this.#ue.getAttribute("value");return""===this.#me.value?void 0:[e,this.#be,this.#me.value]}set value(e){if(null==e)return void(this.#me.value="");const[t,s,i]=e;this.#fe(t),this.#be=s??"IGNORE_CASE",this.#me.value=i}#fe(e){this.#ue.setAttribute("value",e);const t=Array.from(this.#ue.nextElementSibling?.querySelectorAll("li > a[value]")??[]).find(t=>t.getAttribute("value")===e);t&&(this.#ue.innerHTML=t.innerHTML)}#pe(){this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value}}))}}class G{static t(e,...t){const s=this.l10n?.[this.language]?.[e]??this.l10n?.en?.[e]??e;return 0===t.length?s:s.replace(/{(\d+)}/g,(e,s)=>t[Number(s)])}static tl(e,t=[]){return G.t.apply(this,[e,...t])}}class W{configure(e){const t=o.builder().withCsrfToken().withRedirectOnUnauthorized("/").build();e.defineModule("l10n",G).defineComponent("http-client",t).defineElement("ful-spinner",R).defineElement("ful-form",y).defineElement("ful-checkbox",N).defineElement("ful-input",E).defineElement("ful-input-file",T).defineElement("ful-local-date",w).defineElement("ful-instant",x).defineElement("ful-input-local-date",A).defineElement("ful-input-local-time",q).defineElement("ful-input-instant",S).defineElement("ful-radio-group",M).defineElement("ful-table",H).defineElement("ful-pagination",D).defineElement("ful-sorter",I).defineElement("ful-filter-instant",j).defineElement("ful-filter-local-date",V).defineElement("ful-filter-text",U).defineElement("ful-select",_).defineElement("ful-dropdown",k).defineComponent("loaders:select",C).defineComponent("loaders:form",g).defineComponent("loaders:table",$).defineOverlay({language:navigator?.language?.split("-")?.[0]??"en"})}}export{p as AsyncEvents,m as Bindings,N as Checkbox,k as Dropdown,y as Form,g as FormLoader,E as Input,T as InputFile,S as InputInstant,A as InputLocalDate,q as InputLocalTime,x as Instant,j as InstantFilter,w as LocalDate,V as LocalDateFilter,d as LocalStorage,G as LocalizationModule,D as Pagination,W as Plugin,M as RadioGroup,_ as Select,C as SelectLoader,u as SessionStorage,I as SortButton,R as Spinner,H as Table,B as TableSchemaParser,U as TextFilter,f as Timing,c as VersionedLocalStorage,h as VersionedSessionStorage};
1
+ import{ParsedElement as e,Attributes as t,Localization as s,BoundedCache as i,Fragments as r,Templates as n,Nodes as a,Rendering as l}from"./ftl.min.mjs";import{Failure as o,HttpClient as u}from"./httpc.min.mjs";const d=e=>{const t=t=>{try{e().removeItem(t)}catch{}},s=s=>{let i;try{i=e().getItem(s)}catch{return}if(null!==i)try{return JSON.parse(i)}catch{return void t(s)}};return{save:(t,s)=>{e().setItem(t,JSON.stringify(s))},load:s,remove:t,pop:e=>{const i=s(e);return t(e),i}}},c=e=>({save(t,s,i){e.save(t,{revision:s,data:i})},load(t,s){const i=e.load(t);if(null!=i&&"object"==typeof i&&i.revision===s)return i.data;e.remove(t)}}),h=d(()=>localStorage),p=d(()=>sessionStorage),f=c(h),m=c(p);class g{static async fireAsync(e,t,s){e.dispatchEvent(t);const i=t.async?.promises??[],r=s?.mode??"broadcast";if("pipeline"===r&&i.length>1||"delegate"===r&&1!==i.length)throw Promise.all(i).catch(()=>{}),new Error("pipeline"===r?`[AsyncEvents] Event "${t.type}" is configured in 'pipeline' mode and expects at most one async listener, but ${i.length} listeners were triggered on this element.`:`[AsyncEvents] Event "${t.type}" is configured in 'delegate' mode and requires exactly one async listener, but ${i.length} were registered.`);return"broadcast"===r?Promise.all(i):Promise.resolve(i[0])}static asyncOn(e,t,s,i){const r=async e=>{const t=e;t.async||(t.async={promises:[]});const{promise:i,resolve:r,reject:n}=Promise.withResolvers();t.async.promises.push(i);try{r(await s(t))}catch(e){n(e)}};return e.addEventListener(t,r,i),r}static asyncOff(e,t,s,i){e.removeEventListener(t,s,i)}static mixInto(...e){for(const t of e)Object.assign(t.prototype,{async fireAsync(e,t){return await g.fireAsync(this,e,t)},asyncOn(e,t,s){return g.asyncOn(this,e,t,s)},asyncOff(e,t,s){g.asyncOff(this,e,t,s)}})}}class b{#e=0;take(){return++this.#e,this.hold()}hold(){const e=this.#e,t=this;return{get stale(){return e!==t.#e}}}invalidate(){++this.#e}}const v=e=>{for(let t=e.parentElement;t;t=t.parentElement)if("function"==typeof t.describedBy)return t;return null};class y{static sleep(e){return new Promise(t=>setTimeout(t,e))}static debounce(e,t,s){const i=s?.immediate??!1;let r=null,n=[],a=0;const l=()=>{const s=performance.now()-a;e>s?r=setTimeout(l,e-s):(r=null,i||t(...n),null===r&&(n=[]))};return[(...s)=>{n=s,a=performance.now(),null===r&&(r=setTimeout(l,e),i&&t(...n))},()=>{clearTimeout(r??void 0),r=null,n=[]}]}static throttle(e,t,s){const i=s?.leading??!0,r=s?.trailing??!0;let n=null,a=[],l=0;const o=()=>{l=i?performance.now():0,n=null,t(...a),null===n&&(a=[])};return[(...s)=>{const u=performance.now();l||i||(l=u);const d=0===l?0:e-(u-l);a=s,d<=0||d>e?(null!==n&&(clearTimeout(n),n=null),l=u,t(...a),null===n&&(a=[])):null===n&&r&&(n=setTimeout(o,d))},()=>{clearTimeout(n??void 0),n=null,a=[]}]}}class w{static flatten(e,t,s){return Object.keys(e).reduce((i,r)=>{const n=t.length?`${t}.${r}`:r;return s.has(n)||"object"!=typeof e[r]||null===e[r]?i[n]=e[r]:Object.assign(i,w.flatten(e[r],n,s)),i},{})}static#t=new Set(["__proto__","prototype","constructor"]);static providePath(e,t,s){const i=t.split(".").map(e=>/^[0-9]+$/.test(e)?+e:e);for(const e of i)if(w.#t.has(e))throw new Error(`unsupported name segment '${e}' in '${t}'`);let r=e??{},n=null;for(let t=0;;++t){const a=i[t],l=i[t-1];if(Number.isInteger(a)&&!Array.isArray(r)&&(null!==n?n[l]=r=[]:e=r=[]),t===i.length-1)return r[a]=void 0!==s?s:a in r?r[a]:null,e;"object"==typeof r[a]&&null!==r[a]||(r[a]={}),n=r,r=r[a]}}static extract(e){if("radio"===e.getAttribute("type")){if(!e.checked)return;return"boolean"===e.dataset.fulBindType?"true"===e.value:e.value}return"checkbox"===e.getAttribute("type")?e.checked:"boolean"===e.dataset.fulBindType?e.value?"true"===e.value:null:"SELECT"===e.tagName&&e.multiple?Array.from(e.selectedOptions).map(e=>e.value):"INPUT"!==e.tagName&&"SELECT"!==e.tagName&&"TEXTAREA"!==e.tagName||""!==e.value&&void 0!==e.value?e.value:null}static#s(e){return"submit"===e.type||"reset"===e.type||"button"===e.type}static extractFrom(e,t){let s={};for(const i of e.elements)i.hasAttribute("name")&&(w.#s(i)&&i!==t||i.matches(":disabled")&&i!==t||(s=w.providePath(s,i.getAttribute("name"),w.extract(i))));return s}static mutate(e,t){if("radio"!==e.getAttribute("type"))if("checkbox"!==e.getAttribute("type")){if("SELECT"===e.tagName&&e.multiple){const s=Array.isArray(t)?t.map(String):null==t?[]:[String(t)];return void Array.from(e.options).forEach(e=>{e.selected=s.includes(e.value)})}e.value=t}else e.checked=t;else e.checked=null!=t&&e.getAttribute("value")===String(t)}static mutateIn(e,t){const s=Array.from(e.elements).map(e=>e.getAttribute("name")).filter(e=>e);for(const[i,r]of Object.entries(w.flatten(t,"",new Set(s))))for(const t of e.querySelectorAll(`[name='${CSS.escape(i)}']`))w.mutate(t,r)}static errors(e,t,s){e.querySelectorAll("ful-field-error").forEach(e=>{e.setAttribute("aria-live",s?"off":"polite")});const i=e=>("FIELD_ERROR"===e.type||"INVALID_FORMAT"===e.type)&&e.context,r=t.filter(i),n=t.filter(e=>!i(e));e.querySelectorAll("[name]").forEach(e=>{e.setCustomValidity?.("")}),e.querySelectorAll("ful-errors").forEach(e=>{e.setAttribute("role","alert"),e.replaceChildren(),e.setAttribute("hidden","")});const a=[];r.forEach(t=>{const s=t.context.replace(/\[/g,".").replace(/\]\./g,".").replace(/\]/g,"").split(".");for(let i=s.length;0!==i;--i){const r=s.slice(0,i).join("."),n=e.querySelectorAll(`[name='${CSS.escape(r)}']`);if(0===n.length)continue;const a=s.slice(i).join(".");return void n.forEach(e=>{e.setCustomValidity?.(t.reason,a)})}a.push(t)});const l=[...n,...a];e.querySelectorAll("ful-errors").forEach(e=>{const t=e;0!==l.length?(e.removeAttribute("hidden"),t.innerText=l.map(e=>e.reason).join("\n")):t.innerText=""}),0!==t.length&&s&&Array.from(e.querySelectorAll(":invalid")).sort((e,t)=>e.getBoundingClientRect().y-t.getBoundingClientRect().y)[0]?.focus()}}class E extends e{static formAssociated=!0;static observed=["disabled:presence","readonly:presence","required:presence","value"];static ROLE="presentation";#i;#r;#n=[];#a=null;#l;#o;#u;#d=[];constructor(){super(),this.internals.role=this.constructor.ROLE}#c(){return[this.#o??this.#i,...this.#d].filter(e=>e)}#h({fragment:e,control:s,error:i,label:r=null,described:n=null,claims:a=null,announces:l=s,freeze:o=null,also:u=[]}){this.#i=s,this.#l=i,this.#o=a,this.#u=l,this.#d=u,o&&o.addEventListener("click",e=>{this.readonly&&e.preventDefault()},!0),this.#r=n??s,i&&(i.id=i.id||t.uid("ful-field-error"),this.#a=i.id),this.#p(),r&&E.#f(this,r,s),this.addEventListener("keydown",e=>{if("Enter"!==e.key||e.defaultPrevented||e.isComposing)return;const t=e.target;t.form!==this.internals.form&&E.#m(t)&&this._requestSubmit()}),this.replaceChildren(e)}static#m(e){return e instanceof HTMLInputElement&&!["file","button","submit","reset","image"].includes(e.type)}describedBy(e){return!!e&&(e.id||(e.id=t.uid("ful-described")),this.#n.includes(e.id)||this.#n.push(e.id),this.#p(),!0)}#p(){if(!this.#r)return;const e=[...this.#n,this.#a].filter(e=>e);e.length&&this.#r.setAttribute("aria-describedby",e.join(" "))}focus(e){this.#i?.focus(e)}setCustomValidity(e,s){if(t.set(this.#u??this.#i,"aria-invalid",e?"true":null),!e)return this.internals.setValidity({}),void(this.#l.innerText="");this.internals.setValidity({customError:!0}," "),this.#l.innerText=e}_requestSubmit(){const e=this.internals.form;if(!e)return;const t=e.querySelectorAll("button:not(:disabled), input:not(:disabled)");e.requestSubmit([...t].find(t=>"submit"===t.type&&t.form===e))}_notifyChange(e={}){this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{value:this.value,...e}}))}static#g=new Set(["BUTTON","INPUT","METER","OUTPUT","PROGRESS","SELECT","TEXTAREA"]);static#f(e,s,i){if(!E.#g.has(i.tagName)||"hidden"===i.getAttribute("type"))return s.id||(s.id=t.uid("ful-label")),i.setAttribute("aria-labelledby",s.id),void s.addEventListener("click",()=>e.focus());i.id||(i.id=t.uid("ful-control")),s.setAttribute("for",i.id)}_interactive(){return!this.matches(":disabled")&&!this.readonly}get value(){}set value(e){}formResetCallback(){this.value=this.unmarshal("value",this.getAttribute("value"))}get disabled(){return this.hasAttribute("disabled")}set disabled(e){this.reflectTo("disabled",e);for(const t of this.#c())t.toggleAttribute("disabled",e)}get readonly(){return this.hasAttribute("readonly")}set readonly(e){for(const t of this.#c())t.readOnly=e;this.#u&&t.set(this.#u,"aria-readonly",e?"true":null),this.reflectTo("readonly",e)}get required(){return this.hasAttribute("required")}set required(e){this.#u&&t.set(this.#u,"aria-required",e?"true":null),this.reflectTo("required",e)}render(e){const t=this._build(e);if(t instanceof Promise)return t.then(e=>this.#b(e));this.#b(t)}#b(e){this.#h(e)}_build(e){throw new Error(`${this.constructor.name} must implement _build`)}}class x{#v;#y;#w;#E;#x;constructor(e,t,s,i,r){this.#v=e,this.#y=t,this.#w=s,this.#E=i,this.#x=r}prepare(e,t){return this.#E(e,t)}async submit(e,t){return await this.#v.request(this.#w,this.#y).json(e).fetch()}transform(e,t){return this.#x(e,t)}}class A{#E;#x;constructor(e,t){this.#E=e,this.#x=t}async prepare(e,t){return await this.#E(e,t)}async submit(e,t,s){return s}async transform(e,t){return await this.#x(e,t)}}class S{static create(e,t){const s=e.component("http-client"),i=e.declared("request-mapper")?e.component(e.declared("request-mapper")):e=>e,r=e.declared("response-mapper")?e.component(e.declared("response-mapper")):e=>e,n=e.declared("action");if(!n)return new A(i,r);const a=e.declared("method")??"POST";return new x(s,n,a,i,r)}}class _ extends e{static attributes=["action","method","loader","request-mapper","response-mapper","clear-invalid-on-change:presence","scroll-on-error:presence","autocomplete"];form;render(){const e=document.createElement("form");this.form=e,e.setAttribute("novalidate",""),t.forward("form-",this,e),t.set(e,"autocomplete",this.declared("autocomplete")),e.replaceChildren(...this.childNodes),e.addEventListener("submit",async e=>{e.preventDefault(),e.stopPropagation(),await this.submit(e.submitter??void 0)}),this.addEventListener("click",e=>{const t=e.target;t.closest?.('[aria-disabled="true"]')&&(e.preventDefault(),e.stopImmediatePropagation())},!0),this.declared("clear-invalid-on-change")&&this.addEventListener("change",e=>{e.target.setCustomValidity?.("")}),this.replaceChildren(e)}#A=!1;async submit(e){if(this.#A)return;let t,s;this.#A=!0,this.spinner(!0);try{const i=this.component(this.declared("loader")??"loaders:form").create(this);t=w.extractFrom(this.form,e),s=await i.prepare(t,this);const r=new CustomEvent("submit",{bubbles:!0,cancelable:!0,detail:{submitter:e,values:t,request:s}});if(!this.dispatchEvent(r))return;this.errors=[];const n=new CustomEvent("submit:requested",{bubbles:!0,cancelable:!1,detail:{submitter:e,values:r.detail.values,request:r.detail.request}});let a=await g.fireAsync(this,n,{mode:"pipeline"});s=n.detail.request,a=await i.submit(s,this,a);const l=await i.transform(a,this);this.dispatchEvent(new CustomEvent("submit:success",{bubbles:!0,cancelable:!1,detail:{submitter:e,values:t,request:s,response:l}}))}catch(i){this.dispatchEvent(new CustomEvent("submit:failure",{bubbles:!0,cancelable:!1,detail:{submitter:e,values:t,request:s,exception:i}})),i instanceof o&&(this.errors=i.problems),console.warn("failed to submit form",this,"reason:",i)}finally{this.#A=!1,this.spinner(!1)}}reset(){this.form.reset()}#S=0;#_(e){if(t.defaultValue(e,"role","status"),e.hidden=!1,""!==e.textContent.trim())return;const i=document.createElement("span");i.className="ful-sr-only",i.dataset.ref="spinner-label",e.append(i),i.textContent=s.of().t("spinner.loading")}spinner(e){if(e){if(++this.#S,1!==this.#S)return}else if(this.#S=Math.max(0,this.#S-1),0!==this.#S)return;t.set(this,"aria-busy",e?"true":null),this.querySelectorAll("ful-spinner").forEach(t=>{const s=t;e?this.#_(s):(s.hidden=!0,s.querySelector(":scope > [data-ref=spinner-label]")?.remove())}),this.querySelectorAll("input,button").forEach(s=>{const i=s;if("submit"===i.type||"reset"===i.type)if(e)i.dataset.wd=i.getAttribute("aria-disabled")??"",i.setAttribute("aria-disabled","true");else{if(void 0===i.dataset.wd)return;t.set(i,"aria-disabled",i.dataset.wd||null),delete i.dataset.wd}})}set values(e){w.mutateIn(this.form,e)}get values(){return w.extractFrom(this.form)}set errors(e){w.errors(this.form,e,this.declared("scroll-on-error"))}}const q=new i(100),T=(e,t)=>q.getOrCompute(`${e}:${t}`,()=>{try{return new RegExp(t,"g")}catch(s){return console.warn(`invalid ${e} attribute`,t,s),null}}),C=new WeakSet;class k extends E{static observed=["placeholder"];static attributes=["type","v-type","keep","reject","uppercase:presence","trim:presence","autocomplete"];static slots=!0;static template='\n <label>{{{{ slots.default }}}}</label>\n {{{{ slots.info }}}}\n <ful-control-group>\n <ful-affix data-tpl-if="slots.before">{{{{ slots.before }}}}</ful-affix>\n <input data-tpl-if="type != \'textarea\'" data-tpl-type="type" placeholder=" " form="">\n <textarea data-tpl-if="type == \'textarea\'" placeholder=" " form=""></textarea>\n <ful-affix data-tpl-if="slots.after">{{{{ slots.after }}}}</ful-affix>\n </ful-control-group>\n <ful-field-error></ful-field-error>\n ';_input;_type(){return this.declared("type")??("number"===this.declared("v-type")?"number":"text")}_build({slots:e}){const s=this._type(),i=this.template().withOverlay({type:s,slots:e}).render();return this._input=i.querySelector("input,textarea"),t.set(this._input,"autocomplete",this.declared("autocomplete")??(this.closest("form")?.getAttribute("autocomplete")??null)),t.forward("input-",this,this._input),this._input.addEventListener("input",e=>{const t=(e=>{const t=e.declared("keep"),s=e.declared("reject");if(null===t||null===s||C.has(e)||(C.add(e),console.warn("a ful-input declares both keep and reject: keep is applied, reject is ignored",e)),null!==t){const e=T("keep",t);return e&&(t=>(t.match(e)??[]).join(""))}if(null!==s){const e=T("reject",s);return e&&(t=>t.replace(e,""))}return null})(this);if(!t)return;const s=e.target.value,i=t(s);if(s===i)return;const r=e.target.selectionStart;if(e.target.value=i,null===r)return;const n=t(s.slice(0,r)).length;e.target.setSelectionRange(n,n)}),this._input.addEventListener("change",e=>{e.stopPropagation(),this._notifyChange()}),{fragment:i,control:this._input,error:i.querySelector("ful-field-error"),label:i.querySelector("label")}}get value(){const e=this.declared("uppercase"),t=this.declared("trim"),s=this._input.value,i=e?s.toUpperCase():s,r=t?i.trim():i;if(""===r)return null;if("number"===this.declared("v-type")){const e=Number(r);return Number.isNaN(e)?r:e}return r}set value(e){this._input.value=""===e||void 0===e?null:e}get placeholder(){const e=this._input.getAttribute("placeholder");return" "===e?null:e}set placeholder(e){t.set(this._input,"placeholder",e??" "),this.reflectTo("placeholder",e)}}class z extends e{static attributes=["locale","default"];render(){const e=this.textContent.trim(),[t,i,r]=e.split("-").map(Number),n=""===e?null:new Date(t,i-1,r);if(null===n||Number.isNaN(n.getTime()))return void this.replaceChildren(this.declared("default")??"");const{date:a}=s.of({locale:this.declared("locale")??void 0});this.replaceChildren(a(n,{year:"numeric",month:"numeric",day:"numeric"}))}}class O extends e{static attributes=["locale","default"];render(){const e=this.textContent.trim(),t=""===e?null:new Date(O.isoToLocal(e));if(null===t||Number.isNaN(t.getTime()))return void this.replaceChildren(this.declared("default")??"");const{date:i}=s.of({locale:this.declared("locale")??void 0});this.replaceChildren(i(t,{year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric",hour12:!1}))}static#q(e){return/^\d{4}-\d{2}-\d{2}$/.test(e)?new Date(`${e}T00:00:00`):new Date(e)}static isoToLocal(e){const t=O.#q(e),s=(e,t)=>String(t).padStart(e,"0");return`${t.getFullYear()}-${s(2,t.getMonth()+1)}-${s(2,t.getDate())}T${s(2,t.getHours())}:${s(2,t.getMinutes())}:${s(2,t.getSeconds())}.${s(3,t.getMilliseconds())}`}static localToIso(e){const t=O.#q(e);return Number.isNaN(t.getTime())?null:t.toISOString()}}class R extends k{static observed=["step","min","max"];_type(){return"date"}get min(){const e=this._input.min;return""===e?null:e}set min(e){this._input.min=R.#T(e)}get max(){const e=this._input.max;return""===e?null:e}set max(e){this._input.max=R.#T(e)}get step(){const e=this._input.step;return""===e?null:e}set step(e){this._input.step=e??""}static#T(e){if(!e)return"";const t=e=>new Date(e.getTime()-6e4*e.getTimezoneOffset()).toISOString().split("T")[0];if("now"===e)return t(new Date);const s=/^([+-])(\d+)([dmy])$/.exec(e);if(!s)return e;const i="-"===s[1]?-1:1,r=+s[2],n=new Date;switch(n.setHours(0,0,0,0),s[3]){case"d":n.setDate(n.getDate()+r*i);break;case"m":{const e=n.getDate();n.setMonth(n.getMonth()+r*i),n.getDate()!==e&&n.setDate(0);break}case"y":n.setFullYear(n.getFullYear()+r*i)}return t(n)}}class L extends R{_type(){return"time"}get min(){const e=this._input.min;return""===e?null:e}set min(e){this._input.min=this.#C(e)}get max(){const e=this._input.max;return""===e?null:e}set max(e){this._input.max=this.#C(e)}#C(e){if(!e)return"";const t=new Date;if("now"!==e){const s=/^([+-])(\d+)([hm])$/.exec(e);if(!s)return e;const i="-"===s[1]?-1:1,r=+s[2]*i;"h"===s[3]?t.setHours(t.getHours()+r):t.setMinutes(t.getMinutes()+r)}return L.#k(t,Number(this._input.step)||60)}static#k(e,t){const s=e=>String(e).padStart(2,"0"),i=3600*e.getHours()+60*e.getMinutes()+e.getSeconds(),r=Math.floor(i/t)*t,n=s(Math.floor(r/3600)),a=s(Math.floor(r%3600/60));return t%60==0?`${n}:${a}`:`${n}:${a}:${s(r%60)}`}}class N extends k{static observed=["step","min","max"];_type(){return"datetime-local"}get value(){return O.localToIso(this._input.value)}set value(e){this._input.value=e?O.isoToLocal(e):""}get min(){return O.localToIso(this._input.min)}set min(e){this._input.min=e?O.isoToLocal(e):""}get max(){return O.localToIso(this._input.max)}set max(e){this._input.max=e?O.isoToLocal(e):""}get step(){const e=this._input.step;return""===e?null:e}set step(e){this._input.step=e??""}}class I extends k{static WARNING_TIMEOUT=5e3;static list(e=[]){const t=new DataTransfer;for(const s of e)t.items.add(s);return t.files}static observed=["placeholder","accept:csv","multiple:presence","item-list:presence","dropzone:presence","max-files:number","max-file-size:number","max-total-size:number","value"];#z;#O;#R;#L;#N;_type(){return"file"}static template='\n <label>{{{{ slots.default }}}}</label>\n {{{{ slots.info }}}}\n <ful-control-group>\n <ful-affix data-tpl-if="slots.before">{{{{ slots.before }}}}</ful-affix>\n <input data-tpl-type="type" placeholder=" " form="">\n <ful-affix data-tpl-if="slots.after">{{{{ slots.after }}}}</ful-affix>\n </ful-control-group>\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(\'files.dropzone-label\') }}\n </div>\n <ful-item-list></ful-item-list>\n <ful-field-warnings role="status" aria-live="polite"></ful-field-warnings>\n <ful-field-error></ful-field-error>\n ';static templates={items:'\n <ful-item data-tpl-each="files" data-tpl-var="file" data-tpl-data-name="file.name">\n <div><span>{{ file.name }}</span><span>{{ #l10n:bytes(file.size) }}</span><button type="button" data-tpl-aria-label="#l10n:t(\'files.remove\')"><ful-icon name="x-lg" aria-hidden="true"></ful-icon></button></div>\n </ful-item>\n ',warning:"<ful-field-warning>{{ #l10n:t(key, args) }}</ful-field-warning>"};#I;_build(e){const t=super._build(e),s=t.fragment;return this.#O=s.querySelector("ful-item-list"),this.#I=e.slots?.items&&!r.isBlank(e.slots.items)?n.fromFragment(e.slots.items):null,this.#R=s.querySelector("[data-ref=dropzone]"),this.#L=s.querySelector("ful-field-warnings"),this.#N=s.querySelector("ful-control-group"),this.#L.addEventListener("animationend",e=>{e.target.remove()}),this.#O.addEventListener("click",e=>{if(!e.target.closest("button"))return;if(!this._interactive())return;const t=[...this.#O.children].indexOf(e.target.closest("ful-item"));-1!==t&&(this.files=I.list([...this.files].filter((e,s)=>s!==t)),this._notifyChange())}),this.#R.addEventListener("click",e=>{this._interactive()&&this.querySelector("input")?.click()}),this.#R.addEventListener("dragover",e=>{e.preventDefault(),this.toggleAttribute("dragover",!0)}),this.#R.addEventListener("dragleave",()=>{this.toggleAttribute("dragover",!1)}),this.#R.addEventListener("drop",e=>{if(e.preventDefault(),this.toggleAttribute("dragover",!1),!this._interactive())return;const t=[...e.dataTransfer.items].filter(e=>"file"===e.kind).map(e=>e.getAsFile()).filter(e=>null!==e);0===t.length||t.length>1&&!this.multiple||(this.files=I.list(t),this._notifyChange())}),this._input.addEventListener("change",e=>{this.#M()}),{...t,freeze:this.#N}}#M(){this.setCustomValidity(),this.#L.replaceChildren(),this.#F(),this.#D(),this.#P(),this.#B(),(this.#I??this.template("items")).withOverlay({files:this.files}).renderTo(this.#O)}warning(e,t){this.template("warning").withOverlay({key:e,args:t}).appendTo(this.#L);const s=this.#L.lastElementChild;setTimeout(()=>s.remove(),I.WARNING_TIMEOUT)}#$(e){const t=e.name.toLowerCase();return this.#z.some(s=>{const i=s.toLowerCase().split(";")[0].trim();return i.startsWith(".")?t.endsWith(i):i.endsWith("/*")?e.type.startsWith(`${i.slice(0,-1)}`):i.includes("/")&&e.type===i})}#F(){if(!this.#z.length)return;const e=[...this.files].filter(e=>!this.#$(e));0!==e.length&&(this.warning("files.unacceptable-file-type",{types:this.#z.join(", ")}),this._input.files=I.list([...this.files].filter(t=>!e.includes(t))))}#B(){null!==this.#W&&(this.files.length<=this.#W||(this.warning("files.max-files-exceeded",{count:this.#W}),this._input.files=I.list()))}#D(){if(null===this.#j)return;const e=[...this.files].filter(e=>e.size>this.#j);0!==e.length&&(this.warning("files.max-file-size-exceeded",{size:s.of().bytes(this.#j)}),this._input.files=I.list([...this.files].filter(t=>!e.includes(t))))}#P(){null!==this.#H&&([...this.files].reduce((e,t)=>e+t.size,0)<=this.#H||(this.warning("files.max-total-size-exceeded",{size:s.of().bytes(this.#H)}),this._input.files=I.list()))}get accept(){return this.#z}set accept(e){this._input.accept=e.join(","),this.#z=e,this.reflectTo("accept",e)}get multiple(){return this._input.multiple}set multiple(e){this._input.multiple=e,this.reflectTo("multiple",e)}get files(){return this._input.files}set files(e){this._input.files=e,this.#M()}get file(){return this.files[0]??null}set file(e){this.files=I.list(e?[e]:[])}get value(){const e=Array.from(this._input.files).map(e=>e.name);return this.multiple?e:e[0]??null}set value(e){e||(this.files=I.list())}formResetCallback(){this.value=null}get totalsize(){return Array.from(this.files).reduce((e,t)=>e+t.size,0)}#W;get maxFiles(){return this.#W}set maxFiles(e){this.#W=e,this.reflectTo("max-files",e)}#j;get maxFileSize(){return this.#j}set maxFileSize(e){this.#j=e,this.reflectTo("max-file-size",e)}#H;get maxTotalSize(){return this.#H}set maxTotalSize(e){this.#H=e,this.reflectTo("max-total-size",e)}#G;get itemList(){return this.#G}set itemList(e){this.#G=e,this.reflectTo("item-list",e)}#U;get dropzone(){return this.#U}set dropzone(e){this.#U=e,this.reflectTo("dropzone",e)}}const M=new Map;let F=0,D=!1;const P=(e,t,s)=>Math.min(Math.max(e,t),Math.max(t,s)),B=(e,t)=>{const{invoker:s,stretch:i}=t,r=s.getBoundingClientRect(),n=document.documentElement,a=n.clientWidth,l=n.clientHeight;e.style.removeProperty("margin");const o=getComputedStyle(e),u=parseFloat(o.marginTop)||0,d=parseFloat(o.marginRight)||0,c=parseFloat(o.marginBottom)||0,h=parseFloat(o.marginLeft)||0;if(e.style.right="auto",e.style.bottom="auto",e.style.margin="0",i){const t=Math.min(r.width,a-16);e.style.width=`${t}px`,e.style.left=`${P(r.left,8,a-t-8)}px`;const s=e.getBoundingClientRect().height;return void(e.style.top=`${P(r.bottom+u,8,l-s-8)}px`)}const p=(e=>e.matches("ful-note, .ful-note, [placement]"))(e),f=p?e.getAttribute("placement")??"bottom":"bottom";e.style.removeProperty("max-width");const m=Math.min(parseFloat(o.maxWidth)||a,a-16);e.style.maxWidth=`${m}px`,e.style.left="8px";const g=e.getBoundingClientRect().width;let b="right"===f?r.right+h:"left"===f?r.left-d-g:p?r.left+r.width/2-g/2:r.left;b=P(b,8,a-g-8),e.style.left=`${b}px`,e.style.maxWidth=`${Math.min(m,a-8-b)}px`;const v=e.getBoundingClientRect().height,y="top"===f?r.top-c-v:"right"===f||"left"===f?r.top+r.height/2-v/2:r.bottom+u;e.style.top=`${P(y,8,l-v-8)}px`,p&&((e,t)=>{const s=t.getBoundingClientRect(),i=e.getBoundingClientRect();e.style.setProperty("--ful-note-callout-inline",s.left+s.width/2-i.left-e.clientLeft+"px"),e.style.setProperty("--ful-note-callout-block",s.top+s.height/2-i.top-e.clientTop+"px")})(e,s)},$=()=>{F=0;for(const[e,t]of M)e.isConnected&&t.invoker.isConnected?B(e,t):M.delete(e)},W=()=>{!F&&M.size>0&&(F=requestAnimationFrame($))};class j{static wire(e,s,{prefix:i="ful-anchor",invoke:r=!1,expanded:n=!1,stretch:a=!1,handPlace:l=!1}={}){const o=t.uid(i);r&&(s.id=s.id||o,e.setAttribute("popovertarget",s.id));const u=`--${o}`;if(e.style.anchorName=u,s.style.positionAnchor=u,n&&(e.setAttribute("aria-expanded","false"),s.addEventListener("toggle",t=>{e.setAttribute("aria-expanded","open"===t.newState?"true":"false")})),!l&&CSS.supports("anchor-name: --ful-probe")&&CSS.supports("position-anchor: --ful-probe")&&CSS.supports("position-area: bottom")&&CSS.supports("top: anchor(bottom)")&&CSS.supports("width: anchor-size(width)"))return;const d={invoker:e,stretch:a};s.addEventListener("beforetoggle",e=>{"open"===e.newState&&B(s,d)}),s.addEventListener("toggle",e=>{"open"===e.newState?(M.set(s,d),B(s,d)):(M.delete(s),(e=>{for(const t of["top","left","right","bottom","margin","max-width","width","--ful-note-callout-inline","--ful-note-callout-block"])e.style.removeProperty(t)})(s))}),D||(D=!0,document.addEventListener("scroll",W,!0),window.addEventListener("resize",W))}}class H{#v;#y;#w;#x;#Q;#V;#K;#J;#Y=new b;constructor({http:e,url:t,method:s,responseMapper:i,prefetch:r,revision:n}){this.#v=e,this.#y=t,this.#w=s,this.#x=i,this.#Q=r,this.#V=n,this.#K=null,this.#J=null}async prefetch(){this.#Q&&await this.#X()}async exact(...e){return(await this.#X()).filter(({key:t})=>e.some(e=>e==t))}async load(e){return(await this.#X()).filter(({label:t})=>(t??"").toLowerCase().includes(e?.toLowerCase()??""))}async invalidate(){this.#Y.invalidate(),this.#K=null,this.#J=null}async reconfigureUrl(e){await this.invalidate(),this.#y=e}async#X(){if(null===this.#K){if(null===this.#J){const e=this.#Y.hold();this.#J=H.#Z(this.#v,this.#w,this.#y,this.#V).then(t=>{e.stale||(this.#K=this.#x(t))}).finally(()=>{e.stale||(this.#J=null)})}await this.#J}if(null===this.#K)throw new Error("superseded by a reconfiguration");return this.#K}static async#Z(e,t,s,i){const r=`${t}@${s}`;if(null!==i){const e=f.load(r,i);if(void 0!==e)return e}const n=await e.request(t,s).fetchJson();if(null!==i)try{f.save(r,i,n)}catch(e){console.warn("failed to cache the select options",e)}return n}}class G{#v;#y;#w;#x;constructor({http:e,url:t,method:s,responseMapper:i}){this.#v=e,this.#y=t,this.#w=s,this.#x=i}async invalidate(){}async reconfigureUrl(e){this.#y=e}async exact(...e){const t=await this.#v.request(this.#w,this.#y).param("k",...e).fetchJson();return this.#x(t)}async load(e){const t=await this.#v.request(this.#w,this.#y).param("s",e).fetchJson();return this.#x(t)}}class U{#K;constructor(e){this.#K=e}update(e){this.#K=e}async invalidate(){}exact(...e){return this.#K.filter(({key:t})=>e.some(e=>e==t))}load(e){return this.#K.filter(({label:t})=>(t??"").toLowerCase().includes(e?.toLowerCase()??""))}}class Q{static from({data:e,http:t,url:s,method:i="POST",mode:r,prefetch:n=!1,revision:a=null,responseMapper:l}){return s?"chunked"===r?new G({http:t,url:s,method:i,responseMapper:l}):new H({http:t,url:s,method:i,responseMapper:l,prefetch:n,revision:a}):new U(e??[])}static create(e,t){if(!e.declared("src")){const e=Array.from(t.options?.querySelectorAll("option")??[]);return Q.from({data:e.map(e=>({key:e.getAttribute("value")??e.innerText.trim(),label:e.innerText.trim(),metadata:void 0}))})}return Q.from({http:e.component("http-client"),url:e.declared("src"),method:e.declared("method")??"POST",mode:e.declared("mode"),prefetch:e.declared("preload"),revision:e.declared("revision"),responseMapper:Q.#ee(e)})}static#ee(e){return e.declared("k-expr")&&e.declared("l-expr")?t=>e._registry.evaluator().withOverlay(t).evaluateExpression(e.declared("d-expr")??"self").map(t=>{const s=e._registry.evaluator().withOverlay(t);return{key:s.evaluateExpression(e.declared("k-expr")),label:s.evaluateExpression(e.declared("l-expr")),metadata:s.evaluateExpression(e.declared("m-expr")??"self")}}):e.declared("response-mapper")?e.component(e.declared("response-mapper")):e=>e.map(([e,t,s])=>({key:e,label:t,metadata:s}))}}class V extends e{static attributes=["listbox"];static slots=!0;static template='\n <ful-spinner class="centered" role="status" hidden><span class="ful-sr-only">{{ #l10n:t(\'spinner.loading\') }}</span></ful-spinner>\n <p data-ref="empty" aria-live="polite" hidden>{{ #l10n:t(\'dropdown.empty\') }}</p>\n <menu tabindex="-1" role="listbox" hidden></menu>\n ';static templates={options:'\n <li data-tpl-each="self" data-tpl-selected="index == 0" data-tpl-value="index" role="option">\n {{ label }}\n </li>\n '};#te;#se;#ie;#re;#ne=new Map;#ae=new b;render({slots:e}){const s=this.template().render();this.#re=r.isBlank(e.default)?this.template("options"):n.fromFragment(e.default),this.#te=s.querySelector("ful-spinner"),this.#ie=s.querySelector("p[data-ref=empty]"),this.#se=s.querySelector("menu"),this.#se.id=this.declared("listbox")||t.uid("ful-listbox"),this.#se.addEventListener("click",e=>{e.stopPropagation();const t=e.target.closest("li");t?this.#le(t):this.hide()}),this.replaceChildren(s)}#oe(){return this.#se?.querySelector("[selected]")??this.#se?.firstElementChild??null}#ue(e){if(e){for(const t of this.#se.querySelectorAll("li"))t.toggleAttribute("selected",t===e);e.id||=t.uid("ful-option"),this.#de(e.id),e.scrollIntoView({block:"nearest",behavior:matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth"})}else this.#de(null)}acceptSelection(){const e=this.#oe();e&&this.#le(e)}update(e,t=[]){if(void 0===e)throw new Error("null data");this.#ne=new Map(e.map((e,t)=>[String(t),e]));const s=e.map((e,t)=>({index:t,...e}));this.#re.withOverlay(s).renderTo(this.#se);for(const[s,i]of[...this.#se.children].entries()){const r=t.some(t=>t==e[s]?.key);i.toggleAttribute("picked",r),i.setAttribute("aria-selected",r?"true":"false")}this.#ie.toggleAttribute("hidden",0!==e.length),this.#se.toggleAttribute("hidden",0===e.length);const i=e.findIndex(({key:e})=>t.some(t=>t==e));this.#ue(i>=0?this.#se.children[i]:this.#oe())}#le(e){const t=e.getAttribute("value"),s=this.#ne.get(t);this.hide(),this.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!1,detail:{index:t,entry:s}}))}hide(){this.#ae.invalidate(),this.matches(":popover-open")&&this.hidePopover(),this.#de(null)}#de(e){this.dispatchEvent(new CustomEvent("activechange",{bubbles:!1,cancelable:!1,detail:{id:e}}))}get shown(){return this.matches(":popover-open")}async show(e,t=[]){const s=this.#ae.take();this.matches(":popover-open")||this.showPopover(),this.#se.setAttribute("hidden",""),this.#te.removeAttribute("hidden");try{const i=await e();if(s.stale)return;this.update(i,t)}catch(e){if(s.stale)return;throw this.hide(),e}finally{s.stale||this.#te.setAttribute("hidden","")}}async moveOrShow(e,t,s=[]){if(this.shown){const t=this.#oe(),s=t?.[(e?"next":"previous")+"ElementSibling"];return void(t&&s&&this.#ue(s))}await this.show(t,s)}jump(e){const t=e?this.#se.firstElementChild:this.#se.lastElementChild;t&&this.#ue(t)}page(e){const t=this.#oe();if(!t)return;const s=Array.from(this.#se.children),i=this.#ce(),r=s[Math.max(0,Math.min(s.length-1,s.indexOf(t)+(e?i:-i)))];this.#ue(r)}#ce(){const e=this.#se.firstElementChild;return e&&0!==e.offsetHeight?Math.max(1,Math.trunc(this.#se.clientHeight/e.offsetHeight)):1}}class K extends E{static attributes=["name","loader","k-type","src","method","mode","preload:presence","revision","k-expr","l-expr","d-expr","m-expr","response-mapper"];static observed=["multiple:presence","item-list:presence","value:csv"];static slots=!0;static template='\n <label>{{{{ slots.default }}}}</label>\n {{{{ slots.info }}}}\n <ful-control-group>\n <ful-affix data-tpl-if="slots.before">{{{{ slots.before }}}}</ful-affix>\n <ful-control>\n <input type="text" form="" autocomplete="off" role="combobox" aria-autocomplete="list" aria-haspopup="listbox" aria-expanded="false">\n </ful-control>\n <ful-affix data-tpl-if="slots.after">{{{{ slots.after }}}}</ful-affix>\n <ful-dropdown popover="manual">{{{{ slots.dropdown }}}}</ful-dropdown>\n </ful-control-group>\n <ful-item-list></ful-item-list>\n <ful-field-error></ful-field-error>\n ';static templates={items:'\n <ful-item data-tpl-each="entries" data-tpl-var="entry" data-tpl-data-key="entry.key">\n <div><span>{{ entry.label }}</span><button type="button" data-tpl-aria-label="#l10n:t(\'select.remove\')"><ful-icon name="x-lg" aria-hidden="true"></ful-icon></button></div>\n </ful-item>\n '};#he;#i;#pe;#fe;#O;#I;#me;#ge=!1;#be=new Map;#ve=new b;#ye=!1;#we;#Ee;_build({slots:e}){const s=this.declared("name");this.#he=this.component(this.declared("loader")??"loaders:select").create(this,{options:e.options}),this.#me=this.declared("multiple"),this.#he.prefetch?.()?.catch(e=>{console.warn("failed to prefetch select options",this,"reason:",e)});const i=this.template().withOverlay({slots:e,name:s}).render();this.#fe=i.querySelector("input"),this.#O=i.querySelector("ful-item-list"),this.#I=e.items&&!r.isBlank(e.items)?n.fromFragment(e.items):null,t.forward("input-",this,this.#fe),this.#i=i.querySelector("ful-control"),this.#pe=i.querySelector("ful-dropdown");const a=t.uid("ful-listbox");this.#pe.setAttribute("listbox",a),this.#fe.setAttribute("aria-controls",a),this.#pe.addEventListener("beforetoggle",e=>{const t="open"===e.newState;this.#fe.setAttribute("aria-expanded",t?"true":"false"),t||this.#fe.removeAttribute("aria-activedescendant")}),this.#pe.addEventListener("activechange",e=>{t.set(this.#fe,"aria-activedescendant",e.detail.id)});const l=i.querySelector("ful-control-group");return j.wire(l,this.#pe,{prefix:"ful-select",stretch:!0}),[this.#we,this.#Ee]=y.throttle(400,()=>this.#xe()),this.#Ae(),this.#Se(),this.#_e(),this.#qe(),{fragment:i,control:this.#fe,error:i.querySelector("ful-field-error"),label:i.querySelector("label")}}#Ae(){this.addEventListener("click",e=>{if(!this._interactive())return;const t=e.target.closest("button, a[href], input, select, textarea");t&&t!==this.#fe||(this.#pe.shown?this.#Te():(this.#fe.focus(),this.#we()))}),this.#O.addEventListener("click",e=>{e.stopPropagation(),e.target.closest("button")&&this._interactive()&&this.#Ce([...this.#O.children].indexOf(e.target.closest("ful-item")))}),this.#i.addEventListener("click",e=>{const t=e.target instanceof Element?e.target.closest("ful-badge"):null;t&&(e.stopPropagation(),this.#ke(t))})}#Se(){this.addEventListener("keydown",e=>{const t=e.target instanceof Element?e.target.closest("ful-badge"):null;t?this.#ze(e,t):"ArrowLeft"===e.code&&e.target===this.#fe&&0===this.#fe.selectionStart&&0===this.#fe.selectionEnd&&this.#Oe().at(-1)?.focus()})}#_e(){this.#fe.addEventListener("change",e=>{e.stopPropagation()}),this.#fe.addEventListener("focus",()=>{this.#ye||this.#fe.select()}),this.#fe.addEventListener("blur",e=>{e.stopPropagation(),e.relatedTarget&&this.contains(e.relatedTarget)||(this.#Ee(),this.#Te())}),this.#fe.addEventListener("keydown",e=>{this._interactive()&&this.#Re(e)}),this.#fe.addEventListener("input",e=>{e.stopPropagation(),this._interactive()&&(this.#ye=!0,this.#we())})}#qe(){this.#pe.addEventListener("change",e=>{e.stopPropagation(),this._interactive()?(this.#me||this.#be.clear(),this.#ye=!1,this.#be.set(this.#Le(e.detail.entry.key),e.detail.entry),this.#Ne(),this.#Ie(),this.#fe.focus(),this.#pe.hide(),this.#me||this.#fe.select()):this.#Te()})}async withLoader(e){return await e(this.#he)}async reload(){await(this.#he.invalidate?.()),await(this.#he.prefetch?.());const e=[...this.#be.keys()];0!==e.length&&await this.#Me(e,this.#ve.take())}#Oe(){return Array.from(this.#i.querySelectorAll(":scope > ful-badge"))}#ke(e){this._interactive()&&this.#Ce(this.#Oe().indexOf(e))}#Ce(e){const t=Array.from(this.#be.keys())[e];void 0!==t&&(this.#be.delete(t),this.#Ne(),this.#Ie())}#ze(e,t){switch(e.code){case"NumpadEnter":case"Enter":case"Space":case"Backspace":case"Delete":e.preventDefault(),this.#ke(t),this.#fe.focus();break;case"ArrowLeft":e.preventDefault(),(this.#Oe()[this.#Oe().indexOf(t)-1]??this.#fe).focus();break;case"ArrowRight":e.preventDefault(),(this.#Oe()[this.#Oe().indexOf(t)+1]??this.#fe).focus();break;case"Escape":this.#fe.focus()}}#Re(e){switch(e.code){case"ArrowUp":case"ArrowDown":e.preventDefault(),this.#Fe(e);break;case"Home":this.#pe.shown&&(e.preventDefault(),this.#pe.jump(!0));break;case"End":this.#pe.shown&&(e.preventDefault(),this.#pe.jump(!1));break;case"PageDown":case"PageUp":this.#pe.shown&&(e.preventDefault(),this.#pe.page("PageDown"===e.code));break;case"Escape":case"Tab":this.#Ee(),this.#Te();break;case"NumpadEnter":case"Enter":if(!this.#pe.shown)return;e.preventDefault(),this.#ye=!1,this.#De(),this.#pe.acceptSelection();break;case"Backspace":0===this.#fe.selectionStart&&0===this.#fe.selectionEnd&&this.#Ce(this.#be.size-1)}}#Fe(e){const t="ArrowDown"===e.code;e.altKey?t&&!this.#pe.shown?this.#xe():!t&&this.#pe.shown&&this.#Te():(this.#Pe(),this.#pe.moveOrShow(t,()=>this.#he.load(this.#fe.value),[...this.#be.keys()]))}#Te(){this.#pe.hide(),this.#ye=!1,this.#De()}#xe(){return this.#Pe(),this.#pe.show(()=>this.#he.load(this.#fe.value),[...this.#be.keys()])}#Pe(){this.#ye||(this.#fe.value="")}#De(){const e=this.#be.values().next().value;this.#fe.value=this.#me?"":e?.label??""}#Be(){return[...this.#be.values()]}#Ne(){this._notifyChange({entry:this.entry})}#Ie(){const e=this.#me?Array.from(this.#be.entries()).map(([e,t],s)=>{const i=document.createElement("ful-badge");return i.setAttribute("role","button"),i.setAttribute("tabindex",0===s?"0":"-1"),i.setAttribute("value",e),i.innerText=t.label,i}):[];for(const e of this.#i.querySelectorAll(":scope > ful-badge"))e.remove();this.#fe.before(...e),this.#ye||this.#De(),this.#O.replaceChildren(),(this.#I??this.template("items")).withOverlay({entries:this.#Be()}).renderTo(this.#O)}#Le(e){switch(this.declared("k-type")){case"number":{const t=""===e?Number.NaN:Number(e);return Number.isNaN(t)?e:t}case"boolean":return!0===e||"true"===e||!1!==e&&"false"!==e&&e;default:return String(e)}}set value(e){const t=(null==e?[]:Array.isArray(e)?e:[e]).map(e=>this.#Le(e));!this.#ge&&t.some(e=>"string"==typeof e&&e.includes(","))&&(this.#ge=!0,console.warn("a ful-select key cannot contain a comma: it is unexpressible in the value attribute",this)),this.#be=new Map(t.map(e=>[e,{key:e,label:e,metadata:void 0}]));const s=this.#ve.take();this.#i&&(this.#Ie(),0!==t.length&&this.#Me(t,s))}async#Me(e,t){const s=await this.#he.exact(...e);if(t.stale)return;const i=new Map(s.map(e=>[this.#Le(e.key),e]));for(const t of e)this.#be.has(t)&&(i.has(t)?this.#be.set(t,i.get(t)):this.#be.delete(t));this.#Ie()}get value(){return this.#me?[...this.#be.keys()]:[...this.#be.keys()][0]??null}get entry(){const e=this.#Be();return this.#me?e:e[0]??null}#G;get multiple(){return this.#me}set multiple(e){this.#me=e,this.reflectTo("multiple",e)}get itemList(){return this.#G}set itemList(e){this.#G=e,this.reflectTo("item-list",e)}}class J extends E{static attributes=["name","type"];static slots=!0;static ROLE="radiogroup";static template='\n <fieldset>\n <legend>\n {{{{ slots.default }}}}\n </legend>\n <header data-tpl-if="slots.header">\n {{{{ slots.header }}}}\n </header>\n <ful-radio-list>\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 </ful-radio-list>\n <ful-field-error></ful-field-error>\n <footer data-tpl-if="slots.footer">\n {{{{ slots.footer }}}}\n </footer>\n </fieldset>\n ';#$e;#We;#je;_build({slots:e}){const s=this.declared("name")??t.uid("ful-radiogroup"),i=Array.from(e.default.querySelectorAll("ful-radio")),n=i.map(e=>{const i=document.createElement("input");return i.setAttribute("type","radio"),t.forward("input-",this,i),t.forward("",e,i),i.setAttribute("name",`${s}-ignore`),i.setAttribute("form",""),i.addEventListener("change",e=>{e.stopPropagation(),this._notifyChange()}),[i,r.fromChildNodes(e)]});i.forEach(e=>{e.remove()});const a=this.template().withOverlay({name:s,slots:e,inputsAndLabels:n}).render();return this.#$e=a.firstElementChild,this.#We=a.querySelector("input[type=radio]"),this.#je="boolean"===this.declared("type"),{fragment:a,control:this.#We,error:a.querySelector("ful-field-error"),described:this,claims:this.#$e,announces:this,freeze:this.#$e}}get value(){const e=this.querySelector("input[type=radio]:checked");return e?this.#je?"true"===e.value:e.value:null}set value(e){const t=this.querySelectorAll("input[type=radio]"),s=()=>{t.forEach(e=>{e.checked=!1})};if(null===e)return void s();const i=this.querySelector(`input[type=radio][value=${CSS.escape(String(e))}]`);null!==i?i.checked=!0:s()}}class Y extends E{static attributes=["type"];static observed=["value:bool"];static slots=!0;static template='\n <ful-choice data-tpl-switch="isSwitch">\n <input type="checkbox" data-tpl-role="isSwitch ? \'switch\' : false" form="" placeholder=" ">\n <label>{{{{ slots.default }}}}</label>\n {{{{ slots.info }}}}\n </ful-choice>\n <ful-field-error></ful-field-error>\n ';#He;#fe;_build({slots:e}){const s="switch"===this.declared("type"),i=this.template().withOverlay({slots:e,isSwitch:s}).render();this.#He=i.firstElementChild,this.#fe=i.querySelector("input"),t.forward("input-",this,this.#fe),this.#fe.addEventListener("change",e=>{e.stopPropagation(),this._notifyChange()});const r=i.querySelector("label");return{fragment:i,control:this.#fe,error:i.querySelector("ful-field-error"),label:r,freeze:this.#He}}get value(){return this.#fe.checked}set value(e){this.#fe.checked=e}}class X extends e{static attributes=["sorter"];static observed=["order"];#Ge;render(){const e=this.declared("sorter"),t=["asc","desc",null];this.setAttribute("role","button"),this.setAttribute("tabindex","0"),this.addEventListener("click",()=>{const s=t[(t.indexOf(this.order)+1)%3];this.dispatchEvent(new CustomEvent("sort:requested",{bubbles:!0,cancelable:!0,detail:{value:{sorter:e,order:s}}}))}),this.addEventListener("keydown",e=>{"Enter"!==e.code&&"Space"!==e.code||(e.preventDefault(),this.click())})}get order(){return this.#Ge||null}set order(e){this.#Ge=e||null,this.reflectTo("order",this.#Ge);const s=this.closest("th");s&&t.set(s,"aria-sort",this.#Ge?"asc"===this.#Ge?"ascending":"descending":null)}}class Z extends e{static observed=["total:number","current:number"];static attributes=["pages:number"];static config={prevIcon:"chevron-left",nextIcon:"chevron-right",reloadIcon:"arrow-clockwise"};static template='\n <ful-pagination-bar role="navigation" data-tpl-aria-label="#l10n:t(\'pagination.navigation\')">\n <ul>\n <li data-ref="index"> {{ #l10n:t(\'pagination.showing\', { \'current\': curr.label, \'total\': total }) }}</li>\n <li data-ref="reload"><button type="button" data-tpl-aria-label="#l10n:t(\'pagination.reload\')"><ful-icon data-tpl-name="config.reloadIcon" aria-hidden="true"></ful-icon></button></li>\n <li data-ref="prev">\n <button type="button" data-tpl-disabled="prev.enabled ? false : true" data-tpl-aria-label="#l10n:t(\'pagination.previous\')" data-tpl-data-page="prev.index">\n <ful-icon data-tpl-name="config.prevIcon" aria-hidden="true"></ful-icon>\n </button>\n </li>\n <li data-ref="page" data-tpl-each="pages" data-tpl-var="page">\n <button type="button" data-tpl-aria-current="curr.index == page.index ? \'page\' : false" data-tpl-data-page="page.index" >\n {{ page.label }}\n </button>\n </li>\n <li data-ref="next">\n <button type="button" data-tpl-disabled="next.enabled ? false : true" data-tpl-aria-label="#l10n:t(\'pagination.next\')" data-tpl-data-page="next.index">\n <ful-icon data-tpl-name="config.nextIcon" aria-hidden="true"></ful-icon>\n </button>\n </li>\n </ul>\n </ful-pagination-bar>\n ';#Ue=0;#Qe=0;render(){this.addEventListener("click",e=>{const t=e.target.closest("button");t&&!t.hasAttribute("disabled")&&"page"!==t.getAttribute("aria-current")&&this.dispatchEvent(new CustomEvent("page:requested",{bubbles:!0,cancelable:!0,detail:{value:Number(t.dataset.page??this.#Qe)}}))})}update({current:e,total:t}={}){void 0!==e&&(this.#Qe=e??0),void 0!==t&&(this.#Ue=t??0),this.reflectTo("current",this.#Qe),this.reflectTo("total",this.#Ue);const s=this.#Qe,i=this.#Ue,r=this.declared("pages")??5,n=Math.max(i,1),a=s>0,l=s+1<n,o={index:a?s-1:null,enabled:a},u={index:s,label:s+1},d={index:l?s+1:null,enabled:l},c=Math.max(1,Math.min(r,n)),h=Math.max(0,Math.min(s-Math.floor((c-1)/2),n-c)),p=Array.from({length:c},(e,t)=>({index:h+t,label:h+t+1})),f=this.contains(document.activeElement)?document.activeElement.closest("li")?.getAttribute("data-ref"):null,m="page"===f?document.activeElement.dataset.page:null;if(this.template().withOverlay({total:n,prev:o,curr:u,next:d,pages:p}).renderTo(this),!f)return;const g=(null===m?null:this.querySelector(`li[data-ref=page] button[data-page="${m}"]`))??this.querySelector(`li[data-ref=${f}] button:not(:disabled)`)??this.querySelector("li[data-ref=page] button[aria-current=page]");g?.focus()}get total(){return this.#Ue}set total(e){this.update({total:e})}get current(){return this.#Qe}set current(e){this.update({current:e})}}class ee{static parse(e,t){const s=e?a.queryChildren(e,"schema"):null;if(!s)throw new Error('missing expected <schema>: ful-table needs a <template slot="schema"> holding one');const i=document.createElement("tr"),n=document.createElement("tr");n.setAttribute("data-tpl-each","rows");for(const e of s.getAttributeNames()){const t=s.getAttribute(e);i.setAttribute(e,t??""),n.setAttribute(e,t??"")}const l=a.queryChildrenAll(s,"column"),o=l.filter(e=>e.hasAttribute("order")&&e.hasAttribute("sorter")).map(e=>({sorter:e.getAttribute("sorter"),order:e.getAttribute("order")}))[0]??null;for(var u of l){const e=a.queryChildren(u,"title"),t=u.getAttribute("sorter"),s=u.getAttribute("order"),r=e??document.createTextNode(u.getAttribute("title")??"");e?.remove(),u.removeAttribute("sorter"),u.removeAttribute("order"),u.removeAttribute("title");const l=t||s?(()=>{const e=document.createElement("ful-sorter");return t&&e.setAttribute("sorter",t),s&&e.setAttribute("order",s),e.append(r),e})():r,o=document.createElement("th"),d=document.createElement("td");for(const e of u.getAttributeNames()){const t=u.getAttribute(e);o.setAttribute(e,t??""),d.setAttribute(e,t??"")}o.append(l),d.append(...u.childNodes),i.append(o),n.append(d)}return{headersTemplate:t.withOverlay({inHeaders:!0,inRows:!1}).withFragment(r.from(i)),rowsTemplate:t.withOverlay({inHeaders:!1,inRows:!0}).withFragment(r.from(n)),sort:o,length:l.length}}}class te{#K;constructor(e){this.#K=e}async load(e,t,s){const i=this.#Ve(t),r=e.page*e.size,n=r+e.size;return{data:i.slice(r,n),size:i.length}}#Ve(e){if(!e?.sorter)return this.#K;const{sorter:t,order:s}=e,i="desc"===s?-1:1;return[...this.#K].sort((e,s)=>{const r=e?.[t],n=s?.[t];return r===n?0:null==r?1:null==n?-1:(r<n?-1:1)*i})}update(e){this.#K=e}}class se{#v;#y;#w;#x;constructor(e,t,s,i=e=>e){this.#v=e,this.#y=t,this.#w=s,this.#x=i}async load(e,t,s){const i=Object.entries(s).filter(([e,t])=>t);return await this.#v.request(this.#w,this.#y).param("page",e.page).param("size",e.size).param("sort",t?`${t.sorter},${t.order}`:null).param("filters",i.length>0?JSON.stringify(Object.fromEntries(i)):null).fetchJson().then(e=>this.#x(e))}}class ie{static create(e,t){const s=e.getAttribute("src");if(s){const t=e.component("http-client"),i=e.getAttribute("method")??"GET",r=e.hasAttribute("response-mapper")?e.component(e.getAttribute("response-mapper")):e=>e;return new se(t,s,i,r)}return new te([])}}class re extends e{static attributes=["loader","autoload:presence"];static observed=["page-size:number"];static slots=!0;static config={searchIcon:"search"};static template='\n <ful-form data-tpl-if="slots.filters">\n {{{{ slots.filters }}}}\n </ful-form>\n <ful-table-wrapper>\n <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"><ful-icon data-tpl-name="config.searchIcon" aria-hidden="true"></ful-icon></p>\n {{ #l10n:t(\'table.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" role="status"><span class="ful-sr-only">{{ #l10n:t(\'spinner.loading\') }}</span></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 role="alert">\n <p>{{ #l10n:t(\'table.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 </ful-table-wrapper>\n <ful-pagination current="0" total="1"></ful-pagination>\n ';static templates={row:"\n <tr data-tpl-if=\"pageResponse.data.length == 0\">\n <td data-tpl-colspan=\"schema.length\">\n {{ #l10n:t('table.no-data') }}\n </td>\n </tr>\n {{{{ schema.rowsTemplate.withOverlay({'rows': pageResponse.data}).render() }}}}\n "};#he;#Ke;#Je;#Ye;#Xe;#Ze;#et;#tt;#st={pageRequest:{page:0,size:10},sortRequest:null,filterRequest:{}};#it=!1;#rt=new b;get pageSize(){return this.#st.pageRequest.size}set pageSize(e){const t=e??10;t!==this.#st.pageRequest.size&&(this.#st={...this.#st,pageRequest:{page:0,size:t}},this.#it&&this.reload())}async render({slots:e}){const s=this.template(),i=ee.parse(e.schema,s),r=s.withOverlay({slots:e,schema:i}).render(),n=a.queryChildren(r,"ful-table-wrapper").querySelector("table");t.forward("table-",this,n),this.#he=this.component(this.declared("loader")??"loaders:table").create(this),this.#Ke=i,this.#Je=n.querySelector(":scope > tbody"),this.#Ye=n.querySelector(":scope > tbody[data-ref=loading]"),this.#Xe=n.querySelector(":scope > tbody[data-ref=initial]"),this.#Ze=n.querySelector(":scope > tbody[data-ref=feedback]"),this.#et=a.queryChildren(r,"ful-pagination"),this.replaceChildren(r);const o=this.querySelector("thead");i.headersTemplate.renderTo(o),this.#tt=o.querySelectorAll("ful-sorter"),await l.waitForChildren(this);const u=a.queryChildren(this,"ful-form");this.#st={pageRequest:{page:0,size:this.declared("page-size")??10},sortRequest:i.sort,filterRequest:u?.values??{}},u?.addEventListener("submit:success",async e=>{await this.load({page:0,size:this.#st.pageRequest.size},this.#st.sortRequest,e.detail.request)}),this.addEventListener("page:requested",async e=>{await this.load({page:e.detail.value,size:this.#st.pageRequest.size},this.#st.sortRequest,this.#st.filterRequest)}),this.addEventListener("sort:requested",async e=>{const t=e.detail.value.order?e.detail.value:null;await this.load(this.#st.pageRequest,t,this.#st.filterRequest),this.#st.sortRequest===t&&(this.#tt.forEach(e=>{e.order=null}),e.target.order=e.detail.value.order)}),this.declared("autoload")&&this.reload()}async reload(){return await this.load(this.#st.pageRequest,this.#st.sortRequest,this.#st.filterRequest)}async load(e,t,s){this.#it=!0;const i=this.#rt.take();this.#Ye.toggleAttribute("hidden",this.#Je.childElementCount>0),this.#Ze.setAttribute("hidden",""),this.#Xe.setAttribute("hidden",""),this.setAttribute("aria-busy","true");try{const r=await this.#he.load(e,t,s);if(i.stale)return;this.#st={pageRequest:e,sortRequest:t,filterRequest:s},this.#M(e,t,s,r)}catch(e){if(i.stale)return;throw this.#Ye.setAttribute("hidden",""),this.#Je.replaceChildren(),this.#Ze.removeAttribute("hidden"),this.#Ze.querySelector("[data-ref=feedback-error]").textContent=o.problemsText(e,`${e}`),e}finally{i.stale||this.removeAttribute("aria-busy")}}async withLoader(e){return await e(this.#he)}async resetWithFilter(e){return await this.load({page:0,size:this.#st.pageRequest.size},this.#st.sortRequest,e)}#M(e,t,s,i){const r=Math.ceil(i.size/e.size),n=Math.max(0,r-1);e.page>n?this.load({page:n,size:e.size},t,s):(this.#Ye.setAttribute("hidden",""),this.#Je.replaceChildren(this.template("row").withOverlay({schema:this.#Ke,pageRequest:e,filterRequest:s,pageResponse:i}).render()),this.#et.update({current:e.page,total:r}))}}class ne{static narrow(e,t){const s=(e??[]).filter(e=>t.includes(e));return s.length>0?s:[...t]}#nt;#se;#at;#lt;#ot;#De;#ut;#dt;#ct;#ht=!1;#pt=!1;constructor(e,{vocabulary:t,glyphs:s={},labelFor:i=e=>e,display:r=null,interactive:n=()=>!0,onPick:a=()=>{}}){this.#nt=e,this.#se=e.nextElementSibling,this.#at=t,this.#lt=s,this.#ot=i,this.#De=r??(e=>s[e]??e),this.#ut=n,this.#dt=a,this.#ct=[...t],this.#se.addEventListener("click",e=>{const t=e.target.closest("li > a");if(!t||!this.#ut())return;const s=t.getAttribute("value"),i=this.value;this.value=s,this.#se.hidePopover?.(),i!==s&&this.#dt(s)})}get allowed(){return this.#ct}set allowed(e){this.#ct=ne.narrow(e,this.#at),this.#ft(),!this.#pt&&this.#ct.length>1&&(this.#h(),this.#pt=!0),this.#mt(),this.pinned&&(this.value=this.#ct[0])}get pinned(){return this.#ct.length<2}get value(){return this.#nt.getAttribute("value")}set value(e){this.#nt.setAttribute("value",e),this.#nt.textContent=this.#De(e),t.set(this.#nt,"aria-label",this.#ot(e)),this.#gt()}#gt(){const e=this.value;for(const t of this.#O())t.setAttribute("aria-checked",String(t.getAttribute("value")===e))}set claimed(e){this.#ht=e,this.#mt()}#ft(){this.#se.replaceChildren(...this.#ct.map(e=>{const t=document.createElement("li");t.setAttribute("role","none");const s=document.createElement("a");s.setAttribute("role","menuitemradio"),s.setAttribute("tabindex","-1"),s.setAttribute("value",e);const i=this.#ot(e),r=this.#lt[e]??e;if(i===e&&r===e)s.innerText=e;else{const e=document.createElement("span");e.innerText=r;const t=document.createElement("span");t.innerText=i,s.append(e,t)}return t.append(s),t})),this.#gt()}#mt(){const e=this.pinned;this.#nt.toggleAttribute("disabled",e||this.#ht),t.set(this.#nt,"aria-haspopup",e?null:"true"),t.set(this.#nt,"aria-expanded",e?null:"false"),e?this.#nt.removeAttribute("popovertarget"):this.#se.id&&this.#nt.setAttribute("popovertarget",this.#se.id)}#O(){return Array.from(this.#se.querySelectorAll("li > a"),e=>e)}#h(){const e=this.#nt,t=this.#se;j.wire(e,t,{prefix:"ful-filter-menu",invoke:!0,expanded:!0}),t.addEventListener("toggle",s=>{if("open"!==s.newState)return void(t.contains(document.activeElement)&&e.focus());const i=this.#O();(i.find(e=>e.getAttribute("value")===this.value)??i[0])?.focus()}),t.addEventListener("keydown",t=>{const s=t.target.closest("li > a");if(!s)return;const i=this.#O(),r=i.indexOf(s);switch(t.code){case"ArrowDown":t.preventDefault(),i[(r+1)%i.length]?.focus();break;case"ArrowUp":t.preventDefault(),i[(r-1+i.length)%i.length]?.focus();break;case"Home":t.preventDefault(),i[0]?.focus();break;case"End":t.preventDefault(),i[i.length-1]?.focus();break;case"Enter":case"Space":t.preventDefault(),s.click(),e.focus();break;case"Escape":e.focus()}})}}const ae={EQ:"=",NEQ:"≠",LT:"<",GT:">",LTE:"≤",GTE:"≥",BETWEEN:"↔",CONTAINS:"…a…",STARTS_WITH:"a…",ENDS_WITH:"…a"},le=["EQ","NEQ","LT","GT","LTE","GTE","BETWEEN"],oe=[...le,"CONTAINS","STARTS_WITH","ENDS_WITH"],ue=["IGNORE_CASE","CASE_SENSITIVE"],de={IGNORE_CASE:"aa",CASE_SENSITIVE:"Aa"},{t:ce}=s.of(),he=e=>ce(`filters.op.${e}`),pe=e=>ce(`filters.sensitivity.${e}`),fe=e=>ce(""===e?"filters.boolean.any":`filters.boolean.${e}`);class me extends k{static observed=["value:json","operators:csv"];static OPERATORS=le;static DEFAULT_OPERATOR="EQ";static template='\n <label>{{{{ slots.default }}}}</label>\n {{{{ slots.info }}}}\n <ful-control-group>\n <ful-affix data-tpl-if="slots.before">{{{{ slots.before }}}}</ful-affix>\n <ful-affix>\n <button data-ref="operator" type="button" form="" aria-expanded="false" aria-haspopup="true"></button>\n <ul popover role="menu"></ul>\n </ful-affix>\n <ful-control>\n <input data-ref="value1" data-tpl-type="type" form="">\n <input data-ref="value2" data-tpl-type="type" form="" hidden>\n </ful-control>\n <ful-affix data-tpl-if="slots.after">{{{{ slots.after }}}}</ful-affix>\n </ful-control-group>\n <ful-field-error></ful-field-error>\n ';_operator;_container;_value1;_value2;_build(e){const t=super._build(e),s=t.fragment;return this._container=s.querySelector("ful-control-group"),this._value1=s.querySelector("[data-ref=value1]"),this._value2=s.querySelector("[data-ref=value2]"),this._operator=new ne(s.querySelector("[data-ref=operator]"),{vocabulary:this._vocabulary(),glyphs:ae,labelFor:he,interactive:()=>this._interactive(),onPick:()=>{this._syncBetween(),this._notifyChange()}}),this.operators=this.declared("operators"),this._value2.addEventListener("change",e=>{e.stopPropagation(),this._notifyChange()}),null===this._operator.value&&this._showDefaultOperator(),{...t,freeze:this._container,also:[this._value2]}}_showDefaultOperator(){const e=this._defaultOperator(),t=this._operator.allowed;this._showOperator(t.includes(e)?e:t[0])}formResetCallback(){super.formResetCallback(),this.hasAttribute("value")||this._showDefaultOperator()}_type(){return"text"}_serialize(e){return e}_deserialize(e){return e}_defaultOperator(){return"EQ"}_vocabulary(){return le}_declaredOperators;get operators(){return this._operator?this._operator.allowed:this._declaredOperators}set operators(e){this._operator?(this._operator.allowed=e,this._syncBetween()):this._declaredOperators=ne.narrow(e,this._vocabulary())}get value(){return this._tuple()}set value(e){this._applyTuple(e)}_tuple(){const e=this._operator.value,t="BETWEEN"===e?[this._value1.value,this._value2.value]:[this._value1.value];return t.some(e=>""===e)?null:[e,...t.map(e=>this._serialize(e))]}_applyTuple(e){if(null==e)return this._value1.value="",void(this._value2.value="");const[t,...s]=e,i=this._operator.pinned?this._operator.allowed[0]:t;this._showOperator(i),this._value1.value=s[0]?this._deserialize(s[0]):s[0]??"",this._value2.value=s[1]?this._deserialize(s[1]):s[1]??""}_showOperator(e){this._operator.value=e,this._syncBetween()}_syncBetween(){this._value2.toggleAttribute("hidden","BETWEEN"!==this._operator.value)}get disabled(){return super.disabled}set disabled(e){super.disabled=e;for(const t of this._choices())t.claimed=e}_choices(){return[this._operator].filter(e=>e)}}class ge extends me{_defaultOperator(){return"LTE"}_type(){return"datetime-local"}_serialize(e){return O.localToIso(e)}_deserialize(e){return O.isoToLocal(e)}}class be extends me{_type(){return"date"}}class ve extends me{_type(){return"number"}}class ye extends me{static observed=["sensitivities:csv"];static template='\n <label>{{{{ slots.default }}}}</label>\n {{{{ slots.info }}}}\n <ful-control-group>\n <ful-affix data-tpl-if="slots.before">{{{{ slots.before }}}}</ful-affix>\n <ful-affix>\n <button data-ref="operator" type="button" form="" aria-expanded="false" aria-haspopup="true"></button>\n <ul popover role="menu"></ul>\n <button data-ref="sensitivity" type="button" form="" aria-expanded="false" aria-haspopup="true"></button>\n <ul popover role="menu"></ul>\n </ful-affix>\n <ful-control>\n <input data-ref="value1" data-tpl-type="type" form="">\n <input data-ref="value2" data-tpl-type="type" form="" hidden>\n </ful-control>\n <ful-affix data-tpl-if="slots.after">{{{{ slots.after }}}}</ful-affix>\n </ful-control-group>\n <ful-field-error></ful-field-error>\n ';_defaultOperator(){return"CONTAINS"}_vocabulary(){return oe}_sensitivityButton;_build(e){const t=super._build(e);return this._sensitivityButton=new ne(t.fragment.querySelector("[data-ref=sensitivity]"),{vocabulary:ue,glyphs:de,labelFor:pe,interactive:()=>this._interactive(),onPick:()=>this._notifyChange()}),this._sensitivityButton.allowed=null,this._sensitivityButton.value=ue[0],t}_choices(){return[...super._choices(),this._sensitivityButton].filter(e=>e)}get _sensitivity(){return this._sensitivityButton.value}_declaredSensitivities;get sensitivities(){return this._sensitivityButton?this._sensitivityButton.allowed:this._declaredSensitivities}set sensitivities(e){if(!this._sensitivityButton)return void(this._declaredSensitivities=ne.narrow(e,ue));const t=this._sensitivityButton.value;this._sensitivityButton.allowed=e,this._sensitivityButton.allowed.includes(t)||(this._sensitivityButton.value=this._sensitivityButton.allowed[0])}get value(){const e=this._tuple();return null==e?null:[e[0],this._sensitivity,...e.slice(1)]}set value(e){null!=e?(this._sensitivityButton.allowed.includes(e[1])&&(this._sensitivityButton.value=e[1]),this._applyTuple([e[0],...e.slice(2)])):this._applyTuple(e)}formResetCallback(){if(super.formResetCallback(),!this.hasAttribute("value")){const e=this._sensitivityButton.allowed;this._sensitivityButton.value=e.includes("IGNORE_CASE")?"IGNORE_CASE":e[0]}}}const we=["","true","false"],Ee={true:"✓",false:"✗"};class xe extends E{static observed=["value:json","operators:csv"];static slots=!0;static OPERATORS=["EQ","NEQ"];static DEFAULT_OPERATOR="EQ";static template='\n <label>{{{{ slots.default }}}}</label>\n {{{{ slots.info }}}}\n <ful-control-group>\n <ful-affix data-tpl-if="slots.before">{{{{ slots.before }}}}</ful-affix>\n <ful-affix>\n <button data-ref="operator" type="button" form="" aria-expanded="false" aria-haspopup="true"></button>\n <ul popover role="menu"></ul>\n </ful-affix>\n <button data-ref="value" type="button" form=""></button>\n <ul popover role="menu"></ul>\n <ful-affix data-tpl-if="slots.after">{{{{ slots.after }}}}</ful-affix>\n </ful-control-group>\n <ful-field-error></ful-field-error>\n ';_operator;_value;_container;_build({slots:e}){const t=this.template().withOverlay({slots:e}).render();this._container=t.querySelector("ful-control-group");const s=t.querySelector("[data-ref=value]");this._operator=new ne(t.querySelector("[data-ref=operator]"),{vocabulary:xe.OPERATORS,glyphs:ae,labelFor:he,interactive:()=>this._interactive(),onPick:()=>this._notifyChange()}),this._value=new ne(s,{vocabulary:we,glyphs:Ee,labelFor:fe,display:fe,interactive:()=>this._interactive(),onPick:()=>this._notifyChange()}),this.operators=this.declared("operators");const i=this._operator.allowed;return this._operator.value=i.includes(xe.DEFAULT_OPERATOR)?xe.DEFAULT_OPERATOR:i[0],this._value.allowed=null,this._value.value="",{fragment:t,control:s,error:t.querySelector("ful-field-error"),label:t.querySelector("label"),announces:null,freeze:this._container}}_declaredOperators;get operators(){return this._operator?this._operator.allowed:this._declaredOperators}set operators(e){this._operator?this._operator.allowed=e:this._declaredOperators=ne.narrow(e,this._vocabulary())}_vocabulary(){return xe.OPERATORS}get value(){return""===this._value.value?null:[this._operator.value,this._value.value]}set value(e){null!=e?(this._operator.value=this._operator.pinned?this._operator.allowed[0]:e[0],this._value.value=e[1]??""):this._value.value=""}get disabled(){return super.disabled}set disabled(e){super.disabled=e;for(const t of[this._operator,this._value].filter(e=>e))t.claimed=e}}class Ae{#bt=new WeakSet;#o=new WeakMap;async request(e,t,s,i){const r=!this.#bt.has(t),n={name:s,section:t,index:i,first:r},a=["section:requested",...null!=i?[`section:requested:#${i}`]:[],...s?[`section:requested:${s}`]:[]],l=[];for(const t of a){const s=new CustomEvent(t,{bubbles:!0,detail:n});e.dispatchEvent(s),l.push(...s.async?.promises??[])}if(0===l.length)return;this.#bt.add(t);let o=this.#o.get(t);o||(o=new b,this.#o.set(t,o));const u=o.take(),d=()=>!u.stale;t.querySelector(":scope > .ful-section-error")?.remove();const c=requestAnimationFrame(()=>{d()&&(t.toggleAttribute("loading",!0),t.setAttribute("aria-busy","true"))});try{return await Promise.all(l)}catch(e){throw d()&&this.#vt(t,e),e}finally{cancelAnimationFrame(c),d()&&(t.toggleAttribute("loading",!1),t.removeAttribute("aria-busy"))}}#vt(e,t){e.querySelector(":scope > .ful-section-error")?.remove();const s=document.createElement("div");s.className="ful-section-error",s.setAttribute("role","alert"),s.textContent=o.problemsText(t),e.prepend(s)}}let Se=!1;const _e=()=>{Se||(Se=!0,document.addEventListener("click",e=>{const t=e.target.closest?.("[dialog-target]");t&&document.getElementById(t.getAttribute("dialog-target"))?.open?.()}))};class qe extends e{static slots=!0;static attributes=["placement","icon","describes:presence"];static config={icon:"info-circle-fill"};static template='\n <button type="button" class="ful-tip" data-ref="trigger" data-tpl-aria-label="#l10n:t(\'info.tooltip\')"><ful-icon data-tpl-name="icon ?? config.icon" aria-hidden="true"></ful-icon></button>\n <ful-note popover data-ref="content">{{{{ slots.default }}}}</ful-note>\n ';render({slots:e}){const t=this.template().withOverlay({slots:e,icon:this.declared("icon")}).render(),s=t.querySelector("[data-ref=trigger]"),i=t.querySelector("[data-ref=content]");j.wire(s,i,{prefix:"ful-tooltip",invoke:!0,expanded:!0,handPlace:!0}),i.setAttribute("placement",this.declared("placement")??"top"),this.replaceChildren(t),this.declared("describes")&&qe.#p(this,s,i)}static#p(e,t,s){v(e)?.describedBy(s)?t.tabIndex=-1:console.warn("a ful-tooltip declares describes but stands in nothing that takes a description",e)}}class Te extends e{static attributes=["header","requires-answer:presence","close-on-submit:presence"];static slots=!0;static template='\n <dialog data-ref="dialog" class="ful-dialog">\n <header data-tpl-if="header || slots.header || !requiresAnswer" class="ful-dialog-header">\n {{{{ slots.header }}}}\n <h2 data-tpl-if="header">{{ header }}</h2>\n <button data-tpl-if="!requiresAnswer" type="button" data-ref="close" data-tpl-aria-label="#l10n:t(\'dialog.close\')"><ful-icon name="x-lg" aria-hidden="true"></ful-icon></button>\n </header>\n <section data-ref="loading" hidden><ful-spinner class="centered" role="status"><span class="ful-sr-only">{{ #l10n:t(\'spinner.loading\') }}</span></ful-spinner></section>\n <section data-ref="error" role="alert" hidden></section>\n <div data-ref="body" class="ful-dialog-body">{{{{ slots.default }}}}</div>\n <footer class="ful-dialog-footer">\n <button type="button" data-ref="acknowledge" data-result="acknowledged" data-tpl-if="!slots.buttons && !closeOnSubmit" data-tpl-aria-label="#l10n:t(\'dialog.acknowledge\')">{{ #l10n:t(\'dialog.acknowledge\') }}</button>\n {{{{ slots.buttons }}}}\n </footer>\n </dialog>\n ';#yt;#Je;#Ye;#wt;#Et=new Ae;#xt=new b;#At=[];#St=null;render({slots:e}){const t=this.declared("requires-answer"),s=this.declared("close-on-submit"),i=this.template().withOverlay({slots:e,header:this.declared("header")??"",requiresAnswer:t,closeOnSubmit:s}).render();this.#yt=i.querySelector("[data-ref=dialog]"),this.#Je=i.querySelector("[data-ref=body]"),this.#Ye=i.querySelector("[data-ref=loading]"),this.#wt=i.querySelector("[data-ref=error]"),this.#yt.addEventListener("close",()=>{const e=this.#_t();this.dispatchEvent(new CustomEvent("close",{detail:e})),this.#b(e)}),this.#yt.addEventListener("click",e=>{const t=e.target.closest("button[data-result]")?.dataset.result;void 0!==t&&this.#yt.close(t)}),i.querySelector("[data-ref=close]")?.addEventListener("click",()=>this.#yt.close("")),s&&this.#Je.addEventListener("submit:success",e=>{e.target===a.queryChildren(this.#Je,"ful-form")&&(this.#St={dismissed:!1,result:null,response:e.detail.response},this.#yt.close("submitted"))}),t&&this.#yt.addEventListener("cancel",e=>e.preventDefault()),this.replaceChildren(i),_e()}#_t(){if(this.#St)return this.#St;const e=this.#yt?.returnValue??"";return""===e?{dismissed:!0,result:null,response:null}:{dismissed:!1,result:e,response:null}}#b(e){const t=this.#At;this.#At=[];for(const s of t)s(e)}disconnectedCallback(){this.#b(this.#_t())}open(){return this.ask()}ask(){return this.#qt()&&(this.#Tt(),this.#Ct()),new Promise(e=>{this.#At.push(e)})}async update(e){const t=this.#xt.take();this.#Je.replaceChildren(),this.#Tt(),this.#Ye?.removeAttribute("hidden"),this.#Je.setAttribute("hidden",""),this.#qt();try{const s=await e();return t.stale||(this.#Je.replaceChildren(s),this.#Ye?.setAttribute("hidden",""),this.#Je.removeAttribute("hidden")),this.#Je}catch(e){throw t.stale||(this.#wt?.removeAttribute("hidden"),this.#wt&&(this.#wt.textContent=o.problemsText(e)),this.#Ye?.setAttribute("hidden",""),this.#Je.setAttribute("hidden","")),e}}#Ct(){this.#Et.request(this,this.#Je,null,null)?.catch(()=>{})}refresh(){return this.#Et.request(this,this.#Je,null,null)?.then(void 0,()=>{})}close(e){this.#yt.close(e??"")}#qt(){return!this.#yt.open&&(this.#yt.returnValue="",this.#St=null,this.#yt.showModal(),!0)}#Tt(){this.#wt?.replaceChildren(),this.#wt?.setAttribute("hidden",""),this.#Ye?.setAttribute("hidden",""),this.#Je?.removeAttribute("hidden")}}class Ce extends e{static attributes=["title","placement","close-on-submit:presence"];static slots=!0;static template='\n <dialog data-ref="dialog" class="ful-drawer">\n <header>\n {{{{ slots.header }}}}\n <h2 data-ref="title">{{ title }}</h2>\n <button type="button" data-ref="close" data-tpl-aria-label="#l10n:t(\'drawer.close\')"><ful-icon name="x-lg" aria-hidden="true"></ful-icon></button>\n </header>\n <section data-ref="loading" hidden><ful-spinner class="centered" role="status"><span class="ful-sr-only">{{ #l10n:t(\'spinner.loading\') }}</span></ful-spinner></section>\n <section data-ref="error" role="alert" hidden></section>\n <section data-ref="content">{{{{ slots.default }}}}</section>\n </dialog>\n ';#yt;#kt;#Ye;#wt;#zt;#Et=new Ae;#xt=new b;#St=null;render({slots:e}){const t=this.template().withOverlay({slots:e,title:this.declared("title")??""}).render();this.#yt=t.querySelector("[data-ref=dialog]"),this.#kt=t.querySelector("[data-ref=title]"),this.#Ye=t.querySelector("[data-ref=loading]"),this.#wt=t.querySelector("[data-ref=error]"),this.#zt=t.querySelector("[data-ref=content]");const s=this.declared("placement");s&&this.#yt.setAttribute("placement",s),t.querySelector("[data-ref=close]").addEventListener("click",()=>this.close()),this.#yt.addEventListener("close",()=>{this.dispatchEvent(new CustomEvent("close",{detail:this.#St??{dismissed:!0,response:null}}))}),this.declared("close-on-submit")&&this.#zt.addEventListener("submit:success",e=>{e.target===a.queryChildren(this.#zt,"ful-form")&&(this.#St={dismissed:!1,response:e.detail.response},this.close())}),this.replaceChildren(t),_e()}get title(){return this.#kt.textContent}set title(e){this.#kt.textContent=e??""}async update(e,t){const s=this.#xt.take();this.title=e,this.#zt.replaceChildren(),this.#Tt(),this.#Ye.removeAttribute("hidden"),this.#zt.setAttribute("hidden",""),this.#qt();try{const e=await t();return s.stale||(this.#zt.replaceChildren(e),this.#Ye.setAttribute("hidden",""),this.#zt.removeAttribute("hidden")),this.#zt}catch(e){throw s.stale||(this.#wt.removeAttribute("hidden"),this.#wt.textContent=o.problemsText(e),this.#Ye.setAttribute("hidden",""),this.#zt.setAttribute("hidden","")),e}}refresh(){return this.#Et.request(this,this.#zt,null,null)?.then(void 0,()=>{})}open(){this.#qt()&&(this.#Tt(),this.#Et.request(this,this.#zt,null,null)?.catch(()=>{}))}close(){this.#yt.close()}#qt(){return!this.#yt.open&&(this.#St=null,this.#yt.showModal(),!0)}#Tt(){this.#wt.replaceChildren(),this.#wt.setAttribute("hidden",""),this.#Ye.setAttribute("hidden",""),this.#zt.removeAttribute("hidden")}}const ke=["info","success","warning","error"],ze=new Set;let Oe=!1;class Re extends e{static attributes=["timeout:number"];#Ot;connectedCallback(){super.connectedCallback(),this.rendered&&ze.add(this)}disconnectedCallback(){ze.delete(this)}render(){this.#Ot=this.declared("timeout")||5e3,this.setAttribute("role","region"),this.setAttribute("tabindex","-1"),this.setAttribute("aria-label",s.of().t("toast.region")),Oe||(Oe=!0,document.addEventListener("show-toast",e=>{for(const t of ze)t.show(e.detail.message,e.detail)})),ze.add(this)}show(e,t={}){const i=ke.includes(t.severity)?t.severity:"info",r=document.createElement("ful-toast");r.classList.add(i),r.setAttribute("role","error"===i?"alert":"status");const n=document.createElement("div");n.textContent=o.problemsText(e,`${e??""}`);const a=document.createElement("button");a.type="button",a.setAttribute("aria-label",s.of().t("toast.dismiss"));const l=document.createElement("ful-icon");l.setAttribute("name","x-lg"),l.setAttribute("aria-hidden","true"),a.append(l),r.append(n,a),r.addEventListener("animationend",()=>{r.classList.contains("ful-toast-out")&&r.remove()});const u=()=>{r.contains(document.activeElement)&&this.focus(),matchMedia("(prefers-reduced-motion: reduce)").matches?r.remove():(r.classList.add("ful-toast-out"),0===r.getAnimations().length&&r.remove())};return a.addEventListener("click",u),this.append(r),setTimeout(u,t.timeout??this.#Ot),r}}class Le extends e{static slots=!0;static observed=["active:number"];static template='\n <ful-tablist role="tablist">{{{{ slots.tabs }}}}</ful-tablist>\n {{{{ slots.default }}}}\n ';#Rt;#Lt=[];#Nt=[];#Et=new Ae;#It=0;render({slots:e}){const s=this.template().withOverlay({slots:e}).render();this.#Rt=s.querySelector("ful-tablist");const i=[...this.#Rt.children];this.#Nt=[...s.children].filter(e=>e!==this.#Rt),i.length!==this.#Nt.length&&console.warn(`ful-tabs: ${i.length} tabs declared for ${this.#Nt.length} panels, the surplus is left alone`);const r=Math.min(i.length,this.#Nt.length);this.#Lt=[];for(let e=0;e!==r;++e){const s=this.#Nt[e],r=document.createElement("button");r.type="button",r.role="tab",r.id=t.uid("ful-tab"),s.id||(s.id=t.uid("ful-tabpanel")),r.setAttribute("aria-controls",s.id),s.role="tabpanel",s.setAttribute("aria-labelledby",r.id),s.tabIndex=0,r.append(...i[e].childNodes),r.addEventListener("click",()=>{this.active=e}),i[e].replaceWith(r),this.#Lt.push(r)}this.#Rt.addEventListener("keydown",e=>{const t=this.#It;let s=null;"ArrowRight"===e.key?s=(t+1)%this.#Lt.length:"ArrowLeft"===e.key?s=(t-1+this.#Lt.length)%this.#Lt.length:"Home"===e.key?s=0:"End"===e.key&&(s=this.#Lt.length-1),null!==s&&s!==t&&(e.preventDefault(),this.active=s,this.#Lt[s].focus())}),this.replaceChildren(s)}get active(){return this.#It}refresh(e){const t=e instanceof Element?this.#Nt.indexOf(e):Number.isInteger(e)?e:NaN,s=this.#Nt[t];if(s)return this.#Et.request(this,s,null,t)?.then(void 0,()=>{});console.warn(`ful-tabs: no panel answers to "${e}"`)}set active(e){const t=Math.min(Math.max(0,Number(e)||0),Math.max(0,this.#Lt.length-1)),s=this.#It;for(const[e,s]of this.#Lt.entries())s.setAttribute("aria-selected",e===t?"true":"false"),s.tabIndex=e===t?0:-1,this.#Nt[e].hidden=e!==t;this.#It=t,this.reflectTo("active",t),this.rendered&&t!==s&&this.dispatchEvent(new CustomEvent("change",{detail:{active:t,previous:s}})),this.#Nt.length>0&&(t!==s||!this.rendered)&&this.#Et.request(this,this.#Nt[t],null,t)?.catch(()=>{})}}class Ne extends e{static slots=!0;static observed=["exclusive:presence"];static template="\n <ful-accordion-group>{{{{ slots.default }}}}</ful-accordion-group>\n ";#N;#Mt=!1;render({slots:e}){const t=this.template().withOverlay({slots:e}).render();this.#N=t.querySelector("ful-accordion-group"),this.replaceChildren(t)}get exclusive(){return this.#Mt}set exclusive(e){this.#Mt=!0===e,this.reflectTo("exclusive",this.#Mt);const s=this.#Mt?t.uid("ful-accordion"):null;for(const e of this.#N.querySelectorAll(":scope > details"))null===s?e.removeAttribute("name"):e.setAttribute("name",s)}}class Ie extends e{static slots=!0;static observed=["progress"];static template="\n <ful-steps><ol data-tpl-aria-label=\"#l10n:t('wizard.progress')\">{{{{ slots.steps }}}}</ol></ful-steps>\n {{{{ slots.default }}}}\n ";#Ft=[];#Dt=[];#Et=new Ae;#Pt=0;#Bt;render({slots:e}){const t=this.template().withOverlay({slots:e}).render(),s=[...t.querySelector("ful-steps ol").children];this.#Dt=[...t.children].filter(e=>"ful-steps"!==e.localName),s.length!==this.#Dt.length&&console.warn(`ful-wizard: ${s.length} steps declared for ${this.#Dt.length} sections, the surplus is left alone`);const i=Math.min(s.length,this.#Dt.length);this.#Ft=[];for(let e=0;e!==i;++e){const t=document.createElement("li");t.append(...s[e].childNodes),s[e].replaceWith(t),this.#Ft.push(t),this.#Dt[e].tabIndex=-1}if(this.replaceChildren(t),i>0){const e=this.#Dt.findIndex(e=>"step"===e.getAttribute("aria-current"));this.#$t(-1===e?0:Math.min(e,i-1)),this.#Wt(this.#Pt)?.catch(()=>{})}}get index(){return this.#Pt}get step(){return this.#Dt[this.#Pt]?.getAttribute("data-step")??null}get progress(){return this.#Bt}set progress(e){this.#Bt=e,this.reflectTo("progress",e)}next(){return this.#jt(this.#Pt+1)}prev(){return this.#jt(this.#Pt-1)}move(e){const t=this.#Dt.findIndex(t=>t.getAttribute("data-step")===e);if(-1!==t)return this.#jt(t);console.warn(`ful-wizard: no section carries data-step="${e}"`)}refresh(e){const t=e instanceof Element?e:"string"==typeof e?this.#Dt.find(t=>t.getAttribute("data-step")===e):void 0,s=this.#Dt.indexOf(t);if(-1!==s)return this.#Wt(s)?.then(void 0,()=>{});console.warn(`ful-wizard: no section answers to "${e}"`)}#Wt(e){return this.#Et.request(this,this.#Dt[e],this.#Dt[e].getAttribute("data-step"),e)}#jt(e){const t=Math.min(Math.max(0,e),Math.max(0,this.#Ft.length-1));if(t!==this.#Pt)return this.#$t(t),this.#Dt[this.#Pt].focus(),this.rendered&&this.dispatchEvent(new CustomEvent("change",{detail:{index:this.#Pt,step:this.step}})),this.#Wt(t)}#$t(e){for(const[t,s]of this.#Ft.entries())t===e?(s.setAttribute("aria-current","step"),this.#Dt[t].setAttribute("aria-current","step")):(s.removeAttribute("aria-current"),this.#Dt[t].removeAttribute("aria-current"));this.#Pt=e}}const Me={en:{"pagination.showing":"Page {current} of {total}","pagination.navigation":"Page navigation","pagination.previous":"Previous","pagination.next":"Next","pagination.reload":"Reload","table.initial":"Start searching to see results.","table.error":"Error while loading data:","table.no-data":"No elements found.","dropdown.empty":"No results","select.remove":"Remove","files.dropzone-label":"Click or drop your files here","files.remove":"Remove","files.unacceptable-file-type":"Only files of type {types} are supported","files.max-file-size-exceeded":"Maximum supported file size is {size}","files.max-total-size-exceeded":"Maximum supported total file size is {size}","files.max-files-exceeded":{one:"Maximum of {count} file exceeded",other:"Maximum of {count} files exceeded"},"filters.op.EQ":"Equals","filters.op.NEQ":"Not equal","filters.op.LT":"Less than","filters.op.GT":"Greater than","filters.op.LTE":"At most","filters.op.GTE":"At least","filters.op.BETWEEN":"Between","filters.op.CONTAINS":"Contains","filters.op.STARTS_WITH":"Starts with","filters.op.ENDS_WITH":"Ends with","filters.sensitivity.IGNORE_CASE":"Ignore case","filters.sensitivity.CASE_SENSITIVE":"Case sensitive","filters.boolean.any":"Any","filters.boolean.true":"Yes","filters.boolean.false":"No","info.tooltip":"More information","dialog.acknowledge":"Got it","dialog.close":"Close","drawer.close":"Close","spinner.loading":"Loading…","toast.region":"Notifications","toast.dismiss":"Dismiss","wizard.progress":"Progress"},it:{"pagination.showing":"Pagina {current} di {total}","pagination.navigation":"Navigazione pagine","pagination.previous":"Precedente","pagination.next":"Successivo","pagination.reload":"Ricarica","table.initial":"Avvia la ricerca per visualizzare i risultati.","table.error":"Errore nel caricamento dei dati:","table.no-data":"Nessun elemento trovato.","dropdown.empty":"Nessun risultato","select.remove":"Rimuovi","files.dropzone-label":"Clicca o trascina i file qui","files.remove":"Rimuovi","files.unacceptable-file-type":"Solo i file di tipo {types} sono supportati","files.max-file-size-exceeded":"La dimensione massima di un file è di {size}","files.max-total-size-exceeded":"La dimensione massima complessiva dei file è di {size}","files.max-files-exceeded":{other:"Superato il numero massimo di {count} file"},"filters.op.EQ":"Uguale","filters.op.NEQ":"Diverso","filters.op.LT":"Minore","filters.op.GT":"Maggiore","filters.op.LTE":"Al massimo","filters.op.GTE":"Almeno","filters.op.BETWEEN":"Tra","filters.op.CONTAINS":"Contiene","filters.op.STARTS_WITH":"Inizia con","filters.op.ENDS_WITH":"Termina con","filters.sensitivity.IGNORE_CASE":"Ignora maiuscole","filters.sensitivity.CASE_SENSITIVE":"Distingui maiuscole","filters.boolean.any":"Qualsiasi","filters.boolean.true":"Sì","filters.boolean.false":"No","info.tooltip":"Maggiori informazioni","dialog.acknowledge":"Ho capito","dialog.close":"Chiudi","drawer.close":"Chiudi","spinner.loading":"Caricamento…","toast.region":"Notifiche","toast.dismiss":"Chiudi","wizard.progress":"Avanzamento"},es:{"pagination.showing":"Página {current} de {total}","pagination.navigation":"Navegación de páginas","pagination.previous":"Anterior","pagination.next":"Siguiente","pagination.reload":"Recargar","table.initial":"Inicia la búsqueda para ver los resultados.","table.error":"Error al cargar los datos:","table.no-data":"No se encontraron elementos.","dropdown.empty":"Sin resultados","select.remove":"Eliminar","files.dropzone-label":"Haz clic o arrastra tus archivos aquí","files.remove":"Eliminar","files.unacceptable-file-type":"Solo se admiten archivos de tipo {types}","files.max-file-size-exceeded":"El tamaño máximo de archivo admitido es {size}","files.max-total-size-exceeded":"El tamaño total máximo admitido es {size}","files.max-files-exceeded":{other:"Se ha superado el número máximo de {count} archivos"},"filters.op.EQ":"Igual","filters.op.NEQ":"Distinto","filters.op.LT":"Menor","filters.op.GT":"Mayor","filters.op.LTE":"Como máximo","filters.op.GTE":"Al menos","filters.op.BETWEEN":"Entre","filters.op.CONTAINS":"Contiene","filters.op.STARTS_WITH":"Empieza por","filters.op.ENDS_WITH":"Termina por","filters.sensitivity.IGNORE_CASE":"Ignorar mayúsculas","filters.sensitivity.CASE_SENSITIVE":"Distinguir mayúsculas","filters.boolean.any":"Cualquiera","filters.boolean.true":"Sí","filters.boolean.false":"No","info.tooltip":"Más información","dialog.acknowledge":"Entendido","dialog.close":"Cerrar","drawer.close":"Cerrar","spinner.loading":"Cargando…","toast.region":"Notificaciones","toast.dismiss":"Cerrar","wizard.progress":"Progreso"},fr:{"pagination.showing":"Page {current} sur {total}","pagination.navigation":"Navigation des pages","pagination.previous":"Précédent","pagination.next":"Suivant","pagination.reload":"Recharger","table.initial":"Lancez la recherche pour voir les résultats.","table.error":"Erreur lors du chargement des données :","table.no-data":"Aucun élément trouvé.","dropdown.empty":"Aucun résultat","select.remove":"Retirer","files.dropzone-label":"Cliquez ou déposez vos fichiers ici","files.remove":"Retirer","files.unacceptable-file-type":"Seuls les fichiers de type {types} sont pris en charge","files.max-file-size-exceeded":"La taille maximale de fichier prise en charge est {size}","files.max-total-size-exceeded":"La taille totale maximale prise en charge est {size}","files.max-files-exceeded":{one:"Nombre maximal de {count} fichier dépassé",other:"Nombre maximal de {count} fichiers dépassé"},"filters.op.EQ":"Égal","filters.op.NEQ":"Différent","filters.op.LT":"Inférieur","filters.op.GT":"Supérieur","filters.op.LTE":"Au plus","filters.op.GTE":"Au moins","filters.op.BETWEEN":"Entre","filters.op.CONTAINS":"Contient","filters.op.STARTS_WITH":"Commence par","filters.op.ENDS_WITH":"Finit par","filters.sensitivity.IGNORE_CASE":"Ignorer la casse","filters.sensitivity.CASE_SENSITIVE":"Respecter la casse","filters.boolean.any":"Indifférent","filters.boolean.true":"Oui","filters.boolean.false":"Non","info.tooltip":"Plus d’informations","dialog.acknowledge":"J’ai compris","dialog.close":"Fermer","drawer.close":"Fermer","spinner.loading":"Chargement…","toast.region":"Notifications","toast.dismiss":"Fermer","wizard.progress":"Progression"}};class Fe{#Ht;#Gt;#Ut;constructor(e={}){this.#Ht=e.language??navigator?.language??"en",this.#Gt=e.translations??{},this.#Ut=e.httpClient??null}configure(e){const t=this.#Ut??u.builder().withCsrfToken().withRedirectOnUnauthorized("/").build(),i=this.#Ht.split("-")[0],r={...Me.en,...Me[i],...this.#Gt};e.defineModule("l10n",s).defineComponent("http-client",t).defineElement("ful-tooltip",qe).defineElement("ful-dialog",Te).defineElement("ful-drawer",Ce).defineElement("ful-toasts",Re).defineElement("ful-tabs",Le).defineElement("ful-accordion",Ne).defineElement("ful-wizard",Ie).defineElement("ful-form",_).defineElement("ful-checkbox",Y).defineElement("ful-input",k).defineElement("ful-input-file",I).defineElement("ful-local-date",z).defineElement("ful-instant",O).defineElement("ful-input-local-date",R).defineElement("ful-input-local-time",L).defineElement("ful-input-instant",N).defineElement("ful-radio-group",J).defineElement("ful-table",re).defineElement("ful-pagination",Z).defineElement("ful-sorter",X).defineElement("ful-filter-instant",ge).defineElement("ful-filter-local-date",be).defineElement("ful-filter-number",ve).defineElement("ful-filter-boolean",xe).defineElement("ful-filter-text",ye).defineElement("ful-select",K).defineElement("ful-dropdown",V).defineComponent("loaders:select",Q).defineComponent("loaders:form",S).defineComponent("loaders:table",ie).defineOverlay({l10n:r,locale:this.#Ht})}}export{Ne as Accordion,j as Anchors,g as AsyncEvents,w as Bindings,xe as BooleanFilter,Y as Checkbox,b as Claims,me as CompareFilter,Te as Dialog,Ce as Drawer,V as Dropdown,E as Field,_ as Form,S as FormLoader,k as Input,I as InputFile,N as InputInstant,R as InputLocalDate,L as InputLocalTime,O as Instant,ge as InstantFilter,z as LocalDate,be as LocalDateFilter,h as LocalStorage,ve as NumberFilter,Z as Pagination,Fe as Plugin,J as RadioGroup,K as Select,Q as SelectLoader,p as SessionStorage,X as SortButton,re as Table,ie as TableLoader,ee as TableSchemaParser,Le as Tabs,ye as TextFilter,y as Timing,Re as Toasts,qe as Tooltip,f as VersionedLocalStorage,m as VersionedSessionStorage,Ie as Wizard,v as describable};
2
2
  //# sourceMappingURL=ful.min.mjs.map