@withl5e/l5e 0.3.3-alpha.4 → 1.0.0
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/action.js +10 -9
- package/dist/action.js.map +1 -1
- package/dist/defineMiddleware-D017PWDc.js +8 -0
- package/dist/defineMiddleware-D017PWDc.js.map +1 -0
- package/dist/entry-server.js +161 -176
- package/dist/entry-server.js.map +1 -1
- package/dist/exceptions-D4OdiQjY.js +30 -0
- package/dist/exceptions-D4OdiQjY.js.map +1 -0
- package/dist/generateMetadata-DcdY-XC1.js +303 -0
- package/dist/generateMetadata-DcdY-XC1.js.map +1 -0
- package/dist/global-style-BhiGjxVU.js +21 -0
- package/dist/global-style-BhiGjxVU.js.map +1 -0
- package/dist/i18n.js +8 -11
- package/dist/i18n.js.map +1 -1
- package/dist/index.js +9 -55
- package/dist/island/client.js +2 -5
- package/dist/island/runtime.js +90 -107
- package/dist/island/runtime.js.map +1 -1
- package/dist/island.js +38 -56
- package/dist/island.js.map +1 -1
- package/dist/jsx-runtime-CI0Jmr-C.js +275 -0
- package/dist/jsx-runtime-CI0Jmr-C.js.map +1 -0
- package/dist/jsx-runtime.js +2 -31
- package/dist/middleware-CnDqZobD.js +217 -0
- package/dist/middleware-CnDqZobD.js.map +1 -0
- package/dist/middleware.js +3 -8
- package/dist/render-hUQUreah.js +152 -0
- package/dist/render-hUQUreah.js.map +1 -0
- package/dist/rolldown-runtime-B0aSnxlc.js +20 -0
- package/dist/router.js +72 -68
- package/dist/router.js.map +1 -1
- package/dist/seo.js +3 -7
- package/dist/server-5BEwGAL4.js +461 -0
- package/dist/server-5BEwGAL4.js.map +1 -0
- package/dist/server.js +2 -515
- package/dist/strategy-registry-wmHnsHQb.js +9 -0
- package/dist/strategy-registry-wmHnsHQb.js.map +1 -0
- package/dist/swap/server.js +11 -14
- package/dist/swap/server.js.map +1 -1
- package/dist/swap.js +109 -116
- package/dist/swap.js.map +1 -1
- package/dist/tooltip.js +145 -141
- package/dist/tooltip.js.map +1 -1
- package/dist/vite-plugin.js +315 -372
- package/dist/vite-plugin.js.map +1 -1
- package/package.json +8 -8
- package/src/core/bundler.ts +41 -25
- package/src/core/vite-plugin.ts +14 -15
- package/dist/client-D67hK4Yy.js +0 -9
- package/dist/client-D67hK4Yy.js.map +0 -1
- package/dist/defineMiddleware-VdHQuiUc.js +0 -7
- package/dist/defineMiddleware-VdHQuiUc.js.map +0 -1
- package/dist/exceptions-CHPz01DJ.js +0 -39
- package/dist/exceptions-CHPz01DJ.js.map +0 -1
- package/dist/generateMetadata-Cn8BIxq6.js +0 -144
- package/dist/generateMetadata-Cn8BIxq6.js.map +0 -1
- package/dist/global-style-DFvaBcuR.js +0 -27
- package/dist/global-style-DFvaBcuR.js.map +0 -1
- package/dist/index-CybB8Tdk.js +0 -315
- package/dist/index-CybB8Tdk.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/island/client.js.map +0 -1
- package/dist/jsx-runtime-DqAp8xlt.js +0 -296
- package/dist/jsx-runtime-DqAp8xlt.js.map +0 -1
- package/dist/jsx-runtime.js.map +0 -1
- package/dist/middleware.js.map +0 -1
- package/dist/render-CRag-5V7.js +0 -202
- package/dist/render-CRag-5V7.js.map +0 -1
- package/dist/seo.js.map +0 -1
- package/dist/server.js.map +0 -1
package/dist/swap.js
CHANGED
|
@@ -1,121 +1,114 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
//#region src/swap/parse.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
let n = document.createElement("template");
|
|
4
|
+
n.innerHTML = e;
|
|
5
|
+
let r = n.content;
|
|
6
|
+
return t ? Array.from(r.querySelectorAll(t)) : r;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
default:
|
|
46
|
-
return [];
|
|
47
|
-
}
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/swap/swap.ts
|
|
10
|
+
function t(e, t, n) {
|
|
11
|
+
switch (n) {
|
|
12
|
+
case "innerHTML":
|
|
13
|
+
e.innerHTML = "";
|
|
14
|
+
let n = [];
|
|
15
|
+
for (let r of t) {
|
|
16
|
+
let t = e.appendChild(r);
|
|
17
|
+
n.push(t);
|
|
18
|
+
}
|
|
19
|
+
return n;
|
|
20
|
+
case "outerHTML": {
|
|
21
|
+
let n = e.parentNode;
|
|
22
|
+
if (!n) return [];
|
|
23
|
+
let r = [];
|
|
24
|
+
for (let i of t) n.insertBefore(i, e), r.push(i);
|
|
25
|
+
return n.removeChild(e), r;
|
|
26
|
+
}
|
|
27
|
+
case "beforebegin": {
|
|
28
|
+
let n = e.parentNode;
|
|
29
|
+
return n ? t.map((t) => n.insertBefore(t, e)) : [];
|
|
30
|
+
}
|
|
31
|
+
case "afterbegin": {
|
|
32
|
+
let n = e.firstChild;
|
|
33
|
+
return t.map((t) => e.insertBefore(t, n));
|
|
34
|
+
}
|
|
35
|
+
case "beforeend": return t.map((t) => e.appendChild(t));
|
|
36
|
+
case "afterend": {
|
|
37
|
+
let n = e.parentNode;
|
|
38
|
+
if (!n) return [];
|
|
39
|
+
let r = e.nextSibling;
|
|
40
|
+
return t.map((e) => n.insertBefore(e, r));
|
|
41
|
+
}
|
|
42
|
+
case "delete": return e.remove(), [];
|
|
43
|
+
case "none": return [];
|
|
44
|
+
default: return [];
|
|
45
|
+
}
|
|
48
46
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region src/swap/utils.ts
|
|
49
|
+
function n(e, t) {
|
|
50
|
+
let n;
|
|
51
|
+
return ((...r) => {
|
|
52
|
+
clearTimeout(n), n = setTimeout(() => e(...r), t);
|
|
53
|
+
});
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return n === "form" ? "submit" : n === "input" || n === "textarea" || n === "select" ? "change" : "click";
|
|
55
|
+
function r(e) {
|
|
56
|
+
let t = e.tagName.toLowerCase();
|
|
57
|
+
return t === "form" ? "submit" : t === "input" || t === "textarea" || t === "select" ? "change" : "click";
|
|
59
58
|
}
|
|
60
|
-
function
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
n = !0, s.forEach((o) => o.removeEventListener(c, T));
|
|
112
|
-
}
|
|
113
|
-
};
|
|
59
|
+
function i(n) {
|
|
60
|
+
let i = !1, a = n.swap ?? "innerHTML", o = n.trigger ? Array.from(document.querySelectorAll(n.trigger)) : [], s = document.querySelector(n.target), c = o[0] ?? null, l = n.event ?? (c ? r(c) : "click"), u = l === "submit", d = n.loading, f = d?.class ?? "l5e-request";
|
|
61
|
+
function p(e) {
|
|
62
|
+
if (!d) return () => {};
|
|
63
|
+
let t = d.target ? document.querySelector(d.target) : e;
|
|
64
|
+
if (!t) return () => {};
|
|
65
|
+
let n = d.disabled ?? t === e, r = t.innerHTML, i = t.disabled ?? !1;
|
|
66
|
+
return t.classList.add(f), d.html && (t.innerHTML = d.html), n && "disabled" in t && (t.disabled = !0), () => {
|
|
67
|
+
t.classList.remove(f), d.html && t !== s && (t.innerHTML = r), n && "disabled" in t && (t.disabled = i);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async function m(r) {
|
|
71
|
+
if (i || !s) return;
|
|
72
|
+
let o = r instanceof HTMLElement ? r : c, l = {
|
|
73
|
+
triggerElement: o,
|
|
74
|
+
triggerDataset: o?.dataset ?? {}
|
|
75
|
+
}, u = typeof r == "string" ? r : void 0;
|
|
76
|
+
if (n.onBefore?.(l) === !1) return;
|
|
77
|
+
let d = p(o);
|
|
78
|
+
try {
|
|
79
|
+
let r, i;
|
|
80
|
+
if (n.action) i = await n.action(l), r = await i.text();
|
|
81
|
+
else if (u !== void 0) r = u;
|
|
82
|
+
else return;
|
|
83
|
+
let o;
|
|
84
|
+
o = n.select ? e(r, n.select) : Array.from(e(r).childNodes);
|
|
85
|
+
let c = {
|
|
86
|
+
root: e(r).firstElementChild,
|
|
87
|
+
response: i
|
|
88
|
+
};
|
|
89
|
+
if (n.onNodes) {
|
|
90
|
+
let e = n.onNodes(o, c);
|
|
91
|
+
Array.isArray(e) && (o = e);
|
|
92
|
+
}
|
|
93
|
+
let d = t(s, o, a);
|
|
94
|
+
n.onSwap?.(d, c), n.onAfter?.(d, c, l);
|
|
95
|
+
} catch (e) {
|
|
96
|
+
n.onError?.(e, e.status);
|
|
97
|
+
} finally {
|
|
98
|
+
d();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function h(e) {
|
|
102
|
+
u && e.preventDefault(), m(e.currentTarget ?? void 0);
|
|
103
|
+
}
|
|
104
|
+
return o.forEach((e) => e.addEventListener(l, h)), {
|
|
105
|
+
exec: m,
|
|
106
|
+
destroy() {
|
|
107
|
+
i = !0, o.forEach((e) => e.removeEventListener(l, h));
|
|
108
|
+
}
|
|
109
|
+
};
|
|
114
110
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
S as swap
|
|
120
|
-
};
|
|
121
|
-
//# sourceMappingURL=swap.js.map
|
|
111
|
+
//#endregion
|
|
112
|
+
export { i as createSwap, n as debounce, e as parseHTML, t as swap };
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=swap.js.map
|
package/dist/swap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap.js","sources":["../src/swap/parse.ts","../src/swap/swap.ts","../src/swap/utils.ts","../src/swap/create-swap.ts"],"sourcesContent":["export function parseHTML(html: string): DocumentFragment;\nexport function parseHTML(html: string, selector: string): Element[];\nexport function parseHTML(html: string, selector?: string): DocumentFragment | Element[] {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const fragment = tpl.content;\n\n if (selector) {\n return Array.from(fragment.querySelectorAll(selector));\n }\n return fragment;\n}\n","import type { SwapMode } from './types';\n\nexport function swap(target: Element, nodes: Node[], mode: SwapMode): Node[] {\n switch (mode) {\n case 'innerHTML':\n target.innerHTML = '';\n const innerInserted: Node[] = [];\n for (const n of nodes) {\n const added = target.appendChild(n);\n innerInserted.push(added);\n }\n return innerInserted;\n\n case 'outerHTML': {\n const parent = target.parentNode;\n if (!parent) return [];\n const outerInserted: Node[] = [];\n for (const n of nodes) {\n parent.insertBefore(n, target);\n outerInserted.push(n);\n }\n parent.removeChild(target);\n return outerInserted;\n }\n\n case 'beforebegin': {\n const parent = target.parentNode;\n if (!parent) return [];\n return nodes.map((n) => parent.insertBefore(n, target));\n }\n\n case 'afterbegin': {\n const first = target.firstChild;\n return nodes.map((n) => target.insertBefore(n, first));\n }\n\n case 'beforeend':\n return nodes.map((n) => target.appendChild(n));\n\n case 'afterend': {\n const parent = target.parentNode;\n if (!parent) return [];\n const ref = target.nextSibling;\n return nodes.map((n) => parent.insertBefore(n, ref));\n }\n\n case 'delete':\n target.remove();\n return [];\n\n case 'none':\n return [];\n\n default:\n return [];\n }\n}\n","export function debounce<T extends (...args: any[]) => void>(fn: T, ms: number): T {\n let timer: ReturnType<typeof setTimeout>;\n return ((...args: any[]) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n }) as unknown as T;\n}\n","import { parseHTML } from './parse';\nimport { swap } from './swap';\nimport type { SwapOptions, SwapInstance, SwapMeta, SwapContext } from './types';\n\nconst REQUEST_CLASS = 'l5e-request';\n\nfunction getNaturalEvent(el: Element): string {\n const tag = el.tagName.toLowerCase();\n if (tag === 'form') return 'submit';\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return 'change';\n return 'click';\n}\n\nexport function createSwap(opts: SwapOptions): SwapInstance {\n let destroyed = false;\n const swapMode = opts.swap ?? 'innerHTML';\n\n const triggerEls = opts.trigger\n ? Array.from(document.querySelectorAll<HTMLElement>(opts.trigger))\n : [];\n\n const targetEl = document.querySelector<HTMLElement>(opts.target);\n\n const firstTrigger = triggerEls[0] ?? null;\n const eventName = opts.event ?? (firstTrigger ? getNaturalEvent(firstTrigger) : 'click');\n const shouldPreventDefault = eventName === 'submit';\n\n const loadingCfg = opts.loading;\n const loadingClass = loadingCfg?.class ?? REQUEST_CLASS;\n\n function applyLoading(currentTrigger: HTMLElement | null): () => void {\n if (!loadingCfg) return () => {};\n const el = loadingCfg.target\n ? document.querySelector<HTMLElement>(loadingCfg.target)\n : currentTrigger;\n if (!el) return () => {};\n\n const shouldDisable = loadingCfg.disabled ?? el === currentTrigger;\n const originalHtml = el.innerHTML;\n const originalDisabled = (el as HTMLButtonElement).disabled ?? false;\n\n el.classList.add(loadingClass);\n if (loadingCfg.html) el.innerHTML = loadingCfg.html;\n if (shouldDisable && 'disabled' in el) (el as any).disabled = true;\n\n return () => {\n el.classList.remove(loadingClass);\n if (loadingCfg.html && el !== targetEl) el.innerHTML = originalHtml;\n if (shouldDisable && 'disabled' in el) (el as any).disabled = originalDisabled;\n };\n }\n\n async function exec(input?: HTMLElement | string): Promise<void> {\n if (destroyed) return;\n\n if (!targetEl) return;\n\n const ctxEl = input instanceof HTMLElement ? input : firstTrigger;\n const ctx: SwapContext = {\n triggerElement: ctxEl,\n triggerDataset: ctxEl?.dataset ?? ({} as DOMStringMap),\n };\n const htmlInput = typeof input === 'string' ? input : undefined;\n\n if (opts.onBefore?.(ctx) === false) return;\n\n const restoreLoading = applyLoading(ctxEl);\n\n try {\n let html: string;\n let res: Response | undefined;\n if (opts.action) {\n res = await opts.action(ctx);\n html = await res.text();\n } else if (htmlInput !== undefined) {\n html = htmlInput;\n } else {\n return;\n }\n\n let nodes: Node[];\n if (opts.select) {\n nodes = parseHTML(html, opts.select) as Node[];\n } else {\n nodes = Array.from(parseHTML(html).childNodes);\n }\n\n const root = parseHTML(html).firstElementChild as HTMLElement | null;\n const meta: SwapMeta = { root, response: res };\n\n if (opts.onNodes) {\n const t = opts.onNodes(nodes, meta);\n if (Array.isArray(t)) nodes = t;\n }\n\n const inserted = swap(targetEl, nodes, swapMode);\n\n opts.onSwap?.(inserted, meta);\n opts.onAfter?.(inserted, meta, ctx);\n } catch (err: any) {\n opts.onError?.(err, err.status);\n } finally {\n restoreLoading();\n }\n }\n\n function handleTrigger(e: Event) {\n if (shouldPreventDefault) e.preventDefault();\n exec((e.currentTarget as HTMLElement) ?? undefined);\n }\n\n triggerEls.forEach((el) => el.addEventListener(eventName, handleTrigger));\n\n return {\n exec,\n destroy() {\n destroyed = true;\n triggerEls.forEach((el) => el.removeEventListener(eventName, handleTrigger));\n },\n };\n}\n"],"names":["parseHTML","html","selector","tpl","fragment","swap","target","nodes","mode","innerInserted","n","added","parent","outerInserted","first","ref","debounce","fn","ms","timer","args","REQUEST_CLASS","getNaturalEvent","el","tag","createSwap","opts","destroyed","swapMode","triggerEls","targetEl","firstTrigger","eventName","shouldPreventDefault","loadingCfg","loadingClass","applyLoading","currentTrigger","shouldDisable","originalHtml","originalDisabled","exec","input","ctxEl","ctx","htmlInput","restoreLoading","res","meta","t","inserted","err","handleTrigger","e"],"mappings":"AAEO,SAASA,EAAUC,GAAcC,GAAiD;AACvF,QAAMC,IAAM,SAAS,cAAc,UAAU;AAC7C,EAAAA,EAAI,YAAYF;AAChB,QAAMG,IAAWD,EAAI;AAErB,SAAID,IACK,MAAM,KAAKE,EAAS,iBAAiBF,CAAQ,CAAC,IAEhDE;AACT;ACTO,SAASC,EAAKC,GAAiBC,GAAeC,GAAwB;AAC3E,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,MAAAF,EAAO,YAAY;AACnB,YAAMG,IAAwB,CAAA;AAC9B,iBAAWC,KAAKH,GAAO;AACrB,cAAMI,IAAQL,EAAO,YAAYI,CAAC;AAClC,QAAAD,EAAc,KAAKE,CAAK;AAAA,MAC1B;AACA,aAAOF;AAAA,IAET,KAAK,aAAa;AAChB,YAAMG,IAASN,EAAO;AACtB,UAAI,CAACM,EAAQ,QAAO,CAAA;AACpB,YAAMC,IAAwB,CAAA;AAC9B,iBAAWH,KAAKH;AACd,QAAAK,EAAO,aAAaF,GAAGJ,CAAM,GAC7BO,EAAc,KAAKH,CAAC;AAEtB,aAAAE,EAAO,YAAYN,CAAM,GAClBO;AAAA,IACT;AAAA,IAEA,KAAK,eAAe;AAClB,YAAMD,IAASN,EAAO;AACtB,aAAKM,IACEL,EAAM,IAAI,CAACG,MAAME,EAAO,aAAaF,GAAGJ,CAAM,CAAC,IADlC,CAAA;AAAA,IAEtB;AAAA,IAEA,KAAK,cAAc;AACjB,YAAMQ,IAAQR,EAAO;AACrB,aAAOC,EAAM,IAAI,CAACG,MAAMJ,EAAO,aAAaI,GAAGI,CAAK,CAAC;AAAA,IACvD;AAAA,IAEA,KAAK;AACH,aAAOP,EAAM,IAAI,CAACG,MAAMJ,EAAO,YAAYI,CAAC,CAAC;AAAA,IAE/C,KAAK,YAAY;AACf,YAAME,IAASN,EAAO;AACtB,UAAI,CAACM,EAAQ,QAAO,CAAA;AACpB,YAAMG,IAAMT,EAAO;AACnB,aAAOC,EAAM,IAAI,CAACG,MAAME,EAAO,aAAaF,GAAGK,CAAG,CAAC;AAAA,IACrD;AAAA,IAEA,KAAK;AACH,aAAAT,EAAO,OAAA,GACA,CAAA;AAAA,IAET,KAAK;AACH,aAAO,CAAA;AAAA,IAET;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;ACxDO,SAASU,EAA6CC,GAAOC,GAAe;AACjF,MAAIC;AACJ,UAAQ,IAAIC,MAAgB;AAC1B,iBAAaD,CAAK,GAClBA,IAAQ,WAAW,MAAMF,EAAG,GAAGG,CAAI,GAAGF,CAAE;AAAA,EAC1C;AACF;ACFA,MAAMG,IAAgB;AAEtB,SAASC,EAAgBC,GAAqB;AAC5C,QAAMC,IAAMD,EAAG,QAAQ,YAAA;AACvB,SAAIC,MAAQ,SAAe,WACvBA,MAAQ,WAAWA,MAAQ,cAAcA,MAAQ,WAAiB,WAC/D;AACT;AAEO,SAASC,EAAWC,GAAiC;AAC1D,MAAIC,IAAY;AAChB,QAAMC,IAAWF,EAAK,QAAQ,aAExBG,IAAaH,EAAK,UACpB,MAAM,KAAK,SAAS,iBAA8BA,EAAK,OAAO,CAAC,IAC/D,CAAA,GAEEI,IAAW,SAAS,cAA2BJ,EAAK,MAAM,GAE1DK,IAAeF,EAAW,CAAC,KAAK,MAChCG,IAAYN,EAAK,UAAUK,IAAeT,EAAgBS,CAAY,IAAI,UAC1EE,IAAuBD,MAAc,UAErCE,IAAaR,EAAK,SAClBS,IAAeD,GAAY,SAASb;AAE1C,WAASe,EAAaC,GAAgD;AACpE,QAAI,CAACH,EAAY,QAAO,MAAM;AAAA,IAAC;AAC/B,UAAMX,IAAKW,EAAW,SAClB,SAAS,cAA2BA,EAAW,MAAM,IACrDG;AACJ,QAAI,CAACd,EAAI,QAAO,MAAM;AAAA,IAAC;AAEvB,UAAMe,IAAgBJ,EAAW,YAAYX,MAAOc,GAC9CE,IAAehB,EAAG,WAClBiB,IAAoBjB,EAAyB,YAAY;AAE/D,WAAAA,EAAG,UAAU,IAAIY,CAAY,GACzBD,EAAW,SAAMX,EAAG,YAAYW,EAAW,OAC3CI,KAAiB,cAAcf,MAAKA,EAAW,WAAW,KAEvD,MAAM;AACX,MAAAA,EAAG,UAAU,OAAOY,CAAY,GAC5BD,EAAW,QAAQX,MAAOO,QAAa,YAAYS,IACnDD,KAAiB,cAAcf,MAAKA,EAAW,WAAWiB;AAAA,IAChE;AAAA,EACF;AAEA,iBAAeC,EAAKC,GAA6C;AAG/D,QAFIf,KAEA,CAACG,EAAU;AAEf,UAAMa,IAAQD,aAAiB,cAAcA,IAAQX,GAC/Ca,IAAmB;AAAA,MACvB,gBAAgBD;AAAA,MAChB,gBAAgBA,GAAO,WAAY,CAAA;AAAA,IAAC,GAEhCE,IAAY,OAAOH,KAAU,WAAWA,IAAQ;AAEtD,QAAIhB,EAAK,WAAWkB,CAAG,MAAM,GAAO;AAEpC,UAAME,IAAiBV,EAAaO,CAAK;AAEzC,QAAI;AACF,UAAI1C,GACA8C;AACJ,UAAIrB,EAAK;AACP,QAAAqB,IAAM,MAAMrB,EAAK,OAAOkB,CAAG,GAC3B3C,IAAO,MAAM8C,EAAI,KAAA;AAAA,eACRF,MAAc;AACvB,QAAA5C,IAAO4C;AAAA;AAEP;AAGF,UAAItC;AACJ,MAAImB,EAAK,SACPnB,IAAQP,EAAUC,GAAMyB,EAAK,MAAM,IAEnCnB,IAAQ,MAAM,KAAKP,EAAUC,CAAI,EAAE,UAAU;AAI/C,YAAM+C,IAAiB,EAAE,MADZhD,EAAUC,CAAI,EAAE,mBACE,UAAU8C,EAAA;AAEzC,UAAIrB,EAAK,SAAS;AAChB,cAAMuB,IAAIvB,EAAK,QAAQnB,GAAOyC,CAAI;AAClC,QAAI,MAAM,QAAQC,CAAC,MAAG1C,IAAQ0C;AAAA,MAChC;AAEA,YAAMC,IAAW7C,EAAKyB,GAAUvB,GAAOqB,CAAQ;AAE/C,MAAAF,EAAK,SAASwB,GAAUF,CAAI,GAC5BtB,EAAK,UAAUwB,GAAUF,GAAMJ,CAAG;AAAA,IACpC,SAASO,GAAU;AACjB,MAAAzB,EAAK,UAAUyB,GAAKA,EAAI,MAAM;AAAA,IAChC,UAAA;AACE,MAAAL,EAAA;AAAA,IACF;AAAA,EACF;AAEA,WAASM,EAAcC,GAAU;AAC/B,IAAIpB,OAAwB,eAAA,GAC5BQ,EAAMY,EAAE,iBAAiC,MAAS;AAAA,EACpD;AAEA,SAAAxB,EAAW,QAAQ,CAACN,MAAOA,EAAG,iBAAiBS,GAAWoB,CAAa,CAAC,GAEjE;AAAA,IACL,MAAAX;AAAA,IACA,UAAU;AACR,MAAAd,IAAY,IACZE,EAAW,QAAQ,CAACN,MAAOA,EAAG,oBAAoBS,GAAWoB,CAAa,CAAC;AAAA,IAC7E;AAAA,EAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"swap.js","names":[],"sources":["../src/swap/parse.ts","../src/swap/swap.ts","../src/swap/utils.ts","../src/swap/create-swap.ts"],"sourcesContent":["export function parseHTML(html: string): DocumentFragment;\nexport function parseHTML(html: string, selector: string): Element[];\nexport function parseHTML(html: string, selector?: string): DocumentFragment | Element[] {\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const fragment = tpl.content;\n\n if (selector) {\n return Array.from(fragment.querySelectorAll(selector));\n }\n return fragment;\n}\n","import type { SwapMode } from './types';\n\nexport function swap(target: Element, nodes: Node[], mode: SwapMode): Node[] {\n switch (mode) {\n case 'innerHTML':\n target.innerHTML = '';\n const innerInserted: Node[] = [];\n for (const n of nodes) {\n const added = target.appendChild(n);\n innerInserted.push(added);\n }\n return innerInserted;\n\n case 'outerHTML': {\n const parent = target.parentNode;\n if (!parent) return [];\n const outerInserted: Node[] = [];\n for (const n of nodes) {\n parent.insertBefore(n, target);\n outerInserted.push(n);\n }\n parent.removeChild(target);\n return outerInserted;\n }\n\n case 'beforebegin': {\n const parent = target.parentNode;\n if (!parent) return [];\n return nodes.map((n) => parent.insertBefore(n, target));\n }\n\n case 'afterbegin': {\n const first = target.firstChild;\n return nodes.map((n) => target.insertBefore(n, first));\n }\n\n case 'beforeend':\n return nodes.map((n) => target.appendChild(n));\n\n case 'afterend': {\n const parent = target.parentNode;\n if (!parent) return [];\n const ref = target.nextSibling;\n return nodes.map((n) => parent.insertBefore(n, ref));\n }\n\n case 'delete':\n target.remove();\n return [];\n\n case 'none':\n return [];\n\n default:\n return [];\n }\n}\n","export function debounce<T extends (...args: any[]) => void>(fn: T, ms: number): T {\n let timer: ReturnType<typeof setTimeout>;\n return ((...args: any[]) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n }) as unknown as T;\n}\n","import { parseHTML } from './parse';\nimport { swap } from './swap';\nimport type { SwapOptions, SwapInstance, SwapMeta, SwapContext } from './types';\n\nconst REQUEST_CLASS = 'l5e-request';\n\nfunction getNaturalEvent(el: Element): string {\n const tag = el.tagName.toLowerCase();\n if (tag === 'form') return 'submit';\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return 'change';\n return 'click';\n}\n\nexport function createSwap(opts: SwapOptions): SwapInstance {\n let destroyed = false;\n const swapMode = opts.swap ?? 'innerHTML';\n\n const triggerEls = opts.trigger\n ? Array.from(document.querySelectorAll<HTMLElement>(opts.trigger))\n : [];\n\n const targetEl = document.querySelector<HTMLElement>(opts.target);\n\n const firstTrigger = triggerEls[0] ?? null;\n const eventName = opts.event ?? (firstTrigger ? getNaturalEvent(firstTrigger) : 'click');\n const shouldPreventDefault = eventName === 'submit';\n\n const loadingCfg = opts.loading;\n const loadingClass = loadingCfg?.class ?? REQUEST_CLASS;\n\n function applyLoading(currentTrigger: HTMLElement | null): () => void {\n if (!loadingCfg) return () => {};\n const el = loadingCfg.target\n ? document.querySelector<HTMLElement>(loadingCfg.target)\n : currentTrigger;\n if (!el) return () => {};\n\n const shouldDisable = loadingCfg.disabled ?? el === currentTrigger;\n const originalHtml = el.innerHTML;\n const originalDisabled = (el as HTMLButtonElement).disabled ?? false;\n\n el.classList.add(loadingClass);\n if (loadingCfg.html) el.innerHTML = loadingCfg.html;\n if (shouldDisable && 'disabled' in el) (el as any).disabled = true;\n\n return () => {\n el.classList.remove(loadingClass);\n if (loadingCfg.html && el !== targetEl) el.innerHTML = originalHtml;\n if (shouldDisable && 'disabled' in el) (el as any).disabled = originalDisabled;\n };\n }\n\n async function exec(input?: HTMLElement | string): Promise<void> {\n if (destroyed) return;\n\n if (!targetEl) return;\n\n const ctxEl = input instanceof HTMLElement ? input : firstTrigger;\n const ctx: SwapContext = {\n triggerElement: ctxEl,\n triggerDataset: ctxEl?.dataset ?? ({} as DOMStringMap),\n };\n const htmlInput = typeof input === 'string' ? input : undefined;\n\n if (opts.onBefore?.(ctx) === false) return;\n\n const restoreLoading = applyLoading(ctxEl);\n\n try {\n let html: string;\n let res: Response | undefined;\n if (opts.action) {\n res = await opts.action(ctx);\n html = await res.text();\n } else if (htmlInput !== undefined) {\n html = htmlInput;\n } else {\n return;\n }\n\n let nodes: Node[];\n if (opts.select) {\n nodes = parseHTML(html, opts.select) as Node[];\n } else {\n nodes = Array.from(parseHTML(html).childNodes);\n }\n\n const root = parseHTML(html).firstElementChild as HTMLElement | null;\n const meta: SwapMeta = { root, response: res };\n\n if (opts.onNodes) {\n const t = opts.onNodes(nodes, meta);\n if (Array.isArray(t)) nodes = t;\n }\n\n const inserted = swap(targetEl, nodes, swapMode);\n\n opts.onSwap?.(inserted, meta);\n opts.onAfter?.(inserted, meta, ctx);\n } catch (err: any) {\n opts.onError?.(err, err.status);\n } finally {\n restoreLoading();\n }\n }\n\n function handleTrigger(e: Event) {\n if (shouldPreventDefault) e.preventDefault();\n exec((e.currentTarget as HTMLElement) ?? undefined);\n }\n\n triggerEls.forEach((el) => el.addEventListener(eventName, handleTrigger));\n\n return {\n exec,\n destroy() {\n destroyed = true;\n triggerEls.forEach((el) => el.removeEventListener(eventName, handleTrigger));\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/tooltip.js
CHANGED
|
@@ -1,151 +1,155 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { n as e } from "./rolldown-runtime-B0aSnxlc.js";
|
|
2
|
+
import { autoUpdate as t, computePosition as n, flip as r, hide as i, offset as a, shift as o } from "@floating-ui/dom";
|
|
3
|
+
//#region src/tooltip/tooltip-loader.ts
|
|
4
|
+
function s() {
|
|
5
|
+
let e = navigator.userAgent.toLowerCase(), t = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile|tablet/i.test(e), n = window.matchMedia("(max-width: 768px)").matches;
|
|
6
|
+
return t || n;
|
|
5
7
|
}
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
},
|
|
25
|
-
{ passive: !0 }
|
|
26
|
-
)));
|
|
27
|
-
});
|
|
8
|
+
function c() {
|
|
9
|
+
let e = document.querySelectorAll("[data-tooltip-id]");
|
|
10
|
+
if (e.length === 0) return;
|
|
11
|
+
let t = s();
|
|
12
|
+
e.forEach((e) => {
|
|
13
|
+
e.hasAttribute("data-tooltip-initialized") || (e.setAttribute("data-tooltip-initialized", "true"), t ? e.addEventListener("click", async (t) => {
|
|
14
|
+
t.preventDefault();
|
|
15
|
+
let { showTooltipMobile: n } = await Promise.resolve().then(() => u);
|
|
16
|
+
n(e);
|
|
17
|
+
}) : (e.addEventListener("pointerenter", () => {
|
|
18
|
+
e.setAttribute("data-tooltip-active", "true");
|
|
19
|
+
}), e.addEventListener("pointerleave", () => {
|
|
20
|
+
e.removeAttribute("data-tooltip-active");
|
|
21
|
+
}), e.addEventListener("pointerenter", async () => {
|
|
22
|
+
let { showTooltip: t } = await Promise.resolve().then(() => u);
|
|
23
|
+
t(e);
|
|
24
|
+
}, { passive: !0 })));
|
|
25
|
+
});
|
|
28
26
|
}
|
|
29
|
-
function
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
27
|
+
function l() {
|
|
28
|
+
if (window.__tooltipObserver) return;
|
|
29
|
+
let e = new MutationObserver((e) => {
|
|
30
|
+
let t = !1;
|
|
31
|
+
e.forEach((e) => {
|
|
32
|
+
e.type === "childList" && e.addedNodes.length > 0 && e.addedNodes.forEach((e) => {
|
|
33
|
+
if (e.nodeType === Node.ELEMENT_NODE) {
|
|
34
|
+
let n = e;
|
|
35
|
+
(n.hasAttribute("data-tooltip-id") || n.querySelector("[data-tooltip-id]")) && (t = !0);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}), t && c();
|
|
39
|
+
});
|
|
40
|
+
e.observe(document.body, {
|
|
41
|
+
childList: !0,
|
|
42
|
+
subtree: !0
|
|
43
|
+
}), window.__tooltipObserver = e;
|
|
46
44
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/tooltip/tooltip-runtime.ts
|
|
47
|
+
var u = /* @__PURE__ */ e({
|
|
48
|
+
configureTooltip: () => p,
|
|
49
|
+
showTooltip: () => h,
|
|
50
|
+
showTooltipMobile: () => g
|
|
51
|
+
}), d = ({ type: e, id: t }) => `/tooltip/${e}/${t}`, f = ({ type: e, id: t }) => {
|
|
52
|
+
let n = document.documentElement.lang, r = "";
|
|
53
|
+
if (n) {
|
|
54
|
+
let e = n.split("-")[0].toLowerCase(), t = location.pathname.match(/^\/([a-zA-Z-]+)(?:\/|$)/)?.[1];
|
|
55
|
+
t && (t.toLowerCase() === e || t.toLowerCase() === n.toLowerCase()) && (r = `/${t}`);
|
|
56
|
+
}
|
|
57
|
+
return `${r}/tooltip/${e}/${t}`;
|
|
55
58
|
};
|
|
56
|
-
function
|
|
57
|
-
|
|
59
|
+
function p(e) {
|
|
60
|
+
window.__l5eTooltipUrl = e === "auto-locale" ? f : e;
|
|
58
61
|
}
|
|
59
|
-
function
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
function m(e) {
|
|
63
|
+
let { tooltipId: t, tooltipType: n } = e.dataset;
|
|
64
|
+
return (window.__l5eTooltipUrl ?? d)({
|
|
65
|
+
type: n ?? "",
|
|
66
|
+
id: t ?? "",
|
|
67
|
+
host: e
|
|
68
|
+
});
|
|
62
69
|
}
|
|
63
|
-
async function
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
} catch {
|
|
83
|
-
document.body.contains(e) && (e.innerHTML = '<div class="tp-error">Không thể tải tooltip</div>');
|
|
84
|
-
}
|
|
70
|
+
async function h(e) {
|
|
71
|
+
if (!e.hasAttribute("data-tooltip-active")) return;
|
|
72
|
+
let n = document.createElement("div");
|
|
73
|
+
n.className = "tp", n.innerHTML = "<div class=\"tp-loading\">Loading...</div>", document.body.append(n);
|
|
74
|
+
let r = null, i = () => {
|
|
75
|
+
r &&= (r(), null), document.body.contains(n) && n.remove();
|
|
76
|
+
};
|
|
77
|
+
if (e.addEventListener("pointerleave", i), !e.hasAttribute("data-tooltip-active")) {
|
|
78
|
+
e.removeEventListener("pointerleave", i), n.remove();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
r = t(e, n, () => v(e, n));
|
|
82
|
+
try {
|
|
83
|
+
let t = await fetch(m(e), { headers: { Accept: "text/html" } }).then((e) => e.text());
|
|
84
|
+
if (!document.body.contains(n)) return;
|
|
85
|
+
n.innerHTML = t, await v(e, n);
|
|
86
|
+
} catch {
|
|
87
|
+
document.body.contains(n) && (n.innerHTML = "<div class=\"tp-error\">Không thể tải tooltip</div>");
|
|
88
|
+
}
|
|
85
89
|
}
|
|
86
|
-
async function g(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
t.innerHTML = '<div class="tp-error">Không thể tải tooltip</div>';
|
|
113
|
-
}
|
|
90
|
+
async function g(e) {
|
|
91
|
+
let t = document.createElement("div");
|
|
92
|
+
t.className = "tp-overlay";
|
|
93
|
+
let n = document.createElement("div");
|
|
94
|
+
n.className = "tp-mobile", n.innerHTML = "<div class=\"tp-loading\">Loading...</div>", t.append(n), document.body.append(t), document.body.style.overflow = "hidden";
|
|
95
|
+
let r = () => {
|
|
96
|
+
t.remove(), document.body.style.overflow = "";
|
|
97
|
+
};
|
|
98
|
+
t.addEventListener("click", (e) => {
|
|
99
|
+
e.target === t && r();
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
let t = await fetch(m(e), { headers: { Accept: "text/html" } }).then((e) => e.text());
|
|
103
|
+
n.innerHTML = "";
|
|
104
|
+
let i = document.createElement("button");
|
|
105
|
+
i.className = "tp-mobile-close", i.innerHTML = "✕", i.addEventListener("click", r), n.append(i);
|
|
106
|
+
let a = document.createElement("div");
|
|
107
|
+
a.className = "tp-mobile-content", a.innerHTML = t, n.append(a);
|
|
108
|
+
let o = e.dataset.href;
|
|
109
|
+
if (o) {
|
|
110
|
+
let e = document.createElement("a");
|
|
111
|
+
e.className = "tp-mobile-link", e.href = o, e.textContent = "Xem chi tiết", n.append(e);
|
|
112
|
+
}
|
|
113
|
+
} catch {
|
|
114
|
+
n.innerHTML = "<div class=\"tp-error\">Không thể tải tooltip</div>";
|
|
115
|
+
}
|
|
114
116
|
}
|
|
115
|
-
function
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
117
|
+
function _() {
|
|
118
|
+
return {
|
|
119
|
+
name: "centerFallback",
|
|
120
|
+
fn({ rects: e }) {
|
|
121
|
+
let t = window.innerHeight;
|
|
122
|
+
return e.floating.height <= t * .6 ? {} : {
|
|
123
|
+
y: window.scrollY + Math.max(8, (t - e.floating.height) / 2),
|
|
124
|
+
data: {
|
|
125
|
+
centered: !0,
|
|
126
|
+
maxHeight: t - 16
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
};
|
|
126
131
|
}
|
|
127
|
-
function
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
132
|
+
function v(e, t) {
|
|
133
|
+
let s = e.dataset.tooltipPlacement ?? "left";
|
|
134
|
+
return n(e, t, {
|
|
135
|
+
placement: s,
|
|
136
|
+
middleware: [
|
|
137
|
+
a(6),
|
|
138
|
+
r(),
|
|
139
|
+
o({ padding: 5 }),
|
|
140
|
+
_(),
|
|
141
|
+
i()
|
|
142
|
+
]
|
|
143
|
+
}).then(({ x: e, y: n, middlewareData: r }) => {
|
|
144
|
+
Object.assign(t.style, {
|
|
145
|
+
left: `${e}px`,
|
|
146
|
+
top: `${n}px`
|
|
147
|
+
}), t.style.visibility = r.hide?.referenceHidden ? "hidden" : "visible";
|
|
148
|
+
let i = r.centerFallback;
|
|
149
|
+
i?.centered ? (t.style.maxHeight = `${i.maxHeight}px`, t.style.overflowY = "auto") : (t.style.maxHeight = "", t.style.overflowY = "");
|
|
150
|
+
});
|
|
137
151
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
showTooltipMobile: g
|
|
143
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
144
|
-
export {
|
|
145
|
-
E as configureTooltip,
|
|
146
|
-
w as initTooltips,
|
|
147
|
-
H as setupTooltipObserver,
|
|
148
|
-
x as showTooltip,
|
|
149
|
-
g as showTooltipMobile
|
|
150
|
-
};
|
|
151
|
-
//# sourceMappingURL=tooltip.js.map
|
|
152
|
+
//#endregion
|
|
153
|
+
export { p as configureTooltip, c as initTooltips, l as setupTooltipObserver, h as showTooltip, g as showTooltipMobile };
|
|
154
|
+
|
|
155
|
+
//# sourceMappingURL=tooltip.js.map
|