@vueuse/components 11.0.3 → 11.1.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/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var vueDemi = require('vue-demi');
4
3
  var core = require('@vueuse/core');
4
+ var vueDemi = require('vue-demi');
5
5
  var shared = require('@vueuse/shared');
6
6
 
7
7
  const OnClickOutside = /* @__PURE__ */ /* #__PURE__ */ vueDemi.defineComponent({
@@ -20,14 +20,14 @@ const OnClickOutside = /* @__PURE__ */ /* #__PURE__ */ vueDemi.defineComponent({
20
20
  }
21
21
  });
22
22
 
23
+ const defaultWindow = shared.isClient ? window : void 0;
24
+
23
25
  function unrefElement(elRef) {
24
26
  var _a;
25
27
  const plain = shared.toValue(elRef);
26
28
  return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
27
29
  }
28
30
 
29
- const defaultWindow = shared.isClient ? window : void 0;
30
-
31
31
  function useEventListener(...args) {
32
32
  let target;
33
33
  let events;
@@ -89,7 +89,7 @@ function onClickOutside(target, handler, options = {}) {
89
89
  }
90
90
  let shouldListen = true;
91
91
  const shouldIgnore = (event) => {
92
- return ignore.some((target2) => {
92
+ return shared.toValue(ignore).some((target2) => {
93
93
  if (typeof target2 === "string") {
94
94
  return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));
95
95
  } else {
@@ -110,8 +110,17 @@ function onClickOutside(target, handler, options = {}) {
110
110
  }
111
111
  handler(event);
112
112
  };
113
+ let isProcessingClick = false;
113
114
  const cleanup = [
114
- useEventListener(window, "click", listener, { passive: true, capture }),
115
+ useEventListener(window, "click", (event) => {
116
+ if (!isProcessingClick) {
117
+ isProcessingClick = true;
118
+ setTimeout(() => {
119
+ isProcessingClick = false;
120
+ }, 0);
121
+ listener(event);
122
+ }
123
+ }, { passive: true, capture }),
115
124
  useEventListener(window, "pointerdown", (e) => {
116
125
  const el = unrefElement(target);
117
126
  shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));
@@ -389,6 +398,64 @@ function getSSRHandler(key, fallback) {
389
398
  return handlers[key] || fallback;
390
399
  }
391
400
 
401
+ function useMounted() {
402
+ const isMounted = vueDemi.ref(false);
403
+ const instance = vueDemi.getCurrentInstance();
404
+ if (instance) {
405
+ vueDemi.onMounted(() => {
406
+ isMounted.value = true;
407
+ }, vueDemi.isVue2 ? void 0 : instance);
408
+ }
409
+ return isMounted;
410
+ }
411
+
412
+ function useSupported(callback) {
413
+ const isMounted = useMounted();
414
+ return vueDemi.computed(() => {
415
+ isMounted.value;
416
+ return Boolean(callback());
417
+ });
418
+ }
419
+
420
+ function useMediaQuery(query, options = {}) {
421
+ const { window = defaultWindow } = options;
422
+ const isSupported = useSupported(() => window && "matchMedia" in window && typeof window.matchMedia === "function");
423
+ let mediaQuery;
424
+ const matches = vueDemi.ref(false);
425
+ const handler = (event) => {
426
+ matches.value = event.matches;
427
+ };
428
+ const cleanup = () => {
429
+ if (!mediaQuery)
430
+ return;
431
+ if ("removeEventListener" in mediaQuery)
432
+ mediaQuery.removeEventListener("change", handler);
433
+ else
434
+ mediaQuery.removeListener(handler);
435
+ };
436
+ const stopWatch = vueDemi.watchEffect(() => {
437
+ if (!isSupported.value)
438
+ return;
439
+ cleanup();
440
+ mediaQuery = window.matchMedia(shared.toValue(query));
441
+ if ("addEventListener" in mediaQuery)
442
+ mediaQuery.addEventListener("change", handler);
443
+ else
444
+ mediaQuery.addListener(handler);
445
+ matches.value = mediaQuery.matches;
446
+ });
447
+ shared.tryOnScopeDispose(() => {
448
+ stopWatch();
449
+ cleanup();
450
+ mediaQuery = void 0;
451
+ });
452
+ return matches;
453
+ }
454
+
455
+ function usePreferredDark(options) {
456
+ return useMediaQuery("(prefers-color-scheme: dark)", options);
457
+ }
458
+
392
459
  function guessSerializerType(rawInit) {
393
460
  return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any";
394
461
  }
@@ -554,64 +621,6 @@ function useStorage(key, defaults, storage, options = {}) {
554
621
  return data;
555
622
  }
556
623
 
557
- function useMounted() {
558
- const isMounted = vueDemi.ref(false);
559
- const instance = vueDemi.getCurrentInstance();
560
- if (instance) {
561
- vueDemi.onMounted(() => {
562
- isMounted.value = true;
563
- }, vueDemi.isVue2 ? void 0 : instance);
564
- }
565
- return isMounted;
566
- }
567
-
568
- function useSupported(callback) {
569
- const isMounted = useMounted();
570
- return vueDemi.computed(() => {
571
- isMounted.value;
572
- return Boolean(callback());
573
- });
574
- }
575
-
576
- function useMediaQuery(query, options = {}) {
577
- const { window = defaultWindow } = options;
578
- const isSupported = useSupported(() => window && "matchMedia" in window && typeof window.matchMedia === "function");
579
- let mediaQuery;
580
- const matches = vueDemi.ref(false);
581
- const handler = (event) => {
582
- matches.value = event.matches;
583
- };
584
- const cleanup = () => {
585
- if (!mediaQuery)
586
- return;
587
- if ("removeEventListener" in mediaQuery)
588
- mediaQuery.removeEventListener("change", handler);
589
- else
590
- mediaQuery.removeListener(handler);
591
- };
592
- const stopWatch = vueDemi.watchEffect(() => {
593
- if (!isSupported.value)
594
- return;
595
- cleanup();
596
- mediaQuery = window.matchMedia(shared.toValue(query));
597
- if ("addEventListener" in mediaQuery)
598
- mediaQuery.addEventListener("change", handler);
599
- else
600
- mediaQuery.addListener(handler);
601
- matches.value = mediaQuery.matches;
602
- });
603
- shared.tryOnScopeDispose(() => {
604
- stopWatch();
605
- cleanup();
606
- mediaQuery = void 0;
607
- });
608
- return matches;
609
- }
610
-
611
- function usePreferredDark(options) {
612
- return useMediaQuery("(prefers-color-scheme: dark)", options);
613
- }
614
-
615
624
  const CSS_DISABLE_TRANS = "*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";
616
625
  function useColorMode(options = {}) {
617
626
  const {
@@ -816,7 +825,8 @@ const UseDraggable = /* @__PURE__ */ /* #__PURE__ */ vueDemi.defineComponent({
816
825
  "onMove",
817
826
  "onEnd",
818
827
  "disabled",
819
- "buttons"
828
+ "buttons",
829
+ "containerElement"
820
830
  ],
821
831
  setup(props, { slots }) {
822
832
  const target = vueDemi.ref();
@@ -824,6 +834,10 @@ const UseDraggable = /* @__PURE__ */ /* #__PURE__ */ vueDemi.defineComponent({
824
834
  var _a;
825
835
  return (_a = props.handle) != null ? _a : target.value;
826
836
  });
837
+ const containerElement = vueDemi.computed(() => {
838
+ var _a;
839
+ return (_a = props.containerElement) != null ? _a : void 0;
840
+ });
827
841
  const disabled = vueDemi.computed(() => !!props.disabled);
828
842
  const storageValue = props.storageKey && core.useStorage(
829
843
  props.storageKey,
@@ -844,7 +858,8 @@ const UseDraggable = /* @__PURE__ */ /* #__PURE__ */ vueDemi.defineComponent({
844
858
  handle,
845
859
  initialValue,
846
860
  onEnd,
847
- disabled
861
+ disabled,
862
+ containerElement
848
863
  }));
849
864
  return () => {
850
865
  if (slots.default)
@@ -1314,6 +1329,14 @@ const UseImage = /* @__PURE__ */ /* #__PURE__ */ vueDemi.defineComponent({
1314
1329
  }
1315
1330
  });
1316
1331
 
1332
+ function resolveElement(el) {
1333
+ if (typeof Window !== "undefined" && el instanceof Window)
1334
+ return el.document.documentElement;
1335
+ if (typeof Document !== "undefined" && el instanceof Document)
1336
+ return el.documentElement;
1337
+ return el;
1338
+ }
1339
+
1317
1340
  const ARRIVED_STATE_THRESHOLD_PIXELS = 1;
1318
1341
  function useScroll(element, options = {}) {
1319
1342
  const {
@@ -1478,14 +1501,6 @@ function useScroll(element, options = {}) {
1478
1501
  };
1479
1502
  }
1480
1503
 
1481
- function resolveElement(el) {
1482
- if (typeof Window !== "undefined" && el instanceof Window)
1483
- return el.document.documentElement;
1484
- if (typeof Document !== "undefined" && el instanceof Document)
1485
- return el.documentElement;
1486
- return el;
1487
- }
1488
-
1489
1504
  function useInfiniteScroll(element, onLoadMore, options = {}) {
1490
1505
  var _a;
1491
1506
  const {
@@ -1527,11 +1542,12 @@ function useInfiniteScroll(element, onLoadMore, options = {}) {
1527
1542
  }
1528
1543
  }
1529
1544
  }
1530
- vueDemi.watch(
1545
+ const stop = vueDemi.watch(
1531
1546
  () => [state.arrivedState[direction], isElementVisible.value],
1532
1547
  checkAndLoad,
1533
1548
  { immediate: true }
1534
1549
  );
1550
+ shared.tryOnUnmounted(stop);
1535
1551
  return {
1536
1552
  isLoading,
1537
1553
  reset() {