@maas/vue-equipment 0.16.7 → 0.16.9
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/MagicDrawer/src/components/MagicDrawer.vue +1 -1
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +68 -16
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerGuards.d.ts +16 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerGuards.mjs +154 -0
- package/dist/utils/index.js +1 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +1 -2
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/nuxt/module.json
CHANGED
|
@@ -290,5 +290,5 @@ onBeforeUnmount(() => {
|
|
|
290
290
|
</script>
|
|
291
291
|
|
|
292
292
|
<style>
|
|
293
|
-
:root{--magic-drawer-height:75svh;--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-y:auto;--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:0;--magic-drawer-drag-overshoot-y:0}.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.-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.-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.-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__wrapper{height:calc(var(--magic-drawer-height) + var(--magic-drawer-drag-overshoot));pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:100%}.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-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__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}
|
|
293
|
+
:root{--magic-drawer-height:75svh;--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:auto;--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:0;--magic-drawer-drag-overshoot-y:0}.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.-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.-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.-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__wrapper{height:calc(var(--magic-drawer-height) + var(--magic-drawer-drag-overshoot));pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:100%}.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__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
294
|
</style>
|
|
@@ -11,10 +11,13 @@ import {
|
|
|
11
11
|
useEventListener,
|
|
12
12
|
unrefElement,
|
|
13
13
|
useResizeObserver,
|
|
14
|
-
useThrottleFn
|
|
14
|
+
useThrottleFn,
|
|
15
|
+
useScrollLock
|
|
15
16
|
} from "@vueuse/core";
|
|
16
17
|
import { useDrawerEmitter } from "../useDrawerEmitter.mjs";
|
|
17
18
|
import { useDrawerSnap } from "./useDrawerSnap.mjs";
|
|
19
|
+
import { useDrawerGuards } from "./useDrawerGuards.mjs";
|
|
20
|
+
import { isIOS } from "@maas/vue-equipment/utils";
|
|
18
21
|
export function useDrawerDrag(args) {
|
|
19
22
|
const {
|
|
20
23
|
id,
|
|
@@ -35,10 +38,14 @@ export function useDrawerDrag(args) {
|
|
|
35
38
|
const interpolateTo = ref(void 0);
|
|
36
39
|
let cancelPointerup = void 0;
|
|
37
40
|
let cancelPointermove = void 0;
|
|
41
|
+
let cancelTouchend = void 0;
|
|
42
|
+
let scrollLock = void 0;
|
|
38
43
|
const originX = ref(0);
|
|
39
44
|
const originY = ref(0);
|
|
40
|
-
const
|
|
41
|
-
const
|
|
45
|
+
const relDirectionY = ref("absolute");
|
|
46
|
+
const relDirectionX = ref("absolute");
|
|
47
|
+
const absDirectionY = ref(void 0);
|
|
48
|
+
const absDirectionX = ref(void 0);
|
|
42
49
|
const hasSnapPoints = computed(() => toValue(snapPoints).length > 1);
|
|
43
50
|
const elRect = ref(void 0);
|
|
44
51
|
const wrapperRect = ref(void 0);
|
|
@@ -67,6 +74,13 @@ export function useDrawerDrag(args) {
|
|
|
67
74
|
draggedY,
|
|
68
75
|
draggedX
|
|
69
76
|
});
|
|
77
|
+
const { canDrag, canInterpolate, lockScroll } = useDrawerGuards({
|
|
78
|
+
elRef,
|
|
79
|
+
absDirectionX,
|
|
80
|
+
absDirectionY,
|
|
81
|
+
position,
|
|
82
|
+
activeSnapPoint
|
|
83
|
+
});
|
|
70
84
|
async function getSizes() {
|
|
71
85
|
elRect.value = unrefElement(elRef)?.getBoundingClientRect();
|
|
72
86
|
wrapperRect.value = unrefElement(wrapperRef)?.getBoundingClientRect();
|
|
@@ -78,7 +92,7 @@ export function useDrawerDrag(args) {
|
|
|
78
92
|
const snapPointB = await findClosestSnapPoint({
|
|
79
93
|
draggedX,
|
|
80
94
|
draggedY,
|
|
81
|
-
direction:
|
|
95
|
+
direction: relDirectionY.value
|
|
82
96
|
});
|
|
83
97
|
if (draggedY.value > toValue(threshold).distance || hasSnapPoints.value) {
|
|
84
98
|
if (snapPointB === drawerHeight.value) {
|
|
@@ -92,7 +106,7 @@ export function useDrawerDrag(args) {
|
|
|
92
106
|
const snapPointT = await findClosestSnapPoint({
|
|
93
107
|
draggedX,
|
|
94
108
|
draggedY,
|
|
95
|
-
direction:
|
|
109
|
+
direction: relDirectionY.value
|
|
96
110
|
});
|
|
97
111
|
if (draggedY.value < toValue(threshold).distance * -1 || hasSnapPoints.value) {
|
|
98
112
|
if (snapPointT === drawerHeight.value * -1) {
|
|
@@ -106,7 +120,7 @@ export function useDrawerDrag(args) {
|
|
|
106
120
|
const snapPointR = await findClosestSnapPoint({
|
|
107
121
|
draggedX,
|
|
108
122
|
draggedY,
|
|
109
|
-
direction:
|
|
123
|
+
direction: relDirectionX.value
|
|
110
124
|
});
|
|
111
125
|
if (draggedX.value > toValue(threshold).distance || hasSnapPoints.value) {
|
|
112
126
|
if (snapPointR === drawerWidth.value) {
|
|
@@ -120,7 +134,7 @@ export function useDrawerDrag(args) {
|
|
|
120
134
|
const snapPointL = await findClosestSnapPoint({
|
|
121
135
|
draggedX,
|
|
122
136
|
draggedY,
|
|
123
|
-
direction:
|
|
137
|
+
direction: relDirectionX.value
|
|
124
138
|
});
|
|
125
139
|
if (draggedX.value < toValue(threshold).distance * -1 || hasSnapPoints.value) {
|
|
126
140
|
if (snapPointL === drawerWidth.value * -1) {
|
|
@@ -141,7 +155,7 @@ export function useDrawerDrag(args) {
|
|
|
141
155
|
const snapPointB = await findClosestSnapPoint({
|
|
142
156
|
draggedX,
|
|
143
157
|
draggedY,
|
|
144
|
-
direction:
|
|
158
|
+
direction: relDirectionY.value
|
|
145
159
|
});
|
|
146
160
|
if (velocityY > toValue(threshold).momentum) {
|
|
147
161
|
if (snapPointB === drawerHeight.value) {
|
|
@@ -155,7 +169,7 @@ export function useDrawerDrag(args) {
|
|
|
155
169
|
const snapPointT = await findClosestSnapPoint({
|
|
156
170
|
draggedX,
|
|
157
171
|
draggedY,
|
|
158
|
-
direction:
|
|
172
|
+
direction: relDirectionY.value
|
|
159
173
|
});
|
|
160
174
|
if (velocityY < toValue(threshold).momentum * -1) {
|
|
161
175
|
if (snapPointT === drawerHeight.value) {
|
|
@@ -169,7 +183,7 @@ export function useDrawerDrag(args) {
|
|
|
169
183
|
const snapPointR = await findClosestSnapPoint({
|
|
170
184
|
draggedX,
|
|
171
185
|
draggedY,
|
|
172
|
-
direction:
|
|
186
|
+
direction: relDirectionX.value
|
|
173
187
|
});
|
|
174
188
|
if (velocityX > toValue(threshold).momentum) {
|
|
175
189
|
if (snapPointR === drawerWidth.value) {
|
|
@@ -183,7 +197,7 @@ export function useDrawerDrag(args) {
|
|
|
183
197
|
const snapPointL = await findClosestSnapPoint({
|
|
184
198
|
draggedX,
|
|
185
199
|
draggedY,
|
|
186
|
-
direction:
|
|
200
|
+
direction: relDirectionX.value
|
|
187
201
|
});
|
|
188
202
|
if (velocityX > toValue(threshold).momentum) {
|
|
189
203
|
if (snapPointL === drawerWidth.value) {
|
|
@@ -218,33 +232,56 @@ export function useDrawerDrag(args) {
|
|
|
218
232
|
switch (position) {
|
|
219
233
|
case "bottom":
|
|
220
234
|
const newDraggedB = clamp(y - originY.value, 0, toValue(overshoot) * -1);
|
|
221
|
-
|
|
235
|
+
relDirectionY.value = newDraggedB < draggedY.value ? "below" : "above";
|
|
222
236
|
draggedY.value = newDraggedB;
|
|
223
237
|
break;
|
|
224
238
|
case "top":
|
|
225
239
|
const newDraggedT = clamp(y - originY.value, 0, toValue(overshoot));
|
|
226
|
-
|
|
240
|
+
relDirectionY.value = newDraggedT < draggedY.value ? "below" : "above";
|
|
227
241
|
draggedY.value = newDraggedT;
|
|
228
242
|
break;
|
|
229
243
|
case "right":
|
|
230
244
|
const newDraggedR = clamp(x - originX.value, 0, toValue(overshoot) * -1);
|
|
231
|
-
|
|
245
|
+
relDirectionX.value = newDraggedR < draggedX.value ? "below" : "above";
|
|
232
246
|
draggedX.value = newDraggedR;
|
|
233
247
|
break;
|
|
234
248
|
case "left":
|
|
235
249
|
const newDraggedL = clamp(x - originX.value, 0, toValue(overshoot));
|
|
236
|
-
|
|
250
|
+
relDirectionX.value = newDraggedL < draggedX.value ? "below" : "above";
|
|
237
251
|
draggedX.value = newDraggedL;
|
|
238
252
|
break;
|
|
239
253
|
}
|
|
240
254
|
}
|
|
255
|
+
function checkDirection({ x, y }) {
|
|
256
|
+
switch (position) {
|
|
257
|
+
case "bottom":
|
|
258
|
+
absDirectionY.value = y < originY.value ? "with" : y > originY.value ? "against" : void 0;
|
|
259
|
+
break;
|
|
260
|
+
case "top":
|
|
261
|
+
absDirectionY.value = y > originY.value ? "with" : y < originY.value ? "against" : void 0;
|
|
262
|
+
break;
|
|
263
|
+
case "right":
|
|
264
|
+
absDirectionX.value = x < originX.value ? "with" : x > originX.value ? "against" : void 0;
|
|
265
|
+
break;
|
|
266
|
+
case "left":
|
|
267
|
+
absDirectionX.value = x > originX.value ? "with" : x < originX.value ? "against" : void 0;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
241
271
|
function resetStateAndListeners() {
|
|
242
272
|
dragging.value = false;
|
|
243
273
|
shouldClose.value = false;
|
|
244
274
|
interpolateTo.value = void 0;
|
|
275
|
+
cancelTouchend?.();
|
|
245
276
|
cancelPointerup?.();
|
|
246
277
|
cancelPointermove?.();
|
|
247
278
|
}
|
|
279
|
+
function resetScrollLock() {
|
|
280
|
+
if (scrollLock?.value) {
|
|
281
|
+
scrollLock.value = false;
|
|
282
|
+
}
|
|
283
|
+
scrollLock = void 0;
|
|
284
|
+
}
|
|
248
285
|
function resetDragged() {
|
|
249
286
|
draggedX.value = 0;
|
|
250
287
|
draggedY.value = 0;
|
|
@@ -272,7 +309,9 @@ export function useDrawerDrag(args) {
|
|
|
272
309
|
if (shouldClose.value) {
|
|
273
310
|
close();
|
|
274
311
|
} else if (interpolateTo.value || interpolateTo.value === 0) {
|
|
275
|
-
|
|
312
|
+
if (scrollLock && scrollLock.value || canInterpolate(e.target)) {
|
|
313
|
+
interpolateDragged(interpolateTo.value);
|
|
314
|
+
}
|
|
276
315
|
activeSnapPoint.value = snapPointsMap.value[interpolateTo.value];
|
|
277
316
|
switch (position) {
|
|
278
317
|
case "bottom":
|
|
@@ -297,10 +336,22 @@ export function useDrawerDrag(args) {
|
|
|
297
336
|
}
|
|
298
337
|
}
|
|
299
338
|
resetStateAndListeners();
|
|
339
|
+
resetScrollLock();
|
|
300
340
|
e.preventDefault();
|
|
301
341
|
}
|
|
302
342
|
function onPointermove(e) {
|
|
303
343
|
shouldClose.value = false;
|
|
344
|
+
checkDirection({ x: e.screenX, y: e.screenY });
|
|
345
|
+
if (!scrollLock) {
|
|
346
|
+
const target = lockScroll(e.target);
|
|
347
|
+
if (target) {
|
|
348
|
+
scrollLock = useScrollLock(target);
|
|
349
|
+
scrollLock.value = true;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
if (!canDrag(e.target)) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
304
355
|
checkMomentum({ x: e.screenX, y: e.screenY });
|
|
305
356
|
setDragged({ x: e.screenX, y: e.screenY });
|
|
306
357
|
checkPosition();
|
|
@@ -316,6 +367,7 @@ export function useDrawerDrag(args) {
|
|
|
316
367
|
e.target.setPointerCapture(e.pointerId);
|
|
317
368
|
cancelPointerup = useEventListener(document, "pointerup", onPointerup);
|
|
318
369
|
cancelPointermove = useEventListener(document, "pointermove", onPointermove);
|
|
370
|
+
cancelTouchend = isIOS() ? useEventListener(document, "touchend", onPointerup) : void 0;
|
|
319
371
|
originX.value = e.screenX - draggedX.value;
|
|
320
372
|
originY.value = e.screenY - draggedY.value;
|
|
321
373
|
dragStart.value = /* @__PURE__ */ new Date();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type MaybeRef } from 'vue';
|
|
2
|
+
import { type DefaultOptions } from '../../utils/defaultOptions.js';
|
|
3
|
+
import { type SnapPoint } from '../../types.js';
|
|
4
|
+
interface UseDrawerGuardsArgs {
|
|
5
|
+
elRef: MaybeRef<HTMLDivElement | undefined>;
|
|
6
|
+
absDirectionX: MaybeRef<'with' | 'against' | undefined>;
|
|
7
|
+
absDirectionY: MaybeRef<'with' | 'against' | undefined>;
|
|
8
|
+
position: MaybeRef<DefaultOptions['position']>;
|
|
9
|
+
activeSnapPoint: MaybeRef<SnapPoint | undefined>;
|
|
10
|
+
}
|
|
11
|
+
export declare function useDrawerGuards(args: UseDrawerGuardsArgs): {
|
|
12
|
+
canDrag: (el: EventTarget) => boolean;
|
|
13
|
+
canInterpolate: (el: EventTarget) => boolean | undefined;
|
|
14
|
+
lockScroll: (el: EventTarget) => HTMLElement | undefined;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { computed, toValue } from "vue";
|
|
2
|
+
import { unrefElement } from "@vueuse/core";
|
|
3
|
+
export function useDrawerGuards(args) {
|
|
4
|
+
const { elRef, absDirectionX, absDirectionY, position, activeSnapPoint } = args;
|
|
5
|
+
const isHoverSupported = computed(() => {
|
|
6
|
+
return typeof window !== "undefined" && matchMedia("(hover: hover)").matches;
|
|
7
|
+
});
|
|
8
|
+
const canSnap = computed(() => {
|
|
9
|
+
return toValue(activeSnapPoint) !== 1 && !!toValue(activeSnapPoint);
|
|
10
|
+
});
|
|
11
|
+
function canDrag(el) {
|
|
12
|
+
let element = el;
|
|
13
|
+
if (isHoverSupported.value) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (canSnap.value) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
while (element) {
|
|
20
|
+
if (element === unrefElement(elRef)) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
switch (position) {
|
|
24
|
+
case "bottom":
|
|
25
|
+
if (element.scrollHeight > element.clientHeight) {
|
|
26
|
+
if (element.scrollTop > 0) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (toValue(absDirectionY) === "with") {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
case "top":
|
|
35
|
+
if (element.scrollHeight > element.clientHeight) {
|
|
36
|
+
const maxScroll = element.scrollHeight - element.clientHeight;
|
|
37
|
+
if (element.scrollTop < maxScroll) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (toValue(absDirectionY) === "with") {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
case "right":
|
|
46
|
+
if (element.scrollWidth > element.clientWidth) {
|
|
47
|
+
if (element.scrollLeft > 0) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (toValue(absDirectionX) === "with") {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
case "left":
|
|
56
|
+
if (element.scrollWidth > element.clientWidth) {
|
|
57
|
+
const maxScroll = element.scrollWidth - element.clientWidth;
|
|
58
|
+
if (element.scrollLeft < maxScroll) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (toValue(absDirectionX) === "with") {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
element = element.parentNode;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
function canInterpolate(el) {
|
|
72
|
+
let element = el;
|
|
73
|
+
if (isHoverSupported.value) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
while (element) {
|
|
77
|
+
switch (position) {
|
|
78
|
+
case "bottom":
|
|
79
|
+
case "top":
|
|
80
|
+
if (element.scrollHeight > element.clientHeight) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case "left":
|
|
85
|
+
case "right":
|
|
86
|
+
if (element.scrollWidth > element.clientWidth) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (element === unrefElement(elRef)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
element = element.parentNode;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function lockScroll(el) {
|
|
98
|
+
let element = el;
|
|
99
|
+
if (isHoverSupported.value) {
|
|
100
|
+
return void 0;
|
|
101
|
+
}
|
|
102
|
+
while (element) {
|
|
103
|
+
if (element === unrefElement(elRef)) {
|
|
104
|
+
return void 0;
|
|
105
|
+
}
|
|
106
|
+
switch (position) {
|
|
107
|
+
case "bottom":
|
|
108
|
+
if (element.scrollHeight > element.clientHeight) {
|
|
109
|
+
if (element.scrollTop === 0 || canSnap.value) {
|
|
110
|
+
if (toValue(absDirectionY) === "against") {
|
|
111
|
+
return element;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
116
|
+
case "top":
|
|
117
|
+
if (element.scrollHeight > element.clientHeight) {
|
|
118
|
+
const maxScroll = element.scrollHeight - element.clientHeight;
|
|
119
|
+
if (element.scrollTop === maxScroll || canSnap.value) {
|
|
120
|
+
if (toValue(absDirectionY) === "against") {
|
|
121
|
+
return element;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
case "right":
|
|
127
|
+
if (element.scrollWidth > element.clientWidth) {
|
|
128
|
+
if (element.scrollLeft === 0 || canSnap.value) {
|
|
129
|
+
if (toValue(absDirectionX) === "against") {
|
|
130
|
+
return element;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
break;
|
|
135
|
+
case "left":
|
|
136
|
+
if (element.scrollWidth > element.clientWidth) {
|
|
137
|
+
const maxScroll = element.scrollWidth - element.clientWidth;
|
|
138
|
+
if (element.scrollLeft === maxScroll || canSnap.value) {
|
|
139
|
+
if (toValue(absDirectionX) === "against") {
|
|
140
|
+
return element;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
element = element.parentNode;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
canDrag,
|
|
151
|
+
canInterpolate,
|
|
152
|
+
lockScroll
|
|
153
|
+
};
|
|
154
|
+
}
|
package/dist/utils/index.js
CHANGED
|
@@ -39,11 +39,10 @@ function clampValue(value, min, max) {
|
|
|
39
39
|
function interpolate(args) {
|
|
40
40
|
const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args;
|
|
41
41
|
let startTime;
|
|
42
|
-
const speed = 1;
|
|
43
42
|
function animate(timestamp) {
|
|
44
43
|
if (!startTime)
|
|
45
44
|
startTime = timestamp;
|
|
46
|
-
const progress = Math.min(1, (timestamp - startTime) /
|
|
45
|
+
const progress = Math.min(1, (timestamp - startTime) / duration);
|
|
47
46
|
const easedProgress = easing(progress);
|
|
48
47
|
const value = from + (to - from) * easedProgress;
|
|
49
48
|
callback(value);
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/utils/index.ts","../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export * from './src/functions/clampValue'\nexport * from './src/functions/interpolate'\nexport * from './src/functions/isIOS'\nexport * from './src/functions/mapValue'\nexport * from './src/functions/uuid'\nexport * from './src/functions/uniq'\nexport * from './src/functions/slugify'\n\nexport type * from './src/types'\n","export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n
|
|
1
|
+
{"version":3,"sources":["../../packages/utils/index.ts","../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export * from './src/functions/clampValue'\nexport * from './src/functions/interpolate'\nexport * from './src/functions/isIOS'\nexport * from './src/functions/mapValue'\nexport * from './src/functions/uuid'\nexport * from './src/functions/uniq'\nexport * from './src/functions/slugify'\n\nexport type * from './src/types'\n","export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n\n function animate(timestamp: number) {\n if (!startTime) startTime = timestamp\n\n const progress = Math.min(1, (timestamp - startTime) / duration)\n const easedProgress = easing(progress)\n const value = from + (to - from) * easedProgress\n\n callback(value)\n\n if (progress < 1) {\n requestAnimationFrame(animate)\n }\n }\n\n requestAnimationFrame(animate)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;ACOO,SAAS,YAAY,MAAuB;AACjD,QAAM,EAAE,MAAM,IAAI,UAAU,UAAU,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI;AAEtE,MAAI;AAEJ,WAAS,QAAQ,WAAmB;AAClC,QAAI,CAAC;AAAW,kBAAY;AAE5B,UAAM,WAAW,KAAK,IAAI,IAAI,YAAY,aAAa,QAAQ;AAC/D,UAAM,gBAAgB,OAAO,QAAQ;AACrC,UAAM,QAAQ,QAAQ,KAAK,QAAQ;AAEnC,aAAS,KAAK;AAEd,QAAI,WAAW,GAAG;AAChB,4BAAsB,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,wBAAsB,OAAO;AAC/B;;;AC7BO,SAAS,QAAQ;AACtB,MAAI,OAAO,WAAW;AAAa,WAAO;AAC1C,SAAO,mBAAmB,KAAK,uCAAW,SAAS;AACrD;;;ACHO,SAAS,SACd,OACA,OACA,OACA,QACA,QACA;AACA,UAAS,QAAQ,UAAU,SAAS,WAAY,QAAQ,SAAS;AACnE;;;ACJO,SAAS,OAAO;AACrB,SAAO,uCACJ,MAAM,EAAE,EACR;AAAA,IACC,CAAC,GAAG,MACF,KACC,MAAM,MACH,KAAK,MAAM,KAAK,OAAO,IAAI,EAAG,EAAE,SAAS,EAAE,IAC3C,MAAM,MACN,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,SAAS,EAAE,IAC7C;AAAA,IACN;AAAA,EACF;AACJ;;;ACjBO,SAAS,KAAsB,GAAM;AAC1C,SAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;AAC9B;;;ACMA,IAAM,iBAAiC;AAAA,EACrC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,SAAS,QAAQ,QAAgB,SAAkC;AACxE,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAGA,QAAM,WAAW,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAEjD,QAAM,UAAqC,CAAC;AAE5C,MAAI,OAAO,OACR,UAAU,EACV,MAAM,EAAE,EACR,OAAO,SAAU,QAAQ,IAAI;AAC5B,QAAI,aAAa,QAAQ,EAAE;AAC3B,QAAI,eAAe;AAAW,mBAAa;AAC3C,QAAI,gBAAe,qCAAU;AAAW,mBAAa;AACrD,WACE,SACA,WAAW,SAAQ,qCAAU,WAAU,4BAA4B,EAAE;AAAA,EAEzE,GAAG,EAAE;AAEP,MAAI,SAAS,QAAQ;AACnB,WAAO,KAAK,QAAQ,mBAAmB,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,QAAQ,OAAO,SAAS,SAAS;AAAA,EAC/C;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAEA,SAAO;AACT;","names":[]}
|
package/dist/utils/index.mjs
CHANGED
|
@@ -7,11 +7,10 @@ function clampValue(value, min, max) {
|
|
|
7
7
|
function interpolate(args) {
|
|
8
8
|
const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args;
|
|
9
9
|
let startTime;
|
|
10
|
-
const speed = 1;
|
|
11
10
|
function animate(timestamp) {
|
|
12
11
|
if (!startTime)
|
|
13
12
|
startTime = timestamp;
|
|
14
|
-
const progress = Math.min(1, (timestamp - startTime) /
|
|
13
|
+
const progress = Math.min(1, (timestamp - startTime) / duration);
|
|
15
14
|
const easedProgress = easing(progress);
|
|
16
15
|
const value = from + (to - from) * easedProgress;
|
|
17
16
|
callback(value);
|
package/dist/utils/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n
|
|
1
|
+
{"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n\n function animate(timestamp: number) {\n if (!startTime) startTime = timestamp\n\n const progress = Math.min(1, (timestamp - startTime) / duration)\n const easedProgress = easing(progress)\n const value = from + (to - from) * easedProgress\n\n callback(value)\n\n if (progress < 1) {\n requestAnimationFrame(animate)\n }\n }\n\n requestAnimationFrame(animate)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";AAAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;ACOO,SAAS,YAAY,MAAuB;AACjD,QAAM,EAAE,MAAM,IAAI,UAAU,UAAU,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI;AAEtE,MAAI;AAEJ,WAAS,QAAQ,WAAmB;AAClC,QAAI,CAAC;AAAW,kBAAY;AAE5B,UAAM,WAAW,KAAK,IAAI,IAAI,YAAY,aAAa,QAAQ;AAC/D,UAAM,gBAAgB,OAAO,QAAQ;AACrC,UAAM,QAAQ,QAAQ,KAAK,QAAQ;AAEnC,aAAS,KAAK;AAEd,QAAI,WAAW,GAAG;AAChB,4BAAsB,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,wBAAsB,OAAO;AAC/B;;;AC7BO,SAAS,QAAQ;AACtB,MAAI,OAAO,WAAW;AAAa,WAAO;AAC1C,SAAO,mBAAmB,KAAK,uCAAW,SAAS;AACrD;;;ACHO,SAAS,SACd,OACA,OACA,OACA,QACA,QACA;AACA,UAAS,QAAQ,UAAU,SAAS,WAAY,QAAQ,SAAS;AACnE;;;ACJO,SAAS,OAAO;AACrB,SAAO,uCACJ,MAAM,EAAE,EACR;AAAA,IACC,CAAC,GAAG,MACF,KACC,MAAM,MACH,KAAK,MAAM,KAAK,OAAO,IAAI,EAAG,EAAE,SAAS,EAAE,IAC3C,MAAM,MACN,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,SAAS,EAAE,IAC7C;AAAA,IACN;AAAA,EACF;AACJ;;;ACjBO,SAAS,KAAsB,GAAM;AAC1C,SAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;AAC9B;;;ACMA,IAAM,iBAAiC;AAAA,EACrC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,SAAS,QAAQ,QAAgB,SAAkC;AACxE,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAGA,QAAM,WAAW,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAEjD,QAAM,UAAqC,CAAC;AAE5C,MAAI,OAAO,OACR,UAAU,EACV,MAAM,EAAE,EACR,OAAO,SAAU,QAAQ,IAAI;AAC5B,QAAI,aAAa,QAAQ,EAAE;AAC3B,QAAI,eAAe;AAAW,mBAAa;AAC3C,QAAI,gBAAe,qCAAU;AAAW,mBAAa;AACrD,WACE,SACA,WAAW,SAAQ,qCAAU,WAAU,4BAA4B,EAAE;AAAA,EAEzE,GAAG,EAAE;AAEP,MAAI,SAAS,QAAQ;AACnB,WAAO,KAAK,QAAQ,mBAAmB,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,QAAQ,OAAO,SAAS,SAAS;AAAA,EAC/C;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAEA,SAAO;AACT;","names":[]}
|
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.16.
|
|
4
|
+
"version": "0.16.9",
|
|
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",
|