@maas/vue-equipment 0.29.4 → 0.29.6

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.29.3",
4
+ "version": "0.29.5",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "0.8.0",
7
7
  "unbuild": "unknown"
@@ -15,7 +15,11 @@
15
15
  v-bind="$attrs"
16
16
  v-if="innerActive"
17
17
  >
18
- <magic-menu-float :placement="placement" :arrow="arrow">
18
+ <magic-menu-float
19
+ :placement="placement"
20
+ :arrow="arrow"
21
+ :reference-el="referenceEl"
22
+ >
19
23
  <template #arrow v-if="$slots.arrow && arrow">
20
24
  <slot name="arrow" />
21
25
  </template>
@@ -31,7 +35,16 @@
31
35
  </template>
32
36
 
33
37
  <script lang="ts" setup>
34
- import { ref, inject, provide, nextTick, watch, computed } from 'vue'
38
+ import {
39
+ ref,
40
+ inject,
41
+ provide,
42
+ nextTick,
43
+ watch,
44
+ computed,
45
+ type MaybeRef,
46
+ type ComponentPublicInstance,
47
+ } from 'vue'
35
48
  import type { Placement } from '@floating-ui/vue'
36
49
  import { useMenuView } from '../composables/private/useMenuView'
37
50
  import {
@@ -53,6 +66,7 @@ defineOptions({
53
66
  interface MagicMenuContentProps {
54
67
  placement?: Placement
55
68
  arrow?: boolean
69
+ referenceEl?: MaybeRef<HTMLElement | ComponentPublicInstance>
56
70
  }
57
71
 
58
72
  defineProps<MagicMenuContentProps>()
@@ -1,9 +1,11 @@
1
+ import { type MaybeRef, type ComponentPublicInstance } from 'vue';
1
2
  import type { Placement } from '@floating-ui/vue';
2
3
  import '@maas/vue-equipment/utils/css/animations/fade-in.css';
3
4
  import '@maas/vue-equipment/utils/css/animations/fade-out.css';
4
5
  interface MagicMenuContentProps {
5
6
  placement?: Placement;
6
7
  arrow?: boolean;
8
+ referenceEl?: MaybeRef<HTMLElement | ComponentPublicInstance>;
7
9
  }
8
10
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_TypePropsToOption<MagicMenuContentProps>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<MagicMenuContentProps>>>, {}, {}>, {
9
11
  arrow?(_: {}): any;
@@ -22,7 +22,14 @@
22
22
  </template>
23
23
 
24
24
  <script lang="ts" setup>
25
- import { ref, computed, inject } from 'vue'
25
+ import {
26
+ ref,
27
+ computed,
28
+ inject,
29
+ toValue,
30
+ type MaybeRef,
31
+ type ComponentPublicInstance,
32
+ } from 'vue'
26
33
  import {
27
34
  useFloating,
28
35
  autoUpdate,
@@ -39,6 +46,7 @@ import { useMenuState } from '../composables/private/useMenuState'
39
46
  interface MagicMenuFloatProps {
40
47
  placement?: Placement
41
48
  arrow?: boolean
49
+ referenceEl?: MaybeRef<HTMLElement | ComponentPublicInstance>
42
50
  }
43
51
 
44
52
  const props = defineProps<MagicMenuFloatProps>()
@@ -75,21 +83,69 @@ const hasArrow = computed(
75
83
  )
76
84
 
77
85
  const mappedMiddleware = computed(() => {
78
- const middleware = [flip()]
79
-
80
- if (view?.parent.item) {
81
- middleware.push(shift({ crossAxis: true, limiter: limitShift() }))
82
- }
86
+ const middleware = []
83
87
 
84
- if (hasArrow.value) {
85
- middleware.push(arrow({ element: arrowRef }))
88
+ switch (state.options.mode) {
89
+ case 'menubar':
90
+ if (!view?.parent.item) {
91
+ middleware.push(
92
+ flip({
93
+ crossAxis: true,
94
+ })
95
+ )
96
+ } else if (!!view?.parent.item) {
97
+ middleware.push(
98
+ flip({
99
+ crossAxis: false,
100
+ })
101
+ )
102
+ middleware.push(
103
+ shift({
104
+ crossAxis: true,
105
+ limiter: limitShift(),
106
+ })
107
+ )
108
+ }
109
+ break
110
+ case 'dropdown':
111
+ middleware.push(
112
+ flip({
113
+ mainAxis: true,
114
+ crossAxis: false,
115
+ })
116
+ )
117
+ middleware.push(
118
+ shift({
119
+ mainAxis: true,
120
+ crossAxis: false,
121
+ limiter: limitShift(),
122
+ })
123
+ )
124
+ if (hasArrow.value) {
125
+ middleware.push(
126
+ arrow({
127
+ element: arrowRef.value,
128
+ })
129
+ )
130
+ }
131
+ break
132
+ case 'context':
133
+ middleware.push(
134
+ flip({
135
+ mainAxis: true,
136
+ crossAxis: true,
137
+ })
138
+ )
139
+ break
86
140
  }
87
141
 
88
142
  return middleware
89
143
  })
90
144
 
91
- const referenceEl = computed(() => {
92
- if (view?.click) {
145
+ const mappedReferenceEl = computed(() => {
146
+ if (props.referenceEl) {
147
+ return toValue(props.referenceEl)
148
+ } else if (view?.click) {
93
149
  return {
94
150
  getBoundingClientRect() {
95
151
  return {
@@ -110,7 +166,7 @@ const referenceEl = computed(() => {
110
166
  })
111
167
 
112
168
  const { floatingStyles, placement, middlewareData } = useFloating(
113
- referenceEl,
169
+ mappedReferenceEl,
114
170
  elRef,
115
171
  {
116
172
  placement: mappedPlacement,
@@ -1,7 +1,9 @@
1
+ import { type MaybeRef, type ComponentPublicInstance } from 'vue';
1
2
  import { type Placement } from '@floating-ui/vue';
2
3
  interface MagicMenuFloatProps {
3
4
  placement?: Placement;
4
5
  arrow?: boolean;
6
+ referenceEl?: MaybeRef<HTMLElement | ComponentPublicInstance>;
5
7
  }
6
8
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_TypePropsToOption<MagicMenuFloatProps>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<MagicMenuFloatProps>>>, {}, {}>, {
7
9
  arrow?(_: {}): any;
@@ -26,11 +26,11 @@ import {
26
26
  MagicMenuItemId,
27
27
  } from '../symbols'
28
28
 
29
- import type { MenuTrigger } from '../types'
29
+ import type { Interaction } from '../types'
30
30
 
31
31
  interface MagicMenuTriggerProps {
32
32
  disabled?: boolean
33
- trigger?: MenuTrigger[]
33
+ trigger?: Interaction[]
34
34
  }
35
35
 
36
36
  const props = defineProps<MagicMenuTriggerProps>()
@@ -60,7 +60,7 @@ const item = getItem(itemId ?? '')
60
60
 
61
61
  const mappedDisabled = computed(() => props.disabled ?? item?.disabled)
62
62
 
63
- const mappedTrigger = computed<MenuTrigger[]>(() => {
63
+ const mappedTrigger = computed<Interaction[]>(() => {
64
64
  if (props.trigger?.length) {
65
65
  return props.trigger
66
66
  }
@@ -1,7 +1,7 @@
1
- import type { MenuTrigger } from '../types';
1
+ import type { Interaction } from '../types';
2
2
  interface MagicMenuTriggerProps {
3
3
  disabled?: boolean;
4
- trigger?: MenuTrigger[];
4
+ trigger?: Interaction[];
5
5
  }
6
6
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_TypePropsToOption<MagicMenuTriggerProps>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<MagicMenuTriggerProps>>>, {}, {}>, {
7
7
  default?(_: {
@@ -1,11 +1,11 @@
1
1
  import { type ComputedRef, type MaybeRef, type Ref } from 'vue';
2
- import type { MenuTrigger } from '../../types/index.js';
2
+ import type { Interaction } from '../../types/index.js';
3
3
  type UseMenuTriggerArgs = {
4
4
  instanceId: MaybeRef<string>;
5
5
  viewId: string;
6
6
  itemId?: string;
7
7
  mappedDisabled: ComputedRef<boolean>;
8
- mappedTrigger: ComputedRef<MenuTrigger[]>;
8
+ mappedTrigger: ComputedRef<Interaction[]>;
9
9
  elRef: Ref<HTMLElement | undefined>;
10
10
  };
11
11
  export declare function useMenuTrigger(args: UseMenuTriggerArgs): {
@@ -164,13 +164,18 @@ export function useMenuTrigger(args) {
164
164
  function onMouseenter() {
165
165
  cancelPointermove?.();
166
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;
167
+ if (mappedTrigger.value.includes("mouseenter") && !mappedDisabled.value && viewId && view) {
168
+ if (!mappedTrigger.value[0].includes("mouseenter")) {
169
+ state.active = true;
171
170
  }
172
- if (itemId) {
173
- disableCursor();
171
+ if (state.active) {
172
+ selectView(viewId);
173
+ if (!itemId) {
174
+ state.input.view = viewId;
175
+ }
176
+ if (itemId) {
177
+ disableCursor();
178
+ }
174
179
  }
175
180
  }
176
181
  }
@@ -8,7 +8,7 @@ export interface MagicMenuOptions {
8
8
  nested?: string;
9
9
  };
10
10
  }
11
- export type MenuTrigger = 'click' | 'mouseenter' | 'mouseleave' | 'right-click';
11
+ export type Interaction = 'click' | 'mouseenter' | 'mouseleave' | 'right-click';
12
12
  export type Coordinates = {
13
13
  x: number;
14
14
  y: number;
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.29.4",
4
+ "version": "0.29.6",
5
5
  "author": "Robin Scholz <https://github.com/robinscholz>, Christoph Jeworutzki <https://github.com/ChristophJeworutzki>",
6
6
  "devDependencies": {
7
7
  "@antfu/ni": "^0.21.12",