summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorcarson <carson@leaddyno.com>2020-05-24 22:40:37 -0700
committercarson <carson@leaddyno.com>2020-05-24 22:40:37 -0700
commite419212036c8e27aa6e47b22d51aada9073e2ab9 (patch)
tree3d5a9b8cf9e2ae8d07950c61a1ef86ac9c4a576c
parent4efd261fde389e1910a32872134b6e3d751b0075 (diff)
downloadhtmx-e419212036c8e27aa6e47b22d51aada9073e2ab9.tar.gz
htmx-e419212036c8e27aa6e47b22d51aada9073e2ab9.zip
lowercase vibe
-rw-r--r--dist/ext/class-tools.js2
-rw-r--r--dist/htmx.js3
-rw-r--r--dist/htmx.min.js2
-rw-r--r--dist/htmx.min.js.gzbin6640 -> 6645 bytes
-rw-r--r--src/ext/class-tools.js2
-rw-r--r--src/htmx.js1
-rw-r--r--www/docs.md8
-rw-r--r--www/examples.md1
-rw-r--r--www/examples/animations.md179
-rw-r--r--www/js/class-tools.js2
-rw-r--r--www/js/htmx.js3
-rw-r--r--www/test/0.0.4/src/ext/class-tools.js2
-rw-r--r--www/test/0.0.4/src/htmx.js3
13 files changed, 200 insertions, 8 deletions
diff --git a/dist/ext/class-tools.js b/dist/ext/class-tools.js
index 092a5778..fa1493db 100644
--- a/dist/ext/class-tools.js
+++ b/dist/ext/class-tools.js
@@ -14,7 +14,7 @@
if (classDef.indexOf(":") > 0) {
var splitCssClass = classDef.split(':');
cssClass = splitCssClass[0];
- delay = parseInterval(splitCssClass[1]);
+ delay = htmx.parseInterval(splitCssClass[1]);
} else {
cssClass = classDef;
delay = 100;
diff --git a/dist/htmx.js b/dist/htmx.js
index de0ac11a..55e8df64 100644
--- a/dist/htmx.js
+++ b/dist/htmx.js
@@ -1386,7 +1386,7 @@ return (function () {
throw e;
} finally {
removeRequestIndicatorClasses(elt);
- triggerErrorEvent(elt, 'afterRequest.htmx', eventDetail);
+ triggerEvent(elt, 'afterRequest.htmx', eventDetail);
triggerEvent(elt, 'afterOnLoad.htmx', eventDetail);
endRequestLock();
}
@@ -1522,6 +1522,7 @@ return (function () {
defaultSettleDelay:100,
includeIndicatorStyles:true
},
+ parseInterval:parseInterval,
_:internalEval
}
}
diff --git a/dist/htmx.min.js b/dist/htmx.min.js
index 36267a9b..c5a164eb 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 t=["get","post","put","delete","patch"];function a(e){if(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 w(e,t){return u(e,t)||u(e,"data-"+t)}function o(e){return e.parentElement}function E(){return document}function l(e,t){if(t(e)){return e}else if(o(e)){return l(o(e),t)}else{return null}}function O(e,t){var r=null;l(e,function(e){return r=w(e,t)});return r}function s(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 n(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}return i}function f(e){var t=r(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return n("<table>"+e+"</table>",1);case"col":return n("<table><colgroup>"+e+"</colgroup></table>",2);case"tr":return n("<table><tbody>"+e+"</tbody></table>",2);case"td":case"th":return n("<table><tbody><tr>"+e+"</tr></tbody></table>",3);default:return n(e,0)}}function i(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function c(e){return i(e,"Function")}function h(e){return i(e,"Object")}function L(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function v(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function C(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function d(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function m(e){return E().body.contains(e)}function g(e){return e.split(/\s+/)}function p(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function e(e){return eval(e)}function x(t){var e=htmx.on("load.htmx",function(e){t(e.detail.elt)});return e}function y(){htmx.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function b(e,t){if(t){return e.querySelector(t)}else{return E().body.querySelector(e)}}function S(e,t){if(t){return e.querySelectorAll(t)}else{return E().body.querySelectorAll(e)}}function T(e,t){if(t){setTimeout(function(){T(e)},t)}else{e.parentElement.removeChild(e)}}function q(e,t,r){if(r){setTimeout(function(){q(e,t)},r)}else{e.classList.add(t)}}function N(e,t,r){if(r){setTimeout(function(){N(e,t)},r)}else{e.classList.remove(t)}}function H(e,t){e.classList.toggle(t)}function X(e,t){C(e.parentElement.children,function(e){N(e,t)});q(e,t)}function A(e,t){do{if(e==null||s(e,t))return e}while(e=e&&o(e))}function R(e,t,r){if(c(t)){return{target:E().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function k(t,r,n){$e(function(){var e=R(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=c(r);return e?r:n}function D(t,r,n){$e(function(){var e=R(t,r,n);e.target.removeEventListener(e.event,e.listener)});return c(r)?r:n}function M(e){var t=l(e,function(e){return w(e,"hx-target")!==null});if(t){var r=w(t,"hx-target");if(r==="this"){return t}else if(r.indexOf("closest ")===0){return A(e,r.substr(8))}else{return E().querySelector(r)}}else{var n=L(e);if(n.boosted){return E().body}else{return e}}}function I(t,r){C(t.attributes,function(e){if(!r.hasAttribute(e.name)){t.removeAttribute(e.name)}});C(r.attributes,function(e){t.setAttribute(e.name,e.value)})}function F(e,n){C(v(e.children),function(e){if(w(e,"hx-swap-oob")==="true"){var t=E().getElementById(e.id);if(t){var r=E().createDocumentFragment();r.appendChild(e);j(t,r,n)}else{e.parentNode.removeChild(e);be(E().body,"oobErrorNoTarget.htmx",{content:e})}}})}function P(n,e,i){C(e.querySelectorAll("[id]"),function(e){var t=n.querySelector(e.tagName+"[id="+e.id+"]");if(t){var r=e.cloneNode();I(e,t);i.tasks.push(function(){I(e,r)})}})}function J(e,t,r,n){P(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE){we(i,"load.htmx",{});pe(i)}}}function j(e,t,r){if(e.tagName==="BODY"){return V(e,t)}else{var n=e.previousSibling;J(o(e),e,t,r);if(n==null){var i=o(e).firstChild}else{var i=n.nextSibling}while(i&&i!=e){r.elts.push(i);i=i.nextSibling}o(e).removeChild(e)}}function U(e,t,r){return J(e,e.firstChild,t,r)}function B(e,t,r){return J(o(e),e,t,r)}function W(e,t,r){return J(e,null,t,r)}function z(e,t,r){return J(o(e),e.nextSibling,t,r)}function V(e,t,r){var n=e.firstChild;J(e,n,t,r);if(n){while(n.nextSibling){e.removeChild(n.nextSibling)}e.removeChild(n)}}function G(e,t){var r=O(e,"hx-select");if(r){var n=E().createDocumentFragment();C(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function Y(e,t,r,n,i){switch(e){case"outerHTML":j(r,n,i);return;case"afterbegin":U(r,n,i);return;case"beforebegin":B(r,n,i);return;case"beforeend":W(r,n,i);return;case"afterend":z(r,n,i);return;default:var o=Ze(t);for(var a=0;a<o.length;a++){var u=o[a];if(u.handleSwap(e,r,n,i)){return}}V(r,n,i)}}function _(e,t,r,n,i){var o=f(n);if(o){F(o,i);o=G(r,o);return Y(e,r,t,o,i)}}function K(e,t){if(t){if(t.indexOf("{")===0){var r=JSON.parse(t);for(var n in r){if(r.hasOwnProperty(n)){var i=r[n];if(!h(i)){i={value:i}}we(e,n,i)}}}else{we(e,t,[])}}}function Q(e){var t=w(e,"hx-trigger");if(t){var r=t.split(",").map(function(e){var t=g(e.trim());var r=t[0];if(!r)return null;if(r==="every")return{trigger:"every",pollInterval:a(t[1])};var n={trigger:r};for(var i=1;i<t.length;i++){var o=t[i].trim();if(o==="changed"){n.changed=true}if(o==="once"){n.once=true}if(o.indexOf("delay:")===0){n.delay=a(o.substr(6))}}return n}).filter(function(e){return e!==null});if(r.length)return r}if(s(e,"form"))return[{trigger:"submit"}];if(s(e,"input, textarea, select"))return[{trigger:"change"}];return[{trigger:"click"}]}function Z(e){L(e).cancelled=true}function $(e,t,r,n){var i=L(e);i.timeout=setTimeout(function(){if(m(e)&&i.cancelled!==true){Ge(e,t,r);$(e,t,w(e,"hx-"+t),n)}},n)}function ee(e){return location.hostname===e.hostname&&u(e,"href")&&u(e,"href").indexOf("#")!==0}function te(t,r,e){if(t.tagName==="A"&&ee(t)||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=u(t,"href")}else{var o=u(t,"method");n=o?o.toLowerCase():"get";i=u(t,"action")}e.forEach(function(e){ie(t,n,i,r,e,true)})}}function re(e){return e.tagName==="FORM"||s(e,'input[type="submit"], button')&&A(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function ne(e,t){return L(e).boosted&&e.tagName==="A"&&t.type==="click"&&t.ctrlKey}function ie(i,o,a,e,u,l){var t=function(e){if(ne(i,e)){return}if(l||re(i)){e.preventDefault()}var t=L(e);var r=L(i);if(!t.handled){t.handled=true;if(u.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(u.changed){if(r.lastValue===i.value){return}else{r.lastValue=i.value}}if(r.delayed){clearTimeout(r.delayed)}var n=function(){Ge(i,o,a,e.target)};if(u.delay){r.delayed=setTimeout(n,u.delay)}else{n()}}};e.trigger=u.trigger;e.eventListener=t;i.addEventListener(u.trigger,t)}function oe(){if(!window["htmxScrollHandler"]){var e=function(){C(E().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){ae(e)})};window["htmxScrollHandler"]=e;window.addEventListener("scroll",e)}}function ae(e){var t=L(e);if(!t.revealed&&d(e)){t.revealed=true;Ge(e,t.verb,t.path)}}function ue(e,t,r){var n=r.split(",");for(var i=0;i<n.length;i++){var o=removeWhiteSpace(n[i]);if(o.indexOf("source:")===0){le(e,o.substr(7))}if(o.indexOf("send:")===0){fe(e,o.substr(5))}}}function le(s,e){var t={protocols:[]};we(s,"initWebSocket.htmx",t);var r=new WebSocket("wss:"+e,t.protocols);r.onerror=function(e){be(s,"wsError.htmx",{error:e,socket:r});se(s)};L(s).webSocket=r;r.addEventListener("message",function(e){if(se(s)){return}var t=e.data;C(Ze(s),function(e){t=e.transformResponse(t,null,s)});var r=Ve(s);var n=f(t);var i=v(n.children);for(var o=0;o<i.length;o++){var a=i[o];if(a.id){var u=E().getElementById(a.id);if(u){var l=E().createDocumentFragment();l.appendChild(a);j(u,n,r)}}}Ne(r.tasks)})}function se(e){if(!m(e)){L(e).webSocket.close();return true}}function fe(i,e){var o=l(i,function(e){return L(e).webSocket!=null});if(o){var a=L(o).webSocket;i.addEventListener(e,function(e){var t=Ue(i,o,null,i);var r=Pe(i,"post");var n=Be(r,i);n["HEADERS"]=t;a.send(JSON.stringify(n));if(re(i)){e.preventDefault()}})}else{be(i,"noWebSocketSourceError.htmx")}}function ce(e){if(!m(e)){L(e).sseEventSource.close();return true}}function he(e,t,r){var n=r.split(",");for(var i=0;i<n.length;i++){var o=removeWhiteSpace(n[i]);if(o.indexOf("source:")===0){ve(e,o.substr(7))}if(o.indexOf("trigger:")&&t.verb){de(e,t.verb,t.path,o.substr(8))}}}function ve(t,e){var r={config:{withCredentials:true}};we(t,"initSSE.htmx",r);var n=new EventSource(e,r.config);n.onerror=function(e){be(t,"sseError.htmx",{error:e,source:n});ce(t)};L(t).sseEventSource=n}function de(e,t,r,n){var i=l(e,function(e){return L(e).sseEventSource!=null});if(i){var o=L(i).sseEventSource;var a=function(){if(!ce(o)){if(m(e)){Ge(e,t,r)}else{o.removeEventListener(n,a)}}};L(e).sseListener=a;o.addEventListener(n,a)}else{be(e,"noSSESourceError.htmx")}}function me(e,t,r,n,i){var o=function(){if(!n.loaded){n.loaded=true;Ge(e,t,r)}};if(i){setTimeout(o,i)}else{o()}}function ge(n,i,e){var o=false;C(t,function(t){var r=w(n,"hx-"+t);if(r){o=true;i.path=r;i.verb=t;e.forEach(function(e){if(e.trigger==="revealed"){oe();ae(n)}else if(e.trigger==="load"){me(n,t,r,i,e.delay)}else if(e.pollInterval){i.polling=true;$(n,t,r,e.pollInterval)}else{ie(n,t,r,i,e)}})}});return o}function pe(e){var t=L(e);if(!t.processed){t.processed=true;var r=Q(e);var n=ge(e,t,r);if(!n&&O(e,"hx-boost")==="true"){te(e,t,r)}var i=w(e,"hx-sse");if(i){he(e,t,i)}var i=w(e,"hx-ws");if(i){ue(e,t,i)}we(e,"processedNode.htmx")}if(e.children){C(e.children,function(e){pe(e)})}}function xe(e,t,r){var n=O(e,"hx-error-url");if(n){var i=new XMLHttpRequest;i.open("POST",n);i.setRequestHeader("Content-Type","application/json;charset=UTF-8");i.send(JSON.stringify({elt:e.id,event:t,detail:r}))}}function ye(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=E().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function be(e,t,r){we(e,t,p({isError:true},r))}function Se(e){return e==="processedNode.htmx"}function we(e,t,r){if(r==null){r={}}r["elt"]=e;var n=ye(t,r);if(htmx.logger&&!Se(t)){htmx.logger(e,t,r)}if(r.isError){xe(e,t,r)}var i=e.dispatchEvent(n);C(Ze(e),function(e){i=i&&e.onEvent(t,n)!==false});return i}var Ee=null;function Oe(){var e=E().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||E().body}function Le(e,t,r,n){var i=JSON.parse(localStorage.getItem("htmx-history-cache"))||[];for(var o=0;o<i.length;o++){if(i[o].url===e){i=i.slice(o,1);break}}i.push({url:e,content:t,title:r,scroll:n});while(i.length>htmx.config.historyCacheSize){i.shift()}localStorage.setItem("htmx-history-cache",JSON.stringify(i))}function Ce(e){var t=JSON.parse(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r<t.length;r++){if(t[r].url===e){return t[r]}}return null}function Te(){var e=Oe();var t=Ee||location.pathname+location.search;we(E().body,"beforeHistorySave.htmx",{path:t,historyElt:e});if(htmx.config.historyEnabled)history.replaceState({},E().title,window.location.href);Le(t,e.innerHTML,E().title,window.scrollY)}function qe(e){if(htmx.config.historyEnabled)history.pushState({},"",e);Ee=e}function Ne(e){C(e,function(e){e.call()})}function He(n){var e=new XMLHttpRequest;var i={path:n,xhr:e};we(E().body,"historyCacheMiss.htmx",i);e.open("GET",n,true);e.onload=function(){if(this.status>=200&&this.status<400){we(E().body,"historyCacheMissLoad.htmx",i);var e=f(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Oe();var r=Ve(t);V(t,e,r);Ne(r.tasks);Ee=n}else{be(E().body,"historyCacheMissLoadError.htmx",i)}};e.send()}function Xe(e){Te(Ee);e=e||location.pathname+location.search;we(E().body,"historyRestore.htmx",{path:e});var t=Ce(e);if(t){var r=f(t.content);var n=Oe();var i=Ve(n);V(n,r,i);Ne(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Ee=e}else{He(e)}}function Ae(e){return O(e,"hx-push-url")==="true"||e.tagName==="A"&&L(e).boosted}function Re(e){De(e,"add")}function ke(e){De(e,"remove")}function De(e,t){var r=O(e,"hx-indicator");if(r){var n=E().querySelectorAll(r)}else{n=[e]}C(n,function(e){e.classList[t].call(e.classList,"htmx-request")})}function Me(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function Ie(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 Fe(t,r,e){if(e==null||Me(t,e)){return}else{t.push(e)}if(Ie(e)){var n=u(e,"name");var i=e.value;if(n!=null&&i!=null){var o=r[n];if(o){if(Array.isArray(o)){o.push(i)}else{r[n]=[o,i]}}else{r[n]=i}}}if(s(e,"form")){var a=e.elements;C(a,function(e){Fe(t,r,e)})}}function Pe(e,t){var r=[];var n={};if(t!=="get"){Fe(r,n,A(e,"form"))}Fe(r,n,e);var i=O(e,"hx-include");if(i){var o=E().querySelectorAll(i);C(o,function(e){Fe(r,n,e)})}return n}function Je(e,t,r){if(e!==""){e+="&"}e+=encodeURIComponent(t)+"="+encodeURIComponent(r);return e}function je(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){C(n,function(e){t=Je(t,r,e)})}else{t=Je(t,r,n)}}}return t}function Ue(e,t,r,n){var i={"X-HX-Request":"true","X-HX-Trigger":u(e,"id"),"X-HX-Trigger-Name":u(e,"name"),"X-HX-Target":w(t,"id"),"X-HX-Current-URL":E().location.href};if(r!==undefined){i["X-HX-Prompt"]=r}if(n){i["X-HX-Event-Target"]=u(n,"id")}if(E().activeElement){i["X-HX-Active-Element"]=u(E().activeElement,"id");i["X-HX-Active-Element-Name"]=u(E().activeElement,"name");if(E().activeElement.value){i["X-HX-Active-Element-Value"]=u(E().activeElement,"value")}}return i}function Be(t,e){var r=O(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){C(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};C(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function We(e){var t=O(e,"hx-swap");var r={swapStyle:htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(t){var n=g(t);if(n.length>0){r["swapStyle"]=n[0];for(var i=1;i<n.length;i++){var o=n[i];if(o.indexOf("swap:")===0){r["swapDelay"]=a(o.substr(5))}if(o.indexOf("settle:")===0){r["settleDelay"]=a(o.substr(7))}}}}return r}function ze(t,r,n){var i=null;C(Ze(r),function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{return je(n)}}function Ve(e){return{tasks:[],elts:[e]}}function Ge(a,e,u,t){var l=M(a);if(l==null){be(a,"targetError.htmx",{target:w(a,"hx-target")});return}var r=L(a);if(r.requestInFlight){return}else{r.requestInFlight=true}var s=function(){r.requestInFlight=false};var n=O(a,"hx-prompt");if(n){var i=prompt(n);if(i===null||!we(a,"prompt.htmx",{prompt:i,target:l}))return s()}var o=O(a,"hx-confirm");if(o){if(!confirm(o))return s()}var f=new XMLHttpRequest;var c=Ue(a,l,i,t);var h=Pe(a,e);var v=Be(h,a);if(e!=="get"){c["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8";if(e!=="post"){c["X-HTTP-Method-Override"]=e.toUpperCase()}}if(u==null||u===""){u=E().location.href}var d={parameters:v,unfilteredParameters:h,headers:c,target:l,verb:e};if(!we(a,"configRequest.htmx",d))return s();var m=u.split("#");var g=m[0];var p=m[1];if(e==="get"){var x=g;var y=Object.keys(v).length!==0;if(y){if(x.indexOf("?")<0){x+="?"}else{x+="&"}x+=je(v);if(p){x+="#"+p}}f.open("GET",x,true)}else{f.open("POST",u,true)}f.overrideMimeType("text/html");for(var b in c){if(c.hasOwnProperty(b)){if(c[b]!==null)f.setRequestHeader(b,c[b])}}var S={xhr:f,target:l};f.onload=function(){try{if(!we(a,"beforeOnLoad.htmx",S))return;K(a,this.getResponseHeader("X-HX-Trigger"));var r=this.getResponseHeader("X-HX-Push");var n=Ae(a)||r;if(this.status>=200&&this.status<400){if(this.status===286){Z(a)}if(this.status!==204){if(!we(a,"beforeSwap.htmx",S))return;var i=this.response;C(Ze(a),function(e){i=e.transformResponse(i,f,a)});if(n){Te()}var o=We(a);l.classList.add("htmx-swapping");var e=function(){try{var e=Ve(l);_(o.swapStyle,l,a,i,e);l.classList.remove("htmx-swapping");C(e.elts,function(e){if(e.classList){e.classList.add("htmx-settling")}});we(a,"afterSwap.htmx",S);if(p){location.hash=p}var t=function(){C(e.tasks,function(e){e.call()});C(e.elts,function(e){if(e.classList){e.classList.remove("htmx-settling")}});if(n){qe(r||u)}we(a,"afterSettle.htmx",S)};if(o.settleDelay>0){setTimeout(t,o.settleDelay)}else{t()}}catch(e){be(a,"swapError.htmx",S);throw e}};if(o.swapDelay>0){setTimeout(e,o.swapDelay)}else{e()}}}else{be(a,"responseError.htmx",S)}}catch(e){S["exception"]=e;be(a,"onLoadError.htmx",S);throw e}finally{ke(a);be(a,"afterRequest.htmx",S);we(a,"afterOnLoad.htmx",S);s()}};f.onerror=function(){ke(a);be(a,"afterRequest.htmx",S);be(a,"sendError.htmx",S);s()};if(!we(a,"beforeRequest.htmx",S))return s();Re(a);f.send(e==="get"?null:ze(f,a,v))}var Ye={};function _e(){return{onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ke(e,t){Ye[e]=p(_e(),t)}function Qe(e){delete Ye[e]}function Ze(e,r){if(e==null){return r}if(r==null){r=[]}var t=w(e,"hx-ext");if(t){C(t.split(","),function(e){e=e.replace(/ /g,"");var t=Ye[e];if(t&&!r.includes(t)){r.push(t)}})}return Ze(o(e),r)}function $e(e){if(E().readyState!=="loading"){e()}else{E().addEventListener("DOMContentLoaded",e)}}(function(){var e=et();if(e===null||e.includeIndicatorStyles!==false){E().head.insertAdjacentHTML("beforeend","<style> .htmx-indicator{opacity:0;transition: opacity 200ms ease-in;} .htmx-request .htmx-indicator{opacity:1} .htmx-request.htmx-indicator{opacity:1} </style>")}})();function et(){var e=E().querySelector('meta[name="htmx-config"]');if(e){return JSON.parse(e.content)}else{return null}}function tt(){var e=et();if(e){htmx.config=p(htmx.config,e)}}$e(function(){tt();var e=E().body;pe(e);we(e,"load.htmx",{});window.onpopstate=function(){Xe()}});return{onLoad:x,process:pe,on:k,off:D,trigger:we,find:b,findAll:S,closest:A,remove:T,addClass:q,removeClass:N,toggleClass:H,takeClass:X,defineExtension:Ke,removeExtension:Qe,logAll:y,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100,includeIndicatorStyles:true},_:e}}()}); \ 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 t=["get","post","put","delete","patch"];function a(e){if(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 w(e,t){return u(e,t)||u(e,"data-"+t)}function o(e){return e.parentElement}function E(){return document}function l(e,t){if(t(e)){return e}else if(o(e)){return l(o(e),t)}else{return null}}function O(e,t){var r=null;l(e,function(e){return r=w(e,t)});return r}function s(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 n(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}return i}function f(e){var t=r(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return n("<table>"+e+"</table>",1);case"col":return n("<table><colgroup>"+e+"</colgroup></table>",2);case"tr":return n("<table><tbody>"+e+"</tbody></table>",2);case"td":case"th":return n("<table><tbody><tr>"+e+"</tr></tbody></table>",3);default:return n(e,0)}}function i(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function c(e){return i(e,"Function")}function v(e){return i(e,"Object")}function L(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function h(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function C(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function d(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function m(e){return E().body.contains(e)}function g(e){return e.split(/\s+/)}function p(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function e(e){return eval(e)}function x(t){var e=htmx.on("load.htmx",function(e){t(e.detail.elt)});return e}function y(){htmx.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function b(e,t){if(t){return e.querySelector(t)}else{return E().body.querySelector(e)}}function S(e,t){if(t){return e.querySelectorAll(t)}else{return E().body.querySelectorAll(e)}}function T(e,t){if(t){setTimeout(function(){T(e)},t)}else{e.parentElement.removeChild(e)}}function q(e,t,r){if(r){setTimeout(function(){q(e,t)},r)}else{e.classList.add(t)}}function N(e,t,r){if(r){setTimeout(function(){N(e,t)},r)}else{e.classList.remove(t)}}function H(e,t){e.classList.toggle(t)}function X(e,t){C(e.parentElement.children,function(e){N(e,t)});q(e,t)}function A(e,t){do{if(e==null||s(e,t))return e}while(e=e&&o(e))}function R(e,t,r){if(c(t)){return{target:E().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function k(t,r,n){$e(function(){var e=R(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=c(r);return e?r:n}function D(t,r,n){$e(function(){var e=R(t,r,n);e.target.removeEventListener(e.event,e.listener)});return c(r)?r:n}function M(e){var t=l(e,function(e){return w(e,"hx-target")!==null});if(t){var r=w(t,"hx-target");if(r==="this"){return t}else if(r.indexOf("closest ")===0){return A(e,r.substr(8))}else{return E().querySelector(r)}}else{var n=L(e);if(n.boosted){return E().body}else{return e}}}function I(t,r){C(t.attributes,function(e){if(!r.hasAttribute(e.name)){t.removeAttribute(e.name)}});C(r.attributes,function(e){t.setAttribute(e.name,e.value)})}function F(e,n){C(h(e.children),function(e){if(w(e,"hx-swap-oob")==="true"){var t=E().getElementById(e.id);if(t){var r=E().createDocumentFragment();r.appendChild(e);j(t,r,n)}else{e.parentNode.removeChild(e);be(E().body,"oobErrorNoTarget.htmx",{content:e})}}})}function P(n,e,i){C(e.querySelectorAll("[id]"),function(e){var t=n.querySelector(e.tagName+"[id="+e.id+"]");if(t){var r=e.cloneNode();I(e,t);i.tasks.push(function(){I(e,r)})}})}function J(e,t,r,n){P(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE){we(i,"load.htmx",{});pe(i)}}}function j(e,t,r){if(e.tagName==="BODY"){return V(e,t)}else{var n=e.previousSibling;J(o(e),e,t,r);if(n==null){var i=o(e).firstChild}else{var i=n.nextSibling}while(i&&i!=e){r.elts.push(i);i=i.nextSibling}o(e).removeChild(e)}}function U(e,t,r){return J(e,e.firstChild,t,r)}function B(e,t,r){return J(o(e),e,t,r)}function W(e,t,r){return J(e,null,t,r)}function z(e,t,r){return J(o(e),e.nextSibling,t,r)}function V(e,t,r){var n=e.firstChild;J(e,n,t,r);if(n){while(n.nextSibling){e.removeChild(n.nextSibling)}e.removeChild(n)}}function G(e,t){var r=O(e,"hx-select");if(r){var n=E().createDocumentFragment();C(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function Y(e,t,r,n,i){switch(e){case"outerHTML":j(r,n,i);return;case"afterbegin":U(r,n,i);return;case"beforebegin":B(r,n,i);return;case"beforeend":W(r,n,i);return;case"afterend":z(r,n,i);return;default:var o=Ze(t);for(var a=0;a<o.length;a++){var u=o[a];if(u.handleSwap(e,r,n,i)){return}}V(r,n,i)}}function _(e,t,r,n,i){var o=f(n);if(o){F(o,i);o=G(r,o);return Y(e,r,t,o,i)}}function K(e,t){if(t){if(t.indexOf("{")===0){var r=JSON.parse(t);for(var n in r){if(r.hasOwnProperty(n)){var i=r[n];if(!v(i)){i={value:i}}we(e,n,i)}}}else{we(e,t,[])}}}function Q(e){var t=w(e,"hx-trigger");if(t){var r=t.split(",").map(function(e){var t=g(e.trim());var r=t[0];if(!r)return null;if(r==="every")return{trigger:"every",pollInterval:a(t[1])};var n={trigger:r};for(var i=1;i<t.length;i++){var o=t[i].trim();if(o==="changed"){n.changed=true}if(o==="once"){n.once=true}if(o.indexOf("delay:")===0){n.delay=a(o.substr(6))}}return n}).filter(function(e){return e!==null});if(r.length)return r}if(s(e,"form"))return[{trigger:"submit"}];if(s(e,"input, textarea, select"))return[{trigger:"change"}];return[{trigger:"click"}]}function Z(e){L(e).cancelled=true}function $(e,t,r,n){var i=L(e);i.timeout=setTimeout(function(){if(m(e)&&i.cancelled!==true){Ge(e,t,r);$(e,t,w(e,"hx-"+t),n)}},n)}function ee(e){return location.hostname===e.hostname&&u(e,"href")&&u(e,"href").indexOf("#")!==0}function te(t,r,e){if(t.tagName==="A"&&ee(t)||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=u(t,"href")}else{var o=u(t,"method");n=o?o.toLowerCase():"get";i=u(t,"action")}e.forEach(function(e){ie(t,n,i,r,e,true)})}}function re(e){return e.tagName==="FORM"||s(e,'input[type="submit"], button')&&A(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function ne(e,t){return L(e).boosted&&e.tagName==="A"&&t.type==="click"&&t.ctrlKey}function ie(i,o,a,e,u,l){var t=function(e){if(ne(i,e)){return}if(l||re(i)){e.preventDefault()}var t=L(e);var r=L(i);if(!t.handled){t.handled=true;if(u.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(u.changed){if(r.lastValue===i.value){return}else{r.lastValue=i.value}}if(r.delayed){clearTimeout(r.delayed)}var n=function(){Ge(i,o,a,e.target)};if(u.delay){r.delayed=setTimeout(n,u.delay)}else{n()}}};e.trigger=u.trigger;e.eventListener=t;i.addEventListener(u.trigger,t)}function oe(){if(!window["htmxScrollHandler"]){var e=function(){C(E().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){ae(e)})};window["htmxScrollHandler"]=e;window.addEventListener("scroll",e)}}function ae(e){var t=L(e);if(!t.revealed&&d(e)){t.revealed=true;Ge(e,t.verb,t.path)}}function ue(e,t,r){var n=r.split(",");for(var i=0;i<n.length;i++){var o=removeWhiteSpace(n[i]);if(o.indexOf("source:")===0){le(e,o.substr(7))}if(o.indexOf("send:")===0){fe(e,o.substr(5))}}}function le(s,e){var t={protocols:[]};we(s,"initWebSocket.htmx",t);var r=new WebSocket("wss:"+e,t.protocols);r.onerror=function(e){be(s,"wsError.htmx",{error:e,socket:r});se(s)};L(s).webSocket=r;r.addEventListener("message",function(e){if(se(s)){return}var t=e.data;C(Ze(s),function(e){t=e.transformResponse(t,null,s)});var r=Ve(s);var n=f(t);var i=h(n.children);for(var o=0;o<i.length;o++){var a=i[o];if(a.id){var u=E().getElementById(a.id);if(u){var l=E().createDocumentFragment();l.appendChild(a);j(u,n,r)}}}Ne(r.tasks)})}function se(e){if(!m(e)){L(e).webSocket.close();return true}}function fe(i,e){var o=l(i,function(e){return L(e).webSocket!=null});if(o){var a=L(o).webSocket;i.addEventListener(e,function(e){var t=Ue(i,o,null,i);var r=Pe(i,"post");var n=Be(r,i);n["HEADERS"]=t;a.send(JSON.stringify(n));if(re(i)){e.preventDefault()}})}else{be(i,"noWebSocketSourceError.htmx")}}function ce(e){if(!m(e)){L(e).sseEventSource.close();return true}}function ve(e,t,r){var n=r.split(",");for(var i=0;i<n.length;i++){var o=removeWhiteSpace(n[i]);if(o.indexOf("source:")===0){he(e,o.substr(7))}if(o.indexOf("trigger:")&&t.verb){de(e,t.verb,t.path,o.substr(8))}}}function he(t,e){var r={config:{withCredentials:true}};we(t,"initSSE.htmx",r);var n=new EventSource(e,r.config);n.onerror=function(e){be(t,"sseError.htmx",{error:e,source:n});ce(t)};L(t).sseEventSource=n}function de(e,t,r,n){var i=l(e,function(e){return L(e).sseEventSource!=null});if(i){var o=L(i).sseEventSource;var a=function(){if(!ce(o)){if(m(e)){Ge(e,t,r)}else{o.removeEventListener(n,a)}}};L(e).sseListener=a;o.addEventListener(n,a)}else{be(e,"noSSESourceError.htmx")}}function me(e,t,r,n,i){var o=function(){if(!n.loaded){n.loaded=true;Ge(e,t,r)}};if(i){setTimeout(o,i)}else{o()}}function ge(n,i,e){var o=false;C(t,function(t){var r=w(n,"hx-"+t);if(r){o=true;i.path=r;i.verb=t;e.forEach(function(e){if(e.trigger==="revealed"){oe();ae(n)}else if(e.trigger==="load"){me(n,t,r,i,e.delay)}else if(e.pollInterval){i.polling=true;$(n,t,r,e.pollInterval)}else{ie(n,t,r,i,e)}})}});return o}function pe(e){var t=L(e);if(!t.processed){t.processed=true;var r=Q(e);var n=ge(e,t,r);if(!n&&O(e,"hx-boost")==="true"){te(e,t,r)}var i=w(e,"hx-sse");if(i){ve(e,t,i)}var i=w(e,"hx-ws");if(i){ue(e,t,i)}we(e,"processedNode.htmx")}if(e.children){C(e.children,function(e){pe(e)})}}function xe(e,t,r){var n=O(e,"hx-error-url");if(n){var i=new XMLHttpRequest;i.open("POST",n);i.setRequestHeader("Content-Type","application/json;charset=UTF-8");i.send(JSON.stringify({elt:e.id,event:t,detail:r}))}}function ye(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=E().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function be(e,t,r){we(e,t,p({isError:true},r))}function Se(e){return e==="processedNode.htmx"}function we(e,t,r){if(r==null){r={}}r["elt"]=e;var n=ye(t,r);if(htmx.logger&&!Se(t)){htmx.logger(e,t,r)}if(r.isError){xe(e,t,r)}var i=e.dispatchEvent(n);C(Ze(e),function(e){i=i&&e.onEvent(t,n)!==false});return i}var Ee=null;function Oe(){var e=E().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||E().body}function Le(e,t,r,n){var i=JSON.parse(localStorage.getItem("htmx-history-cache"))||[];for(var o=0;o<i.length;o++){if(i[o].url===e){i=i.slice(o,1);break}}i.push({url:e,content:t,title:r,scroll:n});while(i.length>htmx.config.historyCacheSize){i.shift()}localStorage.setItem("htmx-history-cache",JSON.stringify(i))}function Ce(e){var t=JSON.parse(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r<t.length;r++){if(t[r].url===e){return t[r]}}return null}function Te(){var e=Oe();var t=Ee||location.pathname+location.search;we(E().body,"beforeHistorySave.htmx",{path:t,historyElt:e});if(htmx.config.historyEnabled)history.replaceState({},E().title,window.location.href);Le(t,e.innerHTML,E().title,window.scrollY)}function qe(e){if(htmx.config.historyEnabled)history.pushState({},"",e);Ee=e}function Ne(e){C(e,function(e){e.call()})}function He(n){var e=new XMLHttpRequest;var i={path:n,xhr:e};we(E().body,"historyCacheMiss.htmx",i);e.open("GET",n,true);e.onload=function(){if(this.status>=200&&this.status<400){we(E().body,"historyCacheMissLoad.htmx",i);var e=f(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Oe();var r=Ve(t);V(t,e,r);Ne(r.tasks);Ee=n}else{be(E().body,"historyCacheMissLoadError.htmx",i)}};e.send()}function Xe(e){Te(Ee);e=e||location.pathname+location.search;we(E().body,"historyRestore.htmx",{path:e});var t=Ce(e);if(t){var r=f(t.content);var n=Oe();var i=Ve(n);V(n,r,i);Ne(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Ee=e}else{He(e)}}function Ae(e){return O(e,"hx-push-url")==="true"||e.tagName==="A"&&L(e).boosted}function Re(e){De(e,"add")}function ke(e){De(e,"remove")}function De(e,t){var r=O(e,"hx-indicator");if(r){var n=E().querySelectorAll(r)}else{n=[e]}C(n,function(e){e.classList[t].call(e.classList,"htmx-request")})}function Me(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function Ie(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 Fe(t,r,e){if(e==null||Me(t,e)){return}else{t.push(e)}if(Ie(e)){var n=u(e,"name");var i=e.value;if(n!=null&&i!=null){var o=r[n];if(o){if(Array.isArray(o)){o.push(i)}else{r[n]=[o,i]}}else{r[n]=i}}}if(s(e,"form")){var a=e.elements;C(a,function(e){Fe(t,r,e)})}}function Pe(e,t){var r=[];var n={};if(t!=="get"){Fe(r,n,A(e,"form"))}Fe(r,n,e);var i=O(e,"hx-include");if(i){var o=E().querySelectorAll(i);C(o,function(e){Fe(r,n,e)})}return n}function Je(e,t,r){if(e!==""){e+="&"}e+=encodeURIComponent(t)+"="+encodeURIComponent(r);return e}function je(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){C(n,function(e){t=Je(t,r,e)})}else{t=Je(t,r,n)}}}return t}function Ue(e,t,r,n){var i={"X-HX-Request":"true","X-HX-Trigger":u(e,"id"),"X-HX-Trigger-Name":u(e,"name"),"X-HX-Target":w(t,"id"),"X-HX-Current-URL":E().location.href};if(r!==undefined){i["X-HX-Prompt"]=r}if(n){i["X-HX-Event-Target"]=u(n,"id")}if(E().activeElement){i["X-HX-Active-Element"]=u(E().activeElement,"id");i["X-HX-Active-Element-Name"]=u(E().activeElement,"name");if(E().activeElement.value){i["X-HX-Active-Element-Value"]=u(E().activeElement,"value")}}return i}function Be(t,e){var r=O(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){C(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};C(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function We(e){var t=O(e,"hx-swap");var r={swapStyle:htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(t){var n=g(t);if(n.length>0){r["swapStyle"]=n[0];for(var i=1;i<n.length;i++){var o=n[i];if(o.indexOf("swap:")===0){r["swapDelay"]=a(o.substr(5))}if(o.indexOf("settle:")===0){r["settleDelay"]=a(o.substr(7))}}}}return r}function ze(t,r,n){var i=null;C(Ze(r),function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{return je(n)}}function Ve(e){return{tasks:[],elts:[e]}}function Ge(a,e,u,t){var l=M(a);if(l==null){be(a,"targetError.htmx",{target:w(a,"hx-target")});return}var r=L(a);if(r.requestInFlight){return}else{r.requestInFlight=true}var s=function(){r.requestInFlight=false};var n=O(a,"hx-prompt");if(n){var i=prompt(n);if(i===null||!we(a,"prompt.htmx",{prompt:i,target:l}))return s()}var o=O(a,"hx-confirm");if(o){if(!confirm(o))return s()}var f=new XMLHttpRequest;var c=Ue(a,l,i,t);var v=Pe(a,e);var h=Be(v,a);if(e!=="get"){c["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8";if(e!=="post"){c["X-HTTP-Method-Override"]=e.toUpperCase()}}if(u==null||u===""){u=E().location.href}var d={parameters:h,unfilteredParameters:v,headers:c,target:l,verb:e};if(!we(a,"configRequest.htmx",d))return s();var m=u.split("#");var g=m[0];var p=m[1];if(e==="get"){var x=g;var y=Object.keys(h).length!==0;if(y){if(x.indexOf("?")<0){x+="?"}else{x+="&"}x+=je(h);if(p){x+="#"+p}}f.open("GET",x,true)}else{f.open("POST",u,true)}f.overrideMimeType("text/html");for(var b in c){if(c.hasOwnProperty(b)){if(c[b]!==null)f.setRequestHeader(b,c[b])}}var S={xhr:f,target:l};f.onload=function(){try{if(!we(a,"beforeOnLoad.htmx",S))return;K(a,this.getResponseHeader("X-HX-Trigger"));var r=this.getResponseHeader("X-HX-Push");var n=Ae(a)||r;if(this.status>=200&&this.status<400){if(this.status===286){Z(a)}if(this.status!==204){if(!we(a,"beforeSwap.htmx",S))return;var i=this.response;C(Ze(a),function(e){i=e.transformResponse(i,f,a)});if(n){Te()}var o=We(a);l.classList.add("htmx-swapping");var e=function(){try{var e=Ve(l);_(o.swapStyle,l,a,i,e);l.classList.remove("htmx-swapping");C(e.elts,function(e){if(e.classList){e.classList.add("htmx-settling")}});we(a,"afterSwap.htmx",S);if(p){location.hash=p}var t=function(){C(e.tasks,function(e){e.call()});C(e.elts,function(e){if(e.classList){e.classList.remove("htmx-settling")}});if(n){qe(r||u)}we(a,"afterSettle.htmx",S)};if(o.settleDelay>0){setTimeout(t,o.settleDelay)}else{t()}}catch(e){be(a,"swapError.htmx",S);throw e}};if(o.swapDelay>0){setTimeout(e,o.swapDelay)}else{e()}}}else{be(a,"responseError.htmx",S)}}catch(e){S["exception"]=e;be(a,"onLoadError.htmx",S);throw e}finally{ke(a);we(a,"afterRequest.htmx",S);we(a,"afterOnLoad.htmx",S);s()}};f.onerror=function(){ke(a);be(a,"afterRequest.htmx",S);be(a,"sendError.htmx",S);s()};if(!we(a,"beforeRequest.htmx",S))return s();Re(a);f.send(e==="get"?null:ze(f,a,h))}var Ye={};function _e(){return{onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ke(e,t){Ye[e]=p(_e(),t)}function Qe(e){delete Ye[e]}function Ze(e,r){if(e==null){return r}if(r==null){r=[]}var t=w(e,"hx-ext");if(t){C(t.split(","),function(e){e=e.replace(/ /g,"");var t=Ye[e];if(t&&!r.includes(t)){r.push(t)}})}return Ze(o(e),r)}function $e(e){if(E().readyState!=="loading"){e()}else{E().addEventListener("DOMContentLoaded",e)}}(function(){var e=et();if(e===null||e.includeIndicatorStyles!==false){E().head.insertAdjacentHTML("beforeend","<style> .htmx-indicator{opacity:0;transition: opacity 200ms ease-in;} .htmx-request .htmx-indicator{opacity:1} .htmx-request.htmx-indicator{opacity:1} </style>")}})();function et(){var e=E().querySelector('meta[name="htmx-config"]');if(e){return JSON.parse(e.content)}else{return null}}function tt(){var e=et();if(e){htmx.config=p(htmx.config,e)}}$e(function(){tt();var e=E().body;pe(e);we(e,"load.htmx",{});window.onpopstate=function(){Xe()}});return{onLoad:x,process:pe,on:k,off:D,trigger:we,find:b,findAll:S,closest:A,remove:T,addClass:q,removeClass:N,toggleClass:H,takeClass:X,defineExtension:Ke,removeExtension:Qe,logAll:y,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100,includeIndicatorStyles:true},parseInterval:a,_:e}}()}); \ No newline at end of file
diff --git a/dist/htmx.min.js.gz b/dist/htmx.min.js.gz
index df0200e3..a398951c 100644
--- a/dist/htmx.min.js.gz
+++ b/dist/htmx.min.js.gz
Binary files differ
diff --git a/src/ext/class-tools.js b/src/ext/class-tools.js
index 092a5778..fa1493db 100644
--- a/src/ext/class-tools.js
+++ b/src/ext/class-tools.js
@@ -14,7 +14,7 @@
if (classDef.indexOf(":") > 0) {
var splitCssClass = classDef.split(':');
cssClass = splitCssClass[0];
- delay = parseInterval(splitCssClass[1]);
+ delay = htmx.parseInterval(splitCssClass[1]);
} else {
cssClass = classDef;
delay = 100;
diff --git a/src/htmx.js b/src/htmx.js
index 33ac0dbe..55e8df64 100644
--- a/src/htmx.js
+++ b/src/htmx.js
@@ -1522,6 +1522,7 @@ return (function () {
defaultSettleDelay:100,
includeIndicatorStyles:true
},
+ parseInterval:parseInterval,
_:internalEval
}
}
diff --git a/www/docs.md b/www/docs.md
index a154cd34..72add9d6 100644
--- a/www/docs.md
+++ b/www/docs.md
@@ -24,6 +24,7 @@ title: </> htmx - high power tools for html
* [websockets & SSE](#web-sockets-and-sse)
* [history](#history)
* [requests & responses](#requests)
+* [animations](#animations)
* [extensions](#extensions)
* [events & logging](#events)
* [configuring](#config)
@@ -495,6 +496,13 @@ The order of operations in a htmx request are:
You can use the `htmx-swapping` and `htmx-settling` classes to create
[CSS transitions](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions) between pages.
+## <a name="animations"></a> [Animations](#animations)
+
+Htmx allows you to use [CSS transitions](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions)
+in many situations using only HTML and CSS.
+
+Please see the [Animation Guide](/examples/animations) for more details on the options available.
+
## <a name="extensions"></a> [Extensions](#extensions)
Htmx has an extension mechanism that allows you to customize the libraries' behavior. Extensions [are
diff --git a/www/examples.md b/www/examples.md
index 385be91a..640993d4 100644
--- a/www/examples.md
+++ b/www/examples.md
@@ -22,3 +22,4 @@ You can copy and paste them and then adjust them for your needs.
| [Progress Bar](/examples/progress-bar) | Demonstrates a job-runner like progress bar
| [Value Select](/examples/value-select) | Demonstrates making the values of a select dependent on another select
| [Dialogs](/examples/dialogs) | Demonstrates the prompt and confirm dialogs
+| [Animations](/examples/animations) | Demonstrates various animation techniques
diff --git a/www/examples/animations.md b/www/examples/animations.md
new file mode 100644
index 00000000..84249e31
--- /dev/null
+++ b/www/examples/animations.md
@@ -0,0 +1,179 @@
+---
+layout: demo_layout.njk
+---
+
+## Animations
+
+Htmx is designed to allow you to use [CSS transitions](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions)
+to add smooth animations and transitions to your web page using only CSS and HTML. Below are a few examples of
+various animation techniques.
+
+### Swap Fade Out
+
+If you want to fade out an element that is going to be removed when the request ends, you want to take advantage
+of the `htmx-swapping` class with some CSS and extend the swap phase to be long enough for your animation to
+complete. This can be done like so:
+
+```html
+<style>
+.fade-me-out.htmx-swapping {
+ opacity: 0;
+ transition: opacity 1s ease-out;
+}
+</style>
+<button class="fade-me-out"
+ hx-delete="/fade_out_demo"
+ hx-swap="outerHTML swap:1s">
+ Fade Me Out
+</button>
+```
+
+#### Demo
+
+<style>
+.fade-me-out.htmx-swapping {
+ opacity: 0;
+ transition: opacity 1s ease-out;
+}
+</style>
+
+<button class="fade-me-out"
+ hx-delete="/fade_out_demo"
+ hx-swap="outerHTML swap:1s">
+ Delete Me
+</button>
+
+<script>
+ onDelete("/fade_out_demo", function () {return ""});
+</script>
+
+### Settle Fade In
+
+Building on the last example, we can fade in the new content by using the `htmx-settling` class during the settle
+phase.
+
+```html
+<style>
+#fade-me-in.htmx-settling {
+ opacity: 0;
+}
+#fade-me-in {
+ opacity: 1;
+ transition: opacity 1s ease-out;
+}
+</style>
+<button class="fade-me-in"
+ hx-post="/fade_in_demo"
+ hx-swap="outerHTML settle:1s">
+ Fade Me In
+</button>
+```
+
+#### Demo
+
+<style>
+#fade-me-in.htmx-settling {
+ opacity: 0;
+}
+#fade-me-in {
+ opacity: 1;
+ transition: opacity 1s ease-out;
+}
+</style>
+
+<button id="fade-me-in"
+ hx-post="/fade_me_in"
+ hx-swap="outerHTML settle:1s">
+ Fade Me In
+</button>
+
+<script>
+ onPost("/fade_me_in", function () {return "<button id=\"fade-me-in\"\n"+
+ " hx-post=\"/fade_me_in\"\n"+
+ " hx-swap=\"outerHTML settle:1s\">\n"+
+ " Fade Me In\n"+
+ "</button>"});
+</script>
+
+### Request In Flight Animation
+
+You can also take advantage of the `htmx-request` class, which is applied to the element that triggers a request. Below
+is a form that on submit will change its look to indicate that a request is being processed:
+
+```html
+<style>
+ form.htmx-request {
+ opacity: .5;
+ transition: opacity 300ms linear;
+ }
+</style>
+<form hx-post="/name">
+<label>Name:</label><input name="name"><br/>
+<button>Submit</button>
+</form>
+```
+
+#### Demo
+
+<style>
+ form.htmx-request {
+ opacity: .5;
+ transition: opacity 300ms linear;
+ }
+</style>
+
+<form hx-post="/name">
+<label>Name:</label><input name="name"><br/>
+<button>Submit</button>
+</form>
+
+<script>
+ onPost("/name", function(){ return "Submitted!"; });
+</script>
+
+### Using the HTMX `class-tools` Extension
+
+Many interesting animations can be created by using the [`class-tools`](/extensions/class-tools) extension.
+
+Here is an example that toggles the opacity of a div. Note that we set the toggle time to be a bit longer than
+the transition time. This avoids flickering that can happen if the transition is interrupted by a class change.
+
+```html
+<style>
+.demo.faded {
+ opacity:.3;
+}
+.demo {
+ opacity:1;
+ transition: opacity ease-in 900ms;
+}
+</style>
+<div class="demo" classes="toggle faded:1s">Toggle Demo</div>
+```
+
+#### Demo
+
+<style>
+.demo.faded {
+ opacity:.3;
+}
+.demo {
+ opacity:1;
+ transition: opacity ease-in 900ms;
+}
+</style>
+<div class="demo" classes="toggle faded:1s">Toggle Demo</div>
+
+### Swap/Settle Animations
+
+Htmx has a swap-and-settle strategy that allows you to write CSS transitions between attribute changes on elements with
+stable ids between requests. All you need to do is make sure that ids line up between requests and you should be
+able to smoothly animate changes to attributes despite returning new content.
+
+The best demonstration of this is the [Progress Bar](/examples/progress-bar) demo, which shows the `length` property
+being updated smoothly.
+
+
+#### Conclusion
+
+You can use the tools above to create quite a few interesting and pleasing effects with plain old HTML while using htmx. \ No newline at end of file
diff --git a/www/js/class-tools.js b/www/js/class-tools.js
index 092a5778..fa1493db 100644
--- a/www/js/class-tools.js
+++ b/www/js/class-tools.js
@@ -14,7 +14,7 @@
if (classDef.indexOf(":") > 0) {
var splitCssClass = classDef.split(':');
cssClass = splitCssClass[0];
- delay = parseInterval(splitCssClass[1]);
+ delay = htmx.parseInterval(splitCssClass[1]);
} else {
cssClass = classDef;
delay = 100;
diff --git a/www/js/htmx.js b/www/js/htmx.js
index de0ac11a..55e8df64 100644
--- a/www/js/htmx.js
+++ b/www/js/htmx.js
@@ -1386,7 +1386,7 @@ return (function () {
throw e;
} finally {
removeRequestIndicatorClasses(elt);
- triggerErrorEvent(elt, 'afterRequest.htmx', eventDetail);
+ triggerEvent(elt, 'afterRequest.htmx', eventDetail);
triggerEvent(elt, 'afterOnLoad.htmx', eventDetail);
endRequestLock();
}
@@ -1522,6 +1522,7 @@ return (function () {
defaultSettleDelay:100,
includeIndicatorStyles:true
},
+ parseInterval:parseInterval,
_:internalEval
}
}
diff --git a/www/test/0.0.4/src/ext/class-tools.js b/www/test/0.0.4/src/ext/class-tools.js
index 092a5778..fa1493db 100644
--- a/www/test/0.0.4/src/ext/class-tools.js
+++ b/www/test/0.0.4/src/ext/class-tools.js
@@ -14,7 +14,7 @@
if (classDef.indexOf(":") > 0) {
var splitCssClass = classDef.split(':');
cssClass = splitCssClass[0];
- delay = parseInterval(splitCssClass[1]);
+ delay = htmx.parseInterval(splitCssClass[1]);
} else {
cssClass = classDef;
delay = 100;
diff --git a/www/test/0.0.4/src/htmx.js b/www/test/0.0.4/src/htmx.js
index de0ac11a..55e8df64 100644
--- a/www/test/0.0.4/src/htmx.js
+++ b/www/test/0.0.4/src/htmx.js
@@ -1386,7 +1386,7 @@ return (function () {
throw e;
} finally {
removeRequestIndicatorClasses(elt);
- triggerErrorEvent(elt, 'afterRequest.htmx', eventDetail);
+ triggerEvent(elt, 'afterRequest.htmx', eventDetail);
triggerEvent(elt, 'afterOnLoad.htmx', eventDetail);
endRequestLock();
}
@@ -1522,6 +1522,7 @@ return (function () {
defaultSettleDelay:100,
includeIndicatorStyles:true
},
+ parseInterval:parseInterval,
_:internalEval
}
}