htmx.org 4.0.0-alpha1 → 4.0.0-alpha3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,81 @@
1
+ (() =>{
2
+
3
+ // TODO - this needs to be updated to use the new internal API
4
+
5
+ function normalizeSwapStyle(style) {
6
+ return style === 'before' ? 'beforebegin' :
7
+ style === 'after' ? 'afterend' :
8
+ style === 'prepend' ? 'afterbegin' :
9
+ style === 'append' ? 'beforeend' : style;
10
+ }
11
+
12
+ function insertOptimisticContent(ctx) {
13
+ // TODO - handle htmx.config.prefix
14
+ ctx.optimistic = ctx.sourceElement.getAttribute("hx-optimistic");
15
+ if (!ctx.optimistic) {
16
+ return
17
+ }
18
+
19
+ // TODO - handle inheritance?
20
+ let sourceElt = document.querySelector(ctx.optimistic);
21
+ if (!sourceElt) return;
22
+
23
+ let target = ctx.target;
24
+ if (!target) return;
25
+
26
+ if (typeof target === 'string') {
27
+ target = document.querySelector(target);
28
+ }
29
+
30
+ // Create optimistic div with reset styling
31
+ let optimisticDiv = document.createElement('div');
32
+ optimisticDiv.style.cssText = 'all: initial';
33
+ optimisticDiv.innerHTML = sourceElt.innerHTML;
34
+
35
+ let swapStyle = normalizeSwapStyle(ctx.swap);
36
+ ctx.optHidden = [];
37
+
38
+ if (swapStyle === 'innerHTML') {
39
+ // Hide children of target
40
+ for (let child of target.children) {
41
+ child.style.display = 'none';
42
+ ctx.optHidden.push(child)
43
+ }
44
+ target.appendChild(optimisticDiv);
45
+ ctx.optimisticDiv = optimisticDiv;
46
+ } else if (['beforebegin', 'afterbegin', 'beforeend', 'afterend'].includes(swapStyle)) {
47
+ target.insertAdjacentElement(swapStyle, optimisticDiv);
48
+ ctx.optimisticDiv = optimisticDiv;
49
+ } else {
50
+ // Assume outerHTML-like behavior, Hide target and insert div after it
51
+ target.style.display = 'none';
52
+ ctx.optHidden.push(target)
53
+ target.after(optimisticDiv)
54
+ ctx.optimisticDiv = optimisticDiv;
55
+ }
56
+ }
57
+
58
+ function removeOptimisticContent(ctx) {
59
+ if (!ctx.optimisticDiv) return;
60
+
61
+ // Remove optimistic div
62
+ ctx.optimisticDiv.remove();
63
+
64
+ // Unhide any hidden elements
65
+ for (let elt of ctx.optHidden) {
66
+ elt.style.display = '';
67
+ }
68
+ }
69
+
70
+ htmx.defineExtension('hx-optimistic', {
71
+ htmx_before_request : (elt, detail) => {
72
+ insertOptimisticContent(detail.ctx);
73
+ },
74
+ htmx_error : (elt, detail) => {
75
+ removeOptimisticContent(detail.ctx)
76
+ },
77
+ htmx_before_swap : (elt, detail) => {
78
+ removeOptimisticContent(detail.ctx)
79
+ }
80
+ });
81
+ })();
@@ -0,0 +1 @@
1
+ (()=>{function e(e){if(e.optimisticDiv){e.optimisticDiv.remove();for(let t of e.optHidden)t.style.display=""}}htmx.defineExtension("hx-optimistic",{htmx_before_request:(e,t)=>{!function(e){if(e.optimistic=e.sourceElement.getAttribute("hx-optimistic"),!e.optimistic)return;let t=document.querySelector(e.optimistic);if(!t)return;let i=e.target;if(!i)return;"string"==typeof i&&(i=document.querySelector(i));let n=document.createElement("div");n.style.cssText="all: initial",n.innerHTML=t.innerHTML;let r="before"===(o=e.swap)?"beforebegin":"after"===o?"afterend":"prepend"===o?"afterbegin":"append"===o?"beforeend":o;var o;if(e.optHidden=[],"innerHTML"===r){for(let t of i.children)t.style.display="none",e.optHidden.push(t);i.appendChild(n),e.optimisticDiv=n}else["beforebegin","afterbegin","beforeend","afterend"].includes(r)?(i.insertAdjacentElement(r,n),e.optimisticDiv=n):(i.style.display="none",e.optHidden.push(i),i.after(n),e.optimisticDiv=n)}(t.ctx)},htmx_error:(t,i)=>{e(i.ctx)},htmx_before_swap:(t,i)=>{e(i.ctx)}})})();
@@ -0,0 +1 @@
1
+ {"version":3,"names":["removeOptimisticContent","ctx","optimisticDiv","remove","elt","optHidden","style","display","htmx","defineExtension","htmx_before_request","detail","optimistic","sourceElement","getAttribute","sourceElt","document","querySelector","target","createElement","cssText","innerHTML","swapStyle","swap","child","children","push","appendChild","includes","insertAdjacentElement","after","insertOptimisticContent","htmx_error","htmx_before_swap"],"sources":["dist/ext/hx-optimistic.js"],"mappings":"AAAA,MAyDI,SAASA,EAAwBC,GAC7B,GAAKA,EAAIC,cAAT,CAGAD,EAAIC,cAAcC,SAGlB,IAAK,IAAIC,KAAOH,EAAII,UAChBD,EAAIE,MAAMC,QAAU,EAPM,CASlC,CAEAC,KAAKC,gBAAgB,gBAAiB,CAClCC,oBAAsB,CAACN,EAAKO,MA3DhC,SAAiCV,GAG7B,GADAA,EAAIW,WAAaX,EAAIY,cAAcC,aAAa,kBAC3Cb,EAAIW,WACL,OAIJ,IAAIG,EAAYC,SAASC,cAAchB,EAAIW,YAC3C,IAAKG,EAAW,OAEhB,IAAIG,EAASjB,EAAIiB,OACjB,IAAKA,EAAQ,OAES,iBAAXA,IACPA,EAASF,SAASC,cAAcC,IAIpC,IAAIhB,EAAgBc,SAASG,cAAc,OAC3CjB,EAAcI,MAAMc,QAAU,eAC9BlB,EAAcmB,UAAYN,EAAUM,UAEpC,IAAIC,EA7Ba,YADOhB,EA8BWL,EAAIsB,MA7BX,cACd,UAAVjB,EAAoB,WACN,YAAVA,EAAsB,aACR,WAAVA,EAAqB,YAAcA,EAJnD,IAA4BA,EAiCxB,GAFAL,EAAII,UAAY,GAEE,cAAdiB,EAA2B,CAE3B,IAAK,IAAIE,KAASN,EAAOO,SACrBD,EAAMlB,MAAMC,QAAU,OACtBN,EAAII,UAAUqB,KAAKF,GAEvBN,EAAOS,YAAYzB,GACnBD,EAAIC,cAAgBA,CACxB,KAAW,CAAC,cAAe,aAAc,YAAa,YAAY0B,SAASN,IACvEJ,EAAOW,sBAAsBP,EAAWpB,GACxCD,EAAIC,cAAgBA,IAGpBgB,EAAOZ,MAAMC,QAAU,OACvBN,EAAII,UAAUqB,KAAKR,GACnBA,EAAOY,MAAM5B,GACbD,EAAIC,cAAgBA,EAE5B,CAgBQ6B,CAAwBpB,EAAOV,MAEnC+B,WAAa,CAAC5B,EAAKO,KACfX,EAAwBW,EAAOV,MAEnCgC,iBAAmB,CAAC7B,EAAKO,KACrBX,EAAwBW,EAAOV,OAG1C,EAhFD","ignoreList":[]}
@@ -0,0 +1,83 @@
1
+ (()=>{
2
+ let api;
3
+
4
+ function initializePreload(elt) {
5
+ let preloadSpec = api.attributeValue(elt, "hx-preload");
6
+ if (!preloadSpec && !elt._htmx?.boosted) return;
7
+
8
+ let eventName;
9
+ let timeout;
10
+ if (preloadSpec) {
11
+ let specs = api.parseTriggerSpecs(preloadSpec);
12
+ if (specs.length === 0) return;
13
+ let spec = specs[0];
14
+ eventName = spec.name;
15
+ timeout = spec.timeout ? htmx.parseInterval(spec.timeout) : 5000;
16
+ } else {
17
+ eventName = htmx.config?.preload?.boostEvent || "mousedown"
18
+ timeout = htmx.config?.preload?.boostTimeout ? htmx.parseInterval(htmx.config?.preload?.boostTimeout) : 5000;
19
+ }
20
+
21
+ let preloadListener = async (evt) => {
22
+ let {method} = api.determineMethodAndAction(elt, evt);
23
+ if (method !== 'GET') return;
24
+
25
+ if (elt._htmx?.preload) return;
26
+
27
+ let ctx = api.createRequestContext(elt, evt);
28
+ let form = elt.form || elt.closest("form");
29
+ let body = api.collectFormData(elt, form, evt.submitter);
30
+ api.handleHxVals(elt, body);
31
+
32
+ let action = ctx.request.action.replace?.(/#.*$/, '');
33
+
34
+
35
+ let params = new URLSearchParams(body);
36
+ if (params.size) action += (/\?/.test(action) ? "&" : "?") + params;
37
+
38
+ elt._htmx.preload = {
39
+ prefetch: fetch(action, ctx.request),
40
+ action: action,
41
+ expiresAt: Date.now() + timeout
42
+ };
43
+
44
+ try {
45
+ await elt._htmx.preload.prefetch;
46
+ } catch (error) {
47
+ delete elt._htmx.preload;
48
+ }
49
+ };
50
+ elt.addEventListener(eventName, preloadListener);
51
+ elt._htmx.preloadListener = preloadListener;
52
+ elt._htmx.preloadEvent = eventName;
53
+ }
54
+
55
+ htmx.defineExtension('preload', {
56
+ init: (internalAPI) => {
57
+ api = internalAPI;
58
+ },
59
+
60
+ htmx_after_init: (elt) => {
61
+ initializePreload(elt);
62
+ },
63
+
64
+ htmx_before_request: (elt, detail) => {
65
+ let {ctx} = detail;
66
+ if (elt._htmx?.preload &&
67
+ elt._htmx.preload.action === ctx.request.action &&
68
+ Date.now() < elt._htmx.preload.expiresAt) {
69
+ let prefetch = elt._htmx.preload.prefetch;
70
+ ctx.fetch = () => prefetch;
71
+ delete elt._htmx.preload;
72
+ } else {
73
+ if (elt._htmx) delete elt._htmx.preload;
74
+ }
75
+ },
76
+
77
+ htmx_before_cleanup: (elt) => {
78
+ if (elt._htmx?.preloadListener) {
79
+ elt.removeEventListener(elt._htmx.preloadEvent, elt._htmx.preloadListener);
80
+ }
81
+ }
82
+ });
83
+ })()
@@ -0,0 +1 @@
1
+ (()=>{let e;htmx.defineExtension("preload",{init:t=>{e=t},htmx_after_init:t=>{!function(t){let r,o,a=e.attributeValue(t,"hx-preload");if(!a&&!t._htmx?.boosted)return;if(a){let t=e.parseTriggerSpecs(a);if(0===t.length)return;let l=t[0];r=l.name,o=l.timeout?htmx.parseInterval(l.timeout):5e3}else r=htmx.config?.preload?.boostEvent||"mousedown",o=htmx.config?.preload?.boostTimeout?htmx.parseInterval(htmx.config?.preload?.boostTimeout):5e3;let l=async r=>{let{method:a}=e.determineMethodAndAction(t,r);if("GET"!==a)return;if(t._htmx?.preload)return;let l=e.createRequestContext(t,r),n=t.form||t.closest("form"),m=e.collectFormData(t,n,r.submitter);e.handleHxVals(t,m);let h=l.request.action.replace?.(/#.*$/,""),i=new URLSearchParams(m);i.size&&(h+=(/\?/.test(h)?"&":"?")+i),t._htmx.preload={prefetch:fetch(h,l.request),action:h,expiresAt:Date.now()+o};try{await t._htmx.preload.prefetch}catch(e){delete t._htmx.preload}};t.addEventListener(r,l),t._htmx.preloadListener=l,t._htmx.preloadEvent=r}(t)},htmx_before_request:(e,t)=>{let{ctx:r}=t;if(e._htmx?.preload&&e._htmx.preload.action===r.request.action&&Date.now()<e._htmx.preload.expiresAt){let t=e._htmx.preload.prefetch;r.fetch=()=>t,delete e._htmx.preload}else e._htmx&&delete e._htmx.preload},htmx_before_cleanup:e=>{e._htmx?.preloadListener&&e.removeEventListener(e._htmx.preloadEvent,e._htmx.preloadListener)}})})();
@@ -0,0 +1 @@
1
+ {"version":3,"names":["api","htmx","defineExtension","init","internalAPI","htmx_after_init","elt","eventName","timeout","preloadSpec","attributeValue","_htmx","boosted","specs","parseTriggerSpecs","length","spec","name","parseInterval","config","preload","boostEvent","boostTimeout","preloadListener","async","evt","method","determineMethodAndAction","ctx","createRequestContext","form","closest","body","collectFormData","submitter","handleHxVals","action","request","replace","params","URLSearchParams","size","test","prefetch","fetch","expiresAt","Date","now","error","addEventListener","preloadEvent","initializePreload","htmx_before_request","detail","htmx_before_cleanup","removeEventListener"],"sources":["dist/ext/hx-preload.js"],"mappings":"AAAA,MACI,IAAIA,EAqDJC,KAAKC,gBAAgB,UAAW,CAC5BC,KAAOC,IACHJ,EAAMI,GAGVC,gBAAkBC,KAxDtB,SAA2BA,GACvB,IAGIC,EACAC,EAJAC,EAAcT,EAAIU,eAAeJ,EAAK,cAC1C,IAAKG,IAAgBH,EAAIK,OAAOC,QAAS,OAIzC,GAAIH,EAAa,CACb,IAAII,EAAQb,EAAIc,kBAAkBL,GAClC,GAAqB,IAAjBI,EAAME,OAAc,OACxB,IAAIC,EAAOH,EAAM,GACjBN,EAAYS,EAAKC,KACjBT,EAAUQ,EAAKR,QAAUP,KAAKiB,cAAcF,EAAKR,SAAW,GAChE,MACID,EAAYN,KAAKkB,QAAQC,SAASC,YAAc,YAChDb,EAAUP,KAAKkB,QAAQC,SAASE,aAAerB,KAAKiB,cAAcjB,KAAKkB,QAAQC,SAASE,cAAgB,IAG5G,IAAIC,EAAkBC,MAAOC,IACzB,IAAIC,OAACA,GAAU1B,EAAI2B,yBAAyBrB,EAAKmB,GACjD,GAAe,QAAXC,EAAkB,OAEtB,GAAIpB,EAAIK,OAAOS,QAAS,OAExB,IAAIQ,EAAM5B,EAAI6B,qBAAqBvB,EAAKmB,GACpCK,EAAOxB,EAAIwB,MAAQxB,EAAIyB,QAAQ,QAC/BC,EAAOhC,EAAIiC,gBAAgB3B,EAAKwB,EAAML,EAAIS,WAC9ClC,EAAImC,aAAa7B,EAAK0B,GAEtB,IAAII,EAASR,EAAIS,QAAQD,OAAOE,UAAU,OAAQ,IAG9CC,EAAS,IAAIC,gBAAgBR,GAC7BO,EAAOE,OAAML,IAAW,KAAKM,KAAKN,GAAU,IAAM,KAAOG,GAE7DjC,EAAIK,MAAMS,QAAU,CAChBuB,SAAUC,MAAMR,EAAQR,EAAIS,SAC5BD,OAAQA,EACRS,UAAWC,KAAKC,MAAQvC,GAG5B,UACUF,EAAIK,MAAMS,QAAQuB,QAC5B,CAAE,MAAOK,UACE1C,EAAIK,MAAMS,OACrB,GAEJd,EAAI2C,iBAAiB1C,EAAWgB,GAChCjB,EAAIK,MAAMY,gBAAkBA,EAC5BjB,EAAIK,MAAMuC,aAAe3C,CAC7B,CAQQ4C,CAAkB7C,IAGtB8C,oBAAqB,CAAC9C,EAAK+C,KACvB,IAAIzB,IAACA,GAAOyB,EACZ,GAAI/C,EAAIK,OAAOS,SACXd,EAAIK,MAAMS,QAAQgB,SAAWR,EAAIS,QAAQD,QACzCU,KAAKC,MAAQzC,EAAIK,MAAMS,QAAQyB,UAAW,CAC1C,IAAIF,EAAWrC,EAAIK,MAAMS,QAAQuB,SACjCf,EAAIgB,MAAQ,IAAMD,SACXrC,EAAIK,MAAMS,OACrB,MACQd,EAAIK,cAAcL,EAAIK,MAAMS,SAIxCkC,oBAAsBhD,IACdA,EAAIK,OAAOY,iBACXjB,EAAIiD,oBAAoBjD,EAAIK,MAAMuC,aAAc5C,EAAIK,MAAMY,mBAIzE,EAlFD","ignoreList":[]}