@maas/vue-equipment 1.0.0-beta.42 → 1.0.0-beta.44

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 (106) hide show
  1. package/dist/composables/useScrollLockPadding/index.d.ts +9 -0
  2. package/dist/composables/useScrollLockPadding/index.js +57 -0
  3. package/dist/composables/useScrollLockPadding/index.js.map +1 -0
  4. package/dist/nuxt/module.json +1 -1
  5. package/dist/nuxt/module.mjs +7 -0
  6. package/dist/plugins/MagicAccordion/src/components/MagicAccordionProvider.vue +2 -5
  7. package/dist/plugins/MagicAccordion/src/composables/private/useAccordionState.d.ts +2 -3
  8. package/dist/plugins/MagicAccordion/src/composables/private/useAccordionState.mjs +38 -11
  9. package/dist/plugins/MagicAccordion/src/types/index.d.ts +1 -0
  10. package/dist/plugins/MagicCommand/src/components/MagicCommandProvider.vue +2 -5
  11. package/dist/plugins/MagicCommand/src/components/MagicCommandRenderer.vue +1 -0
  12. package/dist/plugins/MagicCommand/src/components/MagicCommandView.vue +1 -1
  13. package/dist/plugins/MagicCommand/src/composables/private/useCommandState.d.ts +2 -3
  14. package/dist/plugins/MagicCommand/src/composables/private/useCommandState.mjs +36 -11
  15. package/dist/plugins/MagicCommand/src/types/index.d.ts +1 -0
  16. package/dist/plugins/MagicCookie/src/composables/private/useCookieState.d.ts +2 -3
  17. package/dist/plugins/MagicCookie/src/composables/private/useCookieState.mjs +35 -12
  18. package/dist/plugins/MagicCookie/src/composables/useMagicCookie.mjs +6 -1
  19. package/dist/plugins/MagicCookie/src/types/index.d.ts +1 -0
  20. package/dist/plugins/MagicDraggable/src/composables/private/useDraggableDrag.mjs +33 -25
  21. package/dist/plugins/MagicDraggable/src/composables/private/useDraggableScrollLock.d.ts +2 -4
  22. package/dist/plugins/MagicDraggable/src/composables/private/useDraggableScrollLock.mjs +11 -51
  23. package/dist/plugins/MagicDraggable/src/composables/private/useDraggableSnap.mjs +11 -1
  24. package/dist/plugins/MagicDraggable/src/composables/private/useDraggableState.d.ts +1 -1
  25. package/dist/plugins/MagicDraggable/src/composables/private/useDraggableState.mjs +41 -11
  26. package/dist/plugins/MagicDraggable/src/composables/useMagicDraggable.mjs +2 -1
  27. package/dist/plugins/MagicDraggable/src/types/index.d.ts +1 -0
  28. package/dist/plugins/MagicDrawer/src/components/MagicDrawer.d.vue.ts +2 -2
  29. package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue +15 -19
  30. package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue.d.ts +2 -2
  31. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerCallback.d.ts +0 -4
  32. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerCallback.mjs +8 -12
  33. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDOM.d.ts +2 -4
  34. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDOM.mjs +15 -58
  35. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.d.ts +2 -0
  36. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +184 -29
  37. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerState.d.ts +2 -3
  38. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerState.mjs +35 -10
  39. package/dist/plugins/MagicDrawer/src/composables/useMagicDrawer.mjs +2 -1
  40. package/dist/plugins/MagicDrawer/src/types/index.d.ts +1 -0
  41. package/dist/plugins/MagicEmitter/src/composables/useMagicEmitter.mjs +10 -5
  42. package/dist/plugins/MagicMarquee/src/components/MagicMarquee.vue +2 -5
  43. package/dist/plugins/MagicMarquee/src/composables/private/useMarqueeState.d.ts +2 -3
  44. package/dist/plugins/MagicMarquee/src/composables/private/useMarqueeState.mjs +36 -11
  45. package/dist/plugins/MagicMarquee/src/types/index.d.ts +1 -0
  46. package/dist/plugins/MagicMenu/src/components/MagicMenuContent.vue +4 -12
  47. package/dist/plugins/MagicMenu/src/components/MagicMenuProvider.vue +2 -6
  48. package/dist/plugins/MagicMenu/src/composables/private/useMenuCallback.d.ts +1 -4
  49. package/dist/plugins/MagicMenu/src/composables/private/useMenuCallback.mjs +7 -21
  50. package/dist/plugins/MagicMenu/src/composables/private/useMenuCursor.mjs +13 -1
  51. package/dist/plugins/MagicMenu/src/composables/private/useMenuDOM.d.ts +2 -4
  52. package/dist/plugins/MagicMenu/src/composables/private/useMenuDOM.mjs +13 -51
  53. package/dist/plugins/MagicMenu/src/composables/private/useMenuState.d.ts +2 -3
  54. package/dist/plugins/MagicMenu/src/composables/private/useMenuState.mjs +32 -12
  55. package/dist/plugins/MagicMenu/src/composables/private/useMenuTrigger.mjs +1 -1
  56. package/dist/plugins/MagicMenu/src/types/index.d.ts +1 -0
  57. package/dist/plugins/MagicModal/src/components/MagicModal.vue +4 -16
  58. package/dist/plugins/MagicModal/src/composables/private/useModalCallback.d.ts +0 -4
  59. package/dist/plugins/MagicModal/src/composables/private/useModalCallback.mjs +9 -19
  60. package/dist/plugins/MagicModal/src/composables/private/useModalDOM.d.ts +2 -4
  61. package/dist/plugins/MagicModal/src/composables/private/useModalDOM.mjs +15 -58
  62. package/dist/plugins/MagicModal/src/composables/private/useModalState.d.ts +6 -0
  63. package/dist/plugins/MagicModal/src/composables/private/useModalState.mjs +58 -0
  64. package/dist/plugins/MagicModal/src/composables/private/useModalStore.d.ts +1 -5
  65. package/dist/plugins/MagicModal/src/composables/private/useModalStore.mjs +1 -15
  66. package/dist/plugins/MagicModal/src/composables/useMagicModal.mjs +7 -6
  67. package/dist/plugins/MagicModal/src/types/index.d.ts +5 -0
  68. package/dist/plugins/MagicNoise/src/components/MagicNoise.vue +14 -2
  69. package/dist/plugins/MagicPie/src/components/MagicPie.vue +12 -6
  70. package/dist/plugins/MagicPie/src/composables/private/usePieState.d.ts +1 -1
  71. package/dist/plugins/MagicPie/src/composables/private/usePieState.mjs +33 -12
  72. package/dist/plugins/MagicPie/src/types/index.d.ts +1 -0
  73. package/dist/plugins/MagicPlayer/src/components/MagicPlayerAudio.vue +9 -6
  74. package/dist/plugins/MagicPlayer/src/components/MagicPlayerAudioControls.vue +4 -8
  75. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +8 -1
  76. package/dist/plugins/MagicPlayer/src/components/MagicPlayerProvider.vue +2 -11
  77. package/dist/plugins/MagicPlayer/src/components/MagicPlayerVideo.vue +10 -6
  78. package/dist/plugins/MagicPlayer/src/components/MagicPlayerVideoControls.vue +4 -8
  79. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerControlsApi.d.ts +0 -1
  80. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerControlsApi.mjs +20 -9
  81. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerEmitter.mjs +124 -75
  82. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerMediaApi.mjs +100 -32
  83. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.d.ts +0 -1
  84. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.mjs +33 -13
  85. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerState.d.ts +2 -3
  86. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerState.mjs +35 -10
  87. package/dist/plugins/MagicPlayer/src/composables/useMagicPlayer.d.ts +0 -2
  88. package/dist/plugins/MagicPlayer/src/types/index.d.ts +1 -0
  89. package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue +2 -2
  90. package/dist/plugins/MagicScroll/src/components/MagicScrollMotion.vue +13 -1
  91. package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue +9 -5
  92. package/dist/plugins/MagicScroll/src/composables/private/useCollisionDetection.mjs +2 -1
  93. package/dist/plugins/MagicToast/src/components/MagicToastProvider.vue +2 -11
  94. package/dist/plugins/MagicToast/src/components/MagicToastView.vue +1 -0
  95. package/dist/plugins/MagicToast/src/composables/private/useToastDrag.mjs +18 -15
  96. package/dist/plugins/MagicToast/src/composables/private/useToastScrollLock.d.ts +2 -4
  97. package/dist/plugins/MagicToast/src/composables/private/useToastScrollLock.mjs +11 -49
  98. package/dist/plugins/MagicToast/src/composables/private/useToastState.d.ts +2 -3
  99. package/dist/plugins/MagicToast/src/composables/private/useToastState.mjs +35 -12
  100. package/dist/plugins/MagicToast/src/types/index.d.ts +1 -0
  101. package/dist/utils/index.d.ts +8 -1
  102. package/dist/utils/index.js +56497 -0
  103. package/dist/utils/index.js.map +1 -1
  104. package/package.json +1 -1
  105. package/dist/plugins/MagicError/src/MagicError.d.ts +0 -0
  106. package/dist/plugins/MagicError/src/MagicError.mjs +0 -0
@@ -0,0 +1,9 @@
1
+ type UseScrollLockPaddingArgs = {
2
+ exclude: RegExp;
3
+ };
4
+ declare function useScrollLockPadding(args?: UseScrollLockPaddingArgs): {
5
+ add: () => void;
6
+ remove: () => void;
7
+ };
8
+
9
+ export { type UseScrollLockPaddingArgs, useScrollLockPadding };
@@ -0,0 +1,57 @@
1
+ // useScrollLockPadding/index.ts
2
+ import { ref } from "vue";
3
+ import {
4
+ matchClass,
5
+ scrollbarGutterSupport,
6
+ scrollbarWidth
7
+ } from "@maas/vue-equipment/utils";
8
+ function useScrollLockPadding(args) {
9
+ const exclude = args?.exclude || "";
10
+ const positionFixedElements = ref([]);
11
+ function add() {
12
+ if (typeof window === "undefined") {
13
+ return;
14
+ }
15
+ const excludeRegEx = new RegExp(exclude);
16
+ document.body.style.setProperty(
17
+ "--scrollbar-width",
18
+ `${scrollbarWidth()}px`
19
+ );
20
+ positionFixedElements.value = [
21
+ ...document.body.getElementsByTagName("*")
22
+ ].filter(
23
+ (x) => getComputedStyle(x, null).getPropertyValue("position") === "fixed" && getComputedStyle(x, null).getPropertyValue("right") === "0px" && !matchClass(x, excludeRegEx)
24
+ );
25
+ switch (scrollbarGutterSupport()) {
26
+ case true:
27
+ document.documentElement.style.scrollbarGutter = "stable";
28
+ positionFixedElements.value.forEach((elem) => {
29
+ elem.style.scrollbarGutter = "stable";
30
+ elem.style.overflow = "auto";
31
+ });
32
+ break;
33
+ case false:
34
+ document.body.style.paddingRight = "var(--scrollbar-width)";
35
+ positionFixedElements.value.forEach(
36
+ (elem) => elem.style.paddingRight = "var(--scrollbar-width)"
37
+ );
38
+ break;
39
+ }
40
+ }
41
+ function remove() {
42
+ document.documentElement.style.scrollbarGutter = "";
43
+ document.body.style.removeProperty("--scrollbar-width");
44
+ document.body.style.paddingRight = "";
45
+ positionFixedElements.value.forEach((elem) => {
46
+ elem.style.paddingRight = "";
47
+ elem.style.scrollbarGutter = "";
48
+ elem.style.overflow = "";
49
+ });
50
+ positionFixedElements.value = [];
51
+ }
52
+ return { add, remove };
53
+ }
54
+ export {
55
+ useScrollLockPadding
56
+ };
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/composables/useScrollLockPadding/index.ts"],"sourcesContent":["import { ref } from 'vue'\nimport {\n matchClass,\n scrollbarGutterSupport,\n scrollbarWidth,\n} from '@maas/vue-equipment/utils'\n\nexport type UseScrollLockPaddingArgs = {\n exclude: RegExp\n}\n\nexport function useScrollLockPadding(args?: UseScrollLockPaddingArgs) {\n const exclude = args?.exclude || ''\n const positionFixedElements = ref<HTMLElement[]>([])\n\n function add() {\n if (typeof window === 'undefined') {\n return\n }\n\n const excludeRegEx = new RegExp(exclude)\n\n document.body.style.setProperty(\n '--scrollbar-width',\n `${scrollbarWidth()}px`\n )\n\n positionFixedElements.value = [\n ...document.body.getElementsByTagName('*'),\n ].filter(\n (x) =>\n getComputedStyle(x, null).getPropertyValue('position') === 'fixed' &&\n getComputedStyle(x, null).getPropertyValue('right') === '0px' &&\n !matchClass(x, excludeRegEx)\n ) as HTMLElement[]\n\n switch (scrollbarGutterSupport()) {\n case true:\n document.documentElement.style.scrollbarGutter = 'stable'\n positionFixedElements.value.forEach((elem) => {\n elem.style.scrollbarGutter = 'stable'\n elem.style.overflow = 'auto'\n })\n break\n case false:\n document.body.style.paddingRight = 'var(--scrollbar-width)'\n positionFixedElements.value.forEach(\n (elem) => (elem.style.paddingRight = 'var(--scrollbar-width)')\n )\n break\n }\n }\n\n function remove() {\n document.documentElement.style.scrollbarGutter = ''\n document.body.style.removeProperty('--scrollbar-width')\n document.body.style.paddingRight = ''\n positionFixedElements.value.forEach((elem) => {\n elem.style.paddingRight = ''\n elem.style.scrollbarGutter = ''\n elem.style.overflow = ''\n })\n\n // Drop nodes for garbage collection\n positionFixedElements.value = []\n }\n\n return { add, remove }\n}\n"],"mappings":";AAAA,SAAS,WAAW;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMA,SAAS,qBAAqB,MAAiC;AACpE,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,wBAAwB,IAAmB,CAAC,CAAC;AAEnD,WAAS,MAAM;AACb,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AAEA,UAAM,eAAe,IAAI,OAAO,OAAO;AAEvC,aAAS,KAAK,MAAM;AAAA,MAClB;AAAA,MACA,GAAG,eAAe,CAAC;AAAA,IACrB;AAEA,0BAAsB,QAAQ;AAAA,MAC5B,GAAG,SAAS,KAAK,qBAAqB,GAAG;AAAA,IAC3C,EAAE;AAAA,MACA,CAAC,MACC,iBAAiB,GAAG,IAAI,EAAE,iBAAiB,UAAU,MAAM,WAC3D,iBAAiB,GAAG,IAAI,EAAE,iBAAiB,OAAO,MAAM,SACxD,CAAC,WAAW,GAAG,YAAY;AAAA,IAC/B;AAEA,YAAQ,uBAAuB,GAAG;AAAA,MAChC,KAAK;AACH,iBAAS,gBAAgB,MAAM,kBAAkB;AACjD,8BAAsB,MAAM,QAAQ,CAAC,SAAS;AAC5C,eAAK,MAAM,kBAAkB;AAC7B,eAAK,MAAM,WAAW;AAAA,QACxB,CAAC;AACD;AAAA,MACF,KAAK;AACH,iBAAS,KAAK,MAAM,eAAe;AACnC,8BAAsB,MAAM;AAAA,UAC1B,CAAC,SAAU,KAAK,MAAM,eAAe;AAAA,QACvC;AACA;AAAA,IACJ;AAAA,EACF;AAEA,WAAS,SAAS;AAChB,aAAS,gBAAgB,MAAM,kBAAkB;AACjD,aAAS,KAAK,MAAM,eAAe,mBAAmB;AACtD,aAAS,KAAK,MAAM,eAAe;AACnC,0BAAsB,MAAM,QAAQ,CAAC,SAAS;AAC5C,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM,kBAAkB;AAC7B,WAAK,MAAM,WAAW;AAAA,IACxB,CAAC;AAGD,0BAAsB,QAAQ,CAAC;AAAA,EACjC;AAEA,SAAO,EAAE,KAAK,OAAO;AACvB;","names":[]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment/nuxt",
3
3
  "configKey": "vueEquipment",
4
- "version": "1.0.0-beta.41",
4
+ "version": "1.0.0-beta.43",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "unknown"
@@ -127,6 +127,13 @@ const functions$1 = [
127
127
  docs: "https://maas.egineering/vue-equipment/composables/useMetaViewport/",
128
128
  description: "Set and reset the meta viewport tag programatically"
129
129
  },
130
+ {
131
+ name: "useScrollLockPadding",
132
+ "package": "composables",
133
+ lastUpdated: 1765919360000,
134
+ docs: "https://maas.egineering/vue-equipment/composables/useScrollLockPadding/",
135
+ description: "A small utility to prevent fixed elements from jumping when locking scroll"
136
+ },
130
137
  {
131
138
  name: "useScrollTo",
132
139
  "package": "composables",
@@ -9,7 +9,7 @@
9
9
  </template>
10
10
 
11
11
  <script setup>
12
- import { onBeforeUnmount, provide } from "vue";
12
+ import { provide } from "vue";
13
13
  import { VuePrimitive } from "@maas/vue-primitive";
14
14
  import { useAccordionState } from "../composables/private/useAccordionState";
15
15
  import { MagicAccordionInstanceId } from "../symbols";
@@ -18,10 +18,7 @@ const { id, asChild, options } = defineProps({
18
18
  asChild: { type: Boolean, required: false },
19
19
  options: { type: Object, required: false }
20
20
  });
21
- const { deleteState, initializeState } = useAccordionState(id);
21
+ const { initializeState } = useAccordionState(id);
22
22
  initializeState(options);
23
- onBeforeUnmount(() => {
24
- deleteState();
25
- });
26
23
  provide(MagicAccordionInstanceId, id);
27
24
  </script>
@@ -1,7 +1,6 @@
1
- import { type Ref, type MaybeRef } from 'vue';
1
+ import { type MaybeRef } from 'vue';
2
2
  import type { AccordionState, MagicAccordionOptions } from '../../types/index.js';
3
3
  export declare function useAccordionState(instanceId: MaybeRef<string>): {
4
4
  initializeState: (options?: MagicAccordionOptions) => AccordionState;
5
- deleteState: () => void;
6
- accordionStateStore: Ref<AccordionState[], AccordionState[]>;
5
+ accordionStateStore: import("vue").Ref<AccordionState[], AccordionState[]>;
7
6
  };
@@ -1,11 +1,18 @@
1
- import { ref, reactive, toValue } from "vue";
1
+ import { reactive, toValue, onScopeDispose } from "vue";
2
2
  import { defu } from "defu";
3
+ import { createStateStore } from "@maas/vue-equipment/utils";
3
4
  import { defaultOptions } from "../../utils/defaultOptions.mjs";
4
- const accordionStateStore = ref([]);
5
+ const getAccordionStateStore = createStateStore(
6
+ "MagicAccordion",
7
+ () => []
8
+ );
5
9
  export function useAccordionState(instanceId) {
10
+ const accordionStateStore = getAccordionStateStore();
11
+ let scopeCounted = false;
6
12
  function createState(id) {
7
13
  const state = {
8
14
  id,
15
+ refCount: 0,
9
16
  options: { ...defaultOptions },
10
17
  views: []
11
18
  };
@@ -16,12 +23,23 @@ export function useAccordionState(instanceId) {
16
23
  accordionStateStore.value = [...accordionStateStore.value, state];
17
24
  return state;
18
25
  }
26
+ function deleteState() {
27
+ const currentId = toValue(instanceId);
28
+ accordionStateStore.value = accordionStateStore.value.filter(
29
+ (x) => x.id !== currentId
30
+ );
31
+ }
19
32
  function initializeState(options) {
20
- let state = accordionStateStore.value.find((entry) => {
21
- return entry.id === toValue(instanceId);
22
- });
33
+ const currentId = toValue(instanceId);
34
+ let state = accordionStateStore.value.find(
35
+ (entry) => entry.id === currentId
36
+ );
23
37
  if (!state) {
24
- state = addState(toValue(instanceId));
38
+ state = addState(currentId);
39
+ }
40
+ if (!scopeCounted) {
41
+ state.refCount++;
42
+ scopeCounted = true;
25
43
  }
26
44
  if (options) {
27
45
  const mappedOptions = defu(options, defaultOptions);
@@ -29,14 +47,23 @@ export function useAccordionState(instanceId) {
29
47
  }
30
48
  return state;
31
49
  }
32
- function deleteState() {
33
- accordionStateStore.value = accordionStateStore.value.filter(
34
- (x) => x.id !== toValue(instanceId)
50
+ onScopeDispose(() => {
51
+ if (!scopeCounted) {
52
+ return;
53
+ }
54
+ const currentId = toValue(instanceId);
55
+ const state = accordionStateStore.value.find(
56
+ (entry) => entry.id === currentId
35
57
  );
36
- }
58
+ if (state) {
59
+ state.refCount--;
60
+ if (state.refCount <= 0) {
61
+ deleteState();
62
+ }
63
+ }
64
+ });
37
65
  return {
38
66
  initializeState,
39
- deleteState,
40
67
  accordionStateStore
41
68
  };
42
69
  }
@@ -14,6 +14,7 @@ export interface AccordionView {
14
14
  }
15
15
  export interface AccordionState {
16
16
  id: string;
17
+ refCount: number;
17
18
  views: AccordionView[];
18
19
  options: MagicAccordionOptions;
19
20
  }
@@ -9,7 +9,7 @@
9
9
  </template>
10
10
 
11
11
  <script setup>
12
- import { shallowRef, provide, watch, onBeforeUnmount } from "vue";
12
+ import { shallowRef, provide, watch } from "vue";
13
13
  import { useMagicKeys, usePointer } from "@vueuse/core";
14
14
  import { VuePrimitive } from "@maas/vue-primitive";
15
15
  import { useMagicError } from "@maas/vue-equipment/plugins/MagicError";
@@ -30,7 +30,7 @@ const customDefu = createDefu((obj, key, value) => {
30
30
  }
31
31
  });
32
32
  const mappedOptions = customDefu(options, defaultOptions);
33
- const { initializeState, deleteState } = useCommandState(id);
33
+ const { initializeState } = useCommandState(id);
34
34
  const state = initializeState(mappedOptions);
35
35
  const lastX = shallowRef(0);
36
36
  const lastY = shallowRef(0);
@@ -86,9 +86,6 @@ if (mappedOptions.keyListener?.close) {
86
86
  });
87
87
  }
88
88
  }
89
- onBeforeUnmount(() => {
90
- deleteState();
91
- });
92
89
  provide(MagicCommandInstanceId, id);
93
90
  provide(MagicCommandProviderOptions, mappedOptions);
94
91
  </script>
@@ -32,6 +32,7 @@ function enterCallback(payload) {
32
32
  }
33
33
  emitter.on("enter", enterCallback);
34
34
  onBeforeUnmount(() => {
35
+ state.renderer = null;
35
36
  emitter.off("enter", enterCallback);
36
37
  });
37
38
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div :data-id="mappedId" class="magic-menu-view">
2
+ <div :data-id="mappedId" class="magic-command-view">
3
3
  <slot :view-active="view.active" />
4
4
  </div>
5
5
  </template>
@@ -1,7 +1,6 @@
1
- import { type Ref, type MaybeRef } from 'vue';
1
+ import { type MaybeRef } from 'vue';
2
2
  import type { CommandState, MagicCommandOptions } from '../../types/index.js';
3
3
  export declare function useCommandState(instanceId: MaybeRef<string>): {
4
4
  initializeState: (options?: MagicCommandOptions) => CommandState;
5
- deleteState: () => void;
6
- commandStateStore: Ref<CommandState[], CommandState[]>;
5
+ commandStateStore: import("vue").Ref<CommandState[], CommandState[]>;
7
6
  };
@@ -1,12 +1,19 @@
1
- import { ref, reactive, toValue } from "vue";
1
+ import { reactive, toValue, onScopeDispose } from "vue";
2
2
  import { defu } from "defu";
3
+ import { createStateStore } from "@maas/vue-equipment/utils";
3
4
  import { defaultOptions } from "../../utils/defaultOptions.mjs";
4
- const commandStateStore = ref([]);
5
+ const getCommandStateStore = createStateStore(
6
+ "MagicCommand",
7
+ () => []
8
+ );
5
9
  export function useCommandState(instanceId) {
10
+ const commandStateStore = getCommandStateStore();
11
+ let scopeCounted = false;
6
12
  function createState(id) {
7
13
  const view = commandStateStore.value.find((state2) => state2.id === id)?.views.findLast((view2) => view2.active)?.id;
8
14
  const state = {
9
15
  id,
16
+ refCount: 0,
10
17
  options: { ...defaultOptions },
11
18
  views: [],
12
19
  renderer: null,
@@ -23,12 +30,21 @@ export function useCommandState(instanceId) {
23
30
  commandStateStore.value = [...commandStateStore.value, state];
24
31
  return state;
25
32
  }
33
+ function deleteState() {
34
+ const currentId = toValue(instanceId);
35
+ commandStateStore.value = commandStateStore.value.filter(
36
+ (x) => x.id !== currentId
37
+ );
38
+ }
26
39
  function initializeState(options) {
27
- let state = commandStateStore.value.find((entry) => {
28
- return entry.id === toValue(instanceId);
29
- });
40
+ const currentId = toValue(instanceId);
41
+ let state = commandStateStore.value.find((entry) => entry.id === currentId);
30
42
  if (!state) {
31
- state = addState(toValue(instanceId));
43
+ state = addState(currentId);
44
+ }
45
+ if (!scopeCounted) {
46
+ state.refCount++;
47
+ scopeCounted = true;
32
48
  }
33
49
  if (options) {
34
50
  const mappedOptions = defu(options, defaultOptions);
@@ -36,14 +52,23 @@ export function useCommandState(instanceId) {
36
52
  }
37
53
  return state;
38
54
  }
39
- function deleteState() {
40
- commandStateStore.value = commandStateStore.value.filter(
41
- (x) => x.id !== toValue(instanceId)
55
+ onScopeDispose(() => {
56
+ if (!scopeCounted) {
57
+ return;
58
+ }
59
+ const currentId = toValue(instanceId);
60
+ const state = commandStateStore.value.find(
61
+ (entry) => entry.id === currentId
42
62
  );
43
- }
63
+ if (state) {
64
+ state.refCount--;
65
+ if (state.refCount <= 0) {
66
+ deleteState();
67
+ }
68
+ }
69
+ });
44
70
  return {
45
71
  initializeState,
46
- deleteState,
47
72
  commandStateStore
48
73
  };
49
74
  }
@@ -44,6 +44,7 @@ export interface CommandView {
44
44
  }
45
45
  export interface CommandState {
46
46
  id: string;
47
+ refCount: number;
47
48
  active: boolean;
48
49
  views: CommandView[];
49
50
  renderer: HTMLElement | null;
@@ -1,7 +1,6 @@
1
- import { type Ref, type MaybeRef } from 'vue';
1
+ import { type MaybeRef } from 'vue';
2
2
  import type { CookieState, MagicCookieOptions } from '../../types/index.js';
3
3
  export declare function useCookieState(instanceId: MaybeRef<string>): {
4
4
  initializeState: (options?: MagicCookieOptions) => CookieState;
5
- deleteState: () => void;
6
- cookieStateStore: Ref<CookieState[], CookieState[]>;
5
+ cookieStateStore: import("vue").Ref<CookieState[], CookieState[]>;
7
6
  };
@@ -1,11 +1,18 @@
1
- import { ref, reactive, toValue } from "vue";
1
+ import { reactive, toValue, onScopeDispose } from "vue";
2
2
  import { defu } from "defu";
3
+ import { createStateStore } from "@maas/vue-equipment/utils";
3
4
  import { defaultOptions } from "../../utils/defaultOptions.mjs";
4
- const cookieStateStore = ref([]);
5
+ const getCookieStateStore = createStateStore(
6
+ "MagicCookie",
7
+ () => []
8
+ );
5
9
  export function useCookieState(instanceId) {
10
+ const cookieStateStore = getCookieStateStore();
11
+ let scopeCounted = false;
6
12
  function createState(id) {
7
13
  const state = {
8
14
  id,
15
+ refCount: 0,
9
16
  items: [],
10
17
  options: { ...defaultOptions },
11
18
  viewActive: false
@@ -17,12 +24,21 @@ export function useCookieState(instanceId) {
17
24
  cookieStateStore.value = [...cookieStateStore.value, state];
18
25
  return state;
19
26
  }
27
+ function deleteState() {
28
+ const currentId = toValue(instanceId);
29
+ cookieStateStore.value = cookieStateStore.value.filter(
30
+ (x) => x.id !== currentId
31
+ );
32
+ }
20
33
  function initializeState(options) {
21
- let state = cookieStateStore.value.find((entry) => {
22
- return entry.id === toValue(instanceId);
23
- });
34
+ const currentId = toValue(instanceId);
35
+ let state = cookieStateStore.value.find((entry) => entry.id === currentId);
24
36
  if (!state) {
25
- state = addState(toValue(instanceId));
37
+ state = addState(currentId);
38
+ }
39
+ if (!scopeCounted) {
40
+ state.refCount++;
41
+ scopeCounted = true;
26
42
  }
27
43
  if (options) {
28
44
  const mappedOptions = defu(options, defaultOptions);
@@ -30,14 +46,21 @@ export function useCookieState(instanceId) {
30
46
  }
31
47
  return state;
32
48
  }
33
- function deleteState() {
34
- cookieStateStore.value = cookieStateStore.value.filter(
35
- (x) => x.id !== toValue(instanceId)
36
- );
37
- }
49
+ onScopeDispose(() => {
50
+ if (!scopeCounted) {
51
+ return;
52
+ }
53
+ const currentId = toValue(instanceId);
54
+ const state = cookieStateStore.value.find((entry) => entry.id === currentId);
55
+ if (state) {
56
+ state.refCount--;
57
+ if (state.refCount <= 0) {
58
+ deleteState();
59
+ }
60
+ }
61
+ });
38
62
  return {
39
63
  initializeState,
40
- deleteState,
41
64
  cookieStateStore
42
65
  };
43
66
  }
@@ -1,4 +1,4 @@
1
- import { computed, nextTick } from "vue";
1
+ import { computed, nextTick, onScopeDispose } from "vue";
2
2
  import { useMagicEmitter } from "@maas/vue-equipment/plugins/MagicEmitter";
3
3
  import { useCookieState } from "./private/useCookieState.mjs";
4
4
  import { useCookieItem } from "./private/useCookieItem.mjs";
@@ -65,6 +65,11 @@ export function useMagicCookie(id) {
65
65
  function onReject(callback) {
66
66
  emitter.on("rejectAll", callback);
67
67
  }
68
+ onScopeDispose(() => {
69
+ emitter.off("acceptAll");
70
+ emitter.off("acceptSelected");
71
+ emitter.off("rejectAll");
72
+ });
68
73
  return {
69
74
  cookies,
70
75
  cookiesSet,
@@ -8,6 +8,7 @@ export interface CookieItem {
8
8
  }
9
9
  export interface CookieState {
10
10
  id: string;
11
+ refCount: number;
11
12
  options: MagicCookieOptions;
12
13
  items: CookieItem[];
13
14
  viewActive: boolean;
@@ -4,9 +4,10 @@ import {
4
4
  toValue,
5
5
  nextTick,
6
6
  watch,
7
- onBeforeUnmount,
7
+ onScopeDispose,
8
+ onMounted,
8
9
  toRefs,
9
- onMounted
10
+ markRaw
10
11
  } from "vue";
11
12
  import {
12
13
  useEventListener,
@@ -61,9 +62,12 @@ export function useDraggableDrag(args) {
61
62
  wrapperRect,
62
63
  activeSnapPoint
63
64
  } = toRefs(state);
64
- let cancelPointerup = void 0;
65
- let cancelPointermove = void 0;
66
- let cancelTouchend = void 0;
65
+ let cancelPointerup = null;
66
+ let cancelPointermove = null;
67
+ let cancelPointercancel = null;
68
+ let cancelTouchend = null;
69
+ let resizeObserverEl = null;
70
+ let resizeObserverWrapper = null;
67
71
  const momentumThresholdReached = shallowRef(false);
68
72
  const distanceThresholdReached = shallowRef(false);
69
73
  const style = computed(
@@ -95,15 +99,12 @@ export function useDraggableDrag(args) {
95
99
  snapPoints
96
100
  });
97
101
  const emitter = useMagicEmitter();
98
- const {
99
- lockScroll,
100
- unlockScroll,
101
- addScrollLockPadding,
102
- removeScrollLockPadding
103
- } = useDraggableScrollLock();
102
+ const { lockScroll, unlockScroll } = useDraggableScrollLock();
104
103
  function getSizes() {
105
- elRect.value = unrefElement(elRef)?.getBoundingClientRect();
106
- wrapperRect.value = unrefElement(wrapperRef)?.getBoundingClientRect();
104
+ const el = unrefElement(elRef);
105
+ const wrapper = unrefElement(wrapperRef);
106
+ elRect.value = el ? markRaw(el.getBoundingClientRect()) : void 0;
107
+ wrapperRect.value = wrapper ? markRaw(wrapper.getBoundingClientRect()) : void 0;
107
108
  }
108
109
  function setDragged({ x, y }) {
109
110
  draggedX.value = x - originX.value;
@@ -116,6 +117,7 @@ export function useDraggableDrag(args) {
116
117
  distanceThresholdReached.value = false;
117
118
  cancelTouchend?.();
118
119
  cancelPointerup?.();
120
+ cancelPointercancel?.();
119
121
  cancelPointermove?.();
120
122
  }
121
123
  function snapToCallback(payload) {
@@ -283,10 +285,9 @@ export function useDraggableDrag(args) {
283
285
  resetStateAndListeners();
284
286
  const scrollLockValue = toValue(scrollLock);
285
287
  if (scrollLockValue) {
286
- unlockScroll();
287
- if (typeof scrollLockValue === "object" && scrollLockValue.padding) {
288
- removeScrollLockPadding();
289
- }
288
+ unlockScroll(
289
+ typeof scrollLockValue === "object" && scrollLockValue.padding
290
+ );
290
291
  }
291
292
  guardedReleasePointerCapture({ event: e, element: elRef.value });
292
293
  }
@@ -324,10 +325,7 @@ export function useDraggableDrag(args) {
324
325
  }
325
326
  const scrollLockValue = toValue(scrollLock);
326
327
  if (scrollLockValue) {
327
- if (typeof scrollLockValue === "object" && scrollLockValue.padding) {
328
- addScrollLockPadding();
329
- }
330
- lockScroll();
328
+ lockScroll(typeof scrollLockValue === "object" && scrollLockValue.padding);
331
329
  }
332
330
  if (dragging.value) {
333
331
  return;
@@ -347,13 +345,18 @@ export function useDraggableDrag(args) {
347
345
  originX.value = e.screenX - draggedX.value;
348
346
  originY.value = e.screenY - draggedY.value;
349
347
  cancelPointerup = useEventListener(document, "pointerup", onPointerup);
348
+ cancelPointercancel = useEventListener(
349
+ document,
350
+ "pointercancel",
351
+ onPointerup
352
+ );
350
353
  cancelPointermove = useEventListener(
351
354
  document,
352
355
  "pointermove",
353
356
  onPointermove,
354
357
  { passive: false }
355
358
  );
356
- cancelTouchend = isIOS() ? useEventListener(document, "touchend", onPointerup) : void 0;
359
+ cancelTouchend = isIOS() ? useEventListener(document, "touchend", onPointerup) : null;
357
360
  dragStart.value = /* @__PURE__ */ new Date();
358
361
  onPointermove(e);
359
362
  }
@@ -383,11 +386,16 @@ export function useDraggableDrag(args) {
383
386
  }
384
387
  function destroy() {
385
388
  emitter.off("snapTo", snapToCallback);
389
+ cancelPointermove?.();
390
+ cancelPointerup?.();
391
+ cancelTouchend?.();
392
+ resizeObserverEl?.stop();
393
+ resizeObserverWrapper?.stop();
386
394
  }
387
395
  onMounted(() => {
388
396
  initialize();
389
397
  });
390
- useResizeObserver(wrapperRef, async () => {
398
+ resizeObserverWrapper = useResizeObserver(wrapperRef, async () => {
391
399
  useThrottleFn(async () => {
392
400
  getSizes();
393
401
  if (activeSnapPoint.value) {
@@ -397,7 +405,7 @@ export function useDraggableDrag(args) {
397
405
  }
398
406
  }, 100)();
399
407
  });
400
- useResizeObserver(elRef, async () => {
408
+ resizeObserverEl = useResizeObserver(elRef, async () => {
401
409
  useThrottleFn(async () => {
402
410
  getSizes();
403
411
  if (activeSnapPoint.value) {
@@ -413,7 +421,7 @@ export function useDraggableDrag(args) {
413
421
  onIdle();
414
422
  }
415
423
  });
416
- onBeforeUnmount(() => {
424
+ onScopeDispose(() => {
417
425
  destroy();
418
426
  });
419
427
  return {
@@ -1,6 +1,4 @@
1
1
  export declare function useDraggableScrollLock(): {
2
- lockScroll: () => void;
3
- unlockScroll: () => void;
4
- addScrollLockPadding: () => void;
5
- removeScrollLockPadding: () => void;
2
+ lockScroll: (padding?: boolean) => void;
3
+ unlockScroll: (padding?: boolean) => void;
6
4
  };