@maas/vue-equipment 0.29.2 → 0.29.4

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 (171) hide show
  1. package/dist/composables/index.js +5 -10
  2. package/dist/composables/index.js.map +1 -1
  3. package/dist/composables/index.mjs +5 -10
  4. package/dist/composables/index.mjs.map +1 -1
  5. package/dist/nuxt/module.json +5 -1
  6. package/dist/nuxt/module.mjs +16 -9
  7. package/dist/nuxt/types.d.mts +1 -16
  8. package/dist/nuxt/types.d.ts +1 -16
  9. package/dist/plugins/MagicCommand/index.d.ts +2 -4
  10. package/dist/plugins/MagicCommand/index.mjs +2 -2
  11. package/dist/plugins/MagicCommand/src/components/MagicCommandBody.vue +3 -3
  12. package/dist/plugins/MagicCommand/src/components/MagicCommandDrawer.vue +7 -4
  13. package/dist/plugins/MagicCommand/src/components/MagicCommandDrawer.vue.d.ts +2 -4
  14. package/dist/plugins/MagicCommand/src/components/MagicCommandItem.vue +4 -4
  15. package/dist/plugins/MagicCommand/src/components/MagicCommandItem.vue.d.ts +5 -5
  16. package/dist/plugins/MagicCommand/src/components/MagicCommandModal.vue +9 -6
  17. package/dist/plugins/MagicCommand/src/components/MagicCommandModal.vue.d.ts +2 -4
  18. package/dist/plugins/MagicCommand/src/components/MagicCommandProvider.vue +4 -4
  19. package/dist/plugins/MagicCommand/src/components/MagicCommandProvider.vue.d.ts +5 -5
  20. package/dist/plugins/MagicCommand/src/components/MagicCommandView.vue +4 -2
  21. package/dist/plugins/MagicCommand/src/components/MagicCommandView.vue.d.ts +3 -3
  22. package/dist/plugins/MagicCommand/src/composables/private/useCommandScroll.mjs +1 -1
  23. package/dist/plugins/MagicCommand/src/composables/private/useCommandStore.mjs +1 -1
  24. package/dist/plugins/MagicCommand/src/symbols/index.d.ts +3 -3
  25. package/dist/plugins/MagicCommand/src/symbols/index.mjs +2 -2
  26. package/dist/plugins/MagicCommand/src/types/index.d.ts +5 -5
  27. package/dist/plugins/MagicCommand/src/utils/defaultOptions.d.ts +2 -2
  28. package/dist/plugins/MagicCookie/index.d.ts +0 -2
  29. package/dist/plugins/MagicCookie/src/components/MagicCookie.vue +6 -7
  30. package/dist/plugins/MagicCookie/src/components/MagicCookie.vue.d.ts +6 -6
  31. package/dist/plugins/MagicCookie/src/composables/private/useCookieApi.d.ts +17 -0
  32. package/dist/plugins/MagicCookie/src/composables/private/{defineCookieApi.mjs → useCookieApi.mjs} +4 -4
  33. package/dist/plugins/MagicCookie/src/composables/useMagicCookie.d.ts +5 -5
  34. package/dist/plugins/MagicCookie/src/composables/useMagicCookie.mjs +4 -4
  35. package/dist/plugins/MagicCookie/src/types/index.d.ts +6 -10
  36. package/dist/plugins/MagicDraggable/index.d.ts +2 -2
  37. package/dist/plugins/MagicDraggable/src/components/MagicDraggable.vue +10 -9
  38. package/dist/plugins/MagicDraggable/src/components/MagicDraggable.vue.d.ts +6 -8
  39. package/dist/plugins/MagicDraggable/src/composables/private/useDraggableState.d.ts +1 -2
  40. package/dist/plugins/MagicDraggable/src/types/index.d.ts +1 -1
  41. package/dist/plugins/MagicDraggable/src/utils/defaultOptions.d.ts +4 -4
  42. package/dist/plugins/MagicDrawer/index.d.ts +2 -2
  43. package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue +9 -8
  44. package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue.d.ts +3 -5
  45. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerCallback.d.ts +2 -2
  46. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDOM.d.ts +3 -3
  47. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDOM.mjs +2 -2
  48. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +3 -1
  49. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerProgress.mjs +3 -1
  50. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerState.mjs +1 -3
  51. package/dist/plugins/MagicDrawer/src/types/index.d.ts +1 -1
  52. package/dist/plugins/MagicDrawer/src/utils/defaultOptions.d.ts +7 -7
  53. package/dist/plugins/MagicEmitter/src/composables/useMagicEmitter.d.ts +494 -170
  54. package/dist/plugins/MagicEmitter/src/types/index.d.ts +9 -9
  55. package/dist/plugins/MagicMarquee/nuxt.mjs +1 -5
  56. package/dist/plugins/MagicMarquee/src/components/MagicMarquee.vue +3 -3
  57. package/dist/plugins/MagicMarquee/src/components/MagicMarquee.vue.d.ts +3 -3
  58. package/dist/plugins/MagicMenu/index.d.ts +4 -0
  59. package/dist/plugins/MagicMenu/index.mjs +27 -0
  60. package/dist/plugins/MagicMenu/nuxt.d.ts +2 -0
  61. package/dist/plugins/MagicMenu/nuxt.mjs +14 -0
  62. package/dist/plugins/MagicMenu/src/components/MagicMenuContent.vue +144 -0
  63. package/dist/plugins/MagicMenu/src/components/MagicMenuContent.vue.d.ts +26 -0
  64. package/dist/plugins/MagicMenu/src/components/MagicMenuFloat.vue +169 -0
  65. package/dist/plugins/MagicMenu/src/components/MagicMenuFloat.vue.d.ts +24 -0
  66. package/dist/plugins/MagicMenu/src/components/MagicMenuItem.vue +137 -0
  67. package/dist/plugins/MagicMenu/src/components/MagicMenuItem.vue.d.ts +29 -0
  68. package/dist/plugins/MagicMenu/src/components/MagicMenuProvider.vue +106 -0
  69. package/dist/plugins/MagicMenu/src/components/MagicMenuProvider.vue.d.ts +24 -0
  70. package/dist/plugins/MagicMenu/src/components/MagicMenuTrigger.vue +122 -0
  71. package/dist/plugins/MagicMenu/src/components/MagicMenuTrigger.vue.d.ts +26 -0
  72. package/dist/plugins/MagicMenu/src/components/MagicMenuView.vue +53 -0
  73. package/dist/plugins/MagicMenu/src/components/MagicMenuView.vue.d.ts +21 -0
  74. package/dist/plugins/MagicMenu/src/composables/private/useMenuCallback.d.ts +18 -0
  75. package/dist/plugins/MagicMenu/src/composables/private/useMenuCallback.mjs +52 -0
  76. package/dist/plugins/MagicMenu/src/composables/private/useMenuDOM.d.ts +6 -0
  77. package/dist/plugins/MagicMenu/src/composables/private/useMenuDOM.mjs +42 -0
  78. package/dist/plugins/MagicMenu/src/composables/private/useMenuItem.d.ts +15 -0
  79. package/dist/plugins/MagicMenu/src/composables/private/useMenuItem.mjs +75 -0
  80. package/dist/plugins/MagicMenu/src/composables/private/useMenuKeyListener.d.ts +10 -0
  81. package/dist/plugins/MagicMenu/src/composables/private/useMenuKeyListener.mjs +178 -0
  82. package/dist/plugins/MagicMenu/src/composables/private/useMenuState.d.ts +7 -0
  83. package/dist/plugins/MagicMenu/src/composables/private/useMenuState.mjs +48 -0
  84. package/dist/plugins/MagicMenu/src/composables/private/useMenuTrigger.d.ts +18 -0
  85. package/dist/plugins/MagicMenu/src/composables/private/useMenuTrigger.mjs +262 -0
  86. package/dist/plugins/MagicMenu/src/composables/private/useMenuUtils.d.ts +3 -0
  87. package/dist/plugins/MagicMenu/src/composables/private/useMenuUtils.mjs +16 -0
  88. package/dist/plugins/MagicMenu/src/composables/private/useMenuView.d.ts +20 -0
  89. package/dist/plugins/MagicMenu/src/composables/private/useMenuView.mjs +116 -0
  90. package/dist/plugins/MagicMenu/src/symbols/index.d.ts +9 -0
  91. package/dist/plugins/MagicMenu/src/symbols/index.mjs +16 -0
  92. package/dist/plugins/MagicMenu/src/types/index.d.ts +72 -0
  93. package/dist/plugins/MagicMenu/src/types/index.mjs +0 -0
  94. package/dist/plugins/MagicMenu/src/utils/defaultOptions.d.ts +4 -0
  95. package/dist/plugins/MagicMenu/src/utils/defaultOptions.mjs +9 -0
  96. package/dist/plugins/MagicModal/index.d.ts +2 -2
  97. package/dist/plugins/MagicModal/src/components/MagicModal.vue +9 -6
  98. package/dist/plugins/MagicModal/src/components/MagicModal.vue.d.ts +5 -6
  99. package/dist/plugins/MagicModal/src/composables/private/useModalCallback.d.ts +2 -2
  100. package/dist/plugins/MagicModal/src/composables/private/useModalDOM.d.ts +3 -3
  101. package/dist/plugins/MagicModal/src/composables/private/useModalDOM.mjs +2 -2
  102. package/dist/plugins/MagicModal/src/types/index.d.ts +1 -1
  103. package/dist/plugins/MagicModal/src/utils/defaultOptions.d.ts +2 -2
  104. package/dist/plugins/MagicNoise/index.d.ts +1 -2
  105. package/dist/plugins/MagicNoise/index.mjs +1 -2
  106. package/dist/plugins/MagicNoise/nuxt.mjs +1 -5
  107. package/dist/plugins/MagicNoise/src/components/MagicNoise.vue +4 -4
  108. package/dist/plugins/MagicNoise/src/components/MagicNoise.vue.d.ts +5 -5
  109. package/dist/plugins/MagicNoise/src/composables/private/useNoiseApi.d.ts +2 -2
  110. package/dist/plugins/MagicNoise/src/types/index.d.ts +1 -1
  111. package/dist/plugins/MagicNoise/src/utils/defaultOptions.d.ts +2 -2
  112. package/dist/plugins/MagicPlayer/index.d.ts +0 -1
  113. package/dist/plugins/MagicPlayer/src/components/MagicAudioPlayer.vue +2 -2
  114. package/dist/plugins/MagicPlayer/src/components/MagicAudioPlayer.vue.d.ts +3 -3
  115. package/dist/plugins/MagicPlayer/src/components/MagicAudioPlayerControls.vue +2 -2
  116. package/dist/plugins/MagicPlayer/src/components/MagicAudioPlayerControls.vue.d.ts +2 -2
  117. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue +9 -30
  118. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue.d.ts +10 -14
  119. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue +79 -56
  120. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue.d.ts +20 -2
  121. package/dist/plugins/MagicPlayer/src/components/MagicPlayerDisplayTime.vue +2 -2
  122. package/dist/plugins/MagicPlayer/src/components/MagicPlayerDisplayTime.vue.d.ts +3 -3
  123. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +9 -7
  124. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue.d.ts +2 -2
  125. package/dist/plugins/MagicPlayer/src/components/MagicPlayerOverlay.vue +2 -2
  126. package/dist/plugins/MagicPlayer/src/components/MagicPlayerOverlay.vue.d.ts +2 -2
  127. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue +2 -3
  128. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue.d.ts +2 -2
  129. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerMediaApi.mjs +3 -0
  130. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.d.ts +2 -2
  131. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.mjs +23 -4
  132. package/dist/plugins/MagicPlayer/src/types/index.d.ts +1 -1
  133. package/dist/plugins/MagicScroll/index.d.ts +3 -3
  134. package/dist/plugins/MagicScroll/index.mjs +1 -2
  135. package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue +11 -7
  136. package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue.d.ts +2 -2
  137. package/dist/plugins/MagicScroll/src/components/MagicScrollMotion.vue +2 -2
  138. package/dist/plugins/MagicScroll/src/components/MagicScrollMotion.vue.d.ts +3 -3
  139. package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue +2 -2
  140. package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue.d.ts +3 -3
  141. package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue +2 -2
  142. package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue.d.ts +3 -3
  143. package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue +2 -2
  144. package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue.d.ts +3 -3
  145. package/dist/plugins/MagicScroll/src/composables/private/useCollisionDetect.d.ts +28 -0
  146. package/dist/plugins/MagicScroll/src/composables/private/useCollisionDetect.mjs +144 -0
  147. package/dist/plugins/MagicScroll/src/composables/private/useScrollApi.d.ts +0 -1
  148. package/dist/plugins/MagicScroll/src/types/index.d.ts +19 -25
  149. package/dist/plugins/MagicToast/index.d.ts +0 -2
  150. package/dist/plugins/MagicToast/src/components/MagicToast.vue +4 -4
  151. package/dist/plugins/MagicToast/src/components/MagicToast.vue.d.ts +2 -2
  152. package/dist/plugins/MagicToast/src/components/MagicToastComponent.vue +4 -4
  153. package/dist/plugins/MagicToast/src/components/MagicToastComponent.vue.d.ts +5 -5
  154. package/dist/plugins/MagicToast/src/composables/private/useToastApi.d.ts +1 -1
  155. package/dist/plugins/MagicToast/src/composables/private/useToastCallback.d.ts +3 -3
  156. package/dist/plugins/MagicToast/src/composables/private/useToastCallback.mjs +5 -7
  157. package/dist/plugins/MagicToast/src/composables/private/useToastInternalApi.d.ts +2 -2
  158. package/dist/plugins/MagicToast/src/composables/private/useToastStore.d.ts +4 -14
  159. package/dist/plugins/MagicToast/src/composables/useMagicToast.d.ts +6 -6
  160. package/dist/plugins/MagicToast/src/types/index.d.ts +20 -21
  161. package/dist/plugins/MagicToast/src/utils/defaultOptions.d.ts +2 -2
  162. package/dist/plugins/index.d.ts +1 -0
  163. package/dist/plugins/index.mjs +1 -0
  164. package/dist/utils/index.js +4 -8
  165. package/dist/utils/index.js.map +1 -1
  166. package/dist/utils/index.mjs +4 -8
  167. package/dist/utils/index.mjs.map +1 -1
  168. package/package.json +9 -4
  169. package/dist/plugins/MagicCookie/src/composables/private/defineCookieApi.d.ts +0 -12
  170. package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.d.ts +0 -6
  171. package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.mjs +0 -119
@@ -0,0 +1,178 @@
1
+ import { useMenuState } from "./useMenuState.mjs";
2
+ import { useMenuView } from "./useMenuView.mjs";
3
+ import { useMenuItem } from "./useMenuItem.mjs";
4
+ export function useMenuKeyListener(instanceId) {
5
+ const { initializeState } = useMenuState(instanceId);
6
+ const state = initializeState();
7
+ const {
8
+ selectView,
9
+ unselectView,
10
+ unselectNonTreeViews,
11
+ unselectAllViews,
12
+ getView,
13
+ getNextView,
14
+ getPreviousView,
15
+ getTopLevelView,
16
+ getNestedView,
17
+ getParentView
18
+ } = useMenuView(instanceId);
19
+ function keyStrokeGuard(e) {
20
+ switch (true) {
21
+ case !state.active:
22
+ throw new Error("Menu is not active");
23
+ default:
24
+ state.input.type = "keyboard";
25
+ e.preventDefault();
26
+ e.stopPropagation();
27
+ }
28
+ }
29
+ function getEnabledItems(view) {
30
+ return view.items.filter((item) => !item.disabled);
31
+ }
32
+ function selectFirstItem(view) {
33
+ const { selectItem } = useMenuItem({ instanceId, viewId: view.id });
34
+ selectItem(getEnabledItems(view)[0]?.id);
35
+ }
36
+ async function onArrowRight(e) {
37
+ try {
38
+ keyStrokeGuard(e);
39
+ } catch (_e) {
40
+ }
41
+ if (!state.input.view) {
42
+ return;
43
+ }
44
+ const viewId = state.input.view;
45
+ const inputView = getView(viewId);
46
+ if (inputView) {
47
+ const activeItem = inputView.items.find((item) => item.active);
48
+ const nestedView = activeItem ? getNestedView(activeItem.id) : void 0;
49
+ if (nestedView) {
50
+ selectView(nestedView.id);
51
+ await new Promise((resolve) => requestAnimationFrame(resolve));
52
+ selectFirstItem(nestedView);
53
+ return;
54
+ }
55
+ const topLevelView = getTopLevelView();
56
+ const nextView = topLevelView ? getNextView(topLevelView.id) : void 0;
57
+ if (nextView && !nextView.parent.item) {
58
+ selectView(nextView.id);
59
+ state.input.view = nextView.id;
60
+ return;
61
+ }
62
+ }
63
+ }
64
+ function onArrowLeft(e) {
65
+ try {
66
+ keyStrokeGuard(e);
67
+ } catch (_e) {
68
+ }
69
+ if (!state.input.view) {
70
+ return;
71
+ }
72
+ const viewId = state.input.view;
73
+ const inputView = getView(viewId);
74
+ if (inputView && inputView.parent.item) {
75
+ unselectView(viewId);
76
+ state.input.view = getParentView(viewId)?.id ?? "";
77
+ return;
78
+ }
79
+ const topLevelView = getTopLevelView();
80
+ const previousView = topLevelView ? getPreviousView(topLevelView.id) : void 0;
81
+ if (previousView) {
82
+ selectView(previousView.id);
83
+ state.input.view = previousView.id;
84
+ return;
85
+ }
86
+ }
87
+ function onArrowUp(e) {
88
+ try {
89
+ keyStrokeGuard(e);
90
+ } catch (_e) {
91
+ }
92
+ if (!state.input.view) {
93
+ return;
94
+ }
95
+ const viewId = state.input.view;
96
+ const inputView = getView(viewId);
97
+ if (!inputView)
98
+ return;
99
+ const enabledItems = getEnabledItems(inputView);
100
+ const prevIndex = enabledItems.findIndex((item) => item.active) - 1;
101
+ if (prevIndex >= 0) {
102
+ const { selectItem } = useMenuItem({ instanceId, viewId });
103
+ selectItem(enabledItems[prevIndex]?.id);
104
+ unselectNonTreeViews(viewId);
105
+ } else if (prevIndex !== -1) {
106
+ const { selectItem } = useMenuItem({ instanceId, viewId });
107
+ selectItem(enabledItems[enabledItems.length - 1]?.id);
108
+ unselectNonTreeViews(viewId);
109
+ }
110
+ }
111
+ function onArrowDown(e) {
112
+ try {
113
+ keyStrokeGuard(e);
114
+ } catch (_e) {
115
+ }
116
+ if (!state.input.view) {
117
+ return;
118
+ }
119
+ const viewId = state.input.view;
120
+ const inputView = getView(viewId);
121
+ if (!inputView)
122
+ return;
123
+ const enabledItems = getEnabledItems(inputView);
124
+ const nextIndex = enabledItems.findIndex((item) => item.active) + 1;
125
+ if (nextIndex >= 0) {
126
+ const { selectItem } = useMenuItem({ instanceId, viewId });
127
+ selectItem(enabledItems[nextIndex]?.id);
128
+ unselectNonTreeViews(viewId);
129
+ }
130
+ }
131
+ function onEscape(e) {
132
+ try {
133
+ keyStrokeGuard(e);
134
+ } catch (_e) {
135
+ }
136
+ state.active = false;
137
+ state.input.view = "";
138
+ unselectAllViews();
139
+ }
140
+ async function onEnter(e) {
141
+ try {
142
+ keyStrokeGuard(e);
143
+ } catch (_e) {
144
+ }
145
+ if (!state.input.view) {
146
+ return;
147
+ }
148
+ const viewId = state.input.view;
149
+ const inputView = getView(viewId);
150
+ if (inputView) {
151
+ const activeItem = inputView.items.find((item) => item.active);
152
+ const nestedView = activeItem ? getNestedView(activeItem.id) : void 0;
153
+ if (nestedView) {
154
+ selectView(nestedView.id);
155
+ await new Promise((resolve) => requestAnimationFrame(resolve));
156
+ selectFirstItem(nestedView);
157
+ return;
158
+ }
159
+ }
160
+ }
161
+ function onTab(e) {
162
+ if (state.active) {
163
+ try {
164
+ keyStrokeGuard(e);
165
+ } catch (_e) {
166
+ }
167
+ }
168
+ }
169
+ return {
170
+ onArrowRight,
171
+ onArrowLeft,
172
+ onArrowUp,
173
+ onArrowDown,
174
+ onEscape,
175
+ onEnter,
176
+ onTab
177
+ };
178
+ }
@@ -0,0 +1,7 @@
1
+ import { type Ref, type MaybeRef } from 'vue';
2
+ import type { MenuState, MagicMenuOptions } from '../../types/index.js';
3
+ export declare function useMenuState(instanceId: MaybeRef<string>): {
4
+ initializeState: (options?: MagicMenuOptions) => MenuState;
5
+ deleteState: () => void;
6
+ menuStateStore: Ref<MenuState[]>;
7
+ };
@@ -0,0 +1,48 @@
1
+ import { ref, reactive, toValue } from "vue";
2
+ import { defu } from "defu";
3
+ import { defaultOptions } from "../../utils/defaultOptions.mjs";
4
+ const menuStateStore = ref([]);
5
+ export function useMenuState(instanceId) {
6
+ function createState(id) {
7
+ const state = {
8
+ id,
9
+ options: defaultOptions,
10
+ views: [],
11
+ active: false,
12
+ input: {
13
+ type: "pointer",
14
+ disabled: [],
15
+ view: void 0
16
+ }
17
+ };
18
+ return reactive(state);
19
+ }
20
+ function addState(id) {
21
+ const instance = createState(id);
22
+ menuStateStore.value = [...menuStateStore.value, instance];
23
+ return instance;
24
+ }
25
+ function initializeState(options) {
26
+ let instance = menuStateStore.value.find((instance2) => {
27
+ return instance2.id === toValue(instanceId);
28
+ });
29
+ if (!instance) {
30
+ instance = addState(toValue(instanceId));
31
+ }
32
+ if (options) {
33
+ const mappedOptions = defu(options, defaultOptions);
34
+ instance.options = mappedOptions;
35
+ }
36
+ return instance;
37
+ }
38
+ function deleteState() {
39
+ menuStateStore.value = menuStateStore.value.filter(
40
+ (x) => x.id !== toValue(instanceId)
41
+ );
42
+ }
43
+ return {
44
+ initializeState,
45
+ deleteState,
46
+ menuStateStore
47
+ };
48
+ }
@@ -0,0 +1,18 @@
1
+ import { type ComputedRef, type MaybeRef, type Ref } from 'vue';
2
+ import type { MenuTrigger } from '../../types/index.js';
3
+ type UseMenuTriggerArgs = {
4
+ instanceId: MaybeRef<string>;
5
+ viewId: string;
6
+ itemId?: string;
7
+ mappedDisabled: ComputedRef<boolean>;
8
+ mappedTrigger: ComputedRef<MenuTrigger[]>;
9
+ elRef: Ref<HTMLElement | undefined>;
10
+ };
11
+ export declare function useMenuTrigger(args: UseMenuTriggerArgs): {
12
+ onMouseenter: () => void;
13
+ onClick: (e: MouseEvent) => void;
14
+ onMouseleave: (e: MouseEvent) => void;
15
+ initialize: () => void;
16
+ destroy: () => void;
17
+ };
18
+ export {};
@@ -0,0 +1,262 @@
1
+ import {
2
+ ref,
3
+ computed,
4
+ watch,
5
+ toValue
6
+ } from "vue";
7
+ import {
8
+ useEventListener,
9
+ useElementBounding,
10
+ useMagicKeys,
11
+ useFocus,
12
+ onKeyStroke
13
+ } from "@vueuse/core";
14
+ import { useMenuView } from "./useMenuView.mjs";
15
+ import { useMenuState } from "./useMenuState.mjs";
16
+ export function useMenuTrigger(args) {
17
+ const { instanceId, viewId, itemId, mappedTrigger, mappedDisabled, elRef } = args;
18
+ let cancelPointermove = void 0;
19
+ const mouseleaveCoordinates = ref(void 0);
20
+ const { getView, selectView, unselectView } = useMenuView(instanceId);
21
+ const view = getView(viewId);
22
+ const { initializeState } = useMenuState(instanceId);
23
+ const state = initializeState();
24
+ const { focused } = useFocus(elRef);
25
+ const isInsideTriangle = ref(false);
26
+ const isInsideTrigger = ref(false);
27
+ const isInsideContent = ref(false);
28
+ const isOutside = computed(() => {
29
+ return !isInsideTrigger.value && !isInsideContent.value && !isInsideTriangle.value;
30
+ });
31
+ const { shift, control } = useMagicKeys();
32
+ function resetState() {
33
+ mouseleaveCoordinates.value = void 0;
34
+ isInsideTriangle.value = false;
35
+ }
36
+ function disableCursor() {
37
+ state.input.disabled = [...state.input.disabled, "pointer"];
38
+ }
39
+ function enableCursor() {
40
+ state.input.disabled = state.input.disabled.filter((x) => x !== "pointer");
41
+ }
42
+ function extendTriangle(vertices, pixelAmount) {
43
+ const centroid = {
44
+ x: (vertices[0].x + vertices[1].x + vertices[2].x) / 3,
45
+ y: (vertices[0].y + vertices[1].y + vertices[2].y) / 3
46
+ };
47
+ function extendPoint(vertex) {
48
+ const dir = {
49
+ x: vertex.x - centroid.x,
50
+ y: vertex.y - centroid.y
51
+ };
52
+ const distance = Math.sqrt(dir.x * dir.x + dir.y * dir.y);
53
+ const unitDir = {
54
+ x: dir.x / distance,
55
+ y: dir.y / distance
56
+ };
57
+ const scaledDir = {
58
+ x: unitDir.x * pixelAmount,
59
+ y: unitDir.y * pixelAmount
60
+ };
61
+ return {
62
+ x: vertex.x + scaledDir.x,
63
+ y: vertex.y + scaledDir.y
64
+ };
65
+ }
66
+ return [
67
+ extendPoint(vertices[0]),
68
+ extendPoint(vertices[1]),
69
+ extendPoint(vertices[2])
70
+ ];
71
+ }
72
+ function isPointInTriangle(args2) {
73
+ const { p, a, b, c } = args2;
74
+ const v0 = { x: c.x - a.x, y: c.y - a.y };
75
+ const v1 = { x: b.x - a.x, y: b.y - a.y };
76
+ const v2 = { x: p.x - a.x, y: p.y - a.y };
77
+ const dot00 = v0.x * v0.x + v0.y * v0.y;
78
+ const dot01 = v0.x * v1.x + v0.y * v1.y;
79
+ const dot02 = v0.x * v2.x + v0.y * v2.y;
80
+ const dot11 = v1.x * v1.x + v1.y * v1.y;
81
+ const dot12 = v1.x * v2.x + v1.y * v2.y;
82
+ const invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
83
+ const u = (dot11 * dot02 - dot01 * dot12) * invDenom;
84
+ const v = (dot00 * dot12 - dot01 * dot02) * invDenom;
85
+ return u >= 0 && v >= 0 && u + v <= 1;
86
+ }
87
+ function isPointInRectangle(args2) {
88
+ const { p, top, left, bottom, right } = args2;
89
+ return p.x >= left && p.x <= right && p.y >= top && p.y <= bottom;
90
+ }
91
+ async function onPointermove(e) {
92
+ if (!mouseleaveCoordinates.value || !view?.children.content) {
93
+ return;
94
+ }
95
+ const mouseCoordinates = { x: e.clientX, y: e.clientY };
96
+ const { top, left, bottom, right } = useElementBounding(
97
+ view.children.content
98
+ );
99
+ const {
100
+ top: topTrigger,
101
+ left: leftTrigger,
102
+ bottom: bottomTrigger,
103
+ right: rightTrigger
104
+ } = useElementBounding(elRef);
105
+ const rightDistance = Math.abs(right.value - mouseleaveCoordinates.value.x);
106
+ const leftDistance = Math.abs(left.value - mouseleaveCoordinates.value.x);
107
+ const mappedX = rightDistance < leftDistance ? right : left;
108
+ const [a, b, c] = extendTriangle(
109
+ [
110
+ mouseleaveCoordinates.value,
111
+ { x: mappedX.value, y: top.value },
112
+ { x: mappedX.value, y: bottom.value }
113
+ ],
114
+ 16
115
+ );
116
+ isInsideTriangle.value = isPointInTriangle({
117
+ p: mouseCoordinates,
118
+ a,
119
+ b,
120
+ c
121
+ });
122
+ isInsideContent.value = isPointInRectangle({
123
+ p: mouseCoordinates,
124
+ top: top.value,
125
+ left: left.value,
126
+ bottom: bottom.value,
127
+ right: right.value
128
+ });
129
+ isInsideTrigger.value = isPointInRectangle({
130
+ p: mouseCoordinates,
131
+ top: topTrigger.value,
132
+ left: leftTrigger.value,
133
+ bottom: bottomTrigger.value,
134
+ right: rightTrigger.value
135
+ });
136
+ }
137
+ function onRightClick(e) {
138
+ switch (e.button) {
139
+ case 2:
140
+ selectView(viewId);
141
+ state.active = true;
142
+ if (view) {
143
+ view.click = { x: e.clientX, y: e.clientY };
144
+ }
145
+ if (!itemId) {
146
+ state.input.view = viewId;
147
+ }
148
+ break;
149
+ default:
150
+ state.active = false;
151
+ unselectView(viewId);
152
+ }
153
+ }
154
+ function onEnter(e) {
155
+ if (focused.value && !mappedDisabled.value && !view?.active) {
156
+ e.preventDefault();
157
+ e.stopPropagation();
158
+ state.active = true;
159
+ state.input.type = "keyboard";
160
+ state.input.view = viewId;
161
+ selectView(viewId);
162
+ }
163
+ }
164
+ function onMouseenter() {
165
+ cancelPointermove?.();
166
+ resetState();
167
+ if (mappedTrigger.value.includes("mouseenter") && view && viewId && state.active && !mappedDisabled.value) {
168
+ selectView(viewId);
169
+ if (!itemId) {
170
+ state.input.view = viewId;
171
+ }
172
+ if (itemId) {
173
+ disableCursor();
174
+ }
175
+ }
176
+ }
177
+ function onClick(e) {
178
+ if (mappedTrigger.value.includes("click") && !mappedDisabled.value && e.button === 0 && viewId) {
179
+ switch (true) {
180
+ case !state.active:
181
+ state.active = true;
182
+ selectView(viewId);
183
+ if (!itemId) {
184
+ state.input.view = viewId;
185
+ }
186
+ break;
187
+ case (state.active && !itemId):
188
+ state.active = false;
189
+ unselectView(viewId);
190
+ break;
191
+ }
192
+ }
193
+ if (mappedTrigger.value.includes("right-click") && viewId) {
194
+ e.preventDefault();
195
+ if (control.value || shift.value) {
196
+ onRightClick(
197
+ new MouseEvent(e.type, {
198
+ ...e,
199
+ button: 2,
200
+ clientX: e.clientX,
201
+ clientY: e.clientY
202
+ })
203
+ );
204
+ } else {
205
+ onRightClick(e);
206
+ }
207
+ }
208
+ }
209
+ function onMouseleave(e) {
210
+ if (mappedTrigger.value.includes("mouseleave") && viewId) {
211
+ mouseleaveCoordinates.value = { x: e.clientX, y: e.clientY };
212
+ cancelPointermove = useEventListener("pointermove", onPointermove);
213
+ }
214
+ }
215
+ function initialize() {
216
+ watch(
217
+ () => view?.active,
218
+ async (value) => {
219
+ if (value) {
220
+ await new Promise((resolve) => requestAnimationFrame(resolve));
221
+ toValue(elRef)?.blur();
222
+ }
223
+ }
224
+ );
225
+ watch(isInsideTriangle, async (value, oldValue) => {
226
+ if (value && !oldValue) {
227
+ disableCursor();
228
+ } else if (!value && oldValue) {
229
+ enableCursor();
230
+ }
231
+ });
232
+ watch(isInsideContent, (value, oldValue) => {
233
+ if (value && !oldValue) {
234
+ cancelPointermove?.();
235
+ resetState();
236
+ enableCursor();
237
+ }
238
+ });
239
+ watch(isOutside, (value, oldValue) => {
240
+ if (!cancelPointermove) {
241
+ return;
242
+ }
243
+ if (value && !oldValue) {
244
+ unselectView(viewId);
245
+ cancelPointermove();
246
+ enableCursor();
247
+ resetState();
248
+ }
249
+ });
250
+ onKeyStroke("Enter", onEnter);
251
+ }
252
+ function destroy() {
253
+ cancelPointermove?.();
254
+ }
255
+ return {
256
+ onMouseenter,
257
+ onClick,
258
+ onMouseleave,
259
+ initialize,
260
+ destroy
261
+ };
262
+ }
@@ -0,0 +1,3 @@
1
+ export declare function useMenuUtils(): {
2
+ arraysAreEqual: (a: string[], b: string[]) => boolean;
3
+ };
@@ -0,0 +1,16 @@
1
+ export function useMenuUtils() {
2
+ function arraysAreEqual(a, b) {
3
+ if (a.length !== b.length) {
4
+ return false;
5
+ }
6
+ for (let i = 0; i < a.length; i++) {
7
+ if (a[i] !== b[i]) {
8
+ return false;
9
+ }
10
+ }
11
+ return true;
12
+ }
13
+ return {
14
+ arraysAreEqual
15
+ };
16
+ }
@@ -0,0 +1,20 @@
1
+ import { type MaybeRef } from 'vue';
2
+ import type { MenuView } from '../../types/index.js';
3
+ type FindViewArgs = Pick<MenuView, 'id' | 'parent'>;
4
+ export declare function useMenuView(instanceId: MaybeRef<string>): {
5
+ currentView: import("vue").ComputedRef<MenuView>;
6
+ initializeView: (args: FindViewArgs) => MenuView;
7
+ deleteView: (id: string) => void;
8
+ getView: (id: string) => MenuView | undefined;
9
+ getRelativeViewIndex: (id: string) => number;
10
+ getNextView: (id: string) => MenuView;
11
+ getPreviousView: (id: string) => MenuView;
12
+ getTopLevelView: () => MenuView | undefined;
13
+ getNestedView: (itemId: string) => MenuView | undefined;
14
+ getParentView: (id: string) => MenuView | undefined;
15
+ selectView: (id: string) => void;
16
+ unselectView: (id: string) => void;
17
+ unselectNonTreeViews: (id: string) => void;
18
+ unselectAllViews: () => void;
19
+ };
20
+ export {};
@@ -0,0 +1,116 @@
1
+ import { reactive, computed, toValue } from "vue";
2
+ import { useMenuState } from "./useMenuState.mjs";
3
+ export function useMenuView(instanceId) {
4
+ const { initializeState } = useMenuState(instanceId);
5
+ const state = initializeState();
6
+ const currentView = computed(
7
+ () => state.views.filter((view) => view.active).reduce(
8
+ (a, b) => a.parent.views.length >= b.parent.views.length ? a : b
9
+ )
10
+ );
11
+ function createView(args) {
12
+ const { id, parent } = args;
13
+ if (parent.views.length === 0) {
14
+ parent.views.push(toValue(instanceId));
15
+ }
16
+ const view = {
17
+ id,
18
+ parent,
19
+ children: {
20
+ trigger: void 0,
21
+ content: void 0
22
+ },
23
+ active: false,
24
+ items: []
25
+ };
26
+ return reactive(view);
27
+ }
28
+ function addView(args) {
29
+ const view = createView(args);
30
+ state.views = [...state.views, view];
31
+ return view;
32
+ }
33
+ function initializeView(args) {
34
+ const { id } = args;
35
+ let instance = getView(id);
36
+ if (!instance)
37
+ instance = addView(args);
38
+ return instance;
39
+ }
40
+ function deleteView(id) {
41
+ state.views = state.views?.filter((view) => view.id !== id);
42
+ }
43
+ function getView(id) {
44
+ return state.views?.find((view) => {
45
+ return view.id === id;
46
+ });
47
+ }
48
+ function getRelativeViewIndex(id) {
49
+ const view = getView(id);
50
+ const nestingLevel = view?.parent.views.length;
51
+ return state.views?.filter((view2) => view2.parent.views.length === nestingLevel).findIndex((view2) => view2.id === id);
52
+ }
53
+ function getNextView(id) {
54
+ const index = state.views?.findIndex((view) => view.id === id);
55
+ return state.views?.[index + 1];
56
+ }
57
+ function getPreviousView(id) {
58
+ const index = state.views?.findIndex((view) => view.id === id);
59
+ return state.views?.[index - 1];
60
+ }
61
+ function getTopLevelView() {
62
+ return state.views?.find((view) => view.active && !view.parent.item);
63
+ }
64
+ function getNestedView(itemId) {
65
+ return state.views?.find((view) => view.parent.item === itemId);
66
+ }
67
+ function getParentView(id) {
68
+ const view = getView(id);
69
+ const parentId = view?.parent.views[view.parent.views.length - 1];
70
+ return getView(parentId ?? "");
71
+ }
72
+ function getNonTreeViews(id) {
73
+ const currentView2 = getView(id);
74
+ return state.views?.filter(
75
+ (view) => !currentView2?.parent.views.includes(view.id) && view.id !== id
76
+ );
77
+ }
78
+ function selectView(id) {
79
+ const instance = getView(id);
80
+ if (instance) {
81
+ instance.active = true;
82
+ unselectNonTreeViews(id);
83
+ }
84
+ }
85
+ function unselectView(id) {
86
+ const instance = getView(id);
87
+ if (instance) {
88
+ instance.active = false;
89
+ }
90
+ }
91
+ function unselectNonTreeViews(id) {
92
+ const nonTreeViews = getNonTreeViews(id);
93
+ nonTreeViews.forEach((view) => view.active = false);
94
+ }
95
+ function unselectAllViews() {
96
+ state.views?.forEach((view) => {
97
+ view.active = false;
98
+ });
99
+ }
100
+ return {
101
+ currentView,
102
+ initializeView,
103
+ deleteView,
104
+ getView,
105
+ getRelativeViewIndex,
106
+ getNextView,
107
+ getPreviousView,
108
+ getTopLevelView,
109
+ getNestedView,
110
+ getParentView,
111
+ selectView,
112
+ unselectView,
113
+ unselectNonTreeViews,
114
+ unselectAllViews
115
+ };
116
+ }
@@ -0,0 +1,9 @@
1
+ import type { InjectionKey, MaybeRef } from 'vue';
2
+ declare const MagicMenuInstanceId: InjectionKey<MaybeRef<string>>;
3
+ declare const MagicMenuParentTree: InjectionKey<string[]>;
4
+ declare const MagicMenuViewId: InjectionKey<string>;
5
+ declare const MagicMenuViewActive: InjectionKey<boolean>;
6
+ declare const MagicMenuContentId: InjectionKey<string>;
7
+ declare const MagicMenuItemId: InjectionKey<string>;
8
+ declare const MagicMenuItemActive: InjectionKey<boolean>;
9
+ export { MagicMenuInstanceId, MagicMenuParentTree, MagicMenuViewId, MagicMenuViewActive, MagicMenuContentId, MagicMenuItemId, MagicMenuItemActive, };
@@ -0,0 +1,16 @@
1
+ const MagicMenuInstanceId = Symbol();
2
+ const MagicMenuParentTree = Symbol();
3
+ const MagicMenuViewId = Symbol();
4
+ const MagicMenuViewActive = Symbol();
5
+ const MagicMenuContentId = Symbol();
6
+ const MagicMenuItemId = Symbol();
7
+ const MagicMenuItemActive = Symbol();
8
+ export {
9
+ MagicMenuInstanceId,
10
+ MagicMenuParentTree,
11
+ MagicMenuViewId,
12
+ MagicMenuViewActive,
13
+ MagicMenuContentId,
14
+ MagicMenuItemId,
15
+ MagicMenuItemActive
16
+ };