prlg-ui 1.7.18 → 1.7.20
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/dist/blocks/index.cjs.js +1 -1
- package/dist/blocks/index.es.js +1 -1
- package/dist/onClickOutside.util-BWGmebYq.js +30 -0
- package/dist/onClickOutside.util-CvjEyTtT.cjs +1 -0
- package/dist/prlg-ui.cjs.js +1 -1
- package/dist/prlg-ui.css +1 -1
- package/dist/prlg-ui.es.js +4 -4
- package/dist/utils/index.cjs.js +1 -1
- package/dist/utils/index.es.js +1 -1
- package/dist/utils/onClickOutside.util.ts +37 -77
- package/package.json +1 -1
- package/dist/onClickOutside.util-h1mIKJca.js +0 -41
- package/dist/onClickOutside.util-s9tGCG0a.cjs +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ComponentPublicInstance, MaybeRef, MaybeRefOrGetter } from 'vue';
|
|
2
|
-
import { unref, toValue
|
|
2
|
+
import { unref, toValue } from 'vue';
|
|
3
3
|
|
|
4
4
|
export type VueInstance = ComponentPublicInstance;
|
|
5
5
|
export type MaybeElement = HTMLElement | SVGElement | VueInstance | undefined | null;
|
|
@@ -11,7 +11,6 @@ export interface OnClickOutsideOptions {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
const activeListeners = new WeakMap<HTMLElement, () => void>();
|
|
14
|
-
const activeWatchers = new WeakMap<any, () => void>();
|
|
15
14
|
|
|
16
15
|
function unrefElement(elRef: MaybeElementRef<MaybeElement>): HTMLElement | null {
|
|
17
16
|
const plain = unref(elRef);
|
|
@@ -30,89 +29,50 @@ export function onClickOutside(
|
|
|
30
29
|
handler: (event: MouseEvent | TouchEvent) => void,
|
|
31
30
|
options: OnClickOutsideOptions = {}
|
|
32
31
|
): () => void {
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
const targetElement = resolveTarget(target);
|
|
33
|
+
if (!targetElement) return () => {};
|
|
34
|
+
|
|
35
|
+
// Remove existing listener if present
|
|
36
|
+
const existingCleanup = activeListeners.get(targetElement);
|
|
37
|
+
if (existingCleanup) {
|
|
38
|
+
existingCleanup();
|
|
39
|
+
activeListeners.delete(targetElement);
|
|
40
|
+
}
|
|
35
41
|
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
if (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
const listener = (event: MouseEvent | TouchEvent) => {
|
|
43
|
+
const targetNode = event.target instanceof Node ? event.target : null;
|
|
44
|
+
if (!targetNode) return;
|
|
45
|
+
|
|
46
|
+
const rawIgnores = toValue(options.ignore) ?? [];
|
|
47
|
+
const ignoreElements = rawIgnores
|
|
48
|
+
.map(el => {
|
|
49
|
+
if (typeof el === 'string') {
|
|
50
|
+
return document.querySelector(el) as HTMLElement | null;
|
|
51
|
+
}
|
|
52
|
+
return unrefElement(el);
|
|
53
|
+
})
|
|
54
|
+
.filter((el): el is HTMLElement => el !== null && el !== undefined);
|
|
55
|
+
|
|
56
|
+
if (
|
|
57
|
+
targetElement.contains(targetNode) ||
|
|
58
|
+
ignoreElements.some(ignoreEl => ignoreEl.contains(targetNode))
|
|
59
|
+
) {
|
|
60
|
+
return;
|
|
42
61
|
}
|
|
43
62
|
|
|
44
|
-
|
|
45
|
-
currentListener = null;
|
|
46
|
-
|
|
47
|
-
if (!targetElement) return;
|
|
48
|
-
|
|
49
|
-
const listener = (event: MouseEvent | TouchEvent) => {
|
|
50
|
-
const targetNode = event.target instanceof Node ? event.target : null;
|
|
51
|
-
if (!targetNode) return;
|
|
52
|
-
|
|
53
|
-
const rawIgnores = toValue(options.ignore) ?? [];
|
|
54
|
-
const ignoreElements = rawIgnores
|
|
55
|
-
.map(el => {
|
|
56
|
-
if (typeof el === 'string') {
|
|
57
|
-
return document.querySelector(el) as HTMLElement | null;
|
|
58
|
-
}
|
|
59
|
-
return unrefElement(el);
|
|
60
|
-
})
|
|
61
|
-
.filter((el): el is HTMLElement => el !== null && el !== undefined);
|
|
62
|
-
|
|
63
|
-
if (
|
|
64
|
-
targetElement.contains(targetNode) ||
|
|
65
|
-
ignoreElements.some(ignoreEl => ignoreEl.contains(targetNode))
|
|
66
|
-
) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
handler(event);
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
currentListener = listener;
|
|
74
|
-
document.addEventListener('mousedown', listener, { capture: true });
|
|
75
|
-
document.addEventListener('touchstart', listener, { capture: true });
|
|
63
|
+
handler(event);
|
|
76
64
|
};
|
|
77
65
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
// Watch for target changes if target is reactive
|
|
82
|
-
let stopWatcher: (() => void) | null = null;
|
|
83
|
-
if (isRef(target) || (typeof target === 'object' && target !== null)) {
|
|
84
|
-
try {
|
|
85
|
-
stopWatcher = watch(
|
|
86
|
-
() => resolveTarget(target),
|
|
87
|
-
(newElement) => {
|
|
88
|
-
setupListener(newElement);
|
|
89
|
-
},
|
|
90
|
-
{ flush: 'sync' }
|
|
91
|
-
);
|
|
92
|
-
// Store watcher cleanup function
|
|
93
|
-
if (target && typeof target === 'object') {
|
|
94
|
-
activeWatchers.set(target, stopWatcher);
|
|
95
|
-
}
|
|
96
|
-
} catch {
|
|
97
|
-
// If watch fails (e.g., target is not reactive), continue without watching
|
|
98
|
-
}
|
|
99
|
-
}
|
|
66
|
+
document.addEventListener('mousedown', listener, { capture: true });
|
|
67
|
+
document.addEventListener('touchstart', listener, { capture: true });
|
|
100
68
|
|
|
69
|
+
// Store cleanup function and return it
|
|
101
70
|
const cleanup = () => {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
activeListeners.delete(currentElement);
|
|
106
|
-
}
|
|
107
|
-
if (stopWatcher) {
|
|
108
|
-
stopWatcher();
|
|
109
|
-
if (target && typeof target === 'object') {
|
|
110
|
-
activeWatchers.delete(target);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
currentElement = null;
|
|
114
|
-
currentListener = null;
|
|
71
|
+
document.removeEventListener('mousedown', listener, { capture: true });
|
|
72
|
+
document.removeEventListener('touchstart', listener, { capture: true });
|
|
73
|
+
activeListeners.delete(targetElement);
|
|
115
74
|
};
|
|
75
|
+
activeListeners.set(targetElement, cleanup);
|
|
116
76
|
|
|
117
77
|
return cleanup;
|
|
118
78
|
}
|
package/package.json
CHANGED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { isRef as L, watch as h, toValue as w, unref as E } from "vue";
|
|
2
|
-
const a = /* @__PURE__ */ new WeakMap(), d = /* @__PURE__ */ new WeakMap();
|
|
3
|
-
function m(e) {
|
|
4
|
-
const u = E(e);
|
|
5
|
-
return u?.$el ?? u;
|
|
6
|
-
}
|
|
7
|
-
function p(e) {
|
|
8
|
-
return typeof e == "string" ? document.querySelector(e) : m(e);
|
|
9
|
-
}
|
|
10
|
-
function k(e, u, v = {}) {
|
|
11
|
-
let r = null, n = null;
|
|
12
|
-
const f = (o) => {
|
|
13
|
-
if (r && n && (document.removeEventListener("mousedown", n, { capture: !0 }), document.removeEventListener("touchstart", n, { capture: !0 }), a.delete(r)), r = o, n = null, !o) return;
|
|
14
|
-
const s = (i) => {
|
|
15
|
-
const l = i.target instanceof Node ? i.target : null;
|
|
16
|
-
if (!l) return;
|
|
17
|
-
const y = (w(v.ignore) ?? []).map((t) => typeof t == "string" ? document.querySelector(t) : m(t)).filter((t) => t != null);
|
|
18
|
-
o.contains(l) || y.some((t) => t.contains(l)) || u(i);
|
|
19
|
-
};
|
|
20
|
-
n = s, document.addEventListener("mousedown", s, { capture: !0 }), document.addEventListener("touchstart", s, { capture: !0 });
|
|
21
|
-
};
|
|
22
|
-
f(p(e));
|
|
23
|
-
let c = null;
|
|
24
|
-
if (L(e) || typeof e == "object" && e !== null)
|
|
25
|
-
try {
|
|
26
|
-
c = h(
|
|
27
|
-
() => p(e),
|
|
28
|
-
(o) => {
|
|
29
|
-
f(o);
|
|
30
|
-
},
|
|
31
|
-
{ flush: "sync" }
|
|
32
|
-
), e && typeof e == "object" && d.set(e, c);
|
|
33
|
-
} catch {
|
|
34
|
-
}
|
|
35
|
-
return () => {
|
|
36
|
-
r && n && (document.removeEventListener("mousedown", n, { capture: !0 }), document.removeEventListener("touchstart", n, { capture: !0 }), a.delete(r)), c && (c(), e && typeof e == "object" && d.delete(e)), r = null, n = null;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
export {
|
|
40
|
-
k as o
|
|
41
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const s=require("vue"),a=new WeakMap,p=new WeakMap;function v(e){const o=s.unref(e);return o?.$el??o}function m(e){return typeof e=="string"?document.querySelector(e):v(e)}function h(e,o,y={}){let r=null,n=null;const d=u=>{if(r&&n&&(document.removeEventListener("mousedown",n,{capture:!0}),document.removeEventListener("touchstart",n,{capture:!0}),a.delete(r)),r=u,n=null,!u)return;const i=l=>{const f=l.target instanceof Node?l.target:null;if(!f)return;const L=(s.toValue(y.ignore)??[]).map(t=>typeof t=="string"?document.querySelector(t):v(t)).filter(t=>t!=null);u.contains(f)||L.some(t=>t.contains(f))||o(l)};n=i,document.addEventListener("mousedown",i,{capture:!0}),document.addEventListener("touchstart",i,{capture:!0})};d(m(e));let c=null;if(s.isRef(e)||typeof e=="object"&&e!==null)try{c=s.watch(()=>m(e),u=>{d(u)},{flush:"sync"}),e&&typeof e=="object"&&p.set(e,c)}catch{}return()=>{r&&n&&(document.removeEventListener("mousedown",n,{capture:!0}),document.removeEventListener("touchstart",n,{capture:!0}),a.delete(r)),c&&(c(),e&&typeof e=="object"&&p.delete(e)),r=null,n=null}}exports.onClickOutside=h;
|