@optionfactory/ful 0.52.0 → 0.54.0

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.
package/dist/ful.min.mjs CHANGED
@@ -1,2 +1,2 @@
1
- class t{static encode(e,s){const r=s||t.URL_SAFE,i=e.byteLength,n=new Uint8Array(e);let a="";for(let t=0;t<i;t+=3){a+=r[n[t]>>2]+r[(3&n[t])<<4|n[t+1]>>4]+r[(15&n[t+1])<<2|n[t+2]>>6]+r[63&n[t+2]]}return i%3==2?a=a.substring(0,a.length-1):i%3==1&&(a=a.substring(0,a.length-2)),a}static decode(e,s){const r=s||t.URL_SAFE;let i=Math.floor(.75*e.length);for(let t=0;t!==e.length&&"="===e[e.length-t-1];++t)--i;const n=new Uint8Array(i);let a=0,o=0;for(;a<.75*e.length;){const t=r.indexOf(e.charAt(o++)),s=r.indexOf(e.charAt(o++)),i=r.indexOf(e.charAt(o++)),c=r.indexOf(e.charAt(o++));n[a++]=t<<2|s>>4,n[a++]=(15&s)<<4|i>>2,n[a++]=(3&i)<<6|c}return n.buffer}}t.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class e{static decode(t){if(t.length%2!=0)throw new Error("invalid length");const e=t.length/2;return new Uint8Array(e).map(((e,s)=>{const r=2*s,i=t.substring(r,r+2);return parseInt(i,16)}))}static encode(t,e){return Array.from(t).map((t=>t.toString(16))).map((t=>e?t.toUpperCase():t)).map((t=>t.padStart(2,0))).join("")}}class s{constructor(){const t=document.querySelector("meta[name='context']").getAttribute("content");this.context=t.endsWith("/")?t.substring(0,t.length-1):t}async intercept(t,e){const s=t.resource.startsWith("/")?"":"/";return t.resource=this.context+s+t.resource,await e.proceed(t)}}class r{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(t,e){const s=new Headers(t.options.headers);return s.set(this.k,this.v),t.options.headers=s,await e.proceed(t)}}class i{constructor(t){this.redirectUri=t}async intercept(t,e){const s=await e.proceed(t);if(401!==s.status)return s;window.location.href=this.redirectUri}}class n extends Error{static parseProblems(t,e){const s=[{type:"GENERIC_PROBLEM",context:null,reason:`${t}: ${e}`,details:null}];try{return e?JSON.parse(e):s}catch(t){return s}}static fromResponse(t,e){return new n(t,n.parseProblems(t,e))}constructor(t,e){super(JSON.stringify(e)),this.name=`Failure:${t}`,this.status=t,this.problems=e}}class a{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new s),this}withCsrfToken(){return this.interceptors.push(new r),this}withRedirectOnUnauthorized(t){return this.interceptors.push(new i(t)),this}withInterceptors(...t){return this.interceptors.push(...t),this}build(){const t=this.interceptors;return new l({interceptors:t})}}class o{async intercept(t,e){return await fetch(t.resource,t.options)}}class c{constructor(t,e){this.interceptors=t,this.current=e}async proceed(t){const e=this.interceptors[this.current];return await e.intercept(t,new c(this.interceptors,this.current+1))}}class l{static builder(){return new a}constructor({interceptors:t}){this.interceptors=t||[]}async exchange(t,e){const s=e||{},r=[...this.interceptors,...s.interceptors||[],new o],i=new c(r,0);return await i.proceed({resource:t,options:s})}async fetch(t,e){const s=await this.exchange(t,e);if(!s.ok){const t=await s.text();throw n.fromResponse(s.status,t)}return s}async json(t,e){try{const s=await this.fetch(t,e),r=await s.text();return r?JSON.parse(r):void 0}catch(t){if(t instanceof n)throw t;throw new n(0,[{type:"CONNECTION_PROBLEM",context:null,reason:t.message,details:null}])}}}function u(t,e,s){return{headers:{"Content-Type":"application/json",...s},method:t,body:JSON.stringify(e)}}function d(t,e){return u("POST",t,e)}function h(t,e){return u("PUT",t,e)}function p(t,e){return u("PATCH",t,e)}class f{constructor(t,e){this.prefix=t,this.storage=e}save(t,e){this.storage.setItem(`${this.prefix}-${t}`,JSON.stringify(e))}load(t){const e=this.storage.getItem(`${this.prefix}-${t}`);return void 0===e?void 0:JSON.parse(e)}remove(t){this.storage.removeItem(`${this.prefix}-${t}`)}pop(t){const e=this.load(t);return this.remove(t),e}}class m extends f{constructor(t){super(t,localStorage)}}class g extends f{constructor(t){super(t,sessionStorage)}}class b{constructor(t,e,s){this.storage=t,this.key=e,this.dataSupplier=s,this.cache=null}async load(t){const e=this.storage.load(this.key);if(e&&e.revision===t)return void(this.cache=e.value);const s=await this.dataSupplier(t,this.key);this.storage.save(this.key,{revision:t,value:s}),this.cache=s}data(){return this.cache}}class w{static forKeycloak(t,e,s){return new w(t,"openid profile",{auth:new URL("protocol/openid-connect/auth",e),token:new URL("protocol/openid-connect/token",e),logout:new URL("protocol/openid-connect/logout",e),registration:new URL("protocol/openid-connect/registrations",e),redirect:s})}constructor(t,e,{auth:s,token:r,registration:i,logout:n,redirect:a}){this.storage=new g(t),this.clientId=t,this.scope=e,this.uri={auth:s,token:r,registration:i,logout:n,redirect:a}}async action(e,s){const r=t.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),i=t.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(r))),n=this.clientId+t.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(w.PKCE_AND_STATE_KEY,{state:n,verifier:r});const a=new URL(e);a.searchParams.set("client_id",this.clientId),a.searchParams.set("redirect_uri",this.uri.redirect),a.searchParams.set("response_type","code"),a.searchParams.set("scope",this.scope),a.searchParams.set("state",n),a.searchParams.set("code_challenge",i),a.searchParams.set("code_challenge_method","S256"),Object.entries(s||{}).forEach((t=>{a.searchParams.set(t[0],t[1])})),window.location=a}async registration(t){await this.action(this.uri.registration,t)}async applicationInitiatedAction(t){await this.action(this.uri.auth,{kc_action:t})}async _tokenExchange(t,e){window.history.replaceState("","",this.uri.redirect);const s=this.storage.pop(w.PKCE_AND_STATE_KEY);if(s.state!==e)throw new Error("State mismatch");const r=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",t],["grant_type","authorization_code"],["code_verifier",s.verifier],["state",s.state],["redirect_uri",this.uri.redirect]])});if(!r.ok){const t=await r.text();throw new Error("Error:"+r.status+": "+t)}const i=await r.json();return new v(this.clientId,i,this.uri)}async ensureLoggedIn(){const t=new URL(window.location.href),e=t.searchParams.get("code");if(e&&this.storage.load(w.PKCE_AND_STATE_KEY)){const s=t.searchParams.get("state");return await this._tokenExchange(e,s)}return await this.action(this.uri.auth,{}),null}}w.PKCE_AND_STATE_KEY="state-and-verifier";class v{static parseToken(e){const[s,r,i]=e.split("."),n=new TextDecoder("utf-8");return{header:JSON.parse(n.decode(t.decode(s,t.STANDARD))),payload:JSON.parse(n.decode(t.decode(r,t.STANDARD))),signature:i}}constructor(t,e,{token:s,logout:r,redirect:i}){this.clientId=t,this.token=e,this.accessToken=v.parseToken(e.access_token),this.refreshToken=v.parseToken(e.refresh_token),this.uri={token:s,logout:r,redirect:i},this.refreshCallback=null}onRefresh(t){this.refreshCallback=t}async refresh(){const t=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!t.ok)throw new Error("Error:"+t.status+": "+t.text());const e=await t.json();this.token=e,this.accessToken=v.parseToken(e.access_token),this.refreshToken=v.parseToken(e.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(t){const e=(new Date).getTime(),s=1e3*this.refreshToken.payload.exp;return!(e>s)&&e-t>s}async refreshIf(t){this.shouldBeRefreshed(t)&&await this.refresh()}logout(){const t=new URL(this.uri.logout);t.searchParams.set("post_logout_redirect_uri",this.uri.redirect),t.searchParams.set("id_token_hint",this.token.id_token),window.location=t}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(t,e){return new E(this,t,e)}}class E{constructor(t,e,s){this.session=t,this.gracePeriodBefore=e||2e3,this.gracePeriodAfter=s||3e4}async intercept(t,e){await this.session.refreshIf(this.gracePeriodBefore);const s=new Headers(t.options.headers);s.set("Authorization",this.session.bearerToken()),t.options.headers=s;const r=await e.proceed(t);return await this.session.refreshIf(this.gracePeriodAfter),r}}const T={sleep:t=>new Promise((e=>setTimeout(e,t))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(t,e,s){let r=null,i=[],n=0,a=s||T.DEBOUNCE_DEFAULT;const o=()=>{const s=(new Date).getTime()-n;t>s?r=setTimeout(o,t-s):(r=null,a!==T.DEBOUNCE_IMMEDIATE&&e(...i),null===r&&(i=[]))};return function(){i=arguments,n=(new Date).getTime(),null===r&&(r=setTimeout(o,t),a===T.DEBOUNCE_IMMEDIATE&&e(...i))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(t,e,s){let r=null,i=[],n=0,a=s||T.THROTTLE_DEFAULT;const o=()=>{n=a&T.THROTTLE_NO_LEADING?0:(new Date).getTime(),r=null,e(...i),null===r&&(i=[])};return function(){const s=(new Date).getTime();!n&&a&T.THROTTLE_NO_LEADING&&(n=s);const c=t-(s-n);i=arguments,c<=0||c>t?(null!==r&&(clearTimeout(r),r=null),n=s,e(...i),null===r&&(i=[])):null!==r||a&T.THROTTLE_NO_TRAILING||(r=setTimeout(o,c))}}};class y extends CustomEvent{#t;constructor(t,e){super(t,{...e,cancelable:!0}),this.#t=[]}async dispatchTo(t){t.dispatchEvent(this);const e=await Promise.all(this.#t);return[!this.defaultPrevented,e]}static on(t,e,s,r){t.addEventListener(e,(t=>{t.#t.push(s(t))}),r)}}class A{static fromHtml(...t){const e=document.createElement("div");e.innerHTML=t.join("");const s=new DocumentFragment;return s.append(...e.childNodes),s}static toHtml(t){var e=document.createElement("div");return e.appendChild(t),e.innerHTML}static from(...t){const e=new DocumentFragment;return e.append(...t),e}static fromChildNodes(t){const e=new DocumentFragment;return e.append(...t.childNodes),e}}class L{static id=0;static uid(t){return`${t}-${++L.id}`}static asBoolean(t){return null!=t&&!1!==t}static defaultValue(t,e,s){return t.hasAttribute(e)||t.setAttribute(e,s),t.getAttribute(e)}static forward(t,e,s){e.getAttributeNames().filter((e=>e.startsWith(t))).forEach((r=>{const i=r.substring(t.length);"class"!==i?s.setAttribute(i,e.getAttribute(r)):s.classList.add(...e.getAttribute(t+"class").split(" ").filter((t=>t.length)))}))}}class _{static from(t){const e=Array.from(t.childNodes).filter((t=>t.matches&&t.matches("[slot]"))).map((t=>{t.remove();const e=t.getAttribute("slot");return t.removeAttribute("slot"),[e,t]})),s=Object.fromEntries(e);return s.default=new DocumentFragment,s.default.append(...t.childNodes),s}}class S{static isParsed(t){for(var e=t;e;e=e.parentNode)if(e.nextSibling)return!0;return!1}}class k{#e={};#s={};#r;put(t,e){this.#r?this.#s[t]=Template.fromFragment(e,ec):this.#e[t]=e}get(t){if(!this.#r)throw new Error("TemplatesRegistry is not configured");const e=this.#s[t];if(!e)throw new Error(`missing template: '${t}'`);return e}configure(t){this.#r=t;for(const[e,s]of Object.entries(this.#e))delete this.#e[e],this.#s[e]=ftl.Template.fromFragment(s,t)}}class O{#i;#n;#a;#o=0;constructor(){this.#i=new k,this.#n={}}defineTemplate(t){if(null==t)return;const e="unnamed-"+ ++this.#o;return this.#i.put(e,A.fromHtml(t)),e}template(t){if(null!=t)return this.#i.get(t)}define(t,e){return this.#a?(customElements.define(t,e),this):(this.#n[t]=e,this)}configure(t){this.#i.configure(t);for(const[t,e]of Object.entries(this.#n))customElements.define(t,e),delete this.#n[t];this.#a=!0}}const R=new O;const C=new class{#c=[];constructor(){document.addEventListener("DOMContentLoaded",this.dequeue.bind(this))}enqueue(t){this.#c.length||requestAnimationFrame(this.dequeue.bind(this)),this.#c.push(t)}dequeue(){this.#c.splice(0).forEach((t=>t.upgrade()))}},x=t=>{const{states:e,attributes:s,template:r,slots:i}=t||{},n=e||[],a=s||[],o=[].concat(n).concat(a),c=R.defineTemplate(r),l=class extends HTMLElement{static get observedAttributes(){return o}#l;#u;#d;constructor(...t){super(...t),this.#d=this.attachInternals()}get initialized(){return this.#u}get internals(){return this.#d}connectedCallback(){if(this.#l)return;if("complete"===this.ownerDocument.readyState||S.isParsed(this))return void C.enqueue(this);this.ownerDocument.addEventListener("DOMContentLoaded",(()=>{t.disconnect(),C.enqueue(this)}));const t=new MutationObserver((()=>{S.isParsed(this)&&(t.disconnect(),C.enqueue(this))}));t.observe(this.parentNode,{childList:!0,subtree:!0})}attributeChangedCallback(t,e,s){this.#l&&e!==s&&(this[t]=s)}async upgrade(){if(!this.#l){this.#l=!0,await this.render(R.template(c),i?_.from(this):void 0);for(const t of n)this.hasAttribute(t)&&(this[t]=!0);for(const t of a)this.hasAttribute(t)&&(this[t]=this.getAttribute(t));this.#u=!0}}};for(const t of n)Object.defineProperty(l.prototype,t,{enumerable:!0,configurable:!0,get(){return this.internals.states.has(`--${t}`)},set(e){const s=L.asBoolean(e),r=this.initialized?"changed":"init",i=new y(`${t}:${r}`,{detail:{target:this,value:s}});(async()=>{const[e,r]=await i.dispatchTo(this);e&&this.internals.states[s?"add":"delete"](`--${t}`)})()}});return l};function I(t,e){return Object.keys(t).reduce(((s,r)=>{const i=e.length?e+".":"";return"object"==typeof t[r]&&null!==t[r]?Object.assign(s,I(t[r],i+r)):s[i+r]=t[r],s}),{})}function N(t,e){"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.value=e:t.checked=e:t.checked=t.getAttribute("value")===e}class D extends(x()){static IGNORED_CHILDREN_SELECTOR=".d-none, [hidden]";static SCROLL_OFFSET=50;render(){const t=document.createElement("form");t.replaceChildren(...this.childNodes),t.addEventListener("submit",(async t=>{t.preventDefault(),this.spinner(!0);try{this.submitter&&await this.submitter(this.values,this)}catch(t){if(t instanceof n)return void(this.errors=t.problems);throw t}finally{this.spinner(!1)}})),this.replaceChildren(t)}spinner(t){this.querySelectorAll("ful-spinner").forEach((e=>e.hidden=!t)),this.querySelectorAll("[type=submit],[type=reset]").forEach((e=>e.disabled=t))}set values(t){for(const[e,s]of Object.entries(I(t,"")))this.querySelectorAll(`[name='${CSS.escape(e)}']`).forEach((t=>N(t,s)))}get values(){return Array.from(this.querySelectorAll("[name]")).filter((t=>"never"!==t.dataset.fulBindInclude&&("always"===t.dataset.fulBindInclude||null===t.closest(D.IGNORED_CHILDREN_SELECTOR)))).reduce(((t,e)=>function(t,e,s){const r=e.split(".").map((t=>t.match(/^[0-9]+$/)?+t:t));let i=t,n=null;for(let e=0;;++e){const a=r[e],o=r[e-1];if(Number.isInteger(a)&&!Array.isArray(i)&&(null!==n?n[o]=i=[]:t=i=[]),e===r.length-1)return i[a]=void 0!==s?s:a in i?i[a]:null,t;void 0===i[a]&&(i[a]={}),n=i,i=i[a]}}(t,e.getAttribute("name"),function(t){if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.fulBindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.fulBindType?t.value?"true"===t.value:null:t.value||null}(e))),{})}set errors(t){const e=t.filter((t=>"FIELD_ERROR"===t.type||"INVALID_FORMAT"===t.type)),s=t.filter((t=>"FIELD_ERROR"!==t.type&&"INVALID_FORMAT"!==t.type));if(this.querySelectorAll(".is-invalid").forEach((t=>t.classList.remove("is-invalid"))),this.querySelectorAll("ful-errors").forEach((t=>{t.replaceChildren(),t.setAttribute("hidden","")})),e.forEach((t=>{const e=t.context.replace("[",".").replace("].","."),s=`[name='${CSS.escape(e)}'] [ful-validation-target],[name='${CSS.escape(e)}']:not(:has([ful-validation-target]))`;this.querySelectorAll(s).forEach((t=>t.classList.add("is-invalid")));const r=`ful-field-error[field='${CSS.escape(e)}']`;this.querySelectorAll(r).forEach((e=>e.innerText=t.reason))})),this.querySelectorAll("ful-errors").forEach((t=>{t.innerText=s.map((t=>t.reason)).join("\n"),0!==s.length&&t.removeAttribute("hidden")})),!this.hasAttribute("scroll-on-error"))return;const r=Array.from(this.querySelectorAll("ful-field-error")).map((t=>t.parentElement?t.parentElement:t)).map((t=>t.getBoundingClientRect().y+window.scrollY)),i=Math.min(...r);i!==1/0&&window.scroll(window.scrollX,i>D.SCROLL_OFFSET?i-D.SCROLL_OFFSET:0)}}const P='\n<label data-tpl-for="id" class="form-label">{{{{ slots.default }}}}</label>\n<div class="input-group">\n <span data-tpl-if="slots.ibefore" class="input-group-text">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if="slots.before" data-tpl-remove="tag">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if="slots.after" data-tpl-remove="tag">{{{{ slots.after }}}}</div>\n <span data-tpl-if="slots.iafter" class="input-group-text">{{{{ slots.iafter }}}}</span>\n</div>\n<ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error>\n',q=(t,e,s)=>{const r=t.input=s.input=s.input||(()=>{const t=document.createElement("input");return t.classList.add("form-control"),t})();r.setAttribute("ful-validation-target","");const i=r.getAttribute("id")||t.getAttribute("input-id")||L.uid("ful-input");L.forward("input-",t,s.input),L.defaultValue(s.input,"id",i),L.defaultValue(s.input,"type","text"),L.defaultValue(s.input,"placeholder"," ");const n=t.getAttribute("name");return e.render(t,{id:i,name:n,slots:s})};class U extends(x({states:[],attributes:["value"],slots:!0,template:P})){render(t,e){const s=q(this,t,e);this.replaceChildren(s)}get value(){return this.input.value}set value(t){this.input.value=t}}class F extends(x({states:[],attributes:["value"],slots:!0,template:'\n <label data-tpl-for="tsId" class="form-label">{{{{ slots.default }}}}</label>\n {{{{ input }}}}\n <div class="input-group">\n <span data-tpl-if="slots.ibefore" class="input-group-text">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if="slots.before" data-tpl-remove="tag">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if="slots.after" data-tpl-remove="tag">{{{{ slots.after }}}}</div>\n <span data-tpl-if="slots.iafter" class="input-group-text">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error> \n '})){constructor(t){super(),this.tsConfig=t}render(t,e){const s="local"!=(this.getAttribute("type")||"local"),r="always"!=this.getAttribute("load"),i=this.getAttribute("name"),n=e.input=e.input||document.createElement("select");n.setAttribute("ful-validation-target","");const a=n.getAttribute("id")||this.getAttribute("input-id")||L.uid("ful-select"),o=`${a}-ts-control`;L.forward("input-",this,n),L.defaultValue(n,"id",a),L.defaultValue(n,"placeholder"," "),e.input=A.from(n),this.loaded=!s;this._remote=s,this._unwrappedRemoteLoad=async(t,e)=>{if(!s||s&&r&&this.loaded)return void e();const i=t&&t.hasOwnProperty("byId")?"id":"query",n="id"===i?t.byId:t,a=await(this.#h?this.#h(n,i):[]);"id"!==i&&(this.loaded=!0),e(a)},this.ts=new TomSelect(n,Object.assign(s?{preload:"focus",load:this._unwrappedRemoteLoad,shouldLoad:t=>!this.shouldLoad||this.shouldLoad(t)}:{},{render:{loading:()=>'<ful-spinner class="centered p-2"></ful-spinner>'}},this.tsConfig)),n.remove(),t.renderTo(this,{id:a,tsId:o,name:i,input:n,slots:e})}#h;set loader(t){this.#h=t,this.hasAttribute("value")&&(this.value=this.getAttribute("value"))}set value(t){(async()=>{this._remote&&await this._unwrappedRemoteLoad({byId:t},this.ts.loadCallback.bind(this.ts)),this.ts.setValue(t)})()}get value(){const t=this.ts.getValue();return""===t?null:t}}class $ extends(x({states:["disabled"],attributes:["value"],slots:!0,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 <label data-tpl-each="inputsAndLabels" data-tpl-var="ial">\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </section>\n <ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error>\n <footer data-tpl-if="slots.footer">\n {{{{ slots.footer }}}}\n </footer>\n </fieldset>\n '})){render(t,e){const s=this.getAttribute("name")||L.uid("ful-radiogroup"),r=Array.from(e.default.querySelectorAll("ful-radio")),i=r.map((t=>{const e=document.createElement("input");e.setAttribute("type","radio"),L.forward("input-",this,e),L.forward("",t,e),e.setAttribute("name",`${s}-ignore`),e.setAttribute("ful-validation-target",""),e.dataset.fulBindInclude="never";return[e,A.fromChildNodes(t)]}));r.forEach((t=>t.remove())),t.renderTo(this,{name:s,slots:e,inputsAndLabels:i})}get value(){const t=this.querySelector("input[type=radio]:checked");return t?t.value:null}set value(t){this.querySelector(`input[type=radio][value=${CSS.escape(t)}]`).checked=!0}}class B extends(x({slots:!0,template:'\n <div class="ful-spinner-wrapper">\n <div class="ful-spinner-text">{{{{ slots.default }}}}</div>\n <div class="ful-spinner-icon"></div>\n </div>\n '})){render(t,e){t.renderTo(this,{slots:e})}}class H extends HTMLElement{constructor(){if(super(),this.progress=[...this.children].filter((t=>t.matches("header,ol,ul"))),this.progress.forEach((t=>{const e=[...t.children];void 0===e.filter((t=>t.matches(".active")))[0]&&e.length>0&&e[0].classList.add("active")})),null===this.querySelector("section.current")){const t=this.querySelector("section:first-of-type");null!==t&&t.classList.add("current")}}next(){this.progress.forEach((t=>{const e=[...t.children].filter((t=>t.matches(".active")))[0];e?.classList.remove("active"),e?.nextElementSibling?.classList.add("active")}));const t=this.querySelector("section.current");t.classList.remove("current"),t.nextElementSibling.classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}prev(){this.progress.forEach((t=>{const e=[...t.children].filter((t=>t.matches(".active")))[0];e?.classList.remove("active"),e?.previousElementSibling?.classList.add("active")}));const t=this.querySelector("section.current");t.classList.remove("current"),t.previousElementSibling.classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}moveTo(t){this.progress.forEach((e=>{const s=[...e.children].filter((t=>t.matches(".active")))[0];s?.classList.remove("active"),e.children[+t]?.classList.add("active")}));const e=this.querySelector("section.current");e?.classList.remove("current");this.querySelector(`section:nth-child(${+t})`).classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}static configure(){return H.custom("ful-wizard")}}export{L as Attributes,w as AuthorizationCodeFlow,E as AuthorizationCodeFlowInterceptor,v as AuthorizationCodeFlowSession,t as Base64,O as ElementsRegistry,n as Failure,D as Form,A as Fragments,e as Hex,l as HttpClient,P as INPUT_TEMPLATE,U as Input,_ as LightSlots,m as LocalStorage,S as Nodes,x as ParsedElement,$ as RadioGroup,F as Select,g as SessionStorage,B as Spinner,y as SyncEvent,k as TemplatesRegistry,b as VersionedStorage,H as Wizard,R as elements,p as jsonPatch,d as jsonPost,h as jsonPut,u as jsonRequest,q as makeInputFragment,T as timing};
1
+ class t{static encode(e,s){const r=s||t.URL_SAFE,n=e.byteLength,i=new Uint8Array(e);let a="";for(let t=0;t<n;t+=3){a+=r[i[t]>>2]+r[(3&i[t])<<4|i[t+1]>>4]+r[(15&i[t+1])<<2|i[t+2]>>6]+r[63&i[t+2]]}return n%3==2?a=a.substring(0,a.length-1):n%3==1&&(a=a.substring(0,a.length-2)),a}static decode(e,s){const r=s||t.URL_SAFE;let n=Math.floor(.75*e.length);for(let t=0;t!==e.length&&"="===e[e.length-t-1];++t)--n;const i=new Uint8Array(n);let a=0,o=0;for(;a<.75*e.length;){const t=r.indexOf(e.charAt(o++)),s=r.indexOf(e.charAt(o++)),n=r.indexOf(e.charAt(o++)),c=r.indexOf(e.charAt(o++));i[a++]=t<<2|s>>4,i[a++]=(15&s)<<4|n>>2,i[a++]=(3&n)<<6|c}return i.buffer}}t.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class e{static decode(t){if(t.length%2!=0)throw new Error("invalid length");const e=t.length/2;return new Uint8Array(e).map(((e,s)=>{const r=2*s,n=t.substring(r,r+2);return parseInt(n,16)}))}static encode(t,e){return Array.from(t).map((t=>t.toString(16))).map((t=>e?t.toUpperCase():t)).map((t=>t.padStart(2,0))).join("")}}class s{constructor(){const t=document.querySelector("meta[name='context']").getAttribute("content");this.context=t.endsWith("/")?t.substring(0,t.length-1):t}async intercept(t,e){const s=t.resource.startsWith("/")?"":"/";return t.resource=this.context+s+t.resource,await e.proceed(t)}}class r{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(t,e){const s=new Headers(t.options.headers);return s.set(this.k,this.v),t.options.headers=s,await e.proceed(t)}}class n{constructor(t){this.redirectUri=t}async intercept(t,e){const s=await e.proceed(t);if(401!==s.status)return s;window.location.href=this.redirectUri}}class i extends Error{static parseProblems(t,e){const s=[{type:"GENERIC_PROBLEM",context:null,reason:`${t}: ${e}`,details:null}];try{return e?JSON.parse(e):s}catch(t){return s}}static fromResponse(t,e){return new i(t,i.parseProblems(t,e))}constructor(t,e){super(JSON.stringify(e)),this.name=`Failure:${t}`,this.status=t,this.problems=e}}class a{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new s),this}withCsrfToken(){return this.interceptors.push(new r),this}withRedirectOnUnauthorized(t){return this.interceptors.push(new n(t)),this}withInterceptors(...t){return this.interceptors.push(...t),this}build(){const t=this.interceptors;return new l({interceptors:t})}}class o{async intercept(t,e){return await fetch(t.resource,t.options)}}class c{constructor(t,e){this.interceptors=t,this.current=e}async proceed(t){const e=this.interceptors[this.current];return await e.intercept(t,new c(this.interceptors,this.current+1))}}class l{static builder(){return new a}constructor({interceptors:t}){this.interceptors=t||[]}async exchange(t,e){const s=e||{},r=[...this.interceptors,...s.interceptors||[],new o],n=new c(r,0);return await n.proceed({resource:t,options:s})}async fetch(t,e){const s=await this.exchange(t,e);if(!s.ok){const t=await s.text();throw i.fromResponse(s.status,t)}return s}async json(t,e){try{const s=await this.fetch(t,e),r=await s.text();return r?JSON.parse(r):void 0}catch(t){if(t instanceof i)throw t;throw new i(0,[{type:"CONNECTION_PROBLEM",context:null,reason:t.message,details:null}])}}}function u(t,e,s){return{headers:{"Content-Type":"application/json",...s},method:t,body:JSON.stringify(e)}}function d(t,e){return u("POST",t,e)}function h(t,e){return u("PUT",t,e)}function p(t,e){return u("PATCH",t,e)}class f{constructor(t,e){this.prefix=t,this.storage=e}save(t,e){this.storage.setItem(`${this.prefix}-${t}`,JSON.stringify(e))}load(t){const e=this.storage.getItem(`${this.prefix}-${t}`);return void 0===e?void 0:JSON.parse(e)}remove(t){this.storage.removeItem(`${this.prefix}-${t}`)}pop(t){const e=this.load(t);return this.remove(t),e}}class m extends f{constructor(t){super(t,localStorage)}}class g extends f{constructor(t){super(t,sessionStorage)}}class b{constructor(t,e,s){this.storage=t,this.key=e,this.dataSupplier=s,this.cache=null}async load(t){const e=this.storage.load(this.key);if(e&&e.revision===t)return void(this.cache=e.value);const s=await this.dataSupplier(t,this.key);this.storage.save(this.key,{revision:t,value:s}),this.cache=s}data(){return this.cache}}class w{static forKeycloak(t,e,s){return new w(t,"openid profile",{auth:new URL("protocol/openid-connect/auth",e),token:new URL("protocol/openid-connect/token",e),logout:new URL("protocol/openid-connect/logout",e),registration:new URL("protocol/openid-connect/registrations",e),redirect:s})}constructor(t,e,{auth:s,token:r,registration:n,logout:i,redirect:a}){this.storage=new g(t),this.clientId=t,this.scope=e,this.uri={auth:s,token:r,registration:n,logout:i,redirect:a}}async action(e,s){const r=t.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),n=t.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(r))),i=this.clientId+t.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(w.PKCE_AND_STATE_KEY,{state:i,verifier:r});const a=new URL(e);a.searchParams.set("client_id",this.clientId),a.searchParams.set("redirect_uri",this.uri.redirect),a.searchParams.set("response_type","code"),a.searchParams.set("scope",this.scope),a.searchParams.set("state",i),a.searchParams.set("code_challenge",n),a.searchParams.set("code_challenge_method","S256"),Object.entries(s||{}).forEach((t=>{a.searchParams.set(t[0],t[1])})),window.location=a}async registration(t){await this.action(this.uri.registration,t)}async applicationInitiatedAction(t){await this.action(this.uri.auth,{kc_action:t})}async _tokenExchange(t,e){window.history.replaceState("","",this.uri.redirect);const s=this.storage.pop(w.PKCE_AND_STATE_KEY);if(s.state!==e)throw new Error("State mismatch");const r=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",t],["grant_type","authorization_code"],["code_verifier",s.verifier],["state",s.state],["redirect_uri",this.uri.redirect]])});if(!r.ok){const t=await r.text();throw new Error("Error:"+r.status+": "+t)}const n=await r.json();return new E(this.clientId,n,this.uri)}async ensureLoggedIn(){const t=new URL(window.location.href),e=t.searchParams.get("code");if(e&&this.storage.load(w.PKCE_AND_STATE_KEY)){const s=t.searchParams.get("state");return await this._tokenExchange(e,s)}return await this.action(this.uri.auth,{}),null}}w.PKCE_AND_STATE_KEY="state-and-verifier";class E{static parseToken(e){const[s,r,n]=e.split("."),i=new TextDecoder("utf-8");return{header:JSON.parse(i.decode(t.decode(s,t.STANDARD))),payload:JSON.parse(i.decode(t.decode(r,t.STANDARD))),signature:n}}constructor(t,e,{token:s,logout:r,redirect:n}){this.clientId=t,this.token=e,this.accessToken=E.parseToken(e.access_token),this.refreshToken=E.parseToken(e.refresh_token),this.uri={token:s,logout:r,redirect:n},this.refreshCallback=null}onRefresh(t){this.refreshCallback=t}async refresh(){const t=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!t.ok)throw new Error("Error:"+t.status+": "+t.text());const e=await t.json();this.token=e,this.accessToken=E.parseToken(e.access_token),this.refreshToken=E.parseToken(e.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(t){const e=(new Date).getTime(),s=1e3*this.refreshToken.payload.exp;return!(e>s)&&e-t>s}async refreshIf(t){this.shouldBeRefreshed(t)&&await this.refresh()}logout(){const t=new URL(this.uri.logout);t.searchParams.set("post_logout_redirect_uri",this.uri.redirect),t.searchParams.set("id_token_hint",this.token.id_token),window.location=t}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(t,e){return new y(this,t,e)}}class y{constructor(t,e,s){this.session=t,this.gracePeriodBefore=e||2e3,this.gracePeriodAfter=s||3e4}async intercept(t,e){await this.session.refreshIf(this.gracePeriodBefore);const s=new Headers(t.options.headers);s.set("Authorization",this.session.bearerToken()),t.options.headers=s;const r=await e.proceed(t);return await this.session.refreshIf(this.gracePeriodAfter),r}}const T={sleep:t=>new Promise((e=>setTimeout(e,t))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(t,e,s){let r=null,n=[],i=0,a=s||T.DEBOUNCE_DEFAULT;const o=()=>{const s=(new Date).getTime()-i;t>s?r=setTimeout(o,t-s):(r=null,a!==T.DEBOUNCE_IMMEDIATE&&e(...n),null===r&&(n=[]))};return function(){n=arguments,i=(new Date).getTime(),null===r&&(r=setTimeout(o,t),a===T.DEBOUNCE_IMMEDIATE&&e(...n))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(t,e,s){let r=null,n=[],i=0,a=s||T.THROTTLE_DEFAULT;const o=()=>{i=a&T.THROTTLE_NO_LEADING?0:(new Date).getTime(),r=null,e(...n),null===r&&(n=[])};return function(){const s=(new Date).getTime();!i&&a&T.THROTTLE_NO_LEADING&&(i=s);const c=t-(s-i);n=arguments,c<=0||c>t?(null!==r&&(clearTimeout(r),r=null),i=s,e(...n),null===r&&(n=[])):null!==r||a&T.THROTTLE_NO_TRAILING||(r=setTimeout(o,c))}}};class A extends CustomEvent{#t;constructor(t,e){super(t,{...e,cancelable:!0}),this.#t=[]}async dispatchTo(t){t.dispatchEvent(this);const e=await Promise.all(this.#t);return[!this.defaultPrevented,e]}static on(t,e,s,r){t.addEventListener(e,(t=>{t.#t.push(s(t))}),r)}}class L{static fromHtml(...t){const e=document.createElement("div");e.innerHTML=t.join("");const s=new DocumentFragment;return s.append(...e.childNodes),s}static toHtml(t){var e=document.createElement("div");return e.appendChild(t),e.innerHTML}static from(...t){const e=new DocumentFragment;return e.append(...t),e}static fromChildNodes(t){const e=new DocumentFragment;return e.append(...t.childNodes),e}}class _{static id=0;static uid(t){return`${t}-${++_.id}`}static defaultValue(t,e,s){return t.hasAttribute(e)||t.setAttribute(e,s),t.getAttribute(e)}static forward(t,e,s){e.getAttributeNames().filter((e=>e.startsWith(t))).forEach((r=>{const n=r.substring(t.length);"class"!==n?s.setAttribute(n,e.getAttribute(r)):s.classList.add(...e.getAttribute(t+"class").split(" ").filter((t=>t.length)))}))}}class S{static from(t){const e=Array.from(t.childNodes).filter((t=>t.matches&&t.matches("[slot]"))).map((t=>{t.remove();const e=t.getAttribute("slot");return t.removeAttribute("slot"),[e,t]})),s=Object.fromEntries(e);return s.default=new DocumentFragment,s.default.append(...t.childNodes),s}}class k{static isParsed(t){for(var e=t;e;e=e.parentNode)if(e.nextSibling)return!0;return!1}}class O{#e={};#s={};#r;put(t,e){this.#r?this.#s[t]=Template.fromFragment(e,ec):this.#e[t]=e}get(t){if(!this.#r)throw new Error("TemplatesRegistry is not configured");const e=this.#s[t];if(!e)throw new Error(`missing template: '${t}'`);return e}configure(t){this.#r=t;for(const[e,s]of Object.entries(this.#e))delete this.#e[e],this.#s[e]=ftl.Template.fromFragment(s,t)}}class R{#n;#i;#a;#o=0;constructor(){this.#n=new O,this.#i={}}defineTemplate(t){if(null==t)return;const e="unnamed-"+ ++this.#o;return this.#n.put(e,L.fromHtml(t)),e}template(t){if(null!=t)return this.#n.get(t)}define(t,e){return this.#a?(customElements.define(t,e),this):(this.#i[t]=e,this)}configure(t){this.#n.configure(t);for(const[t,e]of Object.entries(this.#i))customElements.define(t,e),delete this.#i[t];this.#a=!0}}const C=new R;const x=new class{#c=[];constructor(){document.addEventListener("DOMContentLoaded",this.dequeue.bind(this))}enqueue(t){this.#c.length||requestAnimationFrame(this.dequeue.bind(this)),this.#c.push(t)}dequeue(){this.#c.splice(0).forEach((t=>t.upgrade()))}},N={string:t=>t,number:t=>null===t?null:Number(t),bool:t=>null!==t,json:t=>JSON.parse(t)},I=t=>{const{observed:e,template:s,slots:r}=t||{},n=(e||[]).map((t=>{const[e,s]=t.split(":"),r=s?.trim()||"string";if(!(r in N))throw new Error(`unsupported attribute type: ${r}`);return[e.trim(),r]})),i=n.map((([t,e])=>[t,N[e]])),a=Object.fromEntries(i),o=C.defineTemplate(s),c=class extends HTMLElement{static get observedAttributes(){return Object.keys(a)}#l;#u;#d;constructor(...t){super(...t),this.#d=this.attachInternals()}get initialized(){return this.#u}get internals(){return this.#d}connectedCallback(){if(this.#l)return;if("complete"===this.ownerDocument.readyState||k.isParsed(this))return void x.enqueue(this);this.ownerDocument.addEventListener("DOMContentLoaded",(()=>{t.disconnect(),x.enqueue(this)}));const t=new MutationObserver((()=>{k.isParsed(this)&&(t.disconnect(),x.enqueue(this))}));t.observe(this.parentNode,{childList:!0,subtree:!0})}attributeChangedCallback(t,e,s){if(!this.#l||e===s)return;const r=a[t];this[t]=r(s)}async upgrade(){if(!this.#l){this.#l=!0,await this.render(C.template(o),r?S.from(this):void 0);for(const[t,e]of i)this.hasAttribute(t)&&(this[t]=e(this.getAttribute(t)));this.#u=!0}}};for(const[t,e]of n.filter((([t,e])=>"bool"===e)))Object.defineProperty(c.prototype,t,{enumerable:!0,configurable:!0,get(){return this.internals.states.has(`--${t}`)},set(e){const s=this.initialized?"changed":"init",r=new A(`${t}:${s}`,{detail:{target:this,value:e}});(async()=>{const[e,s]=await r.dispatchTo(this);e&&this.internals.states[v?"add":"delete"](`--${t}`)})()}});return c};function D(t,e){return Object.keys(t).reduce(((s,r)=>{const n=e.length?e+".":"";return"object"==typeof t[r]&&null!==t[r]?Object.assign(s,D(t[r],n+r)):s[n+r]=t[r],s}),{})}function P(t,e){"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.value=e:t.checked=e:t.checked=t.getAttribute("value")===e}class q extends(I()){static IGNORED_CHILDREN_SELECTOR=".d-none, [hidden]";static SCROLL_OFFSET=50;render(){const t=document.createElement("form");t.replaceChildren(...this.childNodes),t.addEventListener("submit",(async t=>{t.preventDefault(),this.spinner(!0);try{this.submitter&&await this.submitter(this.values,this)}catch(t){if(t instanceof i)return void(this.errors=t.problems);throw t}finally{this.spinner(!1)}})),this.replaceChildren(t)}spinner(t){this.querySelectorAll("ful-spinner").forEach((e=>e.hidden=!t)),this.querySelectorAll("[type=submit],[type=reset]").forEach((e=>e.disabled=t))}set values(t){for(const[e,s]of Object.entries(D(t,"")))this.querySelectorAll(`[name='${CSS.escape(e)}']`).forEach((t=>P(t,s)))}get values(){return Array.from(this.querySelectorAll("[name]")).filter((t=>"never"!==t.dataset.fulBindInclude&&("always"===t.dataset.fulBindInclude||null===t.closest(q.IGNORED_CHILDREN_SELECTOR)))).reduce(((t,e)=>function(t,e,s){const r=e.split(".").map((t=>t.match(/^[0-9]+$/)?+t:t));let n=t,i=null;for(let e=0;;++e){const a=r[e],o=r[e-1];if(Number.isInteger(a)&&!Array.isArray(n)&&(null!==i?i[o]=n=[]:t=n=[]),e===r.length-1)return n[a]=void 0!==s?s:a in n?n[a]:null,t;void 0===n[a]&&(n[a]={}),i=n,n=n[a]}}(t,e.getAttribute("name"),function(t){if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.fulBindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.fulBindType?t.value?"true"===t.value:null:t.value||null}(e))),{})}set errors(t){const e=t.filter((t=>"FIELD_ERROR"===t.type||"INVALID_FORMAT"===t.type)),s=t.filter((t=>"FIELD_ERROR"!==t.type&&"INVALID_FORMAT"!==t.type));if(this.querySelectorAll(".is-invalid").forEach((t=>t.classList.remove("is-invalid"))),this.querySelectorAll("ful-errors").forEach((t=>{t.replaceChildren(),t.setAttribute("hidden","")})),e.forEach((t=>{const e=t.context.replace("[",".").replace("].","."),s=`[name='${CSS.escape(e)}'] [ful-validation-target],[name='${CSS.escape(e)}']:not(:has([ful-validation-target]))`;this.querySelectorAll(s).forEach((t=>t.classList.add("is-invalid")));const r=`ful-field-error[field='${CSS.escape(e)}']`;this.querySelectorAll(r).forEach((e=>e.innerText=t.reason))})),this.querySelectorAll("ful-errors").forEach((t=>{t.innerText=s.map((t=>t.reason)).join("\n"),0!==s.length&&t.removeAttribute("hidden")})),!this.hasAttribute("scroll-on-error"))return;const r=Array.from(this.querySelectorAll("ful-field-error")).map((t=>t.parentElement?t.parentElement:t)).map((t=>t.getBoundingClientRect().y+window.scrollY)),n=Math.min(...r);n!==1/0&&window.scroll(window.scrollX,n>q.SCROLL_OFFSET?n-q.SCROLL_OFFSET:0)}}const U='\n<label data-tpl-for="id" class="form-label">{{{{ slots.default }}}}</label>\n<div class="input-group">\n <span data-tpl-if="slots.ibefore" class="input-group-text">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if="slots.before" data-tpl-remove="tag">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if="slots.after" data-tpl-remove="tag">{{{{ slots.after }}}}</div>\n <span data-tpl-if="slots.iafter" class="input-group-text">{{{{ slots.iafter }}}}</span>\n</div>\n<ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error>\n',F=(t,e,s)=>{const r=t.input=s.input=s.input||(()=>{const t=document.createElement("input");return t.classList.add("form-control"),t})();r.setAttribute("ful-validation-target","");const n=r.getAttribute("id")||t.getAttribute("input-id")||_.uid("ful-input");_.forward("input-",t,s.input),_.defaultValue(s.input,"id",n),_.defaultValue(s.input,"type","text"),_.defaultValue(s.input,"placeholder"," ");const i=t.getAttribute("name");return e.render(t,{id:n,name:i,slots:s})};class $ extends(I({observed:["value"],slots:!0,template:U})){render(t,e){const s=F(this,t,e);this.replaceChildren(s)}get value(){return this.input.value}set value(t){this.input.value=t}}class j extends(I({observed:["value"],slots:!0,template:'\n <label data-tpl-for="tsId" class="form-label">{{{{ slots.default }}}}</label>\n {{{{ input }}}}\n <div class="input-group">\n <span data-tpl-if="slots.ibefore" class="input-group-text">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if="slots.before" data-tpl-remove="tag">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if="slots.after" data-tpl-remove="tag">{{{{ slots.after }}}}</div>\n <span data-tpl-if="slots.iafter" class="input-group-text">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error> \n '})){constructor(t){super(),this.tsConfig=t}render(t,e){const s="local"!=(this.getAttribute("type")||"local"),r="always"!=this.getAttribute("load"),n=this.getAttribute("name"),i=e.input=e.input||document.createElement("select");i.setAttribute("ful-validation-target","");const a=i.getAttribute("id")||this.getAttribute("input-id")||_.uid("ful-select"),o=`${a}-ts-control`;_.forward("input-",this,i),_.defaultValue(i,"id",a),_.defaultValue(i,"placeholder"," "),e.input=L.from(i),this.loaded=!s;this._remote=s,this._unwrappedRemoteLoad=async(t,e)=>{if(!s||s&&r&&this.loaded)return void e();const n=t&&t.hasOwnProperty("byId")?"id":"query",i="id"===n?t.byId:t,a=await(this.#h?this.#h(i,n):[]);"id"!==n&&(this.loaded=!0),e(a)},this.ts=new TomSelect(i,Object.assign(s?{preload:"focus",load:this._unwrappedRemoteLoad,shouldLoad:t=>!this.shouldLoad||this.shouldLoad(t)}:{},{render:{loading:()=>'<ful-spinner class="centered p-2"></ful-spinner>'}},this.tsConfig)),i.remove(),t.renderTo(this,{id:a,tsId:o,name:n,input:i,slots:e})}#h;set loader(t){this.#h=t,this.hasAttribute("value")&&(this.value=this.getAttribute("value"))}set value(t){(async()=>{this._remote&&await this._unwrappedRemoteLoad({byId:t},this.ts.loadCallback.bind(this.ts)),this.ts.setValue(t)})()}get value(){const t=this.ts.getValue();return""===t?null:t}}class H extends(I({observed:["value","disabled:bool"],slots:!0,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 {{{{ ial[1] }}}}\n </label>\n </div>\n </section>\n <ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error>\n <footer data-tpl-if="slots.footer">\n {{{{ slots.footer }}}}\n </footer>\n </fieldset>\n '})){render(t,e){const s=this.getAttribute("name")||_.uid("ful-radiogroup"),r=Array.from(e.default.querySelectorAll("ful-radio")),n=r.map((t=>{const e=document.createElement("input");e.setAttribute("type","radio"),_.forward("input-",this,e),_.forward("",t,e),e.setAttribute("name",`${s}-ignore`),e.setAttribute("ful-validation-target",""),e.dataset.fulBindInclude="never";return[e,L.fromChildNodes(t)]}));r.forEach((t=>t.remove())),t.renderTo(this,{name:s,slots:e,inputsAndLabels:n})}get value(){const t=this.querySelector("input[type=radio]:checked");return t?t.value:null}set value(t){this.querySelector(`input[type=radio][value=${CSS.escape(t)}]`).checked=!0}}class M extends(I({slots:!0,template:'\n <div class="ful-spinner-wrapper">\n <div class="ful-spinner-text">{{{{ slots.default }}}}</div>\n <div class="ful-spinner-icon"></div>\n </div>\n '})){render(t,e){t.renderTo(this,{slots:e})}}class B extends HTMLElement{constructor(){if(super(),this.progress=[...this.children].filter((t=>t.matches("header,ol,ul"))),this.progress.forEach((t=>{const e=[...t.children];void 0===e.filter((t=>t.matches(".active")))[0]&&e.length>0&&e[0].classList.add("active")})),null===this.querySelector("section.current")){const t=this.querySelector("section:first-of-type");null!==t&&t.classList.add("current")}}next(){this.progress.forEach((t=>{const e=[...t.children].filter((t=>t.matches(".active")))[0];e?.classList.remove("active"),e?.nextElementSibling?.classList.add("active")}));const t=this.querySelector("section.current");t.classList.remove("current"),t.nextElementSibling.classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}prev(){this.progress.forEach((t=>{const e=[...t.children].filter((t=>t.matches(".active")))[0];e?.classList.remove("active"),e?.previousElementSibling?.classList.add("active")}));const t=this.querySelector("section.current");t.classList.remove("current"),t.previousElementSibling.classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}moveTo(t){this.progress.forEach((e=>{const s=[...e.children].filter((t=>t.matches(".active")))[0];s?.classList.remove("active"),e.children[+t]?.classList.add("active")}));const e=this.querySelector("section.current");e?.classList.remove("current");this.querySelector(`section:nth-child(${+t})`).classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}static configure(){return B.custom("ful-wizard")}}export{_ as Attributes,w as AuthorizationCodeFlow,y as AuthorizationCodeFlowInterceptor,E as AuthorizationCodeFlowSession,t as Base64,R as ElementsRegistry,i as Failure,q as Form,L as Fragments,e as Hex,l as HttpClient,U as INPUT_TEMPLATE,$ as Input,S as LightSlots,m as LocalStorage,k as Nodes,I as ParsedElement,H as RadioGroup,j as Select,g as SessionStorage,M as Spinner,A as SyncEvent,O as TemplatesRegistry,b as VersionedStorage,B as Wizard,C as elements,p as jsonPatch,d as jsonPost,h as jsonPut,u as jsonRequest,F as makeInputFragment,T as timing};
2
2
  //# sourceMappingURL=ful.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/events.mjs","../src/elements/elements.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs","../src/elements/wizard.mjs"],"sourcesContent":["\n\nclass Base64 {\n static encode(arrayBuffer, dialect) {\n const d = dialect || Base64.URL_SAFE;\n const len = arrayBuffer.byteLength;\n const view = new Uint8Array(arrayBuffer);\n let res = '';\n for (let i = 0; i < len; i += 3) {\n const v1 = d[view[i] >> 2];\n const v2 = d[((view[i] & 3) << 4) | (view[i + 1] >> 4)];\n const v3 = d[((view[i + 1] & 15) << 2) | (view[i + 2] >> 6)];\n const v4 = d[view[i + 2] & 63];\n res += v1 + v2 + v3 + v4;\n }\n if (len % 3 === 2) {\n res = res.substring(0, res.length - 1);\n } else if (len % 3 === 1) {\n res = res.substring(0, res.length - 2);\n }\n return res;\n }\n static decode(str, dialect) {\n const d = dialect || Base64.URL_SAFE;\n let nbytes = Math.floor(str.length * 0.75);\n for (let i = 0; i !== str.length; ++i) {\n if (str[str.length - i - 1] !== '=') {\n break;\n }\n --nbytes;\n }\n const view = new Uint8Array(nbytes);\n\n let vi = 0;\n let si = 0;\n while (vi < str.length * 0.75) {\n const v1 = d.indexOf(str.charAt(si++));\n const v2 = d.indexOf(str.charAt(si++));\n const v3 = d.indexOf(str.charAt(si++));\n const v4 = d.indexOf(str.charAt(si++));\n view[vi++] = (v1 << 2) | (v2 >> 4);\n view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n view[vi++] = ((v3 & 3) << 6) | v4;\n }\n\n return view.buffer;\n }\n}\n\nBase64.STANDARD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nBase64.URL_SAFE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n\nclass Hex {\n static decode(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"invalid length\");\n }\n const lenInBytes = hex.length / 2;\n return new Uint8Array(lenInBytes).map((e, i) => {\n const offset = i * 2;\n const octet = hex.substring(offset, offset + 2);\n return parseInt(octet, 16);\n });\n }\n static encode(bytes, upper) {\n return Array.from(bytes)\n .map(b => b.toString(16))\n .map(b => upper ? b.toUpperCase() : b)\n .map(o => o.padStart(2, 0))\n .join('');\n }\n}\n\nexport { Base64, Hex };","class ContextInterceptor {\n constructor() {\n const context = document.querySelector(\"meta[name='context']\").getAttribute(\"content\");\n this.context = context.endsWith(\"/\") ? context.substring(0, context.length - 1) : context;\n }\n async intercept(request, chain){\n const separator = request.resource.startsWith(\"/\") ? \"\" : \"/\";\n request.resource = this.context + separator + request.resource;\n return await chain.proceed(request);\n }\n}\n\nclass CsrfTokenInterceptor {\n constructor() {\n this.k = document.querySelector(\"meta[name='_csrf_header']\").getAttribute(\"content\");\n this.v = document.querySelector(\"meta[name='_csrf']\").getAttribute(\"content\");\n }\n async intercept(request, chain){\n const headers = new Headers(request.options.headers);\n headers.set(this.k, this.v);\n request.options.headers = headers;\n return await chain.proceed(request);\n }\n}\n\nclass RedirectOnUnauthorizedInterceptor {\n constructor(redirectUri) {\n this.redirectUri = redirectUri;\n }\n async intercept(request, chain){\n const response = await chain.proceed(request);\n if (response.status !== 401) {\n return response;\n }\n window.location.href = this.redirectUri;\n }\n}\n\nclass Failure extends Error {\n static parseProblems(status, text) {\n const def = [{\n type: \"GENERIC_PROBLEM\",\n context: null,\n reason: `${status}: ${text}`,\n details: null\n }];\n try {\n return text ? JSON.parse(text) : def;\n } catch (e) {\n return def;\n }\n }\n static fromResponse(status, text) {\n return new Failure(status, Failure.parseProblems(status, text));\n }\n constructor(status, problems) {\n super(JSON.stringify(problems));\n this.name = `Failure:${status}`;\n this.status = status;\n this.problems = problems;\n }\n}\n\nclass HttpClientBuilder {\n constructor() {\n this.interceptors = [];\n }\n withContext() {\n this.interceptors.push(new ContextInterceptor());\n return this;\n }\n withCsrfToken() {\n this.interceptors.push(new CsrfTokenInterceptor());\n return this;\n }\n withRedirectOnUnauthorized(redirectUri) {\n this.interceptors.push(new RedirectOnUnauthorizedInterceptor(redirectUri));\n return this;\n }\n withInterceptors(...interceptors) {\n this.interceptors.push(...interceptors);\n return this;\n }\n build() {\n const interceptors = this.interceptors;\n return new HttpClient({interceptors});\n }\n}\n\nclass HttpCall {\n async intercept(request, chain){\n return await fetch(request.resource, request.options);\n } \n}\n\nclass HttpInterceptorChain {\n constructor(interceptors, current){\n this.interceptors = interceptors;\n this.current = current;\n }\n async proceed(request){\n const interceptor = this.interceptors[this.current];\n return await interceptor.intercept(request, new HttpInterceptorChain(this.interceptors, this.current + 1));\n }\n}\n\n\nclass HttpClient {\n static builder() {\n return new HttpClientBuilder();\n }\n constructor({interceptors}){\n this.interceptors = interceptors || [];\n }\n async exchange(resource, options) {\n const opts = options || {};\n const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options: opts});\n }\n async fetch(resource, options) {\n const response = await this.exchange(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n } \n return response;\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n } catch (e) {\n if (e instanceof Failure) {\n throw e;\n }\n throw new Failure(0, [{\n type: \"CONNECTION_PROBLEM\",\n context: null,\n reason: e.message,\n details: null\n }]);\n }\n }\n}\n\nfunction jsonRequest(method, body, headers){\n return {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n method: method,\n body: JSON.stringify(body) \n }\n}\nfunction jsonPost(body, headers){\n return jsonRequest('POST', body, headers);\n}\nfunction jsonPut(body, headers){\n return jsonRequest('PUT', body, headers);\n}\nfunction jsonPatch(body, headers){\n return jsonRequest('PATCH', body, headers);\n}\n\n\nexport { HttpClient, Failure, jsonRequest, jsonPost, jsonPut, jsonPatch };\n","\nclass Storage {\n constructor(prefix, storage) {\n this.prefix = prefix;\n this.storage = storage;\n }\n save(k, v) {\n this.storage.setItem(`${this.prefix}-${k}`, JSON.stringify(v));\n }\n load(k) {\n const got = this.storage.getItem(`${this.prefix}-${k}`);\n return got === undefined ? undefined : JSON.parse(got);\n }\n remove(k) {\n this.storage.removeItem(`${this.prefix}-${k}`);\n }\n pop(k) {\n const decoded = this.load(k);\n this.remove(k);\n return decoded;\n }\n}\n\nclass LocalStorage extends Storage {\n constructor(prefix) {\n super(prefix, localStorage);\n }\n}\n\nclass SessionStorage extends Storage {\n constructor(prefix) {\n super(prefix, sessionStorage);\n }\n}\n\nclass VersionedStorage {\n constructor(storage, key, dataSupplier){\n this.storage = storage;\n this.key = key;\n this.dataSupplier = dataSupplier;\n this.cache = null;\n \n }\n async load(revision){\n const saved = this.storage.load(this.key);\n if (!!saved && saved.revision === revision) {\n this.cache = saved.value;\n return;\n }\n const freshData = await this.dataSupplier(revision, this.key);\n this.storage.save(this.key, {\n revision: revision,\n value: freshData\n });\n this.cache = freshData;\n }\n data(){\n return this.cache;\n }\n}\n\n\n\nexport {LocalStorage, SessionStorage, VersionedStorage};","import { Base64 } from \"./encodings.mjs\";\nimport { SessionStorage } from \"./storage.mjs\";\n\n\nclass AuthorizationCodeFlow {\n static forKeycloak(clientId, realmBaseUrl, redirectUri){\n const scope = \"openid profile\";\n return new AuthorizationCodeFlow(clientId, scope, {\n auth: new URL(\"protocol/openid-connect/auth\", realmBaseUrl),\n token: new URL(\"protocol/openid-connect/token\", realmBaseUrl),\n logout: new URL(\"protocol/openid-connect/logout\", realmBaseUrl),\n registration: new URL(\"protocol/openid-connect/registrations\", realmBaseUrl),\n redirect: redirectUri\n }); \n }\n constructor(clientId, scope, {auth, token, registration, logout, redirect}) {\n this.storage = new SessionStorage(clientId);\n this.clientId = clientId;\n this.scope = scope;\n this.uri = {auth, token, registration, logout, redirect};\n }\n async action(uri, additionalParams){\n const pkceVerifier = Base64.encode(crypto.getRandomValues(new Uint8Array(32)).buffer);\n const pkceChallenge = Base64.encode(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(pkceVerifier)));\n const state = this.clientId + Base64.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);\n this.storage.save(AuthorizationCodeFlow.PKCE_AND_STATE_KEY, {\n state: state,\n verifier: pkceVerifier\n });\n const url = new URL(uri);\n url.searchParams.set(\"client_id\", this.clientId);\n url.searchParams.set(\"redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"response_type\", 'code');\n url.searchParams.set(\"scope\", this.scope);\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"code_challenge\", pkceChallenge);\n url.searchParams.set(\"code_challenge_method\", 'S256');\n Object.entries(additionalParams || {}).forEach(kv => {\n url.searchParams.set(kv[0], kv[1]);\n });\n window.location = url;\n }\n async registration(additionalParams){\n await this.action(this.uri.registration, additionalParams);\n }\n async applicationInitiatedAction(kcAction){\n await this.action(this.uri.auth, {\n kc_action: kcAction\n });\n }\n async _tokenExchange(code, state) {\n window.history.replaceState('', \"\", this.uri.redirect);\n const stateAndVerifier = this.storage.pop(AuthorizationCodeFlow.PKCE_AND_STATE_KEY);\n if (stateAndVerifier.state !== state) {\n throw new Error(\"State mismatch\");\n }\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"code\", code],\n [\"grant_type\", \"authorization_code\"],\n [\"code_verifier\", stateAndVerifier.verifier],\n [\"state\", stateAndVerifier.state],\n [\"redirect_uri\", this.uri.redirect]\n ])\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\"Error:\" + response.status + \": \" + text);\n }\n const token = await response.json();\n return new AuthorizationCodeFlowSession(this.clientId, token, this.uri);\n }\n async ensureLoggedIn() {\n const url = new URL(window.location.href);\n const code = url.searchParams.get(\"code\");\n if (code && this.storage.load(AuthorizationCodeFlow.PKCE_AND_STATE_KEY)) {\n //if callback from keycloak and we have our state still stored\n const state = url.searchParams.get(\"state\");\n return await this._tokenExchange(code, state);\n }\n //if not authorized\n await this.action(this.uri.auth, {});\n return null;\n }\n}\nAuthorizationCodeFlow.PKCE_AND_STATE_KEY = \"state-and-verifier\";\n\nclass AuthorizationCodeFlowSession {\n static parseToken(token) {\n const [rawHeader, rawPayload, signature] = token.split(\".\");\n const ut8decoder = new TextDecoder(\"utf-8\");\n return {\n header: JSON.parse(ut8decoder.decode(Base64.decode(rawHeader, Base64.STANDARD))),\n payload: JSON.parse(ut8decoder.decode(Base64.decode(rawPayload, Base64.STANDARD))),\n signature: signature\n };\n } \n constructor(clientId, t, {token, logout, redirect}) {\n this.clientId = clientId;\n this.token = t;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(t.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(t.refresh_token);\n this.uri = { token, logout, redirect }\n this.refreshCallback = null;\n }\n onRefresh(callback) {\n this.refreshCallback = callback;\n }\n async refresh() {\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"grant_type\", \"refresh_token\"],\n [\"refresh_token\", this.token.refresh_token]\n ])\n });\n if (!response.ok) {\n throw new Error(\"Error:\" + response.status + \": \" + response.text());\n }\n const token = await response.json();\n this.token = token;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(token.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(token.refresh_token);\n if (this.refreshCallback) {\n this.refreshCallback(this.token, this.accessToken, this.refreshToken);\n }\n }\n shouldBeRefreshed(gracePeriod) {\n const now = new Date().getTime();\n const refreshTokenExpiresAt = this.refreshToken.payload.exp * 1000;\n const expired = now > refreshTokenExpiresAt;\n const shouldRefresh = now - gracePeriod > refreshTokenExpiresAt;\n return !expired && shouldRefresh;\n }\n async refreshIf(gracePeriod) {\n if (!this.shouldBeRefreshed(gracePeriod)) {\n return;\n }\n await this.refresh();\n }\n logout() {\n const url = new URL(this.uri.logout);\n url.searchParams.set(\"post_logout_redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"id_token_hint\", this.token.id_token);\n window.location = url;\n }\n\n bearerToken() {\n return `Bearer ${this.token.access_token}`;\n }\n \n interceptor(gracePeriodBefore, gracePeriodAfter){\n return new AuthorizationCodeFlowInterceptor(this, gracePeriodBefore, gracePeriodAfter); \n }\n}\n\nclass AuthorizationCodeFlowInterceptor {\n constructor(session, gracePeriodBefore, gracePeriodAfter) {\n this.session = session;\n this.gracePeriodBefore = gracePeriodBefore || 2000;\n this.gracePeriodAfter = gracePeriodAfter || 30000;\n }\n async intercept(request, chain) {\n await this.session.refreshIf(this.gracePeriodBefore);\n const headers = new Headers(request.options.headers);\n headers.set(\"Authorization\", this.session.bearerToken());\n request.options.headers = headers;\n const response = await chain.proceed(request);\n await this.session.refreshIf(this.gracePeriodAfter);\n return response;\n }\n}\n\n\nexport {AuthorizationCodeFlow, AuthorizationCodeFlowSession, AuthorizationCodeFlowInterceptor };","\nconst timing = {\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n DEBOUNCE_DEFAULT: 0,\n DEBOUNCE_IMMEDIATE: 1,\n debounce(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.DEBOUNCE_DEFAULT;\n\n const later = () => {\n const elapsed = new Date().getTime() - previousTimestamp;\n if (timeoutMs > elapsed) {\n tid = setTimeout(later, timeoutMs - elapsed);\n return;\n }\n tid = null;\n if (opts !== timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n // This check is needed because `func` can recursively invoke `debounced`.\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n args = arguments;\n previousTimestamp = new Date().getTime();\n if (tid === null) {\n tid = setTimeout(later, timeoutMs);\n if (opts === timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n }\n };\n },\n THROTTLE_DEFAULT: 0,\n THROTTLE_NO_LEADING: 1,\n THROTTLE_NO_TRAILING: 2,\n throttle(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.THROTTLE_DEFAULT;\n\n const later = () => {\n previousTimestamp = (opts & timing.THROTTLE_NO_LEADING) ? 0 : new Date().getTime();\n tid = null;\n func(...args);\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n const now = new Date().getTime();\n if (!previousTimestamp && (opts & timing.THROTTLE_NO_LEADING)) {\n previousTimestamp = now;\n }\n const remaining = timeoutMs - (now - previousTimestamp);\n args = arguments;\n if (remaining <= 0 || remaining > timeoutMs) {\n if (tid !== null) {\n clearTimeout(tid);\n tid = null;\n }\n previousTimestamp = now;\n func(...args);\n if (tid === null) {\n args = [];\n }\n } else if (tid === null && !(opts & timing.THROTTLE_NO_TRAILING)) {\n tid = setTimeout(later, remaining);\n }\n };\n\n }\n};\n\n\nexport { timing };","\n\n// SyncEvent.on($0, 'asd', async e => { await ful.timing.sleep(10_000); return 3; })\n// const [success, results] = await new SyncEvent(\"asd\").dispatchTo($0);\nclass SyncEvent extends CustomEvent {\n #results;\n constructor(type, options) {\n super(type, {...options, cancelable: true});\n this.#results = [];\n }\n\n async dispatchTo(el) {\n // unlike \"native\" events, which are fired by the browser and invoke \n // event handlers asynchronously via the event loop, dispatchEvent() \n // invokes event handlers synchronously. \n // see: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent\n el.dispatchEvent(this);\n //we ignore the result of dispatchEvent and use defaultPrevented instead\n //because handlers can be async\n const results = await Promise.all(this.#results);\n return [!this.defaultPrevented, results];\n }\n\n static on(el, type, h, useCapture) {\n el.addEventListener(type, e => {\n //e *must* be an async event\n e.#results.push(h(e));\n }, useCapture);\n }\n}\n\n\nexport { SyncEvent }\n","import { SyncEvent } from \"../events.mjs\";\n\n\nclass Fragments {\n /**\n * \n * @param {...string} html \n * @returns \n */\n static fromHtml(...html) {\n const el = document.createElement(\"div\");\n el.innerHTML = html.join(\"\");\n const fragment = new DocumentFragment();\n fragment.append(...el.childNodes);\n return fragment;\n }\n /**\n * \n * @param {DocumentFragment} fragment \n * @returns \n */\n static toHtml(fragment) {\n var r = document.createElement(\"div\");\n r.appendChild(fragment);\n return r.innerHTML;\n }\n /**\n * \n * @param {...Node} nodes \n * @returns \n */\n static from(...nodes) {\n const fragment = new DocumentFragment();\n fragment.append(...nodes);\n return fragment;\n }\n /**\n * \n * @param {HTMLElement} el \n * @returns \n */\n static fromChildNodes(el) {\n const fragment = new DocumentFragment();\n fragment.append(...el.childNodes);\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n /**\n * \n * @param {string} prefix \n * @returns \n */\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n /**\n * \n * @param {any} value \n * @returns \n */\n static asBoolean(value) {\n return value !== null && value !== undefined && value !== false;\n }\n /**\n * \n * @param {HTMLElement} el \n * @param {string} k \n * @param {string} v \n * @returns \n */\n static defaultValue(el, k, v) {\n if (!el.hasAttribute(k)) {\n el.setAttribute(k, v);\n }\n return el.getAttribute(k);\n }\n /**\n * \n * @param {string} prefix \n * @param {HTMLElement} from \n * @param {HTMLElement} to \n */\n static forward(prefix, from, to) {\n from.getAttributeNames()\n .filter(a => a.startsWith(prefix))\n .forEach(a => {\n const target = a.substring(prefix.length);\n if (target === 'class') {\n to.classList.add(...from.getAttribute(prefix + \"class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(target, from.getAttribute(a))\n });\n }\n}\n\nclass LightSlots {\n /**\n * \n * @param {HTMLElement} el \n * @returns the slots\n */\n static from(el) {\n const namedSlots = Array.from(el.childNodes)\n .filter(el => el.matches && el.matches('[slot]'))\n .map(el => {\n el.remove();\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n });\n const slots = Object.fromEntries(namedSlots);\n slots.default = new DocumentFragment();\n slots.default.append(...el.childNodes);\n return slots;\n }\n}\n\nclass Nodes {\n static isParsed(el) {\n for (var c = el; c; c = c.parentNode) {\n if (c.nextSibling) {\n return true;\n }\n }\n return false;\n }\n}\n\nclass TemplatesRegistry {\n #idToFragment = {};\n #idToTemplate = {};\n #ec;\n put(k, fragment) {\n if (this.#ec) {\n this.#idToTemplate[k] = Template.fromFragment(fragment, ec);\n return;\n }\n this.#idToFragment[k] = fragment;\n }\n get(k) {\n if (!this.#ec) {\n throw new Error(\"TemplatesRegistry is not configured\");\n }\n const tpl = this.#idToTemplate[k];\n if (!tpl) {\n throw new Error(`missing template: '${k}'`);\n }\n return tpl;\n }\n configure(ec) {\n this.#ec = ec;\n for (const [k, fragment] of Object.entries(this.#idToFragment)) {\n delete this.#idToFragment[k];\n this.#idToTemplate[k] = ftl.Template.fromFragment(fragment, ec);\n }\n }\n}\n\n\nclass ElementsRegistry {\n #templates;\n #tagToclass;\n #configured;\n #id = 0;\n constructor(){\n this.#templates = new TemplatesRegistry();\n this.#tagToclass = {};\n }\n defineTemplate(html){\n if(html === null || html === undefined){\n return undefined;\n }\n const name = `unnamed-${++this.#id}`;\n this.#templates.put(name, Fragments.fromHtml(html));\n return name;\n }\n template(k){\n if(k === null || k === undefined){\n return undefined;\n }\n return this.#templates.get(k);\n }\n define(tag, klass){\n if(!this.#configured){\n this.#tagToclass[tag] = klass;\n return this;\n }\n customElements.define(tag, klass); \n return this;\n }\n configure(ec) {\n this.#templates.configure(ec);\n for(const [tag, klass] of Object.entries(this.#tagToclass)) {\n customElements.define(tag, klass); \n delete this.#tagToclass[tag];\n }\n this.#configured = true;\n }\n}\n\nconst elements = new ElementsRegistry();\n\n\nclass UpgradeQueue {\n #q = [];\n constructor() {\n document.addEventListener('DOMContentLoaded', this.dequeue.bind(this));\n }\n enqueue(el) {\n if (!this.#q.length) {\n requestAnimationFrame(this.dequeue.bind(this));\n }\n this.#q.push(el);\n }\n dequeue() {\n this.#q.splice(0).forEach(el => el.upgrade());\n }\n}\n\nconst upgradeQueue = new UpgradeQueue();\n\nconst ParsedElement = (conf) => {\n const {states, attributes, template, slots} = conf || {};\n\n const observed_states = states || [];\n const observed_attributes = attributes || [];\n const observed = [].concat(observed_states).concat(observed_attributes);\n\n const templateId = elements.defineTemplate(template);\n\n const k = class extends HTMLElement {\n static get observedAttributes() {\n return observed;\n }\n #parsed;\n #initialized;\n #internals;\n constructor(...args) {\n super(...args);\n this.#internals = this.attachInternals();\n }\n get initialized(){\n return this.#initialized;\n }\n get internals() {\n return this.#internals;\n }\n connectedCallback() {\n if (this.#parsed) {\n return;\n }\n if (this.ownerDocument.readyState === 'complete' || Nodes.isParsed(this)) {\n upgradeQueue.enqueue(this);\n return;\n }\n this.ownerDocument.addEventListener('DOMContentLoaded', () => {\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n const observer = new MutationObserver(() => {\n if (!Nodes.isParsed(this)) {\n return;\n }\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n observer.observe(this.parentNode, { childList: true, subtree: true });\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (!this.#parsed || oldValue === newValue) {\n return;\n }\n this[name] = newValue;\n }\n async upgrade() {\n if (this.#parsed) {\n return;\n }\n this.#parsed = true;\n await this.render(elements.template(templateId), slots ? LightSlots.from(this) : undefined);\n for (const flag of observed_states) {\n if (this.hasAttribute(flag)) {\n this[flag] = true;\n }\n }\n for (const other of observed_attributes) {\n if (this.hasAttribute(other)) {\n this[other] = this.getAttribute(other);\n }\n }\n this.#initialized = true;\n }\n };\n\n for (const state of observed_states) {\n Object.defineProperty(k.prototype, state, {\n enumerable: true,\n configurable: true,\n get() {\n return this.internals.states.has(`--${state}`);\n },\n set(value) {\n const v = Attributes.asBoolean(value);\n const et = this.initialized ? 'changed' : 'init';\n const event = new SyncEvent(`${state}:${et}`, {\n detail: { \n target: this,\n value: v \n }\n });\n (async () => {\n const [success, results] = await event.dispatchTo(this);\n if (!success) {\n return;\n }\n //see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents\n this.internals.states[v ? 'add' : 'delete'](`--${state}`);\n })();\n }\n });\n }\n\n return k;\n}\n\nexport { Fragments, Attributes, LightSlots, Nodes, TemplatesRegistry, ElementsRegistry, elements, ParsedElement };\n","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { ParsedElement } from \"./elements.mjs\"\n\nfunction flatten(obj, prefix) {\n return Object.keys(obj).reduce((acc, k) => {\n const pre = prefix.length ? prefix + '.' : '';\n if (typeof obj[k] === 'object' && obj[k] !== null) {\n Object.assign(acc, flatten(obj[k], pre + k));\n } else {\n acc[pre + k] = obj[k];\n }\n return acc;\n }, {});\n}\n\nfunction providePath(result, path, value) {\n const keys = path.split(\".\").map((k) => k.match(/^[0-9]+$/) ? +k : k);\n let current = result;\n let previous = null;\n for (let i = 0; ; ++i) {\n const ckey = keys[i];\n const pkey = keys[i - 1];\n if (Number.isInteger(ckey) && !Array.isArray(current)) {\n if (previous !== null) {\n previous[pkey] = current = [];\n } else {\n result = current = [];\n }\n }\n if (i === keys.length - 1) {\n //when value is undefined we only want to define the property if it's not defined \n current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);\n return result;\n }\n if (current[ckey] === undefined) {\n current[ckey] = {};\n }\n previous = current;\n current = current[ckey];\n }\n}\n\nfunction extract(el) {\n if (el.getAttribute('type') === 'radio') {\n if (!el.checked) {\n return undefined;\n }\n return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['fulBindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n return el.value || null;\n}\n\nfunction mutate(el, raw) {\n if (el.getAttribute('type') === 'radio') {\n el.checked = el.getAttribute('value') === raw;\n return;\n }\n if (el.getAttribute('type') === 'checkbox') {\n el.checked = raw;\n return;\n }\n el.value = raw;\n}\n\nclass Form extends ParsedElement() {\n static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';\n static SCROLL_OFFSET = 50;\n render() {\n const form = document.createElement('form');\n form.replaceChildren(...this.childNodes);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinner(true);\n try {\n if (this.submitter) {\n await this.submitter(this.values, this);\n }\n } catch (e) {\n if (e instanceof Failure) {\n this.errors = e.problems;\n return;\n }\n throw e;\n } finally {\n this.spinner(false)\n }\n })\n this.replaceChildren(form);\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => el.hidden = !spin)\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => el.disabled = spin)\n }\n set values(vs) {\n for (const [flattenedKey, value] of Object.entries(flatten(vs, ''))) {\n this.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`).forEach(el => mutate(el, value));\n }\n }\n get values() {\n return Array.from(this.querySelectorAll('[name]'))\n .filter((el) => {\n if (el.dataset['fulBindInclude'] === 'never') {\n return false;\n }\n return el.dataset['fulBindInclude'] === 'always' || el.closest(Form.IGNORED_CHILDREN_SELECTOR) === null;\n })\n .reduce((result, el) => {\n return providePath(result, el.getAttribute('name'), extract(el));\n }, {});\n }\n set errors(es) {\n const fieldErrors = es.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT');\n const globalErrors = es.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n this.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.replaceChildren();\n el.setAttribute('hidden', '');\n });\n fieldErrors.forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n const validationTargetsSelector = `[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`;\n this.querySelectorAll(validationTargetsSelector).forEach(input => input.classList.add('is-invalid'));\n const fieldErrorsSelector = `ful-field-error[field='${CSS.escape(name)}']`;\n this.querySelectorAll(fieldErrorsSelector).forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.innerText = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.removeAttribute('hidden');\n }\n });\n if (!this.hasAttribute('scroll-on-error')) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('ful-field-error'))\n .map(el => el.parentElement ? el.parentElement : el)\n .map(el => el.getBoundingClientRect().y + window.scrollY);\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > Form.SCROLL_OFFSET ? miny - Form.SCROLL_OFFSET : 0);\n }\n }\n}\n\nexport { Form };\n","import { Attributes, ParsedElement } from \"./elements.mjs\"\n\n\nconst INPUT_TEMPLATE = `\n<label data-tpl-for=\"id\" class=\"form-label\">{{{{ slots.default }}}}</label>\n<div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n</div>\n<ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n`;\n\nconst makeInputFragment = (el, template, slots) => {\n const input = el.input = slots.input = slots.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n input.setAttribute('ful-validation-target', '');\n\n const id = input.getAttribute('id') || el.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', el, slots.input)\n Attributes.defaultValue(slots.input, \"id\", id);\n Attributes.defaultValue(slots.input, \"type\", \"text\");\n Attributes.defaultValue(slots.input, \"placeholder\", \" \");\n const name = el.getAttribute('name');\n return template.render(el, { id, name, slots });\n}\n\nclass Input extends ParsedElement({\n states: [], \n attributes: ['value'],\n slots: true,\n template: INPUT_TEMPLATE\n}){\n render(template, slots) {\n const fragment = makeInputFragment(this, template, slots);\n this.replaceChildren(fragment);\n }\n get value() {\n return this.input.value;\n }\n set value(value) {\n this.input.value = value;\n }\n}\n\nexport { makeInputFragment, INPUT_TEMPLATE, Input };\n","import { Fragments, Attributes, ParsedElement } from \"./elements.mjs\"\n\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\n\nclass Select extends ParsedElement({\n states: [], \n attributes: [\"value\"],\n slots: true,\n template: `\n <label data-tpl-for=\"tsId\" class=\"form-label\">{{{{ slots.default }}}}</label>\n {{{{ input }}}}\n <div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error> \n `\n}) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(template, slots) {\n const type = this.getAttribute(\"type\") || 'local';\n const remote = type != 'local';\n const loadOnce = this.getAttribute('load') != 'always';\n const name = this.getAttribute('name');\n const input = slots.input = slots.input || (() => {\n return document.createElement(\"select\");\n })();\n input.setAttribute('ful-validation-target', '');\n\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-select');\n const tsId = `${id}-ts-control`;\n Attributes.forward('input-', this, input)\n Attributes.defaultValue(input, \"id\", id);\n Attributes.defaultValue(input, \"placeholder\", \" \");\n\n //tomselect needs the input to have a parent.\n //se we move the input to a fragment\n slots.input = Fragments.from(input);\n\n this.loaded = !remote;\n\n const tsDefaultConfig = {\n render: {\n loading: () => '<ful-spinner class=\"centered p-2\"></ful-spinner>'\n }\n }\n\n this._remote = remote;\n // we need to await this load in setValue when remote is configured and the option\n // is not loaded yet.\n // tomselect settings.load does not retun a promise as it wraps the configured load function\n // with a debouncer\n this._unwrappedRemoteLoad = async (query, callback) => {\n\n if (!remote || remote && loadOnce && this.loaded) {\n callback();\n return;\n }\n const type = query && query.hasOwnProperty('byId') ? 'id' : 'query';\n const qvalue = type === 'id' ? query.byId : query;\n const data = await (this.#loader ? this.#loader(qvalue, type) : []);\n if (type !== 'id') {\n this.loaded = true;\n }\n callback(data);\n };\n\n\n this.ts = new TomSelect(input, Object.assign(remote ? {\n preload: 'focus',\n load: this._unwrappedRemoteLoad,\n shouldLoad: (query) => this.shouldLoad ? this.shouldLoad(query) : true\n } : {}, tsDefaultConfig, this.tsConfig));\n //we remove the input to move it\n input.remove();\n template.renderTo(this, { id, tsId, name, input, slots });\n }\n #loader;\n set loader(l){\n this.#loader = l;\n // loader can be configured later so we load now\n if(this.hasAttribute('value')){\n this.value = this.getAttribute(\"value\");\n }\n }\n set value(v) {\n (async () => {\n if (this._remote) {\n await this._unwrappedRemoteLoad({ byId: v }, this.ts.loadCallback.bind(this.ts));\n }\n this.ts.setValue(v);\n })();\n }\n get value() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n}\n\nexport { Select };\n","import { Attributes, Fragments, ParsedElement } from \"./elements.mjs\"\n\nclass RadioGroup extends ParsedElement({\n states: ['disabled'], \n attributes: ['value'],\n slots: true,\n 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 <label data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n <footer data-tpl-if=\"slots.footer\">\n {{{{ slots.footer }}}}\n </footer>\n </fieldset>\n `\n}) {\n render(template, slots) {\n const name = this.getAttribute('name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slots.default.querySelectorAll('ful-radio'));\n const inputsAndLabels = radioEls.map(el => {\n const input = document.createElement('input');\n input.setAttribute('type', 'radio');\n Attributes.forward('input-', this, input);\n Attributes.forward('', el, input);\n input.setAttribute('name', `${name}-ignore`);\n input.setAttribute('ful-validation-target', '');\n input.dataset['fulBindInclude'] = 'never';\n const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n radioEls.forEach(el => el.remove());\n template.renderTo(this, {name, slots, inputsAndLabels});\n }\n get value() {\n const checked = this.querySelector('input[type=radio]:checked');\n return checked ? checked.value : null;\n }\n set value(value) {\n this.querySelector(`input[type=radio][value=${CSS.escape(value)}]`).checked = true;\n }\n}\n\n\nexport { RadioGroup };","import { ParsedElement } from \"./elements.mjs\"\n\nclass Spinner extends ParsedElement({\n slots: true,\n template: `\n <div class=\"ful-spinner-wrapper\">\n <div class=\"ful-spinner-text\">{{{{ slots.default }}}}</div>\n <div class=\"ful-spinner-icon\"></div>\n </div>\n `\n}) {\n render(template, slots) {\n template.renderTo(this, { slots });\n }\n}\n\nexport { Spinner };","class Wizard extends HTMLElement {\n constructor() {\n super();\n this.progress = [...this.children].filter(e => e.matches(\"header,ol,ul\"));\n\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n if (current === undefined && children.length > 0) {\n children[0].classList.add('active');\n }\n });\n if (this.querySelector('section.current') === null) {\n const firstSection = this.querySelector('section:first-of-type');\n if (firstSection !== null) {\n firstSection.classList.add('current');\n }\n }\n }\n next() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.nextElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.nextElementSibling.classList.add('current');\n\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n\n }\n prev() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.previousElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.previousElementSibling.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n moveTo(n) {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n p.children[+n]?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection?.classList.remove(\"current\");\n const nthSection = this.querySelector(`section:nth-child(${+n})`);\n nthSection.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n static configure() {\n return Wizard.custom('ful-wizard');\n }\n}\n\n\n\n\nexport { Wizard };\n"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","ContextInterceptor","constructor","context","document","querySelector","getAttribute","this","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","push","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","data","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","SyncEvent","CustomEvent","results","cancelable","dispatchTo","el","dispatchEvent","all","defaultPrevented","on","h","useCapture","addEventListener","Fragments","fromHtml","html","createElement","innerHTML","fragment","DocumentFragment","append","childNodes","toHtml","r","appendChild","nodes","fromChildNodes","Attributes","static","uid","id","asBoolean","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","LightSlots","namedSlots","matches","slot","removeAttribute","slots","fromEntries","default","Nodes","isParsed","c","parentNode","nextSibling","TemplatesRegistry","idToFragment","idToTemplate","ec","put","Template","fromFragment","tpl","configure","ftl","ElementsRegistry","templates","tagToclass","configured","defineTemplate","template","define","tag","klass","customElements","elements","upgradeQueue","q","dequeue","bind","enqueue","requestAnimationFrame","splice","upgrade","ParsedElement","conf","states","attributes","observed_states","observed_attributes","observed","concat","templateId","HTMLElement","observedAttributes","parsed","initialized","internals","attachInternals","connectedCallback","ownerDocument","readyState","observer","disconnect","MutationObserver","observe","childList","subtree","attributeChangedCallback","oldValue","newValue","render","flag","other","defineProperty","prototype","enumerable","configurable","has","et","event","detail","success","flatten","obj","keys","reduce","acc","pre","assign","mutate","raw","checked","Form","form","replaceChildren","async","preventDefault","spinner","submitter","values","errors","spin","querySelectorAll","hidden","disabled","vs","flattenedKey","CSS","escape","dataset","closest","IGNORED_CHILDREN_SELECTOR","result","path","match","previous","ckey","pkey","Number","isInteger","isArray","providePath","extract","es","fieldErrors","globalErrors","replace","validationTargetsSelector","input","fieldErrorsSelector","innerText","ys","parentElement","getBoundingClientRect","y","scrollY","miny","min","Infinity","scroll","scrollX","SCROLL_OFFSET","INPUT_TEMPLATE","makeInputFragment","Input","Select","tsConfig","remote","loadOnce","tsId","loaded","_remote","_unwrappedRemoteLoad","query","hasOwnProperty","qvalue","byId","loader","ts","TomSelect","preload","shouldLoad","loading","renderTo","l","loadCallback","setValue","getValue","RadioGroup","radioEls","inputsAndLabels","Spinner","Wizard","progress","children","p","firstSection","next","nextElementSibling","currentSection","bubbles","prev","previousElementSibling","moveTo","n","custom"],"mappings":"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"}
1
+ {"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/events.mjs","../src/elements/elements.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs","../src/elements/wizard.mjs"],"sourcesContent":["\n\nclass Base64 {\n static encode(arrayBuffer, dialect) {\n const d = dialect || Base64.URL_SAFE;\n const len = arrayBuffer.byteLength;\n const view = new Uint8Array(arrayBuffer);\n let res = '';\n for (let i = 0; i < len; i += 3) {\n const v1 = d[view[i] >> 2];\n const v2 = d[((view[i] & 3) << 4) | (view[i + 1] >> 4)];\n const v3 = d[((view[i + 1] & 15) << 2) | (view[i + 2] >> 6)];\n const v4 = d[view[i + 2] & 63];\n res += v1 + v2 + v3 + v4;\n }\n if (len % 3 === 2) {\n res = res.substring(0, res.length - 1);\n } else if (len % 3 === 1) {\n res = res.substring(0, res.length - 2);\n }\n return res;\n }\n static decode(str, dialect) {\n const d = dialect || Base64.URL_SAFE;\n let nbytes = Math.floor(str.length * 0.75);\n for (let i = 0; i !== str.length; ++i) {\n if (str[str.length - i - 1] !== '=') {\n break;\n }\n --nbytes;\n }\n const view = new Uint8Array(nbytes);\n\n let vi = 0;\n let si = 0;\n while (vi < str.length * 0.75) {\n const v1 = d.indexOf(str.charAt(si++));\n const v2 = d.indexOf(str.charAt(si++));\n const v3 = d.indexOf(str.charAt(si++));\n const v4 = d.indexOf(str.charAt(si++));\n view[vi++] = (v1 << 2) | (v2 >> 4);\n view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n view[vi++] = ((v3 & 3) << 6) | v4;\n }\n\n return view.buffer;\n }\n}\n\nBase64.STANDARD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nBase64.URL_SAFE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n\nclass Hex {\n static decode(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"invalid length\");\n }\n const lenInBytes = hex.length / 2;\n return new Uint8Array(lenInBytes).map((e, i) => {\n const offset = i * 2;\n const octet = hex.substring(offset, offset + 2);\n return parseInt(octet, 16);\n });\n }\n static encode(bytes, upper) {\n return Array.from(bytes)\n .map(b => b.toString(16))\n .map(b => upper ? b.toUpperCase() : b)\n .map(o => o.padStart(2, 0))\n .join('');\n }\n}\n\nexport { Base64, Hex };","class ContextInterceptor {\n constructor() {\n const context = document.querySelector(\"meta[name='context']\").getAttribute(\"content\");\n this.context = context.endsWith(\"/\") ? context.substring(0, context.length - 1) : context;\n }\n async intercept(request, chain){\n const separator = request.resource.startsWith(\"/\") ? \"\" : \"/\";\n request.resource = this.context + separator + request.resource;\n return await chain.proceed(request);\n }\n}\n\nclass CsrfTokenInterceptor {\n constructor() {\n this.k = document.querySelector(\"meta[name='_csrf_header']\").getAttribute(\"content\");\n this.v = document.querySelector(\"meta[name='_csrf']\").getAttribute(\"content\");\n }\n async intercept(request, chain){\n const headers = new Headers(request.options.headers);\n headers.set(this.k, this.v);\n request.options.headers = headers;\n return await chain.proceed(request);\n }\n}\n\nclass RedirectOnUnauthorizedInterceptor {\n constructor(redirectUri) {\n this.redirectUri = redirectUri;\n }\n async intercept(request, chain){\n const response = await chain.proceed(request);\n if (response.status !== 401) {\n return response;\n }\n window.location.href = this.redirectUri;\n }\n}\n\nclass Failure extends Error {\n static parseProblems(status, text) {\n const def = [{\n type: \"GENERIC_PROBLEM\",\n context: null,\n reason: `${status}: ${text}`,\n details: null\n }];\n try {\n return text ? JSON.parse(text) : def;\n } catch (e) {\n return def;\n }\n }\n static fromResponse(status, text) {\n return new Failure(status, Failure.parseProblems(status, text));\n }\n constructor(status, problems) {\n super(JSON.stringify(problems));\n this.name = `Failure:${status}`;\n this.status = status;\n this.problems = problems;\n }\n}\n\nclass HttpClientBuilder {\n constructor() {\n this.interceptors = [];\n }\n withContext() {\n this.interceptors.push(new ContextInterceptor());\n return this;\n }\n withCsrfToken() {\n this.interceptors.push(new CsrfTokenInterceptor());\n return this;\n }\n withRedirectOnUnauthorized(redirectUri) {\n this.interceptors.push(new RedirectOnUnauthorizedInterceptor(redirectUri));\n return this;\n }\n withInterceptors(...interceptors) {\n this.interceptors.push(...interceptors);\n return this;\n }\n build() {\n const interceptors = this.interceptors;\n return new HttpClient({interceptors});\n }\n}\n\nclass HttpCall {\n async intercept(request, chain){\n return await fetch(request.resource, request.options);\n } \n}\n\nclass HttpInterceptorChain {\n constructor(interceptors, current){\n this.interceptors = interceptors;\n this.current = current;\n }\n async proceed(request){\n const interceptor = this.interceptors[this.current];\n return await interceptor.intercept(request, new HttpInterceptorChain(this.interceptors, this.current + 1));\n }\n}\n\n\nclass HttpClient {\n static builder() {\n return new HttpClientBuilder();\n }\n constructor({interceptors}){\n this.interceptors = interceptors || [];\n }\n async exchange(resource, options) {\n const opts = options || {};\n const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options: opts});\n }\n async fetch(resource, options) {\n const response = await this.exchange(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n } \n return response;\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n } catch (e) {\n if (e instanceof Failure) {\n throw e;\n }\n throw new Failure(0, [{\n type: \"CONNECTION_PROBLEM\",\n context: null,\n reason: e.message,\n details: null\n }]);\n }\n }\n}\n\nfunction jsonRequest(method, body, headers){\n return {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n method: method,\n body: JSON.stringify(body) \n }\n}\nfunction jsonPost(body, headers){\n return jsonRequest('POST', body, headers);\n}\nfunction jsonPut(body, headers){\n return jsonRequest('PUT', body, headers);\n}\nfunction jsonPatch(body, headers){\n return jsonRequest('PATCH', body, headers);\n}\n\n\nexport { HttpClient, Failure, jsonRequest, jsonPost, jsonPut, jsonPatch };\n","\nclass Storage {\n constructor(prefix, storage) {\n this.prefix = prefix;\n this.storage = storage;\n }\n save(k, v) {\n this.storage.setItem(`${this.prefix}-${k}`, JSON.stringify(v));\n }\n load(k) {\n const got = this.storage.getItem(`${this.prefix}-${k}`);\n return got === undefined ? undefined : JSON.parse(got);\n }\n remove(k) {\n this.storage.removeItem(`${this.prefix}-${k}`);\n }\n pop(k) {\n const decoded = this.load(k);\n this.remove(k);\n return decoded;\n }\n}\n\nclass LocalStorage extends Storage {\n constructor(prefix) {\n super(prefix, localStorage);\n }\n}\n\nclass SessionStorage extends Storage {\n constructor(prefix) {\n super(prefix, sessionStorage);\n }\n}\n\nclass VersionedStorage {\n constructor(storage, key, dataSupplier){\n this.storage = storage;\n this.key = key;\n this.dataSupplier = dataSupplier;\n this.cache = null;\n \n }\n async load(revision){\n const saved = this.storage.load(this.key);\n if (!!saved && saved.revision === revision) {\n this.cache = saved.value;\n return;\n }\n const freshData = await this.dataSupplier(revision, this.key);\n this.storage.save(this.key, {\n revision: revision,\n value: freshData\n });\n this.cache = freshData;\n }\n data(){\n return this.cache;\n }\n}\n\n\n\nexport {LocalStorage, SessionStorage, VersionedStorage};","import { Base64 } from \"./encodings.mjs\";\nimport { SessionStorage } from \"./storage.mjs\";\n\n\nclass AuthorizationCodeFlow {\n static forKeycloak(clientId, realmBaseUrl, redirectUri){\n const scope = \"openid profile\";\n return new AuthorizationCodeFlow(clientId, scope, {\n auth: new URL(\"protocol/openid-connect/auth\", realmBaseUrl),\n token: new URL(\"protocol/openid-connect/token\", realmBaseUrl),\n logout: new URL(\"protocol/openid-connect/logout\", realmBaseUrl),\n registration: new URL(\"protocol/openid-connect/registrations\", realmBaseUrl),\n redirect: redirectUri\n }); \n }\n constructor(clientId, scope, {auth, token, registration, logout, redirect}) {\n this.storage = new SessionStorage(clientId);\n this.clientId = clientId;\n this.scope = scope;\n this.uri = {auth, token, registration, logout, redirect};\n }\n async action(uri, additionalParams){\n const pkceVerifier = Base64.encode(crypto.getRandomValues(new Uint8Array(32)).buffer);\n const pkceChallenge = Base64.encode(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(pkceVerifier)));\n const state = this.clientId + Base64.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);\n this.storage.save(AuthorizationCodeFlow.PKCE_AND_STATE_KEY, {\n state: state,\n verifier: pkceVerifier\n });\n const url = new URL(uri);\n url.searchParams.set(\"client_id\", this.clientId);\n url.searchParams.set(\"redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"response_type\", 'code');\n url.searchParams.set(\"scope\", this.scope);\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"code_challenge\", pkceChallenge);\n url.searchParams.set(\"code_challenge_method\", 'S256');\n Object.entries(additionalParams || {}).forEach(kv => {\n url.searchParams.set(kv[0], kv[1]);\n });\n window.location = url;\n }\n async registration(additionalParams){\n await this.action(this.uri.registration, additionalParams);\n }\n async applicationInitiatedAction(kcAction){\n await this.action(this.uri.auth, {\n kc_action: kcAction\n });\n }\n async _tokenExchange(code, state) {\n window.history.replaceState('', \"\", this.uri.redirect);\n const stateAndVerifier = this.storage.pop(AuthorizationCodeFlow.PKCE_AND_STATE_KEY);\n if (stateAndVerifier.state !== state) {\n throw new Error(\"State mismatch\");\n }\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"code\", code],\n [\"grant_type\", \"authorization_code\"],\n [\"code_verifier\", stateAndVerifier.verifier],\n [\"state\", stateAndVerifier.state],\n [\"redirect_uri\", this.uri.redirect]\n ])\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\"Error:\" + response.status + \": \" + text);\n }\n const token = await response.json();\n return new AuthorizationCodeFlowSession(this.clientId, token, this.uri);\n }\n async ensureLoggedIn() {\n const url = new URL(window.location.href);\n const code = url.searchParams.get(\"code\");\n if (code && this.storage.load(AuthorizationCodeFlow.PKCE_AND_STATE_KEY)) {\n //if callback from keycloak and we have our state still stored\n const state = url.searchParams.get(\"state\");\n return await this._tokenExchange(code, state);\n }\n //if not authorized\n await this.action(this.uri.auth, {});\n return null;\n }\n}\nAuthorizationCodeFlow.PKCE_AND_STATE_KEY = \"state-and-verifier\";\n\nclass AuthorizationCodeFlowSession {\n static parseToken(token) {\n const [rawHeader, rawPayload, signature] = token.split(\".\");\n const ut8decoder = new TextDecoder(\"utf-8\");\n return {\n header: JSON.parse(ut8decoder.decode(Base64.decode(rawHeader, Base64.STANDARD))),\n payload: JSON.parse(ut8decoder.decode(Base64.decode(rawPayload, Base64.STANDARD))),\n signature: signature\n };\n } \n constructor(clientId, t, {token, logout, redirect}) {\n this.clientId = clientId;\n this.token = t;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(t.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(t.refresh_token);\n this.uri = { token, logout, redirect }\n this.refreshCallback = null;\n }\n onRefresh(callback) {\n this.refreshCallback = callback;\n }\n async refresh() {\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"grant_type\", \"refresh_token\"],\n [\"refresh_token\", this.token.refresh_token]\n ])\n });\n if (!response.ok) {\n throw new Error(\"Error:\" + response.status + \": \" + response.text());\n }\n const token = await response.json();\n this.token = token;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(token.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(token.refresh_token);\n if (this.refreshCallback) {\n this.refreshCallback(this.token, this.accessToken, this.refreshToken);\n }\n }\n shouldBeRefreshed(gracePeriod) {\n const now = new Date().getTime();\n const refreshTokenExpiresAt = this.refreshToken.payload.exp * 1000;\n const expired = now > refreshTokenExpiresAt;\n const shouldRefresh = now - gracePeriod > refreshTokenExpiresAt;\n return !expired && shouldRefresh;\n }\n async refreshIf(gracePeriod) {\n if (!this.shouldBeRefreshed(gracePeriod)) {\n return;\n }\n await this.refresh();\n }\n logout() {\n const url = new URL(this.uri.logout);\n url.searchParams.set(\"post_logout_redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"id_token_hint\", this.token.id_token);\n window.location = url;\n }\n\n bearerToken() {\n return `Bearer ${this.token.access_token}`;\n }\n \n interceptor(gracePeriodBefore, gracePeriodAfter){\n return new AuthorizationCodeFlowInterceptor(this, gracePeriodBefore, gracePeriodAfter); \n }\n}\n\nclass AuthorizationCodeFlowInterceptor {\n constructor(session, gracePeriodBefore, gracePeriodAfter) {\n this.session = session;\n this.gracePeriodBefore = gracePeriodBefore || 2000;\n this.gracePeriodAfter = gracePeriodAfter || 30000;\n }\n async intercept(request, chain) {\n await this.session.refreshIf(this.gracePeriodBefore);\n const headers = new Headers(request.options.headers);\n headers.set(\"Authorization\", this.session.bearerToken());\n request.options.headers = headers;\n const response = await chain.proceed(request);\n await this.session.refreshIf(this.gracePeriodAfter);\n return response;\n }\n}\n\n\nexport {AuthorizationCodeFlow, AuthorizationCodeFlowSession, AuthorizationCodeFlowInterceptor };","\nconst timing = {\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n DEBOUNCE_DEFAULT: 0,\n DEBOUNCE_IMMEDIATE: 1,\n debounce(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.DEBOUNCE_DEFAULT;\n\n const later = () => {\n const elapsed = new Date().getTime() - previousTimestamp;\n if (timeoutMs > elapsed) {\n tid = setTimeout(later, timeoutMs - elapsed);\n return;\n }\n tid = null;\n if (opts !== timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n // This check is needed because `func` can recursively invoke `debounced`.\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n args = arguments;\n previousTimestamp = new Date().getTime();\n if (tid === null) {\n tid = setTimeout(later, timeoutMs);\n if (opts === timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n }\n };\n },\n THROTTLE_DEFAULT: 0,\n THROTTLE_NO_LEADING: 1,\n THROTTLE_NO_TRAILING: 2,\n throttle(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.THROTTLE_DEFAULT;\n\n const later = () => {\n previousTimestamp = (opts & timing.THROTTLE_NO_LEADING) ? 0 : new Date().getTime();\n tid = null;\n func(...args);\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n const now = new Date().getTime();\n if (!previousTimestamp && (opts & timing.THROTTLE_NO_LEADING)) {\n previousTimestamp = now;\n }\n const remaining = timeoutMs - (now - previousTimestamp);\n args = arguments;\n if (remaining <= 0 || remaining > timeoutMs) {\n if (tid !== null) {\n clearTimeout(tid);\n tid = null;\n }\n previousTimestamp = now;\n func(...args);\n if (tid === null) {\n args = [];\n }\n } else if (tid === null && !(opts & timing.THROTTLE_NO_TRAILING)) {\n tid = setTimeout(later, remaining);\n }\n };\n\n }\n};\n\n\nexport { timing };","\n\n// SyncEvent.on($0, 'asd', async e => { await ful.timing.sleep(10_000); return 3; })\n// const [success, results] = await new SyncEvent(\"asd\").dispatchTo($0);\nclass SyncEvent extends CustomEvent {\n #results;\n constructor(type, options) {\n super(type, {...options, cancelable: true});\n this.#results = [];\n }\n\n async dispatchTo(el) {\n // unlike \"native\" events, which are fired by the browser and invoke \n // event handlers asynchronously via the event loop, dispatchEvent() \n // invokes event handlers synchronously. \n // see: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent\n el.dispatchEvent(this);\n //we ignore the result of dispatchEvent and use defaultPrevented instead\n //because handlers can be async\n const results = await Promise.all(this.#results);\n return [!this.defaultPrevented, results];\n }\n\n static on(el, type, h, useCapture) {\n el.addEventListener(type, e => {\n //e *must* be an async event\n e.#results.push(h(e));\n }, useCapture);\n }\n}\n\n\nexport { SyncEvent }\n","import { SyncEvent } from \"../events.mjs\";\n\n\nclass Fragments {\n /**\n * \n * @param {...string} html \n * @returns \n */\n static fromHtml(...html) {\n const el = document.createElement(\"div\");\n el.innerHTML = html.join(\"\");\n const fragment = new DocumentFragment();\n fragment.append(...el.childNodes);\n return fragment;\n }\n /**\n * \n * @param {DocumentFragment} fragment \n * @returns \n */\n static toHtml(fragment) {\n var r = document.createElement(\"div\");\n r.appendChild(fragment);\n return r.innerHTML;\n }\n /**\n * \n * @param {...Node} nodes \n * @returns \n */\n static from(...nodes) {\n const fragment = new DocumentFragment();\n fragment.append(...nodes);\n return fragment;\n }\n /**\n * \n * @param {HTMLElement} el \n * @returns \n */\n static fromChildNodes(el) {\n const fragment = new DocumentFragment();\n fragment.append(...el.childNodes);\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n /**\n * \n * @param {string} prefix \n * @returns \n */\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n /**\n * \n * @param {HTMLElement} el \n * @param {string} k \n * @param {string} v \n * @returns \n */\n static defaultValue(el, k, v) {\n if (!el.hasAttribute(k)) {\n el.setAttribute(k, v);\n }\n return el.getAttribute(k);\n }\n /**\n * \n * @param {string} prefix \n * @param {HTMLElement} from \n * @param {HTMLElement} to \n */\n static forward(prefix, from, to) {\n from.getAttributeNames()\n .filter(a => a.startsWith(prefix))\n .forEach(a => {\n const target = a.substring(prefix.length);\n if (target === 'class') {\n to.classList.add(...from.getAttribute(prefix + \"class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(target, from.getAttribute(a))\n });\n }\n}\n\nclass LightSlots {\n /**\n * \n * @param {HTMLElement} el \n * @returns the slots\n */\n static from(el) {\n const namedSlots = Array.from(el.childNodes)\n .filter(el => el.matches && el.matches('[slot]'))\n .map(el => {\n el.remove();\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n });\n const slots = Object.fromEntries(namedSlots);\n slots.default = new DocumentFragment();\n slots.default.append(...el.childNodes);\n return slots;\n }\n}\n\nclass Nodes {\n static isParsed(el) {\n for (var c = el; c; c = c.parentNode) {\n if (c.nextSibling) {\n return true;\n }\n }\n return false;\n }\n}\n\nclass TemplatesRegistry {\n #idToFragment = {};\n #idToTemplate = {};\n #ec;\n put(k, fragment) {\n if (this.#ec) {\n this.#idToTemplate[k] = Template.fromFragment(fragment, ec);\n return;\n }\n this.#idToFragment[k] = fragment;\n }\n get(k) {\n if (!this.#ec) {\n throw new Error(\"TemplatesRegistry is not configured\");\n }\n const tpl = this.#idToTemplate[k];\n if (!tpl) {\n throw new Error(`missing template: '${k}'`);\n }\n return tpl;\n }\n configure(ec) {\n this.#ec = ec;\n for (const [k, fragment] of Object.entries(this.#idToFragment)) {\n delete this.#idToFragment[k];\n this.#idToTemplate[k] = ftl.Template.fromFragment(fragment, ec);\n }\n }\n}\n\n\nclass ElementsRegistry {\n #templates;\n #tagToclass;\n #configured;\n #id = 0;\n constructor() {\n this.#templates = new TemplatesRegistry();\n this.#tagToclass = {};\n }\n defineTemplate(html) {\n if (html === null || html === undefined) {\n return undefined;\n }\n const name = `unnamed-${++this.#id}`;\n this.#templates.put(name, Fragments.fromHtml(html));\n return name;\n }\n template(k) {\n if (k === null || k === undefined) {\n return undefined;\n }\n return this.#templates.get(k);\n }\n define(tag, klass) {\n if (!this.#configured) {\n this.#tagToclass[tag] = klass;\n return this;\n }\n customElements.define(tag, klass);\n return this;\n }\n configure(ec) {\n this.#templates.configure(ec);\n for (const [tag, klass] of Object.entries(this.#tagToclass)) {\n customElements.define(tag, klass);\n delete this.#tagToclass[tag];\n }\n this.#configured = true;\n }\n}\n\nconst elements = new ElementsRegistry();\n\n\nclass UpgradeQueue {\n #q = [];\n constructor() {\n document.addEventListener('DOMContentLoaded', this.dequeue.bind(this));\n }\n enqueue(el) {\n if (!this.#q.length) {\n requestAnimationFrame(this.dequeue.bind(this));\n }\n this.#q.push(el);\n }\n dequeue() {\n this.#q.splice(0).forEach(el => el.upgrade());\n }\n}\n\nconst upgradeQueue = new UpgradeQueue();\n\nconst mappers = {\n 'string': attr => attr,\n 'number': attr => attr === null ? null : Number(attr),\n 'bool': attr => attr !== null,\n 'json': attr => JSON.parse(attr)\n};\n\nconst ParsedElement = (conf) => {\n const { observed, template, slots } = conf || {};\n\n const attrsAndTypes = (observed || []).map(a => {\n const [attr, maybeType] = a.split(\":\");\n const type = maybeType?.trim() || 'string';\n if (!(type in mappers)) {\n throw new Error(`unsupported attribute type: ${type}`);\n }\n return [attr.trim(), type];\n });\n\n const attrsAndMappers = attrsAndTypes.map(([attr, type]) => [attr, mappers[type]]);\n\n const attrToMapper = Object.fromEntries(attrsAndMappers);\n\n const templateId = elements.defineTemplate(template);\n\n const k = class extends HTMLElement {\n static get observedAttributes() {\n return Object.keys(attrToMapper);\n }\n #parsed;\n #initialized;\n #internals;\n constructor(...args) {\n super(...args);\n this.#internals = this.attachInternals();\n }\n get initialized() {\n return this.#initialized;\n }\n get internals() {\n return this.#internals;\n }\n connectedCallback() {\n if (this.#parsed) {\n return;\n }\n if (this.ownerDocument.readyState === 'complete' || Nodes.isParsed(this)) {\n upgradeQueue.enqueue(this);\n return;\n }\n this.ownerDocument.addEventListener('DOMContentLoaded', () => {\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n const observer = new MutationObserver(() => {\n if (!Nodes.isParsed(this)) {\n return;\n }\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n observer.observe(this.parentNode, { childList: true, subtree: true });\n }\n attributeChangedCallback(attr, oldValue, newValue) {\n if (!this.#parsed || oldValue === newValue) {\n return;\n }\n const mapper = attrToMapper[attr];\n this[attr] = mapper(newValue);\n }\n async upgrade() {\n if (this.#parsed) {\n return;\n }\n this.#parsed = true;\n await this.render(elements.template(templateId), slots ? LightSlots.from(this) : undefined);\n\n for (const [attr, mapper] of attrsAndMappers) {\n if (this.hasAttribute(attr)) {\n this[attr] = mapper(this.getAttribute(attr));\n }\n }\n this.#initialized = true;\n }\n };\n\n for (const [attr, type] of attrsAndTypes.filter(([a, t]) => t === 'bool')) {\n Object.defineProperty(k.prototype, attr, {\n enumerable: true,\n configurable: true,\n get() {\n return this.internals.states.has(`--${attr}`);\n },\n set(value) {\n const et = this.initialized ? 'changed' : 'init';\n const event = new SyncEvent(`${attr}:${et}`, {\n detail: {\n target: this,\n value: value\n }\n });\n (async () => {\n const [success, results] = await event.dispatchTo(this);\n if (!success) {\n return;\n }\n //see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents\n this.internals.states[v ? 'add' : 'delete'](`--${attr}`);\n })();\n }\n });\n }\n\n return k;\n}\n\nexport { Fragments, Attributes, LightSlots, Nodes, TemplatesRegistry, ElementsRegistry, elements, ParsedElement };\n","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { ParsedElement } from \"./elements.mjs\"\n\nfunction flatten(obj, prefix) {\n return Object.keys(obj).reduce((acc, k) => {\n const pre = prefix.length ? prefix + '.' : '';\n if (typeof obj[k] === 'object' && obj[k] !== null) {\n Object.assign(acc, flatten(obj[k], pre + k));\n } else {\n acc[pre + k] = obj[k];\n }\n return acc;\n }, {});\n}\n\nfunction providePath(result, path, value) {\n const keys = path.split(\".\").map((k) => k.match(/^[0-9]+$/) ? +k : k);\n let current = result;\n let previous = null;\n for (let i = 0; ; ++i) {\n const ckey = keys[i];\n const pkey = keys[i - 1];\n if (Number.isInteger(ckey) && !Array.isArray(current)) {\n if (previous !== null) {\n previous[pkey] = current = [];\n } else {\n result = current = [];\n }\n }\n if (i === keys.length - 1) {\n //when value is undefined we only want to define the property if it's not defined \n current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);\n return result;\n }\n if (current[ckey] === undefined) {\n current[ckey] = {};\n }\n previous = current;\n current = current[ckey];\n }\n}\n\nfunction extract(el) {\n if (el.getAttribute('type') === 'radio') {\n if (!el.checked) {\n return undefined;\n }\n return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['fulBindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n return el.value || null;\n}\n\nfunction mutate(el, raw) {\n if (el.getAttribute('type') === 'radio') {\n el.checked = el.getAttribute('value') === raw;\n return;\n }\n if (el.getAttribute('type') === 'checkbox') {\n el.checked = raw;\n return;\n }\n el.value = raw;\n}\n\nclass Form extends ParsedElement() {\n static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';\n static SCROLL_OFFSET = 50;\n render() {\n const form = document.createElement('form');\n form.replaceChildren(...this.childNodes);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinner(true);\n try {\n if (this.submitter) {\n await this.submitter(this.values, this);\n }\n } catch (e) {\n if (e instanceof Failure) {\n this.errors = e.problems;\n return;\n }\n throw e;\n } finally {\n this.spinner(false)\n }\n })\n this.replaceChildren(form);\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => el.hidden = !spin)\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => el.disabled = spin)\n }\n set values(vs) {\n for (const [flattenedKey, value] of Object.entries(flatten(vs, ''))) {\n this.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`).forEach(el => mutate(el, value));\n }\n }\n get values() {\n return Array.from(this.querySelectorAll('[name]'))\n .filter((el) => {\n if (el.dataset['fulBindInclude'] === 'never') {\n return false;\n }\n return el.dataset['fulBindInclude'] === 'always' || el.closest(Form.IGNORED_CHILDREN_SELECTOR) === null;\n })\n .reduce((result, el) => {\n return providePath(result, el.getAttribute('name'), extract(el));\n }, {});\n }\n set errors(es) {\n const fieldErrors = es.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT');\n const globalErrors = es.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n this.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.replaceChildren();\n el.setAttribute('hidden', '');\n });\n fieldErrors.forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n const validationTargetsSelector = `[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`;\n this.querySelectorAll(validationTargetsSelector).forEach(input => input.classList.add('is-invalid'));\n const fieldErrorsSelector = `ful-field-error[field='${CSS.escape(name)}']`;\n this.querySelectorAll(fieldErrorsSelector).forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.innerText = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.removeAttribute('hidden');\n }\n });\n if (!this.hasAttribute('scroll-on-error')) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('ful-field-error'))\n .map(el => el.parentElement ? el.parentElement : el)\n .map(el => el.getBoundingClientRect().y + window.scrollY);\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > Form.SCROLL_OFFSET ? miny - Form.SCROLL_OFFSET : 0);\n }\n }\n}\n\nexport { Form };\n","import { Attributes, ParsedElement } from \"./elements.mjs\"\n\n\nconst INPUT_TEMPLATE = `\n<label data-tpl-for=\"id\" class=\"form-label\">{{{{ slots.default }}}}</label>\n<div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n</div>\n<ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n`;\n\nconst makeInputFragment = (el, template, slots) => {\n const input = el.input = slots.input = slots.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n input.setAttribute('ful-validation-target', '');\n\n const id = input.getAttribute('id') || el.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', el, slots.input)\n Attributes.defaultValue(slots.input, \"id\", id);\n Attributes.defaultValue(slots.input, \"type\", \"text\");\n Attributes.defaultValue(slots.input, \"placeholder\", \" \");\n const name = el.getAttribute('name');\n return template.render(el, { id, name, slots });\n}\n\nclass Input extends ParsedElement({\n observed: ['value'],\n slots: true,\n template: INPUT_TEMPLATE\n}){\n render(template, slots) {\n const fragment = makeInputFragment(this, template, slots);\n this.replaceChildren(fragment);\n }\n get value() {\n return this.input.value;\n }\n set value(value) {\n this.input.value = value;\n }\n}\n\nexport { makeInputFragment, INPUT_TEMPLATE, Input };\n","import { Fragments, Attributes, ParsedElement } from \"./elements.mjs\"\n\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\n\nclass Select extends ParsedElement({\n observed: [\"value\"],\n slots: true,\n template: `\n <label data-tpl-for=\"tsId\" class=\"form-label\">{{{{ slots.default }}}}</label>\n {{{{ input }}}}\n <div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error> \n `\n}) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(template, slots) {\n const type = this.getAttribute(\"type\") || 'local';\n const remote = type != 'local';\n const loadOnce = this.getAttribute('load') != 'always';\n const name = this.getAttribute('name');\n const input = slots.input = slots.input || (() => {\n return document.createElement(\"select\");\n })();\n input.setAttribute('ful-validation-target', '');\n\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-select');\n const tsId = `${id}-ts-control`;\n Attributes.forward('input-', this, input)\n Attributes.defaultValue(input, \"id\", id);\n Attributes.defaultValue(input, \"placeholder\", \" \");\n\n //tomselect needs the input to have a parent.\n //se we move the input to a fragment\n slots.input = Fragments.from(input);\n\n this.loaded = !remote;\n\n const tsDefaultConfig = {\n render: {\n loading: () => '<ful-spinner class=\"centered p-2\"></ful-spinner>'\n }\n }\n\n this._remote = remote;\n // we need to await this load in setValue when remote is configured and the option\n // is not loaded yet.\n // tomselect settings.load does not retun a promise as it wraps the configured load function\n // with a debouncer\n this._unwrappedRemoteLoad = async (query, callback) => {\n\n if (!remote || remote && loadOnce && this.loaded) {\n callback();\n return;\n }\n const type = query && query.hasOwnProperty('byId') ? 'id' : 'query';\n const qvalue = type === 'id' ? query.byId : query;\n const data = await (this.#loader ? this.#loader(qvalue, type) : []);\n if (type !== 'id') {\n this.loaded = true;\n }\n callback(data);\n };\n\n\n this.ts = new TomSelect(input, Object.assign(remote ? {\n preload: 'focus',\n load: this._unwrappedRemoteLoad,\n shouldLoad: (query) => this.shouldLoad ? this.shouldLoad(query) : true\n } : {}, tsDefaultConfig, this.tsConfig));\n //we remove the input to move it\n input.remove();\n template.renderTo(this, { id, tsId, name, input, slots });\n }\n #loader;\n set loader(l){\n this.#loader = l;\n // loader can be configured later so we load now\n if(this.hasAttribute('value')){\n this.value = this.getAttribute(\"value\");\n }\n }\n set value(v) {\n (async () => {\n if (this._remote) {\n await this._unwrappedRemoteLoad({ byId: v }, this.ts.loadCallback.bind(this.ts));\n }\n this.ts.setValue(v);\n })();\n }\n get value() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n}\n\nexport { Select };\n","import { Attributes, Fragments, ParsedElement } from \"./elements.mjs\"\n\nclass RadioGroup extends ParsedElement({\n observed: ['value', 'disabled:bool'],\n slots: true,\n 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 {{{{ ial[1] }}}}\n </label>\n </div>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n <footer data-tpl-if=\"slots.footer\">\n {{{{ slots.footer }}}}\n </footer>\n </fieldset>\n `\n}) {\n render(template, slots) {\n const name = this.getAttribute('name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slots.default.querySelectorAll('ful-radio'));\n const inputsAndLabels = radioEls.map(el => {\n const input = document.createElement('input');\n input.setAttribute('type', 'radio');\n Attributes.forward('input-', this, input);\n Attributes.forward('', el, input);\n input.setAttribute('name', `${name}-ignore`);\n input.setAttribute('ful-validation-target', '');\n input.dataset['fulBindInclude'] = 'never';\n const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n radioEls.forEach(el => el.remove());\n template.renderTo(this, {name, slots, inputsAndLabels});\n }\n get value() {\n const checked = this.querySelector('input[type=radio]:checked');\n return checked ? checked.value : null;\n }\n set value(value) {\n this.querySelector(`input[type=radio][value=${CSS.escape(value)}]`).checked = true;\n }\n}\n\n\nexport { RadioGroup };","import { ParsedElement } from \"./elements.mjs\"\n\nclass Spinner extends ParsedElement({\n slots: true,\n template: `\n <div class=\"ful-spinner-wrapper\">\n <div class=\"ful-spinner-text\">{{{{ slots.default }}}}</div>\n <div class=\"ful-spinner-icon\"></div>\n </div>\n `\n}) {\n render(template, slots) {\n template.renderTo(this, { slots });\n }\n}\n\nexport { Spinner };","class Wizard extends HTMLElement {\n constructor() {\n super();\n this.progress = [...this.children].filter(e => e.matches(\"header,ol,ul\"));\n\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n if (current === undefined && children.length > 0) {\n children[0].classList.add('active');\n }\n });\n if (this.querySelector('section.current') === null) {\n const firstSection = this.querySelector('section:first-of-type');\n if (firstSection !== null) {\n firstSection.classList.add('current');\n }\n }\n }\n next() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.nextElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.nextElementSibling.classList.add('current');\n\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n\n }\n prev() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.previousElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.previousElementSibling.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n moveTo(n) {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n p.children[+n]?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection?.classList.remove(\"current\");\n const nthSection = this.querySelector(`section:nth-child(${+n})`);\n nthSection.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n static configure() {\n return Wizard.custom('ful-wizard');\n }\n}\n\n\n\n\nexport { Wizard };\n"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","ContextInterceptor","constructor","context","document","querySelector","getAttribute","this","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","push","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","data","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","SyncEvent","CustomEvent","results","cancelable","dispatchTo","el","dispatchEvent","all","defaultPrevented","on","h","useCapture","addEventListener","Fragments","fromHtml","html","createElement","innerHTML","fragment","DocumentFragment","append","childNodes","toHtml","r","appendChild","nodes","fromChildNodes","Attributes","static","uid","id","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","LightSlots","namedSlots","matches","slot","removeAttribute","slots","fromEntries","default","Nodes","isParsed","c","parentNode","nextSibling","TemplatesRegistry","idToFragment","idToTemplate","ec","put","Template","fromFragment","tpl","configure","ftl","ElementsRegistry","templates","tagToclass","configured","defineTemplate","template","define","tag","klass","customElements","elements","upgradeQueue","q","dequeue","bind","enqueue","requestAnimationFrame","splice","upgrade","mappers","string","attr","number","Number","bool","ParsedElement","conf","observed","attrsAndTypes","maybeType","trim","attrsAndMappers","attrToMapper","templateId","HTMLElement","observedAttributes","keys","parsed","initialized","internals","attachInternals","connectedCallback","ownerDocument","readyState","observer","disconnect","MutationObserver","observe","childList","subtree","attributeChangedCallback","oldValue","newValue","mapper","render","defineProperty","prototype","enumerable","configurable","states","has","et","event","detail","success","flatten","obj","reduce","acc","pre","assign","mutate","raw","checked","Form","form","replaceChildren","async","preventDefault","spinner","submitter","values","errors","spin","querySelectorAll","hidden","disabled","vs","flattenedKey","CSS","escape","dataset","closest","IGNORED_CHILDREN_SELECTOR","result","path","match","previous","ckey","pkey","isInteger","isArray","providePath","extract","es","fieldErrors","globalErrors","replace","validationTargetsSelector","input","fieldErrorsSelector","innerText","ys","parentElement","getBoundingClientRect","y","scrollY","miny","min","Infinity","scroll","scrollX","SCROLL_OFFSET","INPUT_TEMPLATE","makeInputFragment","Input","Select","tsConfig","remote","loadOnce","tsId","loaded","_remote","_unwrappedRemoteLoad","query","hasOwnProperty","qvalue","byId","loader","ts","TomSelect","preload","shouldLoad","loading","renderTo","l","loadCallback","setValue","getValue","RadioGroup","radioEls","inputsAndLabels","Spinner","Wizard","progress","children","p","firstSection","next","nextElementSibling","currentSection","bubbles","prev","previousElementSibling","moveTo","n","custom"],"mappings":"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"}