@maas/vue-equipment 0.30.6 → 0.31.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/dist/nuxt/module.json +1 -1
- package/dist/plugins/MagicMenu/src/components/MagicMenuContent.vue +15 -4
- package/dist/plugins/MagicMenu/src/components/MagicMenuFloat.vue +8 -0
- package/dist/plugins/MagicMenu/src/composables/private/useMenuCallback.d.ts +3 -1
- package/dist/plugins/MagicMenu/src/composables/private/useMenuCallback.mjs +23 -23
- package/dist/plugins/MagicMenu/src/composables/private/useMenuTrigger.mjs +9 -13
- package/dist/plugins/MagicMenu/src/types/index.d.ts +13 -1
- package/dist/plugins/MagicMenu/src/utils/defaultOptions.d.ts +1 -1
- package/dist/plugins/MagicMenu/src/utils/modeDelayDefaults.d.ts +15 -0
- package/dist/plugins/MagicMenu/src/utils/modeDelayDefaults.mjs +18 -0
- package/dist/plugins/MagicMenu/src/utils/modeFloatingStrategyDefaults.d.ts +6 -0
- package/dist/plugins/MagicMenu/src/utils/modeFloatingStrategyDefaults.mjs +7 -0
- package/dist/plugins/MagicMenu/src/utils/modeScrollLockDefaults.d.ts +12 -0
- package/dist/plugins/MagicMenu/src/utils/modeScrollLockDefaults.mjs +13 -0
- package/package.json +1 -1
- /package/dist/plugins/MagicMenu/src/utils/{modeTransitions.d.ts → modeTransitionDefaults.d.ts} +0 -0
- /package/dist/plugins/MagicMenu/src/utils/{modeTransitions.mjs → modeTransitionDefaults.mjs} +0 -0
package/dist/nuxt/module.json
CHANGED
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
</transition>
|
|
38
38
|
<span
|
|
39
39
|
v-for="point in coords"
|
|
40
|
+
v-if="state.options.debug"
|
|
40
41
|
:style="{
|
|
41
42
|
background: 'red',
|
|
42
43
|
position: 'fixed',
|
|
@@ -69,6 +70,8 @@ import { useMenuState } from '../composables/private/useMenuState'
|
|
|
69
70
|
import { useMenuCallback } from '../composables/private/useMenuCallback'
|
|
70
71
|
import { useMenuDOM } from '../composables/private/useMenuDOM'
|
|
71
72
|
import { useMenuCursor } from '../composables/private/useMenuCursor'
|
|
73
|
+
import { ModeTransitions } from '../utils/modeTransitionDefaults'
|
|
74
|
+
import { ModeDelayMouseleave } from '../utils/modeDelayDefaults'
|
|
72
75
|
import {
|
|
73
76
|
MagicMenuInstanceId,
|
|
74
77
|
MagicMenuViewId,
|
|
@@ -77,7 +80,6 @@ import {
|
|
|
77
80
|
|
|
78
81
|
import '@maas/vue-equipment/utils/css/animations/fade-in.css'
|
|
79
82
|
import '@maas/vue-equipment/utils/css/animations/fade-out.css'
|
|
80
|
-
import { ModeTransitions } from '../utils/modeTransitions'
|
|
81
83
|
|
|
82
84
|
defineOptions({
|
|
83
85
|
inheritAttrs: false,
|
|
@@ -126,7 +128,12 @@ const mappedTransition = computed(() => {
|
|
|
126
128
|
const innerActive = ref(false)
|
|
127
129
|
const wrapperActive = ref(false)
|
|
128
130
|
|
|
129
|
-
const {
|
|
131
|
+
const {
|
|
132
|
+
lockScroll,
|
|
133
|
+
unlockScroll,
|
|
134
|
+
addScrollLockPadding,
|
|
135
|
+
removeScrollLockPadding,
|
|
136
|
+
} = useMenuDOM()
|
|
130
137
|
const {
|
|
131
138
|
onBeforeEnter,
|
|
132
139
|
onEnter,
|
|
@@ -138,9 +145,11 @@ const {
|
|
|
138
145
|
state,
|
|
139
146
|
instanceId,
|
|
140
147
|
viewId,
|
|
148
|
+
wrapperActive,
|
|
141
149
|
lockScroll,
|
|
142
150
|
unlockScroll,
|
|
143
|
-
|
|
151
|
+
addScrollLockPadding,
|
|
152
|
+
removeScrollLockPadding,
|
|
144
153
|
})
|
|
145
154
|
|
|
146
155
|
// Handle state
|
|
@@ -208,7 +217,9 @@ watch(isOutside, (value, oldValue) => {
|
|
|
208
217
|
if (value && !oldValue) {
|
|
209
218
|
switch (state.options.mode) {
|
|
210
219
|
case 'navigation':
|
|
211
|
-
|
|
220
|
+
const delay =
|
|
221
|
+
state.options.delay?.mouseleave ?? ModeDelayMouseleave.navigation
|
|
222
|
+
unselectView(viewId, delay)
|
|
212
223
|
}
|
|
213
224
|
}
|
|
214
225
|
})
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
import { MagicMenuInstanceId, MagicMenuViewId } from '../symbols'
|
|
43
43
|
import { useMenuView } from '../composables/private/useMenuView'
|
|
44
44
|
import { useMenuState } from '../composables/private/useMenuState'
|
|
45
|
+
import { ModeFloatingStrategy } from '../utils/modeFloatingStrategyDefaults'
|
|
45
46
|
|
|
46
47
|
interface MagicMenuFloatProps {
|
|
47
48
|
placement?: Placement
|
|
@@ -165,11 +166,18 @@ const mappedReferenceEl = computed(() => {
|
|
|
165
166
|
}
|
|
166
167
|
})
|
|
167
168
|
|
|
169
|
+
const mappedStrategy = computed(() => {
|
|
170
|
+
return (
|
|
171
|
+
state.options.floating?.strategy ?? ModeFloatingStrategy[state.options.mode]
|
|
172
|
+
)
|
|
173
|
+
})
|
|
174
|
+
|
|
168
175
|
const { floatingStyles, placement, middlewareData } = useFloating(
|
|
169
176
|
mappedReferenceEl,
|
|
170
177
|
elRef,
|
|
171
178
|
{
|
|
172
179
|
placement: mappedPlacement,
|
|
180
|
+
strategy: mappedStrategy,
|
|
173
181
|
whileElementsMounted: autoUpdate,
|
|
174
182
|
middleware: mappedMiddleware,
|
|
175
183
|
}
|
|
@@ -4,9 +4,11 @@ type UseMenuCallbackArgs = {
|
|
|
4
4
|
state: MenuState;
|
|
5
5
|
instanceId: MaybeRef<string>;
|
|
6
6
|
viewId: string;
|
|
7
|
+
wrapperActive: Ref<boolean>;
|
|
7
8
|
lockScroll: () => void;
|
|
8
9
|
unlockScroll: () => void;
|
|
9
|
-
|
|
10
|
+
addScrollLockPadding: () => void;
|
|
11
|
+
removeScrollLockPadding: () => void;
|
|
10
12
|
};
|
|
11
13
|
export declare function useMenuCallback(args: UseMenuCallbackArgs): {
|
|
12
14
|
onBeforeEnter: (_el: Element) => void;
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { toValue } from "vue";
|
|
2
2
|
import { useMagicEmitter } from "@maas/vue-equipment/plugins";
|
|
3
|
+
import { ModeScrollLock } from "../../utils/modeScrollLockDefaults.mjs";
|
|
3
4
|
export function useMenuCallback(args) {
|
|
4
|
-
const {
|
|
5
|
+
const {
|
|
6
|
+
state,
|
|
7
|
+
instanceId,
|
|
8
|
+
viewId,
|
|
9
|
+
wrapperActive,
|
|
10
|
+
lockScroll,
|
|
11
|
+
unlockScroll,
|
|
12
|
+
addScrollLockPadding,
|
|
13
|
+
removeScrollLockPadding
|
|
14
|
+
} = args;
|
|
5
15
|
const emitter = useMagicEmitter();
|
|
6
16
|
function onBeforeEnter(_el) {
|
|
7
17
|
emitter.emit("beforeEnter", { id: toValue(instanceId), view: viewId });
|
|
@@ -11,17 +21,12 @@ export function useMenuCallback(args) {
|
|
|
11
21
|
}
|
|
12
22
|
function onAfterEnter(_el) {
|
|
13
23
|
emitter.emit("afterEnter", { id: toValue(instanceId), view: viewId });
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
case "navigation":
|
|
21
|
-
break;
|
|
22
|
-
case "context":
|
|
23
|
-
lockScroll();
|
|
24
|
-
break;
|
|
24
|
+
const scrollLock = state.options.scrollLock ?? ModeScrollLock[state.options.mode].value;
|
|
25
|
+
if (!!scrollLock) {
|
|
26
|
+
lockScroll();
|
|
27
|
+
if (typeof scrollLock === "object" && scrollLock.padding) {
|
|
28
|
+
addScrollLockPadding();
|
|
29
|
+
}
|
|
25
30
|
}
|
|
26
31
|
}
|
|
27
32
|
function onBeforeLeave(_el) {
|
|
@@ -32,17 +37,12 @@ export function useMenuCallback(args) {
|
|
|
32
37
|
}
|
|
33
38
|
function onAfterLeave(_el) {
|
|
34
39
|
emitter.emit("afterLeave", { id: toValue(instanceId), view: viewId });
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
case "navigation":
|
|
42
|
-
break;
|
|
43
|
-
case "context":
|
|
44
|
-
unlockScroll();
|
|
45
|
-
break;
|
|
40
|
+
const scrollLock = state.options.scrollLock ?? ModeScrollLock[state.options.mode].value;
|
|
41
|
+
if (!!scrollLock) {
|
|
42
|
+
unlockScroll();
|
|
43
|
+
if (typeof scrollLock === "object" && scrollLock.padding) {
|
|
44
|
+
removeScrollLockPadding();
|
|
45
|
+
}
|
|
46
46
|
}
|
|
47
47
|
wrapperActive.value = false;
|
|
48
48
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { useMagicKeys, useFocus } from "@vueuse/core";
|
|
2
2
|
import { useMenuView } from "./useMenuView.mjs";
|
|
3
3
|
import { useMenuState } from "./useMenuState.mjs";
|
|
4
|
+
import {
|
|
5
|
+
ModeDelayClick,
|
|
6
|
+
ModeDelayMouseenter
|
|
7
|
+
} from "../../utils/modeDelayDefaults.mjs";
|
|
4
8
|
export function useMenuTrigger(args) {
|
|
5
9
|
const { instanceId, viewId, itemId, mappedTrigger, mappedDisabled, elRef } = args;
|
|
6
10
|
const { getView, selectView, unselectView } = useMenuView(instanceId);
|
|
@@ -12,7 +16,8 @@ export function useMenuTrigger(args) {
|
|
|
12
16
|
function onRightClick(e) {
|
|
13
17
|
switch (e.button) {
|
|
14
18
|
case 2:
|
|
15
|
-
|
|
19
|
+
const delay = state.options.delay?.rightClick ?? 0;
|
|
20
|
+
selectView(viewId, delay);
|
|
16
21
|
state.active = true;
|
|
17
22
|
if (view) {
|
|
18
23
|
view.state.clicked = { x: e.clientX, y: e.clientY };
|
|
@@ -41,13 +46,8 @@ export function useMenuTrigger(args) {
|
|
|
41
46
|
if (mappedTrigger.value[0] === "mouseenter") {
|
|
42
47
|
state.active = true;
|
|
43
48
|
}
|
|
44
|
-
let delay = 0;
|
|
45
|
-
switch (state.options.mode) {
|
|
46
|
-
case "navigation":
|
|
47
|
-
delay = 200;
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
49
|
if (state.active) {
|
|
50
|
+
const delay = state.options.delay?.mouseenter ?? ModeDelayMouseenter[state.options.mode];
|
|
51
51
|
selectView(viewId, delay);
|
|
52
52
|
if (!itemId) {
|
|
53
53
|
state.input.view = viewId;
|
|
@@ -57,14 +57,9 @@ export function useMenuTrigger(args) {
|
|
|
57
57
|
}
|
|
58
58
|
function onClick(e) {
|
|
59
59
|
if (mappedTrigger.value.includes("click") && !mappedDisabled.value && e.button === 0 && viewId) {
|
|
60
|
-
let delay = 0;
|
|
61
|
-
switch (state.options.mode) {
|
|
62
|
-
case "navigation":
|
|
63
|
-
delay = 200;
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
60
|
switch (true) {
|
|
67
61
|
case !state.active:
|
|
62
|
+
const delay = state.options.delay?.click ?? ModeDelayClick[state.options.mode];
|
|
68
63
|
state.active = true;
|
|
69
64
|
selectView(viewId, delay);
|
|
70
65
|
if (!itemId) {
|
|
@@ -79,6 +74,7 @@ export function useMenuTrigger(args) {
|
|
|
79
74
|
}
|
|
80
75
|
if (mappedTrigger.value.includes("right-click") && viewId) {
|
|
81
76
|
e.preventDefault();
|
|
77
|
+
e.stopPropagation();
|
|
82
78
|
if (control.value || shift.value) {
|
|
83
79
|
onRightClick(
|
|
84
80
|
new MouseEvent(e.type, {
|
|
@@ -4,12 +4,24 @@ type MenuMode = 'dropdown' | 'menubar' | 'context' | 'navigation';
|
|
|
4
4
|
export interface MagicMenuOptions {
|
|
5
5
|
mode?: MenuMode;
|
|
6
6
|
debug?: boolean;
|
|
7
|
+
scrollLock?: boolean | {
|
|
8
|
+
padding: boolean;
|
|
9
|
+
};
|
|
7
10
|
transition?: {
|
|
8
11
|
content?: {
|
|
9
12
|
default?: string;
|
|
10
13
|
nested?: string;
|
|
11
14
|
};
|
|
12
|
-
channel
|
|
15
|
+
channel?: string;
|
|
16
|
+
};
|
|
17
|
+
floating?: {
|
|
18
|
+
strategy: 'fixed' | 'absolute';
|
|
19
|
+
};
|
|
20
|
+
delay?: {
|
|
21
|
+
mouseenter?: number;
|
|
22
|
+
mouseleave?: number;
|
|
23
|
+
click?: number;
|
|
24
|
+
rightClick?: number;
|
|
13
25
|
};
|
|
14
26
|
}
|
|
15
27
|
export type Interaction = 'click' | 'mouseenter' | 'right-click';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { MagicMenuOptions } from '../types.js';
|
|
2
2
|
import type { RequireAllNested } from '@maas/vue-equipment/utils';
|
|
3
|
-
declare const defaultOptions: RequireAllNested<MagicMenuOptions>;
|
|
3
|
+
declare const defaultOptions: Omit<RequireAllNested<MagicMenuOptions>, 'scrollLock' | 'floating' | 'delay'>;
|
|
4
4
|
export { defaultOptions };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare enum ModeDelayMouseenter {
|
|
2
|
+
menubar = 0,
|
|
3
|
+
dropdown = 0,
|
|
4
|
+
context = 0,
|
|
5
|
+
navigation = 200
|
|
6
|
+
}
|
|
7
|
+
export declare enum ModeDelayMouseleave {
|
|
8
|
+
navigation = 200
|
|
9
|
+
}
|
|
10
|
+
export declare enum ModeDelayClick {
|
|
11
|
+
menubar = 0,
|
|
12
|
+
dropdown = 0,
|
|
13
|
+
context = 0,
|
|
14
|
+
navigation = 0
|
|
15
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export var ModeDelayMouseenter = /* @__PURE__ */ ((ModeDelayMouseenter2) => {
|
|
2
|
+
ModeDelayMouseenter2[ModeDelayMouseenter2["menubar"] = 0] = "menubar";
|
|
3
|
+
ModeDelayMouseenter2[ModeDelayMouseenter2["dropdown"] = 0] = "dropdown";
|
|
4
|
+
ModeDelayMouseenter2[ModeDelayMouseenter2["context"] = 0] = "context";
|
|
5
|
+
ModeDelayMouseenter2[ModeDelayMouseenter2["navigation"] = 200] = "navigation";
|
|
6
|
+
return ModeDelayMouseenter2;
|
|
7
|
+
})(ModeDelayMouseenter || {});
|
|
8
|
+
export var ModeDelayMouseleave = /* @__PURE__ */ ((ModeDelayMouseleave2) => {
|
|
9
|
+
ModeDelayMouseleave2[ModeDelayMouseleave2["navigation"] = 200] = "navigation";
|
|
10
|
+
return ModeDelayMouseleave2;
|
|
11
|
+
})(ModeDelayMouseleave || {});
|
|
12
|
+
export var ModeDelayClick = /* @__PURE__ */ ((ModeDelayClick2) => {
|
|
13
|
+
ModeDelayClick2[ModeDelayClick2["menubar"] = 0] = "menubar";
|
|
14
|
+
ModeDelayClick2[ModeDelayClick2["dropdown"] = 0] = "dropdown";
|
|
15
|
+
ModeDelayClick2[ModeDelayClick2["context"] = 0] = "context";
|
|
16
|
+
ModeDelayClick2[ModeDelayClick2["navigation"] = 0] = "navigation";
|
|
17
|
+
return ModeDelayClick2;
|
|
18
|
+
})(ModeDelayClick || {});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export var ModeFloatingStrategy = /* @__PURE__ */ ((ModeFloatingStrategy2) => {
|
|
2
|
+
ModeFloatingStrategy2["menubar"] = "absolute";
|
|
3
|
+
ModeFloatingStrategy2["dropdown"] = "absolute";
|
|
4
|
+
ModeFloatingStrategy2["context"] = "absolute";
|
|
5
|
+
ModeFloatingStrategy2["navigation"] = "fixed";
|
|
6
|
+
return ModeFloatingStrategy2;
|
|
7
|
+
})(ModeFloatingStrategy || {});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class ModeScrollLock {
|
|
2
|
+
private readonly key;
|
|
3
|
+
readonly value: false | {
|
|
4
|
+
padding: boolean;
|
|
5
|
+
};
|
|
6
|
+
static readonly menubar: ModeScrollLock;
|
|
7
|
+
static readonly dropdown: ModeScrollLock;
|
|
8
|
+
static readonly context: ModeScrollLock;
|
|
9
|
+
static readonly navigation: ModeScrollLock;
|
|
10
|
+
private constructor();
|
|
11
|
+
toString(): string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class ModeScrollLock {
|
|
2
|
+
constructor(key, value) {
|
|
3
|
+
this.key = key;
|
|
4
|
+
this.value = value;
|
|
5
|
+
}
|
|
6
|
+
static menubar = new ModeScrollLock("menubar", false);
|
|
7
|
+
static dropdown = new ModeScrollLock("dropdown", { padding: true });
|
|
8
|
+
static context = new ModeScrollLock("context", { padding: true });
|
|
9
|
+
static navigation = new ModeScrollLock("navigation", false);
|
|
10
|
+
toString() {
|
|
11
|
+
return this.key;
|
|
12
|
+
}
|
|
13
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maas/vue-equipment",
|
|
3
3
|
"description": "A magic collection of Vue composables, plugins, components and directives",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.31.0",
|
|
5
5
|
"author": "Robin Scholz <https://github.com/robinscholz>, Christoph Jeworutzki <https://github.com/ChristophJeworutzki>",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"devDependencies": {
|
/package/dist/plugins/MagicMenu/src/utils/{modeTransitions.d.ts → modeTransitionDefaults.d.ts}
RENAMED
|
File without changes
|
/package/dist/plugins/MagicMenu/src/utils/{modeTransitions.mjs → modeTransitionDefaults.mjs}
RENAMED
|
File without changes
|