diff --git a/dist/htmx.js b/dist/htmx.js index 50f2ab42..e4c290d0 100644 --- a/dist/htmx.js +++ b/dist/htmx.js @@ -161,6 +161,8 @@ return (function () { case "td": case "th": return parseHTML("" + resp + "
", 3); + case "script": + return parseHTML("
" + resp + "
", 1); default: return parseHTML(resp, 0); } @@ -610,7 +612,19 @@ return (function () { } } + var TITLE_FINDER = /([\s\S]+?)<\/title>/im; + function findTitle(content) { + var result = TITLE_FINDER.exec(content); + if (result) { + return result[1]; + } + } + function selectAndSwap(swapStyle, target, elt, responseText, settleInfo) { + var title = findTitle(responseText); + if(title) { + window.document.title = title; + } var fragment = makeFragment(responseText); if (fragment) { handleOutOfBandSwaps(fragment, settleInfo); @@ -686,7 +700,7 @@ return (function () { if (tokens[0] === '[') { tokens.shift(); var bracketCount = 1; - var conditionalSource = "(function(" + paramName + "){ return ("; + var conditionalSource = " return (function(" + paramName + "){ return ("; var last = null; while (tokens.length > 0) { var token = tokens[0]; @@ -699,7 +713,7 @@ return (function () { tokens.shift(); conditionalSource += ")})"; try { - var conditionFunction = eval(conditionalSource); + var conditionFunction = Function(conditionalSource)(); conditionFunction.source = conditionalSource; return conditionFunction; } catch (e) { @@ -993,9 +1007,11 @@ return (function () { elt.addEventListener(getTriggerSpecs(elt)[0].trigger, function (evt) { var headers = getHeaders(elt, webSocketSourceElt, null, elt); var results = getInputValues(elt, 'post'); - var rawParameters = results.values; var errors = results.errors; - var filteredParameters = filterValues(rawParameters, elt); + var rawParameters = results.values; + var expressionVars = getHXVarsForElement(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); filteredParameters['HEADERS'] = headers; if (errors && errors.length > 0) { triggerEvent(elt, 'htmx:validation:halted', errors); @@ -1165,9 +1181,14 @@ return (function () { }); } + function isBoosted() { + return document.querySelector("[hx-boost], [data-hx-boost]"); + } + function findElementsToProcess(elt) { if (elt.querySelectorAll) { - var results = elt.querySelectorAll(VERB_SELECTOR + ", a, form, [hx-sse], [data-hx-sse], [hx-ws]," + + var boostedElts = isBoosted() ? ", a, form" : ""; + var results = elt.querySelectorAll(VERB_SELECTOR + boostedElts + ", [hx-sse], [data-hx-sse], [hx-ws]," + " [data-hx-ws]"); return results; } else { @@ -1698,22 +1719,41 @@ return (function () { } } - function addExpressionVars(elt, rawParameters) { - if (elt == null) { - return; + function getValuesForElement(elt, attr, strToValues, expressionVars) { + if (expressionVars == null) { + expressionVars = {}; } - var attributeValue = getAttributeValue(elt, "hx-vars"); + if (elt == null) { + return expressionVars; + } + var attributeValue = getAttributeValue(elt, attr); if (attributeValue) { - var varsValues = eval("({" + attributeValue + "})"); + var str = attributeValue.trim(); + if (str.indexOf('{') !== 0) { + str = "{" + str + "}"; + } + var varsValues = strToValues(str); for (var key in varsValues) { if (varsValues.hasOwnProperty(key)) { - if (rawParameters[key] == null) { - rawParameters[key] = varsValues[key]; + if (expressionVars[key] == null) { + expressionVars[key] = varsValues[key]; } } } } - addExpressionVars(parentElt(elt), rawParameters); + return getValuesForElement(parentElt(elt), attr, strToValues, expressionVars); + } + + function getHXVarsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vars", function(valueStr){ + return Function("return (" + valueStr + ")")() + }, expressionVars); + } + + function getHXValsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vars", function(valueStr){ + return JSON.parse(expressionVars); + }, expressionVars); } function safelySetHeaderValue(xhr, header, headerValue) { @@ -1745,6 +1785,10 @@ return (function () { } function issueAjaxRequest(elt, verb, path, eventTarget, triggeringEvent) { + if (!bodyContains(elt)) { + console.log("Body does not contain", elt); + return; // do not issue requests for elements removed from the DOM + } var target = getTarget(elt); if (target == null) { triggerErrorEvent(elt, 'htmx:targetError', {target: getAttributeValue(elt, "hx-target")}); @@ -1783,10 +1827,11 @@ return (function () { var headers = getHeaders(elt, target, promptResponse, eventTarget); var results = getInputValues(elt, verb); - var rawParameters = results.values; var errors = results.errors; - addExpressionVars(elt, rawParameters); - var filteredParameters = filterValues(rawParameters, elt); + var rawParameters = results.values; + var expressionVars = getHXVarsForElement(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); if (verb !== 'get' && getClosestAttributeValue(elt, "hx-encoding") == null) { headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; @@ -1799,7 +1844,7 @@ return (function () { var requestConfig = { parameters: filteredParameters, - unfilteredParameters:rawParameters, + unfilteredParameters: allParameters, headers:headers, target:target, verb:verb, @@ -1863,7 +1908,19 @@ return (function () { } if (hasHeader(xhr,/HX-Push:/i)) { - var pushedUrl = this.getResponseHeader("HX-Push"); + var pushedUrl = xhr.getResponseHeader("HX-Push"); + } + + if (hasHeader(xhr, /HX-Redirect:/i)) { + window.location.href = xhr.getResponseHeader("HX-Redirect"); + return; + } + + if (hasHeader(xhr,/HX-Refresh:/i)) { + if ("true" === xhr.getResponseHeader("HX-Refresh")) { + location.reload(); + return; + } } var shouldSaveHistory = shouldPush(elt) || pushedUrl; @@ -1876,9 +1933,9 @@ return (function () { if (this.status !== 204) { if (!triggerEvent(target, 'htmx:beforeSwap', eventDetail)) return; - var resp = this.response; + var serverResponse = this.response; withExtensions(elt, function(extension){ - resp = extension.transformResponse(resp, xhr, elt); + serverResponse = extension.transformResponse(serverResponse, xhr, elt); }); // Save current page @@ -1900,7 +1957,7 @@ return (function () { }; var settleInfo = makeSettleInfo(target); - selectAndSwap(swapSpec.swapStyle, target, elt, resp, settleInfo); + selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo); if (selectionInfo.elt && !bodyContains(selectionInfo.elt) && diff --git a/dist/htmx.min.js b/dist/htmx.min.js index cedac8ee..2f532960 100644 --- a/dist/htmx.min.js +++ b/dist/htmx.min.js @@ -1 +1 @@ -(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else{e.htmx=t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var L={onLoad:x,process:We,on:F,off:P,trigger:Ke,find:w,findAll:S,closest:I,remove:E,addClass:C,removeClass:A,toggleClass:M,takeClass:D,defineExtension:Dt,removeExtension:It,logAll:b,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",attributesToSettle:["class","style","width","height"]},parseInterval:f,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){return new WebSocket(e,[])}};var t=["get","post","put","delete","patch"];var r=t.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function f(e){if(e==null||e==="null"||e==="false"||e===""){return null}else if(e.lastIndexOf("ms")===e.length-2){return parseFloat(e.substr(0,e.length-2))}else if(e.lastIndexOf("s")===e.length-1){return parseFloat(e.substr(0,e.length-1))*1e3}else{return parseFloat(e)}}function l(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function T(e,t){return l(e,t)||l(e,"data-"+t)}function a(e){return e.parentElement}function O(){return document}function c(e,t){if(t(e)){return e}else if(a(e)){return c(a(e),t)}else{return null}}function q(e,t){var r=null;c(e,function(e){return r=T(e,t)});return r}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function n(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=O().createDocumentFragment()}return i}function u(e){var t=n(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i("<table>"+e+"</table>",1);case"col":return i("<table><colgroup>"+e+"</colgroup></table>",2);case"tr":return i("<table><tbody>"+e+"</tbody></table>",2);case"td":case"th":return i("<table><tbody><tr>"+e+"</tr></tbody></table>",3);default:return i(e,0)}}function s(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function v(e){return s(e,"Function")}function d(e){return s(e,"Object")}function R(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function g(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function N(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function m(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function H(e){return O().body.contains(e)}function p(e){return e.trim().split(/\s+/)}function k(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function y(e){try{return JSON.parse(e)}catch(e){Ye(e);return null}}function e(e){return eval(e)}function x(t){var e=L.on("htmx:load",function(e){t(e.detail.elt)});return e}function b(){L.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function w(e,t){if(t){return e.querySelector(t)}else{return O().body.querySelector(e)}}function S(e,t){if(t){return e.querySelectorAll(t)}else{return O().body.querySelectorAll(e)}}function E(e,t){if(t){setTimeout(function(){E(e)},t)}else{e.parentElement.removeChild(e)}}function C(e,t,r){if(r){setTimeout(function(){C(e,t)},r)}else{e.classList.add(t)}}function A(e,t,r){if(r){setTimeout(function(){A(e,t)},r)}else{e.classList.remove(t)}}function M(e,t){e.classList.toggle(t)}function D(e,t){N(e.parentElement.children,function(e){A(e,t)});C(e,t)}function I(e,t){do{if(e==null||h(e,t))return e}while(e=e&&a(e))}function X(e,t,r){if(v(t)){return{target:O().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function F(t,r,n){Ft(function(){var e=X(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=v(r);return e?r:n}function P(t,r,n){Ft(function(){var e=X(t,r,n);e.target.removeEventListener(e.event,e.listener)});return v(r)?r:n}function U(e){var t=c(e,function(e){return T(e,"hx-target")!==null});if(t){var r=T(t,"hx-target");if(r==="this"){return t}else if(r.indexOf("closest ")===0){return I(e,r.substr(8))}else if(r.indexOf("find ")===0){return w(e,r.substr(5))}else{return O().querySelector(r)}}else{var n=R(e);if(n.boosted){return O().body}else{return e}}}function z(e){var t=L.config.attributesToSettle;for(var r=0;r<t.length;r++){if(e===t[r]){return true}}return false}function V(t,r){N(t.attributes,function(e){if(!r.hasAttribute(e.name)&&z(e.name)){t.removeAttribute(e.name)}});N(r.attributes,function(e){if(z(e.name)){t.setAttribute(e.name,e.value)}})}function _(e,t){var r=Xt(t);for(var n=0;n<r.length;n++){var i=r[n];try{if(i.isInlineSwap(e)){return true}}catch(e){Ye(e)}}return e==="outerHTML"}function j(e,t,r){if(e==="true"){e="outerHTML"}var n=O().getElementById(t.id);if(n){var i;i=O().createDocumentFragment();i.appendChild(t);if(!_(e,n)){i=t}ie(e,n,n,i,r)}else{t.parentNode.removeChild(t);Je(O().body,"htmx:oobErrorNoTarget",{content:t})}return e}function W(e,r){N(g(e.children),function(e){var t=T(e,"hx-swap-oob");if(t!=null){j(t,e,r)}})}function B(n,e,i){N(e.querySelectorAll("[id]"),function(e){if(e.id&&e.id.length>0){var t=n.querySelector(e.tagName+"[id='"+e.id+"']");if(t&&t!==n){var r=e.cloneNode();V(e,t);i.tasks.push(function(){V(e,r)})}}})}function $(e){return function(){We(e);Ve(e);J(e);Ke(e,"htmx:load")}}function J(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function Z(e,t,r,n){B(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push($(i))}}}function G(e){var t=R(e);if(t.webSocket){t.webSocket.close()}if(t.sseEventSource){t.sseEventSource.close()}if(e.children){N(e.children,function(e){G(e)})}}function Y(e,t,r){if(e.tagName==="BODY"){return re(e,t)}else{var n=e.previousSibling;Z(a(e),e,t,r);if(n==null){var i=a(e).firstChild}else{var i=n.nextSibling}R(e).replacedWith=i;while(i&&i!==e){if(i.nodeType===Node.ELEMENT_NODE){r.elts.push(i)}i=i.nextElementSibling}G(e);a(e).removeChild(e)}}function K(e,t,r){return Z(e,e.firstChild,t,r)}function Q(e,t,r){return Z(a(e),e,t,r)}function ee(e,t,r){return Z(e,null,t,r)}function te(e,t,r){return Z(a(e),e.nextSibling,t,r)}function re(e,t,r){var n=e.firstChild;Z(e,n,t,r);if(n){while(n.nextSibling){G(n.nextSibling);e.removeChild(n.nextSibling)}G(n);e.removeChild(n)}}function ne(e,t){var r=q(e,"hx-select");if(r){var n=O().createDocumentFragment();N(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function ie(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Y(r,n,i);return;case"afterbegin":K(r,n,i);return;case"beforebegin":Q(r,n,i);return;case"beforeend":ee(r,n,i);return;case"afterend":te(r,n,i);return;default:var a=Xt(t);for(var o=0;o<a.length;o++){var s=a[o];try{var l=s.handleSwap(e,r,n,i);if(l){if(typeof l.length!=="undefined"){for(var u=0;u<l.length;u++){var f=l[u];if(f.nodeType!==Node.TEXT_NODE&&f.nodeType!==Node.COMMENT_NODE){i.tasks.push($(f))}}}return}}catch(e){Ye(e)}}re(r,n,i)}}function ae(e,t,r,n,i){var a=u(n);if(a){W(a,i);a=ne(r,a);return ie(e,r,t,a,i)}}function oe(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=y(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!d(o)){o={value:o}}Ke(r,a,o)}}}else{Ke(r,n,[])}}var se=/\s/;var le=/[_$a-zA-Z]/;var ue=/[_$a-zA-Z0-9]/;var fe=['"',"'","/"];var ce=/[^\s]/;function he(e){var t=[];var r=0;while(r<e.length){if(le.exec(e.charAt(r))){var n=r;r++;while(ue.exec(e.charAt(r+1))){r++}t.push(e.substr(n,r-n+1))}else if(fe.indexOf(e.charAt(r))!==-1){var i=e.charAt(r);var n=r;r++;while(r<e.length&&e.charAt(r)!==i){if(e.charAt(r)==="\\"){r++}r++}t.push(e.substr(n,r-n+1))}else{var a=e.charAt(r);t.push(a)}r++}return t}function ve(e,t,r){return le.exec(e.charAt(0))&&e!=="true"&&e!=="false"&&e!=="this"&&e!==r&&t!=="."}function de(e,t){if(e[0]==="["){e.shift();var r=1;var n="(function("+t+"){ return (";var i=null;while(e.length>0){var a=e[0];if(a==="]"){r--;if(r===0){if(i===null){n=n+"true"}e.shift();n+=")})";try{var o=eval(n);o.source=n;return o}catch(e){Je(O().body,"htmx:syntax:error",{error:e,source:n});return null}}}else if(a==="["){r++}if(ve(a,i,t)){n+="(("+t+"."+a+") ? ("+t+"."+a+") : (window."+a+"))"}else{n=n+a}i=e.shift()}}}function ge(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}function me(e){var t=T(e,"hx-trigger");var r=[];if(t){var n=he(t);do{ge(n,ce);var i=n.length;var a=ge(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};ge(n,ce);o.pollInterval=f(ge(n,se));r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var s={trigger:a};var l=de(n,"event");if(l){s.eventFilter=l}while(n.length>0&&n[0]!==","){ge(n,ce);var u=n.shift();if(u==="changed"){s.changed=true}else if(u==="once"){s.once=true}else if(u==="delay"&&n[0]===":"){n.shift();s.delay=f(ge(n,se))}else if(u==="throttle"&&n[0]===":"){n.shift();s.throttle=f(ge(n,se))}else{Je(e,"htmx:syntax:error",{token:n.shift()})}}r.push(s)}}if(n.length===i){Je(e,"htmx:syntax:error",{token:n.shift()})}ge(n,ce)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,"input, textarea, select")){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function pe(e){R(e).cancelled=true}function ye(e,t,r,n){var i=R(e);i.timeout=setTimeout(function(){if(H(e)&&i.cancelled!==true){Ht(e,t,r);ye(e,t,T(e,"hx-"+t),n)}},n)}function xe(e){return location.hostname===e.hostname&&l(e,"href")&&l(e,"href").indexOf("#")!==0}function be(t,r,e){if(t.tagName==="A"&&xe(t)||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=l(t,"href")}else{var a=l(t,"method");n=a?a.toLowerCase():"get";i=l(t,"action")}e.forEach(function(e){Ce(t,n,i,r,e,true)})}}function we(e){return e.tagName==="FORM"||h(e,'input[type="submit"], button')&&I(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function Se(e,t){return R(e).boosted&&e.tagName==="A"&&t.type==="click"&&t.ctrlKey}function Ee(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){Je(O().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function Ce(n,i,a,e,o,s){var t=function(e){if(Ee(o,e)){return}if(Se(n,e)){return}if(s||we(n)){e.preventDefault()}var t=R(e);var r=R(n);if(!t.handled){t.handled=true;if(o.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(o.changed){if(r.lastValue===n.value){return}else{r.lastValue=n.value}}if(r.delayed){clearTimeout(r.delayed)}if(r.throttle){return}if(o.throttle){r.throttle=setTimeout(function(){Ht(n,i,a,e.target,e);r.throttle=null},o.throttle)}else if(o.delay){r.delayed=setTimeout(function(){Ht(n,i,a,e.target,e)},o.delay)}else{Ht(n,i,a,e.target,e)}}};e.trigger=o.trigger;e.eventListener=t;n.addEventListener(o.trigger,t)}var Ae=false;var Le=null;function Te(){if(!Le){Le=function(){Ae=true};window.addEventListener("scroll",Le);setInterval(function(){if(Ae){Ae=false;N(O().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){Oe(e)})}},200)}}function Oe(e){var t=R(e);if(!t.revealed&&m(e)){t.revealed=true;Ht(e,t.verb,t.path)}}function qe(e,t,r){var n=p(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){Re(e,a[1])}if(a[0]==="send"){He(e)}}}function Re(s,e){if(e.indexOf("ws:")!==0&&e.indexOf("wss:")!==0){e="wss:"+e}var t=L.createWebSocket(e);t.onerror=function(e){Je(s,"htmx:wsError",{error:e,socket:t});Ne(s)};R(s).webSocket=t;t.addEventListener("message",function(e){if(Ne(s)){return}var t=e.data;Ge(s,function(e){t=e.transformResponse(t,null,s)});var r=Lt(s);var n=u(t);var i=g(n.children);for(var a=0;a<i.length;a++){var o=i[a];j(T(o,"hx-swap-oob")||"true",o,r)}ot(r.tasks)})}function Ne(e){if(!H(e)){R(e).webSocket.close();return true}}function He(o){var s=c(o,function(e){return R(e).webSocket!=null});if(s){var l=R(s).webSocket;o.addEventListener(me(o)[0].trigger,function(e){var t=St(o,s,null,o);var r=yt(o,"post");var n=r.values;var i=r.errors;var a=Et(n,o);a["HEADERS"]=t;if(i&&i.length>0){Ke(o,"htmx:validation:halted",i);return}l.send(JSON.stringify(a));if(we(o)){e.preventDefault()}})}else{Je(o,"htmx:noWebSocketSourceError")}}function ke(e,t,r){var n=p(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){Me(e,a[1])}if(a[0]==="swap"){De(e,a[1])}}}function Me(t,e){var r=L.createEventSource(e);r.onerror=function(e){Je(t,"htmx:sseError",{error:e,source:r});Xe(t)};R(t).sseEventSource=r}function De(a,o){var s=c(a,Fe);if(s){var l=R(s).sseEventSource;var u=function(e){if(Xe(s)){l.removeEventListener(o,u);return}var t=e.data;Ge(a,function(e){t=e.transformResponse(t,null,a)});var r=Ct(a);var n=U(a);var i=Lt(a);ae(r.swapStyle,a,n,t,i);Ke(a,"htmx:sseMessage",e)};R(a).sseListener=u;l.addEventListener(o,u)}else{Je(a,"htmx:noSSESourceError")}}function Ie(e,t,r,n){var i=c(e,Fe);if(i){var a=R(i).sseEventSource;var o=function(){if(!Xe(i)){if(H(e)){Ht(e,t,r)}else{a.removeEventListener(n,o)}}};R(e).sseListener=o;a.addEventListener(n,o)}else{Je(e,"htmx:noSSESourceError")}}function Xe(e){if(!H(e)){R(e).sseEventSource.close();return true}}function Fe(e){return R(e).sseEventSource!=null}function Pe(e,t,r,n,i){var a=function(){if(!n.loaded){n.loaded=true;Ht(e,t,r)}};if(i){setTimeout(a,i)}else{a()}}function Ue(n,i,e){var a=false;N(t,function(t){if(o(n,"hx-"+t)){var r=T(n,"hx-"+t);a=true;i.path=r;i.verb=t;e.forEach(function(e){if(e.sseEvent){Ie(n,t,r,e.sseEvent)}else if(e.trigger==="revealed"){Te();Oe(n)}else if(e.trigger==="load"){Pe(n,t,r,i,e.delay)}else if(e.pollInterval){i.polling=true;ye(n,t,r,e.pollInterval)}else{Ce(n,t,r,i,e)}})}});return a}function ze(e){if(e.type==="text/javascript"||e.type===""){try{eval(e.innerText)}catch(e){Ye(e)}}}function Ve(e){if(h(e,"script")){ze(e)}N(S(e,"script"),function(e){ze(e)})}function _e(e){if(e.querySelectorAll){var t=e.querySelectorAll(r+", a, form, [hx-sse], [data-hx-sse], [hx-ws],"+" [data-hx-ws]");return t}else{return[]}}function je(e){var t=R(e);if(!t.initialized){t.initialized=true;if(e.value){t.lastValue=e.value}var r=me(e);var n=Ue(e,t,r);if(!n&&q(e,"hx-boost")==="true"){be(e,t,r)}var i=T(e,"hx-sse");if(i){ke(e,t,i)}var a=T(e,"hx-ws");if(a){qe(e,t,a)}Ke(e,"htmx:processedNode")}}function We(e){je(e);N(_e(e),function(e){je(e)})}function Be(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function $e(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=O().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function Je(e,t,r){Ke(e,t,k({error:t},r))}function Ze(e){return e==="htmx:processedNode"}function Ge(e,t){N(Xt(e),function(e){try{t(e)}catch(e){Ye(e)}})}function Ye(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function Ke(e,t,r){if(r==null){r={}}r["elt"]=e;var n=$e(t,r);if(L.logger&&!Ze(t)){L.logger(e,t,r)}if(r.error){Ye(r.error);Ke(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=Be(t);if(i&&a!==t){var o=$e(a,n.detail);i=i&&e.dispatchEvent(o)}Ge(e,function(e){i=i&&e.onEvent(t,n)!==false});return i}var Qe=null;function et(){var e=O().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||O().body}function tt(e,t,r,n){var i=y(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;a<i.length;a++){if(i[a].url===e){i=i.slice(a,1);break}}i.push({url:e,content:t,title:r,scroll:n});while(i.length>L.config.historyCacheSize){i.shift()}try{localStorage.setItem("htmx-history-cache",JSON.stringify(i))}catch(e){Je(O().body,"htmx:historyCacheError",{cause:e})}}function rt(e){var t=y(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r<t.length;r++){if(t[r].url===e){return t[r]}}return null}function nt(e){var t=L.config.requestClass;var r=e.cloneNode(true);N(S(r,"."+t),function(e){A(e,t)});return r.innerHTML}function it(){var e=et();var t=Qe||location.pathname+location.search;Ke(O().body,"htmx:beforeHistorySave",{path:t,historyElt:e});if(L.config.historyEnabled)history.replaceState({htmx:true},O().title,window.location.href);tt(t,nt(e),O().title,window.scrollY)}function at(e){if(L.config.historyEnabled)history.pushState({htmx:true},"",e);Qe=e}function ot(e){N(e,function(e){e.call()})}function st(n){var e=new XMLHttpRequest;var i={path:n,xhr:e};Ke(O().body,"htmx:historyCacheMiss",i);e.open("GET",n,true);e.onload=function(){if(this.status>=200&&this.status<400){Ke(O().body,"htmx:historyCacheMissLoad",i);var e=u(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=et();var r=Lt(t);re(t,e,r);ot(r.tasks);Qe=n}else{Je(O().body,"htmx:historyCacheMissLoadError",i)}};e.send()}function lt(e){it(Qe);e=e||location.pathname+location.search;Ke(O().body,"htmx:historyRestore",{path:e});var t=rt(e);if(t){var r=u(t.content);var n=et();var i=Lt(n);re(n,r,i);ot(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Qe=e}else{st(e)}}function ut(e){var t=q(e,"hx-push-url");return t&&t!=="false"||e.tagName==="A"&&R(e).boosted}function ft(e){var t=q(e,"hx-push-url");return t==="true"||t==="false"?null:t}function ct(e){vt(e,"add")}function ht(e){vt(e,"remove")}function vt(e,t){var r=q(e,"hx-indicator");if(r){var n=O().querySelectorAll(r)}else{n=[e]}N(n,function(e){e.classList[t].call(e.classList,L.config.requestClass)})}function dt(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function gt(e){if(e.name===""||e.name==null||e.disabled){return false}if(e.type==="button"||e.type==="submit"||e.tagName==="image"||e.tagName==="reset"||e.tagName==="file"){return false}if(e.type==="checkbox"||e.type==="radio"){return e.checked}return true}function mt(t,r,n,e){if(e==null||dt(t,e)){return}else{t.push(e)}if(gt(e)){var i=l(e,"name");var a=e.value;if(!!l(e,"multiple")){a=g(e.querySelectorAll("option:checked")).map(function(e){return e.value})}if(e.files){a=g(e.files)}if(i!=null&&a!=null){var o=r[i];if(o){if(Array.isArray(o)){if(Array.isArray(a)){r[i]=o.concat(a)}else{o.push(a)}}else{if(Array.isArray(a)){r[i]=[o].concat(a)}else{r[i]=[o,a]}}}else{r[i]=a}}pt(e,n)}if(h(e,"form")){var s=e.elements;N(s,function(e){mt(t,r,n,e)})}}function pt(e,t){if(e.willValidate){Ke(e,"htmx:validation:validate");if(!e.checkValidity()){t.push({elt:e,message:e.validationMessage,validity:e.validity});Ke(e,"htmx:validation:failed",{message:e.validationMessage,validity:e.validity})}}}function yt(e,t){var r=[];var n={};var i=[];if(t!=="get"){mt(r,n,i,I(e,"form"))}mt(r,n,i,e);var a=q(e,"hx-include");if(a){var o=O().querySelectorAll(a);N(o,function(e){mt(r,n,i,e)})}return{errors:i,values:n}}function xt(e,t,r){if(e!==""){e+="&"}e+=encodeURIComponent(t)+"="+encodeURIComponent(r);return e}function bt(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){N(n,function(e){t=xt(t,r,e)})}else{t=xt(t,r,n)}}}return t}function wt(e){var t=new FormData;for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){N(n,function(e){t.append(r,e)})}else{t.append(r,n)}}}return t}function St(e,t,r,n){var i={"HX-Request":"true","HX-Trigger":l(e,"id"),"HX-Trigger-Name":l(e,"name"),"HX-Target":T(t,"id"),"HX-Current-URL":O().location.href};if(r!==undefined){i["HX-Prompt"]=r}if(n){i["HX-Event-Target"]=l(n,"id")}if(O().activeElement){i["HX-Active-Element"]=l(O().activeElement,"id");i["HX-Active-Element-Name"]=l(O().activeElement,"name");if(O().activeElement.value){i["HX-Active-Element-Value"]=l(O().activeElement,"value")}}return i}function Et(t,e){var r=q(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){N(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};N(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function Ct(e){var t=q(e,"hx-swap");var r={swapStyle:L.config.defaultSwapStyle,swapDelay:L.config.defaultSwapDelay,settleDelay:L.config.defaultSettleDelay};if(t){var n=p(t);if(n.length>0){r["swapStyle"]=n[0];for(var i=1;i<n.length;i++){var a=n[i];if(a.indexOf("swap:")===0){r["swapDelay"]=f(a.substr(5))}if(a.indexOf("settle:")===0){r["settleDelay"]=f(a.substr(7))}if(a.indexOf("scroll:")===0){r["scroll"]=a.substr(7)}if(a.indexOf("show:")===0){r["show"]=a.substr(5)}}}}return r}function At(t,r,n){var i=null;Ge(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(q(r,"hx-encoding")==="multipart/form-data"){return wt(n)}else{return bt(n)}}}function Lt(e){return{tasks:[],elts:[e]}}function Tt(e,t,r){if(r.scroll){if(r.scroll==="top"){e.scrollTop=0}if(r.scroll==="bottom"){e.scrollTop=e.scrollHeight}}if(r.show){if(r.show==="top"){e.scrollIntoView(true)}if(r.show==="bottom"){e.scrollIntoView(false)}}}function Ot(e,t){if(e==null){return}var r=T(e,"hx-vars");if(r){var n=eval("({"+r+"})");for(var i in n){if(n.hasOwnProperty(i)){if(t[i]==null){t[i]=n[i]}}}}Ot(a(e),t)}function qt(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Rt(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){Je(O().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function Nt(e,t){return e.getAllResponseHeaders().match(t)}function Ht(u,e,f,t,r){var c=U(u);if(c==null){Je(u,"htmx:targetError",{target:T(u,"hx-target")});return}var n=R(u);if(n.requestInFlight){n.queuedRequest=function(){Ht(u,e,f,t,r)};return}else{n.requestInFlight=true}var i=function(){n.requestInFlight=false;var e=n.queuedRequest;n.queuedRequest=null;if(e){e()}};var a=q(u,"hx-prompt");if(a){var o=prompt(a);if(o===null||!Ke(u,"htmx:prompt",{prompt:o,target:c}))return i()}var s=q(u,"hx-confirm");if(s){if(!confirm(s))return i()}var h=new XMLHttpRequest;var l=St(u,c,o,t);var v=yt(u,e);var d=v.values;var g=v.errors;Ot(u,d);var m=Et(d,u);if(e!=="get"&&q(u,"hx-encoding")==null){l["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8"}if(f==null||f===""){f=O().location.href}var p={parameters:m,unfilteredParameters:d,headers:l,target:c,verb:e,errors:g,path:f,triggeringEvent:r};if(!Ke(u,"htmx:configRequest",p))return i();f=p.path;e=p.verb;l=p.headers;m=p.parameters;g=p.errors;if(g&&g.length>0){Ke(u,"htmx:validation:halted",p);return i()}var y=f.split("#");var x=y[0];var b=y[1];if(e==="get"){var w=x;var S=Object.keys(m).length!==0;if(S){if(w.indexOf("?")<0){w+="?"}else{w+="&"}w+=bt(m);if(b){w+="#"+b}}h.open("GET",w,true)}else{h.open(e.toUpperCase(),f,true)}h.overrideMimeType("text/html");for(var E in l){if(l.hasOwnProperty(E)){var C=l[E];qt(h,E,C)}}var A={xhr:h,target:c,requestConfig:p};h.onload=function(){try{if(!Ke(u,"htmx:beforeOnLoad",A))return;if(Nt(h,/HX-Trigger:/i)){oe(h,"HX-Trigger",u)}if(Nt(h,/HX-Push:/i)){var a=this.getResponseHeader("HX-Push")}var o=ut(u)||a;if(this.status>=200&&this.status<400){if(this.status===286){pe(u)}if(this.status!==204){if(!Ke(c,"htmx:beforeSwap",A))return;var s=this.response;Ge(u,function(e){s=e.transformResponse(s,h,u)});if(o){it()}var l=Ct(u);c.classList.add(L.config.swappingClass);var e=function(){try{var e=document.activeElement;var t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null};var r=Lt(c);ae(l.swapStyle,c,u,s,r);if(t.elt&&!H(t.elt)&&t.elt.id){var n=document.getElementById(t.elt.id);if(n){if(t.start&&n.setSelectionRange){n.setSelectionRange(t.start,t.end)}n.focus()}}c.classList.remove(L.config.swappingClass);N(r.elts,function(e){if(e.classList){e.classList.add(L.config.settlingClass)}Ke(e,"htmx:afterSwap",A)});if(b){location.hash=b}if(Nt(h,/HX-Trigger-After-Swap:/i)){oe(h,"HX-Trigger-After-Swap",u)}var i=function(){N(r.tasks,function(e){e.call()});N(r.elts,function(e){if(e.classList){e.classList.remove(L.config.settlingClass)}Ke(e,"htmx:afterSettle",A)});if(o){var e=a||ft(u)||Rt(h)||w||f;at(e);Ke(O().body,"htmx:pushedIntoHistory",{path:e})}Tt(c,r.elts,l);if(Nt(h,/HX-Trigger-After-Settle:/i)){oe(h,"HX-Trigger-After-Settle",u)}};if(l.settleDelay>0){setTimeout(i,l.settleDelay)}else{i()}}catch(e){Je(u,"htmx:swapError",A);throw e}};if(l.swapDelay>0){setTimeout(e,l.swapDelay)}else{e()}}}else{Je(u,"htmx:responseError",k({error:"Response Status Error Code "+this.status+" from "+f},A))}}catch(e){Je(u,"htmx:onLoadError",k({error:e},A));throw e}finally{ht(u);var t=R(u).replacedWith||u;Ke(t,"htmx:afterRequest",A);Ke(t,"htmx:afterOnLoad",A);i()}};h.onerror=function(){ht(u);Je(u,"htmx:afterRequest",A);Je(u,"htmx:sendError",A);i()};if(!Ke(u,"htmx:beforeRequest",A))return i();ct(u);N(["loadstart","loadend","progress","abort"],function(t){h.addEventListener(t,function(e){Ke(u,"htmx:xhr:"+t,k({},e.detail))})});h.send(e==="get"?null:At(h,u,m))}var kt={};function Mt(){return{onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Dt(e,t){kt[e]=k(Mt(),t)}function It(e){delete kt[e]}function Xt(e,r){if(e==null){return r}if(r==null){r=[]}var t=T(e,"hx-ext");if(t){N(t.split(","),function(e){e=e.replace(/ /g,"");var t=kt[e];if(t&&r.indexOf(t)<0){r.push(t)}})}return Xt(a(e),r)}function Ft(e){if(O().readyState!=="loading"){e()}else{O().addEventListener("DOMContentLoaded",e)}}function Pt(){if(L.config.includeIndicatorStyles!==false){O().head.insertAdjacentHTML("beforeend","<style> ."+L.config.indicatorClass+"{opacity:0;transition: opacity 200ms ease-in;} ."+L.config.requestClass+" ."+L.config.indicatorClass+"{opacity:1} ."+L.config.requestClass+"."+L.config.indicatorClass+"{opacity:1} </style>")}}function Ut(){var e=O().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function zt(){var e=Ut();if(e){L.config=k(L.config,e)}}Ft(function(){zt();Pt();var e=O().body;We(e);Ke(e,"htmx:load",{});window.onpopstate=function(e){if(e.state&&e.state.htmx){lt()}}});return L}()}); \ No newline at end of file +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else{e.htmx=t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var O={onLoad:x,process:$e,on:F,off:P,trigger:tt,find:w,findAll:S,closest:I,remove:E,addClass:C,removeClass:A,toggleClass:L,takeClass:T,defineExtension:Ut,removeExtension:zt,logAll:b,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",attributesToSettle:["class","style","width","height"]},parseInterval:f,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){return new WebSocket(e,[])}};var t=["get","post","put","delete","patch"];var n=t.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function f(e){if(e==null||e==="null"||e==="false"||e===""){return null}else if(e.lastIndexOf("ms")===e.length-2){return parseFloat(e.substr(0,e.length-2))}else if(e.lastIndexOf("s")===e.length-1){return parseFloat(e.substr(0,e.length-1))*1e3}else{return parseFloat(e)}}function u(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function R(e,t){return u(e,t)||u(e,"data-"+t)}function l(e){return e.parentElement}function q(){return document}function c(e,t){if(t(e)){return e}else if(l(e)){return c(l(e),t)}else{return null}}function H(e,t){var r=null;c(e,function(e){return r=R(e,t)});return r}function v(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function r(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=q().createDocumentFragment()}return i}function h(e){var t=r(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i("<table>"+e+"</table>",1);case"col":return i("<table><colgroup>"+e+"</colgroup></table>",2);case"tr":return i("<table><tbody>"+e+"</tbody></table>",2);case"td":case"th":return i("<table><tbody><tr>"+e+"</tr></tbody></table>",3);case"script":return i("<div>"+e+"</div>",1);default:return i(e,0)}}function a(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function s(e){return a(e,"Function")}function d(e){return a(e,"Object")}function N(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function g(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function k(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function m(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function M(e){return q().body.contains(e)}function p(e){return e.trim().split(/\s+/)}function D(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function y(e){try{return JSON.parse(e)}catch(e){et(e);return null}}function e(e){return eval(e)}function x(t){var e=O.on("htmx:load",function(e){t(e.detail.elt)});return e}function b(){O.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function w(e,t){if(t){return e.querySelector(t)}else{return q().body.querySelector(e)}}function S(e,t){if(t){return e.querySelectorAll(t)}else{return q().body.querySelectorAll(e)}}function E(e,t){if(t){setTimeout(function(){E(e)},t)}else{e.parentElement.removeChild(e)}}function C(e,t,r){if(r){setTimeout(function(){C(e,t)},r)}else{e.classList.add(t)}}function A(e,t,r){if(r){setTimeout(function(){A(e,t)},r)}else{e.classList.remove(t)}}function L(e,t){e.classList.toggle(t)}function T(e,t){k(e.parentElement.children,function(e){A(e,t)});C(e,t)}function I(e,t){do{if(e==null||v(e,t))return e}while(e=e&&l(e))}function X(e,t,r){if(s(t)){return{target:q().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function F(t,r,n){_t(function(){var e=X(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=s(r);return e?r:n}function P(t,r,n){_t(function(){var e=X(t,r,n);e.target.removeEventListener(e.event,e.listener)});return s(r)?r:n}function U(e){var t=c(e,function(e){return R(e,"hx-target")!==null});if(t){var r=R(t,"hx-target");if(r==="this"){return t}else if(r.indexOf("closest ")===0){return I(e,r.substr(8))}else if(r.indexOf("find ")===0){return w(e,r.substr(5))}else{return q().querySelector(r)}}else{var n=N(e);if(n.boosted){return q().body}else{return e}}}function z(e){var t=O.config.attributesToSettle;for(var r=0;r<t.length;r++){if(e===t[r]){return true}}return false}function V(t,r){k(t.attributes,function(e){if(!r.hasAttribute(e.name)&&z(e.name)){t.removeAttribute(e.name)}});k(r.attributes,function(e){if(z(e.name)){t.setAttribute(e.name,e.value)}})}function _(e,t){var r=Vt(t);for(var n=0;n<r.length;n++){var i=r[n];try{if(i.isInlineSwap(e)){return true}}catch(e){et(e)}}return e==="outerHTML"}function j(e,t,r){if(e==="true"){e="outerHTML"}var n=q().getElementById(t.id);if(n){var i;i=q().createDocumentFragment();i.appendChild(t);if(!_(e,n)){i=t}ie(e,n,n,i,r)}else{t.parentNode.removeChild(t);Ye(q().body,"htmx:oobErrorNoTarget",{content:t})}return e}function B(e,r){k(g(e.children),function(e){var t=R(e,"hx-swap-oob");if(t!=null){j(t,e,r)}})}function W(n,e,i){k(e.querySelectorAll("[id]"),function(e){if(e.id&&e.id.length>0){var t=n.querySelector(e.tagName+"[id='"+e.id+"']");if(t&&t!==n){var r=e.cloneNode();V(e,t);i.tasks.push(function(){V(e,r)})}}})}function J(e){return function(){$e(e);je(e);$(e);tt(e,"htmx:load")}}function $(e){var t="[autofocus]";var r=v(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function Z(e,t,r,n){W(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(J(i))}}}function G(e){var t=N(e);if(t.webSocket){t.webSocket.close()}if(t.sseEventSource){t.sseEventSource.close()}if(e.children){k(e.children,function(e){G(e)})}}function Y(e,t,r){if(e.tagName==="BODY"){return re(e,t)}else{var n=e.previousSibling;Z(l(e),e,t,r);if(n==null){var i=l(e).firstChild}else{var i=n.nextSibling}N(e).replacedWith=i;while(i&&i!==e){if(i.nodeType===Node.ELEMENT_NODE){r.elts.push(i)}i=i.nextElementSibling}G(e);l(e).removeChild(e)}}function K(e,t,r){return Z(e,e.firstChild,t,r)}function Q(e,t,r){return Z(l(e),e,t,r)}function ee(e,t,r){return Z(e,null,t,r)}function te(e,t,r){return Z(l(e),e.nextSibling,t,r)}function re(e,t,r){var n=e.firstChild;Z(e,n,t,r);if(n){while(n.nextSibling){G(n.nextSibling);e.removeChild(n.nextSibling)}G(n);e.removeChild(n)}}function ne(e,t){var r=H(e,"hx-select");if(r){var n=q().createDocumentFragment();k(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function ie(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Y(r,n,i);return;case"afterbegin":K(r,n,i);return;case"beforebegin":Q(r,n,i);return;case"beforeend":ee(r,n,i);return;case"afterend":te(r,n,i);return;default:var a=Vt(t);for(var o=0;o<a.length;o++){var s=a[o];try{var u=s.handleSwap(e,r,n,i);if(u){if(typeof u.length!=="undefined"){for(var l=0;l<u.length;l++){var f=u[l];if(f.nodeType!==Node.TEXT_NODE&&f.nodeType!==Node.COMMENT_NODE){i.tasks.push(J(f))}}}return}}catch(e){et(e)}}re(r,n,i)}}var ae=/<title>([\s\S]+?)<\/title>/im;function oe(e){var t=ae.exec(e);if(t){return t[1]}}function se(e,t,r,n,i){var a=oe(n);if(a){window.document.title=a}var o=h(n);if(o){B(o,i);o=ne(r,o);return ie(e,r,t,o,i)}}function ue(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=y(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!d(o)){o={value:o}}tt(r,a,o)}}}else{tt(r,n,[])}}var le=/\s/;var fe=/[_$a-zA-Z]/;var ce=/[_$a-zA-Z0-9]/;var ve=['"',"'","/"];var he=/[^\s]/;function de(e){var t=[];var r=0;while(r<e.length){if(fe.exec(e.charAt(r))){var n=r;r++;while(ce.exec(e.charAt(r+1))){r++}t.push(e.substr(n,r-n+1))}else if(ve.indexOf(e.charAt(r))!==-1){var i=e.charAt(r);var n=r;r++;while(r<e.length&&e.charAt(r)!==i){if(e.charAt(r)==="\\"){r++}r++}t.push(e.substr(n,r-n+1))}else{var a=e.charAt(r);t.push(a)}r++}return t}function ge(e,t,r){return fe.exec(e.charAt(0))&&e!=="true"&&e!=="false"&&e!=="this"&&e!==r&&t!=="."}function me(e,t){if(e[0]==="["){e.shift();var r=1;var n=" return (function("+t+"){ return (";var i=null;while(e.length>0){var a=e[0];if(a==="]"){r--;if(r===0){if(i===null){n=n+"true"}e.shift();n+=")})";try{var o=Function(n)();o.source=n;return o}catch(e){Ye(q().body,"htmx:syntax:error",{error:e,source:n});return null}}}else if(a==="["){r++}if(ge(a,i,t)){n+="(("+t+"."+a+") ? ("+t+"."+a+") : (window."+a+"))"}else{n=n+a}i=e.shift()}}}function pe(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}function ye(e){var t=R(e,"hx-trigger");var r=[];if(t){var n=de(t);do{pe(n,he);var i=n.length;var a=pe(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};pe(n,he);o.pollInterval=f(pe(n,le));r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var s={trigger:a};var u=me(n,"event");if(u){s.eventFilter=u}while(n.length>0&&n[0]!==","){pe(n,he);var l=n.shift();if(l==="changed"){s.changed=true}else if(l==="once"){s.once=true}else if(l==="delay"&&n[0]===":"){n.shift();s.delay=f(pe(n,le))}else if(l==="throttle"&&n[0]===":"){n.shift();s.throttle=f(pe(n,le))}else{Ye(e,"htmx:syntax:error",{token:n.shift()})}}r.push(s)}}if(n.length===i){Ye(e,"htmx:syntax:error",{token:n.shift()})}pe(n,he)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(v(e,"form")){return[{trigger:"submit"}]}else if(v(e,"input, textarea, select")){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function xe(e){N(e).cancelled=true}function be(e,t,r,n){var i=N(e);i.timeout=setTimeout(function(){if(M(e)&&i.cancelled!==true){Xt(e,t,r);be(e,t,R(e,"hx-"+t),n)}},n)}function we(e){return location.hostname===e.hostname&&u(e,"href")&&u(e,"href").indexOf("#")!==0}function Se(t,r,e){if(t.tagName==="A"&&we(t)||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=u(t,"href")}else{var a=u(t,"method");n=a?a.toLowerCase():"get";i=u(t,"action")}e.forEach(function(e){Le(t,n,i,r,e,true)})}}function Ee(e){return e.tagName==="FORM"||v(e,'input[type="submit"], button')&&I(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function Ce(e,t){return N(e).boosted&&e.tagName==="A"&&t.type==="click"&&t.ctrlKey}function Ae(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){Ye(q().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function Le(n,i,a,e,o,s){var t=function(e){if(Ae(o,e)){return}if(Ce(n,e)){return}if(s||Ee(n)){e.preventDefault()}var t=N(e);var r=N(n);if(!t.handled){t.handled=true;if(o.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(o.changed){if(r.lastValue===n.value){return}else{r.lastValue=n.value}}if(r.delayed){clearTimeout(r.delayed)}if(r.throttle){return}if(o.throttle){r.throttle=setTimeout(function(){Xt(n,i,a,e.target,e);r.throttle=null},o.throttle)}else if(o.delay){r.delayed=setTimeout(function(){Xt(n,i,a,e.target,e)},o.delay)}else{Xt(n,i,a,e.target,e)}}};e.trigger=o.trigger;e.eventListener=t;n.addEventListener(o.trigger,t)}var Te=false;var Oe=null;function Re(){if(!Oe){Oe=function(){Te=true};window.addEventListener("scroll",Oe);setInterval(function(){if(Te){Te=false;k(q().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){qe(e)})}},200)}}function qe(e){var t=N(e);if(!t.revealed&&m(e)){t.revealed=true;Xt(e,t.verb,t.path)}}function He(e,t,r){var n=p(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){Ne(e,a[1])}if(a[0]==="send"){Me(e)}}}function Ne(s,e){if(e.indexOf("ws:")!==0&&e.indexOf("wss:")!==0){e="wss:"+e}var t=O.createWebSocket(e);t.onerror=function(e){Ye(s,"htmx:wsError",{error:e,socket:t});ke(s)};N(s).webSocket=t;t.addEventListener("message",function(e){if(ke(s)){return}var t=e.data;Qe(s,function(e){t=e.transformResponse(t,null,s)});var r=Rt(s);var n=h(t);var i=g(n.children);for(var a=0;a<i.length;a++){var o=i[a];j(R(o,"hx-swap-oob")||"true",o,r)}lt(r.tasks)})}function ke(e){if(!M(e)){N(e).webSocket.close();return true}}function Me(u){var l=c(u,function(e){return N(e).webSocket!=null});if(l){var f=N(l).webSocket;u.addEventListener(ye(u)[0].trigger,function(e){var t=At(u,l,null,u);var r=wt(u,"post");var n=r.errors;var i=r.values;var a=Nt(u);var o=D(i,a);var s=Lt(o,u);s["HEADERS"]=t;if(n&&n.length>0){tt(u,"htmx:validation:halted",n);return}f.send(JSON.stringify(s));if(Ee(u)){e.preventDefault()}})}else{Ye(u,"htmx:noWebSocketSourceError")}}function De(e,t,r){var n=p(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){Ie(e,a[1])}if(a[0]==="swap"){Xe(e,a[1])}}}function Ie(t,e){var r=O.createEventSource(e);r.onerror=function(e){Ye(t,"htmx:sseError",{error:e,source:r});Pe(t)};N(t).sseEventSource=r}function Xe(a,o){var s=c(a,Ue);if(s){var u=N(s).sseEventSource;var l=function(e){if(Pe(s)){u.removeEventListener(o,l);return}var t=e.data;Qe(a,function(e){t=e.transformResponse(t,null,a)});var r=Tt(a);var n=U(a);var i=Rt(a);se(r.swapStyle,a,n,t,i);tt(a,"htmx:sseMessage",e)};N(a).sseListener=l;u.addEventListener(o,l)}else{Ye(a,"htmx:noSSESourceError")}}function Fe(e,t,r,n){var i=c(e,Ue);if(i){var a=N(i).sseEventSource;var o=function(){if(!Pe(i)){if(M(e)){Xt(e,t,r)}else{a.removeEventListener(n,o)}}};N(e).sseListener=o;a.addEventListener(n,o)}else{Ye(e,"htmx:noSSESourceError")}}function Pe(e){if(!M(e)){N(e).sseEventSource.close();return true}}function Ue(e){return N(e).sseEventSource!=null}function ze(e,t,r,n,i){var a=function(){if(!n.loaded){n.loaded=true;Xt(e,t,r)}};if(i){setTimeout(a,i)}else{a()}}function Ve(n,i,e){var a=false;k(t,function(t){if(o(n,"hx-"+t)){var r=R(n,"hx-"+t);a=true;i.path=r;i.verb=t;e.forEach(function(e){if(e.sseEvent){Fe(n,t,r,e.sseEvent)}else if(e.trigger==="revealed"){Re();qe(n)}else if(e.trigger==="load"){ze(n,t,r,i,e.delay)}else if(e.pollInterval){i.polling=true;be(n,t,r,e.pollInterval)}else{Le(n,t,r,i,e)}})}});return a}function _e(e){if(e.type==="text/javascript"||e.type===""){try{eval(e.innerText)}catch(e){et(e)}}}function je(e){if(v(e,"script")){_e(e)}k(S(e,"script"),function(e){_e(e)})}function Be(){return document.querySelector("[hx-boost], [data-hx-boost]")}function We(e){if(e.querySelectorAll){var t=Be()?", a, form":"";var r=e.querySelectorAll(n+t+", [hx-sse], [data-hx-sse], [hx-ws],"+" [data-hx-ws]");return r}else{return[]}}function Je(e){var t=N(e);if(!t.initialized){t.initialized=true;if(e.value){t.lastValue=e.value}var r=ye(e);var n=Ve(e,t,r);if(!n&&H(e,"hx-boost")==="true"){Se(e,t,r)}var i=R(e,"hx-sse");if(i){De(e,t,i)}var a=R(e,"hx-ws");if(a){He(e,t,a)}tt(e,"htmx:processedNode")}}function $e(e){Je(e);k(We(e),function(e){Je(e)})}function Ze(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Ge(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=q().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function Ye(e,t,r){tt(e,t,D({error:t},r))}function Ke(e){return e==="htmx:processedNode"}function Qe(e,t){k(Vt(e),function(e){try{t(e)}catch(e){et(e)}})}function et(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function tt(e,t,r){if(r==null){r={}}r["elt"]=e;var n=Ge(t,r);if(O.logger&&!Ke(t)){O.logger(e,t,r)}if(r.error){et(r.error);tt(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=Ze(t);if(i&&a!==t){var o=Ge(a,n.detail);i=i&&e.dispatchEvent(o)}Qe(e,function(e){i=i&&e.onEvent(t,n)!==false});return i}var rt=null;function nt(){var e=q().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||q().body}function it(e,t,r,n){var i=y(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;a<i.length;a++){if(i[a].url===e){i=i.slice(a,1);break}}i.push({url:e,content:t,title:r,scroll:n});while(i.length>O.config.historyCacheSize){i.shift()}try{localStorage.setItem("htmx-history-cache",JSON.stringify(i))}catch(e){Ye(q().body,"htmx:historyCacheError",{cause:e})}}function at(e){var t=y(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r<t.length;r++){if(t[r].url===e){return t[r]}}return null}function ot(e){var t=O.config.requestClass;var r=e.cloneNode(true);k(S(r,"."+t),function(e){A(e,t)});return r.innerHTML}function st(){var e=nt();var t=rt||location.pathname+location.search;tt(q().body,"htmx:beforeHistorySave",{path:t,historyElt:e});if(O.config.historyEnabled)history.replaceState({htmx:true},q().title,window.location.href);it(t,ot(e),q().title,window.scrollY)}function ut(e){if(O.config.historyEnabled)history.pushState({htmx:true},"",e);rt=e}function lt(e){k(e,function(e){e.call()})}function ft(n){var e=new XMLHttpRequest;var i={path:n,xhr:e};tt(q().body,"htmx:historyCacheMiss",i);e.open("GET",n,true);e.onload=function(){if(this.status>=200&&this.status<400){tt(q().body,"htmx:historyCacheMissLoad",i);var e=h(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=nt();var r=Rt(t);re(t,e,r);lt(r.tasks);rt=n}else{Ye(q().body,"htmx:historyCacheMissLoadError",i)}};e.send()}function ct(e){st(rt);e=e||location.pathname+location.search;tt(q().body,"htmx:historyRestore",{path:e});var t=at(e);if(t){var r=h(t.content);var n=nt();var i=Rt(n);re(n,r,i);lt(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);rt=e}else{ft(e)}}function vt(e){var t=H(e,"hx-push-url");return t&&t!=="false"||e.tagName==="A"&&N(e).boosted}function ht(e){var t=H(e,"hx-push-url");return t==="true"||t==="false"?null:t}function dt(e){mt(e,"add")}function gt(e){mt(e,"remove")}function mt(e,t){var r=H(e,"hx-indicator");if(r){var n=q().querySelectorAll(r)}else{n=[e]}k(n,function(e){e.classList[t].call(e.classList,O.config.requestClass)})}function pt(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function yt(e){if(e.name===""||e.name==null||e.disabled){return false}if(e.type==="button"||e.type==="submit"||e.tagName==="image"||e.tagName==="reset"||e.tagName==="file"){return false}if(e.type==="checkbox"||e.type==="radio"){return e.checked}return true}function xt(t,r,n,e){if(e==null||pt(t,e)){return}else{t.push(e)}if(yt(e)){var i=u(e,"name");var a=e.value;if(!!u(e,"multiple")){a=g(e.querySelectorAll("option:checked")).map(function(e){return e.value})}if(e.files){a=g(e.files)}if(i!=null&&a!=null){var o=r[i];if(o){if(Array.isArray(o)){if(Array.isArray(a)){r[i]=o.concat(a)}else{o.push(a)}}else{if(Array.isArray(a)){r[i]=[o].concat(a)}else{r[i]=[o,a]}}}else{r[i]=a}}bt(e,n)}if(v(e,"form")){var s=e.elements;k(s,function(e){xt(t,r,n,e)})}}function bt(e,t){if(e.willValidate){tt(e,"htmx:validation:validate");if(!e.checkValidity()){t.push({elt:e,message:e.validationMessage,validity:e.validity});tt(e,"htmx:validation:failed",{message:e.validationMessage,validity:e.validity})}}}function wt(e,t){var r=[];var n={};var i=[];if(t!=="get"){xt(r,n,i,I(e,"form"))}xt(r,n,i,e);var a=H(e,"hx-include");if(a){var o=q().querySelectorAll(a);k(o,function(e){xt(r,n,i,e)})}return{errors:i,values:n}}function St(e,t,r){if(e!==""){e+="&"}e+=encodeURIComponent(t)+"="+encodeURIComponent(r);return e}function Et(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){k(n,function(e){t=St(t,r,e)})}else{t=St(t,r,n)}}}return t}function Ct(e){var t=new FormData;for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){k(n,function(e){t.append(r,e)})}else{t.append(r,n)}}}return t}function At(e,t,r,n){var i={"HX-Request":"true","HX-Trigger":u(e,"id"),"HX-Trigger-Name":u(e,"name"),"HX-Target":R(t,"id"),"HX-Current-URL":q().location.href};if(r!==undefined){i["HX-Prompt"]=r}if(n){i["HX-Event-Target"]=u(n,"id")}if(q().activeElement){i["HX-Active-Element"]=u(q().activeElement,"id");i["HX-Active-Element-Name"]=u(q().activeElement,"name");if(q().activeElement.value){i["HX-Active-Element-Value"]=u(q().activeElement,"value")}}return i}function Lt(t,e){var r=H(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){k(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};k(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function Tt(e){var t=H(e,"hx-swap");var r={swapStyle:O.config.defaultSwapStyle,swapDelay:O.config.defaultSwapDelay,settleDelay:O.config.defaultSettleDelay};if(t){var n=p(t);if(n.length>0){r["swapStyle"]=n[0];for(var i=1;i<n.length;i++){var a=n[i];if(a.indexOf("swap:")===0){r["swapDelay"]=f(a.substr(5))}if(a.indexOf("settle:")===0){r["settleDelay"]=f(a.substr(7))}if(a.indexOf("scroll:")===0){r["scroll"]=a.substr(7)}if(a.indexOf("show:")===0){r["show"]=a.substr(5)}}}}return r}function Ot(t,r,n){var i=null;Qe(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(H(r,"hx-encoding")==="multipart/form-data"){return Ct(n)}else{return Et(n)}}}function Rt(e){return{tasks:[],elts:[e]}}function qt(e,t,r){if(r.scroll){if(r.scroll==="top"){e.scrollTop=0}if(r.scroll==="bottom"){e.scrollTop=e.scrollHeight}}if(r.show){if(r.show==="top"){e.scrollIntoView(true)}if(r.show==="bottom"){e.scrollIntoView(false)}}}function Ht(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=R(e,t);if(i){var a=i.trim();if(a.indexOf("{")!==0){a="{"+a+"}"}var o=r(a);for(var s in o){if(o.hasOwnProperty(s)){if(n[s]==null){n[s]=o[s]}}}}return Ht(l(e),t,r,n)}function Nt(e,t){return Ht(e,"hx-vars",function(e){return Function("return ("+e+")")()},t)}function kt(e,t){return Ht(e,"hx-vars",function(e){return JSON.parse(t)},t)}function Mt(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Dt(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){Ye(q().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function It(e,t){return e.getAllResponseHeaders().match(t)}function Xt(l,e,f,t,r){if(!M(l)){console.log("Body does not contain",l);return}var c=U(l);if(c==null){Ye(l,"htmx:targetError",{target:R(l,"hx-target")});return}var n=N(l);if(n.requestInFlight){n.queuedRequest=function(){Xt(l,e,f,t,r)};return}else{n.requestInFlight=true}var i=function(){n.requestInFlight=false;var e=n.queuedRequest;n.queuedRequest=null;if(e){e()}};var a=H(l,"hx-prompt");if(a){var o=prompt(a);if(o===null||!tt(l,"htmx:prompt",{prompt:o,target:c}))return i()}var s=H(l,"hx-confirm");if(s){if(!confirm(s))return i()}var v=new XMLHttpRequest;var u=At(l,c,o,t);var h=wt(l,e);var d=h.errors;var g=h.values;var m=Nt(l);var p=D(g,m);var y=Lt(p,l);if(e!=="get"&&H(l,"hx-encoding")==null){u["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8"}if(f==null||f===""){f=q().location.href}var x={parameters:y,unfilteredParameters:p,headers:u,target:c,verb:e,errors:d,path:f,triggeringEvent:r};if(!tt(l,"htmx:configRequest",x))return i();f=x.path;e=x.verb;u=x.headers;y=x.parameters;d=x.errors;if(d&&d.length>0){tt(l,"htmx:validation:halted",x);return i()}var b=f.split("#");var w=b[0];var S=b[1];if(e==="get"){var E=w;var C=Object.keys(y).length!==0;if(C){if(E.indexOf("?")<0){E+="?"}else{E+="&"}E+=Et(y);if(S){E+="#"+S}}v.open("GET",E,true)}else{v.open(e.toUpperCase(),f,true)}v.overrideMimeType("text/html");for(var A in u){if(u.hasOwnProperty(A)){var L=u[A];Mt(v,A,L)}}var T={xhr:v,target:c,requestConfig:x};v.onload=function(){try{if(!tt(l,"htmx:beforeOnLoad",T))return;if(It(v,/HX-Trigger:/i)){ue(v,"HX-Trigger",l)}if(It(v,/HX-Push:/i)){var a=v.getResponseHeader("HX-Push")}if(It(v,/HX-Redirect:/i)){window.location.href=v.getResponseHeader("HX-Redirect");return}if(It(v,/HX-Refresh:/i)){if("true"===v.getResponseHeader("HX-Refresh")){location.reload();return}}var o=vt(l)||a;if(this.status>=200&&this.status<400){if(this.status===286){xe(l)}if(this.status!==204){if(!tt(c,"htmx:beforeSwap",T))return;var s=this.response;Qe(l,function(e){s=e.transformResponse(s,v,l)});if(o){st()}var u=Tt(l);c.classList.add(O.config.swappingClass);var e=function(){try{var e=document.activeElement;var t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null};var r=Rt(c);se(u.swapStyle,c,l,s,r);if(t.elt&&!M(t.elt)&&t.elt.id){var n=document.getElementById(t.elt.id);if(n){if(t.start&&n.setSelectionRange){n.setSelectionRange(t.start,t.end)}n.focus()}}c.classList.remove(O.config.swappingClass);k(r.elts,function(e){if(e.classList){e.classList.add(O.config.settlingClass)}tt(e,"htmx:afterSwap",T)});if(S){location.hash=S}if(It(v,/HX-Trigger-After-Swap:/i)){ue(v,"HX-Trigger-After-Swap",l)}var i=function(){k(r.tasks,function(e){e.call()});k(r.elts,function(e){if(e.classList){e.classList.remove(O.config.settlingClass)}tt(e,"htmx:afterSettle",T)});if(o){var e=a||ht(l)||Dt(v)||E||f;ut(e);tt(q().body,"htmx:pushedIntoHistory",{path:e})}qt(c,r.elts,u);if(It(v,/HX-Trigger-After-Settle:/i)){ue(v,"HX-Trigger-After-Settle",l)}};if(u.settleDelay>0){setTimeout(i,u.settleDelay)}else{i()}}catch(e){Ye(l,"htmx:swapError",T);throw e}};if(u.swapDelay>0){setTimeout(e,u.swapDelay)}else{e()}}}else{Ye(l,"htmx:responseError",D({error:"Response Status Error Code "+this.status+" from "+f},T))}}catch(e){Ye(l,"htmx:onLoadError",D({error:e},T));throw e}finally{gt(l);var t=N(l).replacedWith||l;tt(t,"htmx:afterRequest",T);tt(t,"htmx:afterOnLoad",T);i()}};v.onerror=function(){gt(l);Ye(l,"htmx:afterRequest",T);Ye(l,"htmx:sendError",T);i()};if(!tt(l,"htmx:beforeRequest",T))return i();dt(l);k(["loadstart","loadend","progress","abort"],function(t){v.addEventListener(t,function(e){tt(l,"htmx:xhr:"+t,D({},e.detail))})});v.send(e==="get"?null:Ot(v,l,y))}var Ft={};function Pt(){return{onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ut(e,t){Ft[e]=D(Pt(),t)}function zt(e){delete Ft[e]}function Vt(e,r){if(e==null){return r}if(r==null){r=[]}var t=R(e,"hx-ext");if(t){k(t.split(","),function(e){e=e.replace(/ /g,"");var t=Ft[e];if(t&&r.indexOf(t)<0){r.push(t)}})}return Vt(l(e),r)}function _t(e){if(q().readyState!=="loading"){e()}else{q().addEventListener("DOMContentLoaded",e)}}function jt(){if(O.config.includeIndicatorStyles!==false){q().head.insertAdjacentHTML("beforeend","<style> ."+O.config.indicatorClass+"{opacity:0;transition: opacity 200ms ease-in;} ."+O.config.requestClass+" ."+O.config.indicatorClass+"{opacity:1} ."+O.config.requestClass+"."+O.config.indicatorClass+"{opacity:1} </style>")}}function Bt(){var e=q().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function Wt(){var e=Bt();if(e){O.config=D(O.config,e)}}_t(function(){Wt();jt();var e=q().body;$e(e);tt(e,"htmx:load",{});window.onpopstate=function(e){if(e.state&&e.state.htmx){ct()}}});return O}()}); \ No newline at end of file diff --git a/dist/htmx.min.js.gz b/dist/htmx.min.js.gz index 76b62087..3b498f13 100644 Binary files a/dist/htmx.min.js.gz and b/dist/htmx.min.js.gz differ diff --git a/src/htmx.js b/src/htmx.js index 1e2d6f67..a337a907 100644 --- a/src/htmx.js +++ b/src/htmx.js @@ -700,7 +700,7 @@ return (function () { if (tokens[0] === '[') { tokens.shift(); var bracketCount = 1; - var conditionalSource = "(function(" + paramName + "){ return ("; + var conditionalSource = " return (function(" + paramName + "){ return ("; var last = null; while (tokens.length > 0) { var token = tokens[0]; @@ -713,7 +713,7 @@ return (function () { tokens.shift(); conditionalSource += ")})"; try { - var conditionFunction = eval(conditionalSource); + var conditionFunction = Function(conditionalSource)(); conditionFunction.source = conditionalSource; return conditionFunction; } catch (e) { @@ -1719,13 +1719,20 @@ return (function () { } } - function getExpressionVars(elt, expressionVars = []) { + function getValuesForElement(elt, attr, strToValues, expressionVars) { + if (expressionVars == null) { + expressionVars = {}; + } if (elt == null) { return expressionVars; } - var attributeValue = getAttributeValue(elt, "hx-vars"); + var attributeValue = getAttributeValue(elt, attr); if (attributeValue) { - var varsValues = eval("({" + attributeValue + "})"); + var str = attributeValue.trim(); + if (str.indexOf('{') !== 0) { + str = "{" + str + "}"; + } + var varsValues = strToValues(str); for (var key in varsValues) { if (varsValues.hasOwnProperty(key)) { if (expressionVars[key] == null) { @@ -1734,7 +1741,23 @@ return (function () { } } } - return getExpressionVars(parentElt(elt), expressionVars); + return getValuesForElement(parentElt(elt), attr, strToValues, expressionVars); + } + + function getHXVarsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vars", function(valueStr){ + return Function("return (" + valueStr + ")")() + }, expressionVars); + } + + function getHXValsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vals", function(valueStr){ + return JSON.parse(valueStr); + }, expressionVars); + } + + function getExpressionVars(elt) { + return mergeObjects(getHXVarsForElement(elt), getHXValsForElement(elt)); } function safelySetHeaderValue(xhr, header, headerValue) { diff --git a/test/attributes/hx-vals.js b/test/attributes/hx-vals.js new file mode 100644 index 00000000..1cdc1482 --- /dev/null +++ b/test/attributes/hx-vals.js @@ -0,0 +1,87 @@ +describe("hx-vals attribute", function() { + beforeEach(function () { + this.server = makeServer(); + clearWorkArea(); + }); + afterEach(function () { + this.server.restore(); + clearWorkArea(); + }); + + it('basic hx-vals works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("<div hx-post='/vars' hx-vals='\"i1\":\"test\"'></div>") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('multiple hx-vals works', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['v1'].should.equal("test"); + params['v2'].should.equal("42"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("<div hx-post='/vars' hx-vals='\"v1\":\"test\", \"v2\":42'></div>") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals can be on parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + make("<div hx-vals='\"i1\":\"test\"'><div id='d1' hx-post='/vars'></div></div>"); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals can override parents', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + make("<div hx-vals='\"i1\":\"test\"'><div id='d1' hx-vals='\"i1\":\"best\"' hx-post='/vars'></div></div>"); + var div = byId("d1"); + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals overrides inputs', function () { + this.server.respondWith("POST", "/include", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("best"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("<div hx-target='this'><input hx-post='/include' hx-vals='\"i1\":\"best\"' hx-trigger='click' id='i1' name='i1' value='test'/></div>") + var input = byId("i1") + input.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + + it('hx-vals overrides hx-vars', function () { + this.server.respondWith("POST", "/vars", function (xhr) { + var params = getParameters(xhr); + params['i1'].should.equal("test"); + xhr.respond(200, {}, "Clicked!") + }); + var div = make("<div hx-post='/vars' hx-vals='\"i1\":\"test\"' hx-vars='\"i1\":\"best\"'></div>") + div.click(); + this.server.respond(); + div.innerHTML.should.equal("Clicked!"); + }); + +}); \ No newline at end of file diff --git a/test/attributes/hx-vars.js b/test/attributes/hx-vars.js index 37c4de2b..dbb6b609 100644 --- a/test/attributes/hx-vars.js +++ b/test/attributes/hx-vars.js @@ -59,7 +59,7 @@ describe("hx-vars attribute", function() { div.innerHTML.should.equal("Clicked!"); }); - it('hx-vars override inputs', function () { + it('hx-vars overrides inputs', function () { this.server.respondWith("POST", "/include", function (xhr) { var params = getParameters(xhr); params['i1'].should.equal("best"); diff --git a/test/index.html b/test/index.html index 053eff8a..9aa54739 100644 --- a/test/index.html +++ b/test/index.html @@ -97,6 +97,7 @@ <script src="attributes/hx-swap.js"></script> <script src="attributes/hx-target.js"></script> <script src="attributes/hx-trigger.js"></script> +<script src="attributes/hx-vals.js"></script> <script src="attributes/hx-vars.js"></script> <script src="attributes/hx-ws.js"></script>