covara 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli/templates/readme.js +2 -2
- package/dist/client/live-store.d.ts.map +1 -1
- package/dist/client/live-store.js +18 -3
- package/dist/client/live-store.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/securityHeaders.d.ts +1 -0
- package/dist/middleware/securityHeaders.d.ts.map +1 -1
- package/dist/middleware/securityHeaders.js +6 -3
- package/dist/middleware/securityHeaders.js.map +1 -1
- package/dist/resource/pagination.d.ts.map +1 -1
- package/dist/resource/pagination.js +32 -4
- package/dist/resource/pagination.js.map +1 -1
- package/dist/ui/html/client/data-explorer-app.d.ts +2 -0
- package/dist/ui/html/client/data-explorer-app.d.ts.map +1 -0
- package/dist/ui/html/client/data-explorer-app.js +441 -0
- package/dist/ui/html/client/data-explorer-app.js.map +1 -0
- package/dist/ui/html/client/htmx-vendor.d.ts +3 -0
- package/dist/ui/html/client/htmx-vendor.d.ts.map +1 -0
- package/dist/ui/html/client/htmx-vendor.js +5 -0
- package/dist/ui/html/client/htmx-vendor.js.map +1 -0
- package/dist/ui/html/client/runtime.d.ts +2 -0
- package/dist/ui/html/client/runtime.d.ts.map +1 -0
- package/dist/ui/html/client/runtime.js +198 -0
- package/dist/ui/html/client/runtime.js.map +1 -0
- package/dist/ui/html/components/index.d.ts +5 -1
- package/dist/ui/html/components/index.d.ts.map +1 -1
- package/dist/ui/html/components/index.js +10 -5
- package/dist/ui/html/components/index.js.map +1 -1
- package/dist/ui/html/icons.d.ts +3 -0
- package/dist/ui/html/icons.d.ts.map +1 -0
- package/dist/ui/html/icons.js +23 -0
- package/dist/ui/html/icons.js.map +1 -0
- package/dist/ui/html/layout.d.ts.map +1 -1
- package/dist/ui/html/layout.js +33 -17
- package/dist/ui/html/layout.js.map +1 -1
- package/dist/ui/html/pages/dashboard.d.ts.map +1 -1
- package/dist/ui/html/pages/dashboard.js +6 -5
- package/dist/ui/html/pages/dashboard.js.map +1 -1
- package/dist/ui/html/pages/data-explorer.d.ts.map +1 -1
- package/dist/ui/html/pages/data-explorer.js +5 -89
- package/dist/ui/html/pages/data-explorer.js.map +1 -1
- package/dist/ui/html/styles.d.ts +1 -1
- package/dist/ui/html/styles.d.ts.map +1 -1
- package/dist/ui/html/styles.js +357 -40
- package/dist/ui/html/styles.js.map +1 -1
- package/dist/ui/middleware.d.ts.map +1 -1
- package/dist/ui/middleware.js +35 -0
- package/dist/ui/middleware.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
// Client-side Data Explorer: a full data tool over any registered resource —
|
|
2
|
+
// sortable grid, cursor pagination, visual filter builder, free-text quick
|
|
3
|
+
// search, row selection + bulk delete, column visibility, saved views, density,
|
|
4
|
+
// CSV/JSON export, inline cell editing, schema-driven create/edit, a detail
|
|
5
|
+
// drawer, and auto-refresh. Talks to the admin JSON API at {base}/api/explorer.
|
|
6
|
+
// Served verbatim as JS (no build step).
|
|
7
|
+
export const dataExplorerScript = String.raw `
|
|
8
|
+
(function () {
|
|
9
|
+
// On a full page load this body script can run before the deferred runtime
|
|
10
|
+
// (window.Covara) has executed, and before #dx-root is parsed. Wait for both
|
|
11
|
+
// so the app boots reliably whether reached by direct URL or htmx navigation.
|
|
12
|
+
function whenReady(cb) {
|
|
13
|
+
var attempt = function () {
|
|
14
|
+
if (document.getElementById('dx-root') && window.Covara) { cb(); return; }
|
|
15
|
+
setTimeout(attempt, 30);
|
|
16
|
+
};
|
|
17
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', attempt);
|
|
18
|
+
else attempt();
|
|
19
|
+
}
|
|
20
|
+
whenReady(function () {
|
|
21
|
+
var root = document.getElementById('dx-root');
|
|
22
|
+
var C = window.Covara;
|
|
23
|
+
var api = C.base + '/api/explorer';
|
|
24
|
+
var LS = 'covara.dx.';
|
|
25
|
+
|
|
26
|
+
var state = {
|
|
27
|
+
resource: null, schema: null, readOnly: true, columns: [], pk: 'id', allResources: [],
|
|
28
|
+
rows: [], orderBy: null, dir: 'asc', filters: [], search: '', limit: 50,
|
|
29
|
+
cursorStack: [], nextCursor: null, total: null, autoRefresh: false, timer: null,
|
|
30
|
+
hidden: {}, density: 'comfortable', selected: {}, filtersOpen: false, pop: null
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
var OPS = [
|
|
34
|
+
{ v: '==', label: '=' }, { v: '!=', label: '≠' },
|
|
35
|
+
{ v: '>', label: '>' }, { v: '>=', label: '≥' }, { v: '<', label: '<' }, { v: '<=', label: '≤' },
|
|
36
|
+
{ v: '=contains=', label: 'contains' }, { v: '=in=', label: 'in (a,b)' }, { v: '=isnull=', label: 'is null' }
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
function qs() { var m = (location.search.match(/[?&]resource=([^&]+)/) || [])[1]; return m ? decodeURIComponent(m) : null; }
|
|
40
|
+
function isNum(t) { return /int|float|double|decimal|number|real|numeric/i.test(t || ''); }
|
|
41
|
+
function isBool(t) { return /bool/i.test(t || ''); }
|
|
42
|
+
function isJson(t) { return /json/i.test(t || ''); }
|
|
43
|
+
function isDate(t) { return /date|time|timestamp/i.test(t || ''); }
|
|
44
|
+
function isText(t) { return /text|char|string|varchar/i.test(t || ''); }
|
|
45
|
+
function colType(name) { var c = state.columns.find(function (c) { return c.name === name; }); return c ? c.type : ''; }
|
|
46
|
+
|
|
47
|
+
// ---- localStorage prefs --------------------------------------------------
|
|
48
|
+
function pref(key) { return LS + state.resource + '.' + key; }
|
|
49
|
+
function loadPrefs() {
|
|
50
|
+
try {
|
|
51
|
+
var h = JSON.parse(localStorage.getItem(pref('hidden')) || '{}'); state.hidden = h || {};
|
|
52
|
+
} catch (e) { state.hidden = {}; }
|
|
53
|
+
state.density = localStorage.getItem(LS + 'density') || 'comfortable';
|
|
54
|
+
}
|
|
55
|
+
function saveHidden() { try { localStorage.setItem(pref('hidden'), JSON.stringify(state.hidden)); } catch (e) {} }
|
|
56
|
+
function savedViews() { try { return JSON.parse(localStorage.getItem(pref('views')) || '[]'); } catch (e) { return []; } }
|
|
57
|
+
function setViews(v) { try { localStorage.setItem(pref('views'), JSON.stringify(v)); } catch (e) {} }
|
|
58
|
+
|
|
59
|
+
// ---- filter construction -------------------------------------------------
|
|
60
|
+
function quote(field, op, raw) {
|
|
61
|
+
var t = colType(field);
|
|
62
|
+
if (op === '=isnull=') return field + '=isnull=true';
|
|
63
|
+
if (op === '=in=') return field + '=in=(' + raw + ')';
|
|
64
|
+
if (isNum(t) || isBool(t)) return field + op + raw;
|
|
65
|
+
return field + op + '"' + String(raw).replace(/"/g, '\\"') + '"';
|
|
66
|
+
}
|
|
67
|
+
function buildFilter() {
|
|
68
|
+
var parts = state.filters.filter(function (f) { return f.field && f.op && (f.op === '=isnull=' || f.value !== ''); })
|
|
69
|
+
.map(function (f) { return quote(f.field, f.op, f.value); });
|
|
70
|
+
if (state.search) {
|
|
71
|
+
var q = state.search.replace(/"/g, '\\"');
|
|
72
|
+
var textCols = state.columns.filter(function (c) { return isText(c.type); });
|
|
73
|
+
if (textCols.length) {
|
|
74
|
+
var group = textCols.map(function (c) { return c.name + '=contains="' + q + '"'; }).join(',');
|
|
75
|
+
parts.push('(' + group + ')');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return parts.join(';');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ---- data load -----------------------------------------------------------
|
|
82
|
+
async function loadSchemas() {
|
|
83
|
+
var r = await C.fetchJSON(api + '/schemas');
|
|
84
|
+
state.readOnly = !!r.readOnly;
|
|
85
|
+
return (r.schemas || []).map(function (s) { return s.name || s.resource || s; });
|
|
86
|
+
}
|
|
87
|
+
async function selectResource(name) {
|
|
88
|
+
state.resource = name; state.cursorStack = []; state.nextCursor = null; state.filters = []; state.search = ''; state.selected = {};
|
|
89
|
+
var s = await C.fetchJSON(api + '/schemas/' + encodeURIComponent(name));
|
|
90
|
+
state.schema = s.schema || s;
|
|
91
|
+
state.columns = state.schema.columns || [];
|
|
92
|
+
state.pk = (state.columns.find(function (c) { return c.isPrimary; }) || state.columns[0] || {}).name || 'id';
|
|
93
|
+
state.orderBy = state.pk; state.dir = 'asc';
|
|
94
|
+
loadPrefs();
|
|
95
|
+
var url = new URL(location.href); url.searchParams.set('resource', name); history.replaceState(null, '', url);
|
|
96
|
+
await loadData(); render();
|
|
97
|
+
}
|
|
98
|
+
async function loadData(cursor) {
|
|
99
|
+
if (!state.resource) return;
|
|
100
|
+
var p = new URLSearchParams();
|
|
101
|
+
p.set('limit', String(state.limit));
|
|
102
|
+
p.set('orderBy', state.orderBy + (state.dir === 'desc' ? ':desc' : ':asc'));
|
|
103
|
+
p.set('totalCount', 'true');
|
|
104
|
+
var f = buildFilter(); if (f) p.set('filter', f);
|
|
105
|
+
if (cursor) p.set('cursor', cursor);
|
|
106
|
+
var r = await C.fetchJSON(api + '/data/' + encodeURIComponent(state.resource) + '?' + p.toString());
|
|
107
|
+
state.rows = r.items || [];
|
|
108
|
+
state.nextCursor = r.nextCursor || r.cursor || null;
|
|
109
|
+
state.total = (typeof r.totalCount === 'number') ? r.totalCount : (typeof r.total === 'number' ? r.total : null);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ---- helpers -------------------------------------------------------------
|
|
113
|
+
function visibleCols() { return state.columns.filter(function (c) { return !state.hidden[c.name]; }); }
|
|
114
|
+
function selCount() { return Object.keys(state.selected).filter(function (k) { return state.selected[k]; }).length; }
|
|
115
|
+
function fmtCell(val, col) {
|
|
116
|
+
if (val === null || val === undefined) return '<span class="cell-null">null</span>';
|
|
117
|
+
if (typeof val === 'boolean') return '<span class="cell-bool">' + val + '</span>';
|
|
118
|
+
if (typeof val === 'object') return '<span class="cell-json">' + C.escapeHtml(JSON.stringify(val)) + '</span>';
|
|
119
|
+
var s = String(val);
|
|
120
|
+
if (col && col.isPrimary) return '<span class="pk">' + C.escapeHtml(s) + '</span>';
|
|
121
|
+
return C.escapeHtml(s.length > 200 ? s.slice(0, 200) + '…' : s);
|
|
122
|
+
}
|
|
123
|
+
function closePop() { if (state.pop) { state.pop = null; render(); } }
|
|
124
|
+
document.addEventListener('click', function (e) {
|
|
125
|
+
if (state.pop && !e.target.closest('.dx-pop-wrap')) closePop();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// ---- render --------------------------------------------------------------
|
|
129
|
+
function render() {
|
|
130
|
+
root.innerHTML = '';
|
|
131
|
+
root.appendChild(toolbar());
|
|
132
|
+
if (state.filtersOpen) root.appendChild(filterPanel());
|
|
133
|
+
if (selCount() > 0) root.appendChild(bulkBar());
|
|
134
|
+
if (!state.resource) { root.appendChild(C.el('div', { class: 'card', html: '<div class="empty-state"><div class="empty-icon">▣</div><div class="empty-title">Select a resource</div><div class="empty-desc">Pick a resource above to browse its data.</div></div>' })); return; }
|
|
135
|
+
root.appendChild(grid());
|
|
136
|
+
root.appendChild(footer());
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function popMenu(label, builder) {
|
|
140
|
+
var id = label.toLowerCase();
|
|
141
|
+
var btn = C.el('button', { class: 'btn btn-secondary btn-sm', onclick: function (e) { e.stopPropagation(); state.pop = state.pop === id ? null : id; render(); } }, [label + ' ▾']);
|
|
142
|
+
var wrap = C.el('div', { class: 'dx-pop-wrap' }, [btn]);
|
|
143
|
+
if (state.pop === id) wrap.appendChild(builder());
|
|
144
|
+
return wrap;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function toolbar() {
|
|
148
|
+
var sel = C.el('select', { class: 'select dx-resource-select', onchange: function (e) { selectResource(e.target.value); } });
|
|
149
|
+
sel.appendChild(C.el('option', { value: '', text: 'Select resource…' }));
|
|
150
|
+
state.allResources.forEach(function (name) { var o = C.el('option', { value: name, text: name }); if (name === state.resource) o.selected = true; sel.appendChild(o); });
|
|
151
|
+
|
|
152
|
+
var search = C.el('input', { class: 'input dx-search', type: 'search', placeholder: '⌕ Quick search…', value: state.search });
|
|
153
|
+
var t;
|
|
154
|
+
search.addEventListener('input', function (e) { state.search = e.target.value; clearTimeout(t); t = setTimeout(function () { reload(); }, 280); });
|
|
155
|
+
|
|
156
|
+
var filterBtn = C.el('button', { class: 'btn btn-secondary btn-sm', onclick: function () { state.filtersOpen = !state.filtersOpen; if (state.filtersOpen && !state.filters.length) addFilter(); render(); } },
|
|
157
|
+
['⚲ Filters' + (state.filters.length ? ' (' + state.filters.length + ')' : '')]);
|
|
158
|
+
|
|
159
|
+
var right = C.el('div', { class: 'row' });
|
|
160
|
+
if (state.resource) {
|
|
161
|
+
right.appendChild(popMenu('Columns', columnsMenu));
|
|
162
|
+
right.appendChild(popMenu('Views', viewsMenu));
|
|
163
|
+
right.appendChild(popMenu('Export', exportMenu));
|
|
164
|
+
right.appendChild(densityToggle());
|
|
165
|
+
var autoWrap = C.el('label', { class: 'row', style: 'font-size:12.5px;color:var(--text-2);gap:7px' }, [makeSwitch(state.autoRefresh, toggleAuto), 'Live']);
|
|
166
|
+
right.appendChild(autoWrap);
|
|
167
|
+
right.appendChild(C.el('button', { class: 'btn btn-secondary btn-sm', title: 'Refresh', onclick: function () { reload(); } }, ['↻']));
|
|
168
|
+
if (!state.readOnly) right.appendChild(C.el('button', { class: 'btn btn-primary btn-sm', onclick: function () { openForm(null); } }, ['+ New']));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
var left = C.el('div', { class: 'row', style: 'flex:1' }, [sel, search, filterBtn]);
|
|
172
|
+
return C.el('div', { class: 'dx-toolbar' }, [left, C.el('span', { class: 'dx-spacer' }), right]);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function makeSwitch(on, cb) {
|
|
176
|
+
var w = C.el('span', { class: 'switch' }); var i = C.el('input', { type: 'checkbox' }); i.checked = on;
|
|
177
|
+
i.addEventListener('change', function () { cb(i.checked); }); w.appendChild(i); w.appendChild(C.el('span', { class: 'track' })); return w;
|
|
178
|
+
}
|
|
179
|
+
function densityToggle() {
|
|
180
|
+
return C.el('div', { class: 'segmented' }, ['comfortable', 'compact'].map(function (d) {
|
|
181
|
+
return C.el('button', { class: state.density === d ? 'active' : '', title: d, onclick: function () { state.density = d; localStorage.setItem(LS + 'density', d); render(); } }, [d === 'compact' ? '≡' : '☰']);
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function columnsMenu() {
|
|
186
|
+
var items = state.columns.map(function (c) {
|
|
187
|
+
return C.el('label', { class: 'dx-pop-item' }, [
|
|
188
|
+
(function () { var i = C.el('input', { type: 'checkbox' }); i.checked = !state.hidden[c.name]; i.addEventListener('change', function () { if (i.checked) delete state.hidden[c.name]; else state.hidden[c.name] = true; saveHidden(); render(); }); return i; })(),
|
|
189
|
+
C.el('span', { text: c.name }), C.el('span', { class: 'cmdk-hint', text: c.type })
|
|
190
|
+
]);
|
|
191
|
+
});
|
|
192
|
+
var reset = C.el('div', { class: 'dx-pop-item', onclick: function () { state.hidden = {}; saveHidden(); render(); } }, ['↺ Show all']);
|
|
193
|
+
return C.el('div', { class: 'dx-pop' }, [C.el('div', { class: 'dx-pop-title', text: 'Columns' })].concat(items).concat([C.el('div', { class: 'dx-pop-sep' }), reset]));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function viewsMenu() {
|
|
197
|
+
var views = savedViews();
|
|
198
|
+
var nodes = [C.el('div', { class: 'dx-pop-title', text: 'Saved views' })];
|
|
199
|
+
if (!views.length) nodes.push(C.el('div', { class: 'dx-pop-item muted', text: 'No saved views' }));
|
|
200
|
+
views.forEach(function (v, i) {
|
|
201
|
+
nodes.push(C.el('div', { class: 'dx-pop-item', onclick: function () { applyView(v); } }, [
|
|
202
|
+
C.el('span', { text: '▸' }), C.el('span', { text: v.name, style: 'flex:1' }),
|
|
203
|
+
C.el('button', { class: 'copy-btn', title: 'Delete', onclick: function (e) { e.stopPropagation(); views.splice(i, 1); setViews(views); render(); } }, ['✕'])
|
|
204
|
+
]));
|
|
205
|
+
});
|
|
206
|
+
nodes.push(C.el('div', { class: 'dx-pop-sep' }));
|
|
207
|
+
nodes.push(C.el('div', { class: 'dx-pop-item', onclick: function () {
|
|
208
|
+
var name = prompt('Save current view as:'); if (!name) return;
|
|
209
|
+
var v = { name: name, filters: state.filters, search: state.search, orderBy: state.orderBy, dir: state.dir, hidden: state.hidden };
|
|
210
|
+
var vs = savedViews(); vs.push(v); setViews(vs); C.toast('View saved', 'success'); render();
|
|
211
|
+
} }, ['+ Save current view']));
|
|
212
|
+
return C.el('div', { class: 'dx-pop' }, nodes);
|
|
213
|
+
}
|
|
214
|
+
function applyView(v) {
|
|
215
|
+
state.filters = JSON.parse(JSON.stringify(v.filters || [])); state.search = v.search || '';
|
|
216
|
+
state.orderBy = v.orderBy || state.pk; state.dir = v.dir || 'asc'; state.hidden = Object.assign({}, v.hidden || {});
|
|
217
|
+
saveHidden(); reload();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function exportMenu() {
|
|
221
|
+
return C.el('div', { class: 'dx-pop' }, [
|
|
222
|
+
C.el('div', { class: 'dx-pop-title', text: 'Export current page' }),
|
|
223
|
+
C.el('div', { class: 'dx-pop-item', onclick: function () { exportCSV(); } }, ['⤓ CSV']),
|
|
224
|
+
C.el('div', { class: 'dx-pop-item', onclick: function () { exportJSON(); } }, ['⤓ JSON'])
|
|
225
|
+
]);
|
|
226
|
+
}
|
|
227
|
+
function download(name, content, mime) {
|
|
228
|
+
var blob = new Blob([content], { type: mime }); var url = URL.createObjectURL(blob);
|
|
229
|
+
var a = C.el('a', { href: url, download: name }); document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url);
|
|
230
|
+
}
|
|
231
|
+
function exportJSON() { download(state.resource + '.json', JSON.stringify(state.rows, null, 2), 'application/json'); C.toast('Exported JSON', 'success'); }
|
|
232
|
+
function exportCSV() {
|
|
233
|
+
var cols = visibleCols().map(function (c) { return c.name; });
|
|
234
|
+
var esc = function (v) { if (v === null || v === undefined) return ''; var s = typeof v === 'object' ? JSON.stringify(v) : String(v); return /[",\n]/.test(s) ? '"' + s.replace(/"/g, '""') + '"' : s; };
|
|
235
|
+
var lines = [cols.join(',')].concat(state.rows.map(function (r) { return cols.map(function (c) { return esc(r[c]); }).join(','); }));
|
|
236
|
+
download(state.resource + '.csv', lines.join('\n'), 'text/csv'); C.toast('Exported CSV', 'success');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ---- filter builder ------------------------------------------------------
|
|
240
|
+
function filterPanel() {
|
|
241
|
+
var rows = state.filters.map(function (f, i) { return filterRow(f, i); });
|
|
242
|
+
var add = C.el('button', { class: 'btn btn-ghost btn-sm', onclick: function () { addFilter(); render(); } }, ['+ Add condition']);
|
|
243
|
+
var apply = C.el('button', { class: 'btn btn-primary btn-sm', onclick: function () { reload(); } }, ['Apply']);
|
|
244
|
+
var clear = C.el('button', { class: 'btn btn-ghost btn-sm', onclick: function () { state.filters = []; reload(); } }, ['Clear']);
|
|
245
|
+
return C.el('div', { class: 'dx-filters' }, rows.concat([C.el('div', { class: 'row', style: 'margin-top:4px' }, [add, C.el('span', { class: 'dx-spacer' }), clear, apply])]));
|
|
246
|
+
}
|
|
247
|
+
function filterRow(f, i) {
|
|
248
|
+
var fieldSel = C.el('select', { class: 'select', onchange: function (e) { f.field = e.target.value; } });
|
|
249
|
+
state.columns.forEach(function (c) { var o = C.el('option', { value: c.name, text: c.name }); if (c.name === f.field) o.selected = true; fieldSel.appendChild(o); });
|
|
250
|
+
var opSel = C.el('select', { class: 'select', style: 'max-width:150px', onchange: function (e) { f.op = e.target.value; render(); } });
|
|
251
|
+
OPS.forEach(function (op) { var o = C.el('option', { value: op.v, text: op.label }); if (op.v === f.op) o.selected = true; opSel.appendChild(o); });
|
|
252
|
+
var val = C.el('input', { class: 'input', placeholder: f.op === '=in=' ? 'a,b,c' : 'value', value: f.value || '', oninput: function (e) { f.value = e.target.value; } });
|
|
253
|
+
if (f.op === '=isnull=') val.style.display = 'none';
|
|
254
|
+
var del = C.el('button', { class: 'btn btn-ghost btn-icon btn-sm', onclick: function () { state.filters.splice(i, 1); render(); } }, ['✕']);
|
|
255
|
+
return C.el('div', { class: 'dx-filter-row' }, [fieldSel, opSel, val, del]);
|
|
256
|
+
}
|
|
257
|
+
function addFilter() { state.filters.push({ field: (state.columns[0] || {}).name || '', op: '==', value: '' }); }
|
|
258
|
+
|
|
259
|
+
// ---- bulk bar ------------------------------------------------------------
|
|
260
|
+
function bulkBar() {
|
|
261
|
+
var n = selCount();
|
|
262
|
+
var nodes = [C.el('span', { text: n + ' selected' }), C.el('span', { class: 'dx-spacer', style: 'flex:1' }),
|
|
263
|
+
C.el('button', { class: 'btn btn-ghost btn-sm', onclick: function () { state.selected = {}; render(); } }, ['Clear'])];
|
|
264
|
+
if (!state.readOnly) nodes.push(C.el('button', { class: 'btn btn-danger btn-sm', onclick: bulkDelete }, ['🗑 Delete ' + n]));
|
|
265
|
+
return C.el('div', { class: 'dx-bulkbar' }, nodes);
|
|
266
|
+
}
|
|
267
|
+
async function bulkDelete() {
|
|
268
|
+
var ids = Object.keys(state.selected).filter(function (k) { return state.selected[k]; });
|
|
269
|
+
if (!confirm('Delete ' + ids.length + ' ' + state.resource + ' record(s)? This cannot be undone.')) return;
|
|
270
|
+
var ok = 0, fail = 0;
|
|
271
|
+
for (var i = 0; i < ids.length; i++) {
|
|
272
|
+
try { await C.fetchJSON(api + '/data/' + encodeURIComponent(state.resource) + '/' + encodeURIComponent(ids[i]), { method: 'DELETE' }); ok++; }
|
|
273
|
+
catch (e) { fail++; }
|
|
274
|
+
}
|
|
275
|
+
state.selected = {}; C.toast(ok + ' deleted' + (fail ? ', ' + fail + ' failed' : ''), fail ? 'error' : 'success'); reload();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ---- grid ----------------------------------------------------------------
|
|
279
|
+
function grid() {
|
|
280
|
+
var cols = visibleCols();
|
|
281
|
+
var allSel = state.rows.length && state.rows.every(function (r) { return state.selected[r[state.pk]]; });
|
|
282
|
+
var headChk = C.el('th', { class: 'dx-check' }, [(function () { var i = C.el('input', { type: 'checkbox' }); i.checked = !!allSel; i.addEventListener('change', function () { state.rows.forEach(function (r) { state.selected[r[state.pk]] = i.checked; }); render(); }); return i; })()]);
|
|
283
|
+
var thead = C.el('tr', {}, [headChk].concat(cols.map(function (c) {
|
|
284
|
+
return C.el('th', { class: c.name === state.orderBy ? 'sorted' : '', onclick: function () { sortBy(c.name); } }, [c.name, C.el('span', { class: 'sort', text: c.name === state.orderBy ? (state.dir === 'asc' ? '▲' : '▼') : '↕' })]);
|
|
285
|
+
})));
|
|
286
|
+
if (!state.readOnly) thead.appendChild(C.el('th', { style: 'width:70px' }, ['']));
|
|
287
|
+
|
|
288
|
+
var tbody = C.el('tbody');
|
|
289
|
+
if (!state.rows.length) {
|
|
290
|
+
tbody.appendChild(C.el('tr', {}, [C.el('td', { colspan: String(cols.length + 2), html: '<div class="empty-state"><div class="empty-icon">∅</div><div class="empty-title">No rows</div><div class="empty-desc">Nothing matches the current filter.</div></div>' })]));
|
|
291
|
+
}
|
|
292
|
+
state.rows.forEach(function (row) {
|
|
293
|
+
var pkv = row[state.pk];
|
|
294
|
+
var tr = C.el('tr', { class: state.selected[pkv] ? 'selected' : '' });
|
|
295
|
+
var chk = C.el('td', { class: 'dx-check', onclick: function (e) { e.stopPropagation(); } }, [(function () { var i = C.el('input', { type: 'checkbox' }); i.checked = !!state.selected[pkv]; i.addEventListener('change', function () { state.selected[pkv] = i.checked; tr.classList.toggle('selected', i.checked); if (selCount() === 0 || selCount() === 1) render(); }); return i; })()]);
|
|
296
|
+
tr.appendChild(chk);
|
|
297
|
+
cols.forEach(function (c) {
|
|
298
|
+
var editable = !state.readOnly && !c.isPrimary;
|
|
299
|
+
var td = C.el('td', { class: editable ? 'dx-editable' : '', html: fmtCell(row[c.name], c) });
|
|
300
|
+
td.addEventListener('click', function () { openDetail(row); });
|
|
301
|
+
if (editable) td.addEventListener('dblclick', function (e) { e.stopPropagation(); editCell(td, row, c); });
|
|
302
|
+
tr.appendChild(td);
|
|
303
|
+
});
|
|
304
|
+
if (!state.readOnly) {
|
|
305
|
+
var actions = C.el('div', { class: 'dx-rowactions' }, [
|
|
306
|
+
C.el('button', { class: 'btn btn-ghost btn-icon btn-sm', title: 'Edit', onclick: function (e) { e.stopPropagation(); openForm(row); } }, ['✎']),
|
|
307
|
+
C.el('button', { class: 'btn btn-ghost btn-icon btn-sm', title: 'Delete', onclick: function (e) { e.stopPropagation(); del(row); } }, ['🗑'])
|
|
308
|
+
]);
|
|
309
|
+
tr.appendChild(C.el('td', { onclick: function (e) { e.stopPropagation(); } }, [actions]));
|
|
310
|
+
}
|
|
311
|
+
tbody.appendChild(tr);
|
|
312
|
+
});
|
|
313
|
+
return C.el('div', { class: 'dx-grid-wrap' }, [C.el('table', { class: 'dx-grid' + (state.density === 'compact' ? ' compact' : '') }, [C.el('thead', {}, [thead]), tbody])]);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function footer() {
|
|
317
|
+
var info = state.total != null ? (state.total.toLocaleString() + ' rows') : (state.rows.length + ' shown');
|
|
318
|
+
var prev = C.el('button', { class: 'btn btn-secondary btn-sm', onclick: pagePrev }, ['← Prev']); prev.disabled = state.cursorStack.length === 0;
|
|
319
|
+
var next = C.el('button', { class: 'btn btn-secondary btn-sm', onclick: pageNext }, ['Next →']); next.disabled = !state.nextCursor;
|
|
320
|
+
var sizes = C.el('select', { class: 'select', style: 'width:auto;height:28px', onchange: function (e) { state.limit = parseInt(e.target.value, 10); reload(); } });
|
|
321
|
+
[25, 50, 100, 200].forEach(function (n) { var o = C.el('option', { value: String(n), text: n + ' / page' }); if (n === state.limit) o.selected = true; sizes.appendChild(o); });
|
|
322
|
+
return C.el('div', { class: 'dx-foot', style: 'padding:4px 2px' }, [C.el('span', { text: info }), C.el('span', { class: 'dx-spacer', style: 'flex:1' }), sizes, prev, next]);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// ---- inline cell edit ----------------------------------------------------
|
|
326
|
+
function editCell(td, row, col) {
|
|
327
|
+
var current = row[col.name];
|
|
328
|
+
td.classList.add('editing'); td.innerHTML = '';
|
|
329
|
+
var inp = C.el('input', { class: 'dx-cell-edit', value: current != null && typeof current !== 'object' ? String(current) : (current != null ? JSON.stringify(current) : '') });
|
|
330
|
+
if (isNum(col.type)) inp.type = 'number';
|
|
331
|
+
td.appendChild(inp); inp.focus(); inp.select();
|
|
332
|
+
var done = false;
|
|
333
|
+
function commit() {
|
|
334
|
+
if (done) return; done = true;
|
|
335
|
+
var raw = inp.value, val;
|
|
336
|
+
try {
|
|
337
|
+
if (raw === '') val = null;
|
|
338
|
+
else if (isNum(col.type)) val = Number(raw);
|
|
339
|
+
else if (isBool(col.type)) val = raw === 'true' || raw === '1';
|
|
340
|
+
else if (isJson(col.type)) val = JSON.parse(raw);
|
|
341
|
+
else val = raw;
|
|
342
|
+
} catch (e) { C.toast('Invalid value: ' + e.message, 'error'); render(); return; }
|
|
343
|
+
if (val === current) { render(); return; }
|
|
344
|
+
var patch = {}; patch[col.name] = val;
|
|
345
|
+
C.fetchJSON(api + '/data/' + encodeURIComponent(state.resource) + '/' + encodeURIComponent(row[state.pk]), { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(patch) })
|
|
346
|
+
.then(function () { C.toast('Updated ' + col.name, 'success'); reload(); })
|
|
347
|
+
.catch(function (e) { C.toast(e.message, 'error'); render(); });
|
|
348
|
+
}
|
|
349
|
+
inp.addEventListener('keydown', function (e) { if (e.key === 'Enter') commit(); else if (e.key === 'Escape') { done = true; render(); } });
|
|
350
|
+
inp.addEventListener('blur', commit);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// ---- actions -------------------------------------------------------------
|
|
354
|
+
async function reload() { try { state.cursorStack = []; await loadData(); render(); } catch (e) { C.toast(e.message, 'error'); } }
|
|
355
|
+
function sortBy(col) { if (state.orderBy === col) state.dir = state.dir === 'asc' ? 'desc' : 'asc'; else { state.orderBy = col; state.dir = 'asc'; } reload(); }
|
|
356
|
+
async function pageNext() { if (!state.nextCursor) return; state.cursorStack.push(state.nextCursor); try { await loadData(state.nextCursor); render(); } catch (e) { C.toast(e.message, 'error'); } }
|
|
357
|
+
async function pagePrev() { state.cursorStack.pop(); var c = state.cursorStack[state.cursorStack.length - 1]; try { await loadData(c); render(); } catch (e) { C.toast(e.message, 'error'); } }
|
|
358
|
+
function toggleAuto(on) { state.autoRefresh = on; if (state.timer) { clearInterval(state.timer); state.timer = null; } if (on) state.timer = setInterval(function () { loadData(state.cursorStack[state.cursorStack.length - 1]).then(render).catch(function () {}); }, 5000); }
|
|
359
|
+
|
|
360
|
+
// ---- drawers -------------------------------------------------------------
|
|
361
|
+
function drawer(title, bodyNode, footerNodes) {
|
|
362
|
+
var existing = document.getElementById('dx-overlay'); if (existing) existing.remove();
|
|
363
|
+
var overlay = C.el('div', { class: 'overlay open', id: 'dx-overlay' });
|
|
364
|
+
var d = C.el('div', { class: 'drawer' }, [
|
|
365
|
+
C.el('div', { class: 'drawer-header' }, [C.el('div', { class: 'drawer-title', text: title }), C.el('button', { class: 'btn btn-ghost btn-icon', onclick: close }, ['✕'])]),
|
|
366
|
+
C.el('div', { class: 'drawer-body' }, [bodyNode]),
|
|
367
|
+
footerNodes ? C.el('div', { class: 'drawer-footer' }, footerNodes) : null
|
|
368
|
+
]);
|
|
369
|
+
overlay.appendChild(d); overlay.addEventListener('click', function (e) { if (e.target === overlay) close(); });
|
|
370
|
+
document.addEventListener('keydown', escClose);
|
|
371
|
+
document.body.appendChild(overlay);
|
|
372
|
+
function close() { document.removeEventListener('keydown', escClose); overlay.remove(); }
|
|
373
|
+
function escClose(e) { if (e.key === 'Escape') close(); }
|
|
374
|
+
return { close: close };
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function openDetail(row) {
|
|
378
|
+
var body = C.el('div', {}, [C.el('div', { class: 'jsonview', html: C.highlightJSON(row) })]);
|
|
379
|
+
var foot = [C.el('button', { class: 'btn btn-secondary', 'data-copy': JSON.stringify(row, null, 2) }, ['Copy JSON'])];
|
|
380
|
+
if (!state.readOnly) {
|
|
381
|
+
foot.push(C.el('button', { class: 'btn btn-secondary', onclick: function () { dlg.close(); openForm(row); } }, ['Edit']));
|
|
382
|
+
foot.push(C.el('button', { class: 'btn btn-danger', onclick: function () { dlg.close(); del(row); } }, ['Delete']));
|
|
383
|
+
}
|
|
384
|
+
var dlg = drawer(state.resource + ' · ' + row[state.pk], body, foot);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function fieldInput(col, value) {
|
|
388
|
+
if (isBool(col.type)) { var w = makeSwitch(!!value, function () {}); w._get = function () { return w.querySelector('input').checked; }; return w; }
|
|
389
|
+
if (isJson(col.type)) { var ta = C.el('textarea', { class: 'input input-mono', rows: '5' }); ta.value = value != null ? JSON.stringify(value, null, 2) : ''; ta._get = function () { var v = ta.value.trim(); return v ? JSON.parse(v) : null; }; return ta; }
|
|
390
|
+
var inp = C.el('input', { class: 'input' + (col.isPrimary ? ' input-mono' : ''), value: value != null ? String(value) : '' });
|
|
391
|
+
if (isNum(col.type)) inp.type = 'number'; else if (isDate(col.type)) inp.placeholder = 'ISO 8601 or blank';
|
|
392
|
+
inp._get = function () { var v = inp.value; if (v === '') return undefined; return isNum(col.type) ? Number(v) : v; };
|
|
393
|
+
return inp;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
function openForm(row) {
|
|
397
|
+
var editing = !!row, fields = {}, body = C.el('div', {});
|
|
398
|
+
state.columns.forEach(function (col) {
|
|
399
|
+
if (editing && col.isPrimary) {
|
|
400
|
+
body.appendChild(C.el('div', { style: 'margin-bottom:14px' }, [C.el('label', { class: 'form-label', text: col.name + ' (primary key)' }), C.el('div', { class: 'mono muted', text: String(row[col.name]) })]));
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
var input = fieldInput(col, editing ? row[col.name] : undefined); fields[col.name] = input;
|
|
404
|
+
body.appendChild(C.el('div', { style: 'margin-bottom:14px' }, [
|
|
405
|
+
C.el('label', { class: 'form-label' }, [col.name, C.el('span', { class: 'muted', style: 'font-weight:400', text: ' ' + col.type + (col.nullable ? ' · nullable' : '') })]), input
|
|
406
|
+
]));
|
|
407
|
+
});
|
|
408
|
+
var save = C.el('button', { class: 'btn btn-primary' }, [editing ? 'Save changes' : 'Create']);
|
|
409
|
+
save.addEventListener('click', async function () {
|
|
410
|
+
var payload = {};
|
|
411
|
+
try { Object.keys(fields).forEach(function (n) { var v = fields[n]._get(); if (v !== undefined) payload[n] = v; }); }
|
|
412
|
+
catch (e) { C.toast('Invalid JSON: ' + e.message, 'error'); return; }
|
|
413
|
+
save.disabled = true;
|
|
414
|
+
try {
|
|
415
|
+
if (editing) { await C.fetchJSON(api + '/data/' + encodeURIComponent(state.resource) + '/' + encodeURIComponent(row[state.pk]), { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); C.toast('Record updated', 'success'); }
|
|
416
|
+
else { await C.fetchJSON(api + '/data/' + encodeURIComponent(state.resource), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); C.toast('Record created', 'success'); }
|
|
417
|
+
dlg.close(); reload();
|
|
418
|
+
} catch (e) { C.toast(e.message, 'error'); save.disabled = false; }
|
|
419
|
+
});
|
|
420
|
+
var dlg = drawer((editing ? 'Edit ' : 'New ') + state.resource, body, [C.el('button', { class: 'btn btn-ghost', onclick: function () { dlg.close(); } }, ['Cancel']), save]);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
async function del(row) {
|
|
424
|
+
if (!confirm('Delete this ' + state.resource + ' record?\\n\\n' + row[state.pk])) return;
|
|
425
|
+
try { await C.fetchJSON(api + '/data/' + encodeURIComponent(state.resource) + '/' + encodeURIComponent(row[state.pk]), { method: 'DELETE' }); C.toast('Record deleted', 'success'); reload(); }
|
|
426
|
+
catch (e) { C.toast(e.message, 'error'); }
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// ---- boot ----------------------------------------------------------------
|
|
430
|
+
render();
|
|
431
|
+
loadSchemas().then(function (names) {
|
|
432
|
+
state.allResources = names;
|
|
433
|
+
var pre = qs() || names[0]; render();
|
|
434
|
+
if (pre && names.indexOf(pre) >= 0) selectResource(pre);
|
|
435
|
+
}).catch(function (e) {
|
|
436
|
+
root.innerHTML = '<div class="card"><div class="card-body"><div class="alert alert-error">Failed to load resources: ' + C.escapeHtml(e.message) + '</div></div></div>';
|
|
437
|
+
});
|
|
438
|
+
});
|
|
439
|
+
})();
|
|
440
|
+
`;
|
|
441
|
+
//# sourceMappingURL=data-explorer-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-explorer-app.js","sourceRoot":"","sources":["../../../../src/ui/html/client/data-explorer-app.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,yCAAyC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAib3C,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const htmxVersion = "2.0.4";
|
|
2
|
+
export declare const htmxScript = "var htmx=function(){\"use strict\";const Q={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){const n=cn(e,t||\"post\");return n.values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,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:\"\",inlineStyleNonce:\"\",attributesToSettle:[\"class\",\"style\",\"width\",\"height\"],withCredentials:false,timeout:0,wsReconnectDelay:\"full-jitter\",wsBinaryType:\"blob\",disableSelector:\"[hx-disable], [data-hx-disable]\",scrollBehavior:\"instant\",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:[\"get\",\"delete\"],selfRequestsOnly:true,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null,disableInheritance:false,responseHandling:[{code:\"204\",swap:false},{code:\"[23]..\",swap:true},{code:\"[45]..\",swap:false,error:true}],allowNestedOobSwaps:true},parseInterval:null,_:null,version:\"2.0.4\"};Q.onLoad=j;Q.process=kt;Q.on=ye;Q.off=be;Q.trigger=he;Q.ajax=Rn;Q.find=u;Q.findAll=x;Q.closest=g;Q.remove=z;Q.addClass=K;Q.removeClass=G;Q.toggleClass=W;Q.takeClass=Z;Q.swap=$e;Q.defineExtension=Fn;Q.removeExtension=Bn;Q.logAll=V;Q.logNone=_;Q.parseInterval=d;Q._=e;const n={addTriggerHandler:St,bodyContains:le,canAccessLocalStorage:B,findThisElement:Se,filterValues:hn,swap:$e,hasAttribute:s,getAttributeValue:te,getClosestAttributeValue:re,getClosestMatch:o,getExpressionVars:En,getHeaders:fn,getInputValues:cn,getInternalData:ie,getSwapSpecification:gn,getTriggerSpecs:st,getTarget:Ee,makeFragment:P,mergeObjects:ce,makeSettleInfo:xn,oobSwap:He,querySelectorExt:ae,settleImmediately:Kt,shouldCancel:ht,triggerEvent:he,triggerErrorEvent:fe,withExtensions:Ft};const r=[\"get\",\"post\",\"put\",\"delete\",\"patch\"];const H=r.map(function(e){return\"[hx-\"+e+\"], [data-hx-\"+e+\"]\"}).join(\", \");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 instanceof Element&&e.getAttribute(t)}function s(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 c(e){const t=e.parentElement;if(!t&&e.parentNode instanceof ShadowRoot)return e.parentNode;return t}function ne(){return document}function m(e,t){return e.getRootNode?e.getRootNode({composed:t}):ne()}function o(e,t){while(e&&!t(e)){e=c(e)}return e||null}function i(e,t,n){const r=te(t,n);const o=te(t,\"hx-disinherit\");var i=te(t,\"hx-inherit\");if(e!==t){if(Q.config.disableInheritance){if(i&&(i===\"*\"||i.split(\" \").indexOf(n)>=0)){return r}else{return null}}if(o&&(o===\"*\"||o.split(\" \").indexOf(n)>=0)){return\"unset\"}}return r}function re(t,n){let r=null;o(t,function(e){return!!(r=i(t,ue(e),n))});if(r!==\"unset\"){return r}}function h(e,t){const n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return!!n&&n.call(e,t)}function T(e){const t=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i;const n=t.exec(e);if(n){return n[1].toLowerCase()}else{return\"\"}}function q(e){const t=new DOMParser;return t.parseFromString(e,\"text/html\")}function L(e,t){while(t.childNodes.length>0){e.append(t.childNodes[0])}}function A(e){const t=ne().createElement(\"script\");se(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}return t}function N(e){return e.matches(\"script\")&&(e.type===\"text/javascript\"||e.type===\"module\"||e.type===\"\")}function I(e){Array.from(e.querySelectorAll(\"script\")).forEach(e=>{if(N(e)){const t=A(e);const n=e.parentNode;try{n.insertBefore(t,e)}catch(e){O(e)}finally{e.remove()}}})}function P(e){const t=e.replace(/<head(\\s[^>]*)?>[\\s\\S]*?<\\/head>/i,\"\");const n=T(t);let r;if(n===\"html\"){r=new DocumentFragment;const i=q(e);L(r,i.body);r.title=i.title}else if(n===\"body\"){r=new DocumentFragment;const i=q(t);L(r,i.body);r.title=i.title}else{const i=q('<body><template class=\"internal-htmx-wrapper\">'+t+\"</template></body>\");r=i.querySelector(\"template\").content;r.title=i.title;var o=r.querySelector(\"title\");if(o&&o.parentNode===r){o.remove();r.title=o.innerText}}if(r){if(Q.config.allowScriptTags){I(r)}else{r.querySelectorAll(\"script\").forEach(e=>e.remove())}}return r}function oe(e){if(e){e()}}function t(e,t){return Object.prototype.toString.call(e)===\"[object \"+t+\"]\"}function k(e){return typeof e===\"function\"}function D(e){return t(e,\"Object\")}function ie(e){const t=\"htmx-internal-data\";let n=e[t];if(!n){n=e[t]={}}return n}function M(t){const n=[];if(t){for(let e=0;e<t.length;e++){n.push(t[e])}}return n}function se(t,n){if(t){for(let e=0;e<t.length;e++){n(t[e])}}}function X(e){const t=e.getBoundingClientRect();const n=t.top;const r=t.bottom;return n<window.innerHeight&&r>=0}function le(e){return e.getRootNode({composed:true})===document}function F(e){return e.trim().split(/\\s+/)}function ce(e,t){for(const n in t){if(t.hasOwnProperty(n)){e[n]=t[n]}}return e}function S(e){try{return JSON.parse(e)}catch(e){O(e);return null}}function B(){const e=\"htmx:localStorageTest\";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function U(t){try{const e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\\/$/.test(t)){t=t.replace(/\\/+$/,\"\")}return t}catch(e){return t}}function e(e){return vn(ne().body,function(){return eval(e)})}function j(t){const e=Q.on(\"htmx:load\",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,n){if(console){console.log(t,e,n)}}}function _(){Q.logger=null}function u(e,t){if(typeof e!==\"string\"){return e.querySelector(t)}else{return u(ne(),e)}}function x(e,t){if(typeof e!==\"string\"){return e.querySelectorAll(t)}else{return x(ne(),e)}}function E(){return window}function z(e,t){e=y(e);if(t){E().setTimeout(function(){z(e);e=null},t)}else{c(e).removeChild(e)}}function ue(e){return e instanceof Element?e:null}function $(e){return e instanceof HTMLElement?e:null}function J(e){return typeof e===\"string\"?e:null}function f(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function K(e,t,n){e=ue(y(e));if(!e){return}if(n){E().setTimeout(function(){K(e,t);e=null},n)}else{e.classList&&e.classList.add(t)}}function G(e,t,n){let r=ue(y(e));if(!r){return}if(n){E().setTimeout(function(){G(r,t);r=null},n)}else{if(r.classList){r.classList.remove(t);if(r.classList.length===0){r.removeAttribute(\"class\")}}}}function W(e,t){e=y(e);e.classList.toggle(t)}function Z(e,t){e=y(e);se(e.parentElement.children,function(e){G(e,t)});K(ue(e),t)}function g(e,t){e=ue(y(e));if(e&&e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&ue(c(e)));return null}}function l(e,t){return e.substring(0,t.length)===t}function Y(e,t){return e.substring(e.length-t.length)===t}function ge(e){const t=e.trim();if(l(t,\"<\")&&Y(t,\"/>\")){return t.substring(1,t.length-2)}else{return t}}function p(t,r,n){if(r.indexOf(\"global \")===0){return p(t,r.slice(7),true)}t=y(t);const o=[];{let t=0;let n=0;for(let e=0;e<r.length;e++){const l=r[e];if(l===\",\"&&t===0){o.push(r.substring(n,e));n=e+1;continue}if(l===\"<\"){t++}else if(l===\"/\"&&e<r.length-1&&r[e+1]===\">\"){t--}}if(n<r.length){o.push(r.substring(n))}}const i=[];const s=[];while(o.length>0){const r=ge(o.shift());let e;if(r.indexOf(\"closest \")===0){e=g(ue(t),ge(r.substr(8)))}else if(r.indexOf(\"find \")===0){e=u(f(t),ge(r.substr(5)))}else if(r===\"next\"||r===\"nextElementSibling\"){e=ue(t).nextElementSibling}else if(r.indexOf(\"next \")===0){e=pe(t,ge(r.substr(5)),!!n)}else if(r===\"previous\"||r===\"previousElementSibling\"){e=ue(t).previousElementSibling}else if(r.indexOf(\"previous \")===0){e=me(t,ge(r.substr(9)),!!n)}else if(r===\"document\"){e=document}else if(r===\"window\"){e=window}else if(r===\"body\"){e=document.body}else if(r===\"root\"){e=m(t,!!n)}else if(r===\"host\"){e=t.getRootNode().host}else{s.push(r)}if(e){i.push(e)}}if(s.length>0){const e=s.join(\",\");const c=f(m(t,!!n));i.push(...M(c.querySelectorAll(e)))}return i}var pe=function(t,e,n){const r=f(m(t,n)).querySelectorAll(e);for(let e=0;e<r.length;e++){const o=r[e];if(o.compareDocumentPosition(t)===Node.DOCUMENT_POSITION_PRECEDING){return o}}};var me=function(t,e,n){const r=f(m(t,n)).querySelectorAll(e);for(let e=r.length-1;e>=0;e--){const o=r[e];if(o.compareDocumentPosition(t)===Node.DOCUMENT_POSITION_FOLLOWING){return o}}};function ae(e,t){if(typeof e!==\"string\"){return p(e,t)[0]}else{return p(ne().body,e)[0]}}function y(e,t){if(typeof e===\"string\"){return u(f(t)||document,e)}else{return e}}function xe(e,t,n,r){if(k(t)){return{target:ne().body,event:J(e),listener:t,options:n}}else{return{target:y(e),event:J(t),listener:n,options:r}}}function ye(t,n,r,o){Vn(function(){const e=xe(t,n,r,o);e.target.addEventListener(e.event,e.listener,e.options)});const e=k(n);return e?n:r}function be(t,n,r){Vn(function(){const e=xe(t,n,r);e.target.removeEventListener(e.event,e.listener)});return k(n)?n:r}const ve=ne().createElement(\"output\");function we(e,t){const n=re(e,t);if(n){if(n===\"this\"){return[Se(e,t)]}else{const r=p(e,n);if(r.length===0){O('The selector \"'+n+'\" on '+t+\" returned no matches!\");return[ve]}else{return r}}}}function Se(e,t){return ue(o(e,function(e){return te(ue(e),t)!=null}))}function Ee(e){const t=re(e,\"hx-target\");if(t){if(t===\"this\"){return Se(e,\"hx-target\")}else{return ae(e,t)}}else{const n=ie(e);if(n.boosted){return ne().body}else{return e}}}function Ce(t){const n=Q.config.attributesToSettle;for(let e=0;e<n.length;e++){if(t===n[e]){return true}}return false}function Oe(t,n){se(t.attributes,function(e){if(!n.hasAttribute(e.name)&&Ce(e.name)){t.removeAttribute(e.name)}});se(n.attributes,function(e){if(Ce(e.name)){t.setAttribute(e.name,e.value)}})}function Re(t,e){const n=Un(e);for(let e=0;e<n.length;e++){const r=n[e];try{if(r.isInlineSwap(t)){return true}}catch(e){O(e)}}return t===\"outerHTML\"}function He(e,o,i,t){t=t||ne();let n=\"#\"+ee(o,\"id\");let s=\"outerHTML\";if(e===\"true\"){}else if(e.indexOf(\":\")>0){s=e.substring(0,e.indexOf(\":\"));n=e.substring(e.indexOf(\":\")+1)}else{s=e}o.removeAttribute(\"hx-swap-oob\");o.removeAttribute(\"data-hx-swap-oob\");const r=p(t,n,false);if(r){se(r,function(e){let t;const n=o.cloneNode(true);t=ne().createDocumentFragment();t.appendChild(n);if(!Re(s,e)){t=f(n)}const r={shouldSwap:true,target:e,fragment:t};if(!he(e,\"htmx:oobBeforeSwap\",r))return;e=r.target;if(r.shouldSwap){qe(t);_e(s,e,e,t,i);Te()}se(i.elts,function(e){he(e,\"htmx:oobAfterSwap\",r)})});o.parentNode.removeChild(o)}else{o.parentNode.removeChild(o);fe(ne().body,\"htmx:oobErrorNoTarget\",{content:o})}return e}function Te(){const e=u(\"#--htmx-preserve-pantry--\");if(e){for(const t of[...e.children]){const n=u(\"#\"+t.id);n.parentNode.moveBefore(t,n);n.remove()}e.remove()}}function qe(e){se(x(e,\"[hx-preserve], [data-hx-preserve]\"),function(e){const t=te(e,\"id\");const n=ne().getElementById(t);if(n!=null){if(e.moveBefore){let e=u(\"#--htmx-preserve-pantry--\");if(e==null){ne().body.insertAdjacentHTML(\"afterend\",\"<div id='--htmx-preserve-pantry--'></div>\");e=u(\"#--htmx-preserve-pantry--\")}e.moveBefore(n,null)}else{e.parentNode.replaceChild(n,e)}}})}function Le(l,e,c){se(e.querySelectorAll(\"[id]\"),function(t){const n=ee(t,\"id\");if(n&&n.length>0){const r=n.replace(\"'\",\"\\\\'\");const o=t.tagName.replace(\":\",\"\\\\:\");const e=f(l);const i=e&&e.querySelector(o+\"[id='\"+r+\"']\");if(i&&i!==e){const s=t.cloneNode();Oe(t,i);c.tasks.push(function(){Oe(t,s)})}}})}function Ae(e){return function(){G(e,Q.config.addedClass);kt(ue(e));Ne(f(e));he(e,\"htmx:load\")}}function Ne(e){const t=\"[autofocus]\";const n=$(h(e,t)?e:e.querySelector(t));if(n!=null){n.focus()}}function a(e,t,n,r){Le(e,n,r);while(n.childNodes.length>0){const o=n.firstChild;K(ue(o),Q.config.addedClass);e.insertBefore(o,t);if(o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE){r.tasks.push(Ae(o))}}}function Ie(e,t){let n=0;while(n<e.length){t=(t<<5)-t+e.charCodeAt(n++)|0}return t}function Pe(t){let n=0;if(t.attributes){for(let e=0;e<t.attributes.length;e++){const r=t.attributes[e];if(r.value){n=Ie(r.name,n);n=Ie(r.value,n)}}}return n}function ke(t){const n=ie(t);if(n.onHandlers){for(let e=0;e<n.onHandlers.length;e++){const r=n.onHandlers[e];be(t,r.event,r.listener)}delete n.onHandlers}}function De(e){const t=ie(e);if(t.timeout){clearTimeout(t.timeout)}if(t.listenerInfos){se(t.listenerInfos,function(e){if(e.on){be(e.on,e.trigger,e.listener)}})}ke(e);se(Object.keys(t),function(e){if(e!==\"firstInitCompleted\")delete t[e]})}function b(e){he(e,\"htmx:beforeCleanupElement\");De(e);if(e.children){se(e.children,function(e){b(e)})}}function Me(t,e,n){if(t instanceof Element&&t.tagName===\"BODY\"){return Ve(t,e,n)}let r;const o=t.previousSibling;const i=c(t);if(!i){return}a(i,t,e,n);if(o==null){r=i.firstChild}else{r=o.nextSibling}n.elts=n.elts.filter(function(e){return e!==t});while(r&&r!==t){if(r instanceof Element){n.elts.push(r)}r=r.nextSibling}b(t);if(t instanceof Element){t.remove()}else{t.parentNode.removeChild(t)}}function Xe(e,t,n){return a(e,e.firstChild,t,n)}function Fe(e,t,n){return a(c(e),e,t,n)}function Be(e,t,n){return a(e,null,t,n)}function Ue(e,t,n){return a(c(e),e.nextSibling,t,n)}function je(e){b(e);const t=c(e);if(t){return t.removeChild(e)}}function Ve(e,t,n){const r=e.firstChild;a(e,r,t,n);if(r){while(r.nextSibling){b(r.nextSibling);e.removeChild(r.nextSibling)}b(r);e.removeChild(r)}}function _e(t,e,n,r,o){switch(t){case\"none\":return;case\"outerHTML\":Me(n,r,o);return;case\"afterbegin\":Xe(n,r,o);return;case\"beforebegin\":Fe(n,r,o);return;case\"beforeend\":Be(n,r,o);return;case\"afterend\":Ue(n,r,o);return;case\"delete\":je(n);return;default:var i=Un(e);for(let e=0;e<i.length;e++){const s=i[e];try{const l=s.handleSwap(t,n,r,o);if(l){if(Array.isArray(l)){for(let e=0;e<l.length;e++){const c=l[e];if(c.nodeType!==Node.TEXT_NODE&&c.nodeType!==Node.COMMENT_NODE){o.tasks.push(Ae(c))}}}return}}catch(e){O(e)}}if(t===\"innerHTML\"){Ve(n,r,o)}else{_e(Q.config.defaultSwapStyle,e,n,r,o)}}}function ze(e,n,r){var t=x(e,\"[hx-swap-oob], [data-hx-swap-oob]\");se(t,function(e){if(Q.config.allowNestedOobSwaps||e.parentElement===null){const t=te(e,\"hx-swap-oob\");if(t!=null){He(t,e,n,r)}}else{e.removeAttribute(\"hx-swap-oob\");e.removeAttribute(\"data-hx-swap-oob\")}});return t.length>0}function $e(e,t,r,o){if(!o){o={}}e=y(e);const i=o.contextElement?m(o.contextElement,false):ne();const n=document.activeElement;let s={};try{s={elt:n,start:n?n.selectionStart:null,end:n?n.selectionEnd:null}}catch(e){}const l=xn(e);if(r.swapStyle===\"textContent\"){e.textContent=t}else{let n=P(t);l.title=n.title;if(o.selectOOB){const u=o.selectOOB.split(\",\");for(let t=0;t<u.length;t++){const a=u[t].split(\":\",2);let e=a[0].trim();if(e.indexOf(\"#\")===0){e=e.substring(1)}const f=a[1]||\"true\";const h=n.querySelector(\"#\"+e);if(h){He(f,h,l,i)}}}ze(n,l,i);se(x(n,\"template\"),function(e){if(e.content&&ze(e.content,l,i)){e.remove()}});if(o.select){const d=ne().createDocumentFragment();se(n.querySelectorAll(o.select),function(e){d.appendChild(e)});n=d}qe(n);_e(r.swapStyle,o.contextElement,e,n,l);Te()}if(s.elt&&!le(s.elt)&&ee(s.elt,\"id\")){const g=document.getElementById(ee(s.elt,\"id\"));const p={preventScroll:r.focusScroll!==undefined?!r.focusScroll:!Q.config.defaultFocusScroll};if(g){if(s.start&&g.setSelectionRange){try{g.setSelectionRange(s.start,s.end)}catch(e){}}g.focus(p)}}e.classList.remove(Q.config.swappingClass);se(l.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}he(e,\"htmx:afterSwap\",o.eventInfo)});if(o.afterSwapCallback){o.afterSwapCallback()}if(!r.ignoreTitle){kn(l.title)}const c=function(){se(l.tasks,function(e){e.call()});se(l.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}he(e,\"htmx:afterSettle\",o.eventInfo)});if(o.anchor){const e=ue(y(\"#\"+o.anchor));if(e){e.scrollIntoView({block:\"start\",behavior:\"auto\"})}}yn(l.elts,r);if(o.afterSettleCallback){o.afterSettleCallback()}};if(r.settleDelay>0){E().setTimeout(c,r.settleDelay)}else{c()}}function Je(e,t,n){const r=e.getResponseHeader(t);if(r.indexOf(\"{\")===0){const o=S(r);for(const i in o){if(o.hasOwnProperty(i)){let e=o[i];if(D(e)){n=e.target!==undefined?e.target:n}else{e={value:e}}he(n,i,e)}}}else{const s=r.split(\",\");for(let e=0;e<s.length;e++){he(n,s[e].trim(),[])}}}const Ke=/\\s/;const v=/[\\s,]/;const Ge=/[_$a-zA-Z]/;const We=/[_$a-zA-Z0-9]/;const Ze=['\"',\"'\",\"/\"];const w=/[^\\s]/;const Ye=/[{(]/;const Qe=/[})]/;function et(e){const t=[];let n=0;while(n<e.length){if(Ge.exec(e.charAt(n))){var r=n;while(We.exec(e.charAt(n+1))){n++}t.push(e.substring(r,n+1))}else if(Ze.indexOf(e.charAt(n))!==-1){const o=e.charAt(n);var r=n;n++;while(n<e.length&&e.charAt(n)!==o){if(e.charAt(n)===\"\\\\\"){n++}n++}t.push(e.substring(r,n+1))}else{const i=e.charAt(n);t.push(i)}n++}return t}function tt(e,t,n){return Ge.exec(e.charAt(0))&&e!==\"true\"&&e!==\"false\"&&e!==\"this\"&&e!==n&&t!==\".\"}function nt(r,o,i){if(o[0]===\"[\"){o.shift();let e=1;let t=\" return (function(\"+i+\"){ return (\";let n=null;while(o.length>0){const s=o[0];if(s===\"]\"){e--;if(e===0){if(n===null){t=t+\"true\"}o.shift();t+=\")})\";try{const l=vn(r,function(){return Function(t)()},function(){return true});l.source=t;return l}catch(e){fe(ne().body,\"htmx:syntax:error\",{error:e,source:t});return null}}}else if(s===\"[\"){e++}if(tt(s,n,i)){t+=\"((\"+i+\".\"+s+\") ? (\"+i+\".\"+s+\") : (window.\"+s+\"))\"}else{t=t+s}n=o.shift()}}}function C(e,t){let n=\"\";while(e.length>0&&!t.test(e[0])){n+=e.shift()}return n}function rt(e){let t;if(e.length>0&&Ye.test(e[0])){e.shift();t=C(e,Qe).trim();e.shift()}else{t=C(e,v)}return t}const ot=\"input, textarea, select\";function it(e,t,n){const r=[];const o=et(t);do{C(o,w);const l=o.length;const c=C(o,/[,\\[\\s]/);if(c!==\"\"){if(c===\"every\"){const u={trigger:\"every\"};C(o,w);u.pollInterval=d(C(o,/[,\\[\\s]/));C(o,w);var i=nt(e,o,\"event\");if(i){u.eventFilter=i}r.push(u)}else{const a={trigger:c};var i=nt(e,o,\"event\");if(i){a.eventFilter=i}C(o,w);while(o.length>0&&o[0]!==\",\"){const f=o.shift();if(f===\"changed\"){a.changed=true}else if(f===\"once\"){a.once=true}else if(f===\"consume\"){a.consume=true}else if(f===\"delay\"&&o[0]===\":\"){o.shift();a.delay=d(C(o,v))}else if(f===\"from\"&&o[0]===\":\"){o.shift();if(Ye.test(o[0])){var s=rt(o)}else{var s=C(o,v);if(s===\"closest\"||s===\"find\"||s===\"next\"||s===\"previous\"){o.shift();const h=rt(o);if(h.length>0){s+=\" \"+h}}}a.from=s}else if(f===\"target\"&&o[0]===\":\"){o.shift();a.target=rt(o)}else if(f===\"throttle\"&&o[0]===\":\"){o.shift();a.throttle=d(C(o,v))}else if(f===\"queue\"&&o[0]===\":\"){o.shift();a.queue=C(o,v)}else if(f===\"root\"&&o[0]===\":\"){o.shift();a[f]=rt(o)}else if(f===\"threshold\"&&o[0]===\":\"){o.shift();a[f]=C(o,v)}else{fe(e,\"htmx:syntax:error\",{token:o.shift()})}C(o,w)}r.push(a)}}if(o.length===l){fe(e,\"htmx:syntax:error\",{token:o.shift()})}C(o,w)}while(o[0]===\",\"&&o.shift());if(n){n[t]=r}return r}function st(e){const t=te(e,\"hx-trigger\");let n=[];if(t){const r=Q.config.triggerSpecsCache;n=r&&r[t]||it(e,t,r)}if(n.length>0){return n}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,ot)){return[{trigger:\"change\"}]}else{return[{trigger:\"click\"}]}}function lt(e){ie(e).cancelled=true}function ct(e,t,n){const r=ie(e);r.timeout=E().setTimeout(function(){if(le(e)&&r.cancelled!==true){if(!gt(n,e,Mt(\"hx:poll:trigger\",{triggerSpec:n,target:e}))){t(e)}ct(e,t,n)}},n.pollInterval)}function ut(e){return location.hostname===e.hostname&&ee(e,\"href\")&&ee(e,\"href\").indexOf(\"#\")!==0}function at(e){return g(e,Q.config.disableSelector)}function ft(t,n,e){if(t instanceof HTMLAnchorElement&&ut(t)&&(t.target===\"\"||t.target===\"_self\")||t.tagName===\"FORM\"&&String(ee(t,\"method\")).toLowerCase()!==\"dialog\"){n.boosted=true;let r,o;if(t.tagName===\"A\"){r=\"get\";o=ee(t,\"href\")}else{const i=ee(t,\"method\");r=i?i.toLowerCase():\"get\";o=ee(t,\"action\");if(o==null||o===\"\"){o=ne().location.href}if(r===\"get\"&&o.includes(\"?\")){o=o.replace(/\\?[^#]+/,\"\")}}e.forEach(function(e){pt(t,function(e,t){const n=ue(e);if(at(n)){b(n);return}de(r,o,n,t)},n,e,true)})}}function ht(e,t){const n=ue(t);if(!n){return false}if(e.type===\"submit\"||e.type===\"click\"){if(n.tagName===\"FORM\"){return true}if(h(n,'input[type=\"submit\"], button')&&(h(n,\"[form]\")||g(n,\"form\")!==null)){return true}if(n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute(\"href\")===\"#\"||n.getAttribute(\"href\").indexOf(\"#\")!==0)){return true}}return false}function dt(e,t){return ie(e).boosted&&e instanceof HTMLAnchorElement&&t.type===\"click\"&&(t.ctrlKey||t.metaKey)}function gt(e,t,n){const r=e.eventFilter;if(r){try{return r.call(t,n)!==true}catch(e){const o=r.source;fe(ne().body,\"htmx:eventFilter:error\",{error:e,source:o});return true}}return false}function pt(l,c,e,u,a){const f=ie(l);let t;if(u.from){t=p(l,u.from)}else{t=[l]}if(u.changed){if(!(\"lastValue\"in f)){f.lastValue=new WeakMap}t.forEach(function(e){if(!f.lastValue.has(u)){f.lastValue.set(u,new WeakMap)}f.lastValue.get(u).set(e,e.value)})}se(t,function(i){const s=function(e){if(!le(l)){i.removeEventListener(u.trigger,s);return}if(dt(l,e)){return}if(a||ht(e,l)){e.preventDefault()}if(gt(u,l,e)){return}const t=ie(e);t.triggerSpec=u;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(l)<0){t.handledFor.push(l);if(u.consume){e.stopPropagation()}if(u.target&&e.target){if(!h(ue(e.target),u.target)){return}}if(u.once){if(f.triggeredOnce){return}else{f.triggeredOnce=true}}if(u.changed){const n=event.target;const r=n.value;const o=f.lastValue.get(u);if(o.has(n)&&o.get(n)===r){return}o.set(n,r)}if(f.delayed){clearTimeout(f.delayed)}if(f.throttle){return}if(u.throttle>0){if(!f.throttle){he(l,\"htmx:trigger\");c(l,e);f.throttle=E().setTimeout(function(){f.throttle=null},u.throttle)}}else if(u.delay>0){f.delayed=E().setTimeout(function(){he(l,\"htmx:trigger\");c(l,e)},u.delay)}else{he(l,\"htmx:trigger\");c(l,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:u.trigger,listener:s,on:i});i.addEventListener(u.trigger,s)})}let mt=false;let xt=null;function yt(){if(!xt){xt=function(){mt=true};window.addEventListener(\"scroll\",xt);window.addEventListener(\"resize\",xt);setInterval(function(){if(mt){mt=false;se(ne().querySelectorAll(\"[hx-trigger*='revealed'],[data-hx-trigger*='revealed']\"),function(e){bt(e)})}},200)}}function bt(e){if(!s(e,\"data-hx-revealed\")&&X(e)){e.setAttribute(\"data-hx-revealed\",\"true\");const t=ie(e);if(t.initHash){he(e,\"revealed\")}else{e.addEventListener(\"htmx:afterProcessNode\",function(){he(e,\"revealed\")},{once:true})}}}function vt(e,t,n,r){const o=function(){if(!n.loaded){n.loaded=true;he(e,\"htmx:trigger\");t(e)}};if(r>0){E().setTimeout(o,r)}else{o()}}function wt(t,n,e){let i=false;se(r,function(r){if(s(t,\"hx-\"+r)){const o=te(t,\"hx-\"+r);i=true;n.path=o;n.verb=r;e.forEach(function(e){St(t,e,n,function(e,t){const n=ue(e);if(g(n,Q.config.disableSelector)){b(n);return}de(r,o,n,t)})})}});return i}function St(r,e,t,n){if(e.trigger===\"revealed\"){yt();pt(r,n,t,e);bt(ue(r))}else if(e.trigger===\"intersect\"){const o={};if(e.root){o.root=ae(r,e.root)}if(e.threshold){o.threshold=parseFloat(e.threshold)}const i=new IntersectionObserver(function(t){for(let e=0;e<t.length;e++){const n=t[e];if(n.isIntersecting){he(r,\"intersect\");break}}},o);i.observe(ue(r));pt(ue(r),n,t,e)}else if(!t.firstInitCompleted&&e.trigger===\"load\"){if(!gt(e,r,Mt(\"load\",{elt:r}))){vt(ue(r),n,t,e.delay)}}else if(e.pollInterval>0){t.polling=true;ct(ue(r),n,e)}else{pt(r,n,t,e)}}function Et(e){const t=ue(e);if(!t){return false}const n=t.attributes;for(let e=0;e<n.length;e++){const r=n[e].name;if(l(r,\"hx-on:\")||l(r,\"data-hx-on:\")||l(r,\"hx-on-\")||l(r,\"data-hx-on-\")){return true}}return false}const Ct=(new XPathEvaluator).createExpression('.//*[@*[ 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-\") ]]');function Ot(e,t){if(Et(e)){t.push(ue(e))}const n=Ct.evaluate(e);let r=null;while(r=n.iterateNext())t.push(ue(r))}function Rt(e){const t=[];if(e instanceof DocumentFragment){for(const n of e.childNodes){Ot(n,t)}}else{Ot(e,t)}return t}function Ht(e){if(e.querySelectorAll){const n=\", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]\";const r=[];for(const i in Mn){const s=Mn[i];if(s.getSelectors){var t=s.getSelectors();if(t){r.push(t)}}}const o=e.querySelectorAll(H+n+\", form, [type='submit'],\"+\" [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger]\"+r.flat().map(e=>\", \"+e).join(\"\"));return o}else{return[]}}function Tt(e){const t=g(ue(e.target),\"button, input[type='submit']\");const n=Lt(e);if(n){n.lastButtonClicked=t}}function qt(e){const t=Lt(e);if(t){t.lastButtonClicked=null}}function Lt(e){const t=g(ue(e.target),\"button, input[type='submit']\");if(!t){return}const n=y(\"#\"+ee(t,\"form\"),t.getRootNode())||g(t,\"form\");if(!n){return}return ie(n)}function At(e){e.addEventListener(\"click\",Tt);e.addEventListener(\"focusin\",Tt);e.addEventListener(\"focusout\",qt)}function Nt(t,e,n){const r=ie(t);if(!Array.isArray(r.onHandlers)){r.onHandlers=[]}let o;const i=function(e){vn(t,function(){if(at(t)){return}if(!o){o=new Function(\"event\",n)}o.call(t,e)})};t.addEventListener(e,i);r.onHandlers.push({event:e,listener:i})}function It(t){ke(t);for(let e=0;e<t.attributes.length;e++){const n=t.attributes[e].name;const r=t.attributes[e].value;if(l(n,\"hx-on\")||l(n,\"data-hx-on\")){const o=n.indexOf(\"-on\")+3;const i=n.slice(o,o+1);if(i===\"-\"||i===\":\"){let e=n.slice(o+1);if(l(e,\":\")){e=\"htmx\"+e}else if(l(e,\"-\")){e=\"htmx:\"+e.slice(1)}else if(l(e,\"htmx-\")){e=\"htmx:\"+e.slice(5)}Nt(t,e,r)}}}}function Pt(t){if(g(t,Q.config.disableSelector)){b(t);return}const n=ie(t);const e=Pe(t);if(n.initHash!==e){De(t);n.initHash=e;he(t,\"htmx:beforeProcessNode\");const r=st(t);const o=wt(t,n,r);if(!o){if(re(t,\"hx-boost\")===\"true\"){ft(t,n,r)}else if(s(t,\"hx-trigger\")){r.forEach(function(e){St(t,e,n,function(){})})}}if(t.tagName===\"FORM\"||ee(t,\"type\")===\"submit\"&&s(t,\"form\")){At(t)}n.firstInitCompleted=true;he(t,\"htmx:afterProcessNode\")}}function kt(e){e=y(e);if(g(e,Q.config.disableSelector)){b(e);return}Pt(e);se(Ht(e),function(e){Pt(e)});se(Rt(e),It)}function Dt(e){return e.replace(/([a-z0-9])([A-Z])/g,\"$1-$2\").toLowerCase()}function Mt(e,t){let n;if(window.CustomEvent&&typeof window.CustomEvent===\"function\"){n=new CustomEvent(e,{bubbles:true,cancelable:true,composed:true,detail:t})}else{n=ne().createEvent(\"CustomEvent\");n.initCustomEvent(e,true,true,t)}return n}function fe(e,t,n){he(e,t,ce({error:t},n))}function Xt(e){return e===\"htmx:afterProcessNode\"}function Ft(e,t){se(Un(e),function(e){try{t(e)}catch(e){O(e)}})}function O(e){if(console.error){console.error(e)}else if(console.log){console.log(\"ERROR: \",e)}}function he(e,t,n){e=y(e);if(n==null){n={}}n.elt=e;const r=Mt(t,n);if(Q.logger&&!Xt(t)){Q.logger(e,t,n)}if(n.error){O(n.error);he(e,\"htmx:error\",{errorInfo:n})}let o=e.dispatchEvent(r);const i=Dt(t);if(o&&i!==t){const s=Mt(i,r.detail);o=o&&e.dispatchEvent(s)}Ft(ue(e),function(e){o=o&&(e.onEvent(t,r)!==false&&!r.defaultPrevented)});return o}let Bt=location.pathname+location.search;function Ut(){const e=ne().querySelector(\"[hx-history-elt],[data-hx-history-elt]\");return e||ne().body}function jt(t,e){if(!B()){return}const n=_t(e);const r=ne().title;const o=window.scrollY;if(Q.config.historyCacheSize<=0){localStorage.removeItem(\"htmx-history-cache\");return}t=U(t);const i=S(localStorage.getItem(\"htmx-history-cache\"))||[];for(let e=0;e<i.length;e++){if(i[e].url===t){i.splice(e,1);break}}const s={url:t,content:n,title:r,scroll:o};he(ne().body,\"htmx:historyItemCreated\",{item:s,cache:i});i.push(s);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(ne().body,\"htmx:historyCacheError\",{cause:e,cache:i});i.shift()}}}function Vt(t){if(!B()){return null}t=U(t);const n=S(localStorage.getItem(\"htmx-history-cache\"))||[];for(let e=0;e<n.length;e++){if(n[e].url===t){return n[e]}}return null}function _t(e){const t=Q.config.requestClass;const n=e.cloneNode(true);se(x(n,\".\"+t),function(e){G(e,t)});se(x(n,\"[data-disabled-by-htmx]\"),function(e){e.removeAttribute(\"disabled\")});return n.innerHTML}function zt(){const e=Ut();const t=Bt||location.pathname+location.search;let n;try{n=ne().querySelector('[hx-history=\"false\" i],[data-hx-history=\"false\" i]')}catch(e){n=ne().querySelector('[hx-history=\"false\"],[data-hx-history=\"false\"]')}if(!n){he(ne().body,\"htmx:beforeHistorySave\",{path:t,historyElt:e});jt(t,e)}if(Q.config.historyEnabled)history.replaceState({htmx:true},ne().title,window.location.href)}function $t(e){if(Q.config.getCacheBusterParam){e=e.replace(/org\\.htmx\\.cache-buster=[^&]*&?/,\"\");if(Y(e,\"&\")||Y(e,\"?\")){e=e.slice(0,-1)}}if(Q.config.historyEnabled){history.pushState({htmx:true},\"\",e)}Bt=e}function Jt(e){if(Q.config.historyEnabled)history.replaceState({htmx:true},\"\",e);Bt=e}function Kt(e){se(e,function(e){e.call(undefined)})}function Gt(o){const e=new XMLHttpRequest;const i={path:o,xhr:e};he(ne().body,\"htmx:historyCacheMiss\",i);e.open(\"GET\",o,true);e.setRequestHeader(\"HX-Request\",\"true\");e.setRequestHeader(\"HX-History-Restore-Request\",\"true\");e.setRequestHeader(\"HX-Current-URL\",ne().location.href);e.onload=function(){if(this.status>=200&&this.status<400){he(ne().body,\"htmx:historyCacheMissLoad\",i);const e=P(this.response);const t=e.querySelector(\"[hx-history-elt],[data-hx-history-elt]\")||e;const n=Ut();const r=xn(n);kn(e.title);qe(e);Ve(n,t,r);Te();Kt(r.tasks);Bt=o;he(ne().body,\"htmx:historyRestore\",{path:o,cacheMiss:true,serverResponse:this.response})}else{fe(ne().body,\"htmx:historyCacheMissLoadError\",i)}};e.send()}function Wt(e){zt();e=e||location.pathname+location.search;const t=Vt(e);if(t){const n=P(t.content);const r=Ut();const o=xn(r);kn(t.title);qe(n);Ve(r,n,o);Te();Kt(o.tasks);E().setTimeout(function(){window.scrollTo(0,t.scroll)},0);Bt=e;he(ne().body,\"htmx:historyRestore\",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{Gt(e)}}}function Zt(e){let t=we(e,\"hx-indicator\");if(t==null){t=[e]}se(t,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)+1;e.classList.add.call(e.classList,Q.config.requestClass)});return t}function Yt(e){let t=we(e,\"hx-disabled-elt\");if(t==null){t=[]}se(t,function(e){const t=ie(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute(\"disabled\",\"\");e.setAttribute(\"data-disabled-by-htmx\",\"\")});return t}function Qt(e,t){se(e.concat(t),function(e){const t=ie(e);t.requestCount=(t.requestCount||1)-1});se(e,function(e){const t=ie(e);if(t.requestCount===0){e.classList.remove.call(e.classList,Q.config.requestClass)}});se(t,function(e){const t=ie(e);if(t.requestCount===0){e.removeAttribute(\"disabled\");e.removeAttribute(\"data-disabled-by-htmx\")}})}function en(t,n){for(let e=0;e<t.length;e++){const r=t[e];if(r.isSameNode(n)){return true}}return false}function tn(e){const t=e;if(t.name===\"\"||t.name==null||t.disabled||g(t,\"fieldset[disabled]\")){return false}if(t.type===\"button\"||t.type===\"submit\"||t.tagName===\"image\"||t.tagName===\"reset\"||t.tagName===\"file\"){return false}if(t.type===\"checkbox\"||t.type===\"radio\"){return t.checked}return true}function nn(t,e,n){if(t!=null&&e!=null){if(Array.isArray(e)){e.forEach(function(e){n.append(t,e)})}else{n.append(t,e)}}}function rn(t,n,r){if(t!=null&&n!=null){let e=r.getAll(t);if(Array.isArray(n)){e=e.filter(e=>n.indexOf(e)<0)}else{e=e.filter(e=>e!==n)}r.delete(t);se(e,e=>r.append(t,e))}}function on(t,n,r,o,i){if(o==null||en(t,o)){return}else{t.push(o)}if(tn(o)){const s=ee(o,\"name\");let e=o.value;if(o instanceof HTMLSelectElement&&o.multiple){e=M(o.querySelectorAll(\"option:checked\")).map(function(e){return e.value})}if(o instanceof HTMLInputElement&&o.files){e=M(o.files)}nn(s,e,n);if(i){sn(o,r)}}if(o instanceof HTMLFormElement){se(o.elements,function(e){if(t.indexOf(e)>=0){rn(e.name,e.value,n)}else{t.push(e)}if(i){sn(e,r)}});new FormData(o).forEach(function(e,t){if(e instanceof File&&e.name===\"\"){return}nn(t,e,n)})}}function sn(e,t){const n=e;if(n.willValidate){he(n,\"htmx:validation:validate\");if(!n.checkValidity()){t.push({elt:n,message:n.validationMessage,validity:n.validity});he(n,\"htmx:validation:failed\",{message:n.validationMessage,validity:n.validity})}}}function ln(n,e){for(const t of e.keys()){n.delete(t)}e.forEach(function(e,t){n.append(t,e)});return n}function cn(e,t){const n=[];const r=new FormData;const o=new FormData;const i=[];const s=ie(e);if(s.lastButtonClicked&&!le(s.lastButtonClicked)){s.lastButtonClicked=null}let l=e instanceof HTMLFormElement&&e.noValidate!==true||te(e,\"hx-validate\")===\"true\";if(s.lastButtonClicked){l=l&&s.lastButtonClicked.formNoValidate!==true}if(t!==\"get\"){on(n,o,i,g(e,\"form\"),l)}on(n,r,i,e,l);if(s.lastButtonClicked||e.tagName===\"BUTTON\"||e.tagName===\"INPUT\"&&ee(e,\"type\")===\"submit\"){const u=s.lastButtonClicked||e;const a=ee(u,\"name\");nn(a,u.value,o)}const c=we(e,\"hx-include\");se(c,function(e){on(n,r,i,ue(e),l);if(!h(e,\"form\")){se(f(e).querySelectorAll(ot),function(e){on(n,r,i,e,l)})}});ln(r,o);return{errors:i,formData:r,values:An(r)}}function un(e,t,n){if(e!==\"\"){e+=\"&\"}if(String(n)===\"[object Object]\"){n=JSON.stringify(n)}const r=encodeURIComponent(n);e+=encodeURIComponent(t)+\"=\"+r;return e}function an(e){e=qn(e);let n=\"\";e.forEach(function(e,t){n=un(n,t,e)});return n}function fn(e,t,n){const r={\"HX-Request\":\"true\",\"HX-Trigger\":ee(e,\"id\"),\"HX-Trigger-Name\":ee(e,\"name\"),\"HX-Target\":te(t,\"id\"),\"HX-Current-URL\":ne().location.href};bn(e,\"hx-headers\",false,r);if(n!==undefined){r[\"HX-Prompt\"]=n}if(ie(e).boosted){r[\"HX-Boosted\"]=\"true\"}return r}function hn(n,e){const t=re(e,\"hx-params\");if(t){if(t===\"none\"){return new FormData}else if(t===\"*\"){return n}else if(t.indexOf(\"not \")===0){se(t.slice(4).split(\",\"),function(e){e=e.trim();n.delete(e)});return n}else{const r=new FormData;se(t.split(\",\"),function(t){t=t.trim();if(n.has(t)){n.getAll(t).forEach(function(e){r.append(t,e)})}});return r}}else{return n}}function dn(e){return!!ee(e,\"href\")&&ee(e,\"href\").indexOf(\"#\")>=0}function gn(e,t){const n=t||re(e,\"hx-swap\");const r={swapStyle:ie(e).boosted?\"innerHTML\":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ie(e).boosted&&!dn(e)){r.show=\"top\"}if(n){const s=F(n);if(s.length>0){for(let e=0;e<s.length;e++){const l=s[e];if(l.indexOf(\"swap:\")===0){r.swapDelay=d(l.slice(5))}else if(l.indexOf(\"settle:\")===0){r.settleDelay=d(l.slice(7))}else if(l.indexOf(\"transition:\")===0){r.transition=l.slice(11)===\"true\"}else if(l.indexOf(\"ignoreTitle:\")===0){r.ignoreTitle=l.slice(12)===\"true\"}else if(l.indexOf(\"scroll:\")===0){const c=l.slice(7);var o=c.split(\":\");const u=o.pop();var i=o.length>0?o.join(\":\"):null;r.scroll=u;r.scrollTarget=i}else if(l.indexOf(\"show:\")===0){const a=l.slice(5);var o=a.split(\":\");const f=o.pop();var i=o.length>0?o.join(\":\"):null;r.show=f;r.showTarget=i}else if(l.indexOf(\"focus-scroll:\")===0){const h=l.slice(\"focus-scroll:\".length);r.focusScroll=h==\"true\"}else if(e==0){r.swapStyle=l}else{O(\"Unknown modifier in hx-swap: \"+l)}}}}return r}function pn(e){return re(e,\"hx-encoding\")===\"multipart/form-data\"||h(e,\"form\")&&ee(e,\"enctype\")===\"multipart/form-data\"}function mn(t,n,r){let o=null;Ft(n,function(e){if(o==null){o=e.encodeParameters(t,r,n)}});if(o!=null){return o}else{if(pn(n)){return ln(new FormData,qn(r))}else{return an(r)}}}function xn(e){return{tasks:[],elts:[e]}}function yn(e,t){const n=e[0];const r=e[e.length-1];if(t.scroll){var o=null;if(t.scrollTarget){o=ue(ae(n,t.scrollTarget))}if(t.scroll===\"top\"&&(n||o)){o=o||n;o.scrollTop=0}if(t.scroll===\"bottom\"&&(r||o)){o=o||r;o.scrollTop=o.scrollHeight}}if(t.show){var o=null;if(t.showTarget){let e=t.showTarget;if(t.showTarget===\"window\"){e=\"body\"}o=ue(ae(n,e))}if(t.show===\"top\"&&(n||o)){o=o||n;o.scrollIntoView({block:\"start\",behavior:Q.config.scrollBehavior})}if(t.show===\"bottom\"&&(r||o)){o=o||r;o.scrollIntoView({block:\"end\",behavior:Q.config.scrollBehavior})}}}function bn(r,e,o,i){if(i==null){i={}}if(r==null){return i}const s=te(r,e);if(s){let e=s.trim();let t=o;if(e===\"unset\"){return null}if(e.indexOf(\"javascript:\")===0){e=e.slice(11);t=true}else if(e.indexOf(\"js:\")===0){e=e.slice(3);t=true}if(e.indexOf(\"{\")!==0){e=\"{\"+e+\"}\"}let n;if(t){n=vn(r,function(){return Function(\"return (\"+e+\")\")()},{})}else{n=S(e)}for(const l in n){if(n.hasOwnProperty(l)){if(i[l]==null){i[l]=n[l]}}}}return bn(ue(c(r)),e,o,i)}function vn(e,t,n){if(Q.config.allowEval){return t()}else{fe(e,\"htmx:evalDisallowedError\");return n}}function wn(e,t){return bn(e,\"hx-vars\",true,t)}function Sn(e,t){return bn(e,\"hx-vals\",false,t)}function En(e){return ce(wn(e),Sn(e))}function Cn(t,n,r){if(r!==null){try{t.setRequestHeader(n,r)}catch(e){t.setRequestHeader(n,encodeURIComponent(r));t.setRequestHeader(n+\"-URI-AutoEncoded\",\"true\")}}}function On(t){if(t.responseURL&&typeof URL!==\"undefined\"){try{const e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(ne().body,\"htmx:badResponseUrl\",{url:t.responseURL})}}}function R(e,t){return t.test(e.getAllResponseHeaders())}function Rn(t,n,r){t=t.toLowerCase();if(r){if(r instanceof Element||typeof r===\"string\"){return de(t,n,null,null,{targetOverride:y(r)||ve,returnPromise:true})}else{let e=y(r.target);if(r.target&&!e||r.source&&!e&&!y(r.source)){e=ve}return de(t,n,y(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:e,swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return de(t,n,null,null,{returnPromise:true})}}function Hn(e){const t=[];while(e){t.push(e);e=e.parentElement}return t}function Tn(e,t,n){let r;let o;if(typeof URL===\"function\"){o=new URL(t,document.location.href);const i=document.location.origin;r=i===o.origin}else{o=t;r=l(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!r){return false}}return he(e,\"htmx:validateUrl\",ce({url:o,sameHost:r},n))}function qn(e){if(e instanceof FormData)return e;const t=new FormData;for(const n in e){if(e.hasOwnProperty(n)){if(e[n]&&typeof e[n].forEach===\"function\"){e[n].forEach(function(e){t.append(n,e)})}else if(typeof e[n]===\"object\"&&!(e[n]instanceof Blob)){t.append(n,JSON.stringify(e[n]))}else{t.append(n,e[n])}}}return t}function Ln(r,o,e){return new Proxy(e,{get:function(t,e){if(typeof e===\"number\")return t[e];if(e===\"length\")return t.length;if(e===\"push\"){return function(e){t.push(e);r.append(o,e)}}if(typeof t[e]===\"function\"){return function(){t[e].apply(t,arguments);r.delete(o);t.forEach(function(e){r.append(o,e)})}}if(t[e]&&t[e].length===1){return t[e][0]}else{return t[e]}},set:function(e,t,n){e[t]=n;r.delete(o);e.forEach(function(e){r.append(o,e)});return true}})}function An(o){return new Proxy(o,{get:function(e,t){if(typeof t===\"symbol\"){const r=Reflect.get(e,t);if(typeof r===\"function\"){return function(){return r.apply(o,arguments)}}else{return r}}if(t===\"toJSON\"){return()=>Object.fromEntries(o)}if(t in e){if(typeof e[t]===\"function\"){return function(){return o[t].apply(o,arguments)}}else{return e[t]}}const n=o.getAll(t);if(n.length===0){return undefined}else if(n.length===1){return n[0]}else{return Ln(e,t,n)}},set:function(t,n,e){if(typeof n!==\"string\"){return false}t.delete(n);if(e&&typeof e.forEach===\"function\"){e.forEach(function(e){t.append(n,e)})}else if(typeof e===\"object\"&&!(e instanceof Blob)){t.append(n,JSON.stringify(e))}else{t.append(n,e)}return true},deleteProperty:function(e,t){if(typeof t===\"string\"){e.delete(t)}return true},ownKeys:function(e){return Reflect.ownKeys(Object.fromEntries(e))},getOwnPropertyDescriptor:function(e,t){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e),t)}})}function de(t,n,r,o,i,D){let s=null;let l=null;i=i!=null?i:{};if(i.returnPromise&&typeof Promise!==\"undefined\"){var e=new Promise(function(e,t){s=e;l=t})}if(r==null){r=ne().body}const M=i.handler||Dn;const X=i.select||null;if(!le(r)){oe(s);return e}const c=i.targetOverride||ue(Ee(r));if(c==null||c==ve){fe(r,\"htmx:targetError\",{target:te(r,\"hx-target\")});oe(l);return e}let u=ie(r);const a=u.lastButtonClicked;if(a){const L=ee(a,\"formaction\");if(L!=null){n=L}const A=ee(a,\"formmethod\");if(A!=null){if(A.toLowerCase()!==\"dialog\"){t=A}}}const f=re(r,\"hx-confirm\");if(D===undefined){const K=function(e){return de(t,n,r,o,i,!!e)};const G={target:c,elt:r,path:n,verb:t,triggeringEvent:o,etc:i,issueRequest:K,question:f};if(he(r,\"htmx:confirm\",G)===false){oe(s);return e}}let h=r;let d=re(r,\"hx-sync\");let g=null;let F=false;if(d){const N=d.split(\":\");const I=N[0].trim();if(I===\"this\"){h=Se(r,\"hx-sync\")}else{h=ue(ae(r,I))}d=(N[1]||\"drop\").trim();u=ie(h);if(d===\"drop\"&&u.xhr&&u.abortable!==true){oe(s);return e}else if(d===\"abort\"){if(u.xhr){oe(s);return e}else{F=true}}else if(d===\"replace\"){he(h,\"htmx:abort\")}else if(d.indexOf(\"queue\")===0){const W=d.split(\" \");g=(W[1]||\"last\").trim()}}if(u.xhr){if(u.abortable){he(h,\"htmx:abort\")}else{if(g==null){if(o){const P=ie(o);if(P&&P.triggerSpec&&P.triggerSpec.queue){g=P.triggerSpec.queue}}if(g==null){g=\"last\"}}if(u.queuedRequests==null){u.queuedRequests=[]}if(g===\"first\"&&u.queuedRequests.length===0){u.queuedRequests.push(function(){de(t,n,r,o,i)})}else if(g===\"all\"){u.queuedRequests.push(function(){de(t,n,r,o,i)})}else if(g===\"last\"){u.queuedRequests=[];u.queuedRequests.push(function(){de(t,n,r,o,i)})}oe(s);return e}}const p=new XMLHttpRequest;u.xhr=p;u.abortable=F;const m=function(){u.xhr=null;u.abortable=false;if(u.queuedRequests!=null&&u.queuedRequests.length>0){const e=u.queuedRequests.shift();e()}};const B=re(r,\"hx-prompt\");if(B){var x=prompt(B);if(x===null||!he(r,\"htmx:prompt\",{prompt:x,target:c})){oe(s);m();return e}}if(f&&!D){if(!confirm(f)){oe(s);m();return e}}let y=fn(r,c,x);if(t!==\"get\"&&!pn(r)){y[\"Content-Type\"]=\"application/x-www-form-urlencoded\"}if(i.headers){y=ce(y,i.headers)}const U=cn(r,t);let b=U.errors;const j=U.formData;if(i.values){ln(j,qn(i.values))}const V=qn(En(r));const v=ln(j,V);let w=hn(v,r);if(Q.config.getCacheBusterParam&&t===\"get\"){w.set(\"org.htmx.cache-buster\",ee(c,\"id\")||\"true\")}if(n==null||n===\"\"){n=ne().location.href}const S=bn(r,\"hx-request\");const _=ie(r).boosted;let E=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;const C={boosted:_,useUrlParams:E,formData:w,parameters:An(w),unfilteredFormData:v,unfilteredParameters:An(v),headers:y,target:c,verb:t,errors:b,withCredentials:i.credentials||S.credentials||Q.config.withCredentials,timeout:i.timeout||S.timeout||Q.config.timeout,path:n,triggeringEvent:o};if(!he(r,\"htmx:configRequest\",C)){oe(s);m();return e}n=C.path;t=C.verb;y=C.headers;w=qn(C.parameters);b=C.errors;E=C.useUrlParams;if(b&&b.length>0){he(r,\"htmx:validation:halted\",C);oe(s);m();return e}const z=n.split(\"#\");const $=z[0];const O=z[1];let R=n;if(E){R=$;const Z=!w.keys().next().done;if(Z){if(R.indexOf(\"?\")<0){R+=\"?\"}else{R+=\"&\"}R+=an(w);if(O){R+=\"#\"+O}}}if(!Tn(r,R,C)){fe(r,\"htmx:invalidPath\",C);oe(l);return e}p.open(t.toUpperCase(),R,true);p.overrideMimeType(\"text/html\");p.withCredentials=C.withCredentials;p.timeout=C.timeout;if(S.noHeaders){}else{for(const k in y){if(y.hasOwnProperty(k)){const Y=y[k];Cn(p,k,Y)}}}const H={xhr:p,target:c,requestConfig:C,etc:i,boosted:_,select:X,pathInfo:{requestPath:n,finalRequestPath:R,responsePath:null,anchor:O}};p.onload=function(){try{const t=Hn(r);H.pathInfo.responsePath=On(p);M(r,H);if(H.keepIndicators!==true){Qt(T,q)}he(r,\"htmx:afterRequest\",H);he(r,\"htmx:afterOnLoad\",H);if(!le(r)){let e=null;while(t.length>0&&e==null){const n=t.shift();if(le(n)){e=n}}if(e){he(e,\"htmx:afterRequest\",H);he(e,\"htmx:afterOnLoad\",H)}}oe(s);m()}catch(e){fe(r,\"htmx:onLoadError\",ce({error:e},H));throw e}};p.onerror=function(){Qt(T,q);fe(r,\"htmx:afterRequest\",H);fe(r,\"htmx:sendError\",H);oe(l);m()};p.onabort=function(){Qt(T,q);fe(r,\"htmx:afterRequest\",H);fe(r,\"htmx:sendAbort\",H);oe(l);m()};p.ontimeout=function(){Qt(T,q);fe(r,\"htmx:afterRequest\",H);fe(r,\"htmx:timeout\",H);oe(l);m()};if(!he(r,\"htmx:beforeRequest\",H)){oe(s);m();return e}var T=Zt(r);var q=Yt(r);se([\"loadstart\",\"loadend\",\"progress\",\"abort\"],function(t){se([p,p.upload],function(e){e.addEventListener(t,function(e){he(r,\"htmx:xhr:\"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});he(r,\"htmx:beforeSend\",H);const J=E?null:mn(p,r,w);p.send(J);return e}function Nn(e,t){const n=t.xhr;let r=null;let o=null;if(R(n,/HX-Push:/i)){r=n.getResponseHeader(\"HX-Push\");o=\"push\"}else if(R(n,/HX-Push-Url:/i)){r=n.getResponseHeader(\"HX-Push-Url\");o=\"push\"}else if(R(n,/HX-Replace-Url:/i)){r=n.getResponseHeader(\"HX-Replace-Url\");o=\"replace\"}if(r){if(r===\"false\"){return{}}else{return{type:o,path:r}}}const i=t.pathInfo.finalRequestPath;const s=t.pathInfo.responsePath;const l=re(e,\"hx-push-url\");const c=re(e,\"hx-replace-url\");const u=ie(e).boosted;let a=null;let f=null;if(l){a=\"push\";f=l}else if(c){a=\"replace\";f=c}else if(u){a=\"push\";f=s||i}if(f){if(f===\"false\"){return{}}if(f===\"true\"){f=s||i}if(t.pathInfo.anchor&&f.indexOf(\"#\")===-1){f=f+\"#\"+t.pathInfo.anchor}return{type:a,path:f}}else{return{}}}function In(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function Pn(e){for(var t=0;t<Q.config.responseHandling.length;t++){var n=Q.config.responseHandling[t];if(In(n,e.status)){return n}}return{swap:false}}function kn(e){if(e){const t=u(\"title\");if(t){t.innerHTML=e}else{window.document.title=e}}}function Dn(o,i){const s=i.xhr;let l=i.target;const e=i.etc;const c=i.select;if(!he(o,\"htmx:beforeOnLoad\",i))return;if(R(s,/HX-Trigger:/i)){Je(s,\"HX-Trigger\",o)}if(R(s,/HX-Location:/i)){zt();let e=s.getResponseHeader(\"HX-Location\");var t;if(e.indexOf(\"{\")===0){t=S(e);e=t.path;delete t.path}Rn(\"get\",e,t).then(function(){$t(e)});return}const n=R(s,/HX-Refresh:/i)&&s.getResponseHeader(\"HX-Refresh\")===\"true\";if(R(s,/HX-Redirect:/i)){i.keepIndicators=true;location.href=s.getResponseHeader(\"HX-Redirect\");n&&location.reload();return}if(n){i.keepIndicators=true;location.reload();return}if(R(s,/HX-Retarget:/i)){if(s.getResponseHeader(\"HX-Retarget\")===\"this\"){i.target=o}else{i.target=ue(ae(o,s.getResponseHeader(\"HX-Retarget\")))}}const u=Nn(o,i);const r=Pn(s);const a=r.swap;let f=!!r.error;let h=Q.config.ignoreTitle||r.ignoreTitle;let d=r.select;if(r.target){i.target=ue(ae(o,r.target))}var g=e.swapOverride;if(g==null&&r.swapOverride){g=r.swapOverride}if(R(s,/HX-Retarget:/i)){if(s.getResponseHeader(\"HX-Retarget\")===\"this\"){i.target=o}else{i.target=ue(ae(o,s.getResponseHeader(\"HX-Retarget\")))}}if(R(s,/HX-Reswap:/i)){g=s.getResponseHeader(\"HX-Reswap\")}var p=s.response;var m=ce({shouldSwap:a,serverResponse:p,isError:f,ignoreTitle:h,selectOverride:d,swapOverride:g},i);if(r.event&&!he(l,r.event,m))return;if(!he(l,\"htmx:beforeSwap\",m))return;l=m.target;p=m.serverResponse;f=m.isError;h=m.ignoreTitle;d=m.selectOverride;g=m.swapOverride;i.target=l;i.failed=f;i.successful=!f;if(m.shouldSwap){if(s.status===286){lt(o)}Ft(o,function(e){p=e.transformResponse(p,s,o)});if(u.type){zt()}var x=gn(o,g);if(!x.hasOwnProperty(\"ignoreTitle\")){x.ignoreTitle=h}l.classList.add(Q.config.swappingClass);let n=null;let r=null;if(c){d=c}if(R(s,/HX-Reselect:/i)){d=s.getResponseHeader(\"HX-Reselect\")}const y=re(o,\"hx-select-oob\");const b=re(o,\"hx-select\");let e=function(){try{if(u.type){he(ne().body,\"htmx:beforeHistoryUpdate\",ce({history:u},i));if(u.type===\"push\"){$t(u.path);he(ne().body,\"htmx:pushedIntoHistory\",{path:u.path})}else{Jt(u.path);he(ne().body,\"htmx:replacedInHistory\",{path:u.path})}}$e(l,p,x,{select:d||b,selectOOB:y,eventInfo:i,anchor:i.pathInfo.anchor,contextElement:o,afterSwapCallback:function(){if(R(s,/HX-Trigger-After-Swap:/i)){let e=o;if(!le(o)){e=ne().body}Je(s,\"HX-Trigger-After-Swap\",e)}},afterSettleCallback:function(){if(R(s,/HX-Trigger-After-Settle:/i)){let e=o;if(!le(o)){e=ne().body}Je(s,\"HX-Trigger-After-Settle\",e)}oe(n)}})}catch(e){fe(o,\"htmx:swapError\",i);oe(r);throw e}};let t=Q.config.globalViewTransitions;if(x.hasOwnProperty(\"transition\")){t=x.transition}if(t&&he(o,\"htmx:beforeTransition\",i)&&typeof Promise!==\"undefined\"&&document.startViewTransition){const v=new Promise(function(e,t){n=e;r=t});const w=e;e=function(){document.startViewTransition(function(){w();return v})}}if(x.swapDelay>0){E().setTimeout(e,x.swapDelay)}else{e()}}if(f){fe(o,\"htmx:responseError\",ce({error:\"Response Status Error Code \"+s.status+\" from \"+i.pathInfo.requestPath},i))}}const Mn={};function Xn(){return{init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,n,r){return false},encodeParameters:function(e,t,n){return null}}}function Fn(e,t){if(t.init){t.init(n)}Mn[e]=ce(Xn(),t)}function Bn(e){delete Mn[e]}function Un(e,n,r){if(n==undefined){n=[]}if(e==undefined){return n}if(r==undefined){r=[]}const t=te(e,\"hx-ext\");if(t){se(t.split(\",\"),function(e){e=e.replace(/ /g,\"\");if(e.slice(0,7)==\"ignore:\"){r.push(e.slice(7));return}if(r.indexOf(e)<0){const t=Mn[e];if(t&&n.indexOf(t)<0){n.push(t)}}})}return Un(ue(c(e)),n,r)}var jn=false;ne().addEventListener(\"DOMContentLoaded\",function(){jn=true});function Vn(e){if(jn||ne().readyState===\"complete\"){e()}else{ne().addEventListener(\"DOMContentLoaded\",e)}}function _n(){if(Q.config.includeIndicatorStyles!==false){const e=Q.config.inlineStyleNonce?` nonce=\"${Q.config.inlineStyleNonce}\"`:\"\";ne().head.insertAdjacentHTML(\"beforeend\",\"<style\"+e+\"> .\"+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 zn(){const e=ne().querySelector('meta[name=\"htmx-config\"]');if(e){return S(e.content)}else{return null}}function $n(){const e=zn();if(e){Q.config=ce(Q.config,e)}}Vn(function(){$n();_n();let e=ne().body;kt(e);const t=ne().querySelectorAll(\"[hx-trigger='restored'],[data-hx-trigger='restored']\");e.addEventListener(\"htmx:abort\",function(e){const t=e.target;const n=ie(t);if(n&&n.xhr){n.xhr.abort()}});const n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){Wt();se(t,function(e){he(e,\"htmx:restored\",{document:ne(),triggerEvent:he})})}else{if(n){n(e)}}};E().setTimeout(function(){he(e,\"htmx:load\",{});e=null},0)});return Q}();";
|
|
3
|
+
//# sourceMappingURL=htmx-vendor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmx-vendor.d.ts","sourceRoot":"","sources":["../../../../src/ui/html/client/htmx-vendor.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,UAAU,+9lDAA+9lD,CAAC"}
|