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.
@@ -1,5 +1,5 @@
1
1
  import type { ComponentPublicInstance, MaybeRef, MaybeRefOrGetter } from 'vue';
2
- import { unref, toValue, watch, isRef } from 'vue';
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
- let currentElement: HTMLElement | null = null;
34
- let currentListener: ((event: MouseEvent | TouchEvent) => void) | null = null;
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 setupListener = (targetElement: HTMLElement | null) => {
37
- // Cleanup previous listener
38
- if (currentElement && currentListener) {
39
- document.removeEventListener('mousedown', currentListener, { capture: true });
40
- document.removeEventListener('touchstart', currentListener, { capture: true });
41
- activeListeners.delete(currentElement);
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
- currentElement = targetElement;
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
- // Initial setup
79
- setupListener(resolveTarget(target));
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
- if (currentElement && currentListener) {
103
- document.removeEventListener('mousedown', currentListener, { capture: true });
104
- document.removeEventListener('touchstart', currentListener, { capture: true });
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,7 +1,7 @@
1
1
  {
2
2
  "name": "prlg-ui",
3
3
  "private": false,
4
- "version": "1.7.18",
4
+ "version": "1.7.20",
5
5
  "type": "module",
6
6
  "main": "dist/prlg-ui.umd.js",
7
7
  "module": "dist/prlg-ui.es.js",
@@ -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;