mirror of
https://github.com/bigskysoftware/htmx.git
synced 2026-01-20 15:46:16 +00:00
1 line
33 KiB
JavaScript
1 line
33 KiB
JavaScript
var htmx=(()=>{class e{#e=null;#t=[];issue(e,t){return e.queueStrategy=t,this.#e?"replace"===t||"abort"!==t&&"abort"===this.#e.queueStrategy?(this.#t.map(e=>e.status="dropped"),this.#t=[],this.#e.request.abort(),this.#e=e,!0):("queue all"===t?(this.#t.push(e),e.status="queued"):"drop"===t?e.status="dropped":"queue last"===t?(this.#t.map(e=>e.status="dropped"),this.#t=[e],e.status="queued"):0===this.#t.length&&"abort"!==t?(this.#t.push(e),e.status="queued"):e.status="dropped",!1):(this.#e=e,!0)}finish(){this.#e=null}next(){return this.#t.shift()}abort(){this.#e?.abort?.()}more(){return this.#t?.length}}return new class{#r=new Map;#i="";#s=new Set;#n;#a;#o="a,form";#l=["get","post","put","patch","delete"];#h;#c;#u;constructor(){this.#d(),this.#f(),this.#a=`[${this.#m("hx-action")}],[${this.#m("hx-get")}],[${this.#m("hx-post")}],[${this.#m("hx-put")}],[${this.#m("hx-patch")}],[${this.#m("hx-delete")}]`,this.#h=(new XPathEvaluator).createExpression(`.//*[@*[ starts-with(name(), "${this.#m("hx-on")}")]]`),this.#n={attributeValue:this.#p.bind(this),parseTriggerSpecs:this.#g.bind(this),determineMethodAndAction:this.#x.bind(this),createRequestContext:this.#b.bind(this),collectFormData:this.#y.bind(this),handleHxVals:this.#v.bind(this),insertContent:this.#S.bind(this),morph:this.#E.bind(this)},document.addEventListener("DOMContentLoaded",()=>{this.#w(),this.process(document.body)})}#d(){this.config={version:"4.0.0-alpha6",logAll:!1,prefix:"",transitions:!1,history:!0,mode:"same-origin",defaultSwap:"innerHTML",indicatorClass:"htmx-indicator",requestClass:"htmx-request",includeIndicatorCSS:!0,defaultTimeout:6e4,extensions:"",sse:{reconnect:!1,reconnectDelay:500,reconnectMaxDelay:6e4,reconnectMaxAttempts:10,reconnectJitter:.3,pauseInBackground:!1},morphIgnore:["data-htmx-powered"],morphScanLimit:10,noSwap:[204,304],implicitInheritance:!1};let e=document.querySelector('meta[name="htmx-config"]');e&&this.#C(e.content,this.config),this.#i=this.config.extensions}#f(){if(!1!==this.config.includeIndicatorCSS){let e="";this.config.inlineStyleNonce&&(e=` nonce="${this.config.inlineStyleNonce}"`);let t=this.config.indicatorClass,r=this.config.requestClass;document.head.insertAdjacentHTML("beforeend",`<style${e}>.${t}{opacity:0;visibility: hidden} .${r} .${t}, .${r}.${t}{opacity:1;visibility: visible;transition: opacity 200ms ease-in}</style>`)}}registerExtension(e,t){return!(this.#i&&!this.#i.split(/,\s*/).includes(e))&&(!this.#s.has(e)&&(this.#s.add(e),t.init&&t.init(this.#n),void Object.entries(t).forEach(([e,t])=>{this.#r.get(e)?.push(t)||this.#r.set(e,[t])})))}#q(e){return!e.closest||null!=e.closest(`[${this.#m("hx-ignore")}]`)}#m(e){return this.config.prefix?e.replace("hx-",this.config.prefix):e}#A(e,t){let r=[...e.querySelectorAll(t)];return e.matches?.(t)&&r.unshift(e),r}#T(e){return"before"===e?"beforebegin":"after"===e?"afterend":"prepend"===e?"afterbegin":"append"===e?"beforeend":e}#M(e,t){let r=[];return this.#p(e,t,void 0,(e,t)=>{e?.split(/\s*,\s*/).includes("this")&&r.push(t)}),r}#p(e,t,r,i){let s=(t=this.#m(t))+this.#N(":append"),n=t+(this.config.implicitInheritance?"":this.#N(":inherited")),a=t+this.#N(":inherited:append");if(e.hasAttribute(t)){let r=e.getAttribute(t);return i?i(r,e):r}if(e.hasAttribute(n)){let t=e.getAttribute(n);return i?i(t,e):t}if(e.hasAttribute(s)||e.hasAttribute(a)){let r=e.getAttribute(s)||e.getAttribute(a),o=e.parentNode?.closest?.(`[${CSS.escape(n)}],[${CSS.escape(a)}]`);if(i&&i(r,e),o){let e=this.#p(o,t,void 0,i);return e?(e+","+r).replace(/[{}]/g,""):r}return r}let o=e.parentNode?.closest?.(`[${CSS.escape(n)}],[${CSS.escape(a)}]`);if(o){let r=this.#p(o,t,void 0,i);return!i&&r&&this.config.implicitInheritance&&this.#I(e,"htmx:after:implicitInheritance",{elt:e,name:t,parent:o}),r}return r}#H(e){if("{"===e[0])return JSON.parse(e);return[...e.matchAll(/(?:"([^"]+)"|([^\s,:]+))(?:\s*:\s*(?:"([^"]*)"|'([^']*)'|<([^>]+)\/>|([^\s,]+)))?(?=\s|,|$)/g)].reduce((e,t)=>{let r=(t[1]??t[2]).split("."),i=(t[3]??t[4]??t[5]??t[6]??"true").trim();return"true"===i?i=!0:"false"===i?i=!1:/^\d+$/.test(i)&&(i=parseInt(i)),r.slice(0,-1).reduce((e,t)=>e[t]??={},e)[r.at(-1)]=i,e},{})}#C(e,t){let r=this.#H(e);for(let e in r){let i=r[e];i&&"object"==typeof i&&!Array.isArray(i)&&t[e]?Object.assign(t[e],i):t[e]=i}return t}#g(e){return e.split(",").map(e=>{let t=e.match(/^\s*(\S+\[[^\]]*\]|\S+)\s*(.*?)\s*$/);if(!t||!t[1])return null;if(t[1].includes("[")&&!t[1].includes("]"))throw"unterminated:"+t[1];let r=t[2]?this.#H(t[2]):{};return r.name=t[1],r}).filter(e=>e)}#x(e,t){if(this.#O(e))return this.#L(e,t);{let t=this.#p(e,"hx-method")||"GET",r=this.#p(e,"hx-action");if(!r)for(let i of this.#l){let s=this.#p(e,"hx-"+i);if(s){r=s,t=i;break}}return t=t.toUpperCase(),{action:r,method:t}}}#L(e,t){if(e.matches("a"))return{action:e.getAttribute("href"),method:"GET"};return{action:t.submitter?.getAttribute?.("formAction")||e.getAttribute("action"),method:t.submitter?.getAttribute?.("formMethod")||e.getAttribute("method")||"GET"}}#k(e){this.#V(e)&&this.#R(e,"htmx:before:init",{},!0)&&(e._htmx={eventHandler:this.#_(e)},e.setAttribute("data-htmx-powered","true"),this.#B(e),this.#j(e),this.#R(e,"htmx:after:init",{},!0),this.#R(e,"load",{},!1))}#_(e){return async t=>{try{let r=this.#b(e,t);await this.#D(r)}catch(e){console.error(e)}}}#b(e,t){let{action:r,method:i}=this.#x(e,t),[s,n]=(r||"").split("#"),a=new AbortController,o={sourceElement:e,sourceEvent:t,status:"created",select:this.#p(e,"hx-select"),selectOOB:this.#p(e,"hx-select-oob"),target:this.#p(e,"hx-target"),swap:this.#p(e,"hx-swap")??this.config.defaultSwap,push:this.#p(e,"hx-push-url"),replace:this.#p(e,"hx-replace-url"),transition:this.config.transitions,confirm:this.#p(e,"hx-confirm"),request:{validate:"true"===this.#p(e,"hx-validate",!e.matches("form")||e.noValidate||t.submitter?.formNoValidate?"false":"true"),action:s,anchor:n,method:i,headers:this.#$(e),abort:a.abort.bind(a),credentials:"same-origin",signal:a.signal,mode:this.config.mode}};e._htmx?.boosted&&this.#C(e._htmx.boosted,o),o.target=this.#P(e,o.target);let l=this.#p(e,"hx-config");return l&&(this.#C(l,o.request),o.request.etag&&((e._htmx||={}).etag||=o.request.etag)),e._htmx?.etag&&(o.request.headers["If-none-match"]=e._htmx.etag),o}#F(e){return`${e.tagName.toLowerCase()}${e.id?"#"+e.id:""}`}#$(e){let t={"HX-Request":"true","HX-Source":this.#F(e),"HX-Current-URL":location.href,Accept:"text/html, text/event-stream"};return this.#O(e)&&(t["HX-Boosted"]="true"),t}#z(e,t){return this.#U(e,"hx-headers",e=>{for(let r in e)t[r]=String(e[r])})}#P(e,t){return t instanceof Element?t:null!=t?this.#W(e,t,"hx-target"):this.#O(e)?document.body:e}#O(e){return e?._htmx?.boosted}async#D(e){let t=e.sourceElement,r=e.sourceEvent;if(!t.isConnected)return;if(this.#Q(r))return;this.#J(r)&&r.preventDefault();let i=t.form||t.closest("form"),s=this.#y(t,i,r.submitter,e.request.validate);if(!s)return;let n=this.#v(t,s);if(n&&await n,e.values)for(let t in e.values)s.delete(t),s.append(t,e.values[t]);let a=this.#z(t,e.request.headers);if(a&&await a,e.request.headers["HX-Request-Type"]=e.target===document.body||e.select?"full":"partial",e.target&&(e.request.headers["HX-Target"]=this.#F(e.target)),Object.assign(e.request,{form:i,submitter:r.submitter,body:s}),!this.#R(t,"htmx:config:request",{ctx:e}))return;if(!this.#l.includes(e.request.method.toLowerCase()))return;let o=this.#G(e.request.action);if(null!=o){let t=Object.fromEntries(e.request.body);return void await this.#X(e.sourceElement,t,o,!1)}if(/GET|DELETE/.test(e.request.method)){let t=new URL(e.request.action,document.baseURI);for(let r of e.request.body.keys())t.searchParams.delete(r);for(let[r,i]of e.request.body)t.searchParams.append(r,i);t.origin===location.origin?e.request.action=t.pathname+t.search:e.request.action=t.href,e.request.body=null}else"multipart/form-data"!==this.#p(t,"hx-encoding")&&(e.request.body=new URLSearchParams(e.request.body));await this.#K(e)}async#K(e){let t=e.sourceElement,r=this.#Y(t),i=this.#Z(t);if(!i.issue(e,r))return;e.status="issuing",this.#ee(e);let s=this.#te(t),n=this.#re(t);try{if(e.confirm){let r=null;if(!await new Promise(i=>{if(r=i,this.#R(t,"htmx:confirm",{ctx:e,issueRequest:e=>r?.(!1!==e)})){let r=this.#G(e.confirm);i(r?this.#X(t,{},r,!0):window.confirm(e.confirm))}}))return}if(e.fetch||=window.fetch.bind(window),!this.#R(t,"htmx:before:request",{ctx:e}))return;let r=await e.fetch(e.request.action,e.request);if(e.response={raw:r,status:r.status,headers:r.headers},this.#ie(e),e.isSSE=r.headers.get("Content-Type")?.includes("text/event-stream"),e.isSSE||(e.text=await r.text()),!this.#R(t,"htmx:after:request",{ctx:e}))return;if(this.#se(e))return;let i=r.headers.get("Content-Type")?.includes("text/event-stream");i?await this.#ne(e,t,r):"issuing"===e.status&&(e.hx.retarget&&(e.target=e.hx.retarget),e.hx.reswap&&(e.swap=e.hx.reswap),e.hx.reselect&&(e.select=e.hx.reselect),e.status="response received",this.#ae(e),await this.swap(e),e.status="swapped")}catch(r){e.status="error: "+r,this.#R(t,"htmx:error",{ctx:e,error:r})}finally{this.#oe(s),this.#le(n),this.#R(t,"htmx:finally:request",{ctx:e}),i.finish(),i.more()&&this.#K(i.next())}}#ie(e){e.hx={};for(let[t,r]of e.response.raw.headers)t.toLowerCase().startsWith("hx-")&&(e.hx[t.slice(3).toLowerCase().replace(/-/g,"")]=r)}#se(e){if(e.hx.trigger&&this.#he(e.hx.trigger,e.sourceElement),"true"===e.hx.refresh)return location.reload(),!0;if(e.hx.redirect)return location.href=e.hx.redirect,!0;if(e.hx.location){let t=e.hx.location,r={};return("{"===t[0]||/[\s,]/.test(t))&&(r=this.#H(t),t=r.path,delete r.path),r.push=r.push||"true",this.ajax("GET",t,r),!0}e.response?.headers?.get?.("Etag")&&(e.sourceElement._htmx||={},e.sourceElement._htmx.etag=e.response.headers.get("Etag"))}async#ne(e,t,r){let i={...this.config.sse,...e.request.sse},s=()=>new Promise(e=>{let t=()=>!document.hidden&&(document.removeEventListener("visibilitychange",t),e());document.addEventListener("visibilitychange",t)}),n=null,a=0,o=r;for(;t.isConnected;){if(a>0){if(!i.reconnect||a>i.reconnectMaxAttempts)break;if(i.pauseInBackground&&document.hidden&&(await s(),!t.isConnected))break;let r=Math.min(this.parseInterval(i.reconnectDelay)*Math.pow(2,a-1),this.parseInterval(i.reconnectMaxDelay));if(i.reconnectJitter>0){let e=r*i.reconnectJitter,t=(2*Math.random()-1)*e;r=Math.max(0,r+t)}let l={attempt:a,delay:r,lastEventId:n,cancelled:!1};if(e.status="reconnecting to stream",!this.#R(t,"htmx:before:sse:reconnect",{ctx:e,reconnect:l})||l.cancelled)break;if(await new Promise(e=>setTimeout(e,l.delay)),!t.isConnected)break;try{n&&((e.request.headers=e.request.headers||{})["Last-Event-ID"]=n),o=await fetch(e.request.action,e.request)}catch(r){e.status="stream error",this.#R(t,"htmx:error",{ctx:e,error:r}),a++;continue}}if(!this.#R(t,"htmx:before:sse:stream",{ctx:e}))break;e.status="streaming",a=0;try{for await(const r of this.#ce(o)){if(!t.isConnected)break;if(i.pauseInBackground&&document.hidden&&(await s(),!t.isConnected))break;let a={data:r.data,event:r.event,id:r.id,cancelled:!1};this.#R(t,"htmx:before:sse:message",{ctx:e,message:a})&&!a.cancelled&&(r.id&&(n=r.id),r.event?(this.#R(t,r.event,{data:r.data,id:r.id}),this.#R(t,"htmx:after:sse:message",{ctx:e,message:a})):(e.text=r.data,e.status="stream message received",e.response.cancelled||(await this.swap(e),e.status="swapped"),this.#R(t,"htmx:after:sse:message",{ctx:e,message:a})))}}catch(r){e.status="stream error",this.#R(t,"htmx:error",{ctx:e,error:r})}if(!t.isConnected)break;this.#R(t,"htmx:after:sse:stream",{ctx:e}),a++}}async*#ce(e){let t=e.body.getReader(),r=new TextDecoder,i="",s={data:"",event:"",id:"",retry:null};try{for(;;){let{done:e,value:n}=await t.read();if(e)break;i+=r.decode(n,{stream:!0});let a=i.split("\n");i=a.pop()||"";for(let e of a){if(!e||"\r"===e){s.data&&(yield s,s={data:"",event:"",id:"",retry:null});continue}let t=e.indexOf(":");if(t<=0)continue;let r=e.slice(0,t),i=e.slice(t+1).trimStart();if("data"===r)s.data+=(s.data?"\n":"")+i;else if("event"===r)s.event=i;else if("id"===r)s.id=i;else if("retry"===r){let e=parseInt(i,10);isNaN(e)||(s.retry=e)}}}}finally{t.releaseLock()}}#ee(e){let t;t=e.request.timeout?this.parseInterval(e.request.timeout):this.config.defaultTimeout,e.requestTimeout=setTimeout(()=>e.abort?.(),t)}#Y(e){let t=this.#p(e,"hx-sync");return t?.split(":")[1]||"queue first"}#Z(t){let r=this.#p(t,"hx-sync"),i=t;if(r&&r.includes(":")){let e=r.split(":")[0];i=this.#W(t,e,"hx-sync")}return i._htmxRequestQueue||=new e}#Q(e){return"click"===e.type&&(e.ctrlKey||e.metaKey||e.shiftKey)}#J(e){let t=e.currentTarget;if("submit"===e.type&&"FORM"===t?.tagName)return!0;if(!("click"===e.type&&0===e.button))return!1;let r=t?.closest?.('button, input[type="submit"], input[type="image"]'),i=r?.form||r?.closest("form");if(r&&!r.disabled&&i&&("submit"===r.type||"image"===r.type||!r.type&&"BUTTON"===r.tagName))return!0;let s=t?.closest?.("a");if(!s||!s.href)return!1;let n=s.getAttribute("href");return!(n&&n.startsWith("#")&&n.length>1)}#B(e,t=e._htmx.eventHandler){let r=this.#p(e,"hx-trigger");r||(r=e.matches("form")?"submit":e.matches("input:not([type=button]),select,textarea")?"change":"click"),e._htmx.triggerSpecs=this.#g(r),e._htmx.listeners=[];for(let r of e._htmx.triggerSpecs){r.handler=t,r.listeners=[],r.values={};let[i,s]=this.#ue(r.name);if(r.once){let e=r.handler;r.handler=t=>{e(t);for(let e of r.listeners)e.fromElt.removeEventListener(e.eventName,e.handler)}}if("intersect"===i||"revealed"===i){let t={};r.opts?.root&&(t.root=this.#W(e,r.opts.root)),r.opts?.threshold&&(t.threshold=parseFloat(r.opts.threshold));let s="revealed"===i;r.observer=new IntersectionObserver(t=>{for(let i=0;i<t.length;i++){if(t[i].isIntersecting){this.trigger(e,"intersect",{},!1),s&&r.observer.disconnect();break}}},t),i="intersect",r.observer.observe(e)}if(r.delay){let e=r.handler;r.handler=t=>{clearTimeout(r.timeout),r.timeout=setTimeout(()=>e(t),this.parseInterval(r.delay))}}if(r.throttle){let e=r.handler;r.handler=t=>{r.throttled?r.throttledEvent=t:(r.throttled=!0,e(t),r.throttleTimeout=setTimeout(()=>{if(r.throttled=!1,r.throttledEvent){let e=r.throttledEvent;r.throttledEvent=null,r.handler(e)}},this.parseInterval(r.throttle)))}}if(r.target){let e=r.handler;r.handler=t=>{t.target?.matches?.(r.target)&&e(t)}}if("every"===i){let t=Object.keys(r).find(e=>"name"!==e);r.interval=setInterval(()=>{e.isConnected?this.#R(e,"every",{},!1):clearInterval(r.interval)},this.parseInterval(t))}if(s){let t=r.handler;r.handler=r=>{this.#J(r)&&r.preventDefault(),this.#de(e,r,s)&&t(r)}}let n=[e];if(r.from&&(n=this.#fe(e,r.from)),r.consume){let e=r.handler;r.handler=t=>{t.stopPropagation(),e(t)}}if(r.changed){let e=r.handler;r.handler=t=>{let i=!1;for(let e of n)r.values[e]!==e.value&&(i=!0,r.values[e]=e.value);i&&e(t)}}for(let t of n){let s={fromElt:t,eventName:i,handler:r.handler};e._htmx.listeners.push(s),r.listeners.push(s),t.addEventListener(i,r.handler)}}}#ue(e){let t=e.match(/^([^\[]*)\[([^\]]*)]/);return t?[t[1],t[2]]:[e,null]}#he(e,t){if("{"===e[0]){let r=this.#H(e);for(let e in r){let i=r[e];i?.target&&(t=this.find(i.target)||t),this.trigger(t,e,"object"==typeof i?i:{value:i})}}else e.split(",").forEach(e=>this.trigger(t,e.trim(),{}))}#me(e){let t={},r=Object.getPrototypeOf(this);for(let i of Object.getOwnPropertyNames(r))"constructor"!==i&&"function"==typeof this[i]&&(["find","findAll"].includes(i)?t[i]=(t,r)=>void 0===r?this[i](e,t):this[i](t,r):t[i]=this[i].bind(this));return t}async#X(e,t,r,i=!0){let s={};Object.assign(s,this.#me(e)),Object.assign(s,t);let n=Object.keys(s),a=Object.values(s),o=new(0,Object.getPrototypeOf(async function(){}).constructor)(...n,i?`return (${r})`:r);return await o.call(e,...a)}#de(e,t,r){let i={};Object.assign(i,this.#me(e));for(let e in t)i[e]=t[e];let s=Object.keys(i),n=Object.values(i);return new Function(...s,`return (${r})`).call(e,...n)}process(e){if(!e||this.#q(e))return;if(!this.#R(e,"htmx:before:process"))return;for(let t of this.#A(e,this.#a))this.#k(t);for(let t of this.#A(e,this.#o))this.#pe(t);this.#ge(e);let t=this.#h.evaluate(e),r=null;for(;r=t.iterateNext();)this.#ge(r);this.#R(e,"htmx:after:process")}#pe(e){let t=this.#p(e,"hx-boost");t&&"false"!==t&&this.#xe(e)&&(e._htmx={eventHandler:this.#_(e),requests:[],boosted:t},e.setAttribute("data-htmx-powered","true"),e.matches("a")&&!e.hasAttribute("target")?e.addEventListener("click",t=>{e._htmx.eventHandler(t)}):e.addEventListener("submit",t=>{e._htmx.eventHandler(t)}),this.#R(e,"htmx:after:init",{},!0))}#xe(e){if(this.#V(e))if("A"===e.tagName){if(""===e.target||"_self"===e.target)return!e.getAttribute("href")?.startsWith?.("#")&&this.#be(e.href)}else if("FORM"===e.tagName)return"dialog"!==e.method&&this.#be(e.action)}#be(e){try{return new URL(e,window.location.href).origin===window.location.origin}catch(e){return!1}}#V(e){return!e._htmx&&!this.#q(e)}#ye(e){if(e._htmx){this.#R(e,"htmx:before:cleanup"),e._htmx.interval&&clearInterval(e._htmx.interval);for(let t of e._htmx.triggerSpecs||[])t.interval&&clearInterval(t.interval),t.timeout&&clearTimeout(t.timeout);for(let t of e._htmx.listeners||[])t.fromElt.removeEventListener(t.eventName,t.handler);this.#R(e,"htmx:after:cleanup")}if(e.firstChild)for(let t of e.querySelectorAll("[data-htmx-powered]"))this.#ye(t)}#ve(e){let t=document.createElement("div");t.style.display="none",document.body.appendChild(t);let r=e.querySelectorAll?.(`[${this.#m("hx-preserve")}]`)||[];for(let e of r){let r=document.getElementById(e.id);r&&(t.moveBefore?t.moveBefore(r,null):t.appendChild(r))}return t}#Se(e){for(let t of e.children){let e=document.getElementById(t.id);e&&(e.parentNode.moveBefore?e.parentNode.moveBefore(t,e):e.replaceWith(t),this.#ye(e),e.remove())}e.remove()}#Ee(e){return Document.parseHTMLUnsafe?.(e)||(new DOMParser).parseFromString(e,"text/html")}#we(e){let t=e.replace(/<hx-([a-z]+)(\s+|>)/gi,'<template hx type="$1"$2').replace(/<\/hx-[a-z]+>/gi,"</template>"),r="";t=t.replace(/<title[^>]*>[\s\S]*?<\/title>/i,e=>(r=this.#Ee(e).title,""));let i,s,n=t.replace(/<head(\s[^>]*)?>[\s\S]*?<\/head>/i,""),a=n.match(/<([a-z][^\/>\x20\t\r\n\f]*)/i)?.[1]?.toLowerCase();return"html"===a?(i=this.#Ee(t),s=i.body):"body"===a?(i=this.#Ee(n),s=i.body):(i=this.#Ee(`<template>${n}</template>`),s=i.querySelector("template").content),this.#Ce(s),{fragment:s,title:r}}#qe(e,t,r,i){let s=t.id?"#"+CSS.escape(t.id):null;"true"!==r&&r&&!r.includes(" ")&&([r,s=s]=r.split(/:(.*)/)),"true"!==r&&r||(r="outerHTML");let n=this.#Ae(r);if(s=n.target||s,n.strip??=!n.style.startsWith("outer"),!s)return;let a=document.createDocumentFragment();a.append(t),e.push({type:"oob",fragment:a,target:s,swapSpec:n,sourceElement:i})}#Te(e,t,r){let i=[];if(r)for(let s of r.split(",")){let[r,n="true"]=s.split(/:(.*)/);for(let s of e.querySelectorAll(r))this.#qe(i,s,n,t)}for(let r of e.querySelectorAll(`[${this.#m("hx-swap-oob")}]`)){let e=r.getAttribute(this.#m("hx-swap-oob"));r.removeAttribute(this.#m("hx-swap-oob")),this.#qe(i,r,e,t)}return i}#Me(e,t,r){t?t.before(...r.childNodes):e.append(...r.childNodes)}#Ae(e){e=e.trim();let t=this.config.defaultSwap;if(e&&!/^\S*:/.test(e)){let r=e.match(/^(\S+)\s*(.*)$/);t=r[1],e=r[2]}return{style:this.#T(t),...this.#H(e)}}#Ne(e,t){let r=[];for(let i of e.querySelectorAll("template[hx]")){let e=i.getAttribute("type");"partial"===e?r.push({type:"partial",fragment:i.content.cloneNode(!0),target:i.getAttribute(this.#m("hx-target")),swapSpec:this.#Ae(i.getAttribute(this.#m("hx-swap"))||this.config.defaultSwap),sourceElement:t.sourceElement}):this.#I(i,"htmx:process:"+e,{ctx:t,tasks:r}),i.remove()}return r}#Ie(e){let t=this.find(e,"[autofocus]");t?.focus?.()}#He(e,t){if(e.scroll){let r=e.scrollTarget?this.#W(e.scrollTarget):t;"top"===e.scroll?r.scrollTop=0:"bottom"===e.scroll&&(r.scrollTop=r.scrollHeight)}if(e.show){(e.showTarget?this.#W(e.showTarget):t).scrollIntoView("top"===e.show)}}#Oe(e){e.request?.anchor&&document.getElementById(e.request.anchor)?.scrollIntoView({block:"start",behavior:"auto"})}#Ce(e){let t=this.#A(e,"script");for(let e of t){let t=document.createElement("script");for(let r of e.attributes)t.setAttribute(r.name,r.value);this.config.inlineScriptNonce&&(t.nonce=this.config.inlineScriptNonce),t.textContent=e.textContent,e.replaceWith(t)}}async swap(e){this.#Le(e);let{fragment:t,title:r}=this.#we(e.text);e.title=r;let i=[],s=this.#Te(t,e.sourceElement,e.selectOOB),n=this.#Ne(t,e);i.push(...s,...n);let a=this.#ke(e,t,n);if(a&&i.unshift(a),!this.#R(document,"htmx:before:swap",{ctx:e,tasks:i}))return;let o=[],l=[];for(let e of i)e.swapSpec?.transition??a?.transition?l.push(e):o.push(this.#S(e));if(l.length>0){let e=async()=>{for(let e of l)await this.#S(e,!1)};o.push(this.#Ve(e))}await Promise.all(o),this.#R(document,"htmx:after:swap",{ctx:e}),e.title&&!a?.swapSpec?.ignoreTitle&&(document.title=e.title),this.#Oe(e)}#ke(e,t,r){let i=this.#Ae(e.swap||this.config.defaultSwap);if("delete"===i.style||t.childElementCount>0||/\S/.test(t.textContent)||!r.length){if(e.select){let r=t.querySelectorAll(e.select);(t=document.createDocumentFragment()).append(...r)}return this.#O(e.sourceElement)&&(i.show||="top"),{type:"main",fragment:t,target:this.#P(e.sourceElement||document.body,i.target||e.target),swapSpec:i,sourceElement:e.sourceElement,transition:!1!==e.transition&&!1!==i.transition}}}async#S(e,t=!0){let{target:r,swapSpec:i,fragment:s}=e;if("string"==typeof r&&(r=document.querySelector(r)),!r)return;if("string"==typeof i&&(i=this.#Ae(i)),"none"===i.style)return;if(i.strip&&s.firstElementChild&&(s=document.createDocumentFragment(),s.append(...(e.fragment.firstElementChild.content||e.fragment.firstElementChild).childNodes)),r.classList.add("htmx-swapping"),t&&e.swapSpec?.swap&&await this.timeout(e.swapSpec?.swap),"delete"===i.style)return void(r.parentNode&&(this.#ye(r),r.parentNode.removeChild(r)));if("textContent"===i.style)return r.textContent=s.textContent,void r.classList.remove("htmx-swapping");let n=this.#ve(s),a=r.parentNode,o=[...s.childNodes],l=[];try{if("innerHTML"===i.style){l=t?this.#Re(s,r):[];for(const e of r.children)this.#ye(e);r.replaceChildren(...s.childNodes)}else if("outerHTML"===i.style)a&&(l=t?this.#Re(s,r):[],this.#Me(a,r,s),this.#ye(r),a.removeChild(r));else if("innerMorph"===i.style)this.#E(r,s,!0),o=[...r.childNodes];else if("outerMorph"===i.style)this.#E(r,s,!1),o.push(r);else if("beforebegin"===i.style)a&&this.#Me(a,r,s);else if("afterbegin"===i.style)this.#Me(r,r.firstChild,s);else if("beforeend"===i.style)this.#Me(r,null,s);else if("afterend"===i.style)a&&this.#Me(a,r.nextSibling,s);else{let e=this.#r.get("handle_swap"),t=!1;for(const n of e){let e=n(i.style,r,s,i);if(e){t=!0,Array.isArray(e)&&(o=e);break}}if(!t)throw new Error(`Unknown swap style: ${i.style}`)}}finally{r.classList.remove("htmx-swapping")}this.#Se(n),this.#R(r,"htmx:before:settle",{task:e,newContent:o,settleTasks:l});for(const e of o)e.classList?.add?.("htmx-added");if(t){r.classList.add("htmx-settling"),await this.timeout(i.settle??1);for(let e of l)e();r.classList.remove("htmx-settling")}this.#R(r,"htmx:after:settle",{task:e,newContent:o,settleTasks:l});for(const e of o)e.classList?.remove?.("htmx-added"),this.process(e),this.#Ie(e);this.#He(i,r)}#R(e,t,r={},i=!0){return this.config.logAll&&console.log(t,r,e),e=this.#_e(e),this.#I(e,t,r),this.trigger(e,this.#N(t),r,i)}#I(e,t,r={}){let i=this.#r.get(t.replace(/:/g,"_"));if(i){r.cancelled=!1;for(const t of i)if(!1===t(e,r)||r.cancelled)return r.cancelled=!0,!1}return!0}timeout(e){if((e=this.parseInterval(e))>0)return new Promise(t=>setTimeout(t,e))}forEvent(e,t,r=document){return new Promise((i,s)=>{let n=e=>{clearTimeout(a),i(e)},a=t&&setTimeout(()=>{r.removeEventListener(e,n),i(null)},t);r.addEventListener(e,n,{once:!0})})}onLoad(e){this.on("htmx:after:process",t=>{e(t.target)})}takeClass(e,t,r=e.parentElement){for(let e of this.#fe(this.#_e(r),"."+t))e.classList.remove(t);e.classList.add(t)}on(e,t,r){let i,s=document;return void 0===r?(i=e,r=t):(s=this.#_e(e),i=t),s.addEventListener(i,r),r}find(e,t){return this.#W(e,t)}findAll(e,t){return this.#fe(e,t)}parseInterval(e){if("number"==typeof e)return e;let[,t,r]=e?.match(/^([\d.]+)(ms|s|m)?$/)||[],i=parseFloat(t)*({ms:1,s:1e3,m:6e4}[r]||1);return isNaN(i)?void 0:i}trigger(e,t,r={},i=!0){e=this.#_e(e);let s=new CustomEvent(t,{detail:r,cancelable:!0,bubbles:i,composed:!0,originalTarget:e}),n=e.isConnected?e:document;return!r.cancelled&&n.dispatchEvent(s)}ajax(e,t,r){(!r||r instanceof Element||"string"==typeof r)&&(r={target:r});let i="string"==typeof r.source?document.querySelector(r.source):r.source;if("string"==typeof r.source&&!i)return Promise.reject(new Error("Source not found"));let s=this.#P(document.body,r.target||i);if(!s)return Promise.reject(new Error("Target not found"));i||=s;let n=this.#b(i,r.event||{});return Object.assign(n,r,{target:s}),Object.assign(n.request,{action:t,method:e.toUpperCase()}),r.headers&&Object.assign(n.request.headers,r.headers),this.#D(n)}#w(){this.config.history&&(history.state||history.replaceState({htmx:!0},"",location.pathname+location.search),window.addEventListener("popstate",e=>{e.state&&e.state.htmx&&this.#Be()}))}#je(e){this.config.history&&(history.pushState({htmx:!0},"",e),this.#R(document,"htmx:after:push:into:history",{path:e}))}#De(e){this.config.history&&(history.replaceState({htmx:!0},"",e),this.#R(document,"htmx:after:replace:into:history",{path:e}))}#Be(e){if(e=e||location.pathname+location.search,this.#R(document,"htmx:before:restore:history",{path:e,cacheMiss:!0}))"reload"===this.config.history?location.reload():this.ajax("GET",e,{target:"body",request:{headers:{"HX-History-Restore-Request":"true"}}});else if("FORM"===elt.tagName)return"dialog"!==elt.method&&this.#be(elt.action)}#Le(e){let{sourceElement:t,push:r,replace:i,hx:s,response:n}=e;(s?.push||s?.pushurl||s?.replaceurl)&&(r=s.push||s.pushurl,i=s.replaceurl),r||i||!this.#O(t)||(r="true");let a=r||i;if(!a||"false"===a||!1===a)return;if("true"===a){let t=n?.raw?.url||e.request.action,r=new URL(t,location.href);a=r.pathname+r.search+(e.request.anchor?"#"+e.request.anchor:"")}let o=r?"push":"replace",l={history:{type:o,path:a},sourceElement:t,response:n};this.#R(document,"htmx:before:history:update",l)&&("push"===o?this.#je(a):this.#De(a),this.#R(document,"htmx:after:history:update",l))}#ge(e){for(let r of e.getAttributeNames()){var t=this.#N(this.#m("hx-on:"));if(r.startsWith(t)){let i=r.substring(t.length),s=e.getAttribute(r);e.addEventListener(i,async t=>{try{await this.#X(e,{event:t},s,!1)}catch(e){console.log(e)}})}}}#te(e){let t,r=this.#p(e,"hx-indicator");t=r?this.#fe(e,r,"hx-indicator"):[e];for(const e of t)e._htmxReqCount||=0,e._htmxReqCount++,e.classList.add(this.config.requestClass);return t}#oe(e){for(let t of e)t._htmxReqCount&&(t._htmxReqCount--,t._htmxReqCount<=0&&(t.classList.remove(this.config.requestClass),delete t._htmxReqCount))}#re(e){let t=this.#p(e,"hx-disable"),r=[];if(t){r=this.#fe(e,t,"hx-disable");for(let e of r)e._htmxDisableCount||=0,e._htmxDisableCount++,e.disabled=!0}return r}#le(e){for(const t of e)t._htmxDisableCount&&(t._htmxDisableCount--,t._htmxDisableCount<=0&&(t.disabled=!1,delete t._htmxDisableCount))}#y(e,t,r,i){if(i&&t&&!t.reportValidity())return;let s=t?new FormData(t):new FormData,n=t?new Set(t.elements):new Set;if(!t&&e.name){if(i&&e.reportValidity&&!e.reportValidity())return;s.append(e.name,e.value),n.add(e)}r&&r.name&&(s.append(r.name,r.value),n.add(r));let a=this.#p(e,"hx-include");if(a)for(let t of this.#fe(e,a)){if(i&&t.reportValidity&&!t.reportValidity())return;this.#$e(t,n,s)}return s}#$e(e,t,r){let i=this.#A(e,"input:not([disabled]), select:not([disabled]), textarea:not([disabled])");for(let e of i){if(!e.name||t.has(e))continue;t.add(e);let i=e.type;if("checkbox"===i||"radio"===i)e.checked&&r.append(e.name,e.value);else if("file"===i)for(let t of e.files)r.append(e.name,t);else if("select-multiple"===i)for(let t of e.selectedOptions)r.append(e.name,t.value);else e.matches("select, textarea, input")&&r.append(e.name,e.value)}}#U(e,t,r){let i=this.#p(e,t);if(!i)return null;let s=this.#G(i);if(s)return 0!==s.indexOf("{")&&(s="{"+s+"}"),this.#X(e,{},s,!0).then(e=>{r(e)});r(this.#H(i))}#v(e,t){return this.#U(e,"hx-vals",e=>{for(let r in e)t.set(r,e[r])})}#Pe(e){let t=e.trim();return t.startsWith("<")&&t.endsWith("/>")?t.slice(1,-2):t}#fe(e,t,r,i){let s=t??e,n=t?this.#_e(e):document;if(s.startsWith("global "))return this.#fe(n,s.slice(7),r,!0);let a=s?s.replace(/<[^>]+\/>/g,e=>e.replace(/,/g,"%2C")).split(",").map(e=>e.replace(/%2C/g,",")):[],o=[],l=[];for(const e of a){let t,s=this.#Pe(e);if(s.startsWith("closest "))t=n.closest(s.slice(8));else if(s.startsWith("find "))t=n.querySelector(s.slice(5));else if(s.startsWith("findAll "))o.push(...n.querySelectorAll(s.slice(8)));else if("next"===s||"nextElementSibling"===s)t=n.nextElementSibling;else if(s.startsWith("next "))t=this.#Fe(n,s.slice(5),!!i);else if("previous"===s||"previousElementSibling"===s)t=n.previousElementSibling;else if(s.startsWith("previous "))t=this.#ze(n,s.slice(9),!!i);else if("document"===s)t=document;else if("window"===s)t=window;else if("body"===s)t=document.body;else if("host"===s)t=n.getRootNode().host;else if("this"===s){if(r){o.push(...this.#M(n,r));continue}t=n}else l.push(s);t&&o.push(t)}if(l.length>0){let e=l.join(","),t=this.#Ue(n,!!i);o.push(...t.querySelectorAll(e))}return[...new Set(o)]}#Fe(e,t,r){return this.#We(this.#Ue(e,r).querySelectorAll(t),e,Node.DOCUMENT_POSITION_PRECEDING)}#ze(e,t,r){let i=[...this.#Ue(e,r).querySelectorAll(t)].reverse();return this.#We(i,e,Node.DOCUMENT_POSITION_FOLLOWING)}#We(e,t,r){for(const i of e)if(i.compareDocumentPosition(t)===r)return i}#Ue(e,t){return e.isConnected&&e.getRootNode?e.getRootNode?.({composed:t}):document}#W(e,t,r){return this.#fe(e,t,r)[0]}#G(e){if(null!=e){if(e.startsWith("js:"))return e.substring(3);if(e.startsWith("javascript:"))return e.substring(11)}}#j(e){e.addEventListener("htmx:abort",()=>{this.#Z(e).abort()})}#E(e,t,r){let{persistentIds:i,idMap:s}=this.#Qe(e,t),n=document.createElement("div");n.hidden=!0,document.body.after(n);let a={target:e,idMap:s,persistentIds:i,pantry:n};r?this.#Je(a,e,t):this.#Je(a,e.parentNode,t,e,e.nextSibling),this.#ye(n),n.remove()}#Je(e,t,r,i=null,s=null){t instanceof HTMLTemplateElement&&r instanceof HTMLTemplateElement&&(t=t.content,r=r.content),i||=t.firstChild;for(const n of r.childNodes){if(i&&i!=s){let t=this.#Ge(e,n,i,s);if(t){if(t!==i){let r=i;for(;r&&r!==t;){let t=r;r=r.nextSibling,this.#Xe(e,t)}}this.#Ke(t,n,e),i=t.nextSibling;continue}}if(n instanceof Element&&e.persistentIds.has(n.id)){let r=e.target.id===n.id&&e.target||e.target.querySelector(`[id="${n.id}"]`)||e.pantry.querySelector(`[id="${n.id}"]`),s=r.id,a=r;for(;a=a.parentNode;){let t=e.idMap.get(a);t&&(t.delete(s),t.size||e.idMap.delete(a))}this.#Ye(t,r,i),this.#Ke(r,n,e),i=r.nextSibling;continue}let r;e.idMap.has(n)?(r=document.createElement(n.tagName),t.insertBefore(r,i),this.#Ke(r,n,e)):(r=document.importNode(n,!0),t.insertBefore(r,i)),i=r.nextSibling}for(;i&&i!=s;){let t=i;i=i.nextSibling,this.#Xe(e,t)}}#Ge(e,t,r,i){let s=null,n=t.nextSibling,a=0,o=0,l=this.config.morphScanLimit,h=e.idMap.get(t),c=h?.size||0,u=r;for(;u&&u!=i;){let r=e.idMap.get(u);if(this.#Ze(u,t)){if(r&&h&&[...r].some(e=>h.has(e)))return u;if(!r){if(l>0&&u.isEqualNode(t))return u;s||(s=u)}}if(o+=r?.size||0,o>c)break;if(n&&l>0&&u.isEqualNode(n)&&(a++,n=n.nextSibling,a>=2))return null;if(u.contains(document.activeElement))break;if(--l<1&&0===c)break;u=u.nextSibling}return s||null}#Ze(e,t){return e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id)}#Xe(e,t){e.idMap.has(t)?this.#Ye(e.pantry,t,null):(this.#ye(t),t.remove())}#Ye(e,t,r){if(e.moveBefore)try{return void e.moveBefore(t,r)}catch(e){}e.insertBefore(t,r)}#Ke(e,t,r){let i=t.nodeType;if(1===i){if(this.config.morphSkip&&e.matches?.(this.config.morphSkip))return;this.#et(e,t),e instanceof HTMLTextAreaElement&&e.defaultValue!=t.defaultValue&&(e.value=t.value)}8!==i&&3!==i||e.nodeValue===t.nodeValue||(e.nodeValue=t.nodeValue),this.config.morphSkipChildren&&e.matches?.(this.config.morphSkipChildren)||e.isEqualNode(t)||this.#Je(r,e,t)}#et(e,t){let r=this.config.morphIgnore||[];for(const i of t.attributes)r.includes(i.name)||e.getAttribute(i.name)===i.value||(e.setAttribute(i.name,i.value),"value"===i.name&&e instanceof HTMLInputElement&&"file"!==e.type&&(e.value=i.value));for(let i=e.attributes.length-1;i>=0;i--){let s=e.attributes[i];!s||t.hasAttribute(s.name)||r.includes(s.name)||e.removeAttribute(s.name)}}#tt(e,t,r,i){for(const s of i)if(t.has(s.id)){let t=s;for(;t&&t!==r;){let r=e.get(t);null==r&&(r=new Set,e.set(t,r)),r.add(s.id),t=t.parentElement}}}#Qe(e,t){let r=this.#A(e,"[id]"),i=t.querySelectorAll("[id]"),s=this.#rt(r,i),n=new Map;return this.#tt(n,s,e.parentElement,r),this.#tt(n,s,t,i),{persistentIds:s,idMap:n}}#rt(e,t){let r=new Set,i=new Map;for(const{id:t,tagName:s}of e)i.has(t)?r.add(t):i.set(t,s);let s=new Set;for(const{id:e,tagName:n}of t)s.has(e)?r.add(e):i.get(e)===n&&s.add(e);for(const e of r)s.delete(e);return s}#ae(e){let t=e.response.raw.status,r=this.config.noSwap.map(e=>e+""),i=t+"";for(let t of[i,i.slice(0,2)+"x",i[0]+"xx"]){if(r.includes(t))return void(e.swap="none");let i=this.#p(e.sourceElement,"hx-status:"+t);if(i)return void this.#C(i,e)}}#Ve(e){return new Promise(t=>{this.#c||=[],this.#c.push({task:e,resolve:t}),this.#u||this.#it()})}async#it(){if(0===this.#c.length||this.#u)return;this.#u=!0;let{task:e,resolve:t}=this.#c.shift();try{document.startViewTransition?(this.#R(document,"htmx:before:viewTransition",{task:e}),await document.startViewTransition(e).finished,this.#R(document,"htmx:after:viewTransition",{task:e})):e()}catch(e){}finally{this.#u=!1,t(),this.#it()}}#Re(e,t){let r=t.querySelectorAll("[id]"),i=Object.fromEntries([...r].map(e=>[e.id,e])),s=e.querySelectorAll("[id]"),n=[];for(let e of s){let t=i[e.id];if(t?.tagName===e.tagName){let r=e.cloneNode(!1);this.#et(e,t),n.push(()=>{this.#et(e,r)})}}return n}#_e(e){return"string"==typeof e?this.find(e):e}#N(e){return this.config.metaCharacter?e.replace(/:/g,this.config.metaCharacter):e}}})(); |