@maas/vue-equipment 1.1.0 → 1.2.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.
Files changed (28) hide show
  1. package/dist/nuxt/module.json +1 -1
  2. package/dist/nuxt/module.mjs +1 -1
  3. package/dist/plugins/MagicCarousel/src/utils/defaultOptions.mjs +1 -1
  4. package/dist/plugins/MagicDraggable/src/utils/defaultOptions.mjs +1 -1
  5. package/dist/plugins/MagicDrawer/src/components/MagicDrawerContent.vue +4 -0
  6. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +1 -2
  7. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerProgress.mjs +57 -77
  8. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerSnap.mjs +2 -5
  9. package/dist/plugins/MagicDrawer/src/utils/defaultOptions.mjs +1 -1
  10. package/dist/plugins/MagicTray/index.d.ts +2 -1
  11. package/dist/plugins/MagicTray/index.mjs +3 -0
  12. package/dist/plugins/MagicTray/src/components/MagicTrayContent.d.vue.ts +2 -2
  13. package/dist/plugins/MagicTray/src/components/MagicTrayContent.vue +17 -16
  14. package/dist/plugins/MagicTray/src/components/MagicTrayContent.vue.d.ts +2 -2
  15. package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.d.vue.ts +25 -0
  16. package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.vue +90 -0
  17. package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.vue.d.ts +25 -0
  18. package/dist/plugins/MagicTray/src/composables/private/useTrayDrag.d.ts +0 -4
  19. package/dist/plugins/MagicTray/src/composables/private/useTrayDrag.mjs +9 -415
  20. package/dist/plugins/MagicTray/src/composables/private/useTrayGesture.d.ts +16 -0
  21. package/dist/plugins/MagicTray/src/composables/private/useTrayGesture.mjs +426 -0
  22. package/dist/plugins/MagicTray/src/composables/private/useTrayMagnetism.mjs +9 -37
  23. package/dist/plugins/MagicTray/src/composables/private/useTrayProgress.mjs +1 -1
  24. package/dist/plugins/MagicTray/src/composables/private/useTraySnap.mjs +2 -4
  25. package/dist/plugins/MagicTray/src/composables/private/useTrayUtils.d.ts +8 -1
  26. package/dist/plugins/MagicTray/src/composables/private/useTrayUtils.mjs +7 -1
  27. package/dist/plugins/MagicTray/src/utils/defaultOptions.mjs +1 -1
  28. package/package.json +2 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment/nuxt",
3
3
  "configKey": "vueEquipment",
4
- "version": "1.0.1",
4
+ "version": "1.1.0",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.3",
7
7
  "unbuild": "unknown"
@@ -122,7 +122,7 @@ const functions$1 = [
122
122
  {
123
123
  name: "MagicTray",
124
124
  "package": "plugins",
125
- lastUpdated: 1792675743000,
125
+ lastUpdated: 1793032883000,
126
126
  docs: "https://vue.equipment/plugins/MagicTray",
127
127
  description: "MagicTray is a flexible"
128
128
  },
@@ -2,7 +2,7 @@ import { easeOutQuad } from "@maas/vue-equipment/utils";
2
2
  const defaultOptions = {
3
3
  loop: false,
4
4
  threshold: {
5
- lock: 10
5
+ lock: 8
6
6
  },
7
7
  animation: {
8
8
  snap: {
@@ -4,7 +4,7 @@ const defaultOptions = {
4
4
  scrollLock: { padding: true },
5
5
  snapPoints: ["top-left", "top-right", "bottom-left", "bottom-right"],
6
6
  threshold: {
7
- lock: 0,
7
+ lock: 8,
8
8
  distance: 128,
9
9
  momentum: 1.5,
10
10
  idle: 250
@@ -367,6 +367,10 @@ dialog.magic-drawer-content__drag::backdrop {
367
367
  user-select: none;
368
368
  }
369
369
 
370
+ .magic-drawer-content[data-dragging='true'] .magic-drawer-content__drag * {
371
+ -webkit-user-drag: none;
372
+ }
373
+
370
374
  .magic-drawer-content[data-wheeling='true'] .magic-drawer-content__drag {
371
375
  cursor: auto;
372
376
  }
@@ -456,8 +456,6 @@ export function useDrawerDrag(args) {
456
456
  return;
457
457
  }
458
458
  checkDirection({ x: firstTouch.clientX, y: firstTouch.clientY });
459
- shouldClose.value = false;
460
- checkDirection({ x: firstTouch.clientX, y: firstTouch.clientY });
461
459
  if (!scrollLock) {
462
460
  const scrollLockTarget = lockScroll(firstTouch.target);
463
461
  if (scrollLockTarget) {
@@ -611,6 +609,7 @@ export function useDrawerDrag(args) {
611
609
  await getSizes();
612
610
  const snapPoint = toValue(initial)?.snapPoint;
613
611
  if (!snapPoint) {
612
+ activeSnapPoint.value = snapPointAt(0);
614
613
  return;
615
614
  }
616
615
  if (isUnknownSnapPoint(snapPoint)) {
@@ -14,6 +14,10 @@ import { useDrawerState } from "./useDrawerState.mjs";
14
14
  export function useDrawerProgress(args) {
15
15
  const { id, drawerRef, elRef, position, overshoot } = args;
16
16
  const { initializeState } = useDrawerState(id);
17
+ const emitter = useMagicEmitter();
18
+ const state = initializeState();
19
+ const { draggedX, draggedY, wrapperRect } = toRefs(state);
20
+ let transitioning = false;
17
21
  const drawerRect = useElementBounding(drawerRef);
18
22
  const elRect = useElementBounding(elRef);
19
23
  const maxX = computed(
@@ -22,27 +26,38 @@ export function useDrawerProgress(args) {
22
26
  const maxY = computed(
23
27
  () => drawerRect.height.value - elRect.height.value + toValue(overshoot)
24
28
  );
25
- const state = initializeState();
26
29
  const { progress } = toRefs(state);
27
- function rafCallback() {
30
+ function setProgress(x, y) {
31
+ progress.value = {
32
+ x: clampValue(x, 0, 1) || 0,
33
+ y: clampValue(y, 0, 1) || 0
34
+ };
35
+ }
36
+ function calculate() {
37
+ const rect = wrapperRect.value;
38
+ if (!rect) {
39
+ setProgress(0, 0);
40
+ return;
41
+ }
42
+ const extentX = rect.width - toValue(overshoot);
43
+ const extentY = rect.height - toValue(overshoot);
44
+ switch (toValue(position)) {
45
+ case "top":
46
+ case "bottom":
47
+ setProgress(0, extentY ? 1 - Math.abs(draggedY.value) / extentY : 0);
48
+ break;
49
+ case "left":
50
+ case "right":
51
+ setProgress(extentX ? 1 - Math.abs(draggedX.value) / extentX : 0, 0);
52
+ break;
53
+ }
54
+ }
55
+ function measure() {
28
56
  drawerRect.update();
29
57
  elRect.update();
30
- calculateProgress();
31
- }
32
- const emitter = useMagicEmitter();
33
- const { pause: snapPause, resume: snapResume } = useRafFn(rafCallback, {
34
- immediate: false
35
- });
36
- const { pause: dragPause, resume: dragResume } = useRafFn(rafCallback, {
37
- immediate: false
38
- });
39
- const { pause, resume } = useRafFn(rafCallback, {
40
- immediate: false
41
- });
42
- function calculateProgress() {
43
58
  let rawX = 0;
44
59
  let rawY = 0;
45
- switch (position) {
60
+ switch (toValue(position)) {
46
61
  case "bottom":
47
62
  rawY = mapValue(
48
63
  elRect.top.value,
@@ -80,81 +95,46 @@ export function useDrawerProgress(args) {
80
95
  );
81
96
  break;
82
97
  }
83
- if (Object.is(rawX, -0)) {
84
- rawX = 0;
85
- }
86
- if (Object.is(rawY, -0)) {
87
- rawY = 0;
88
- }
89
- const x = clampValue(rawX, 0, 1);
90
- const y = clampValue(rawY, 0, 1);
91
- progress.value = { x, y };
98
+ setProgress(rawX, rawY);
92
99
  }
93
- watch([() => progress.value.x, () => progress.value.y], ([x, y]) => {
94
- emitter.emit("progress", {
95
- id: toValue(id),
96
- x,
97
- y
98
- });
99
- });
100
- function beforeCallback(payload) {
100
+ const { pause, resume } = useRafFn(measure, { immediate: false });
101
+ function beforeTransition(payload) {
101
102
  if (payload === toValue(id)) {
103
+ transitioning = true;
102
104
  resume();
103
105
  }
104
106
  }
105
- function beforeSnapCallback(payload) {
106
- if (payload.id === toValue(id)) {
107
- snapResume();
108
- }
109
- }
110
- function beforeDragCallback(payload) {
111
- if (payload.id === toValue(id)) {
112
- dragResume();
113
- }
114
- }
115
- async function afterCallback(payload) {
107
+ async function afterTransition(payload) {
116
108
  await nextTick();
117
109
  if (payload === toValue(id)) {
118
110
  pause();
119
- await nextTick();
120
- rafCallback();
121
- }
122
- }
123
- async function afterSnapCallback(payload) {
124
- await nextTick();
125
- if (payload.id === toValue(id)) {
126
- snapPause();
127
- await nextTick();
128
- rafCallback();
111
+ transitioning = false;
112
+ calculate();
129
113
  }
130
114
  }
131
- async function afterDragCallback(payload) {
132
- await nextTick();
133
- if (payload.id === toValue(id)) {
134
- dragPause();
135
- await nextTick();
136
- rafCallback();
115
+ watch([draggedX, draggedY, wrapperRect, () => toValue(overshoot)], () => {
116
+ if (!transitioning) {
117
+ calculate();
137
118
  }
138
- }
119
+ });
120
+ watch([() => progress.value.x, () => progress.value.y], ([x, y]) => {
121
+ emitter.emit("progress", {
122
+ id: toValue(id),
123
+ x,
124
+ y
125
+ });
126
+ });
139
127
  onMounted(() => {
140
- emitter.on("beforeEnter", beforeCallback);
141
- emitter.on("afterEnter", afterCallback);
142
- emitter.on("beforeDrag", beforeDragCallback);
143
- emitter.on("afterDrag", afterDragCallback);
144
- emitter.on("beforeSnap", beforeSnapCallback);
145
- emitter.on("afterSnap", afterSnapCallback);
146
- emitter.on("beforeLeave", beforeCallback);
147
- emitter.on("afterLeave", afterCallback);
128
+ emitter.on("beforeEnter", beforeTransition);
129
+ emitter.on("afterEnter", afterTransition);
130
+ emitter.on("beforeLeave", beforeTransition);
131
+ emitter.on("afterLeave", afterTransition);
148
132
  });
149
133
  onBeforeUnmount(() => {
150
- emitter.off("beforeEnter", beforeCallback);
151
- emitter.off("afterEnter", afterCallback);
152
- emitter.off("beforeDrag", beforeDragCallback);
153
- emitter.off("afterDrag", afterDragCallback);
154
- emitter.off("beforeSnap", beforeSnapCallback);
155
- emitter.off("afterSnap", afterSnapCallback);
156
- emitter.off("beforeLeave", beforeCallback);
157
- emitter.off("afterLeave", afterCallback);
134
+ emitter.off("beforeEnter", beforeTransition);
135
+ emitter.off("afterEnter", afterTransition);
136
+ emitter.off("beforeLeave", beforeTransition);
137
+ emitter.off("afterLeave", afterTransition);
158
138
  });
159
139
  return { progress };
160
140
  }
@@ -8,7 +8,6 @@ import {
8
8
  } from "@maas/vue-equipment/utils";
9
9
  import { useMagicEmitter } from "@maas/vue-equipment/plugins/MagicEmitter";
10
10
  import { useDrawerUtils } from "./useDrawerUtils.mjs";
11
- const SNAP_TOLERANCE = 0.01;
12
11
  function isMapped(value) {
13
12
  return value !== void 0 && !Number.isNaN(value);
14
13
  }
@@ -193,7 +192,7 @@ export function useDrawerSnap(args) {
193
192
  function configuredPointAt(offset) {
194
193
  return configuredPoints.value.find((snapPoint) => {
195
194
  const mapped = mapSnapPoint(snapPoint);
196
- return isMapped(mapped) && Math.abs(mapped - offset) < SNAP_TOLERANCE;
195
+ return mapped === offset;
197
196
  });
198
197
  }
199
198
  function draggedOnAxis() {
@@ -242,9 +241,7 @@ export function useDrawerSnap(args) {
242
241
  if (!isMapped(mapped)) {
243
242
  return false;
244
243
  }
245
- return !!rangeAt(mapped) || mappedSnapPoints.value.some(
246
- (point) => Math.abs(point - mapped) < SNAP_TOLERANCE
247
- );
244
+ return !!rangeAt(mapped) || mappedSnapPoints.value.includes(mapped);
248
245
  }
249
246
  function findSnapTarget(offset) {
250
247
  const target = snapTargetAt({
@@ -21,7 +21,7 @@ const defaultOptions = {
21
21
  backdrop: "magic-drawer-backdrop"
22
22
  },
23
23
  threshold: {
24
- lock: 0,
24
+ lock: 8,
25
25
  distance: 128,
26
26
  momentum: 1
27
27
  },
@@ -2,10 +2,11 @@ import MagicTray from './src/components/MagicTray.vue.js';
2
2
  import MagicTrayProvider from './src/components/MagicTrayProvider.vue.js';
3
3
  import MagicTrayContent from './src/components/MagicTrayContent.vue.js';
4
4
  import MagicTrayHandle from './src/components/MagicTrayHandle.vue.js';
5
+ import MagicTrayTrigger from './src/components/MagicTrayTrigger.vue.js';
5
6
  import MagicTrayTransform from './src/components/MagicTrayTransform.vue.js';
6
7
  import { useMagicTray } from './src/composables/useMagicTray.js';
7
8
  import type { Plugin } from 'vue';
8
9
  import type { MagicTrayDragMode, MagicTrayOptions, MagicTraySide, MagicTraySidePayload, MagicTraySnapEntry, MagicTraySnapMode, MagicTraySnapPoint, MagicTraySnapPointPayload, MagicTraySnapRange, MagicTrayTransformAxis, MagicTrayWillSnapToPayload } from './src/types/index.js';
9
10
  declare const MagicTrayPlugin: Plugin;
10
- export { MagicTrayPlugin, MagicTray, MagicTrayProvider, MagicTrayContent, MagicTrayHandle, MagicTrayTransform, useMagicTray, };
11
+ export { MagicTrayPlugin, MagicTray, MagicTrayProvider, MagicTrayContent, MagicTrayHandle, MagicTrayTrigger, MagicTrayTransform, useMagicTray, };
11
12
  export type { MagicTrayOptions, MagicTraySide, MagicTraySidePayload, MagicTraySnapMode, MagicTrayDragMode, MagicTraySnapPoint, MagicTraySnapRange, MagicTraySnapEntry, MagicTraySnapPointPayload, MagicTrayWillSnapToPayload, MagicTrayTransformAxis, };
@@ -2,6 +2,7 @@ import MagicTray from "./src/components/MagicTray.vue";
2
2
  import MagicTrayProvider from "./src/components/MagicTrayProvider.vue";
3
3
  import MagicTrayContent from "./src/components/MagicTrayContent.vue";
4
4
  import MagicTrayHandle from "./src/components/MagicTrayHandle.vue";
5
+ import MagicTrayTrigger from "./src/components/MagicTrayTrigger.vue";
5
6
  import MagicTrayTransform from "./src/components/MagicTrayTransform.vue";
6
7
  import { useMagicTray } from "./src/composables/useMagicTray.mjs";
7
8
  const MagicTrayPlugin = {
@@ -10,6 +11,7 @@ const MagicTrayPlugin = {
10
11
  app.component("MagicTrayProvider", MagicTrayProvider);
11
12
  app.component("MagicTrayContent", MagicTrayContent);
12
13
  app.component("MagicTrayHandle", MagicTrayHandle);
14
+ app.component("MagicTrayTrigger", MagicTrayTrigger);
13
15
  app.component("MagicTrayTransform", MagicTrayTransform);
14
16
  }
15
17
  };
@@ -19,6 +21,7 @@ export {
19
21
  MagicTrayProvider,
20
22
  MagicTrayContent,
21
23
  MagicTrayHandle,
24
+ MagicTrayTrigger,
22
25
  MagicTrayTransform,
23
26
  useMagicTray
24
27
  };
@@ -1,9 +1,9 @@
1
1
  import type { MagicTraySide } from '../types/index.js';
2
- declare var __VLS_9: {}, __VLS_11: {}, __VLS_25: "handle-top" | "handle-right" | "handle-bottom" | "handle-left" | "handle", __VLS_26: {
2
+ declare var __VLS_9: {}, __VLS_11: {}, __VLS_24: "handle-top" | "handle-right" | "handle-bottom" | "handle-left" | "handle", __VLS_25: {
3
3
  side: MagicTraySide;
4
4
  };
5
5
  type __VLS_Slots = {} & {
6
- [K in NonNullable<typeof __VLS_25>]?: (props: typeof __VLS_26) => any;
6
+ [K in NonNullable<typeof __VLS_24>]?: (props: typeof __VLS_25) => any;
7
7
  } & {
8
8
  background?: (props: typeof __VLS_9) => any;
9
9
  } & {
@@ -40,7 +40,6 @@
40
40
  :style="handleStyle(side)"
41
41
  @pointerdown="guardedPointerdown(side, $event)"
42
42
  @touchstart="guardedTouchstart(side, $event)"
43
- @click.capture="onHandleClick"
44
43
  >
45
44
  <template
46
45
  v-if="slots[`handle-${side}`] || slots.handle"
@@ -62,6 +61,7 @@ import { computed, inject, useSlots, useTemplateRef } from "vue";
62
61
  import { useMagicError } from "@maas/vue-equipment/plugins/MagicError";
63
62
  import { useTrayState } from "../composables/private/useTrayState";
64
63
  import { useTrayDrag } from "../composables/private/useTrayDrag";
64
+ import { useTrayGesture } from "../composables/private/useTrayGesture";
65
65
  import { useTrayMagnetism } from "../composables/private/useTrayMagnetism";
66
66
  import { useTrayProgress } from "../composables/private/useTrayProgress";
67
67
  import MagicTrayHandle from "./MagicTrayHandle.vue";
@@ -94,18 +94,15 @@ const handleRefs = {
94
94
  const disabled = computed(() => state.options.disabled);
95
95
  const inset = computed(() => state.options.inset);
96
96
  const slots = useSlots();
97
- const {
98
- draggableSides,
99
- clipPath,
100
- handleStyle,
101
- hasDragged,
102
- onHandlePointerdown,
103
- onHandleTouchstart,
104
- onHandleClick
105
- } = useTrayDrag({
97
+ const { draggableSides, clipPath, handleStyle } = useTrayDrag({
106
98
  id: instanceId,
107
99
  elRef
108
100
  });
101
+ const { hasDragged, onPointerdown, onTouchstart } = useTrayGesture({
102
+ id: instanceId,
103
+ state,
104
+ preventEdgeNavigation: () => state.options.preventEdgeNavigation
105
+ });
109
106
  useTrayMagnetism({ id: instanceId, elRef, handleRefs, state });
110
107
  useTrayProgress({ id: instanceId, state });
111
108
  const visibleHandles = computed(() => {
@@ -120,12 +117,12 @@ const visibleHandles = computed(() => {
120
117
  });
121
118
  function guardedPointerdown(side, event) {
122
119
  if (!disabled.value) {
123
- onHandlePointerdown(side, event);
120
+ onPointerdown(side, event);
124
121
  }
125
122
  }
126
123
  function guardedTouchstart(side, event) {
127
124
  if (!disabled.value) {
128
- onHandleTouchstart(side, event);
125
+ onTouchstart(side, event);
129
126
  }
130
127
  }
131
128
  </script>
@@ -200,10 +197,6 @@ function guardedTouchstart(side, event) {
200
197
  pointer-events: var(--magic-tray-content-pointer-events, auto);
201
198
  }
202
199
 
203
- .magic-tray-content[data-inset='true'] .magic-tray-content__slot {
204
- padding: var(--magic-tray-drag-overshoot-outer);
205
- }
206
-
207
200
  .magic-tray-content__inner[data-drag-top='true'] {
208
201
  padding-top: var(--magic-tray-drag-overshoot-outer);
209
202
  }
@@ -242,4 +235,12 @@ dialog.magic-tray-content__inner {
242
235
  .magic-tray-content[data-dragging='true'] .magic-tray-handle {
243
236
  cursor: var(--magic-tray-handle-cursor-dragging, grabbing);
244
237
  }
238
+
239
+ .magic-tray-content[data-dragging='true'] .magic-tray-handle * {
240
+ -webkit-user-drag: none;
241
+ }
242
+
243
+ .magic-tray-content[data-dragged='true'] .magic-tray-handle * {
244
+ pointer-events: none;
245
+ }
245
246
  </style>
@@ -1,9 +1,9 @@
1
1
  import type { MagicTraySide } from '../types/index.js';
2
- declare var __VLS_9: {}, __VLS_11: {}, __VLS_25: "handle-top" | "handle-right" | "handle-bottom" | "handle-left" | "handle", __VLS_26: {
2
+ declare var __VLS_9: {}, __VLS_11: {}, __VLS_24: "handle-top" | "handle-right" | "handle-bottom" | "handle-left" | "handle", __VLS_25: {
3
3
  side: MagicTraySide;
4
4
  };
5
5
  type __VLS_Slots = {} & {
6
- [K in NonNullable<typeof __VLS_25>]?: (props: typeof __VLS_26) => any;
6
+ [K in NonNullable<typeof __VLS_24>]?: (props: typeof __VLS_25) => any;
7
7
  } & {
8
8
  background?: (props: typeof __VLS_9) => any;
9
9
  } & {
@@ -0,0 +1,25 @@
1
+ import type { MaybeRef } from 'vue';
2
+ import type { MagicTraySide } from '../types/index.js';
3
+ interface MagicTrayTriggerProps {
4
+ id?: MaybeRef<string>;
5
+ side: MagicTraySide;
6
+ disabled?: boolean;
7
+ preventEdgeNavigation?: boolean;
8
+ asChild?: boolean;
9
+ }
10
+ declare var __VLS_11: {
11
+ dragging: boolean;
12
+ disabled: any;
13
+ };
14
+ type __VLS_Slots = {} & {
15
+ default?: (props: typeof __VLS_11) => any;
16
+ };
17
+ declare const __VLS_base: import("vue").DefineComponent<MagicTrayTriggerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MagicTrayTriggerProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
21
+ type __VLS_WithSlots<T, S> = T & {
22
+ new (): {
23
+ $slots: S;
24
+ };
25
+ };
@@ -0,0 +1,90 @@
1
+ <template>
2
+ <vue-primitive
3
+ class="magic-tray-trigger"
4
+ :as-child="asChild"
5
+ :data-id="`${mappedId}-trigger`"
6
+ :data-side="side"
7
+ :data-dragging="active"
8
+ :data-dragged="hasDragged"
9
+ :data-disabled="mappedDisabled"
10
+ @pointerdown="guardedPointerdown"
11
+ @touchstart="guardedTouchstart"
12
+ >
13
+ <slot :dragging="active" :disabled="mappedDisabled" />
14
+ </vue-primitive>
15
+ </template>
16
+
17
+ <script setup>
18
+ import { computed, inject, toValue } from "vue";
19
+ import { VuePrimitive } from "@maas/vue-primitive";
20
+ import { useMagicError } from "@maas/vue-equipment/plugins/MagicError";
21
+ import { useTrayState } from "../composables/private/useTrayState";
22
+ import { useTrayGesture } from "../composables/private/useTrayGesture";
23
+ import { MagicTrayInstanceId } from "../symbols";
24
+ const { id, side, disabled, preventEdgeNavigation, asChild } = defineProps({
25
+ id: { type: null, required: false },
26
+ side: { type: String, required: true },
27
+ disabled: { type: Boolean, required: false },
28
+ preventEdgeNavigation: { type: Boolean, required: false },
29
+ asChild: { type: Boolean, required: false }
30
+ });
31
+ const injectedInstanceId = inject(MagicTrayInstanceId, void 0);
32
+ const mappedInstanceId = computed(() => id ?? injectedInstanceId);
33
+ const magicError = useMagicError({
34
+ prefix: "MagicTray",
35
+ source: "MagicTrayTrigger"
36
+ });
37
+ magicError.assert(mappedInstanceId.value, {
38
+ message: "MagicTrayTrigger must be nested inside MagicTrayProvider or an id must be provided",
39
+ errorCode: "missing_instance_id"
40
+ });
41
+ const mappedId = computed(() => toValue(mappedInstanceId.value ?? ""));
42
+ const { initializeState } = useTrayState(mappedId);
43
+ const state = initializeState();
44
+ const { active, hasDragged, onPointerdown, onTouchstart } = useTrayGesture({
45
+ id: mappedId,
46
+ state,
47
+ selectionLock: "drag",
48
+ preventEdgeNavigation: () => preventEdgeNavigation ?? state.options.preventEdgeNavigation
49
+ });
50
+ const mappedDisabled = computed(() => disabled || state.options.disabled);
51
+ function isEditable(target) {
52
+ if (!(target instanceof Element)) {
53
+ return false;
54
+ }
55
+ return target.closest("input, textarea, select") !== null || target instanceof HTMLElement && target.isContentEditable;
56
+ }
57
+ function canDrag(event) {
58
+ return !mappedDisabled.value && !isEditable(event.target);
59
+ }
60
+ function guardedPointerdown(event) {
61
+ if (canDrag(event)) {
62
+ onPointerdown(side, event);
63
+ }
64
+ }
65
+ function guardedTouchstart(event) {
66
+ if (canDrag(event)) {
67
+ onTouchstart(side, event);
68
+ }
69
+ }
70
+ </script>
71
+
72
+ <style>
73
+ .magic-tray-trigger[data-disabled='false'][data-side='left'],
74
+ .magic-tray-trigger[data-disabled='false'][data-side='right'] {
75
+ touch-action: var(--magic-tray-trigger-touch-action, pan-y);
76
+ }
77
+
78
+ .magic-tray-trigger[data-disabled='false'][data-side='top'],
79
+ .magic-tray-trigger[data-disabled='false'][data-side='bottom'] {
80
+ touch-action: var(--magic-tray-trigger-touch-action, pan-x);
81
+ }
82
+
83
+ .magic-tray-trigger[data-dragging='true'] * {
84
+ -webkit-user-drag: none;
85
+ }
86
+
87
+ .magic-tray-trigger[data-dragged='true'] * {
88
+ pointer-events: none;
89
+ }
90
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { MaybeRef } from 'vue';
2
+ import type { MagicTraySide } from '../types/index.js';
3
+ interface MagicTrayTriggerProps {
4
+ id?: MaybeRef<string>;
5
+ side: MagicTraySide;
6
+ disabled?: boolean;
7
+ preventEdgeNavigation?: boolean;
8
+ asChild?: boolean;
9
+ }
10
+ declare var __VLS_11: {
11
+ dragging: boolean;
12
+ disabled: any;
13
+ };
14
+ type __VLS_Slots = {} & {
15
+ default?: (props: typeof __VLS_11) => any;
16
+ };
17
+ declare const __VLS_base: import("vue").DefineComponent<MagicTrayTriggerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MagicTrayTriggerProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
21
+ type __VLS_WithSlots<T, S> = T & {
22
+ new (): {
23
+ $slots: S;
24
+ };
25
+ };
@@ -32,10 +32,6 @@ export declare function useTrayDrag(args: UseTrayDragArgs): {
32
32
  '--magic-tray-handle-magnetic': string;
33
33
  left?: undefined;
34
34
  };
35
- hasDragged: import("vue").ComputedRef<boolean>;
36
35
  dimension: (side: MagicTraySide) => number;
37
- onHandlePointerdown: (side: MagicTraySide, e: PointerEvent) => void;
38
- onHandleTouchstart: (side: MagicTraySide, e: TouchEvent) => void;
39
- onHandleClick: (e: MouseEvent) => void;
40
36
  };
41
37
  export {};