@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.
Files changed (71) hide show
  1. package/README.md +1 -1
  2. package/dist/action.js +10 -9
  3. package/dist/action.js.map +1 -1
  4. package/dist/defineMiddleware-D017PWDc.js +8 -0
  5. package/dist/defineMiddleware-D017PWDc.js.map +1 -0
  6. package/dist/entry-server.js +161 -176
  7. package/dist/entry-server.js.map +1 -1
  8. package/dist/exceptions-D4OdiQjY.js +30 -0
  9. package/dist/exceptions-D4OdiQjY.js.map +1 -0
  10. package/dist/generateMetadata-DcdY-XC1.js +303 -0
  11. package/dist/generateMetadata-DcdY-XC1.js.map +1 -0
  12. package/dist/global-style-BhiGjxVU.js +21 -0
  13. package/dist/global-style-BhiGjxVU.js.map +1 -0
  14. package/dist/i18n.js +8 -11
  15. package/dist/i18n.js.map +1 -1
  16. package/dist/index.js +9 -55
  17. package/dist/island/client.js +2 -5
  18. package/dist/island/runtime.js +90 -107
  19. package/dist/island/runtime.js.map +1 -1
  20. package/dist/island.js +38 -56
  21. package/dist/island.js.map +1 -1
  22. package/dist/jsx-runtime-CI0Jmr-C.js +275 -0
  23. package/dist/jsx-runtime-CI0Jmr-C.js.map +1 -0
  24. package/dist/jsx-runtime.js +2 -31
  25. package/dist/middleware-CnDqZobD.js +217 -0
  26. package/dist/middleware-CnDqZobD.js.map +1 -0
  27. package/dist/middleware.js +3 -8
  28. package/dist/render-hUQUreah.js +152 -0
  29. package/dist/render-hUQUreah.js.map +1 -0
  30. package/dist/rolldown-runtime-B0aSnxlc.js +20 -0
  31. package/dist/router.js +72 -68
  32. package/dist/router.js.map +1 -1
  33. package/dist/seo.js +3 -7
  34. package/dist/server-5BEwGAL4.js +461 -0
  35. package/dist/server-5BEwGAL4.js.map +1 -0
  36. package/dist/server.js +2 -515
  37. package/dist/strategy-registry-wmHnsHQb.js +9 -0
  38. package/dist/strategy-registry-wmHnsHQb.js.map +1 -0
  39. package/dist/swap/server.js +11 -14
  40. package/dist/swap/server.js.map +1 -1
  41. package/dist/swap.js +109 -116
  42. package/dist/swap.js.map +1 -1
  43. package/dist/tooltip.js +145 -141
  44. package/dist/tooltip.js.map +1 -1
  45. package/dist/vite-plugin.js +315 -372
  46. package/dist/vite-plugin.js.map +1 -1
  47. package/package.json +8 -8
  48. package/src/core/bundler.ts +41 -25
  49. package/src/core/vite-plugin.ts +14 -15
  50. package/dist/client-D67hK4Yy.js +0 -9
  51. package/dist/client-D67hK4Yy.js.map +0 -1
  52. package/dist/defineMiddleware-VdHQuiUc.js +0 -7
  53. package/dist/defineMiddleware-VdHQuiUc.js.map +0 -1
  54. package/dist/exceptions-CHPz01DJ.js +0 -39
  55. package/dist/exceptions-CHPz01DJ.js.map +0 -1
  56. package/dist/generateMetadata-Cn8BIxq6.js +0 -144
  57. package/dist/generateMetadata-Cn8BIxq6.js.map +0 -1
  58. package/dist/global-style-DFvaBcuR.js +0 -27
  59. package/dist/global-style-DFvaBcuR.js.map +0 -1
  60. package/dist/index-CybB8Tdk.js +0 -315
  61. package/dist/index-CybB8Tdk.js.map +0 -1
  62. package/dist/index.js.map +0 -1
  63. package/dist/island/client.js.map +0 -1
  64. package/dist/jsx-runtime-DqAp8xlt.js +0 -296
  65. package/dist/jsx-runtime-DqAp8xlt.js.map +0 -1
  66. package/dist/jsx-runtime.js.map +0 -1
  67. package/dist/middleware.js.map +0 -1
  68. package/dist/render-CRag-5V7.js +0 -202
  69. package/dist/render-CRag-5V7.js.map +0 -1
  70. package/dist/seo.js.map +0 -1
  71. package/dist/server.js.map +0 -1
package/dist/swap.js CHANGED
@@ -1,121 +1,114 @@
1
- function b(e, n) {
2
- const a = document.createElement("template");
3
- a.innerHTML = e;
4
- const s = a.content;
5
- return n ? Array.from(s.querySelectorAll(n)) : s;
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
- function S(e, n, a) {
8
- switch (a) {
9
- case "innerHTML":
10
- e.innerHTML = "";
11
- const s = [];
12
- for (const r of n) {
13
- const i = e.appendChild(r);
14
- s.push(i);
15
- }
16
- return s;
17
- case "outerHTML": {
18
- const r = e.parentNode;
19
- if (!r) return [];
20
- const i = [];
21
- for (const c of n)
22
- r.insertBefore(c, e), i.push(c);
23
- return r.removeChild(e), i;
24
- }
25
- case "beforebegin": {
26
- const r = e.parentNode;
27
- return r ? n.map((i) => r.insertBefore(i, e)) : [];
28
- }
29
- case "afterbegin": {
30
- const r = e.firstChild;
31
- return n.map((i) => e.insertBefore(i, r));
32
- }
33
- case "beforeend":
34
- return n.map((r) => e.appendChild(r));
35
- case "afterend": {
36
- const r = e.parentNode;
37
- if (!r) return [];
38
- const i = e.nextSibling;
39
- return n.map((c) => r.insertBefore(c, i));
40
- }
41
- case "delete":
42
- return e.remove(), [];
43
- case "none":
44
- return [];
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
- function N(e, n) {
50
- let a;
51
- return ((...s) => {
52
- clearTimeout(a), a = setTimeout(() => e(...s), n);
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
- const w = "l5e-request";
56
- function A(e) {
57
- const n = e.tagName.toLowerCase();
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 x(e) {
61
- let n = !1;
62
- const a = e.swap ?? "innerHTML", s = e.trigger ? Array.from(document.querySelectorAll(e.trigger)) : [], r = document.querySelector(e.target), i = s[0] ?? null, c = e.event ?? (i ? A(i) : "click"), H = c === "submit", l = e.loading, y = l?.class ?? w;
63
- function M(o) {
64
- if (!l) return () => {
65
- };
66
- const t = l.target ? document.querySelector(l.target) : o;
67
- if (!t) return () => {
68
- };
69
- const u = l.disabled ?? t === o, m = t.innerHTML, g = t.disabled ?? !1;
70
- return t.classList.add(y), l.html && (t.innerHTML = l.html), u && "disabled" in t && (t.disabled = !0), () => {
71
- t.classList.remove(y), l.html && t !== r && (t.innerHTML = m), u && "disabled" in t && (t.disabled = g);
72
- };
73
- }
74
- async function E(o) {
75
- if (n || !r) return;
76
- const t = o instanceof HTMLElement ? o : i, u = {
77
- triggerElement: t,
78
- triggerDataset: t?.dataset ?? {}
79
- }, m = typeof o == "string" ? o : void 0;
80
- if (e.onBefore?.(u) === !1) return;
81
- const g = M(t);
82
- try {
83
- let f, h;
84
- if (e.action)
85
- h = await e.action(u), f = await h.text();
86
- else if (m !== void 0)
87
- f = m;
88
- else
89
- return;
90
- let d;
91
- e.select ? d = b(f, e.select) : d = Array.from(b(f).childNodes);
92
- const L = { root: b(f).firstElementChild, response: h };
93
- if (e.onNodes) {
94
- const v = e.onNodes(d, L);
95
- Array.isArray(v) && (d = v);
96
- }
97
- const p = S(r, d, a);
98
- e.onSwap?.(p, L), e.onAfter?.(p, L, u);
99
- } catch (f) {
100
- e.onError?.(f, f.status);
101
- } finally {
102
- g();
103
- }
104
- }
105
- function T(o) {
106
- H && o.preventDefault(), E(o.currentTarget ?? void 0);
107
- }
108
- return s.forEach((o) => o.addEventListener(c, T)), {
109
- exec: E,
110
- destroy() {
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
- export {
116
- x as createSwap,
117
- N as debounce,
118
- b as parseHTML,
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":"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"}
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 { autoUpdate as u, computePosition as m, offset as f, flip as h, shift as v, hide as b } from "@floating-ui/dom";
2
- function y() {
3
- const o = navigator.userAgent.toLowerCase(), e = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile|tablet/i.test(o), t = window.matchMedia("(max-width: 768px)").matches;
4
- return e || t;
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 w() {
7
- const o = document.querySelectorAll("[data-tooltip-id]");
8
- if (o.length === 0) return;
9
- const e = y();
10
- o.forEach((t) => {
11
- t.hasAttribute("data-tooltip-initialized") || (t.setAttribute("data-tooltip-initialized", "true"), e ? t.addEventListener("click", async (n) => {
12
- n.preventDefault();
13
- const { showTooltipMobile: i } = await Promise.resolve().then(() => d);
14
- i(t);
15
- }) : (t.addEventListener("pointerenter", () => {
16
- t.setAttribute("data-tooltip-active", "true");
17
- }), t.addEventListener("pointerleave", () => {
18
- t.removeAttribute("data-tooltip-active");
19
- }), t.addEventListener(
20
- "pointerenter",
21
- async () => {
22
- const { showTooltip: n } = await Promise.resolve().then(() => d);
23
- n(t);
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 H() {
30
- if (window.__tooltipObserver) return;
31
- const o = new MutationObserver((e) => {
32
- let t = !1;
33
- e.forEach((n) => {
34
- n.type === "childList" && n.addedNodes.length > 0 && n.addedNodes.forEach((i) => {
35
- if (i.nodeType === Node.ELEMENT_NODE) {
36
- const a = i;
37
- (a.hasAttribute("data-tooltip-id") || a.querySelector("[data-tooltip-id]")) && (t = !0);
38
- }
39
- });
40
- }), t && w();
41
- });
42
- o.observe(document.body, {
43
- childList: !0,
44
- subtree: !0
45
- }), window.__tooltipObserver = o;
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
- const L = ({ type: o, id: e }) => `/tooltip/${o}/${e}`, T = ({ type: o, id: e }) => {
48
- const t = document.documentElement.lang;
49
- let n = "";
50
- if (t) {
51
- const i = t.split("-")[0].toLowerCase(), l = location.pathname.match(/^\/([a-zA-Z-]+)(?:\/|$)/)?.[1];
52
- l && (l.toLowerCase() === i || l.toLowerCase() === t.toLowerCase()) && (n = `/${l}`);
53
- }
54
- return `${n}/tooltip/${o}/${e}`;
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 E(o) {
57
- window.__l5eTooltipUrl = o === "auto-locale" ? T : o;
59
+ function p(e) {
60
+ window.__l5eTooltipUrl = e === "auto-locale" ? f : e;
58
61
  }
59
- function p(o) {
60
- const { tooltipId: e, tooltipType: t } = o.dataset;
61
- return (window.__l5eTooltipUrl ?? L)({ type: t ?? "", id: e ?? "", host: o });
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 x(o) {
64
- if (!o.hasAttribute("data-tooltip-active")) return;
65
- const e = document.createElement("div");
66
- e.className = "tp", e.innerHTML = '<div class="tp-loading">Loading...</div>', document.body.append(e);
67
- let t = null;
68
- const n = () => {
69
- t && (t(), t = null), document.body.contains(e) && e.remove();
70
- };
71
- if (o.addEventListener("pointerleave", n), !o.hasAttribute("data-tooltip-active")) {
72
- o.removeEventListener("pointerleave", n), e.remove();
73
- return;
74
- }
75
- t = u(o, e, () => s(o, e));
76
- try {
77
- const i = await fetch(p(o), {
78
- headers: { Accept: "text/html" }
79
- }).then((a) => a.text());
80
- if (!document.body.contains(e)) return;
81
- e.innerHTML = i, await s(o, e);
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(o) {
87
- const e = document.createElement("div");
88
- e.className = "tp-overlay";
89
- const t = document.createElement("div");
90
- t.className = "tp-mobile", t.innerHTML = '<div class="tp-loading">Loading...</div>', e.append(t), document.body.append(e), document.body.style.overflow = "hidden";
91
- const n = () => {
92
- e.remove(), document.body.style.overflow = "";
93
- };
94
- e.addEventListener("click", (i) => {
95
- i.target === e && n();
96
- });
97
- try {
98
- const i = await fetch(p(o), {
99
- headers: { Accept: "text/html" }
100
- }).then((c) => c.text());
101
- t.innerHTML = "";
102
- const a = document.createElement("button");
103
- a.className = "tp-mobile-close", a.innerHTML = "&#x2715;", a.addEventListener("click", n), t.append(a);
104
- const l = document.createElement("div");
105
- l.className = "tp-mobile-content", l.innerHTML = i, t.append(l);
106
- const r = o.dataset.href;
107
- if (r) {
108
- const c = document.createElement("a");
109
- c.className = "tp-mobile-link", c.href = r, c.textContent = "Xem chi tiết", t.append(c);
110
- }
111
- } catch {
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 = "&#x2715;", 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 M() {
116
- return {
117
- name: "centerFallback",
118
- fn({ rects: o }) {
119
- const e = window.innerHeight, t = 8;
120
- return o.floating.height <= e * 0.6 ? {} : {
121
- y: window.scrollY + Math.max(t, (e - o.floating.height) / 2),
122
- data: { centered: !0, maxHeight: e - t * 2 }
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 s(o, e) {
128
- const n = o.dataset.tooltipPlacement ?? "left";
129
- return m(o, e, {
130
- placement: n,
131
- middleware: [f(6), h(), v({ padding: 5 }), M(), b()]
132
- }).then(({ x: i, y: a, middlewareData: l }) => {
133
- Object.assign(e.style, { left: `${i}px`, top: `${a}px` }), e.style.visibility = l.hide?.referenceHidden ? "hidden" : "visible";
134
- const r = l.centerFallback;
135
- r?.centered ? (e.style.maxHeight = `${r.maxHeight}px`, e.style.overflowY = "auto") : (e.style.maxHeight = "", e.style.overflowY = "");
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
- const d = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
139
- __proto__: null,
140
- configureTooltip: E,
141
- showTooltip: x,
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