@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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment/nuxt",
3
3
  "configKey": "vueEquipment",
4
- "version": "0.30.5",
4
+ "version": "0.30.7",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "0.8.1",
7
7
  "unbuild": "unknown"
@@ -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 { lockScroll, unlockScroll } = useMenuDOM()
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
- wrapperActive,
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
- unselectView(viewId, 200)
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
- wrapperActive: Ref<boolean>;
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 { state, instanceId, viewId, lockScroll, unlockScroll, wrapperActive } = args;
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
- switch (state.options.mode) {
15
- case "dropdown":
16
- lockScroll();
17
- break;
18
- case "menubar":
19
- break;
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
- switch (state.options.mode) {
36
- case "dropdown":
37
- unlockScroll();
38
- break;
39
- case "menubar":
40
- break;
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
- selectView(viewId);
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: string;
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,6 @@
1
+ export declare enum ModeFloatingStrategy {
2
+ menubar = "absolute",
3
+ dropdown = "absolute",
4
+ context = "absolute",
5
+ navigation = "fixed"
6
+ }
@@ -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.30.6",
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": {