@maas/vue-equipment 0.19.0 → 0.19.1

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,5 +1,5 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment/nuxt",
3
3
  "configKey": "vueEquipment",
4
- "version": "0.18.1"
4
+ "version": "0.19.0"
5
5
  }
@@ -55,6 +55,7 @@
55
55
  @close="closeIfAllowed"
56
56
  />
57
57
  <slot v-else />
58
+ <div v-if="hasDragged" class="magic-drawer__overlay" />
58
59
  </div>
59
60
  </div>
60
61
  </transition>
@@ -141,7 +142,7 @@ const {
141
142
  removeScrollLockPadding,
142
143
  } = drawerApi
143
144
 
144
- const { onPointerdown, onClick, dragging, style } = useDrawerDrag({
145
+ const { onPointerdown, onClick, dragging, hasDragged, style } = useDrawerDrag({
145
146
  id: props.id,
146
147
  isActive,
147
148
  elRef,
@@ -290,5 +291,5 @@ onBeforeUnmount(() => {
290
291
  </script>
291
292
 
292
293
  <style>
293
- :root{--magic-drawer-height:75svh;--magic-drawer-width:100%;--magic-drawer-z-index:999;--magic-drawer-justify-content:center;--magic-drawer-align-items:flex-end;--magic-drawer-backdrop-color:rgba(0,0,0,.5);--magic-drawer-backdrop-filter:unset;--magic-drawer-content-overflow-x:hidden;--magic-drawer-content-overflow-y:hidden;--magic-drawer-handle-wrapper-height:2rem;--magic-drawer-handle-width:3rem;--magic-drawer-handle-height:0.375rem;--magic-drawer-handle-color:#d4d4d8;--magic-drawer-handle-border-radius:0.25rem;--magic-drawer-enter-animation:slide-btt-in 300ms ease;--magic-drawer-leave-animation:slide-btt-out 300ms ease;--magic-drawer-drag-overshoot:4rem;--magic-drawer-drag-overshoot-x:0rem;--magic-drawer-drag-overshoot-y:0rem;--magic-drawer-padding:0rem}.magic-drawer{align-items:var(--magic-drawer-align-items);background:transparent;border:none;color:inherit;display:flex;height:100%;inset:0;justify-content:var(--magic-drawer-justify-content);padding:0;pointer-events:none;position:fixed;width:100%;z-index:var(--magic-drawer-z-index)}.magic-drawer.-bottom{--magic-drawer-drag-overshoot-y:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 0 var(--magic-drawer-drag-overshoot-y) 0}.magic-drawer.-top{--magic-drawer-enter-animation:slide-ttb-in 300ms ease;--magic-drawer-leave-animation:slide-ttb-out 300ms ease;--magic-drawer-align-items:flex-start;--magic-drawer-drag-overshoot-y:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:var(--magic-drawer-drag-overshoot-y) 0 0 0}.magic-drawer.-right{--magic-drawer-enter-animation:slide-rtl-in 300ms ease;--magic-drawer-leave-animation:slide-rtl-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-end;--magic-drawer-drag-overshoot-x:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 var(--magic-drawer-drag-overshoot-x) 0 0}.magic-drawer.-left{--magic-drawer-enter-animation:slide-ltr-in 300ms ease;--magic-drawer-leave-animation:slide-ltr-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-start;--magic-drawer-drag-overshoot-x:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:0 0 0 var(--magic-drawer-drag-overshoot-x)}.magic-drawer__wrapper{height:calc(var(--magic-drawer-height) + var(--magic-drawer-drag-overshoot-y));pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:calc(var(--magic-drawer-width) + var(--magic-drawer-drag-overshoot-x))}.magic-drawer__content{height:100%;max-height:100%;position:relative;width:100%}.magic-drawer__drag{-webkit-overflow-scrolling:touch;align-items:var(--magic-drawer-align-items);cursor:grab;display:flex;height:100%;justify-content:var(--magic-drawer-justify-content);overflow-x:var(--magic-drawer-content-overflow-x);overflow-y:var(--magic-drawer-content-overflow-y);pointer-events:auto;position:relative;scroll-behavior:smooth;width:100%}.magic-drawer.-dragging .magic-drawer__drag{cursor:grabbing}.magic-drawer__drag>*{padding:var(--magic-drawer-padding)}.magic-drawer__backdrop{-webkit-backdrop-filter:var(--magic-drawer-backdrop-filter);backdrop-filter:var(--magic-drawer-backdrop-filter);background-color:var(--magic-drawer-backdrop-color);bottom:0;height:100%;left:0;pointer-events:auto;position:fixed;right:0;top:0;width:100%;z-index:-1}.magic-drawer--content-enter-active{animation:var(--magic-drawer-enter-animation)}.magic-drawer--content-leave-active{animation:var(--magic-drawer-leave-animation)}.magic-drawer--backdrop-enter-active{animation:fade-in .3s ease}.magic-drawer--backdrop-leave-active{animation:fade-out .3s ease}
294
+ :root{--magic-drawer-height:75svh;--magic-drawer-width:100%;--magic-drawer-z-index:999;--magic-drawer-justify-content:center;--magic-drawer-align-items:flex-end;--magic-drawer-backdrop-color:rgba(0,0,0,.5);--magic-drawer-backdrop-filter:unset;--magic-drawer-content-overflow-x:hidden;--magic-drawer-content-overflow-y:hidden;--magic-drawer-handle-wrapper-height:2rem;--magic-drawer-handle-width:3rem;--magic-drawer-handle-height:0.375rem;--magic-drawer-handle-color:#d4d4d8;--magic-drawer-handle-border-radius:0.25rem;--magic-drawer-enter-animation:slide-btt-in 300ms ease;--magic-drawer-leave-animation:slide-btt-out 300ms ease;--magic-drawer-drag-overshoot:4rem;--magic-drawer-drag-overshoot-x:0rem;--magic-drawer-drag-overshoot-y:0rem;--magic-drawer-padding:0rem}.magic-drawer{align-items:var(--magic-drawer-align-items);background:transparent;border:none;color:inherit;display:flex;height:100%;inset:0;justify-content:var(--magic-drawer-justify-content);padding:0;pointer-events:none;position:fixed;width:100%;z-index:var(--magic-drawer-z-index)}.magic-drawer.-bottom{--magic-drawer-drag-overshoot-y:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 0 var(--magic-drawer-drag-overshoot-y) 0}.magic-drawer.-top{--magic-drawer-enter-animation:slide-ttb-in 300ms ease;--magic-drawer-leave-animation:slide-ttb-out 300ms ease;--magic-drawer-align-items:flex-start;--magic-drawer-drag-overshoot-y:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:var(--magic-drawer-drag-overshoot-y) 0 0 0}.magic-drawer.-right{--magic-drawer-enter-animation:slide-rtl-in 300ms ease;--magic-drawer-leave-animation:slide-rtl-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-end;--magic-drawer-drag-overshoot-x:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 var(--magic-drawer-drag-overshoot-x) 0 0}.magic-drawer.-left{--magic-drawer-enter-animation:slide-ltr-in 300ms ease;--magic-drawer-leave-animation:slide-ltr-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-start;--magic-drawer-drag-overshoot-x:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:0 0 0 var(--magic-drawer-drag-overshoot-x)}.magic-drawer__wrapper{height:calc(var(--magic-drawer-height) + var(--magic-drawer-drag-overshoot-y));pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:calc(var(--magic-drawer-width) + var(--magic-drawer-drag-overshoot-x))}.magic-drawer__content{height:100%;max-height:100%;position:relative;width:100%}.magic-drawer__drag{-webkit-overflow-scrolling:touch;align-items:var(--magic-drawer-align-items);cursor:grab;display:flex;height:100%;justify-content:var(--magic-drawer-justify-content);overflow-x:var(--magic-drawer-content-overflow-x);overflow-y:var(--magic-drawer-content-overflow-y);pointer-events:auto;position:relative;scroll-behavior:smooth;width:100%}.magic-drawer.-dragging .magic-drawer__drag{cursor:grabbing}.magic-drawer__drag>*{padding:var(--magic-drawer-padding)}.magic-drawer__overlay{inset:0;position:absolute;z-index:9999}.magic-drawer__backdrop{-webkit-backdrop-filter:var(--magic-drawer-backdrop-filter);backdrop-filter:var(--magic-drawer-backdrop-filter);background-color:var(--magic-drawer-backdrop-color);bottom:0;height:100%;left:0;pointer-events:auto;position:fixed;right:0;top:0;width:100%;z-index:-1}.magic-drawer--content-enter-active{animation:var(--magic-drawer-enter-animation)}.magic-drawer--content-leave-active{animation:var(--magic-drawer-leave-animation)}.magic-drawer--backdrop-enter-active{animation:fade-in .3s ease}.magic-drawer--backdrop-leave-active{animation:fade-out .3s ease}
294
295
  </style>
@@ -1,6 +1,5 @@
1
1
  import { type Ref, type MaybeRef } from 'vue';
2
2
  import { type DefaultOptions } from '../../utils/defaultOptions.js';
3
- import type { CustomMouseEvent } from '../../types.js';
4
3
  type UseDrawerDragArgs = {
5
4
  id: MaybeRef<string>;
6
5
  isActive: MaybeRef<boolean>;
@@ -18,7 +17,8 @@ export declare function useDrawerDrag(args: UseDrawerDragArgs): {
18
17
  draggedX: Ref<number>;
19
18
  draggedY: Ref<number>;
20
19
  dragging: Ref<boolean>;
20
+ hasDragged: import("vue").ComputedRef<boolean>;
21
21
  onPointerdown: (e: PointerEvent) => void;
22
- onClick: (e: CustomMouseEvent) => Promise<void>;
22
+ onClick: (e: MouseEvent) => Promise<void>;
23
23
  };
24
24
  export {};
@@ -17,7 +17,6 @@ import {
17
17
  import { useDrawerEmitter } from "../useDrawerEmitter.mjs";
18
18
  import { useDrawerSnap } from "./useDrawerSnap.mjs";
19
19
  import { useDrawerGuards } from "./useDrawerGuards.mjs";
20
- import { useDrawerEventHandler } from "./useDrawerEventHandler.mjs";
21
20
  import { isIOS } from "@maas/vue-equipment/utils";
22
21
  export function useDrawerDrag(args) {
23
22
  const {
@@ -44,6 +43,8 @@ export function useDrawerDrag(args) {
44
43
  const originY = ref(0);
45
44
  const pointerdownX = ref(0);
46
45
  const pointerdownY = ref(0);
46
+ const lastDraggedX = ref(0);
47
+ const lastDraggedY = ref(0);
47
48
  const relDirectionY = ref("absolute");
48
49
  const relDirectionX = ref("absolute");
49
50
  const absDirectionY = ref(void 0);
@@ -53,8 +54,9 @@ export function useDrawerDrag(args) {
53
54
  const duration = computed(() => toValue(snap)?.duration);
54
55
  const draggedX = ref(0);
55
56
  const draggedY = ref(0);
56
- const lastDraggedX = ref(0);
57
- const lastDraggedY = ref(0);
57
+ const hasDragged = computed(() => {
58
+ return lastDraggedX.value !== draggedX.value || lastDraggedY.value !== draggedY.value;
59
+ });
58
60
  const style = computed(
59
61
  () => `transform: translate(${draggedX.value}px, ${draggedY.value}px)`
60
62
  );
@@ -85,7 +87,6 @@ export function useDrawerDrag(args) {
85
87
  position,
86
88
  activeSnapPoint
87
89
  });
88
- const { clickEvent, dispatchEvent } = useDrawerEventHandler();
89
90
  async function getSizes() {
90
91
  elRect.value = unrefElement(elRef)?.getBoundingClientRect();
91
92
  wrapperRect.value = unrefElement(wrapperRef)?.getBoundingClientRect();
@@ -242,6 +243,8 @@ export function useDrawerDrag(args) {
242
243
  function resetDragged() {
243
244
  draggedX.value = 0;
244
245
  draggedY.value = 0;
246
+ lastDraggedX.value = 0;
247
+ lastDraggedY.value = 0;
245
248
  }
246
249
  function resetSnapped() {
247
250
  snappedX.value = 0;
@@ -307,6 +310,9 @@ export function useDrawerDrag(args) {
307
310
  }
308
311
  resetStateAndListeners();
309
312
  resetScrollLock();
313
+ if (hasDragged.value) {
314
+ e.preventDefault();
315
+ }
310
316
  }
311
317
  function onPointermove(e) {
312
318
  shouldClose.value = false;
@@ -326,10 +332,6 @@ export function useDrawerDrag(args) {
326
332
  checkPosition({ x: e.screenX, y: e.screenY });
327
333
  }
328
334
  function onPointerdown(e) {
329
- const tag = e.target.tagName;
330
- if (tag === "A") {
331
- e.preventDefault();
332
- }
333
335
  if (dragging.value) {
334
336
  return;
335
337
  } else {
@@ -337,7 +339,6 @@ export function useDrawerDrag(args) {
337
339
  }
338
340
  lastDraggedX.value = draggedX.value;
339
341
  lastDraggedY.value = draggedY.value;
340
- e.target.setPointerCapture(e.pointerId);
341
342
  cancelPointerup = useEventListener(document, "pointerup", onPointerup);
342
343
  cancelPointermove = useEventListener(document, "pointermove", onPointermove);
343
344
  cancelTouchend = isIOS() ? useEventListener(document, "touchend", onPointerup) : void 0;
@@ -349,16 +350,9 @@ export function useDrawerDrag(args) {
349
350
  onPointermove(e);
350
351
  }
351
352
  async function onClick(e) {
352
- if (e.custom === "magic-drawer-clone") {
353
- clickEvent.value = void 0;
354
- return;
355
- } else {
356
- clickEvent.value = e;
353
+ if (hasDragged.value) {
357
354
  e.preventDefault();
358
355
  }
359
- if (lastDraggedX.value === draggedX.value && lastDraggedY.value === draggedY.value) {
360
- dispatchEvent(clickEvent.value);
361
- }
362
356
  }
363
357
  onMounted(async () => {
364
358
  await getSizes();
@@ -372,6 +366,12 @@ export function useDrawerDrag(args) {
372
366
  snapTo({ snapPoint, interpolate: false });
373
367
  }
374
368
  );
369
+ watch(snappedX, (value) => {
370
+ lastDraggedX.value = value;
371
+ });
372
+ watch(snappedY, (value) => {
373
+ lastDraggedY.value = value;
374
+ });
375
375
  useResizeObserver(elRef, async () => {
376
376
  useThrottleFn(async () => {
377
377
  await getSizes();
@@ -389,6 +389,7 @@ export function useDrawerDrag(args) {
389
389
  draggedX,
390
390
  draggedY,
391
391
  dragging,
392
+ hasDragged,
392
393
  onPointerdown,
393
394
  onClick
394
395
  };
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.19.0",
4
+ "version": "0.19.1",
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",
@@ -1,68 +0,0 @@
1
- export declare function useDrawerEventHandler(): {
2
- clickEvent: import("vue").Ref<{
3
- readonly altKey: boolean;
4
- readonly button: number;
5
- readonly buttons: number;
6
- readonly clientX: number;
7
- readonly clientY: number;
8
- readonly ctrlKey: boolean;
9
- readonly metaKey: boolean;
10
- readonly movementX: number;
11
- readonly movementY: number;
12
- readonly offsetX: number;
13
- readonly offsetY: number;
14
- readonly pageX: number;
15
- readonly pageY: number;
16
- readonly relatedTarget: {
17
- addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
18
- dispatchEvent: (event: Event) => boolean;
19
- removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
20
- } | null;
21
- readonly screenX: number;
22
- readonly screenY: number;
23
- readonly shiftKey: boolean;
24
- readonly x: number;
25
- readonly y: number;
26
- getModifierState: (keyArg: string) => boolean;
27
- initMouseEvent: (typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget | null) => void;
28
- readonly detail: number;
29
- readonly view: Window | null;
30
- readonly which: number;
31
- initUIEvent: (typeArg: string, bubblesArg?: boolean | undefined, cancelableArg?: boolean | undefined, viewArg?: Window | null | undefined, detailArg?: number | undefined) => void;
32
- readonly bubbles: boolean;
33
- cancelBubble: boolean;
34
- readonly cancelable: boolean;
35
- readonly composed: boolean;
36
- readonly currentTarget: {
37
- addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
38
- dispatchEvent: (event: Event) => boolean;
39
- removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
40
- } | null;
41
- readonly defaultPrevented: boolean;
42
- readonly eventPhase: number;
43
- readonly isTrusted: boolean;
44
- returnValue: boolean;
45
- readonly srcElement: {
46
- addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
47
- dispatchEvent: (event: Event) => boolean;
48
- removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
49
- } | null;
50
- readonly target: {
51
- addEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined) => void;
52
- dispatchEvent: (event: Event) => boolean;
53
- removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions | undefined) => void;
54
- } | null;
55
- readonly timeStamp: number;
56
- readonly type: string;
57
- composedPath: () => EventTarget[];
58
- initEvent: (type: string, bubbles?: boolean | undefined, cancelable?: boolean | undefined) => void;
59
- preventDefault: () => void;
60
- stopImmediatePropagation: () => void;
61
- stopPropagation: () => void;
62
- readonly NONE: 0;
63
- readonly CAPTURING_PHASE: 1;
64
- readonly AT_TARGET: 2;
65
- readonly BUBBLING_PHASE: 3;
66
- } | undefined>;
67
- dispatchEvent: (e: MouseEvent | PointerEvent) => void;
68
- };
@@ -1,14 +0,0 @@
1
- import { ref } from "vue";
2
- export function useDrawerEventHandler() {
3
- const clickEvent = ref(void 0);
4
- function dispatchEvent(e) {
5
- const target = e.target;
6
- const clone = new e.constructor(e.type, e);
7
- clone.custom = "magic-drawer-clone";
8
- target.dispatchEvent(clone);
9
- }
10
- return {
11
- clickEvent,
12
- dispatchEvent
13
- };
14
- }