... | ... |
@@ -83,9 +83,12 @@ |
83 | 83 |
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" |
84 | 84 |
}, |
85 | 85 |
"node_modules/function-bind": { |
86 |
- "version": "1.1.1", |
|
87 |
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", |
|
88 |
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" |
|
86 |
+ "version": "1.1.2", |
|
87 |
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", |
|
88 |
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", |
|
89 |
+ "funding": { |
|
90 |
+ "url": "https://github.com/sponsors/ljharb" |
|
91 |
+ } |
|
89 | 92 |
}, |
90 | 93 |
"node_modules/gently-copy": { |
91 | 94 |
"version": "3.2.0", |
... | ... |
@@ -118,17 +121,6 @@ |
118 | 121 |
"url": "https://github.com/sponsors/isaacs" |
119 | 122 |
} |
120 | 123 |
}, |
121 |
- "node_modules/has": { |
|
122 |
- "version": "1.0.3", |
|
123 |
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", |
|
124 |
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", |
|
125 |
- "dependencies": { |
|
126 |
- "function-bind": "^1.1.1" |
|
127 |
- }, |
|
128 |
- "engines": { |
|
129 |
- "node": ">= 0.4.0" |
|
130 |
- } |
|
131 |
- }, |
|
132 | 124 |
"node_modules/has-flag": { |
133 | 125 |
"version": "3.0.0", |
134 | 126 |
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", |
... | ... |
@@ -137,10 +129,21 @@ |
137 | 129 |
"node": ">=4" |
138 | 130 |
} |
139 | 131 |
}, |
132 |
+ "node_modules/hasown": { |
|
133 |
+ "version": "2.0.1", |
|
134 |
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", |
|
135 |
+ "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", |
|
136 |
+ "dependencies": { |
|
137 |
+ "function-bind": "^1.1.2" |
|
138 |
+ }, |
|
139 |
+ "engines": { |
|
140 |
+ "node": ">= 0.4" |
|
141 |
+ } |
|
142 |
+ }, |
|
140 | 143 |
"node_modules/htmx.org": { |
141 |
- "version": "1.9.2", |
|
142 |
- "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.2.tgz", |
|
143 |
- "integrity": "sha512-ZGbucKcalQyXdGUl+4Zt3xdRDPmNy70yNhMyDG1eDYUm/ImxmSo2rhIBDa53XitrAVhA+/CGgry+wJ1SO77wrA==" |
|
144 |
+ "version": "1.9.10", |
|
145 |
+ "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.10.tgz", |
|
146 |
+ "integrity": "sha512-UgchasltTCrTuU2DQLom3ohHrBvwr7OqpwyAVJ9VxtNBng4XKkVsqrv0Qr3srqvM9ZNI3f1MmvVQQqK7KW/bTA==" |
|
144 | 147 |
}, |
145 | 148 |
"node_modules/inflight": { |
146 | 149 |
"version": "1.0.6", |
... | ... |
@@ -165,11 +168,11 @@ |
165 | 168 |
} |
166 | 169 |
}, |
167 | 170 |
"node_modules/is-core-module": { |
168 |
- "version": "2.12.1", |
|
169 |
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", |
|
170 |
- "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", |
|
171 |
+ "version": "2.13.1", |
|
172 |
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", |
|
173 |
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", |
|
171 | 174 |
"dependencies": { |
172 |
- "has": "^1.0.3" |
|
175 |
+ "hasown": "^2.0.0" |
|
173 | 176 |
}, |
174 | 177 |
"funding": { |
175 | 178 |
"url": "https://github.com/sponsors/ljharb" |
... | ... |
@@ -219,11 +222,11 @@ |
219 | 222 |
} |
220 | 223 |
}, |
221 | 224 |
"node_modules/resolve": { |
222 |
- "version": "1.22.2", |
|
223 |
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", |
|
224 |
- "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", |
|
225 |
+ "version": "1.22.8", |
|
226 |
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", |
|
227 |
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", |
|
225 | 228 |
"dependencies": { |
226 |
- "is-core-module": "^2.11.0", |
|
229 |
+ "is-core-module": "^2.13.0", |
|
227 | 230 |
"path-parse": "^1.0.7", |
228 | 231 |
"supports-preserve-symlinks-flag": "^1.0.0" |
229 | 232 |
}, |
... | ... |
@@ -13,11 +13,42 @@ htmx.defineExtension('client-side-templates', { |
13 | 13 |
} |
14 | 14 |
} |
15 | 15 |
|
16 |
+ var mustacheArrayTemplate = htmx.closest(elt, "[mustache-array-template]"); |
|
17 |
+ if (mustacheArrayTemplate) { |
|
18 |
+ var data = JSON.parse(text); |
|
19 |
+ var templateId = mustacheArrayTemplate.getAttribute('mustache-array-template'); |
|
20 |
+ var template = htmx.find("#" + templateId); |
|
21 |
+ if (template) { |
|
22 |
+ return Mustache.render(template.innerHTML, {"data": data }); |
|
23 |
+ } else { |
|
24 |
+ throw "Unknown mustache template: " + templateId; |
|
25 |
+ } |
|
26 |
+ } |
|
27 |
+ |
|
16 | 28 |
var handlebarsTemplate = htmx.closest(elt, "[handlebars-template]"); |
17 | 29 |
if (handlebarsTemplate) { |
18 | 30 |
var data = JSON.parse(text); |
19 |
- var templateName = handlebarsTemplate.getAttribute('handlebars-template'); |
|
20 |
- return Handlebars.partials[templateName](data); |
|
31 |
+ var templateId = handlebarsTemplate.getAttribute('handlebars-template'); |
|
32 |
+ var templateElement = htmx.find('#' + templateId).innerHTML; |
|
33 |
+ var renderTemplate = Handlebars.compile(templateElement); |
|
34 |
+ if (renderTemplate) { |
|
35 |
+ return renderTemplate(data); |
|
36 |
+ } else { |
|
37 |
+ throw "Unknown handlebars template: " + templateId; |
|
38 |
+ } |
|
39 |
+ } |
|
40 |
+ |
|
41 |
+ var handlebarsArrayTemplate = htmx.closest(elt, "[handlebars-array-template]"); |
|
42 |
+ if (handlebarsArrayTemplate) { |
|
43 |
+ var data = JSON.parse(text); |
|
44 |
+ var templateId = handlebarsArrayTemplate.getAttribute('handlebars-array-template'); |
|
45 |
+ var templateElement = htmx.find('#' + templateId).innerHTML; |
|
46 |
+ var renderTemplate = Handlebars.compile(templateElement); |
|
47 |
+ if (renderTemplate) { |
|
48 |
+ return renderTemplate(data); |
|
49 |
+ } else { |
|
50 |
+ throw "Unknown handlebars template: " + templateId; |
|
51 |
+ } |
|
21 | 52 |
} |
22 | 53 |
|
23 | 54 |
var nunjucksTemplate = htmx.closest(elt, "[nunjucks-template]"); |
... | ... |
@@ -30,8 +61,36 @@ htmx.defineExtension('client-side-templates', { |
30 | 61 |
} else { |
31 | 62 |
return nunjucks.render(templateName, data); |
32 | 63 |
} |
33 |
- } |
|
64 |
+ } |
|
34 | 65 |
|
66 |
+ var xsltTemplate = htmx.closest(elt, "[xslt-template]"); |
|
67 |
+ if (xsltTemplate) { |
|
68 |
+ var templateId = xsltTemplate.getAttribute('xslt-template'); |
|
69 |
+ var template = htmx.find("#" + templateId); |
|
70 |
+ if (template) { |
|
71 |
+ var content = template.innerHTML ? new DOMParser().parseFromString(template.innerHTML, 'application/xml') |
|
72 |
+ : template.contentDocument; |
|
73 |
+ var processor = new XSLTProcessor(); |
|
74 |
+ processor.importStylesheet(content); |
|
75 |
+ var data = new DOMParser().parseFromString(text, "application/xml"); |
|
76 |
+ var frag = processor.transformToFragment(data, document); |
|
77 |
+ return new XMLSerializer().serializeToString(frag); |
|
78 |
+ } else { |
|
79 |
+ throw "Unknown XSLT template: " + templateId; |
|
80 |
+ } |
|
81 |
+ } |
|
82 |
+ |
|
83 |
+ var nunjucksArrayTemplate = htmx.closest(elt, "[nunjucks-array-template]"); |
|
84 |
+ if (nunjucksArrayTemplate) { |
|
85 |
+ var data = JSON.parse(text); |
|
86 |
+ var templateName = nunjucksArrayTemplate.getAttribute('nunjucks-array-template'); |
|
87 |
+ var template = htmx.find('#' + templateName); |
|
88 |
+ if (template) { |
|
89 |
+ return nunjucks.renderString(template.innerHTML, {"data": data}); |
|
90 |
+ } else { |
|
91 |
+ return nunjucks.render(templateName, {"data": data}); |
|
92 |
+ } |
|
93 |
+ } |
|
35 | 94 |
return text; |
36 | 95 |
} |
37 | 96 |
}); |
... | ... |
@@ -5,12 +5,14 @@ htmx.defineExtension('disable-element', { |
5 | 5 |
onEvent: function (name, evt) { |
6 | 6 |
let elt = evt.detail.elt; |
7 | 7 |
let target = elt.getAttribute("hx-disable-element"); |
8 |
- let targetElement = (target == "self") ? elt : document.querySelector(target); |
|
8 |
+ let targetElements = (target == "self") ? [ elt ] : document.querySelectorAll(target); |
|
9 | 9 |
|
10 |
- if (name === "htmx:beforeRequest" && targetElement) { |
|
11 |
- targetElement.disabled = true; |
|
12 |
- } else if (name == "htmx:afterRequest" && targetElement) { |
|
13 |
- targetElement.disabled = false; |
|
10 |
+ for (var i = 0; i < targetElements.length; i++) { |
|
11 |
+ if (name === "htmx:beforeRequest" && targetElements[i]) { |
|
12 |
+ targetElements[i].disabled = true; |
|
13 |
+ } else if (name == "htmx:afterRequest" && targetElements[i]) { |
|
14 |
+ targetElements[i].disabled = false; |
|
15 |
+ } |
|
14 | 16 |
} |
15 | 17 |
} |
16 | 18 |
}); |
17 | 19 |
\ No newline at end of file |
... | ... |
@@ -25,28 +25,28 @@ |
25 | 25 |
if (delayElt) { |
26 | 26 |
const delayInMilliseconds = |
27 | 27 |
delayElt.getAttribute('data-loading-delay') || 200 |
28 |
- const timeout = setTimeout(() => { |
|
28 |
+ const timeout = setTimeout(function () { |
|
29 | 29 |
doCallback() |
30 | 30 |
|
31 |
- loadingStatesUndoQueue.push(() => { |
|
32 |
- mayProcessUndoCallback(targetElt, () => undoCallback()) |
|
31 |
+ loadingStatesUndoQueue.push(function () { |
|
32 |
+ mayProcessUndoCallback(targetElt, undoCallback) |
|
33 | 33 |
}) |
34 | 34 |
}, delayInMilliseconds) |
35 | 35 |
|
36 |
- loadingStatesUndoQueue.push(() => { |
|
37 |
- mayProcessUndoCallback(targetElt, () => clearTimeout(timeout)) |
|
36 |
+ loadingStatesUndoQueue.push(function () { |
|
37 |
+ mayProcessUndoCallback(targetElt, function () { clearTimeout(timeout) }) |
|
38 | 38 |
}) |
39 | 39 |
} else { |
40 | 40 |
doCallback() |
41 |
- loadingStatesUndoQueue.push(() => { |
|
42 |
- mayProcessUndoCallback(targetElt, () => undoCallback()) |
|
41 |
+ loadingStatesUndoQueue.push(function () { |
|
42 |
+ mayProcessUndoCallback(targetElt, undoCallback) |
|
43 | 43 |
}) |
44 | 44 |
} |
45 | 45 |
} |
46 | 46 |
|
47 | 47 |
function getLoadingStateElts(loadingScope, type, path) { |
48 |
- return Array.from(htmx.findAll(loadingScope, `[${type}]`)).filter( |
|
49 |
- (elt) => mayProcessLoadingStateByPath(elt, path) |
|
48 |
+ return Array.from(htmx.findAll(loadingScope, "[" + type + "]")).filter( |
|
49 |
+ function (elt) { return mayProcessLoadingStateByPath(elt, path) } |
|
50 | 50 |
) |
51 | 51 |
} |
52 | 52 |
|
... | ... |
@@ -74,7 +74,7 @@ |
74 | 74 |
|
75 | 75 |
let loadingStateEltsByType = {} |
76 | 76 |
|
77 |
- loadingStateTypes.forEach((type) => { |
|
77 |
+ loadingStateTypes.forEach(function (type) { |
|
78 | 78 |
loadingStateEltsByType[type] = getLoadingStateElts( |
79 | 79 |
container, |
80 | 80 |
type, |
... | ... |
@@ -82,87 +82,91 @@ |
82 | 82 |
) |
83 | 83 |
}) |
84 | 84 |
|
85 |
- loadingStateEltsByType['data-loading'].forEach((sourceElt) => { |
|
86 |
- getLoadingTarget(sourceElt).forEach((targetElt) => { |
|
85 |
+ loadingStateEltsByType['data-loading'].forEach(function (sourceElt) { |
|
86 |
+ getLoadingTarget(sourceElt).forEach(function (targetElt) { |
|
87 | 87 |
queueLoadingState( |
88 | 88 |
sourceElt, |
89 | 89 |
targetElt, |
90 |
- () => |
|
91 |
- (targetElt.style.display = |
|
90 |
+ function () { |
|
91 |
+ targetElt.style.display = |
|
92 | 92 |
sourceElt.getAttribute('data-loading') || |
93 |
- 'inline-block'), |
|
94 |
- () => (targetElt.style.display = 'none') |
|
93 |
+ 'inline-block' }, |
|
94 |
+ function () { targetElt.style.display = 'none' } |
|
95 | 95 |
) |
96 | 96 |
}) |
97 | 97 |
}) |
98 | 98 |
|
99 | 99 |
loadingStateEltsByType['data-loading-class'].forEach( |
100 |
- (sourceElt) => { |
|
100 |
+ function (sourceElt) { |
|
101 | 101 |
const classNames = sourceElt |
102 | 102 |
.getAttribute('data-loading-class') |
103 | 103 |
.split(' ') |
104 | 104 |
|
105 |
- getLoadingTarget(sourceElt).forEach((targetElt) => { |
|
105 |
+ getLoadingTarget(sourceElt).forEach(function (targetElt) { |
|
106 | 106 |
queueLoadingState( |
107 | 107 |
sourceElt, |
108 | 108 |
targetElt, |
109 |
- () => |
|
110 |
- classNames.forEach((className) => |
|
111 |
- targetElt.classList.add(className) |
|
112 |
- ), |
|
113 |
- () => |
|
114 |
- classNames.forEach((className) => |
|
115 |
- targetElt.classList.remove(className) |
|
116 |
- ) |
|
109 |
+ function () { |
|
110 |
+ classNames.forEach(function (className) { |
|
111 |
+ targetElt.classList.add(className) |
|
112 |
+ }) |
|
113 |
+ }, |
|
114 |
+ function() { |
|
115 |
+ classNames.forEach(function (className) { |
|
116 |
+ targetElt.classList.remove(className) |
|
117 |
+ }) |
|
118 |
+ } |
|
117 | 119 |
) |
118 | 120 |
}) |
119 | 121 |
} |
120 | 122 |
) |
121 | 123 |
|
122 | 124 |
loadingStateEltsByType['data-loading-class-remove'].forEach( |
123 |
- (sourceElt) => { |
|
125 |
+ function (sourceElt) { |
|
124 | 126 |
const classNames = sourceElt |
125 | 127 |
.getAttribute('data-loading-class-remove') |
126 | 128 |
.split(' ') |
127 | 129 |
|
128 |
- getLoadingTarget(sourceElt).forEach((targetElt) => { |
|
130 |
+ getLoadingTarget(sourceElt).forEach(function (targetElt) { |
|
129 | 131 |
queueLoadingState( |
130 | 132 |
sourceElt, |
131 | 133 |
targetElt, |
132 |
- () => |
|
133 |
- classNames.forEach((className) => |
|
134 |
- targetElt.classList.remove(className) |
|
135 |
- ), |
|
136 |
- () => |
|
137 |
- classNames.forEach((className) => |
|
138 |
- targetElt.classList.add(className) |
|
139 |
- ) |
|
134 |
+ function () { |
|
135 |
+ classNames.forEach(function (className) { |
|
136 |
+ targetElt.classList.remove(className) |
|
137 |
+ }) |
|
138 |
+ }, |
|
139 |
+ function() { |
|
140 |
+ classNames.forEach(function (className) { |
|
141 |
+ targetElt.classList.add(className) |
|
142 |
+ }) |
|
143 |
+ } |
|
140 | 144 |
) |
141 | 145 |
}) |
142 | 146 |
} |
143 | 147 |
) |
144 | 148 |
|
145 | 149 |
loadingStateEltsByType['data-loading-disable'].forEach( |
146 |
- (sourceElt) => { |
|
147 |
- getLoadingTarget(sourceElt).forEach((targetElt) => { |
|
150 |
+ function (sourceElt) { |
|
151 |
+ getLoadingTarget(sourceElt).forEach(function (targetElt) { |
|
148 | 152 |
queueLoadingState( |
149 | 153 |
sourceElt, |
150 | 154 |
targetElt, |
151 |
- () => (targetElt.disabled = true), |
|
152 |
- () => (targetElt.disabled = false) |
|
155 |
+ function() { targetElt.disabled = true }, |
|
156 |
+ function() { targetElt.disabled = false } |
|
153 | 157 |
) |
154 | 158 |
}) |
155 | 159 |
} |
156 | 160 |
) |
157 | 161 |
|
158 | 162 |
loadingStateEltsByType['data-loading-aria-busy'].forEach( |
159 |
- (sourceElt) => { |
|
160 |
- getLoadingTarget(sourceElt).forEach((targetElt) => { |
|
163 |
+ function (sourceElt) { |
|
164 |
+ getLoadingTarget(sourceElt).forEach(function (targetElt) { |
|
161 | 165 |
queueLoadingState( |
162 | 166 |
sourceElt, |
163 | 167 |
targetElt, |
164 |
- () => (targetElt.setAttribute("aria-busy", "true")), |
|
165 |
- () => (targetElt.removeAttribute("aria-busy")) |
|
168 |
+ function () { targetElt.setAttribute("aria-busy", "true") }, |
|
169 |
+ function () { targetElt.removeAttribute("aria-busy") } |
|
166 | 170 |
) |
167 | 171 |
}) |
168 | 172 |
} |
... | ... |
@@ -5,7 +5,8 @@ htmx.defineExtension('morphdom-swap', { |
5 | 5 |
handleSwap: function (swapStyle, target, fragment) { |
6 | 6 |
if (swapStyle === 'morphdom') { |
7 | 7 |
if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { |
8 |
- morphdom(target, fragment.firstElementChild); |
|
8 |
+ // IE11 doesn't support DocumentFragment.firstElementChild |
|
9 |
+ morphdom(target, fragment.firstElementChild || fragment.firstChild); |
|
9 | 10 |
return [target]; |
10 | 11 |
} else { |
11 | 12 |
morphdom(target, fragment.outerHTML); |
... | ... |
@@ -48,9 +48,12 @@ htmx.defineExtension("preload", { |
48 | 48 |
// in the future |
49 | 49 |
var hxGet = node.getAttribute("hx-get") || node.getAttribute("data-hx-get") |
50 | 50 |
if (hxGet) { |
51 |
- htmx.ajax("GET", hxGet, {handler:function(elt, info) { |
|
52 |
- done(info.xhr.responseText); |
|
53 |
- }}); |
|
51 |
+ htmx.ajax("GET", hxGet, { |
|
52 |
+ source: node, |
|
53 |
+ handler:function(elt, info) { |
|
54 |
+ done(info.xhr.responseText); |
|
55 |
+ } |
|
56 |
+ }); |
|
54 | 57 |
return; |
55 | 58 |
} |
56 | 59 |
|
... | ... |
@@ -93,7 +96,7 @@ htmx.defineExtension("preload", { |
93 | 96 |
// Apply the listener to the node |
94 | 97 |
node.addEventListener(on, function(evt) { |
95 | 98 |
if (node.preloadState === "PAUSE") { // Only add one event listener |
96 |
- node.preloadState = "READY"; // Requred for the `load` function to trigger |
|
99 |
+ node.preloadState = "READY"; // Required for the `load` function to trigger |
|
97 | 100 |
|
98 | 101 |
// Special handling for "mouseover" events. Wait 100ms before triggering load. |
99 | 102 |
if (on === "mouseover") { |
... | ... |
@@ -5,7 +5,7 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
5 | 5 |
|
6 | 6 |
*/ |
7 | 7 |
|
8 |
-(function(){ |
|
8 |
+(function() { |
|
9 | 9 |
|
10 | 10 |
/** @type {import("../htmx").HtmxInternalApi} */ |
11 | 11 |
var api; |
... | ... |
@@ -39,17 +39,19 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
39 | 39 |
|
40 | 40 |
switch (name) { |
41 | 41 |
|
42 |
- // Try to remove remove an EventSource when elements are removed |
|
43 |
- case "htmx:beforeCleanupElement": |
|
44 |
- var internalData = api.getInternalData(evt.target) |
|
45 |
- if (internalData.sseEventSource) { |
|
46 |
- internalData.sseEventSource.close(); |
|
47 |
- } |
|
48 |
- return; |
|
42 |
+ case "htmx:beforeCleanupElement": |
|
43 |
+ var internalData = api.getInternalData(evt.target) |
|
44 |
+ // Try to remove remove an EventSource when elements are removed |
|
45 |
+ if (internalData.sseEventSource) { |
|
46 |
+ internalData.sseEventSource.close(); |
|
47 |
+ } |
|
49 | 48 |
|
50 |
- // Try to create EventSources when elements are processed |
|
51 |
- case "htmx:afterProcessNode": |
|
52 |
- createEventSourceOnElement(evt.target); |
|
49 |
+ return; |
|
50 |
+ |
|
51 |
+ // Try to create EventSources when elements are processed |
|
52 |
+ case "htmx:afterProcessNode": |
|
53 |
+ ensureEventSourceOnElement(evt.target); |
|
54 |
+ registerSSE(evt.target); |
|
53 | 55 |
} |
54 | 56 |
} |
55 | 57 |
}); |
... | ... |
@@ -66,8 +68,8 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
66 | 68 |
* @param {string} url |
67 | 69 |
* @returns EventSource |
68 | 70 |
*/ |
69 |
- function createEventSource(url) { |
|
70 |
- return new EventSource(url, {withCredentials:true}); |
|
71 |
+ function createEventSource(url) { |
|
72 |
+ return new EventSource(url, { withCredentials: true }); |
|
71 | 73 |
} |
72 | 74 |
|
73 | 75 |
function splitOnWhitespace(trigger) { |
... | ... |
@@ -90,7 +92,7 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
90 | 92 |
function getLegacySSESwaps(elt) { |
91 | 93 |
var legacySSEValue = api.getAttributeValue(elt, "hx-sse"); |
92 | 94 |
var returnArr = []; |
93 |
- if (legacySSEValue) { |
|
95 |
+ if (legacySSEValue != null) { |
|
94 | 96 |
var values = splitOnWhitespace(legacySSEValue); |
95 | 97 |
for (var i = 0; i < values.length; i++) { |
96 | 98 |
var value = values[i].split(/:(.+)/); |
... | ... |
@@ -103,63 +105,24 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
103 | 105 |
} |
104 | 106 |
|
105 | 107 |
/** |
106 |
- * createEventSourceOnElement creates a new EventSource connection on the provided element. |
|
107 |
- * If a usable EventSource already exists, then it is returned. If not, then a new EventSource |
|
108 |
- * is created and stored in the element's internalData. |
|
108 |
+ * registerSSE looks for attributes that can contain sse events, right |
|
109 |
+ * now hx-trigger and sse-swap and adds listeners based on these attributes too |
|
110 |
+ * the closest event source |
|
111 |
+ * |
|
109 | 112 |
* @param {HTMLElement} elt |
110 |
- * @param {number} retryCount |
|
111 |
- * @returns {EventSource | null} |
|
112 | 113 |
*/ |
113 |
- function createEventSourceOnElement(elt, retryCount) { |
|
114 |
- |
|
115 |
- if (elt == null) { |
|
116 |
- return null; |
|
114 |
+ function registerSSE(elt) { |
|
115 |
+ // Find closest existing event source |
|
116 |
+ var sourceElement = api.getClosestMatch(elt, hasEventSource); |
|
117 |
+ if (sourceElement == null) { |
|
118 |
+ // api.triggerErrorEvent(elt, "htmx:noSSESourceError") |
|
119 |
+ return null; // no eventsource in parentage, orphaned element |
|
117 | 120 |
} |
118 | 121 |
|
119 |
- var internalData = api.getInternalData(elt); |
|
120 |
- |
|
121 |
- // get URL from element's attribute |
|
122 |
- var sseURL = api.getAttributeValue(elt, "sse-connect"); |
|
123 |
- |
|
124 |
- |
|
125 |
- if (sseURL == undefined) { |
|
126 |
- var legacyURL = getLegacySSEURL(elt) |
|
127 |
- if (legacyURL) { |
|
128 |
- sseURL = legacyURL; |
|
129 |
- } else { |
|
130 |
- return null; |
|
131 |
- } |
|
132 |
- } |
|
133 |
- |
|
134 |
- // Connect to the EventSource |
|
135 |
- var source = htmx.createEventSource(sseURL); |
|
136 |
- internalData.sseEventSource = source; |
|
137 |
- |
|
138 |
- // Create event handlers |
|
139 |
- source.onerror = function (err) { |
|
140 |
- |
|
141 |
- // Log an error event |
|
142 |
- api.triggerErrorEvent(elt, "htmx:sseError", {error:err, source:source}); |
|
122 |
+ // Set internalData and source |
|
123 |
+ var internalData = api.getInternalData(sourceElement); |
|
124 |
+ var source = internalData.sseEventSource; |
|
143 | 125 |
|
144 |
- // If parent no longer exists in the document, then clean up this EventSource |
|
145 |
- if (maybeCloseSSESource(elt)) { |
|
146 |
- return; |
|
147 |
- } |
|
148 |
- |
|
149 |
- // Otherwise, try to reconnect the EventSource |
|
150 |
- if (source.readyState === EventSource.CLOSED) { |
|
151 |
- retryCount = retryCount || 0; |
|
152 |
- var timeout = Math.random() * (2 ^ retryCount) * 500; |
|
153 |
- window.setTimeout(function() { |
|
154 |
- createEventSourceOnElement(elt, Math.min(7, retryCount+1)); |
|
155 |
- }, timeout); |
|
156 |
- } |
|
157 |
- }; |
|
158 |
- |
|
159 |
- source.onopen = function (evt) { |
|
160 |
- api.triggerEvent(elt, "htmx::sseOpen", {source: source}); |
|
161 |
- } |
|
162 |
- |
|
163 | 126 |
// Add message handlers for every `sse-swap` attribute |
164 | 127 |
queryAttributeOnThisOrChildren(elt, "sse-swap").forEach(function(child) { |
165 | 128 |
|
... | ... |
@@ -170,23 +133,27 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
170 | 133 |
var sseEventNames = getLegacySSESwaps(child); |
171 | 134 |
} |
172 | 135 |
|
173 |
- for (var i = 0 ; i < sseEventNames.length ; i++) { |
|
136 |
+ for (var i = 0; i < sseEventNames.length; i++) { |
|
174 | 137 |
var sseEventName = sseEventNames[i].trim(); |
175 | 138 |
var listener = function(event) { |
176 | 139 |
|
177 |
- // If the parent is missing then close SSE and remove listener |
|
178 |
- if (maybeCloseSSESource(elt)) { |
|
179 |
- source.removeEventListener(sseEventName, listener); |
|
140 |
+ // If the source is missing then close SSE |
|
141 |
+ if (maybeCloseSSESource(sourceElement)) { |
|
180 | 142 |
return; |
181 | 143 |
} |
182 | 144 |
|
145 |
+ // If the body no longer contains the element, remove the listener |
|
146 |
+ if (!api.bodyContains(child)) { |
|
147 |
+ source.removeEventListener(sseEventName, listener); |
|
148 |
+ } |
|
149 |
+ |
|
183 | 150 |
// swap the response into the DOM and trigger a notification |
184 | 151 |
swap(child, event.data); |
185 | 152 |
api.triggerEvent(elt, "htmx:sseMessage", event); |
186 | 153 |
}; |
187 | 154 |
|
188 | 155 |
// Register the new listener |
189 |
- api.getInternalData(elt).sseEventListener = listener; |
|
156 |
+ api.getInternalData(child).sseEventListener = listener; |
|
190 | 157 |
source.addEventListener(sseEventName, listener); |
191 | 158 |
} |
192 | 159 |
}); |
... | ... |
@@ -203,24 +170,86 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
203 | 170 |
if (sseEventName.slice(0, 4) != "sse:") { |
204 | 171 |
return; |
205 | 172 |
} |
173 |
+ |
|
174 |
+ // remove the sse: prefix from here on out |
|
175 |
+ sseEventName = sseEventName.substr(4); |
|
206 | 176 |
|
207 |
- var listener = function(event) { |
|
177 |
+ var listener = function() { |
|
178 |
+ if (maybeCloseSSESource(sourceElement)) { |
|
179 |
+ return |
|
180 |
+ } |
|
208 | 181 |
|
209 |
- // If parent is missing, then close SSE and remove listener |
|
210 |
- if (maybeCloseSSESource(elt)) { |
|
182 |
+ if (!api.bodyContains(child)) { |
|
211 | 183 |
source.removeEventListener(sseEventName, listener); |
212 |
- return; |
|
213 | 184 |
} |
185 |
+ } |
|
186 |
+ }); |
|
187 |
+ } |
|
188 |
+ |
|
189 |
+ /** |
|
190 |
+ * ensureEventSourceOnElement creates a new EventSource connection on the provided element. |
|
191 |
+ * If a usable EventSource already exists, then it is returned. If not, then a new EventSource |
|
192 |
+ * is created and stored in the element's internalData. |
|
193 |
+ * @param {HTMLElement} elt |
|
194 |
+ * @param {number} retryCount |
|
195 |
+ * @returns {EventSource | null} |
|
196 |
+ */ |
|
197 |
+ function ensureEventSourceOnElement(elt, retryCount) { |
|
198 |
+ |
|
199 |
+ if (elt == null) { |
|
200 |
+ return null; |
|
201 |
+ } |
|
214 | 202 |
|
215 |
- // Trigger events to be handled by the rest of htmx |
|
216 |
- htmx.trigger(child, sseEventName, event); |
|
217 |
- htmx.trigger(child, "htmx:sseMessage", event); |
|
203 |
+ // handle extension source creation attribute |
|
204 |
+ queryAttributeOnThisOrChildren(elt, "sse-connect").forEach(function(child) { |
|
205 |
+ var sseURL = api.getAttributeValue(child, "sse-connect"); |
|
206 |
+ if (sseURL == null) { |
|
207 |
+ return; |
|
218 | 208 |
} |
219 | 209 |
|
220 |
- // Register the new listener |
|
221 |
- api.getInternalData(elt).sseEventListener = listener; |
|
222 |
- source.addEventListener(sseEventName.slice(4), listener); |
|
210 |
+ ensureEventSource(child, sseURL, retryCount); |
|
223 | 211 |
}); |
212 |
+ |
|
213 |
+ // handle legacy sse, remove for HTMX2 |
|
214 |
+ queryAttributeOnThisOrChildren(elt, "hx-sse").forEach(function(child) { |
|
215 |
+ var sseURL = getLegacySSEURL(child); |
|
216 |
+ if (sseURL == null) { |
|
217 |
+ return; |
|
218 |
+ } |
|
219 |
+ |
|
220 |
+ ensureEventSource(child, sseURL, retryCount); |
|
221 |
+ }); |
|
222 |
+ |
|
223 |
+ } |
|
224 |
+ |
|
225 |
+ function ensureEventSource(elt, url, retryCount) { |
|
226 |
+ var source = htmx.createEventSource(url); |
|
227 |
+ |
|
228 |
+ source.onerror = function(err) { |
|
229 |
+ |
|
230 |
+ // Log an error event |
|
231 |
+ api.triggerErrorEvent(elt, "htmx:sseError", { error: err, source: source }); |
|
232 |
+ |
|
233 |
+ // If parent no longer exists in the document, then clean up this EventSource |
|
234 |
+ if (maybeCloseSSESource(elt)) { |
|
235 |
+ return; |
|
236 |
+ } |
|
237 |
+ |
|
238 |
+ // Otherwise, try to reconnect the EventSource |
|
239 |
+ if (source.readyState === EventSource.CLOSED) { |
|
240 |
+ retryCount = retryCount || 0; |
|
241 |
+ var timeout = Math.random() * (2 ^ retryCount) * 500; |
|
242 |
+ window.setTimeout(function() { |
|
243 |
+ ensureEventSourceOnElement(elt, Math.min(7, retryCount + 1)); |
|
244 |
+ }, timeout); |
|
245 |
+ } |
|
246 |
+ }; |
|
247 |
+ |
|
248 |
+ source.onopen = function(evt) { |
|
249 |
+ api.triggerEvent(elt, "htmx:sseOpen", { source: source }); |
|
250 |
+ } |
|
251 |
+ |
|
252 |
+ api.getInternalData(elt).sseEventSource = source; |
|
224 | 253 |
} |
225 | 254 |
|
226 | 255 |
/** |
... | ... |
@@ -253,12 +282,12 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
253 | 282 |
var result = []; |
254 | 283 |
|
255 | 284 |
// If the parent element also contains the requested attribute, then add it to the results too. |
256 |
- if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-sse")) { |
|
285 |
+ if (api.hasAttribute(elt, attributeName)) { |
|
257 | 286 |
result.push(elt); |
258 | 287 |
} |
259 | 288 |
|
260 | 289 |
// Search all child nodes that match the requested attribute |
261 |
- elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [hx-sse], [data-hx-sse]").forEach(function(node) { |
|
290 |
+ elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "]").forEach(function(node) { |
|
262 | 291 |
result.push(node); |
263 | 292 |
}); |
264 | 293 |
|
... | ... |
@@ -281,7 +310,7 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
281 | 310 |
|
282 | 311 |
api.selectAndSwap(swapSpec.swapStyle, target, elt, content, settleInfo); |
283 | 312 |
|
284 |
- settleInfo.elts.forEach(function (elt) { |
|
313 |
+ settleInfo.elts.forEach(function(elt) { |
|
285 | 314 |
if (elt.classList) { |
286 | 315 |
elt.classList.add(htmx.config.settlingClass); |
287 | 316 |
} |
... | ... |
@@ -306,11 +335,11 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
306 | 335 |
function doSettle(settleInfo) { |
307 | 336 |
|
308 | 337 |
return function() { |
309 |
- settleInfo.tasks.forEach(function (task) { |
|
338 |
+ settleInfo.tasks.forEach(function(task) { |
|
310 | 339 |
task.call(); |
311 | 340 |
}); |
312 | 341 |
|
313 |
- settleInfo.elts.forEach(function (elt) { |
|
342 |
+ settleInfo.elts.forEach(function(elt) { |
|
314 | 343 |
if (elt.classList) { |
315 | 344 |
elt.classList.remove(htmx.config.settlingClass); |
316 | 345 |
} |
... | ... |
@@ -319,4 +348,8 @@ This extension adds support for Server Sent Events to htmx. See /www/extensions |
319 | 348 |
} |
320 | 349 |
} |
321 | 350 |
|
322 |
-})(); |
|
323 | 351 |
\ No newline at end of file |
352 |
+ function hasEventSource(node) { |
|
353 |
+ return api.getInternalData(node).sseEventSource != null; |
|
354 |
+ } |
|
355 |
+ |
|
356 |
+})(); |
... | ... |
@@ -52,7 +52,7 @@ This extension adds support for WebSockets to htmx. See /www/extensions/ws.md f |
52 | 52 |
return; |
53 | 53 |
|
54 | 54 |
// Try to create websockets when elements are processed |
55 |
- case "htmx:afterProcessNode": |
|
55 |
+ case "htmx:beforeProcessNode": |
|
56 | 56 |
var parent = evt.target; |
57 | 57 |
|
58 | 58 |
forEach(queryAttributeOnThisOrChildren(parent, "ws-connect"), function (child) { |
... | ... |
@@ -200,7 +200,7 @@ This extension adds support for WebSockets to htmx. See /www/extensions/ws.md f |
200 | 200 |
if (!this.socket) { |
201 | 201 |
api.triggerErrorEvent() |
202 | 202 |
} |
203 |
- if (sendElt && api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { |
|
203 |
+ if (!sendElt || api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { |
|
204 | 204 |
message: message, |
205 | 205 |
socketWrapper: this.publicInterface |
206 | 206 |
})) { |
... | ... |
@@ -341,7 +341,7 @@ This extension adds support for WebSockets to htmx. See /www/extensions/ws.md f |
341 | 341 |
|
342 | 342 |
/** @type {WebSocketWrapper} */ |
343 | 343 |
var socketWrapper = api.getInternalData(socketElt).webSocket; |
344 |
- var headers = api.getHeaders(sendElt, socketElt); |
|
344 |
+ var headers = api.getHeaders(sendElt, api.getTarget(sendElt)); |
|
345 | 345 |
var results = api.getInputValues(sendElt, 'post'); |
346 | 346 |
var errors = results.errors; |
347 | 347 |
var rawParameters = results.values; |
... | ... |
@@ -379,7 +379,7 @@ This extension adds support for WebSockets to htmx. See /www/extensions/ws.md f |
379 | 379 |
|
380 | 380 |
socketWrapper.send(body, elt); |
381 | 381 |
|
382 |
- if (api.shouldCancel(evt, elt)) { |
|
382 |
+ if (evt && api.shouldCancel(evt, elt)) { |
|
383 | 383 |
evt.preventDefault(); |
384 | 384 |
} |
385 | 385 |
}); |
... | ... |
@@ -19,8 +19,9 @@ export function addClass(elt: Element, clazz: string, delay?: number): void; |
19 | 19 |
* @param verb 'GET', 'POST', etc. |
20 | 20 |
* @param path the URL path to make the AJAX |
21 | 21 |
* @param element the element to target (defaults to the **body**) |
22 |
+ * @returns Promise that resolves immediately if no request is sent, or when the request is complete |
|
22 | 23 |
*/ |
23 |
-export function ajax(verb: string, path: string, element: Element): void; |
|
24 |
+export function ajax(verb: string, path: string, element: Element): Promise<void>; |
|
24 | 25 |
|
25 | 26 |
/** |
26 | 27 |
* Issues an htmx-style AJAX request |
... | ... |
@@ -30,8 +31,9 @@ export function ajax(verb: string, path: string, element: Element): void; |
30 | 31 |
* @param verb 'GET', 'POST', etc. |
31 | 32 |
* @param path the URL path to make the AJAX |
32 | 33 |
* @param selector a selector for the target |
34 |
+ * @returns Promise that resolves immediately if no request is sent, or when the request is complete |
|
33 | 35 |
*/ |
34 |
-export function ajax(verb: string, path: string, selector: string): void; |
|
36 |
+export function ajax(verb: string, path: string, selector: string): Promise<void>; |
|
35 | 37 |
|
36 | 38 |
/** |
37 | 39 |
* Issues an htmx-style AJAX request |
... | ... |
@@ -41,12 +43,13 @@ export function ajax(verb: string, path: string, selector: string): void; |
41 | 43 |
* @param verb 'GET', 'POST', etc. |
42 | 44 |
* @param path the URL path to make the AJAX |
43 | 45 |
* @param context a context object that contains any of the following |
46 |
+ * @returns Promise that resolves immediately if no request is sent, or when the request is complete |
|
44 | 47 |
*/ |
45 | 48 |
export function ajax( |
46 | 49 |
verb: string, |
47 | 50 |
path: string, |
48 |
- context: Partial<{ source: any; event: any; handler: any; target: any; values: any; headers: any }> |
|
49 |
-): void; |
|
51 |
+ context: Partial<{ source: any; event: any; handler: any; target: any; swap: any; values: any; headers: any; select: any }> |
|
52 |
+): Promise<void>; |
|
50 | 53 |
|
51 | 54 |
/** |
52 | 55 |
* Finds the closest matching element in the given elements parentage, inclusive of the element |
... | ... |
@@ -288,43 +291,151 @@ export function values(elt: Element, requestType?: string): any; |
288 | 291 |
export const version: string; |
289 | 292 |
|
290 | 293 |
export interface HtmxConfig { |
291 |
- /** array of strings: the attributes to settle during the settling phase */ |
|
294 |
+ /** |
|
295 |
+ * The attributes to settle during the settling phase. |
|
296 |
+ * @default ["class", "style", "width", "height"] |
|
297 |
+ */ |
|
292 | 298 |
attributesToSettle?: ["class", "style", "width", "height"] | string[]; |
293 |
- /** the default delay between completing the content swap and settling attributes */ |
|
299 |
+ /** |
|
300 |
+ * If the focused element should be scrolled into view. |
|
301 |
+ * @default false |
|
302 |
+ */ |
|
303 |
+ defaultFocusScroll?: boolean; |
|
304 |
+ /** |
|
305 |
+ * The default delay between completing the content swap and settling attributes. |
|
306 |
+ * @default 20 |
|
307 |
+ */ |
|
294 | 308 |
defaultSettleDelay?: number; |
295 |
- /** the default delay between receiving a response from the server and doing the swap */ |
|
309 |
+ /** |
|
310 |
+ * The default delay between receiving a response from the server and doing the swap. |
|
311 |
+ * @default 0 |
|
312 |
+ */ |
|
296 | 313 |
defaultSwapDelay?: number; |
297 |
- /** the default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted */ |
|
314 |
+ /** |
|
315 |
+ * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted. |
|
316 |
+ * @default "innerHTML" |
|
317 |
+ */ |
|
298 | 318 |
defaultSwapStyle?: "innerHTML" | string; |
299 |
- /** the number of pages to keep in **localStorage** for history support */ |
|
319 |
+ /** |
|
320 |
+ * The number of pages to keep in **localStorage** for history support. |
|
321 |
+ * @default 10 |
|
322 |
+ */ |
|
300 | 323 |
historyCacheSize?: number; |
301 |
- /** whether or not to use history */ |
|
324 |
+ /** |
|
325 |
+ * Whether or not to use history. |
|
326 |
+ * @default true |
|
327 |
+ */ |
|
302 | 328 |
historyEnabled?: boolean; |
303 |
- /** if true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present */ |
|
329 |
+ /** |
|
330 |
+ * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present. |
|
331 |
+ * @default true |
|
332 |
+ */ |
|
304 | 333 |
includeIndicatorStyles?: boolean; |
305 |
- /** the class to place on indicators when a request is in flight */ |
|
334 |
+ /** |
|
335 |
+ * The class to place on indicators when a request is in flight. |
|
336 |
+ * @default "htmx-indicator" |
|
337 |
+ */ |
|
306 | 338 |
indicatorClass?: "htmx-indicator" | string; |
307 |
- /** the class to place on triggering elements when a request is in flight */ |
|
339 |
+ /** |
|
340 |
+ * The class to place on triggering elements when a request is in flight. |
|
341 |
+ * @default "htmx-request" |
|
342 |
+ */ |
|
308 | 343 |
requestClass?: "htmx-request" | string; |
309 |
- /** the class to temporarily place on elements that htmx has added to the DOM */ |
|
344 |
+ /** |
|
345 |
+ * The class to temporarily place on elements that htmx has added to the DOM. |
|
346 |
+ * @default "htmx-added" |
|
347 |
+ */ |
|
310 | 348 |
addedClass?: "htmx-added" | string; |
311 |
- /** the class to place on target elements when htmx is in the settling phase */ |
|
349 |
+ /** |
|
350 |
+ * The class to place on target elements when htmx is in the settling phase. |
|
351 |
+ * @default "htmx-settling" |
|
352 |
+ */ |
|
312 | 353 |
settlingClass?: "htmx-settling" | string; |
313 |
- /** the class to place on target elements when htmx is in the swapping phase */ |
|
354 |
+ /** |
|
355 |
+ * The class to place on target elements when htmx is in the swapping phase. |
|
356 |
+ * @default "htmx-swapping" |
|
357 |
+ */ |
|
314 | 358 |
swappingClass?: "htmx-swapping" | string; |
315 |
- /** allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility */ |
|
359 |
+ /** |
|
360 |
+ * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility. |
|
361 |
+ * @default true |
|
362 |
+ */ |
|
316 | 363 |
allowEval?: boolean; |
317 |
- /** use HTML template tags for parsing content from the server. This allows you to use Out of Band content when returning things like table rows, but it is *not* IE11 compatible. */ |
|
364 |
+ /** |
|
365 |
+ * Use HTML template tags for parsing content from the server. This allows you to use Out of Band content when returning things like table rows, but it is *not* IE11 compatible. |
|
366 |
+ * @default false |
|
367 |
+ */ |
|
318 | 368 |
useTemplateFragments?: boolean; |
319 |
- /** allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates */ |
|
369 |
+ /** |
|
370 |
+ * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates. |
|
371 |
+ * @default false |
|
372 |
+ */ |
|
320 | 373 |
withCredentials?: boolean; |
321 |
- /** the default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later** */ |
|
374 |
+ /** |
|
375 |
+ * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**. |
|
376 |
+ * @default "full-jitter" |
|
377 |
+ */ |
|
322 | 378 |
wsReconnectDelay?: "full-jitter" | string | ((retryCount: number) => number); |
323 | 379 |
// following don't appear in the docs |
380 |
+ /** @default false */ |
|
324 | 381 |
refreshOnHistoryMiss?: boolean; |
382 |
+ /** @default 0 */ |
|
325 | 383 |
timeout?: number; |
384 |
+ /** @default "[hx-disable], [data-hx-disable]" */ |
|
326 | 385 |
disableSelector?: "[hx-disable], [data-hx-disable]" | string; |
327 |
- scrollBehavior?: "smooth"; |
|
386 |
+ /** @default "smooth" */ |
|
387 |
+ scrollBehavior?: "smooth" | "auto"; |
|
388 |
+ /** |
|
389 |
+ * If set to false, disables the interpretation of script tags. |
|
390 |
+ * @default true |
|
391 |
+ */ |
|
392 |
+ allowScriptTags?: boolean; |
|
393 |
+ /** |
|
394 |
+ * If set to true, disables htmx-based requests to non-origin hosts. |
|
395 |
+ * @default false |
|
396 |
+ */ |
|
397 |
+ selfRequestsOnly?: boolean; |
|
398 |
+ /** |
|
399 |
+ * Whether or not the target of a boosted element is scrolled into the viewport. |
|
400 |
+ * @default true |
|
401 |
+ */ |
|
402 |
+ scrollIntoViewOnBoost?: boolean; |
|
403 |
+ /** |
|
404 |
+ * If set, the nonce will be added to inline scripts. |
|
405 |
+ * @default '' |
|
406 |
+ */ |
|
407 |
+ inlineScriptNonce?: string; |
|
408 |
+ /** |
|
409 |
+ * The type of binary data being received over the WebSocket connection |
|
410 |
+ * @default 'blob' |
|
411 |
+ */ |
|
412 |
+ wsBinaryType?: 'blob' | 'arraybuffer'; |
|
413 |
+ /** |
|
414 |
+ * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser |
|
415 |
+ * @default false |
|
416 |
+ */ |
|
417 |
+ getCacheBusterParam?: boolean; |
|
418 |
+ /** |
|
419 |
+ * If set to true, htmx will use the View Transition API when swapping in new content. |
|
420 |
+ * @default false |
|
421 |
+ */ |
|
422 |
+ globalViewTransitions?: boolean; |
|
423 |
+ /** |
|
424 |
+ * htmx will format requests with these methods by encoding their parameters in the URL, not the request body |
|
425 |
+ * @default ["get"] |
|
426 |
+ */ |
|
427 |
+ methodsThatUseUrlParams?: ('get' | 'head' | 'post' | 'put' | 'delete' | 'connect' | 'options' | 'trace' | 'patch' )[]; |
|
428 |
+ /** |
|
429 |
+ * If set to true htmx will not update the title of the document when a title tag is found in new content |
|
430 |
+ * @default false |
|
431 |
+ */ |
|
432 |
+ ignoreTitle:? boolean; |
|
433 |
+ /** |
|
434 |
+ * The cache to store evaluated trigger specifications into. |
|
435 |
+ * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) |
|
436 |
+ * @default null |
|
437 |
+ */ |
|
438 |
+ triggerSpecsCache?: {[trigger: string]: HtmxTriggerSpecification[]}; |
|
328 | 439 |
} |
329 | 440 |
|
330 | 441 |
/** |
... | ... |
@@ -44,6 +44,7 @@ return (function () { |
44 | 44 |
defineExtension : defineExtension, |
45 | 45 |
removeExtension : removeExtension, |
46 | 46 |
logAll : logAll, |
47 |
+ logNone : logNone, |
|
47 | 48 |
logger : null, |
48 | 49 |
config : { |
49 | 50 |
historyEnabled:true, |
... | ... |
@@ -59,6 +60,7 @@ return (function () { |
59 | 60 |
settlingClass:'htmx-settling', |
60 | 61 |
swappingClass:'htmx-swapping', |
61 | 62 |
allowEval:true, |
63 |
+ allowScriptTags:true, |
|
62 | 64 |
inlineScriptNonce:'', |
63 | 65 |
attributesToSettle:["class", "style", "width", "height"], |
64 | 66 |
withCredentials:false, |
... | ... |
@@ -71,6 +73,11 @@ return (function () { |
71 | 73 |
defaultFocusScroll: false, |
72 | 74 |
getCacheBusterParam: false, |
73 | 75 |
globalViewTransitions: false, |
76 |
+ methodsThatUseUrlParams: ["get"], |
|
77 |
+ selfRequestsOnly: false, |
|
78 |
+ ignoreTitle: false, |
|
79 |
+ scrollIntoViewOnBoost: true, |
|
80 |
+ triggerSpecsCache: null, |
|
74 | 81 |
}, |
75 | 82 |
parseInterval:parseInterval, |
76 | 83 |
_:internalEval, |
... | ... |
@@ -82,7 +89,7 @@ return (function () { |
82 | 89 |
sock.binaryType = htmx.config.wsBinaryType; |
83 | 90 |
return sock; |
84 | 91 |
}, |
85 |
- version: "1.9.2" |
|
92 |
+ version: "1.9.10" |
|
86 | 93 |
}; |
87 | 94 |
|
88 | 95 |
/** @type {import("./htmx").HtmxInternalApi} */ |
... | ... |
@@ -90,9 +97,11 @@ return (function () { |
90 | 97 |
addTriggerHandler: addTriggerHandler, |
91 | 98 |
bodyContains: bodyContains, |
92 | 99 |
canAccessLocalStorage: canAccessLocalStorage, |
100 |
+ findThisElement: findThisElement, |
|
93 | 101 |
filterValues: filterValues, |
94 | 102 |
hasAttribute: hasAttribute, |
95 | 103 |
getAttributeValue: getAttributeValue, |
104 |
+ getClosestAttributeValue: getClosestAttributeValue, |
|
96 | 105 |
getClosestMatch: getClosestMatch, |
97 | 106 |
getExpressionVars: getExpressionVars, |
98 | 107 |
getHeaders: getHeaders, |
... | ... |
@@ -105,6 +114,7 @@ return (function () { |
105 | 114 |
mergeObjects: mergeObjects, |
106 | 115 |
makeSettleInfo: makeSettleInfo, |
107 | 116 |
oobSwap: oobSwap, |
117 |
+ querySelectorExt: querySelectorExt, |
|
108 | 118 |
selectAndSwap: selectAndSwap, |
109 | 119 |
settleImmediately: settleImmediately, |
110 | 120 |
shouldCancel: shouldCancel, |
... | ... |
@@ -118,24 +128,40 @@ return (function () { |
118 | 128 |
return "[hx-" + verb + "], [data-hx-" + verb + "]" |
119 | 129 |
}).join(", "); |
120 | 130 |
|
131 |
+ var HEAD_TAG_REGEX = makeTagRegEx('head'), |
|
132 |
+ TITLE_TAG_REGEX = makeTagRegEx('title'), |
|
133 |
+ SVG_TAGS_REGEX = makeTagRegEx('svg', true); |
|
134 |
+ |
|
121 | 135 |
//==================================================================== |
122 | 136 |
// Utilities |
123 | 137 |
//==================================================================== |
124 | 138 |
|
139 |
+ /** |
|
140 |
+ * @param {string} tag |
|
141 |
+ * @param {boolean} global |
|
142 |
+ * @returns {RegExp} |
|
143 |
+ */ |
|
144 |
+ function makeTagRegEx(tag, global = false) { |
|
145 |
+ return new RegExp(`<${tag}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${tag}>`, |
|
146 |
+ global ? 'gim' : 'im'); |
|
147 |
+ } |
|
148 |
+ |
|
125 | 149 |
function parseInterval(str) { |
126 | 150 |
if (str == undefined) { |
127 |
- return undefined |
|
151 |
+ return undefined; |
|
128 | 152 |
} |
153 |
+ |
|
154 |
+ let interval = NaN; |
|
129 | 155 |
if (str.slice(-2) == "ms") { |
130 |
- return parseFloat(str.slice(0,-2)) || undefined |
|
131 |
- } |
|
132 |
- if (str.slice(-1) == "s") { |
|
133 |
- return (parseFloat(str.slice(0,-1)) * 1000) || undefined |
|
134 |
- } |
|
135 |
- if (str.slice(-1) == "m") { |
|
136 |
- return (parseFloat(str.slice(0,-1)) * 1000 * 60) || undefined |
|
156 |
+ interval = parseFloat(str.slice(0, -2)); |
|
157 |
+ } else if (str.slice(-1) == "s") { |
|
158 |
+ interval = parseFloat(str.slice(0, -1)) * 1000; |
|
159 |
+ } else if (str.slice(-1) == "m") { |
|
160 |
+ interval = parseFloat(str.slice(0, -1)) * 1000 * 60; |
|
161 |
+ } else { |
|
162 |
+ interval = parseFloat(str); |
|
137 | 163 |
} |
138 |
- return parseFloat(str) || undefined |
|
164 |
+ return isNaN(interval) ? undefined : interval; |
|
139 | 165 |
} |
140 | 166 |
|
141 | 167 |
/** |
... | ... |
@@ -222,7 +248,7 @@ return (function () { |
222 | 248 |
* @returns {boolean} |
223 | 249 |
*/ |
224 | 250 |
function matches(elt, selector) { |
225 |
- // @ts-ignore: non-standard properties for browser compatability |
|
251 |
+ // @ts-ignore: non-standard properties for browser compatibility |
|
226 | 252 |
// noinspection JSUnresolvedVariable |
227 | 253 |
var matchesFunction = elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector; |
228 | 254 |
return matchesFunction && matchesFunction.call(elt, selector); |
... | ... |
@@ -267,42 +293,46 @@ return (function () { |
267 | 293 |
} |
268 | 294 |
|
269 | 295 |
function aFullPageResponse(resp) { |
270 |
- return resp.match(/<body/); |
|
296 |
+ return /<body/.test(resp) |
|
271 | 297 |
} |
272 | 298 |
|
273 | 299 |
/** |
274 | 300 |
* |
275 |
- * @param {string} resp |
|
301 |
+ * @param {string} response |
|
276 | 302 |
* @returns {Element} |
277 | 303 |
*/ |
278 |
- function makeFragment(resp) { |
|
279 |
- var partialResponse = !aFullPageResponse(resp); |
|
304 |
+ function makeFragment(response) { |
|
305 |
+ var partialResponse = !aFullPageResponse(response); |
|
306 |
+ var startTag = getStartTag(response); |
|
307 |
+ var content = response; |
|
308 |
+ if (startTag === 'head') { |
|
309 |
+ content = content.replace(HEAD_TAG_REGEX, ''); |
|
310 |
+ } |
|
280 | 311 |
if (htmx.config.useTemplateFragments && partialResponse) { |
281 |
- var documentFragment = parseHTML("<body><template>" + resp + "</template></body>", 0); |
|
312 |
+ var documentFragment = parseHTML("<body><template>" + content + "</template></body>", 0); |
|
282 | 313 |
// @ts-ignore type mismatch between DocumentFragment and Element. |
283 |
- // TODO: Are these close enough for htmx to use interchangably? |
|
314 |
+ // TODO: Are these close enough for htmx to use interchangeably? |
|
284 | 315 |
return documentFragment.querySelector('template').content; |
285 |
- } else { |
|
286 |
- var startTag = getStartTag(resp); |
|
287 |
- switch (startTag) { |
|
288 |
- case "thead": |
|
289 |
- case "tbody": |
|
290 |
- case "tfoot": |
|
291 |
- case "colgroup": |
|
292 |
- case "caption": |
|
293 |
- return parseHTML("<table>" + resp + "</table>", 1); |
|
294 |
- case "col": |
|
295 |
- return parseHTML("<table><colgroup>" + resp + "</colgroup></table>", 2); |
|
296 |
- case "tr": |
|
297 |
- return parseHTML("<table><tbody>" + resp + "</tbody></table>", 2); |
|
298 |
- case "td": |
|
299 |
- case "th": |
|
300 |
- return parseHTML("<table><tbody><tr>" + resp + "</tr></tbody></table>", 3); |
|
301 |
- case "script": |
|
302 |
- return parseHTML("<div>" + resp + "</div>", 1); |
|
303 |
- default: |
|
304 |
- return parseHTML(resp, 0); |
|
305 |
- } |
|
316 |
+ } |
|
317 |
+ switch (startTag) { |
|
318 |
+ case "thead": |
|
319 |
+ case "tbody": |
|
320 |
+ case "tfoot": |
|
321 |
+ case "colgroup": |
|
322 |
+ case "caption": |
|
323 |
+ return parseHTML("<table>" + content + "</table>", 1); |
|
324 |
+ case "col": |
|
325 |
+ return parseHTML("<table><colgroup>" + content + "</colgroup></table>", 2); |
|
326 |
+ case "tr": |
|
327 |
+ return parseHTML("<table><tbody>" + content + "</tbody></table>", 2); |
|
328 |
+ case "td": |
|
329 |
+ case "th": |
|
330 |
+ return parseHTML("<table><tbody><tr>" + content + "</tr></tbody></table>", 3); |
|
331 |
+ case "script": |
|
332 |
+ case "style": |
|
333 |
+ return parseHTML("<div>" + content + "</div>", 1); |
|
334 |
+ default: |
|
335 |
+ return parseHTML(content, 0); |
|
306 | 336 |
} |
307 | 337 |
} |
308 | 338 |
|
... | ... |
@@ -386,7 +416,7 @@ return (function () { |
386 | 416 |
|
387 | 417 |
function bodyContains(elt) { |
388 | 418 |
// IE Fix |
389 |
- if (elt.getRootNode && elt.getRootNode() instanceof ShadowRoot) { |
|
419 |
+ if (elt.getRootNode && elt.getRootNode() instanceof window.ShadowRoot) { |
|
390 | 420 |
return getDocument().body.contains(elt.getRootNode().host); |
391 | 421 |
} else { |
392 | 422 |
return getDocument().body.contains(elt); |
... | ... |
@@ -440,7 +470,7 @@ return (function () { |
440 | 470 |
path = url.pathname + url.search; |
441 | 471 |
} |
442 | 472 |
// remove trailing slash, unless index page |
443 |
- if (!path.match('^/$')) { |
|
473 |
+ if (!(/^\/$/.test(path))) { |
|
444 | 474 |
path = path.replace(/\/+$/, ''); |
445 | 475 |
} |
446 | 476 |
return path; |
... | ... |
@@ -475,6 +505,10 @@ return (function () { |
475 | 505 |
} |
476 | 506 |
} |
477 | 507 |
|
508 |
+ function logNone() { |
|
509 |
+ htmx.logger = null |
|
510 |
+ } |
|
511 |
+ |
|
478 | 512 |
function find(eltOrSelector, selector) { |
479 | 513 |
if (selector) { |
480 | 514 |
return eltOrSelector.querySelector(selector); |
... | ... |
@@ -562,9 +596,17 @@ return (function () { |
562 | 596 |
} |
563 | 597 |
} |
564 | 598 |
|
599 |
+ function startsWith(str, prefix) { |
|
600 |
+ return str.substring(0, prefix.length) === prefix |
|
601 |
+ } |
|
602 |
+ |
|
603 |
+ function endsWith(str, suffix) { |
|
604 |
+ return str.substring(str.length - suffix.length) === suffix |
|
605 |
+ } |
|
606 |
+ |
|
565 | 607 |
function normalizeSelector(selector) { |
566 | 608 |
var trimmedSelector = selector.trim(); |
567 |
- if (trimmedSelector.startsWith("<") && trimmedSelector.endsWith("/>")) { |
|
609 |
+ if (startsWith(trimmedSelector, "<") && endsWith(trimmedSelector, "/>")) { |
|
568 | 610 |
return trimmedSelector.substring(1, trimmedSelector.length - 2); |
569 | 611 |
} else { |
570 | 612 |
return trimmedSelector; |
... | ... |
@@ -576,14 +618,20 @@ return (function () { |
576 | 618 |
return [closest(elt, normalizeSelector(selector.substr(8)))]; |
577 | 619 |
} else if (selector.indexOf("find ") === 0) { |
578 | 620 |
return [find(elt, normalizeSelector(selector.substr(5)))]; |
621 |
+ } else if (selector === "next") { |
|
622 |
+ return [elt.nextElementSibling] |
|
579 | 623 |
} else if (selector.indexOf("next ") === 0) { |
580 | 624 |
return [scanForwardQuery(elt, normalizeSelector(selector.substr(5)))]; |
625 |
+ } else if (selector === "previous") { |
|
626 |
+ return [elt.previousElementSibling] |
|
581 | 627 |
} else if (selector.indexOf("previous ") === 0) { |
582 | 628 |
return [scanBackwardsQuery(elt, normalizeSelector(selector.substr(9)))]; |
583 | 629 |
} else if (selector === 'document') { |
584 | 630 |
return [document]; |
585 | 631 |
} else if (selector === 'window') { |
586 | 632 |
return [window]; |
633 |
+ } else if (selector === 'body') { |
|
634 |
+ return [document.body]; |
|
587 | 635 |
} else { |
588 | 636 |
return getDocument().querySelectorAll(normalizeSelector(selector)); |
589 | 637 |
} |
... | ... |
@@ -751,7 +799,7 @@ return (function () { |
751 | 799 |
* @returns |
752 | 800 |
*/ |
753 | 801 |
function oobSwap(oobValue, oobElement, settleInfo) { |
754 |
- var selector = "#" + oobElement.id; |
|
802 |
+ var selector = "#" + getRawAttribute(oobElement, "id"); |
|
755 | 803 |
var swapStyle = "outerHTML"; |
756 | 804 |
if (oobValue === "true") { |
757 | 805 |
// do nothing |
... | ... |
@@ -799,7 +847,7 @@ return (function () { |
799 | 847 |
var oobSelects = getClosestAttributeValue(elt, "hx-select-oob"); |
800 | 848 |
if (oobSelects) { |
801 | 849 |
var oobSelectValues = oobSelects.split(","); |
802 |
- for (let i = 0; i < oobSelectValues.length; i++) { |
|
850 |
+ for (var i = 0; i < oobSelectValues.length; i++) { |
|
803 | 851 |
var oobSelectValue = oobSelectValues[i].split(":", 2); |
804 | 852 |
var id = oobSelectValue[0].trim(); |
805 | 853 |
if (id.indexOf("#") === 0) { |
... | ... |
@@ -832,8 +880,9 @@ return (function () { |
832 | 880 |
|
833 | 881 |
function handleAttributes(parentNode, fragment, settleInfo) { |
834 | 882 |
forEach(fragment.querySelectorAll("[id]"), function (newNode) { |
835 |
- if (newNode.id && newNode.id.length > 0) { |
|
836 |
- var normalizedId = newNode.id.replace("'", "\\'"); |
|
883 |
+ var id = getRawAttribute(newNode, "id") |
|
884 |
+ if (id && id.length > 0) { |
|
885 |
+ var normalizedId = id.replace("'", "\\'"); |
|
837 | 886 |
var normalizedTag = newNode.tagName.replace(':', '\\:'); |
838 | 887 |
var oldNode = parentNode.querySelector(normalizedTag + "[id='" + normalizedId + "']"); |
839 | 888 |
if (oldNode && oldNode !== parentNode) { |
... | ... |
@@ -902,6 +951,17 @@ return (function () { |
902 | 951 |
return hash; |
903 | 952 |
} |
904 | 953 |
|
954 |
+ function deInitOnHandlers(elt) { |
|
955 |
+ var internalData = getInternalData(elt); |
|
956 |
+ if (internalData.onHandlers) { |
|
957 |
+ for (var i = 0; i < internalData.onHandlers.length; i++) { |
|
958 |
+ const handlerInfo = internalData.onHandlers[i]; |
|
959 |
+ elt.removeEventListener(handlerInfo.event, handlerInfo.listener); |
|
960 |
+ } |
|
961 |
+ delete internalData.onHandlers |
|
962 |
+ } |
|
963 |
+ } |
|
964 |
+ |
|
905 | 965 |
function deInitNode(element) { |
906 | 966 |
var internalData = getInternalData(element); |
907 | 967 |
if (internalData.timeout) { |
... | ... |
@@ -920,12 +980,8 @@ return (function () { |
920 | 980 |
} |
921 | 981 |
}); |
922 | 982 |
} |
923 |
- if (internalData.onHandlers) { |
|
924 |
- for (let i = 0; i < internalData.onHandlers.length; i++) { |
|
925 |
- const handlerInfo = internalData.onHandlers[i]; |
|
926 |
- element.removeEventListener(handlerInfo.name, handlerInfo.handler); |
|
927 |
- } |
|
928 |
- } |
|
983 |
+ deInitOnHandlers(element); |
|
984 |
+ forEach(Object.keys(internalData), function(key) { delete internalData[key] }); |
|
929 | 985 |
} |
930 | 986 |
|
931 | 987 |
function cleanUpElement(element) { |
... | ... |
@@ -949,8 +1005,7 @@ return (function () { |
949 | 1005 |
} else { |
950 | 1006 |
newElt = eltBeforeNewContent.nextSibling; |
951 | 1007 |
} |
952 |
- getInternalData(target).replacedWith = newElt; // tuck away so we can fire events on it later |
|
953 |
- settleInfo.elts = [] // clear existing elements |
|
1008 |
+ settleInfo.elts = settleInfo.elts.filter(function(e) { return e != target }); |
|
954 | 1009 |
while(newElt && newElt !== target) { |
955 | 1010 |
if (newElt.nodeType === Node.ELEMENT_NODE) { |
956 | 1011 |
settleInfo.elts.push(newElt); |
... | ... |
@@ -995,8 +1050,8 @@ return (function () { |
995 | 1050 |
} |
996 | 1051 |
} |
997 | 1052 |
|
998 |
- function maybeSelectFromResponse(elt, fragment) { |
|
999 |
- var selector = getClosestAttributeValue(elt, "hx-select"); |
|
1053 |
+ function maybeSelectFromResponse(elt, fragment, selectOverride) { |
|
1054 |
+ var selector = selectOverride || getClosestAttributeValue(elt, "hx-select"); |
|
1000 | 1055 |
if (selector) { |
1001 | 1056 |
var newFragment = getDocument().createDocumentFragment(); |
1002 | 1057 |
forEach(fragment.querySelectorAll(selector), function (node) { |
... | ... |
@@ -1061,21 +1116,20 @@ return (function () { |
1061 | 1116 |
|
1062 | 1117 |
function findTitle(content) { |
1063 | 1118 |
if (content.indexOf('<title') > -1) { |
1064 |
- var contentWithSvgsRemoved = content.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim, ''); |
|
1065 |
- var result = contentWithSvgsRemoved.match(/<title(\s[^>]*>|>)([\s\S]*?)<\/title>/im); |
|
1066 |
- |
|
1119 |
+ var contentWithSvgsRemoved = content.replace(SVG_TAGS_REGEX, ''); |
|
1120 |
+ var result = contentWithSvgsRemoved.match(TITLE_TAG_REGEX); |
|
1067 | 1121 |
if (result) { |
1068 | 1122 |
return result[2]; |
1069 | 1123 |
} |
1070 | 1124 |
} |
1071 | 1125 |
} |
1072 | 1126 |
|
1073 |
- function selectAndSwap(swapStyle, target, elt, responseText, settleInfo) { |
|
1127 |
+ function selectAndSwap(swapStyle, target, elt, responseText, settleInfo, selectOverride) { |
|
1074 | 1128 |
settleInfo.title = findTitle(responseText); |
1075 | 1129 |
var fragment = makeFragment(responseText); |
1076 | 1130 |
if (fragment) { |
1077 | 1131 |
handleOutOfBandSwaps(elt, fragment, settleInfo); |
1078 |
- fragment = maybeSelectFromResponse(elt, fragment); |
|
1132 |
+ fragment = maybeSelectFromResponse(elt, fragment, selectOverride); |
|
1079 | 1133 |
handlePreservedElements(fragment); |
1080 | 1134 |
return swap(swapStyle, elt, target, fragment, settleInfo); |
1081 | 1135 |
} |
... | ... |
@@ -1095,7 +1149,10 @@ return (function () { |
1095 | 1149 |
} |
1096 | 1150 |
} |
1097 | 1151 |
} else { |
1098 |
- triggerEvent(elt, triggerBody, []); |
|
1152 |
+ var eventNames = triggerBody.split(",") |
|
1153 |
+ for (var i = 0; i < eventNames.length; i++) { |
|
1154 |
+ triggerEvent(elt, eventNames[i].trim(), []); |
|
1155 |
+ } |
|
1099 | 1156 |
} |
1100 | 1157 |
} |
1101 | 1158 |
|
... | ... |
@@ -1105,6 +1162,8 @@ return (function () { |
1105 | 1162 |
var SYMBOL_CONT = /[_$a-zA-Z0-9]/; |
1106 | 1163 |
var STRINGISH_START = ['"', "'", "/"]; |
1107 | 1164 |
var NOT_WHITESPACE = /[^\s]/; |
1165 |
+ var COMBINED_SELECTOR_START = /[{(]/; |
|
1166 |
+ var COMBINED_SELECTOR_END = /[})]/; |
|
1108 | 1167 |
function tokenizeString(str) { |
1109 | 1168 |
var tokens = []; |
1110 | 1169 |
var position = 0; |
... | ... |
@@ -1187,102 +1246,136 @@ return (function () { |
1187 | 1246 |
|
1188 | 1247 |
function consumeUntil(tokens, match) { |
1189 | 1248 |
var result = ""; |
1190 |
- while (tokens.length > 0 && !tokens[0].match(match)) { |
|
1249 |
+ while (tokens.length > 0 && !match.test(tokens[0])) { |
|
1191 | 1250 |
result += tokens.shift(); |
1192 | 1251 |
} |
1193 | 1252 |
return result; |
1194 | 1253 |
} |
1195 | 1254 |
|
1255 |
+ function consumeCSSSelector(tokens) { |
|
1256 |
+ var result; |
|
1257 |
+ if (tokens.length > 0 && COMBINED_SELECTOR_START.test(tokens[0])) { |
|
1258 |
+ tokens.shift(); |
|
1259 |
+ result = consumeUntil(tokens, COMBINED_SELECTOR_END).trim(); |
|
1260 |
+ tokens.shift(); |
|
1261 |
+ } else { |
|
1262 |
+ result = consumeUntil(tokens, WHITESPACE_OR_COMMA); |
|
1263 |
+ } |
|
1264 |
+ return result; |
|
1265 |
+ } |
|
1266 |
+ |
|
1196 | 1267 |
var INPUT_SELECTOR = 'input, textarea, select'; |
1197 | 1268 |
|
1198 | 1269 |
/** |
1199 | 1270 |
* @param {HTMLElement} elt |
1271 |
+ * @param {string} explicitTrigger |
|
1272 |
+ * @param {cache} cache for trigger specs |
|
1200 | 1273 |
* @returns {import("./htmx").HtmxTriggerSpecification[]} |
1201 | 1274 |
*/ |
1202 |
- function getTriggerSpecs(elt) { |
|
1203 |
- var explicitTrigger = getAttributeValue(elt, 'hx-trigger'); |
|
1275 |
+ function parseAndCacheTrigger(elt, explicitTrigger, cache) { |
|
1204 | 1276 |
var triggerSpecs = []; |
1205 |
- if (explicitTrigger) { |
|
1206 |
- var tokens = tokenizeString(explicitTrigger); |
|
1207 |
- do { |
|
1208 |
- consumeUntil(tokens, NOT_WHITESPACE); |
|
1209 |
- var initialLength = tokens.length; |
|
1210 |
- var trigger = consumeUntil(tokens, /[,\[\s]/); |
|
1211 |
- if (trigger !== "") { |
|
1212 |
- if (trigger === "every") { |
|
1213 |
- var every = {trigger: 'every'}; |
|
1214 |
- consumeUntil(tokens, NOT_WHITESPACE); |
|
1215 |
- every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/)); |
|
1216 |
- consumeUntil(tokens, NOT_WHITESPACE); |
|
1217 |
- var eventFilter = maybeGenerateConditional(elt, tokens, "event"); |
|
1218 |
- if (eventFilter) { |
|
1219 |
- every.eventFilter = eventFilter; |
|
1220 |
- } |
|
1221 |
- triggerSpecs.push(every); |
|
1222 |
- } else if (trigger.indexOf("sse:") === 0) { |
|
1223 |
- triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)}); |
|
1224 |
- } else { |
|
1225 |
- var triggerSpec = {trigger: trigger}; |
|
1226 |
- var eventFilter = maybeGenerateConditional(elt, tokens, "event"); |
|
1227 |
- if (eventFilter) { |
|
1228 |
- triggerSpec.eventFilter = eventFilter; |
|
1229 |
- } |
|
1230 |
- while (tokens.length > 0 && tokens[0] !== ",") { |
|
1231 |
- consumeUntil(tokens, NOT_WHITESPACE) |
|
1232 |
- var token = tokens.shift(); |
|
1233 |
- if (token === "changed") { |
|
1234 |
- triggerSpec.changed = true; |
|
1235 |
- } else if (token === "once") { |
|
1236 |
- triggerSpec.once = true; |
|
1237 |
- } else if (token === "consume") { |
|
1238 |
- triggerSpec.consume = true; |
|
1239 |
- } else if (token === "delay" && tokens[0] === ":") { |
|
1240 |
- tokens.shift(); |
|
1241 |
- triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); |
|
1242 |
- } else if (token === "from" && tokens[0] === ":") { |
|
1243 |
- tokens.shift(); |
|
1277 |
+ var tokens = tokenizeString(explicitTrigger); |
|
1278 |
+ do { |
|
1279 |
+ consumeUntil(tokens, NOT_WHITESPACE); |
|
1280 |
+ var initialLength = tokens.length; |
|
1281 |
+ var trigger = consumeUntil(tokens, /[,\[\s]/); |
|
1282 |
+ if (trigger !== "") { |
|
1283 |
+ if (trigger === "every") { |
|
1284 |
+ var every = {trigger: 'every'}; |
|
1285 |
+ consumeUntil(tokens, NOT_WHITESPACE); |
|
1286 |
+ every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/)); |
|
1287 |
+ consumeUntil(tokens, NOT_WHITESPACE); |
|
1288 |
+ var eventFilter = maybeGenerateConditional(elt, tokens, "event"); |
|
1289 |
+ if (eventFilter) { |
|
1290 |
+ every.eventFilter = eventFilter; |
|
1291 |
+ } |
|
1292 |
+ triggerSpecs.push(every); |
|
1293 |
+ } else if (trigger.indexOf("sse:") === 0) { |
|
1294 |
+ triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)}); |
|
1295 |
+ } else { |
|
1296 |
+ var triggerSpec = {trigger: trigger}; |
|
1297 |
+ var eventFilter = maybeGenerateConditional(elt, tokens, "event"); |
|
1298 |
+ if (eventFilter) { |
|
1299 |
+ triggerSpec.eventFilter = eventFilter; |
|
1300 |
+ } |
|
1301 |
+ while (tokens.length > 0 && tokens[0] !== ",") { |
|
1302 |
+ consumeUntil(tokens, NOT_WHITESPACE) |
|
1303 |
+ var token = tokens.shift(); |
|
1304 |
+ if (token === "changed") { |
|
1305 |
+ triggerSpec.changed = true; |
|
1306 |
+ } else if (token === "once") { |
|
1307 |
+ triggerSpec.once = true; |
|
1308 |
+ } else if (token === "consume") { |
|
1309 |
+ triggerSpec.consume = true; |
|
1310 |
+ } else if (token === "delay" && tokens[0] === ":") { |
|
1311 |
+ tokens.shift(); |
|
1312 |
+ triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); |
|
1313 |
+ } else if (token === "from" && tokens[0] === ":") { |
|
1314 |
+ tokens.shift(); |
|
1315 |
+ if (COMBINED_SELECTOR_START.test(tokens[0])) { |
|
1316 |
+ var from_arg = consumeCSSSelector(tokens); |
|
1317 |
+ } else { |
|
1244 | 1318 |
var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA); |
1245 | 1319 |
if (from_arg === "closest" || from_arg === "find" || from_arg === "next" || from_arg === "previous") { |
1246 | 1320 |
tokens.shift(); |
1247 |
- from_arg += |
|
1248 |
- " " + |
|
1249 |
- consumeUntil( |
|
1250 |
- tokens, |
|
1251 |
- WHITESPACE_OR_COMMA |
|
1252 |
- ); |
|
1321 |
+ var selector = consumeCSSSelector(tokens); |
|
1322 |
+ // `next` and `previous` allow a selector-less syntax |
|
1323 |
+ if (selector.length > 0) { |
|
1324 |
+ from_arg += " " + selector; |
|
1325 |
+ } |
|
1253 | 1326 |
} |
1254 |
- triggerSpec.from = from_arg; |
|
1255 |
- } else if (token === "target" && tokens[0] === ":") { |
|
1256 |
- tokens.shift(); |
|
1257 |
- triggerSpec.target = consumeUntil(tokens, WHITESPACE_OR_COMMA); |
|
1258 |
- } else if (token === "throttle" && tokens[0] === ":") { |
|
1259 |
- tokens.shift(); |
|
1260 |
- triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); |
|
1261 |
- } else if (token === "queue" && tokens[0] === ":") { |
|
1262 |
- tokens.shift(); |
|
1263 |
- triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA); |
|
1264 |
- } else if ((token === "root" || token === "threshold") && tokens[0] === ":") { |
|
1265 |
- tokens.shift(); |
|
1266 |
- triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA); |
|
1267 |
- } else { |
|
1268 |
- triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); |
|
1269 | 1327 |
} |
1328 |
+ triggerSpec.from = from_arg; |
|
1329 |
+ } else if (token === "target" && tokens[0] === ":") { |
|
1330 |
+ tokens.shift(); |
|
1331 |
+ triggerSpec.target = consumeCSSSelector(tokens); |
|
1332 |
+ } else if (token === "throttle" && tokens[0] === ":") { |
|
1333 |
+ tokens.shift(); |
|
1334 |
+ triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); |
|
1335 |
+ } else if (token === "queue" && tokens[0] === ":") { |
|
1336 |
+ tokens.shift(); |
|
1337 |
+ triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA); |
|
1338 |
+ } else if (token === "root" && tokens[0] === ":") { |
|
1339 |
+ tokens.shift(); |
|
1340 |
+ triggerSpec[token] = consumeCSSSelector(tokens); |
|
1341 |
+ } else if (token === "threshold" && tokens[0] === ":") { |
|
1342 |
+ tokens.shift(); |
|
1343 |
+ triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA); |
|
1344 |
+ } else { |
|
1345 |
+ triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); |
|
1270 | 1346 |
} |
1271 |
- triggerSpecs.push(triggerSpec); |
|
1272 | 1347 |
} |
1348 |
+ triggerSpecs.push(triggerSpec); |
|
1273 | 1349 |
} |
1274 |
- if (tokens.length === initialLength) { |
|
1275 |
- triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); |
|
1276 |
- } |
|
1277 |
- consumeUntil(tokens, NOT_WHITESPACE); |
|
1278 |
- } while (tokens[0] === "," && tokens.shift()) |
|
1350 |
+ } |
|
1351 |
+ if (tokens.length === initialLength) { |
|
1352 |
+ triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); |
|
1353 |
+ } |
|
1354 |
+ consumeUntil(tokens, NOT_WHITESPACE); |
|
1355 |
+ } while (tokens[0] === "," && tokens.shift()) |
|
1356 |
+ if (cache) { |
|
1357 |
+ cache[explicitTrigger] = triggerSpecs |
|
1358 |
+ } |
|
1359 |
+ return triggerSpecs |
|
1360 |
+ } |
|
1361 |
+ |
|
1362 |
+ /** |
|
1363 |
+ * @param {HTMLElement} elt |
|
1364 |
+ * @returns {import("./htmx").HtmxTriggerSpecification[]} |
|
1365 |
+ */ |
|
1366 |
+ function getTriggerSpecs(elt) { |
|
1367 |
+ var explicitTrigger = getAttributeValue(elt, 'hx-trigger'); |
|
1368 |
+ var triggerSpecs = []; |
|
1369 |
+ if (explicitTrigger) { |
|
1370 |
+ var cache = htmx.config.triggerSpecsCache |
|
1371 |
+ triggerSpecs = (cache && cache[explicitTrigger]) || parseAndCacheTrigger(elt, explicitTrigger, cache) |
|
1279 | 1372 |
} |
1280 | 1373 |
|
1281 | 1374 |
if (triggerSpecs.length > 0) { |
1282 | 1375 |
return triggerSpecs; |
1283 | 1376 |
} else if (matches(elt, 'form')) { |
1284 | 1377 |
return [{trigger: 'submit'}]; |
1285 |
- } else if (matches(elt, 'input[type="button"]')){ |
|
1378 |
+ } else if (matches(elt, 'input[type="button"], input[type="submit"]')){ |
|
1286 | 1379 |
return [{trigger: 'click'}]; |
1287 | 1380 |
} else if (matches(elt, INPUT_SELECTOR)) { |
1288 | 1381 |
return [{trigger: 'change'}]; |
... | ... |
@@ -1299,7 +1392,10 @@ return (function () { |
1299 | 1392 |
var nodeData = getInternalData(elt); |
1300 | 1393 |
nodeData.timeout = setTimeout(function () { |
1301 | 1394 |
if (bodyContains(elt) && nodeData.cancelled !== true) { |
1302 |
- if (!maybeFilterEvent(spec, makeEvent('hx:poll:trigger', {triggerSpec:spec, target:elt}))) { |
|
1395 |
+ if (!maybeFilterEvent(spec, elt, makeEvent('hx:poll:trigger', { |
|
1396 |
+ triggerSpec: spec, |
|
1397 |
+ target: elt |
|
1398 |
+ }))) { |
|
1303 | 1399 |
handler(elt); |
1304 | 1400 |
} |
1305 | 1401 |
processPolling(elt, handler, spec); |
... | ... |
@@ -1319,7 +1415,7 @@ return (function () { |
1319 | 1415 |
var verb, path; |
1320 | 1416 |
if (elt.tagName === "A") { |
1321 | 1417 |
verb = "get"; |
1322 |
- path = elt.href; // DOM property gives the fully resolved href of a relative link |
|
1418 |
+ path = getRawAttribute(elt, 'href') |
|
1323 | 1419 |
} else { |
1324 | 1420 |
var rawAttribute = getRawAttribute(elt, "method"); |
1325 | 1421 |
verb = rawAttribute ? rawAttribute.toLowerCase() : "get"; |
... | ... |
@@ -1329,6 +1425,10 @@ return (function () { |
1329 | 1425 |
} |
1330 | 1426 |
triggerSpecs.forEach(function(triggerSpec) { |
1331 | 1427 |
addEventListener(elt, function(elt, evt) { |
1428 |
+ if (closest(elt, htmx.config.disableSelector)) { |
|
1429 |
+ cleanUpElement(elt) |
|
1430 |
+ return |
|
1431 |
+ } |
|
1332 | 1432 |
issueAjaxRequest(verb, path, elt, evt) |
1333 | 1433 |
}, nodeData, triggerSpec, true); |
1334 | 1434 |
}); |
... | ... |
@@ -1361,11 +1461,11 @@ return (function () { |
1361 | 1461 |
return getInternalData(elt).boosted && elt.tagName === "A" && evt.type === "click" && (evt.ctrlKey || evt.metaKey); |
1362 | 1462 |
} |
1363 | 1463 |
|
1364 |
- function maybeFilterEvent(triggerSpec, evt) { |
|
1464 |
+ function maybeFilterEvent(triggerSpec, elt, evt) { |
|
1365 | 1465 |
var eventFilter = triggerSpec.eventFilter; |
1366 | 1466 |
if(eventFilter){ |
1367 | 1467 |
try { |
1368 |
- return eventFilter(evt) !== true; |
|
1468 |
+ return eventFilter.call(elt, evt) !== true; |
|
1369 | 1469 |
} catch(e) { |
1370 | 1470 |
triggerErrorEvent(getDocument().body, "htmx:eventFilter:error", {error: e, source:eventFilter.source}); |
1371 | 1471 |
return true; |
... | ... |
@@ -1382,9 +1482,12 @@ return (function () { |
1382 | 1482 |
} else { |
1383 | 1483 |
eltsToListenOn = [elt]; |
1384 | 1484 |
} |
1385 |
- // store the initial value of the element so we can tell if it changes |
|
1485 |
+ // store the initial values of the elements, so we can tell if they change |
|
1386 | 1486 |
if (triggerSpec.changed) { |
1387 |
- elementData.lastValue = elt.value; |
|
1487 |
+ eltsToListenOn.forEach(function (eltToListenOn) { |
|
1488 |
+ var eltToListenOnData = getInternalData(eltToListenOn); |
|
1489 |
+ eltToListenOnData.lastValue = eltToListenOn.value; |
|
1490 |
+ }) |
|
1388 | 1491 |
} |
1389 | 1492 |
forEach(eltsToListenOn, function (eltToListenOn) { |
1390 | 1493 |
var eventListener = function (evt) { |
... | ... |
@@ -1398,7 +1501,7 @@ return (function () { |
1398 | 1501 |
if (explicitCancel || shouldCancel(evt, elt)) { |
1399 | 1502 |
evt.preventDefault(); |
1400 | 1503 |
} |
1401 |
- if (maybeFilterEvent(triggerSpec, evt)) { |
|
1504 |
+ if (maybeFilterEvent(triggerSpec, elt, evt)) { |
|
1402 | 1505 |
return; |
1403 | 1506 |
} |
1404 | 1507 |
var eventData = getInternalData(evt); |
... | ... |
@@ -1424,11 +1527,11 @@ return (function () { |
1424 | 1527 |
} |
1425 | 1528 |
} |
1426 | 1529 |
if (triggerSpec.changed) { |
1427 |
- if (elementData.lastValue === elt.value) { |
|
1530 |
+ var eltToListenOnData = getInternalData(eltToListenOn) |
|
1531 |
+ if (eltToListenOnData.lastValue === eltToListenOn.value) { |
|
1428 | 1532 |
return; |
1429 |
- } else { |
|
1430 |
- elementData.lastValue = elt.value; |
|
1431 | 1533 |
} |
1534 |
+ eltToListenOnData.lastValue = eltToListenOn.value |
|
1432 | 1535 |
} |
1433 | 1536 |
if (elementData.delayed) { |
1434 | 1537 |
clearTimeout(elementData.delayed); |
... | ... |
@@ -1437,14 +1540,14 @@ return (function () { |
1437 | 1540 |
return; |
1438 | 1541 |
} |
1439 | 1542 |
|
1440 |
- if (triggerSpec.throttle) { |
|
1543 |
+ if (triggerSpec.throttle > 0) { |
|
1441 | 1544 |
if (!elementData.throttle) { |
1442 | 1545 |
handler(elt, evt); |
1443 | 1546 |
elementData.throttle = setTimeout(function () { |
1444 | 1547 |
elementData.throttle = null; |
1445 | 1548 |
}, triggerSpec.throttle); |
1446 | 1549 |
} |
1447 |
- } else if (triggerSpec.delay) { |
|
1550 |
+ } else if (triggerSpec.delay > 0) { |
|
1448 | 1551 |
elementData.delayed = setTimeout(function() { handler(elt, evt) }, triggerSpec.delay); |
1449 | 1552 |
} else { |
1450 | 1553 |
triggerEvent(elt, 'htmx:trigger') |
... | ... |
@@ -1650,6 +1753,9 @@ return (function () { |
1650 | 1753 |
var sseEventSource = getInternalData(sseSourceElt).sseEventSource; |
1651 | 1754 |
var sseListener = function (event) { |
1652 | 1755 |
if (maybeCloseSSESource(sseSourceElt)) { |
1756 |
+ return; |
|
1757 |
+ } |
|
1758 |
+ if (!bodyContains(elt)) { |
|
1653 | 1759 |
sseEventSource.removeEventListener(sseEventName, sseListener); |
1654 | 1760 |
return; |
1655 | 1761 |
} |
... | ... |
@@ -1666,7 +1772,7 @@ return (function () { |
1666 | 1772 |
var target = getTarget(elt) |
1667 | 1773 |
var settleInfo = makeSettleInfo(elt); |
1668 | 1774 |
|
1669 |
- selectAndSwap(swapSpec.swapStyle, elt, target, response, settleInfo) |
|
1775 |
+ selectAndSwap(swapSpec.swapStyle, target, elt, response, settleInfo) |
|
1670 | 1776 |
settleImmediately(settleInfo.tasks) |
1671 | 1777 |
triggerEvent(elt, "htmx:sseMessage", event) |
1672 | 1778 |
}; |
... | ... |
@@ -1718,7 +1824,7 @@ return (function () { |
1718 | 1824 |
handler(elt); |
1719 | 1825 |
} |
1720 | 1826 |
} |
1721 |
- if (delay) { |
|
1827 |
+ if (delay > 0) { |
|
1722 | 1828 |
setTimeout(load, delay); |
1723 | 1829 |
} else { |
1724 | 1830 |
load(); |
... | ... |
@@ -1735,6 +1841,10 @@ return (function () { |
1735 | 1841 |
nodeData.verb = verb; |
1736 | 1842 |
triggerSpecs.forEach(function(triggerSpec) { |
1737 | 1843 |
addTriggerHandler(elt, triggerSpec, nodeData, function (elt, evt) { |
1844 |
+ if (closest(elt, htmx.config.disableSelector)) { |
|
1845 |
+ cleanUpElement(elt) |
|
1846 |
+ return |
|
1847 |
+ } |
|
1738 | 1848 |
issueAjaxRequest(verb, path, elt, evt) |
1739 | 1849 |
}) |
1740 | 1850 |
}); |
... | ... |
@@ -1770,10 +1880,10 @@ return (function () { |
1770 | 1880 |
observer.observe(elt); |
1771 | 1881 |
addEventListener(elt, handler, nodeData, triggerSpec); |
1772 | 1882 |
} else if (triggerSpec.trigger === "load") { |
1773 |
- if (!maybeFilterEvent(triggerSpec, makeEvent("load", {elt:elt}))) { |
|
1883 |
+ if (!maybeFilterEvent(triggerSpec, elt, makeEvent("load", {elt: elt}))) { |
|
1774 | 1884 |
loadImmediately(elt, handler, nodeData, triggerSpec.delay); |
1775 | 1885 |
} |
1776 |
- } else if (triggerSpec.pollInterval) { |
|
1886 |
+ } else if (triggerSpec.pollInterval > 0) { |
|
1777 | 1887 |
nodeData.polling = true; |
1778 | 1888 |
processPolling(elt, handler, triggerSpec); |
1779 | 1889 |
} else { |
... | ... |
@@ -1782,7 +1892,7 @@ return (function () { |
1782 | 1892 |
} |
1783 | 1893 |
|
1784 | 1894 |
function evalScript(script) { |
1785 |
- if (script.type === "text/javascript" || script.type === "module" || script.type === "") { |
|
1895 |
+ if (htmx.config.allowScriptTags && (script.type === "text/javascript" || script.type === "module" || script.type === "") ) { |
|
1786 | 1896 |
var newScript = getDocument().createElement("script"); |
1787 | 1897 |
forEach(script.attributes, function (attr) { |
1788 | 1898 |
newScript.setAttribute(attr.name, attr.value); |
... | ... |
@@ -1816,14 +1926,46 @@ return (function () { |
1816 | 1926 |
}); |
1817 | 1927 |
} |
1818 | 1928 |
|
1819 |
- function hasChanceOfBeingBoosted() { |
|
1820 |
- return document.querySelector("[hx-boost], [data-hx-boost]"); |
|
1929 |
+ function shouldProcessHxOn(elt) { |
|
1930 |
+ var attributes = elt.attributes |
|
1931 |
+ for (var j = 0; j < attributes.length; j++) { |
|
1932 |
+ var attrName = attributes[j].name |
|
1933 |
+ if (startsWith(attrName, "hx-on:") || startsWith(attrName, "data-hx-on:") || |
|
1934 |
+ startsWith(attrName, "hx-on-") || startsWith(attrName, "data-hx-on-")) { |
|
1935 |
+ return true |
|
1936 |
+ } |
|
1937 |
+ } |
|
1938 |
+ return false |
|
1939 |
+ } |
|
1940 |
+ |
|
1941 |
+ function findHxOnWildcardElements(elt) { |
|
1942 |
+ var node = null |
|
1943 |
+ var elements = [] |
|
1944 |
+ |
|
1945 |
+ if (shouldProcessHxOn(elt)) { |
|
1946 |
+ elements.push(elt) |
|
1947 |
+ } |
|
1948 |
+ |
|
1949 |
+ if (document.evaluate) { |
|
1950 |
+ var iter = document.evaluate('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or' + |
|
1951 |
+ ' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]', elt) |
|
1952 |
+ while (node = iter.iterateNext()) elements.push(node) |
|
1953 |
+ } else { |
|
1954 |
+ var allElements = elt.getElementsByTagName("*") |
|
1955 |
+ for (var i = 0; i < allElements.length; i++) { |
|
1956 |
+ if (shouldProcessHxOn(allElements[i])) { |
|
1957 |
+ elements.push(allElements[i]) |
|
1958 |
+ } |
|
1959 |
+ } |
|
1960 |
+ } |
|
1961 |
+ |
|
1962 |
+ return elements |
|
1821 | 1963 |
} |
1822 | 1964 |
|
1823 | 1965 |
function findElementsToProcess(elt) { |
1824 | 1966 |
if (elt.querySelectorAll) { |
1825 |
- var boostedElts = hasChanceOfBeingBoosted() ? ", a, form" : ""; |
|
1826 |
- var results = elt.querySelectorAll(VERB_SELECTOR + boostedElts + ", [hx-sse], [data-hx-sse], [hx-ws]," + |
|
1967 |
+ var boostedSelector = ", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]"; |
|
1968 |
+ var results = elt.querySelectorAll(VERB_SELECTOR + boostedSelector + ", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws]," + |
|
1827 | 1969 |
" [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]"); |
1828 | 1970 |
return results; |
1829 | 1971 |
} else { |
... | ... |
@@ -1831,31 +1973,45 @@ return (function () { |
1831 | 1973 |
} |
1832 | 1974 |
} |
1833 | 1975 |
|
1834 |
- function initButtonTracking(form){ |
|
1835 |
- var maybeSetLastButtonClicked = function(evt){ |
|
1836 |
- var elt = closest(evt.target, "button, input[type='submit']"); |
|
1837 |
- if (elt !== null) { |
|
1838 |
- var internalData = getInternalData(form); |
|
1839 |
- internalData.lastButtonClicked = elt; |
|
1840 |
- } |
|
1841 |
- }; |
|
1842 |
- |
|
1976 |
+ // Handle submit buttons/inputs that have the form attribute set |
|
1977 |
+ // see https://developer.mozilla.org/docs/Web/HTML/Element/button |
|
1978 |
+ function maybeSetLastButtonClicked(evt) { |
|
1979 |
+ var elt = closest(evt.target, "button, input[type='submit']"); |
|
1980 |
+ var internalData = getRelatedFormData(evt) |
|
1981 |
+ if (internalData) { |
|
1982 |
+ internalData.lastButtonClicked = elt; |
|
1983 |
+ } |
|
1984 |
+ }; |
|
1985 |
+ function maybeUnsetLastButtonClicked(evt){ |
|
1986 |
+ var internalData = getRelatedFormData(evt) |
|
1987 |
+ if (internalData) { |
|
1988 |
+ internalData.lastButtonClicked = null; |
|
1989 |
+ } |
|
1990 |
+ } |
|
1991 |
+ function getRelatedFormData(evt) { |
|
1992 |
+ var elt = closest(evt.target, "button, input[type='submit']"); |
|
1993 |
+ if (!elt) { |
|
1994 |
+ return; |
|
1995 |
+ } |
|
1996 |
+ var form = resolveTarget('#' + getRawAttribute(elt, 'form')) || closest(elt, 'form'); |
|
1997 |
+ if (!form) { |
|
1998 |
+ return; |
|
1999 |
+ } |
|
2000 |
+ return getInternalData(form); |
|
2001 |
+ } |
|
2002 |
+ function initButtonTracking(elt) { |
|
1843 | 2003 |
// need to handle both click and focus in: |
1844 | 2004 |
// focusin - in case someone tabs in to a button and hits the space bar |
1845 | 2005 |
// click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724 |
1846 |
- |
|
1847 |
- form.addEventListener('click', maybeSetLastButtonClicked) |
|
1848 |
- form.addEventListener('focusin', maybeSetLastButtonClicked) |
|
1849 |
- form.addEventListener('focusout', function(evt){ |
|
1850 |
- var internalData = getInternalData(form); |
|
1851 |
- internalData.lastButtonClicked = null; |
|
1852 |
- }) |
|
2006 |
+ elt.addEventListener('click', maybeSetLastButtonClicked) |
|
2007 |
+ elt.addEventListener('focusin', maybeSetLastButtonClicked) |
|
2008 |
+ elt.addEventListener('focusout', maybeUnsetLastButtonClicked) |
|
1853 | 2009 |
} |
1854 | 2010 |
|
1855 | 2011 |
function countCurlies(line) { |
1856 | 2012 |
var tokens = tokenizeString(line); |
1857 | 2013 |
var netCurlies = 0; |
1858 |
- for (let i = 0; i < tokens.length; i++) { |
|
2014 |
+ for (var i = 0; i < tokens.length; i++) { |
|
1859 | 2015 |
const token = tokens[i]; |
1860 | 2016 |
if (token === "{") { |
1861 | 2017 |
netCurlies++; |
... | ... |
@@ -1868,13 +2024,20 @@ return (function () { |
1868 | 2024 |
|
1869 | 2025 |
function addHxOnEventHandler(elt, eventName, code) { |
1870 | 2026 |
var nodeData = getInternalData(elt); |
1871 |
- nodeData.onHandlers = []; |
|
1872 |
- var func = new Function("event", code + "; return;"); |
|
1873 |
- var listener = elt.addEventListener(eventName, function (e) { |
|
1874 |
- return func.call(elt, e); |
|
1875 |
- }); |
|
2027 |
+ if (!Array.isArray(nodeData.onHandlers)) { |
|
2028 |
+ nodeData.onHandlers = []; |
|
2029 |
+ } |
|
2030 |
+ var func; |
|
2031 |
+ var listener = function (e) { |
|
2032 |
+ return maybeEval(elt, function() { |
|
2033 |
+ if (!func) { |
|
2034 |
+ func = new Function("event", code); |
|
2035 |
+ } |
|
2036 |
+ func.call(elt, e); |
|
2037 |
+ }); |
|
2038 |
+ }; |
|
2039 |
+ elt.addEventListener(eventName, listener); |
|
1876 | 2040 |
nodeData.onHandlers.push({event:eventName, listener:listener}); |
1877 |
- return {nodeData, code, func, listener}; |
|
1878 | 2041 |
} |
1879 | 2042 |
|
1880 | 2043 |
function processHxOn(elt) { |
... | ... |
@@ -1886,7 +2049,7 @@ return (function () { |
1886 | 2049 |
var curlyCount = 0; |
1887 | 2050 |
while (lines.length > 0) { |
1888 | 2051 |
var line = lines.shift(); |
1889 |
- var match = line.match(/^\s*([a-zA-Z:\-]+:)(.*)/); |
|
2052 |
+ var match = line.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/); |
|
1890 | 2053 |
if (curlyCount === 0 && match) { |
1891 | 2054 |
line.split(":") |
1892 | 2055 |
currentEvent = match[1].slice(0, -1); // strip last colon |
... | ... |
@@ -1903,18 +2066,45 @@ return (function () { |
1903 | 2066 |
} |
1904 | 2067 |
} |
1905 | 2068 |
|
2069 |
+ function processHxOnWildcard(elt) { |
|
2070 |
+ // wipe any previous on handlers so that this function takes precedence |
|
2071 |
+ deInitOnHandlers(elt) |
|
2072 |
+ |
|
2073 |
+ for (var i = 0; i < elt.attributes.length; i++) { |
|
2074 |
+ var name = elt.attributes[i].name |
|
2075 |
+ var value = elt.attributes[i].value |
|
2076 |
+ if (startsWith(name, "hx-on") || startsWith(name, "data-hx-on")) { |
|
2077 |
+ var afterOnPosition = name.indexOf("-on") + 3; |
|
2078 |
+ var nextChar = name.slice(afterOnPosition, afterOnPosition + 1); |
|
2079 |
+ if (nextChar === "-" || nextChar === ":") { |
|
2080 |
+ var eventName = name.slice(afterOnPosition + 1); |
|
2081 |
+ // if the eventName starts with a colon or dash, prepend "htmx" for shorthand support |
|
2082 |
+ if (startsWith(eventName, ":")) { |
|
2083 |
+ eventName = "htmx" + eventName |
|
2084 |
+ } else if (startsWith(eventName, "-")) { |
|
2085 |
+ eventName = "htmx:" + eventName.slice(1); |
|
2086 |
+ } else if (startsWith(eventName, "htmx-")) { |
|
2087 |
+ eventName = "htmx:" + eventName.slice(5); |
|
2088 |
+ } |
|
2089 |
+ |
|
2090 |
+ addHxOnEventHandler(elt, eventName, value) |
|
2091 |
+ } |
|
2092 |
+ } |
|
2093 |
+ } |
|
2094 |
+ } |
|
2095 |
+ |
|
1906 | 2096 |
function initNode(elt) { |
1907 |
- if (elt.closest && elt.closest(htmx.config.disableSelector)) { |
|
2097 |
+ if (closest(elt, htmx.config.disableSelector)) { |
|
2098 |
+ cleanUpElement(elt) |
|
1908 | 2099 |
return; |
1909 | 2100 |
} |
1910 | 2101 |
var nodeData = getInternalData(elt); |
1911 | 2102 |
if (nodeData.initHash !== attributeHash(elt)) { |
1912 |
- |
|
1913 |
- nodeData.initHash = attributeHash(elt); |
|
1914 |
- |
|
1915 | 2103 |
// clean up any previously processed info |
1916 | 2104 |
deInitNode(elt); |
1917 | 2105 |
|
2106 |
+ nodeData.initHash = attributeHash(elt); |
|
2107 |
+ |
|
1918 | 2108 |
processHxOn(elt); |
1919 | 2109 |
|
1920 | 2110 |
triggerEvent(elt, "htmx:beforeProcessNode") |
... | ... |
@@ -1938,8 +2128,10 @@ return (function () { |
1938 | 2128 |
} |
1939 | 2129 |
} |
1940 | 2130 |
|
1941 |
- if (elt.tagName === "FORM") { |
|
1942 |
- initButtonTracking(elt); |
|
2131 |
+ // Handle submit buttons/inputs that have the form attribute set |
|
2132 |
+ // see https://developer.mozilla.org/docs/Web/HTML/Element/button |
|
2133 |
+ if (elt.tagName === "FORM" || (getRawAttribute(elt, "type") === "submit" && hasAttribute(elt, "form"))) { |
|
2134 |
+ initButtonTracking(elt) |
|
1943 | 2135 |
} |
1944 | 2136 |
|
1945 | 2137 |
var sseInfo = getAttributeValue(elt, 'hx-sse'); |
... | ... |
@@ -1957,8 +2149,15 @@ return (function () { |
1957 | 2149 |
|
1958 | 2150 |
function processNode(elt) { |
1959 | 2151 |
elt = resolveTarget(elt); |
2152 |
+ if (closest(elt, htmx.config.disableSelector)) { |
|
2153 |
+ cleanUpElement(elt) |
|
2154 |
+ return; |
|
2155 |
+ } |
|
1960 | 2156 |
initNode(elt); |
1961 | 2157 |
forEach(findElementsToProcess(elt), function(child) { initNode(child) }); |
2158 |
+ // Because it happens second, the new way of adding onHandlers superseeds the old one |
|
2159 |
+ // i.e. if there are any hx-on:eventName attributes, the hx-on attribute will be ignored |
|
2160 |
+ forEach(findHxOnWildcardElements(elt), processHxOnWildcard); |
|
1962 | 2161 |
} |
1963 | 2162 |
|
1964 | 2163 |
//==================================================================== |
... | ... |
@@ -2036,7 +2235,7 @@ return (function () { |
2036 | 2235 |
eventResult = eventResult && elt.dispatchEvent(kebabedEvent) |
2037 | 2236 |
} |
2038 | 2237 |
withExtensions(elt, function (extension) { |
2039 |
- eventResult = eventResult && (extension.onEvent(eventName, event) !== false) |
|
2238 |
+ eventResult = eventResult && (extension.onEvent(eventName, event) !== false && !event.defaultPrevented) |
|
2040 | 2239 |
}); |
2041 | 2240 |
return eventResult; |
2042 | 2241 |
} |
... | ... |
@@ -2056,6 +2255,12 @@ return (function () { |
2056 | 2255 |
return; |
2057 | 2256 |
} |
2058 | 2257 |
|
2258 |
+ if (htmx.config.historyCacheSize <= 0) { |
|
2259 |
+ // make sure that an eventually already existing cache is purged |
|
2260 |
+ localStorage.removeItem("htmx-history-cache"); |
|
2261 |
+ return; |
|
2262 |
+ } |
|
2263 |
+ |
|
2059 | 2264 |
url = normalizePath(url); |
2060 | 2265 |
|
2061 | 2266 |
var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; |
... | ... |
@@ -2116,7 +2321,13 @@ return (function () { |
2116 | 2321 |
// so we can prevent privileged data entering the cache. |
2117 | 2322 |
// The page will still be reachable as a history entry, but htmx will fetch it |
2118 | 2323 |
// live from the server onpopstate rather than look in the localStorage cache |
2119 |
- var disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]'); |
|
2324 |
+ var disableHistoryCache |
|
2325 |
+ try { |
|
2326 |
+ disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]') |
|
2327 |
+ } catch (e) { |
|
2328 |
+ // IE11: insensitive modifier not supported so fallback to case sensitive selector |
|
2329 |
+ disableHistoryCache = getDocument().querySelector('[hx-history="false"],[data-hx-history="false"]') |
|
2330 |
+ } |
|
2120 | 2331 |
if (!disableHistoryCache) { |
2121 | 2332 |
triggerEvent(getDocument().body, "htmx:beforeHistorySave", {path: path, historyElt: elt}); |
2122 | 2333 |
saveToHistoryCache(path, cleanInnerHtmlForHistory(elt), getDocument().title, window.scrollY); |
... | ... |
@@ -2129,7 +2340,7 @@ return (function () { |
2129 | 2340 |
// remove the cache buster parameter, if any |
2130 | 2341 |
if (htmx.config.getCacheBusterParam) { |
2131 | 2342 |
path = path.replace(/org\.htmx\.cache-buster=[^&]*&?/, '') |
2132 |
- if (path.endsWith('&') || path.endsWith("?")) { |
|
2343 |
+ if (endsWith(path, '&') || endsWith(path, "?")) { |
|
2133 | 2344 |
path = path.slice(0, -1); |
2134 | 2345 |
} |
2135 | 2346 |
} |
... | ... |
@@ -2155,7 +2366,9 @@ return (function () { |
2155 | 2366 |
var details = {path: path, xhr:request}; |
2156 | 2367 |
triggerEvent(getDocument().body, "htmx:historyCacheMiss", details); |
2157 | 2368 |
request.open('GET', path, true); |
2369 |
+ request.setRequestHeader("HX-Request", "true"); |
|
2158 | 2370 |
request.setRequestHeader("HX-History-Restore-Request", "true"); |
2371 |
+ request.setRequestHeader("HX-Current-URL", getDocument().location.href); |
|
2159 | 2372 |
request.onload = function () { |
2160 | 2373 |
if (this.status >= 200 && this.status < 400) { |
2161 | 2374 |
triggerEvent(getDocument().body, "htmx:historyCacheMissLoad", details); |
... | ... |
@@ -2196,7 +2409,9 @@ return (function () { |
2196 | 2409 |
swapInnerHTML(historyElement, fragment, settleInfo) |
2197 | 2410 |
settleImmediately(settleInfo.tasks); |
2198 | 2411 |
document.title = cached.title; |
2199 |
- window.scrollTo(0, cached.scroll); |
|
2412 |
+ setTimeout(function () { |
|
2413 |
+ window.scrollTo(0, cached.scroll); |
|
2414 |
+ }, 0); // next 'tick', so browser has time to render layout |
|
2200 | 2415 |
currentPathForHistory = path; |
2201 | 2416 |
triggerEvent(getDocument().body, "htmx:historyRestore", {path:path, item:cached}); |
2202 | 2417 |
} else { |
... | ... |
@@ -2223,7 +2438,20 @@ return (function () { |
2223 | 2438 |
return indicators; |
2224 | 2439 |
} |
2225 | 2440 |
|
2226 |
- function removeRequestIndicatorClasses(indicators) { |
|
2441 |
+ function disableElements(elt) { |
|
2442 |
+ var disabledElts = findAttributeTargets(elt, 'hx-disabled-elt'); |
|
2443 |
+ if (disabledElts == null) { |
|
2444 |
+ disabledElts = []; |
|
2445 |
+ } |
|
2446 |
+ forEach(disabledElts, function (disabledElement) { |
|
2447 |
+ var internalData = getInternalData(disabledElement); |
|
2448 |
+ internalData.requestCount = (internalData.requestCount || 0) + 1; |
|
2449 |
+ disabledElement.setAttribute("disabled", ""); |
|
2450 |
+ }); |
|
2451 |
+ return disabledElts; |
|
2452 |
+ } |
|
2453 |
+ |
|
2454 |
+ function removeRequestIndicators(indicators, disabled) { |
|
2227 | 2455 |
forEach(indicators, function (ic) { |
2228 | 2456 |
var internalData = getInternalData(ic); |
2229 | 2457 |
internalData.requestCount = (internalData.requestCount || 0) - 1; |
... | ... |
@@ -2231,6 +2459,13 @@ return (function () { |
2231 | 2459 |
ic.classList["remove"].call(ic.classList, htmx.config.requestClass); |
2232 | 2460 |
} |
2233 | 2461 |
}); |
2462 |
+ forEach(disabled, function (disabledElement) { |
|
2463 |
+ var internalData = getInternalData(disabledElement); |
|
2464 |
+ internalData.requestCount = (internalData.requestCount || 0) - 1; |
|
2465 |
+ if (internalData.requestCount === 0) { |
|
2466 |
+ disabledElement.removeAttribute('disabled'); |
|
2467 |
+ } |
|
2468 |
+ }); |
|
2234 | 2469 |
} |
2235 | 2470 |
|
2236 | 2471 |
//==================================================================== |
... | ... |
@@ -2248,7 +2483,7 @@ return (function () { |
2248 | 2483 |
} |
2249 | 2484 |
|
2250 | 2485 |
function shouldInclude(elt) { |
2251 |
- if(elt.name === "" || elt.name == null || elt.disabled) { |
|
2486 |
+ if(elt.name === "" || elt.name == null || elt.disabled || closest(elt, "fieldset[disabled]")) { |
|
2252 | 2487 |
return false; |
2253 | 2488 |
} |
2254 | 2489 |
// ignore "submitter" types (see jQuery src/serialize.js) |
... | ... |
@@ -2261,6 +2496,29 @@ return (function () { |
2261 | 2496 |
return true; |
2262 | 2497 |
} |
2263 | 2498 |
|
2499 |
+ function addValueToValues(name, value, values) { |
|
2500 |
+ // This is a little ugly because both the current value of the named value in the form |
|
2501 |
+ // and the new value could be arrays, so we have to handle all four cases :/ |
|
2502 |
+ if (name != null && value != null) { |
|
2503 |
+ var current = values[name]; |
|
2504 |
+ if (current === undefined) { |
|
2505 |
+ values[name] = value; |
|
2506 |
+ } else if (Array.isArray(current)) { |
|
2507 |
+ if (Array.isArray(value)) { |
|
2508 |
+ values[name] = current.concat(value); |
|
2509 |
+ } else { |
|
2510 |
+ current.push(value); |
|
2511 |
+ } |
|
2512 |
+ } else { |
|
2513 |
+ if (Array.isArray(value)) { |
|
2514 |
+ values[name] = [current].concat(value); |
|
2515 |
+ } else { |
|
2516 |
+ values[name] = [current, value]; |
|
2517 |
+ } |
|
2518 |
+ } |
|
2519 |
+ } |
|
2520 |
+ } |
|
2521 |
+ |
|
2264 | 2522 |
function processInputValue(processed, values, errors, elt, validate) { |
2265 | 2523 |
if (elt == null || haveSeenNode(processed, elt)) { |
2266 | 2524 |
return; |
... | ... |
@@ -2270,35 +2528,14 @@ return (function () { |
2270 | 2528 |
if (shouldInclude(elt)) { |
2271 | 2529 |
var name = getRawAttribute(elt,"name"); |
2272 | 2530 |
var value = elt.value; |
2273 |
- if (elt.multiple) { |
|
2531 |
+ if (elt.multiple && elt.tagName === "SELECT") { |
|
2274 | 2532 |
value = toArray(elt.querySelectorAll("option:checked")).map(function (e) { return e.value }); |
2275 | 2533 |
} |
2276 | 2534 |
// include file inputs |
2277 | 2535 |
if (elt.files) { |
2278 | 2536 |
value = toArray(elt.files); |
2279 | 2537 |
} |
2280 |
- // This is a little ugly because both the current value of the named value in the form |
|
2281 |
- // and the new value could be arrays, so we have to handle all four cases :/ |
|
2282 |
- if (name != null && value != null) { |
|
2283 |
- var current = values[name]; |
|
2284 |
- if (current !== undefined) { |
|
2285 |
- if (Array.isArray(current)) { |
|
2286 |
- if (Array.isArray(value)) { |
|
2287 |
- values[name] = current.concat(value); |
|
2288 |
- } else { |
|
2289 |
- current.push(value); |
|
2290 |
- } |
|
2291 |
- } else { |
|
2292 |
- if (Array.isArray(value)) { |
|
2293 |
- values[name] = [current].concat(value); |
|
2294 |
- } else { |
|
2295 |
- values[name] = [current, value]; |
|
2296 |
- } |
|
2297 |
- } |
|
2298 |
- } else { |
|
2299 |
- values[name] = value; |
|
2300 |
- } |
|
2301 |
- } |
|
2538 |
+ addValueToValues(name, value, values); |
|
2302 | 2539 |
if (validate) { |
2303 | 2540 |
validateElement(elt, errors); |
2304 | 2541 |
} |
... | ... |
@@ -2331,6 +2568,9 @@ return (function () { |
2331 | 2568 |
var formValues = {}; |
2332 | 2569 |
var errors = []; |
2333 | 2570 |
var internalData = getInternalData(elt); |
2571 |
+ if (internalData.lastButtonClicked && !bodyContains(internalData.lastButtonClicked)) { |
|
2572 |
+ internalData.lastButtonClicked = null |
|
2573 |
+ } |
|
2334 | 2574 |
|
2335 | 2575 |
// only validate when form is directly submitted and novalidate or formnovalidate are not set |
2336 | 2576 |
// or if the element has an explicit hx-validate="true" on it |
... | ... |
@@ -2348,11 +2588,11 @@ return (function () { |
2348 | 2588 |
processInputValue(processed, values, errors, elt, validate); |
2349 | 2589 |
|
2350 | 2590 |
// if a button or submit was clicked last, include its value |
2351 |
- if (internalData.lastButtonClicked) { |
|
2352 |
- var name = getRawAttribute(internalData.lastButtonClicked,"name"); |
|
2353 |
- if (name) { |
|
2354 |
- values[name] = internalData.lastButtonClicked.value; |
|
2355 |
- } |
|
2591 |
+ if (internalData.lastButtonClicked || elt.tagName === "BUTTON" || |
|
2592 |
+ (elt.tagName === "INPUT" && getRawAttribute(elt, "type") === "submit")) { |
|
2593 |
+ var button = internalData.lastButtonClicked || elt |
|
2594 |
+ var name = getRawAttribute(button, "name") |
|
2595 |
+ addValueToValues(name, button.value, formValues) |
|
2356 | 2596 |
} |
2357 | 2597 |
|
2358 | 2598 |
// include any explicit includes |
... | ... |
@@ -2498,43 +2738,43 @@ return (function () { |
2498 | 2738 |
"swapDelay" : htmx.config.defaultSwapDelay, |
2499 | 2739 |
"settleDelay" : htmx.config.defaultSettleDelay |
2500 | 2740 |
} |
2501 |
- if (getInternalData(elt).boosted && !isAnchorLink(elt)) { |
|
2741 |
+ if (htmx.config.scrollIntoViewOnBoost && getInternalData(elt).boosted && !isAnchorLink(elt)) { |
|
2502 | 2742 |
swapSpec["show"] = "top" |
2503 | 2743 |
} |
2504 | 2744 |
if (swapInfo) { |
2505 | 2745 |
var split = splitOnWhitespace(swapInfo); |
2506 | 2746 |
if (split.length > 0) { |
2507 |
- swapSpec["swapStyle"] = split[0]; |
|
2508 |
- for (var i = 1; i < split.length; i++) { |
|
2509 |
- var modifier = split[i]; |
|
2510 |
- if (modifier.indexOf("swap:") === 0) { |
|
2511 |
- swapSpec["swapDelay"] = parseInterval(modifier.substr(5)); |
|
2512 |
- } |
|
2513 |
- if (modifier.indexOf("settle:") === 0) { |
|
2514 |
- swapSpec["settleDelay"] = parseInterval(modifier.substr(7)); |
|
2515 |
- } |
|
2516 |
- if (modifier.indexOf("transition:") === 0) { |
|
2517 |
- swapSpec["transition"] = modifier.substr(11) === "true"; |
|
2518 |
- } |
|
2519 |
- if (modifier.indexOf("scroll:") === 0) { |
|
2520 |
- var scrollSpec = modifier.substr(7); |
|
2747 |
+ for (var i = 0; i < split.length; i++) { |
|
2748 |
+ var value = split[i]; |
|
2749 |
+ if (value.indexOf("swap:") === 0) { |
|
2750 |
+ swapSpec["swapDelay"] = parseInterval(value.substr(5)); |
|
2751 |
+ } else if (value.indexOf("settle:") === 0) { |
|
2752 |
+ swapSpec["settleDelay"] = parseInterval(value.substr(7)); |
|
2753 |
+ } else if (value.indexOf("transition:") === 0) { |
|
2754 |
+ swapSpec["transition"] = value.substr(11) === "true"; |
|
2755 |
+ } else if (value.indexOf("ignoreTitle:") === 0) { |
|
2756 |
+ swapSpec["ignoreTitle"] = value.substr(12) === "true"; |
|
2757 |
+ } else if (value.indexOf("scroll:") === 0) { |
|
2758 |
+ var scrollSpec = value.substr(7); |
|
2521 | 2759 |
var splitSpec = scrollSpec.split(":"); |
2522 | 2760 |
var scrollVal = splitSpec.pop(); |
2523 | 2761 |
var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; |
2524 | 2762 |
swapSpec["scroll"] = scrollVal; |
2525 | 2763 |
swapSpec["scrollTarget"] = selectorVal; |
2526 |
- } |
|
2527 |
- if (modifier.indexOf("show:") === 0) { |
|
2528 |
- var showSpec = modifier.substr(5); |
|
2764 |
+ } else if (value.indexOf("show:") === 0) { |
|
2765 |
+ var showSpec = value.substr(5); |
|
2529 | 2766 |
var splitSpec = showSpec.split(":"); |
2530 | 2767 |
var showVal = splitSpec.pop(); |
2531 | 2768 |
var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; |
2532 | 2769 |
swapSpec["show"] = showVal; |
2533 | 2770 |
swapSpec["showTarget"] = selectorVal; |
2534 |
- } |
|
2535 |
- if (modifier.indexOf("focus-scroll:") === 0) { |
|
2536 |
- var focusScrollVal = modifier.substr("focus-scroll:".length); |
|
2771 |
+ } else if (value.indexOf("focus-scroll:") === 0) { |
|
2772 |
+ var focusScrollVal = value.substr("focus-scroll:".length); |
|
2537 | 2773 |
swapSpec["focusScroll"] = focusScrollVal == "true"; |
2774 |
+ } else if (i == 0) { |
|
2775 |
+ swapSpec["swapStyle"] = value; |
|
2776 |
+ } else { |
|
2777 |
+ logError('Unknown modifier in hx-swap: ' + value); |
|
2538 | 2778 |
} |
2539 | 2779 |
} |
2540 | 2780 |
} |
... | ... |
@@ -2719,7 +2959,7 @@ return (function () { |
2719 | 2959 |
} |
2720 | 2960 |
|
2721 | 2961 |
function hasHeader(xhr, regexp) { |
2722 |
- return xhr.getAllResponseHeaders().match(regexp); |
|
2962 |
+ return regexp.test(xhr.getAllResponseHeaders()) |
|
2723 | 2963 |
} |
2724 | 2964 |
|
2725 | 2965 |
function ajaxHelper(verb, path, context) { |
... | ... |
@@ -2738,6 +2978,7 @@ return (function () { |
2738 | 2978 |
values : context.values, |
2739 | 2979 |
targetOverride: resolveTarget(context.target), |
2740 | 2980 |
swapOverride: context.swap, |
2981 |
+ select: context.select, |
|
2741 | 2982 |
returnPromise: true |
2742 | 2983 |
}); |
2743 | 2984 |
} |
... | ... |
@@ -2757,6 +2998,27 @@ return (function () { |
2757 | 2998 |
return arr; |
2758 | 2999 |
} |
2759 | 3000 |
|
3001 |
+ function verifyPath(elt, path, requestConfig) { |
|
3002 |
+ var sameHost |
|
3003 |
+ var url |
|
3004 |
+ if (typeof URL === "function") { |
|
3005 |
+ url = new URL(path, document.location.href); |
|
3006 |
+ var origin = document.location.origin; |
|
3007 |
+ sameHost = origin === url.origin; |
|
3008 |
+ } else { |
|
3009 |
+ // IE11 doesn't support URL |
|
3010 |
+ url = path |
|
3011 |
+ sameHost = startsWith(path, document.location.origin) |
|
3012 |
+ } |
|
3013 |
+ |
|
3014 |
+ if (htmx.config.selfRequestsOnly) { |
|
3015 |
+ if (!sameHost) { |
|
3016 |
+ return false; |
|
3017 |
+ } |
|
3018 |
+ } |
|
3019 |
+ return triggerEvent(elt, "htmx:validateUrl", mergeObjects({url: url, sameHost: sameHost}, requestConfig)); |
|
3020 |
+ } |
|
3021 |
+ |
|
2760 | 3022 |
function issueAjaxRequest(verb, path, elt, event, etc, confirmed) { |
2761 | 3023 |
var resolve = null; |
2762 | 3024 |
var reject = null; |
... | ... |
@@ -2771,29 +3033,52 @@ return (function () { |
2771 | 3033 |
elt = getDocument().body; |
2772 | 3034 |
} |
2773 | 3035 |
var responseHandler = etc.handler || handleAjaxResponse; |
3036 |
+ var select = etc.select || null; |
|
2774 | 3037 |
|
2775 | 3038 |
if (!bodyContains(elt)) { |
2776 |
- return; // do not issue requests for elements removed from the DOM |
|
3039 |
+ // do not issue requests for elements removed from the DOM |
|
3040 |
+ maybeCall(resolve); |
|
3041 |
+ return promise; |
|
2777 | 3042 |
} |
2778 | 3043 |
var target = etc.targetOverride || getTarget(elt); |
2779 | 3044 |
if (target == null || target == DUMMY_ELT) { |
2780 | 3045 |
triggerErrorEvent(elt, 'htmx:targetError', {target: getAttributeValue(elt, "hx-target")}); |
2781 |
- return; |
|
3046 |
+ maybeCall(reject); |
|
3047 |
+ return promise; |
|
3048 |
+ } |
|
3049 |
+ |
|
3050 |
+ var eltData = getInternalData(elt); |
|
3051 |
+ var submitter = eltData.lastButtonClicked; |
|
3052 |
+ |
|
3053 |
+ if (submitter) { |
|
3054 |
+ var buttonPath = getRawAttribute(submitter, "formaction"); |
|
3055 |
+ if (buttonPath != null) { |
|
3056 |
+ path = buttonPath; |
|
3057 |
+ } |
|
3058 |
+ |
|
3059 |
+ var buttonVerb = getRawAttribute(submitter, "formmethod") |
|
3060 |
+ if (buttonVerb != null) { |
|
3061 |
+ // ignore buttons with formmethod="dialog" |
|
3062 |
+ if (buttonVerb.toLowerCase() !== "dialog") { |
|
3063 |
+ verb = buttonVerb; |
|
3064 |
+ } |
|
3065 |
+ } |
|
2782 | 3066 |
} |
2783 | 3067 |
|
3068 |
+ var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm"); |
|
2784 | 3069 |
// allow event-based confirmation w/ a callback |
2785 |
- if (!confirmed) { |
|
2786 |
- var issueRequest = function() { |
|
2787 |
- return issueAjaxRequest(verb, path, elt, event, etc, true); |
|
3070 |
+ if (confirmed === undefined) { |
|
3071 |
+ var issueRequest = function(skipConfirmation) { |
|
3072 |
+ return issueAjaxRequest(verb, path, elt, event, etc, !!skipConfirmation); |
|
2788 | 3073 |
} |
2789 |
- var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest}; |
|
3074 |
+ var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest, question: confirmQuestion}; |
|
2790 | 3075 |
if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) { |
2791 |
- return; |
|
3076 |
+ maybeCall(resolve); |
|
3077 |
+ return promise; |
|
2792 | 3078 |
} |
2793 | 3079 |
} |
2794 | 3080 |
|
2795 | 3081 |
var syncElt = elt; |
2796 |
- var eltData = getInternalData(elt); |
|
2797 | 3082 |
var syncStrategy = getClosestAttributeValue(elt, "hx-sync"); |
2798 | 3083 |
var queueStrategy = null; |
2799 | 3084 |
var abortable = false; |
... | ... |
@@ -2809,10 +3094,12 @@ return (function () { |
2809 | 3094 |
syncStrategy = (syncStrings[1] || 'drop').trim(); |
2810 | 3095 |
eltData = getInternalData(syncElt); |
2811 | 3096 |
if (syncStrategy === "drop" && eltData.xhr && eltData.abortable !== true) { |
2812 |
- return; |
|
3097 |
+ maybeCall(resolve); |
|
3098 |
+ return promise; |
|
2813 | 3099 |
} else if (syncStrategy === "abort") { |
2814 | 3100 |
if (eltData.xhr) { |
2815 |
- return; |
|
3101 |
+ maybeCall(resolve); |
|
3102 |
+ return promise; |
|
2816 | 3103 |
} else { |
2817 | 3104 |
abortable = true; |
2818 | 3105 |
} |
... | ... |
@@ -2856,7 +3143,8 @@ return (function () { |
2856 | 3143 |
issueAjaxRequest(verb, path, elt, event, etc) |
2857 | 3144 |
}); |
2858 | 3145 |
} |
2859 |
- return; |
|
3146 |
+ maybeCall(resolve); |
|
3147 |
+ return promise; |
|
2860 | 3148 |
} |
2861 | 3149 |
} |
2862 | 3150 |
|
... | ... |
@@ -2884,8 +3172,7 @@ return (function () { |
2884 | 3172 |
} |
2885 | 3173 |
} |
2886 | 3174 |
|
2887 |
- var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm"); |
|
2888 |
- if (confirmQuestion) { |
|
3175 |
+ if (confirmQuestion && !confirmed) { |
|
2889 | 3176 |
if(!confirm(confirmQuestion)) { |
2890 | 3177 |
maybeCall(resolve); |
2891 | 3178 |
endRequestLock() |
... | ... |
@@ -2895,6 +3182,11 @@ return (function () { |
2895 | 3182 |
|
2896 | 3183 |
|
2897 | 3184 |
var headers = getHeaders(elt, target, promptResponse); |
3185 |
+ |
|
3186 |
+ if (verb !== 'get' && !usesFormData(elt)) { |
|
3187 |
+ headers['Content-Type'] = 'application/x-www-form-urlencoded'; |
|
3188 |
+ } |
|
3189 |
+ |
|
2898 | 3190 |
if (etc.headers) { |
2899 | 3191 |
headers = mergeObjects(headers, etc.headers); |
2900 | 3192 |
} |
... | ... |
@@ -2908,10 +3200,6 @@ return (function () { |
2908 | 3200 |
var allParameters = mergeObjects(rawParameters, expressionVars); |
2909 | 3201 |
var filteredParameters = filterValues(allParameters, elt); |
2910 | 3202 |
|
2911 |
- if (verb !== 'get' && !usesFormData(elt)) { |
|
2912 |
- headers['Content-Type'] = 'application/x-www-form-urlencoded'; |
|
2913 |
- } |
|
2914 |
- |
|
2915 | 3203 |
if (htmx.config.getCacheBusterParam && verb === 'get') { |
2916 | 3204 |
filteredParameters['org.htmx.cache-buster'] = getRawAttribute(target, "id") || "true"; |
2917 | 3205 |
} |
... | ... |
@@ -2925,8 +3213,12 @@ return (function () { |
2925 | 3213 |
var requestAttrValues = getValuesForElement(elt, 'hx-request'); |
2926 | 3214 |
|
2927 | 3215 |
var eltIsBoosted = getInternalData(elt).boosted; |
3216 |
+ |
|
3217 |
+ var useUrlParams = htmx.config.methodsThatUseUrlParams.indexOf(verb) >= 0 |
|
3218 |
+ |
|
2928 | 3219 |
var requestConfig = { |
2929 | 3220 |
boosted: eltIsBoosted, |
3221 |
+ useUrlParams: useUrlParams, |
|
2930 | 3222 |
parameters: filteredParameters, |
2931 | 3223 |
unfilteredParameters: allParameters, |
2932 | 3224 |
headers:headers, |
... | ... |
@@ -2951,6 +3243,7 @@ return (function () { |
2951 | 3243 |
headers = requestConfig.headers; |
2952 | 3244 |
filteredParameters = requestConfig.parameters; |
2953 | 3245 |
errors = requestConfig.errors; |
3246 |
+ useUrlParams = requestConfig.useUrlParams; |
|
2954 | 3247 |
|
2955 | 3248 |
if(errors && errors.length > 0){ |
2956 | 3249 |
triggerEvent(elt, 'htmx:validation:halted', requestConfig) |
... | ... |
@@ -2962,26 +3255,31 @@ return (function () { |
2962 | 3255 |
var splitPath = path.split("#"); |
2963 | 3256 |
var pathNoAnchor = splitPath[0]; |
2964 | 3257 |
var anchor = splitPath[1]; |
2965 |
- var finalPathForGet = null; |
|
2966 |
- if (verb === 'get') { |
|
2967 |
- finalPathForGet = pathNoAnchor; |
|
3258 |
+ |
|
3259 |
+ var finalPath = path |
|
3260 |
+ if (useUrlParams) { |
|
3261 |
+ finalPath = pathNoAnchor; |
|
2968 | 3262 |
var values = Object.keys(filteredParameters).length !== 0; |
2969 | 3263 |
if (values) { |
2970 |
- if (finalPathForGet.indexOf("?") < 0) { |
|
2971 |
- finalPathForGet += "?"; |
|
3264 |
+ if (finalPath.indexOf("?") < 0) { |
|
3265 |
+ finalPath += "?"; |
|
2972 | 3266 |
} else { |
2973 |
- finalPathForGet += "&"; |
|
3267 |
+ finalPath += "&"; |
|
2974 | 3268 |
} |
2975 |
- finalPathForGet += urlEncode(filteredParameters); |
|
3269 |
+ finalPath += urlEncode(filteredParameters); |
|
2976 | 3270 |
if (anchor) { |
2977 |
- finalPathForGet += "#" + anchor; |
|
3271 |
+ finalPath += "#" + anchor; |
|
2978 | 3272 |
} |
2979 | 3273 |
} |
2980 |
- xhr.open('GET', finalPathForGet, true); |
|
2981 |
- } else { |
|
2982 |
- xhr.open(verb.toUpperCase(), path, true); |
|
2983 | 3274 |
} |
2984 | 3275 |
|
3276 |
+ if (!verifyPath(elt, finalPath, requestConfig)) { |
|
3277 |
+ triggerErrorEvent(elt, 'htmx:invalidPath', requestConfig) |
|
3278 |
+ maybeCall(reject); |
|
3279 |
+ return promise; |
|
3280 |
+ }; |
|
3281 |
+ |
|
3282 |
+ xhr.open(verb.toUpperCase(), finalPath, true); |
|
2985 | 3283 |
xhr.overrideMimeType("text/html"); |
2986 | 3284 |
xhr.withCredentials = requestConfig.withCredentials; |
2987 | 3285 |
xhr.timeout = requestConfig.timeout; |
... | ... |
@@ -2999,10 +3297,10 @@ return (function () { |
2999 | 3297 |
} |
3000 | 3298 |
|
3001 | 3299 |
var responseInfo = { |
3002 |
- xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, |
|
3300 |
+ xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, select: select, |
|
3003 | 3301 |
pathInfo: { |
3004 | 3302 |
requestPath: path, |
3005 |
- finalRequestPath: finalPathForGet || path, |
|
3303 |
+ finalRequestPath: finalPath, |
|
3006 | 3304 |
anchor: anchor |
3007 | 3305 |
} |
3008 | 3306 |
}; |
... | ... |
@@ -3012,7 +3310,7 @@ return (function () { |
3012 | 3310 |
var hierarchy = hierarchyForElt(elt); |
3013 | 3311 |
responseInfo.pathInfo.responsePath = getPathFromResponse(xhr); |
3014 | 3312 |
responseHandler(elt, responseInfo); |
3015 |
- removeRequestIndicatorClasses(indicators); |
|
3313 |
+ removeRequestIndicators(indicators, disableElts); |
|
3016 | 3314 |
triggerEvent(elt, 'htmx:afterRequest', responseInfo); |
3017 | 3315 |
triggerEvent(elt, 'htmx:afterOnLoad', responseInfo); |
3018 | 3316 |
// if the body no longer contains the element, trigger the event on the closest parent |
... | ... |
@@ -3038,21 +3336,21 @@ return (function () { |
3038 | 3336 |
} |
3039 | 3337 |
} |
3040 | 3338 |
xhr.onerror = function () { |
3041 |
- removeRequestIndicatorClasses(indicators); |
|
3339 |
+ removeRequestIndicators(indicators, disableElts); |
|
3042 | 3340 |
triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); |
3043 | 3341 |
triggerErrorEvent(elt, 'htmx:sendError', responseInfo); |
3044 | 3342 |
maybeCall(reject); |
3045 | 3343 |
endRequestLock(); |
3046 | 3344 |
} |
3047 | 3345 |
xhr.onabort = function() { |
3048 |
- removeRequestIndicatorClasses(indicators); |
|
3346 |
+ removeRequestIndicators(indicators, disableElts); |
|
3049 | 3347 |
triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); |
3050 | 3348 |
triggerErrorEvent(elt, 'htmx:sendAbort', responseInfo); |
3051 | 3349 |
maybeCall(reject); |
3052 | 3350 |
endRequestLock(); |
3053 | 3351 |
} |
3054 | 3352 |
xhr.ontimeout = function() { |
3055 |
- removeRequestIndicatorClasses(indicators); |
|
3353 |
+ removeRequestIndicators(indicators, disableElts); |
|
3056 | 3354 |
triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); |
3057 | 3355 |
triggerErrorEvent(elt, 'htmx:timeout', responseInfo); |
3058 | 3356 |
maybeCall(reject); |
... | ... |
@@ -3064,6 +3362,7 @@ return (function () { |
3064 | 3362 |
return promise |
3065 | 3363 |
} |
3066 | 3364 |
var indicators = addRequestIndicatorClasses(elt); |
3365 |
+ var disableElts = disableElements(elt); |
|
3067 | 3366 |
|
3068 | 3367 |
forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) { |
3069 | 3368 |
forEach([xhr, xhr.upload], function (target) { |
... | ... |
@@ -3077,7 +3376,8 @@ return (function () { |
3077 | 3376 |
}); |
3078 | 3377 |
}); |
3079 | 3378 |
triggerEvent(elt, 'htmx:beforeSend', responseInfo); |
3080 |
- xhr.send(verb === 'get' ? null : encodeParamsForBody(xhr, elt, filteredParameters)); |
|
3379 |
+ var params = useUrlParams ? null : encodeParamsForBody(xhr, elt, filteredParameters) |
|
3380 |
+ xhr.send(params); |
|
3081 | 3381 |
return promise; |
3082 | 3382 |
} |
3083 | 3383 |
|
... | ... |
@@ -3167,6 +3467,8 @@ return (function () { |
3167 | 3467 |
var xhr = responseInfo.xhr; |
3168 | 3468 |
var target = responseInfo.target; |
3169 | 3469 |
var etc = responseInfo.etc; |
3470 |
+ var requestConfig = responseInfo.requestConfig; |
|
3471 |
+ var select = responseInfo.select; |
|
3170 | 3472 |
|
3171 | 3473 |
if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return; |
3172 | 3474 |
|
... | ... |
@@ -3190,20 +3492,25 @@ return (function () { |
3190 | 3492 |
return; |
3191 | 3493 |
} |
3192 | 3494 |
|
3495 |
+ var shouldRefresh = hasHeader(xhr, /HX-Refresh:/i) && "true" === xhr.getResponseHeader("HX-Refresh"); |
|
3496 |
+ |
|
3193 | 3497 |
if (hasHeader(xhr, /HX-Redirect:/i)) { |
3194 | 3498 |
location.href = xhr.getResponseHeader("HX-Redirect"); |
3499 |
+ shouldRefresh && location.reload(); |
|
3195 | 3500 |
return; |
3196 | 3501 |
} |
3197 | 3502 |
|
3198 |
- if (hasHeader(xhr,/HX-Refresh:/i)) { |
|
3199 |
- if ("true" === xhr.getResponseHeader("HX-Refresh")) { |
|
3200 |
- location.reload(); |
|
3201 |
- return; |
|
3202 |
- } |
|
3503 |
+ if (shouldRefresh) { |
|
3504 |
+ location.reload(); |
|
3505 |
+ return; |
|
3203 | 3506 |
} |
3204 | 3507 |
|
3205 | 3508 |
if (hasHeader(xhr,/HX-Retarget:/i)) { |
3206 |
- responseInfo.target = getDocument().querySelector(xhr.getResponseHeader("HX-Retarget")); |
|
3509 |
+ if (xhr.getResponseHeader("HX-Retarget") === "this") { |
|
3510 |
+ responseInfo.target = elt; |
|
3511 |
+ } else { |
|
3512 |
+ responseInfo.target = querySelectorExt(elt, xhr.getResponseHeader("HX-Retarget")); |
|
3513 |
+ } |
|
3207 | 3514 |
} |
3208 | 3515 |
|
3209 | 3516 |
var historyUpdate = determineHistoryUpdates(elt, responseInfo); |
... | ... |
@@ -3215,12 +3522,14 @@ return (function () { |
3215 | 3522 |
var shouldSwap = xhr.status >= 200 && xhr.status < 400 && xhr.status !== 204; |
3216 | 3523 |
var serverResponse = xhr.response; |
3217 | 3524 |
var isError = xhr.status >= 400; |
3218 |
- var beforeSwapDetails = mergeObjects({shouldSwap: shouldSwap, serverResponse:serverResponse, isError:isError}, responseInfo); |
|
3525 |
+ var ignoreTitle = htmx.config.ignoreTitle |
|
3526 |
+ var beforeSwapDetails = mergeObjects({shouldSwap: shouldSwap, serverResponse:serverResponse, isError:isError, ignoreTitle:ignoreTitle }, responseInfo); |
|
3219 | 3527 |
if (!triggerEvent(target, 'htmx:beforeSwap', beforeSwapDetails)) return; |
3220 | 3528 |
|
3221 | 3529 |
target = beforeSwapDetails.target; // allow re-targeting |
3222 | 3530 |
serverResponse = beforeSwapDetails.serverResponse; // allow updating content |
3223 | 3531 |
isError = beforeSwapDetails.isError; // allow updating error |
3532 |
+ ignoreTitle = beforeSwapDetails.ignoreTitle; // allow updating ignoring title |
|
3224 | 3533 |
|
3225 | 3534 |
responseInfo.target = target; // Make updated target available to response events |
3226 | 3535 |
responseInfo.failed = isError; // Make failed property available to response events |
... | ... |
@@ -3246,6 +3555,10 @@ return (function () { |
3246 | 3555 |
} |
3247 | 3556 |
var swapSpec = getSwapSpecification(elt, swapOverride); |
3248 | 3557 |
|
3558 |
+ if (swapSpec.hasOwnProperty('ignoreTitle')) { |
|
3559 |
+ ignoreTitle = swapSpec.ignoreTitle; |
|
3560 |
+ } |
|
3561 |
+ |
|
3249 | 3562 |
target.classList.add(htmx.config.swappingClass); |
3250 | 3563 |
|
3251 | 3564 |
// optional transition API promise callbacks |
... | ... |
@@ -3268,13 +3581,34 @@ return (function () { |
3268 | 3581 |
// safari issue - see https://github.com/microsoft/playwright/issues/5894 |
3269 | 3582 |
} |
3270 | 3583 |
|
3584 |
+ var selectOverride; |
|
3585 |
+ if (select) { |
|
3586 |
+ selectOverride = select; |
|
3587 |
+ } |
|
3588 |
+ |
|
3589 |
+ if (hasHeader(xhr, /HX-Reselect:/i)) { |
|
3590 |
+ selectOverride = xhr.getResponseHeader("HX-Reselect"); |
|
3591 |
+ } |
|
3592 |
+ |
|
3593 |
+ // if we need to save history, do so, before swapping so that relative resources have the correct base URL |
|
3594 |
+ if (historyUpdate.type) { |
|
3595 |
+ triggerEvent(getDocument().body, 'htmx:beforeHistoryUpdate', mergeObjects({ history: historyUpdate }, responseInfo)); |
|
3596 |
+ if (historyUpdate.type === "push") { |
|
3597 |
+ pushUrlIntoHistory(historyUpdate.path); |
|
3598 |
+ triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path}); |
|
3599 |
+ } else { |
|
3600 |
+ replaceUrlInHistory(historyUpdate.path); |
|
3601 |
+ triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path}); |
|
3602 |
+ } |
|
3603 |
+ } |
|
3604 |
+ |
|
3271 | 3605 |
var settleInfo = makeSettleInfo(target); |
3272 |
- selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo); |
|
3606 |
+ selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo, selectOverride); |
|
3273 | 3607 |
|
3274 | 3608 |
if (selectionInfo.elt && |
3275 | 3609 |
!bodyContains(selectionInfo.elt) && |
3276 |
- selectionInfo.elt.id) { |
|
3277 |
- var newActiveElt = document.getElementById(selectionInfo.elt.id); |
|
3610 |
+ getRawAttribute(selectionInfo.elt, "id")) { |
|
3611 |
+ var newActiveElt = document.getElementById(getRawAttribute(selectionInfo.elt, "id")); |
|
3278 | 3612 |
var focusOptions = { preventScroll: swapSpec.focusScroll !== undefined ? !swapSpec.focusScroll : !htmx.config.defaultFocusScroll }; |
3279 | 3613 |
if (newActiveElt) { |
3280 | 3614 |
// @ts-ignore |
... | ... |
@@ -3317,24 +3651,14 @@ return (function () { |
3317 | 3651 |
triggerEvent(elt, 'htmx:afterSettle', responseInfo); |
3318 | 3652 |
}); |
3319 | 3653 |
|
3320 |
- // if we need to save history, do so |
|
3321 |
- if (historyUpdate.type) { |
|
3322 |
- if (historyUpdate.type === "push") { |
|
3323 |
- pushUrlIntoHistory(historyUpdate.path); |
|
3324 |
- triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path}); |
|
3325 |
- } else { |
|
3326 |
- replaceUrlInHistory(historyUpdate.path); |
|
3327 |
- triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path}); |
|
3328 |
- } |
|
3329 |
- } |
|
3330 | 3654 |
if (responseInfo.pathInfo.anchor) { |
3331 |
- var anchorTarget = find("#" + responseInfo.pathInfo.anchor); |
|
3655 |
+ var anchorTarget = getDocument().getElementById(responseInfo.pathInfo.anchor); |
|
3332 | 3656 |
if(anchorTarget) { |
3333 | 3657 |
anchorTarget.scrollIntoView({block:'start', behavior: "auto"}); |
3334 | 3658 |
} |
3335 | 3659 |
} |
3336 | 3660 |
|
3337 |
- if(settleInfo.title) { |
|
3661 |
+ if(settleInfo.title && !ignoreTitle) { |
|
3338 | 3662 |
var titleElt = find("title"); |
3339 | 3663 |
if(titleElt) { |
3340 | 3664 |
titleElt.innerHTML = settleInfo.title; |
... | ... |
@@ -3485,9 +3809,22 @@ return (function () { |
3485 | 3809 |
//==================================================================== |
3486 | 3810 |
// Initialization |
3487 | 3811 |
//==================================================================== |
3812 |
+ var isReady = false |
|
3813 |
+ getDocument().addEventListener('DOMContentLoaded', function() { |
|
3814 |
+ isReady = true |
|
3815 |
+ }) |
|
3488 | 3816 |
|
3817 |
+ /** |
|
3818 |
+ * Execute a function now if DOMContentLoaded has fired, otherwise listen for it. |
|
3819 |
+ * |
|
3820 |
+ * This function uses isReady because there is no realiable way to ask the browswer whether |
|
3821 |
+ * the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded |
|
3822 |
+ * firing and readystate=complete. |
|
3823 |
+ */ |
|
3489 | 3824 |
function ready(fn) { |
3490 |
- if (getDocument().readyState !== 'loading') { |
|
3825 |
+ // Checking readyState here is a failsafe in case the htmx script tag entered the DOM by |
|
3826 |
+ // some means other than the initial page load. |
|
3827 |
+ if (isReady || getDocument().readyState === 'complete') { |
|
3491 | 3828 |
fn(); |
3492 | 3829 |
} else { |
3493 | 3830 |
getDocument().addEventListener('DOMContentLoaded', fn); |
... | ... |
@@ -3498,9 +3835,9 @@ return (function () { |
3498 | 3835 |
if (htmx.config.includeIndicatorStyles !== false) { |
3499 | 3836 |
getDocument().head.insertAdjacentHTML("beforeend", |
3500 | 3837 |
"<style>\ |
3501 |
- ." + htmx.config.indicatorClass + "{opacity:0;transition: opacity 200ms ease-in;}\ |
|
3502 |
- ." + htmx.config.requestClass + " ." + htmx.config.indicatorClass + "{opacity:1}\ |
|
3503 |
- ." + htmx.config.requestClass + "." + htmx.config.indicatorClass + "{opacity:1}\ |
|
3838 |
+ ." + htmx.config.indicatorClass + "{opacity:0}\ |
|
3839 |
+ ." + htmx.config.requestClass + " ." + htmx.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;}\ |
|
3840 |
+ ." + htmx.config.requestClass + "." + htmx.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;}\ |
|
3504 | 3841 |
</style>"); |
3505 | 3842 |
} |
3506 | 3843 |
} |
... | ... |
@@ -3538,7 +3875,9 @@ return (function () { |
3538 | 3875 |
internalData.xhr.abort(); |
3539 | 3876 |
} |
3540 | 3877 |
}); |
3541 |
- var originalPopstate = window.onpopstate; |
|
3878 |
+ /** @type {(ev: PopStateEvent) => any} */ |
|
3879 |
+ const originalPopstate = window.onpopstate ? window.onpopstate.bind(window) : null; |
|
3880 |
+ /** @type {(ev: PopStateEvent) => any} */ |
|
3542 | 3881 |
window.onpopstate = function (event) { |
3543 | 3882 |
if (event.state && event.state.htmx) { |
3544 | 3883 |
restoreHistory(); |
... | ... |
@@ -1 +1 @@ |
1 |
-(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var z={onLoad:t,process:Tt,on:le,off:ue,trigger:ie,ajax:dr,find:b,findAll:f,closest:d,values:function(e,t){var r=Jt(e,t||"post");return r.values},remove:B,addClass:j,removeClass:n,toggleClass:U,takeClass:V,defineExtension:yr,removeExtension:br,logAll:F,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false},parseInterval:v,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=z.config.wsBinaryType;return t},version:"1.9.2"};var C={addTriggerHandler:xt,bodyContains:ee,canAccessLocalStorage:D,filterValues:er,hasAttribute:q,getAttributeValue:G,getClosestMatch:c,getExpressionVars:fr,getHeaders:Qt,getInputValues:Jt,getInternalData:Y,getSwapSpecification:rr,getTriggerSpecs:ze,getTarget:de,makeFragment:l,mergeObjects:te,makeSettleInfo:S,oobSwap:me,selectAndSwap:Me,settleImmediately:Bt,shouldCancel:Ke,triggerEvent:ie,triggerErrorEvent:ne,withExtensions:w};var R=["get","post","put","delete","patch"];var O=R.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function v(e){if(e==undefined){return undefined}if(e.slice(-2)=="ms"){return parseFloat(e.slice(0,-2))||undefined}if(e.slice(-1)=="s"){return parseFloat(e.slice(0,-1))*1e3||undefined}if(e.slice(-1)=="m"){return parseFloat(e.slice(0,-1))*1e3*60||undefined}return parseFloat(e)||undefined}function $(e,t){return e.getAttribute&&e.getAttribute(t)}function q(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function G(e,t){return $(e,t)||$(e,"data-"+t)}function u(e){return e.parentElement}function J(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function T(e,t,r){var n=G(t,r);var i=G(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function Z(t,r){var n=null;c(t,function(e){return n=T(t,e,r)});if(n!=="unset"){return n}}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 H(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=J().createDocumentFragment()}return i}function L(e){return e.match(/<body/)}function l(e){var t=!L(e);if(z.config.useTemplateFragments&&t){var r=i("<body><template>"+e+"</template></body>",0);return r.querySelector("template").content}else{var n=H(e);switch(n){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 K(e){if(e){e()}}function A(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function N(e){return A(e,"Function")}function I(e){return A(e,"Object")}function Y(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function k(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function Q(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function P(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function ee(e){if(e.getRootNode&&e.getRootNode()instanceof ShadowRoot){return J().body.contains(e.getRootNode().host)}else{return J().body.contains(e)}}function M(e){return e.trim().split(/\s+/)}function te(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){x(e);return null}}function D(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function X(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!t.match("^/$")){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function e(e){return sr(J().body,function(){return eval(e)})}function t(t){var e=z.on("htmx:load",function(e){t(e.detail.elt)});return e}function F(){z.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function b(e,t){if(t){return e.querySelector(t)}else{return b(J(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(J(),e)}}function B(e,t){e=s(e);if(t){setTimeout(function(){B(e);e=null},t)}else{e.parentElement.removeChild(e)}}function j(e,t,r){e=s(e);if(r){setTimeout(function(){j(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=s(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function U(e,t){e=s(e);e.classList.toggle(t)}function V(e,t){e=s(e);Q(e.parentElement.children,function(e){n(e,t)});j(e,t)}function d(e,t){e=s(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function r(e){var t=e.trim();if(t.startsWith("<")&&t.endsWith("/>")){return t.substring(1,t.length-2)}else{return t}}function _(e,t){if(t.indexOf("closest ")===0){return[d(e,r(t.substr(8)))]}else if(t.indexOf("find ")===0){return[b(e,r(t.substr(5)))]}else if(t.indexOf("next ")===0){return[W(e,r(t.substr(5)))]}else if(t.indexOf("previous ")===0){return[oe(e,r(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else{return J().querySelectorAll(r(t))}}var W=function(e,t){var r=J().querySelectorAll(t);for(var n=0;n<r.length;n++){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_PRECEDING){return i}}};var oe=function(e,t){var r=J().querySelectorAll(t);for(var n=r.length-1;n>=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function re(e,t){if(t){return _(e,t)[0]}else{return _(J().body,e)[0]}}function s(e){if(A(e,"String")){return b(e)}else{return e}}function se(e,t,r){if(N(t)){return{target:J().body,event:e,listener:t}}else{return{target:s(e),event:t,listener:r}}}function le(t,r,n){Sr(function(){var e=se(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=N(r);return e?r:n}function ue(t,r,n){Sr(function(){var e=se(t,r,n);e.target.removeEventListener(e.event,e.listener)});return N(r)?r:n}var fe=J().createElement("output");function ce(e,t){var r=Z(e,t);if(r){if(r==="this"){return[he(e,t)]}else{var n=_(e,r);if(n.length===0){x('The selector "'+r+'" on '+t+" returned no matches!");return[fe]}else{return n}}}}function he(e,t){return c(e,function(e){return G(e,t)!=null})}function de(e){var t=Z(e,"hx-target");if(t){if(t==="this"){return he(e,"hx-target")}else{return re(e,t)}}else{var r=Y(e);if(r.boosted){return J().body}else{return e}}}function ve(e){var t=z.config.attributesToSettle;for(var r=0;r<t.length;r++){if(e===t[r]){return true}}return false}function ge(t,r){Q(t.attributes,function(e){if(!r.hasAttribute(e.name)&&ve(e.name)){t.removeAttribute(e.name)}});Q(r.attributes,function(e){if(ve(e.name)){t.setAttribute(e.name,e.value)}})}function pe(e,t){var r=wr(t);for(var n=0;n<r.length;n++){var i=r[n];try{if(i.isInlineSwap(e)){return true}}catch(e){x(e)}}return e==="outerHTML"}function me(e,i,a){var t="#"+i.id;var o="outerHTML";if(e==="true"){}else if(e.indexOf(":")>0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=J().querySelectorAll(t);if(r){Q(r,function(e){var t;var r=i.cloneNode(true);t=J().createDocumentFragment();t.appendChild(r);if(!pe(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ie(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){ke(o,e,e,t,a)}Q(a.elts,function(e){ie(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);ne(J().body,"htmx:oobErrorNoTarget",{content:i})}return e}function xe(e,t,r){var n=Z(e,"hx-select-oob");if(n){var i=n.split(",");for(let e=0;e<i.length;e++){var a=i[e].split(":",2);var o=a[0].trim();if(o.indexOf("#")===0){o=o.substring(1)}var s=a[1]||"true";var l=t.querySelector("#"+o);if(l){me(s,l,r)}}}Q(f(t,"[hx-swap-oob], [data-hx-swap-oob]"),function(e){var t=G(e,"hx-swap-oob");if(t!=null){me(t,e,r)}})}function ye(e){Q(f(e,"[hx-preserve], [data-hx-preserve]"),function(e){var t=G(e,"id");var r=J().getElementById(t);if(r!=null){e.parentNode.replaceChild(r,e)}})}function be(a,e,o){Q(e.querySelectorAll("[id]"),function(e){if(e.id&&e.id.length>0){var t=e.id.replace("'","\\'");var r=e.tagName.replace(":","\\:");var n=a.querySelector(r+"[id='"+t+"']");if(n&&n!==a){var i=e.cloneNode();ge(e,n);o.tasks.push(function(){ge(e,i)})}}})}function we(e){return function(){n(e,z.config.addedClass);Tt(e);bt(e);Se(e);ie(e,"htmx:load")}}function Se(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function a(e,t,r,n){be(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;j(i,z.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(we(i))}}}function Ee(e,t){var r=0;while(r<e.length){t=(t<<5)-t+e.charCodeAt(r++)|0}return t}function Ce(e){var t=0;if(e.attributes){for(var r=0;r<e.attributes.length;r++){var n=e.attributes[r];if(n.value){t=Ee(n.name,t);t=Ee(n.value,t)}}}return t}function Re(t){var r=Y(t);if(r.timeout){clearTimeout(r.timeout)}if(r.webSocket){r.webSocket.close()}if(r.sseEventSource){r.sseEventSource.close()}if(r.listenerInfos){Q(r.listenerInfos,function(e){if(e.on){e.on.removeEventListener(e.trigger,e.listener)}})}if(r.onHandlers){for(let e=0;e<r.onHandlers.length;e++){const n=r.onHandlers[e];t.removeEventListener(n.name,n.handler)}}}function o(e){ie(e,"htmx:beforeCleanupElement");Re(e);if(e.children){Q(e.children,function(e){o(e)})}}function Oe(e,t,r){if(e.tagName==="BODY"){return Ne(e,t,r)}else{var n;var i=e.previousSibling;a(u(e),e,t,r);if(i==null){n=u(e).firstChild}else{n=i.nextSibling}Y(e).replacedWith=n;r.elts=[];while(n&&n!==e){if(n.nodeType===Node.ELEMENT_NODE){r.elts.push(n)}n=n.nextElementSibling}o(e);u(e).removeChild(e)}}function qe(e,t,r){return a(e,e.firstChild,t,r)}function Te(e,t,r){return a(u(e),e,t,r)}function He(e,t,r){return a(e,null,t,r)}function Le(e,t,r){return a(u(e),e.nextSibling,t,r)}function Ae(e,t,r){o(e);return u(e).removeChild(e)}function Ne(e,t,r){var n=e.firstChild;a(e,n,t,r);if(n){while(n.nextSibling){o(n.nextSibling);e.removeChild(n.nextSibling)}o(n);e.removeChild(n)}}function Ie(e,t){var r=Z(e,"hx-select");if(r){var n=J().createDocumentFragment();Q(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function ke(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Oe(r,n,i);return;case"afterbegin":qe(r,n,i);return;case"beforebegin":Te(r,n,i);return;case"beforeend":He(r,n,i);return;case"afterend":Le(r,n,i);return;case"delete":Ae(r,n,i);return;default:var a=wr(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(we(f))}}}return}}catch(e){x(e)}}if(e==="innerHTML"){Ne(r,n,i)}else{ke(z.config.defaultSwapStyle,t,r,n,i)}}}function Pe(e){if(e.indexOf("<title")>-1){var t=e.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim,"");var r=t.match(/<title(\s[^>]*>|>)([\s\S]*?)<\/title>/im);if(r){return r[2]}}}function Me(e,t,r,n,i){i.title=Pe(n);var a=l(n);if(a){xe(r,a,i);a=Ie(r,a);ye(a);return ke(e,r,t,a,i)}}function De(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(!I(o)){o={value:o}}ie(r,a,o)}}}else{ie(r,n,[])}}var Xe=/\s/;var g=/[\s,]/;var Fe=/[_$a-zA-Z]/;var Be=/[_$a-zA-Z0-9]/;var je=['"',"'","/"];var p=/[^\s]/;function Ue(e){var t=[];var r=0;while(r<e.length){if(Fe.exec(e.charAt(r))){var n=r;while(Be.exec(e.charAt(r+1))){r++}t.push(e.substr(n,r-n+1))}else if(je.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 Fe.exec(e.charAt(0))&&e!=="true"&&e!=="false"&&e!=="this"&&e!==r&&t!=="."}function _e(e,t,r){if(t[0]==="["){t.shift();var n=1;var i=" return (function("+r+"){ return (";var a=null;while(t.length>0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=sr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){ne(J().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Ve(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function m(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}var We="input, textarea, select";function ze(e){var t=G(e,"hx-trigger");var r=[];if(t){var n=Ue(t);do{m(n,p);var i=n.length;var a=m(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};m(n,p);o.pollInterval=v(m(n,/[,\[\s]/));m(n,p);var s=_e(e,n,"event");if(s){o.eventFilter=s}r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var l={trigger:a};var s=_e(e,n,"event");if(s){l.eventFilter=s}while(n.length>0&&n[0]!==","){m(n,p);var u=n.shift();if(u==="changed"){l.changed=true}else if(u==="once"){l.once=true}else if(u==="consume"){l.consume=true}else if(u==="delay"&&n[0]===":"){n.shift();l.delay=v(m(n,g))}else if(u==="from"&&n[0]===":"){n.shift();var f=m(n,g);if(f==="closest"||f==="find"||f==="next"||f==="previous"){n.shift();f+=" "+m(n,g)}l.from=f}else if(u==="target"&&n[0]===":"){n.shift();l.target=m(n,g)}else if(u==="throttle"&&n[0]===":"){n.shift();l.throttle=v(m(n,g))}else if(u==="queue"&&n[0]===":"){n.shift();l.queue=m(n,g)}else if((u==="root"||u==="threshold")&&n[0]===":"){n.shift();l[u]=m(n,g)}else{ne(e,"htmx:syntax:error",{token:n.shift()})}}r.push(l)}}if(n.length===i){ne(e,"htmx:syntax:error",{token:n.shift()})}m(n,p)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"]')){return[{trigger:"click"}]}else if(h(e,We)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function $e(e){Y(e).cancelled=true}function Ge(e,t,r){var n=Y(e);n.timeout=setTimeout(function(){if(ee(e)&&n.cancelled!==true){if(!Qe(r,Lt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}Ge(e,t,r)}},r.pollInterval)}function Je(e){return location.hostname===e.hostname&&$(e,"href")&&$(e,"href").indexOf("#")!==0}function Ze(t,r,e){if(t.tagName==="A"&&Je(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=t.href}else{var a=$(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=$(t,"action")}e.forEach(function(e){et(t,function(e,t){ae(n,i,e,t)},r,e,true)})}}function Ke(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&d(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function Ye(e,t){return Y(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function Qe(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){ne(J().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function et(i,a,e,o,s){var l=Y(i);var t;if(o.from){t=_(i,o.from)}else{t=[i]}if(o.changed){l.lastValue=i.value}Q(t,function(r){var n=function(e){if(!ee(i)){r.removeEventListener(o.trigger,n);return}if(Ye(i,e)){return}if(s||Ke(e,i)){e.preventDefault()}if(Qe(o,e)){return}var t=Y(e);t.triggerSpec=o;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(i)<0){t.handledFor.push(i);if(o.consume){e.stopPropagation()}if(o.target&&e.target){if(!h(e.target,o.target)){return}}if(o.once){if(l.triggeredOnce){return}else{l.triggeredOnce=true}}if(o.changed){if(l.lastValue===i.value){return}else{l.lastValue=i.value}}if(l.delayed){clearTimeout(l.delayed)}if(l.throttle){return}if(o.throttle){if(!l.throttle){a(i,e);l.throttle=setTimeout(function(){l.throttle=null},o.throttle)}}else if(o.delay){l.delayed=setTimeout(function(){a(i,e)},o.delay)}else{ie(i,"htmx:trigger");a(i,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:o.trigger,listener:n,on:r});r.addEventListener(o.trigger,n)})}var tt=false;var rt=null;function nt(){if(!rt){rt=function(){tt=true};window.addEventListener("scroll",rt);setInterval(function(){if(tt){tt=false;Q(J().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){it(e)})}},200)}}function it(t){if(!q(t,"data-hx-revealed")&&P(t)){t.setAttribute("data-hx-revealed","true");var e=Y(t);if(e.initHash){ie(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ie(t,"revealed")},{once:true})}}}function at(e,t,r){var n=M(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){ot(e,a[1],0)}if(a[0]==="send"){lt(e)}}}function ot(s,r,n){if(!ee(s)){return}if(r.indexOf("/")==0){var e=location.hostname+(location.port?":"+location.port:"");if(location.protocol=="https:"){r="wss://"+e+r}else if(location.protocol=="http:"){r="ws://"+e+r}}var t=z.createWebSocket(r);t.onerror=function(e){ne(s,"htmx:wsError",{error:e,socket:t});st(s)};t.onclose=function(e){if([1006,1012,1013].indexOf(e.code)>=0){var t=ut(n);setTimeout(function(){ot(s,r,n+1)},t)}};t.onopen=function(e){n=0};Y(s).webSocket=t;t.addEventListener("message",function(e){if(st(s)){return}var t=e.data;w(s,function(e){t=e.transformResponse(t,null,s)});var r=S(s);var n=l(t);var i=k(n.children);for(var a=0;a<i.length;a++){var o=i[a];me(G(o,"hx-swap-oob")||"true",o,r)}Bt(r.tasks)})}function st(e){if(!ee(e)){Y(e).webSocket.close();return true}}function lt(u){var f=c(u,function(e){return Y(e).webSocket!=null});if(f){u.addEventListener(ze(u)[0].trigger,function(e){var t=Y(f).webSocket;var r=Qt(u,f);var n=Jt(u,"post");var i=n.errors;var a=n.values;var o=fr(u);var s=te(a,o);var l=er(s,u);l["HEADERS"]=r;if(i&&i.length>0){ie(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(Ke(e,u)){e.preventDefault()}})}else{ne(u,"htmx:noWebSocketSourceError")}}function ut(e){var t=z.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}x('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function ft(e,t,r){var n=M(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){ct(e,a[1])}if(a[0]==="swap"){ht(e,a[1])}}}function ct(t,e){var r=z.createEventSource(e);r.onerror=function(e){ne(t,"htmx:sseError",{error:e,source:r});vt(t)};Y(t).sseEventSource=r}function ht(a,o){var s=c(a,gt);if(s){var l=Y(s).sseEventSource;var u=function(e){if(vt(s)){l.removeEventListener(o,u);return}var t=e.data;w(a,function(e){t=e.transformResponse(t,null,a)});var r=rr(a);var n=de(a);var i=S(a);Me(r.swapStyle,a,n,t,i);Bt(i.tasks);ie(a,"htmx:sseMessage",e)};Y(a).sseListener=u;l.addEventListener(o,u)}else{ne(a,"htmx:noSSESourceError")}}function dt(e,t,r){var n=c(e,gt);if(n){var i=Y(n).sseEventSource;var a=function(){if(!vt(n)){if(ee(e)){t(e)}else{i.removeEventListener(r,a)}}};Y(e).sseListener=a;i.addEventListener(r,a)}else{ne(e,"htmx:noSSESourceError")}}function vt(e){if(!ee(e)){Y(e).sseEventSource.close();return true}}function gt(e){return Y(e).sseEventSource!=null}function pt(e,t,r,n){var i=function(){if(!r.loaded){r.loaded=true;t(e)}};if(n){setTimeout(i,n)}else{i()}}function mt(t,i,e){var a=false;Q(R,function(r){if(q(t,"hx-"+r)){var n=G(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){xt(t,e,i,function(e,t){ae(r,n,e,t)})})}});return a}function xt(n,e,t,r){if(e.sseEvent){dt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){nt();et(n,r,t,e);it(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=re(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t<e.length;t++){var r=e[t];if(r.isIntersecting){ie(n,"intersect");break}}},i);a.observe(n);et(n,r,t,e)}else if(e.trigger==="load"){if(!Qe(e,Lt("load",{elt:n}))){pt(n,r,t,e.delay)}}else if(e.pollInterval){t.polling=true;Ge(n,r,e)}else{et(n,r,t,e)}}function yt(e){if(e.type==="text/javascript"||e.type==="module"||e.type===""){var t=J().createElement("script");Q(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(z.config.inlineScriptNonce){t.nonce=z.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){x(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function bt(e){if(h(e,"script")){yt(e)}Q(f(e,"script"),function(e){yt(e)})}function wt(){return document.querySelector("[hx-boost], [data-hx-boost]")}function St(e){if(e.querySelectorAll){var t=wt()?", a, form":"";var r=e.querySelectorAll(O+t+", [hx-sse], [data-hx-sse], [hx-ws],"+" [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]");return r}else{return[]}}function Et(n){var e=function(e){var t=d(e.target,"button, input[type='submit']");if(t!==null){var r=Y(n);r.lastButtonClicked=t}};n.addEventListener("click",e);n.addEventListener("focusin",e);n.addEventListener("focusout",function(e){var t=Y(n);t.lastButtonClicked=null})}function Ct(e){var t=Ue(e);var r=0;for(let e=0;e<t.length;e++){const n=t[e];if(n==="{"){r++}else if(n==="}"){r--}}return r}function Rt(t,e,r){var n=Y(t);n.onHandlers=[];var i=new Function("event",r+"; return;");var a=t.addEventListener(e,function(e){return i.call(t,e)});n.onHandlers.push({event:e,listener:a});return{nodeData:n,code:r,func:i,listener:a}}function Ot(e){var t=G(e,"hx-on");if(t){var r={};var n=t.split("\n");var i=null;var a=0;while(n.length>0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Ct(o)}for(var l in r){Rt(e,l,r[l])}}}function qt(t){if(t.closest&&t.closest(z.config.disableSelector)){return}var r=Y(t);if(r.initHash!==Ce(t)){r.initHash=Ce(t);Re(t);Ot(t);ie(t,"htmx:beforeProcessNode");if(t.value){r.lastValue=t.value}var e=ze(t);var n=mt(t,r,e);if(!n){if(Z(t,"hx-boost")==="true"){Ze(t,r,e)}else if(q(t,"hx-trigger")){e.forEach(function(e){xt(t,e,r,function(){})})}}if(t.tagName==="FORM"){Et(t)}var i=G(t,"hx-sse");if(i){ft(t,r,i)}var a=G(t,"hx-ws");if(a){at(t,r,a)}ie(t,"htmx:afterProcessNode")}}function Tt(e){e=s(e);qt(e);Q(St(e),function(e){qt(e)})}function Ht(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Lt(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=J().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function ne(e,t,r){ie(e,t,te({error:t},r))}function At(e){return e==="htmx:afterProcessNode"}function w(e,t){Q(wr(e),function(e){try{t(e)}catch(e){x(e)}})}function x(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function ie(e,t,r){e=s(e);if(r==null){r={}}r["elt"]=e;var n=Lt(t,r);if(z.logger&&!At(t)){z.logger(e,t,r)}if(r.error){x(r.error);ie(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=Ht(t);if(i&&a!==t){var o=Lt(a,n.detail);i=i&&e.dispatchEvent(o)}w(e,function(e){i=i&&e.onEvent(t,n)!==false});return i}var Nt=location.pathname+location.search;function It(){var e=J().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||J().body}function kt(e,t,r,n){if(!D()){return}e=X(e);var i=y(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;a<i.length;a++){if(i[a].url===e){i.splice(a,1);break}}var o={url:e,content:t,title:r,scroll:n};ie(J().body,"htmx:historyItemCreated",{item:o,cache:i});i.push(o);while(i.length>z.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){ne(J().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Pt(e){if(!D()){return null}e=X(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 Mt(e){var t=z.config.requestClass;var r=e.cloneNode(true);Q(f(r,"."+t),function(e){n(e,t)});return r.innerHTML}function Dt(){var e=It();var t=Nt||location.pathname+location.search;var r=J().querySelector('[hx-history="false" i],[data-hx-history="false" i]');if(!r){ie(J().body,"htmx:beforeHistorySave",{path:t,historyElt:e});kt(t,Mt(e),J().title,window.scrollY)}if(z.config.historyEnabled)history.replaceState({htmx:true},J().title,window.location.href)}function Xt(e){if(z.config.getCacheBusterParam){e=e.replace(/org\.htmx\.cache-buster=[^&]*&?/,"");if(e.endsWith("&")||e.endsWith("?")){e=e.slice(0,-1)}}if(z.config.historyEnabled){history.pushState({htmx:true},"",e)}Nt=e}function Ft(e){if(z.config.historyEnabled)history.replaceState({htmx:true},"",e);Nt=e}function Bt(e){Q(e,function(e){e.call()})}function jt(a){var e=new XMLHttpRequest;var o={path:a,xhr:e};ie(J().body,"htmx:historyCacheMiss",o);e.open("GET",a,true);e.setRequestHeader("HX-History-Restore-Request","true");e.onload=function(){if(this.status>=200&&this.status<400){ie(J().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=It();var r=S(t);var n=Pe(this.response);if(n){var i=b("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ne(t,e,r);Bt(r.tasks);Nt=a;ie(J().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{ne(J().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function Ut(e){Dt();e=e||location.pathname+location.search;var t=Pt(e);if(t){var r=l(t.content);var n=It();var i=S(n);Ne(n,r,i);Bt(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Nt=e;ie(J().body,"htmx:historyRestore",{path:e,item:t})}else{if(z.config.refreshOnHistoryMiss){window.location.reload(true)}else{jt(e)}}}function Vt(e){var t=ce(e,"hx-indicator");if(t==null){t=[e]}Q(t,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,z.config.requestClass)});return t}function _t(e){Q(e,function(e){var t=Y(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,z.config.requestClass)}})}function Wt(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function zt(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 $t(t,r,n,e,i){if(e==null||Wt(t,e)){return}else{t.push(e)}if(zt(e)){var a=$(e,"name");var o=e.value;if(e.multiple){o=k(e.querySelectorAll("option:checked")).map(function(e){return e.value})}if(e.files){o=k(e.files)}if(a!=null&&o!=null){var s=r[a];if(s!==undefined){if(Array.isArray(s)){if(Array.isArray(o)){r[a]=s.concat(o)}else{s.push(o)}}else{if(Array.isArray(o)){r[a]=[s].concat(o)}else{r[a]=[s,o]}}}else{r[a]=o}}if(i){Gt(e,n)}}if(h(e,"form")){var l=e.elements;Q(l,function(e){$t(t,r,n,e,i)})}}function Gt(e,t){if(e.willValidate){ie(e,"htmx:validation:validate");if(!e.checkValidity()){t.push({elt:e,message:e.validationMessage,validity:e.validity});ie(e,"htmx:validation:failed",{message:e.validationMessage,validity:e.validity})}}}function Jt(e,t){var r=[];var n={};var i={};var a=[];var o=Y(e);var s=h(e,"form")&&e.noValidate!==true||G(e,"hx-validate")==="true";if(o.lastButtonClicked){s=s&&o.lastButtonClicked.formNoValidate!==true}if(t!=="get"){$t(r,i,a,d(e,"form"),s)}$t(r,n,a,e,s);if(o.lastButtonClicked){var l=$(o.lastButtonClicked,"name");if(l){n[l]=o.lastButtonClicked.value}}var u=ce(e,"hx-include");Q(u,function(e){$t(r,n,a,e,s);if(!h(e,"form")){Q(e.querySelectorAll(We),function(e){$t(r,n,a,e,s)})}});n=te(n,i);return{errors:a,values:n}}function Zt(e,t,r){if(e!==""){e+="&"}if(String(r)==="[object Object]"){r=JSON.stringify(r)}var n=encodeURIComponent(r);e+=encodeURIComponent(t)+"="+n;return e}function Kt(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){Q(n,function(e){t=Zt(t,r,e)})}else{t=Zt(t,r,n)}}}return t}function Yt(e){var t=new FormData;for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){Q(n,function(e){t.append(r,e)})}else{t.append(r,n)}}}return t}function Qt(e,t,r){var n={"HX-Request":"true","HX-Trigger":$(e,"id"),"HX-Trigger-Name":$(e,"name"),"HX-Target":G(t,"id"),"HX-Current-URL":J().location.href};or(e,"hx-headers",false,n);if(r!==undefined){n["HX-Prompt"]=r}if(Y(e).boosted){n["HX-Boosted"]="true"}return n}function er(t,e){var r=Z(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){Q(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};Q(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function tr(e){return $(e,"href")&&$(e,"href").indexOf("#")>=0}function rr(e,t){var r=t?t:Z(e,"hx-swap");var n={swapStyle:Y(e).boosted?"innerHTML":z.config.defaultSwapStyle,swapDelay:z.config.defaultSwapDelay,settleDelay:z.config.defaultSettleDelay};if(Y(e).boosted&&!tr(e)){n["show"]="top"}if(r){var i=M(r);if(i.length>0){n["swapStyle"]=i[0];for(var a=1;a<i.length;a++){var o=i[a];if(o.indexOf("swap:")===0){n["swapDelay"]=v(o.substr(5))}if(o.indexOf("settle:")===0){n["settleDelay"]=v(o.substr(7))}if(o.indexOf("transition:")===0){n["transition"]=o.substr(11)==="true"}if(o.indexOf("scroll:")===0){var s=o.substr(7);var l=s.split(":");var u=l.pop();var f=l.length>0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}if(o.indexOf("focus-scroll:")===0){var d=o.substr("focus-scroll:".length);n["focusScroll"]=d=="true"}}}}return n}function nr(e){return Z(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&$(e,"enctype")==="multipart/form-data"}function ir(t,r,n){var i=null;w(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(nr(r)){return Yt(n)}else{return Kt(n)}}}function S(e){return{tasks:[],elts:[e]}}function ar(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=re(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=re(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:z.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:z.config.scrollBehavior})}}}function or(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=G(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=sr(e,function(){return Function("return ("+a+")")()},{})}else{s=y(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return or(u(e),t,r,n)}function sr(e,t,r){if(z.config.allowEval){return t()}else{ne(e,"htmx:evalDisallowedError");return r}}function lr(e,t){return or(e,"hx-vars",true,t)}function ur(e,t){return or(e,"hx-vals",false,t)}function fr(e){return te(lr(e),ur(e))}function cr(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 hr(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){ne(J().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function E(e,t){return e.getAllResponseHeaders().match(t)}function dr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||A(r,"String")){return ae(e,t,null,null,{targetOverride:s(r),returnPromise:true})}else{return ae(e,t,s(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:s(r.target),swapOverride:r.swap,returnPromise:true})}}else{return ae(e,t,null,null,{returnPromise:true})}}function vr(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function ae(e,t,n,r,i,M){var a=null;var o=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!=="undefined"){var s=new Promise(function(e,t){a=e;o=t})}if(n==null){n=J().body}var D=i.handler||pr;if(!ee(n)){return}var l=i.targetOverride||de(n);if(l==null||l==fe){ne(n,"htmx:targetError",{target:G(n,"hx-target")});return}if(!M){var X=function(){return ae(e,t,n,r,i,true)};var F={target:l,elt:n,path:t,verb:e,triggeringEvent:r,etc:i,issueRequest:X};if(ie(n,"htmx:confirm",F)===false){return}}var u=n;var f=Y(n);var c=Z(n,"hx-sync");var h=null;var d=false;if(c){var v=c.split(":");var g=v[0].trim();if(g==="this"){u=he(n,"hx-sync")}else{u=re(n,g)}c=(v[1]||"drop").trim();f=Y(u);if(c==="drop"&&f.xhr&&f.abortable!==true){return}else if(c==="abort"){if(f.xhr){return}else{d=true}}else if(c==="replace"){ie(u,"htmx:abort")}else if(c.indexOf("queue")===0){var B=c.split(" ");h=(B[1]||"last").trim()}}if(f.xhr){if(f.abortable){ie(u,"htmx:abort")}else{if(h==null){if(r){var p=Y(r);if(p&&p.triggerSpec&&p.triggerSpec.queue){h=p.triggerSpec.queue}}if(h==null){h="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(h==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="all"){f.queuedRequests.push(function(){ae(e,t,n,r,i)})}else if(h==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){ae(e,t,n,r,i)})}return}}var m=new XMLHttpRequest;f.xhr=m;f.abortable=d;var x=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var y=Z(n,"hx-prompt");if(y){var b=prompt(y);if(b===null||!ie(n,"htmx:prompt",{prompt:b,target:l})){K(a);x();return s}}var w=Z(n,"hx-confirm");if(w){if(!confirm(w)){K(a);x();return s}}var S=Qt(n,l,b);if(i.headers){S=te(S,i.headers)}var E=Jt(n,e);var C=E.errors;var R=E.values;if(i.values){R=te(R,i.values)}var j=fr(n);var O=te(R,j);var q=er(O,n);if(e!=="get"&&!nr(n)){S["Content-Type"]="application/x-www-form-urlencoded"}if(z.config.getCacheBusterParam&&e==="get"){q["org.htmx.cache-buster"]=$(l,"id")||"true"}if(t==null||t===""){t=J().location.href}var T=or(n,"hx-request");var H=Y(n).boosted;var L={boosted:H,parameters:q,unfilteredParameters:O,headers:S,target:l,verb:e,errors:C,withCredentials:i.credentials||T.credentials||z.config.withCredentials,timeout:i.timeout||T.timeout||z.config.timeout,path:t,triggeringEvent:r};if(!ie(n,"htmx:configRequest",L)){K(a);x();return s}t=L.path;e=L.verb;S=L.headers;q=L.parameters;C=L.errors;if(C&&C.length>0){ie(n,"htmx:validation:halted",L);K(a);x();return s}var U=t.split("#");var V=U[0];var A=U[1];var N=null;if(e==="get"){N=V;var _=Object.keys(q).length!==0;if(_){if(N.indexOf("?")<0){N+="?"}else{N+="&"}N+=Kt(q);if(A){N+="#"+A}}m.open("GET",N,true)}else{m.open(e.toUpperCase(),t,true)}m.overrideMimeType("text/html");m.withCredentials=L.withCredentials;m.timeout=L.timeout;if(T.noHeaders){}else{for(var I in S){if(S.hasOwnProperty(I)){var W=S[I];cr(m,I,W)}}}var k={xhr:m,target:l,requestConfig:L,etc:i,boosted:H,pathInfo:{requestPath:t,finalRequestPath:N||t,anchor:A}};m.onload=function(){try{var e=vr(n);k.pathInfo.responsePath=hr(m);D(n,k);_t(P);ie(n,"htmx:afterRequest",k);ie(n,"htmx:afterOnLoad",k);if(!ee(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(ee(r)){t=r}}if(t){ie(t,"htmx:afterRequest",k);ie(t,"htmx:afterOnLoad",k)}}K(a);x()}catch(e){ne(n,"htmx:onLoadError",te({error:e},k));throw e}};m.onerror=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendError",k);K(o);x()};m.onabort=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:sendAbort",k);K(o);x()};m.ontimeout=function(){_t(P);ne(n,"htmx:afterRequest",k);ne(n,"htmx:timeout",k);K(o);x()};if(!ie(n,"htmx:beforeRequest",k)){K(a);x();return s}var P=Vt(n);Q(["loadstart","loadend","progress","abort"],function(t){Q([m,m.upload],function(e){e.addEventListener(t,function(e){ie(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ie(n,"htmx:beforeSend",k);m.send(e==="get"?null:ir(m,n,q));return s}function gr(e,t){var r=t.xhr;var n=null;var i=null;if(E(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(E(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(E(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=Z(e,"hx-push-url");var l=Z(e,"hx-replace-url");var u=Y(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function pr(s,l){var u=l.xhr;var f=l.target;var e=l.etc;if(!ie(s,"htmx:beforeOnLoad",l))return;if(E(u,/HX-Trigger:/i)){De(u,"HX-Trigger",s)}if(E(u,/HX-Location:/i)){Dt();var t=u.getResponseHeader("HX-Location");var c;if(t.indexOf("{")===0){c=y(t);t=c["path"];delete c["path"]}dr("GET",t,c).then(function(){Xt(t)});return}if(E(u,/HX-Redirect:/i)){location.href=u.getResponseHeader("HX-Redirect");return}if(E(u,/HX-Refresh:/i)){if("true"===u.getResponseHeader("HX-Refresh")){location.reload();return}}if(E(u,/HX-Retarget:/i)){l.target=J().querySelector(u.getResponseHeader("HX-Retarget"))}var h=gr(s,l);var r=u.status>=200&&u.status<400&&u.status!==204;var d=u.response;var n=u.status>=400;var i=te({shouldSwap:r,serverResponse:d,isError:n},l);if(!ie(f,"htmx:beforeSwap",i))return;f=i.target;d=i.serverResponse;n=i.isError;l.target=f;l.failed=n;l.successful=!n;if(i.shouldSwap){if(u.status===286){$e(s)}w(s,function(e){d=e.transformResponse(d,u,s)});if(h.type){Dt()}var a=e.swapOverride;if(E(u,/HX-Reswap:/i)){a=u.getResponseHeader("HX-Reswap")}var c=rr(s,a);f.classList.add(z.config.swappingClass);var v=null;var g=null;var o=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var n=S(f);Me(c.swapStyle,f,s,d,n);if(t.elt&&!ee(t.elt)&&t.elt.id){var r=document.getElementById(t.elt.id);var i={preventScroll:c.focusScroll!==undefined?!c.focusScroll:!z.config.defaultFocusScroll};if(r){if(t.start&&r.setSelectionRange){try{r.setSelectionRange(t.start,t.end)}catch(e){}}r.focus(i)}}f.classList.remove(z.config.swappingClass);Q(n.elts,function(e){if(e.classList){e.classList.add(z.config.settlingClass)}ie(e,"htmx:afterSwap",l)});if(E(u,/HX-Trigger-After-Swap:/i)){var a=s;if(!ee(s)){a=J().body}De(u,"HX-Trigger-After-Swap",a)}var o=function(){Q(n.tasks,function(e){e.call()});Q(n.elts,function(e){if(e.classList){e.classList.remove(z.config.settlingClass)}ie(e,"htmx:afterSettle",l)});if(h.type){if(h.type==="push"){Xt(h.path);ie(J().body,"htmx:pushedIntoHistory",{path:h.path})}else{Ft(h.path);ie(J().body,"htmx:replacedInHistory",{path:h.path})}}if(l.pathInfo.anchor){var e=b("#"+l.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title){var t=b("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}ar(n.elts,c);if(E(u,/HX-Trigger-After-Settle:/i)){var r=s;if(!ee(s)){r=J().body}De(u,"HX-Trigger-After-Settle",r)}K(v)};if(c.settleDelay>0){setTimeout(o,c.settleDelay)}else{o()}}catch(e){ne(s,"htmx:swapError",l);K(g);throw e}};var p=z.config.globalViewTransitions;if(c.hasOwnProperty("transition")){p=c.transition}if(p&&ie(s,"htmx:beforeTransition",l)&&typeof Promise!=="undefined"&&document.startViewTransition){var m=new Promise(function(e,t){v=e;g=t});var x=o;o=function(){document.startViewTransition(function(){x();return m})}}if(c.swapDelay>0){setTimeout(o,c.swapDelay)}else{o()}}if(n){ne(s,"htmx:responseError",te({error:"Response Status Error Code "+u.status+" from "+l.pathInfo.requestPath},l))}}var mr={};function xr(){return{init:function(e){return null},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 yr(e,t){if(t.init){t.init(C)}mr[e]=te(xr(),t)}function br(e){delete mr[e]}function wr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=G(e,"hx-ext");if(t){Q(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=mr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return wr(u(e),r,n)}function Sr(e){if(J().readyState!=="loading"){e()}else{J().addEventListener("DOMContentLoaded",e)}}function Er(){if(z.config.includeIndicatorStyles!==false){J().head.insertAdjacentHTML("beforeend","<style> ."+z.config.indicatorClass+"{opacity:0;transition: opacity 200ms ease-in;} ."+z.config.requestClass+" ."+z.config.indicatorClass+"{opacity:1} ."+z.config.requestClass+"."+z.config.indicatorClass+"{opacity:1} </style>")}}function Cr(){var e=J().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function Rr(){var e=Cr();if(e){z.config=te(z.config,e)}}Sr(function(){Rr();Er();var e=J().body;Tt(e);var t=J().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=Y(t);if(r&&r.xhr){r.xhr.abort()}});var r=window.onpopstate;window.onpopstate=function(e){if(e.state&&e.state.htmx){Ut();Q(t,function(e){ie(e,"htmx:restored",{document:J(),triggerEvent:ie})})}else{if(r){r(e)}}};setTimeout(function(){ie(e,"htmx:load",{});e=null},0)});return z}()}); |
|
2 | 1 |
\ No newline at end of file |
2 |
+(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.10"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t=false){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}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 A(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 a(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=re().createDocumentFragment()}return i}function N(e){return/<body/.test(e)}function l(e){var t=!N(e);var r=A(e);var n=e;if(r==="head"){n=n.replace(S,"")}if(Q.config.useTemplateFragments&&t){var i=a("<body><template>"+n+"</template></body>",0);return i.querySelector("template").content}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return a("<table>"+n+"</table>",1);case"col":return a("<table><colgroup>"+n+"</colgroup></table>",2);case"tr":return a("<table><tbody>"+n+"</tbody></table>",2);case"td":case"th":return a("<table><tbody><tr>"+n+"</tr></tbody></table>",3);case"script":case"style":return a("<div>"+n+"</div>",1);default:return a(n,0)}}function ie(e){if(e){e()}}function I(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return I(e,"Function")}function P(e){return I(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function M(e){var t=[];if(e){for(var r=0;r<e.length;r++){t.push(e[r])}}return t}function oe(e,t){if(e){for(var r=0;r<e.length;r++){t(e[r])}}}function X(e){var t=e.getBoundingClientRect();var r=t.top;var n=t.bottom;return r<window.innerHeight&&n>=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function D(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function U(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function B(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function j(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function _(e,t){e=g(e);if(t){setTimeout(function(){_(e);e=null},t)}else{e.parentElement.removeChild(e)}}function z(e,t,r){e=g(e);if(r){setTimeout(function(){z(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=g(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function $(e,t){e=g(e);e.classList.toggle(t)}function W(e,t){e=g(e);oe(e.parentElement.children,function(e){n(e,t)});z(e,t)}function v(e,t){e=g(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function s(e,t){return e.substring(0,t.length)===t}function G(e,t){return e.substring(e.length-t.length)===t}function J(e){var t=e.trim();if(s(t,"<")&&G(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Z(e,t){if(t.indexOf("closest ")===0){return[v(e,J(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,J(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[K(e,J(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[Y(e,J(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(J(t))}}var K=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n<r.length;n++){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_PRECEDING){return i}}};var Y=function(e,t){var r=re().querySelectorAll(t);for(var n=r.length-1;n>=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Z(e,t)[0]}else{return Z(re().body,e)[0]}}function g(e){if(I(e,"String")){return C(e)}else{return e}}function ve(e,t,r){if(k(t)){return{target:re().body,event:e,listener:t}}else{return{target:g(e),event:t,listener:r}}}function de(t,r,n){jr(function(){var e=ve(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=k(r);return e?r:n}function ge(t,r,n){jr(function(){var e=ve(t,r,n);e.target.removeEventListener(e.event,e.listener)});return k(r)?r:n}var me=re().createElement("output");function pe(e,t){var r=ne(e,t);if(r){if(r==="this"){return[xe(e,t)]}else{var n=Z(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[me]}else{return n}}}}function xe(e,t){return c(e,function(e){return te(e,t)!=null})}function ye(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return xe(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function be(e){var t=Q.config.attributesToSettle;for(var r=0;r<t.length;r++){if(e===t[r]){return true}}return false}function we(t,r){oe(t.attributes,function(e){if(!r.hasAttribute(e.name)&&be(e.name)){t.removeAttribute(e.name)}});oe(r.attributes,function(e){if(be(e.name)){t.setAttribute(e.name,e.value)}})}function Se(e,t){var r=Fr(t);for(var n=0;n<r.length;n++){var i=r[n];try{if(i.isInlineSwap(e)){return true}}catch(e){b(e)}}return e==="outerHTML"}function Ee(e,i,a){var t="#"+ee(i,"id");var o="outerHTML";if(e==="true"){}else if(e.indexOf(":")>0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Se(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){Fe(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Ce(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a<i.length;a++){var o=i[a].split(":",2);var s=o[0].trim();if(s.indexOf("#")===0){s=s.substring(1)}var l=o[1]||"true";var u=t.querySelector("#"+s);if(u){Ee(l,u,r)}}}oe(f(t,"[hx-swap-oob], [data-hx-swap-oob]"),function(e){var t=te(e,"hx-swap-oob");if(t!=null){Ee(t,e,r)}})}function Re(e){oe(f(e,"[hx-preserve], [data-hx-preserve]"),function(e){var t=te(e,"id");var r=re().getElementById(t);if(r!=null){e.parentNode.replaceChild(r,e)}})}function Te(o,e,s){oe(e.querySelectorAll("[id]"),function(e){var t=ee(e,"id");if(t&&t.length>0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();we(e,i);s.tasks.push(function(){we(e,a)})}}})}function Oe(e){return function(){n(e,Q.config.addedClass);zt(e);Nt(e);qe(e);ce(e,"htmx:load")}}function qe(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function m(e,t,r,n){Te(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;z(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Oe(i))}}}function He(e,t){var r=0;while(r<e.length){t=(t<<5)-t+e.charCodeAt(r++)|0}return t}function Le(e){var t=0;if(e.attributes){for(var r=0;r<e.attributes.length;r++){var n=e.attributes[r];if(n.value){t=He(n.name,t);t=He(n.value,t)}}}return t}function Ae(e){var t=ae(e);if(t.onHandlers){for(var r=0;r<t.onHandlers.length;r++){const n=t.onHandlers[r];e.removeEventListener(n.event,n.listener)}delete t.onHandlers}}function Ne(e){var t=ae(e);if(t.timeout){clearTimeout(t.timeout)}if(t.webSocket){t.webSocket.close()}if(t.sseEventSource){t.sseEventSource.close()}if(t.listenerInfos){oe(t.listenerInfos,function(e){if(e.on){e.on.removeEventListener(e.trigger,e.listener)}})}Ae(e);oe(Object.keys(t),function(e){delete t[e]})}function p(e){ce(e,"htmx:beforeCleanupElement");Ne(e);if(e.children){oe(e.children,function(e){p(e)})}}function Ie(t,e,r){if(t.tagName==="BODY"){return Ue(t,e,r)}else{var n;var i=t.previousSibling;m(u(t),t,e,r);if(i==null){n=u(t).firstChild}else{n=i.nextSibling}r.elts=r.elts.filter(function(e){return e!=t});while(n&&n!==t){if(n.nodeType===Node.ELEMENT_NODE){r.elts.push(n)}n=n.nextElementSibling}p(t);u(t).removeChild(t)}}function ke(e,t,r){return m(e,e.firstChild,t,r)}function Pe(e,t,r){return m(u(e),e,t,r)}function Me(e,t,r){return m(e,null,t,r)}function Xe(e,t,r){return m(u(e),e.nextSibling,t,r)}function De(e,t,r){p(e);return u(e).removeChild(e)}function Ue(e,t,r){var n=e.firstChild;m(e,n,t,r);if(n){while(n.nextSibling){p(n.nextSibling);e.removeChild(n.nextSibling)}p(n);e.removeChild(n)}}function Be(e,t,r){var n=r||ne(e,"hx-select");if(n){var i=re().createDocumentFragment();oe(t.querySelectorAll(n),function(e){i.appendChild(e)});t=i}return t}function Fe(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Ie(r,n,i);return;case"afterbegin":ke(r,n,i);return;case"beforebegin":Pe(r,n,i);return;case"beforeend":Me(r,n,i);return;case"afterend":Xe(r,n,i);return;case"delete":De(r,n,i);return;default:var a=Fr(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(Oe(f))}}}return}}catch(e){b(e)}}if(e==="innerHTML"){Ue(r,n,i)}else{Fe(Q.config.defaultSwapStyle,t,r,n,i)}}}function Ve(e){if(e.indexOf("<title")>-1){var t=e.replace(H,"");var r=t.match(q);if(r){return r[2]}}}function je(e,t,r,n,i,a){i.title=Ve(n);var o=l(n);if(o){Ce(r,o,i);o=Be(r,o,a);Re(o);return Fe(e,r,t,o,i)}}function _e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!P(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l<s.length;l++){ce(r,s[l].trim(),[])}}}var ze=/\s/;var x=/[\s,]/;var $e=/[_$a-zA-Z]/;var We=/[_$a-zA-Z0-9]/;var Ge=['"',"'","/"];var Je=/[^\s]/;var Ze=/[{(]/;var Ke=/[})]/;function Ye(e){var t=[];var r=0;while(r<e.length){if($e.exec(e.charAt(r))){var n=r;while(We.exec(e.charAt(r+1))){r++}t.push(e.substr(n,r-n+1))}else if(Ge.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 Qe(e,t,r){return $e.exec(e.charAt(0))&&e!=="true"&&e!=="false"&&e!=="this"&&e!==r&&t!=="."}function et(e,t,r){if(t[0]==="["){t.shift();var n=1;var i=" return (function("+r+"){ return (";var a=null;while(t.length>0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=Tr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Qe(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function tt(e){var t;if(e.length>0&&Ze.test(e[0])){e.shift();t=y(e,Ke).trim();e.shift()}else{t=y(e,x)}return t}var rt="input, textarea, select";function nt(e,t,r){var n=[];var i=Ye(t);do{y(i,Je);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Je);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Je);var l=et(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=et(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Je);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ze.test(i[0])){var c=tt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=tt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=tt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=tt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Je)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function it(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||nt(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,rt)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function at(e){ae(e).cancelled=true}function ot(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!ct(r,e,Wt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}ot(e,t,r)}},r.pollInterval)}function st(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function lt(t,r,e){if(t.tagName==="A"&&st(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){ht(t,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(n,i,e,t)},r,e,true)})}}function ut(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ft(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function ct(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function ht(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Z(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ft(a,e)){return}if(l||ut(e,a)){e.preventDefault()}if(ct(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var vt=false;var dt=null;function gt(){if(!dt){dt=function(){vt=true};window.addEventListener("scroll",dt);setInterval(function(){if(vt){vt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){mt(e)})}},200)}}function mt(t){if(!o(t,"data-hx-revealed")&&X(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function pt(e,t,r){var n=D(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){xt(e,a[1],0)}if(a[0]==="send"){bt(e)}}}function xt(s,r,n){if(!se(s)){return}if(r.indexOf("/")==0){var e=location.hostname+(location.port?":"+location.port:"");if(location.protocol=="https:"){r="wss://"+e+r}else if(location.protocol=="http:"){r="ws://"+e+r}}var t=Q.createWebSocket(r);t.onerror=function(e){fe(s,"htmx:wsError",{error:e,socket:t});yt(s)};t.onclose=function(e){if([1006,1012,1013].indexOf(e.code)>=0){var t=wt(n);setTimeout(function(){xt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(yt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=M(n.children);for(var a=0;a<i.length;a++){var o=i[a];Ee(te(o,"hx-swap-oob")||"true",o,r)}nr(r.tasks)})}function yt(e){if(!se(e)){ae(e).webSocket.close();return true}}function bt(u){var f=c(u,function(e){return ae(e).webSocket!=null});if(f){u.addEventListener(it(u)[0].trigger,function(e){var t=ae(f).webSocket;var r=xr(u,f);var n=dr(u,"post");var i=n.errors;var a=n.values;var o=Hr(u);var s=le(a,o);var l=yr(s,u);l["HEADERS"]=r;if(i&&i.length>0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ut(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function wt(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(e,t,r){var n=D(r);for(var i=0;i<n.length;i++){var a=n[i].split(/:(.+)/);if(a[0]==="connect"){Et(e,a[1])}if(a[0]==="swap"){Ct(e,a[1])}}}function Et(t,e){var r=Q.createEventSource(e);r.onerror=function(e){fe(t,"htmx:sseError",{error:e,source:r});Tt(t)};ae(t).sseEventSource=r}function Ct(a,o){var s=c(a,Ot);if(s){var l=ae(s).sseEventSource;var u=function(e){if(Tt(s)){return}if(!se(a)){l.removeEventListener(o,u);return}var t=e.data;R(a,function(e){t=e.transformResponse(t,null,a)});var r=wr(a);var n=ye(a);var i=T(a);je(r.swapStyle,n,a,t,i);nr(i.tasks);ce(a,"htmx:sseMessage",e)};ae(a).sseListener=u;l.addEventListener(o,u)}else{fe(a,"htmx:noSSESourceError")}}function Rt(e,t,r){var n=c(e,Ot);if(n){var i=ae(n).sseEventSource;var a=function(){if(!Tt(n)){if(se(e)){t(e)}else{i.removeEventListener(r,a)}}};ae(e).sseListener=a;i.addEventListener(r,a)}else{fe(e,"htmx:noSSESourceError")}}function Tt(e){if(!se(e)){ae(e).sseEventSource.close();return true}}function Ot(e){return ae(e).sseEventSource!=null}function qt(e,t,r,n){var i=function(){if(!r.loaded){r.loaded=true;t(e)}};if(n>0){setTimeout(i,n)}else{i()}}function Ht(t,i,e){var a=false;oe(w,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Lt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(r,n,e,t)})})}});return a}function Lt(n,e,t,r){if(e.sseEvent){Rt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){gt();ht(n,r,t,e);mt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t<e.length;t++){var r=e[t];if(r.isIntersecting){ce(n,"intersect");break}}},i);a.observe(n);ht(n,r,t,e)}else if(e.trigger==="load"){if(!ct(e,n,Wt("load",{elt:n}))){qt(n,r,t,e.delay)}}else if(e.pollInterval>0){t.polling=true;ot(n,r,e)}else{ht(n,r,t,e)}}function At(e){if(Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function Nt(e){if(h(e,"script")){At(e)}oe(f(e,"script"),function(e){At(e)})}function It(e){var t=e.attributes;for(var r=0;r<t.length;r++){var n=t[r].name;if(s(n,"hx-on:")||s(n,"data-hx-on:")||s(n,"hx-on-")||s(n,"data-hx-on-")){return true}}return false}function kt(e){var t=null;var r=[];if(It(e)){r.push(e)}if(document.evaluate){var n=document.evaluate('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or'+' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]',e);while(t=n.iterateNext())r.push(t)}else{var i=e.getElementsByTagName("*");for(var a=0;a<i.length;a++){if(It(i[a])){r.push(i[a])}}}return r}function Pt(e){if(e.querySelectorAll){var t=", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]";var r=e.querySelectorAll(i+t+", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws],"+" [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]");return r}else{return[]}}function Mt(e){var t=v(e.target,"button, input[type='submit']");var r=Dt(e);if(r){r.lastButtonClicked=t}}function Xt(e){var t=Dt(e);if(t){t.lastButtonClicked=null}}function Dt(e){var t=v(e.target,"button, input[type='submit']");if(!t){return}var r=g("#"+ee(t,"form"))||v(t,"form");if(!r){return}return ae(r)}function Ut(e){e.addEventListener("click",Mt);e.addEventListener("focusin",Mt);e.addEventListener("focusout",Xt)}function Bt(e){var t=Ye(e);var r=0;for(var n=0;n<t.length;n++){const i=t[n];if(i==="{"){r++}else if(i==="}"){r--}}return r}function Ft(t,e,r){var n=ae(t);if(!Array.isArray(n.onHandlers)){n.onHandlers=[]}var i;var a=function(e){return Tr(t,function(){if(!i){i=new Function("event",r)}i.call(t,e)})};t.addEventListener(e,a);n.onHandlers.push({event:e,listener:a})}function Vt(e){var t=te(e,"hx-on");if(t){var r={};var n=t.split("\n");var i=null;var a=0;while(n.length>0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Bt(o)}for(var l in r){Ft(e,l,r[l])}}}function jt(e){Ae(e);for(var t=0;t<e.attributes.length;t++){var r=e.attributes[t].name;var n=e.attributes[t].value;if(s(r,"hx-on")||s(r,"data-hx-on")){var i=r.indexOf("-on")+3;var a=r.slice(i,i+1);if(a==="-"||a===":"){var o=r.slice(i+1);if(s(o,":")){o="htmx"+o}else if(s(o,"-")){o="htmx:"+o.slice(1)}else if(s(o,"htmx-")){o="htmx:"+o.slice(5)}Ft(e,o,n)}}}}function _t(t){if(v(t,Q.config.disableSelector)){p(t);return}var r=ae(t);if(r.initHash!==Le(t)){Ne(t);r.initHash=Le(t);Vt(t);ce(t,"htmx:beforeProcessNode");if(t.value){r.lastValue=t.value}var e=it(t);var n=Ht(t,r,e);if(!n){if(ne(t,"hx-boost")==="true"){lt(t,r,e)}else if(o(t,"hx-trigger")){e.forEach(function(e){Lt(t,e,r,function(){})})}}if(t.tagName==="FORM"||ee(t,"type")==="submit"&&o(t,"form")){Ut(t)}var i=te(t,"hx-sse");if(i){St(t,r,i)}var a=te(t,"hx-ws");if(a){pt(t,r,a)}ce(t,"htmx:afterProcessNode")}}function zt(e){e=g(e);if(v(e,Q.config.disableSelector)){p(e);return}_t(e);oe(Pt(e),function(e){_t(e)});oe(kt(e),jt)}function $t(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function Wt(e,t){var r;if(window.CustomEvent&&typeof window.CustomEvent==="function"){r=new CustomEvent(e,{bubbles:true,cancelable:true,detail:t})}else{r=re().createEvent("CustomEvent");r.initCustomEvent(e,true,true,t)}return r}function fe(e,t,r){ce(e,t,le({error:t},r))}function Gt(e){return e==="htmx:afterProcessNode"}function R(e,t){oe(Fr(e),function(e){try{t(e)}catch(e){b(e)}})}function b(e){if(console.error){console.error(e)}else if(console.log){console.log("ERROR: ",e)}}function ce(e,t,r){e=g(e);if(r==null){r={}}r["elt"]=e;var n=Wt(t,r);if(Q.logger&&!Gt(t)){Q.logger(e,t,r)}if(r.error){b(r.error);ce(e,"htmx:error",{errorInfo:r})}var i=e.dispatchEvent(n);var a=$t(t);if(i&&a!==t){var o=Wt(a,n.detail);i=i&&e.dispatchEvent(o)}R(e,function(e){i=i&&(e.onEvent(t,n)!==false&&!n.defaultPrevented)});return i}var Jt=location.pathname+location.search;function Zt(){var e=re().querySelector("[hx-history-elt],[data-hx-history-elt]");return e||re().body}function Kt(e,t,r,n){if(!U()){return}if(Q.config.historyCacheSize<=0){localStorage.removeItem("htmx-history-cache");return}e=B(e);var i=E(localStorage.getItem("htmx-history-cache"))||[];for(var a=0;a<i.length;a++){if(i[a].url===e){i.splice(a,1);break}}var o={url:e,content:t,title:r,scroll:n};ce(re().body,"htmx:historyItemCreated",{item:o,cache:i});i.push(o);while(i.length>Q.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Yt(e){if(!U()){return null}e=B(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r<t.length;r++){if(t[r].url===e){return t[r]}}return null}function Qt(e){var t=Q.config.requestClass;var r=e.cloneNode(true);oe(f(r,"."+t),function(e){n(e,t)});return r.innerHTML}function er(){var e=Zt();var t=Jt||location.pathname+location.search;var r;try{r=re().querySelector('[hx-history="false" i],[data-hx-history="false" i]')}catch(e){r=re().querySelector('[hx-history="false"],[data-hx-history="false"]')}if(!r){ce(re().body,"htmx:beforeHistorySave",{path:t,historyElt:e});Kt(t,Qt(e),re().title,window.scrollY)}if(Q.config.historyEnabled)history.replaceState({htmx:true},re().title,window.location.href)}function tr(e){if(Q.config.getCacheBusterParam){e=e.replace(/org\.htmx\.cache-buster=[^&]*&?/,"");if(G(e,"&")||G(e,"?")){e=e.slice(0,-1)}}if(Q.config.historyEnabled){history.pushState({htmx:true},"",e)}Jt=e}function rr(e){if(Q.config.historyEnabled)history.replaceState({htmx:true},"",e);Jt=e}function nr(e){oe(e,function(e){e.call()})}function ir(a){var e=new XMLHttpRequest;var o={path:a,xhr:e};ce(re().body,"htmx:historyCacheMiss",o);e.open("GET",a,true);e.setRequestHeader("HX-Request","true");e.setRequestHeader("HX-History-Restore-Request","true");e.setRequestHeader("HX-Current-URL",re().location.href);e.onload=function(){if(this.status>=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Zt();var r=T(t);var n=Ve(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ue(t,e,r);nr(r.tasks);Jt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function ar(e){er();e=e||location.pathname+location.search;var t=Yt(e);if(t){var r=l(t.content);var n=Zt();var i=T(n);Ue(n,r,i);nr(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Jt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{ir(e)}}}function or(e){var t=pe(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function sr(e){var t=pe(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function lr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function ur(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.isSameNode(t)){return true}}return false}function fr(e){if(e.name===""||e.name==null||e.disabled||v(e,"fieldset[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 cr(e,t,r){if(e!=null&&t!=null){var n=r[e];if(n===undefined){r[e]=t}else if(Array.isArray(n)){if(Array.isArray(t)){r[e]=n.concat(t)}else{n.push(t)}}else{if(Array.isArray(t)){r[e]=[n].concat(t)}else{r[e]=[n,t]}}}}function hr(t,r,n,e,i){if(e==null||ur(t,e)){return}else{t.push(e)}if(fr(e)){var a=ee(e,"name");var o=e.value;if(e.multiple&&e.tagName==="SELECT"){o=M(e.querySelectorAll("option:checked")).map(function(e){return e.value})}if(e.files){o=M(e.files)}cr(a,o,r);if(i){vr(e,n)}}if(h(e,"form")){var s=e.elements;oe(s,function(e){hr(t,r,n,e,i)})}}function vr(e,t){if(e.willValidate){ce(e,"htmx:validation:validate");if(!e.checkValidity()){t.push({elt:e,message:e.validationMessage,validity:e.validity});ce(e,"htmx:validation:failed",{message:e.validationMessage,validity:e.validity})}}}function dr(e,t){var r=[];var n={};var i={};var a=[];var o=ae(e);if(o.lastButtonClicked&&!se(o.lastButtonClicked)){o.lastButtonClicked=null}var s=h(e,"form")&&e.noValidate!==true||te(e,"hx-validate")==="true";if(o.lastButtonClicked){s=s&&o.lastButtonClicked.formNoValidate!==true}if(t!=="get"){hr(r,i,a,v(e,"form"),s)}hr(r,n,a,e,s);if(o.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&ee(e,"type")==="submit"){var l=o.lastButtonClicked||e;var u=ee(l,"name");cr(u,l.value,i)}var f=pe(e,"hx-include");oe(f,function(e){hr(r,n,a,e,s);if(!h(e,"form")){oe(e.querySelectorAll(rt),function(e){hr(r,n,a,e,s)})}});n=le(n,i);return{errors:a,values:n}}function gr(e,t,r){if(e!==""){e+="&"}if(String(r)==="[object Object]"){r=JSON.stringify(r)}var n=encodeURIComponent(r);e+=encodeURIComponent(t)+"="+n;return e}function mr(e){var t="";for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){oe(n,function(e){t=gr(t,r,e)})}else{t=gr(t,r,n)}}}return t}function pr(e){var t=new FormData;for(var r in e){if(e.hasOwnProperty(r)){var n=e[r];if(Array.isArray(n)){oe(n,function(e){t.append(r,e)})}else{t.append(r,n)}}}return t}function xr(e,t,r){var n={"HX-Request":"true","HX-Trigger":ee(e,"id"),"HX-Trigger-Name":ee(e,"name"),"HX-Target":te(t,"id"),"HX-Current-URL":re().location.href};Rr(e,"hx-headers",false,n);if(r!==undefined){n["HX-Prompt"]=r}if(ae(e).boosted){n["HX-Boosted"]="true"}return n}function yr(t,e){var r=ne(e,"hx-params");if(r){if(r==="none"){return{}}else if(r==="*"){return t}else if(r.indexOf("not ")===0){oe(r.substr(4).split(","),function(e){e=e.trim();delete t[e]});return t}else{var n={};oe(r.split(","),function(e){e=e.trim();n[e]=t[e]});return n}}else{return t}}function br(e){return ee(e,"href")&&ee(e,"href").indexOf("#")>=0}function wr(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!br(e)){n["show"]="top"}if(r){var i=D(r);if(i.length>0){for(var a=0;a<i.length;a++){var o=i[a];if(o.indexOf("swap:")===0){n["swapDelay"]=d(o.substr(5))}else if(o.indexOf("settle:")===0){n["settleDelay"]=d(o.substr(7))}else if(o.indexOf("transition:")===0){n["transition"]=o.substr(11)==="true"}else if(o.indexOf("ignoreTitle:")===0){n["ignoreTitle"]=o.substr(12)==="true"}else if(o.indexOf("scroll:")===0){var s=o.substr(7);var l=s.split(":");var u=l.pop();var f=l.length>0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Sr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Er(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Sr(r)){return pr(n)}else{return mr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Cr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Rr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=Tr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Rr(u(e),t,r,n)}function Tr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Or(e,t){return Rr(e,"hx-vars",true,t)}function qr(e,t){return Rr(e,"hx-vals",false,t)}function Hr(e){return le(Or(e),qr(e))}function Lr(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 Ar(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Nr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||I(r,"String")){return he(e,t,null,null,{targetOverride:g(r),returnPromise:true})}else{return he(e,t,g(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:g(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Ir(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function kr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=s(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Mr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||ye(n);if(u==null||u==me){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var m=ne(n,"hx-sync");var p=null;var x=false;if(m){var B=m.split(":");var F=B[0].trim();if(F==="this"){g=xe(n,"hx-sync")}else{g=ue(n,F)}m=(B[1]||"drop").trim();f=ae(g);if(m==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(m==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(m==="replace"){ce(g,"htmx:abort")}else if(m.indexOf("queue")===0){var V=m.split(" ");p=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(p==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){p=y.triggerSpec.queue}}if(p==null){p="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(p==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=xr(n,u,S);if(t!=="get"&&!Sr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=dr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Hr(n);var $=le(R,z);var T=yr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Rr(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=mr(T);if(L){A+="#"+L}}}if(!kr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Lr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Ir(n);I.pathInfo.responsePath=Ar(b);M(n,I);lr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=or(n);var P=sr(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Er(b,n,T);b.send(Y);return l}function Pr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Mr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){_e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){er();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}Nr("GET",r,v).then(function(){tr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Pr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var m=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:m},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;m=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){at(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){er()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=wr(l,s);if(v.hasOwnProperty("ignoreTitle")){m=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var p=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){tr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{rr(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);je(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}_e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!m){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Cr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}_e(f,"HX-Trigger-After-Settle",r)}ie(p)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){p=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Xr={};function Dr(){return{init:function(e){return null},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 Ur(e,t){if(t.init){t.init(r)}Xr[e]=le(Dr(),t)}function Br(e){delete Xr[e]}function Fr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Xr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Fr(u(e),r,n)}var Vr=false;re().addEventListener("DOMContentLoaded",function(){Vr=true});function jr(e){if(Vr||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function _r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","<style> ."+Q.config.indicatorClass+"{opacity:0} ."+Q.config.requestClass+" ."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+Q.config.requestClass+"."+Q.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} </style>")}}function zr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function $r(){var e=zr();if(e){Q.config=le(Q.config,e)}}jr(function(){$r();_r();var e=re().body;zt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){ar();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()}); |
|
3 | 3 |
\ No newline at end of file |