@maas/vue-equipment 1.0.1 → 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.
- package/dist/nuxt/module.json +1 -1
- package/dist/nuxt/module.mjs +2 -2
- package/dist/plugins/MagicCarousel/src/utils/defaultOptions.mjs +1 -1
- package/dist/plugins/MagicDraggable/src/utils/defaultOptions.mjs +1 -1
- package/dist/plugins/MagicDrawer/index.d.ts +2 -2
- package/dist/plugins/MagicDrawer/src/components/MagicDrawerContent.vue +4 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +128 -170
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerProgress.mjs +57 -77
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerSnap.d.ts +16 -11
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerSnap.mjs +175 -175
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerState.mjs +2 -1
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerUtils.d.ts +3 -0
- package/dist/plugins/MagicDrawer/src/composables/private/useDrawerUtils.mjs +11 -1
- package/dist/plugins/MagicDrawer/src/composables/useMagicDrawer.d.ts +1 -0
- package/dist/plugins/MagicDrawer/src/composables/useMagicDrawer.mjs +2 -1
- package/dist/plugins/MagicDrawer/src/types/index.d.ts +8 -1
- package/dist/plugins/MagicDrawer/src/utils/defaultOptions.mjs +1 -1
- package/dist/plugins/MagicTray/index.d.ts +4 -3
- package/dist/plugins/MagicTray/index.mjs +3 -0
- package/dist/plugins/MagicTray/src/components/MagicTrayContent.d.vue.ts +2 -2
- package/dist/plugins/MagicTray/src/components/MagicTrayContent.vue +17 -16
- package/dist/plugins/MagicTray/src/components/MagicTrayContent.vue.d.ts +2 -2
- package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.d.vue.ts +25 -0
- package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.vue +90 -0
- package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.vue.d.ts +25 -0
- package/dist/plugins/MagicTray/src/composables/private/useTrayDrag.d.ts +0 -4
- package/dist/plugins/MagicTray/src/composables/private/useTrayDrag.mjs +27 -385
- package/dist/plugins/MagicTray/src/composables/private/useTrayGesture.d.ts +16 -0
- package/dist/plugins/MagicTray/src/composables/private/useTrayGesture.mjs +426 -0
- package/dist/plugins/MagicTray/src/composables/private/useTrayMagnetism.mjs +11 -37
- package/dist/plugins/MagicTray/src/composables/private/useTrayProgress.mjs +1 -1
- package/dist/plugins/MagicTray/src/composables/private/useTraySnap.d.ts +12 -7
- package/dist/plugins/MagicTray/src/composables/private/useTraySnap.mjs +88 -40
- package/dist/plugins/MagicTray/src/composables/private/useTrayUtils.d.ts +10 -1
- package/dist/plugins/MagicTray/src/composables/private/useTrayUtils.mjs +17 -1
- package/dist/plugins/MagicTray/src/types/index.d.ts +7 -1
- package/dist/plugins/MagicTray/src/utils/defaultOptions.mjs +1 -1
- package/dist/utils/index.d.ts +46 -1
- package/dist/utils/index.js +75 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import { computed, nextTick, toValue } from "vue";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
clampValue,
|
|
4
|
+
interpolate,
|
|
5
|
+
snapRangeAt,
|
|
6
|
+
snapTargetAt
|
|
7
|
+
} from "@maas/vue-equipment/utils";
|
|
3
8
|
import { useMagicEmitter } from "@maas/vue-equipment/plugins/MagicEmitter";
|
|
4
9
|
import { useTrayUtils } from "./useTrayUtils.mjs";
|
|
10
|
+
function isMapped(value) {
|
|
11
|
+
return value !== void 0 && !Number.isNaN(value);
|
|
12
|
+
}
|
|
13
|
+
function roundDecimal(value) {
|
|
14
|
+
return Math.round(value * 1e4) / 1e4;
|
|
15
|
+
}
|
|
5
16
|
export function useTraySnap(args) {
|
|
6
17
|
const { id, state } = args;
|
|
7
|
-
const { isVertical, oppositeSide } = useTrayUtils();
|
|
18
|
+
const { isVertical, oppositeSide, isSnapRange, flattenSnapPoints } = useTrayUtils();
|
|
8
19
|
const emitter = useMagicEmitter();
|
|
9
20
|
const snapPoints = computed(() => state.options.snapPoints);
|
|
10
21
|
const animation = computed(() => state.options.animation);
|
|
@@ -43,53 +54,78 @@ export function useTraySnap(args) {
|
|
|
43
54
|
}
|
|
44
55
|
}
|
|
45
56
|
function mappedSnapPoints(side) {
|
|
46
|
-
const configured = snapPoints.value[side] ?? [];
|
|
47
|
-
const mapped = configured.map((snapPoint) => mapSnapPoint(side, snapPoint)).filter(
|
|
48
|
-
(value) => value === 0 || !!value && !Number.isNaN(value)
|
|
49
|
-
);
|
|
57
|
+
const configured = flattenSnapPoints(snapPoints.value[side] ?? []);
|
|
58
|
+
const mapped = configured.map((snapPoint) => mapSnapPoint(side, snapPoint)).filter(isMapped);
|
|
50
59
|
return [...new Set(mapped)].sort((a, b) => a - b);
|
|
51
60
|
}
|
|
52
61
|
function snapPointsMap(side) {
|
|
53
|
-
const configured = snapPoints.value[side] ?? [];
|
|
62
|
+
const configured = flattenSnapPoints(snapPoints.value[side] ?? []);
|
|
54
63
|
const map = {};
|
|
55
64
|
for (const snapPoint of configured) {
|
|
56
65
|
const mapped = mapSnapPoint(side, snapPoint);
|
|
57
|
-
if (mapped
|
|
66
|
+
if (isMapped(mapped)) {
|
|
58
67
|
map[mapped] = snapPoint;
|
|
59
68
|
}
|
|
60
69
|
}
|
|
61
70
|
return map;
|
|
62
71
|
}
|
|
63
|
-
function
|
|
64
|
-
|
|
72
|
+
function mappedRanges(side) {
|
|
73
|
+
const configured = snapPoints.value[side] ?? [];
|
|
74
|
+
return configured.filter(isSnapRange).flatMap((range) => {
|
|
75
|
+
const min = mapSnapPoint(side, range.min);
|
|
76
|
+
const max = mapSnapPoint(side, range.max);
|
|
77
|
+
if (!isMapped(min) || !isMapped(max)) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
min: Math.min(min, max),
|
|
83
|
+
max: Math.max(min, max),
|
|
84
|
+
momentum: range.momentum,
|
|
85
|
+
range
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function rangeAt(side, inset) {
|
|
91
|
+
return snapRangeAt({ ranges: mappedRanges(side), position: inset });
|
|
92
|
+
}
|
|
93
|
+
function snapPointAt(side, inset) {
|
|
94
|
+
const configured = snapPointsMap(side)[inset];
|
|
95
|
+
if (configured !== void 0) {
|
|
96
|
+
return configured;
|
|
97
|
+
}
|
|
98
|
+
const mapped = rangeAt(side, inset);
|
|
99
|
+
if (!mapped) {
|
|
65
100
|
return void 0;
|
|
66
101
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
102
|
+
const offset = inset - padding(side);
|
|
103
|
+
const { min, max } = mapped.range;
|
|
104
|
+
return typeof min === "number" && typeof max === "number" ? roundDecimal(offset / contentExtent(side)) : `${Math.round(offset)}px`;
|
|
105
|
+
}
|
|
106
|
+
function restingInset(side, inset) {
|
|
107
|
+
const range = rangeAt(side, inset);
|
|
108
|
+
const snapPoint = snapPointAt(side, inset);
|
|
109
|
+
if (!range || snapPoint === void 0) {
|
|
110
|
+
return inset;
|
|
75
111
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return void 0;
|
|
84
|
-
}
|
|
112
|
+
const mapped = mapSnapPoint(side, snapPoint);
|
|
113
|
+
return mapped === void 0 ? inset : clampValue(mapped, range.min, range.max);
|
|
114
|
+
}
|
|
115
|
+
function isSnapTarget(side, snapPoint) {
|
|
116
|
+
const mapped = mapSnapPoint(side, snapPoint);
|
|
117
|
+
if (mapped === void 0) {
|
|
118
|
+
return false;
|
|
85
119
|
}
|
|
86
|
-
return
|
|
87
|
-
(closest, current) => Math.abs(current - value) < Math.abs(closest - value) ? current : closest
|
|
88
|
-
);
|
|
120
|
+
return !!rangeAt(side, mapped) || mappedSnapPoints(side).includes(mapped);
|
|
89
121
|
}
|
|
90
|
-
function
|
|
91
|
-
const
|
|
92
|
-
|
|
122
|
+
function findSnapTarget(side, inset) {
|
|
123
|
+
const target = snapTargetAt({
|
|
124
|
+
points: mappedSnapPoints(side),
|
|
125
|
+
ranges: mappedRanges(side),
|
|
126
|
+
value: inset
|
|
127
|
+
});
|
|
128
|
+
return target === void 0 ? void 0 : restingInset(side, target);
|
|
93
129
|
}
|
|
94
130
|
function interpolateDragged(args2) {
|
|
95
131
|
const {
|
|
@@ -98,8 +134,8 @@ export function useTraySnap(args) {
|
|
|
98
134
|
duration = toValue(animation).snap.duration,
|
|
99
135
|
easing = toValue(animation).snap.easing
|
|
100
136
|
} = args2;
|
|
101
|
-
const snapPoint =
|
|
102
|
-
if (
|
|
137
|
+
const snapPoint = snapPointAt(side, to);
|
|
138
|
+
if (snapPoint === void 0) {
|
|
103
139
|
interpolate({
|
|
104
140
|
from: state.dragged[side],
|
|
105
141
|
to,
|
|
@@ -115,6 +151,13 @@ export function useTraySnap(args) {
|
|
|
115
151
|
id: toValue(id),
|
|
116
152
|
snapPoint: { side, point: snapPoint }
|
|
117
153
|
});
|
|
154
|
+
if (state.dragged[side] === to) {
|
|
155
|
+
emitter.emit("afterSnap", {
|
|
156
|
+
id: toValue(id),
|
|
157
|
+
snapPoint: { side, point: snapPoint }
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
118
161
|
interpolate({
|
|
119
162
|
from: state.dragged[side],
|
|
120
163
|
to,
|
|
@@ -138,14 +181,15 @@ export function useTraySnap(args) {
|
|
|
138
181
|
if (mapped === void 0) {
|
|
139
182
|
return;
|
|
140
183
|
}
|
|
141
|
-
const closest =
|
|
184
|
+
const closest = findSnapTarget(side, mapped) ?? mapped;
|
|
185
|
+
state.snapped[side] = closest;
|
|
186
|
+
state.lastDragged[side] = closest;
|
|
187
|
+
state.activeSnapPoint[side] = snapPointAt(side, closest) ?? snapPoint;
|
|
142
188
|
if (shouldInterpolate) {
|
|
143
189
|
interpolateDragged({ side, to: closest, duration });
|
|
144
190
|
} else {
|
|
145
191
|
state.dragged[side] = closest;
|
|
146
192
|
}
|
|
147
|
-
state.snapped[side] = closest;
|
|
148
|
-
state.activeSnapPoint[side] = snapPoint;
|
|
149
193
|
}
|
|
150
194
|
return {
|
|
151
195
|
dimension,
|
|
@@ -154,8 +198,12 @@ export function useTraySnap(args) {
|
|
|
154
198
|
maxInset,
|
|
155
199
|
mapSnapPoint,
|
|
156
200
|
mappedSnapPoints,
|
|
157
|
-
|
|
158
|
-
|
|
201
|
+
mappedRanges,
|
|
202
|
+
rangeAt,
|
|
203
|
+
snapPointAt,
|
|
204
|
+
restingInset,
|
|
205
|
+
isSnapTarget,
|
|
206
|
+
findSnapTarget,
|
|
159
207
|
interpolateDragged,
|
|
160
208
|
snapTo
|
|
161
209
|
};
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
import type { MagicTraySide } from '../../types/index.js';
|
|
1
|
+
import type { MagicTraySide, MagicTraySnapEntry, MagicTraySnapRange, TraySnapPoints } from '../../types/index.js';
|
|
2
|
+
export declare const SIDES: Array<MagicTraySide>;
|
|
3
|
+
type IsDraggableSideArgs = {
|
|
4
|
+
snapPoints: TraySnapPoints;
|
|
5
|
+
side: MagicTraySide;
|
|
6
|
+
};
|
|
2
7
|
export declare function useTrayUtils(): {
|
|
3
8
|
clampWithOvershoot: (value: number, min: number, max: number, outer: number, inner: number) => any;
|
|
4
9
|
isVertical: (side: MagicTraySide) => side is "top" | "bottom";
|
|
5
10
|
oppositeSide: (side: MagicTraySide) => MagicTraySide;
|
|
11
|
+
isSnapRange: (entry: MagicTraySnapEntry) => entry is MagicTraySnapRange;
|
|
12
|
+
flattenSnapPoints: (entries: Array<MagicTraySnapEntry>) => import("../../types/index.js").MagicTraySnapPoint[];
|
|
13
|
+
isDraggableSide: (args: IsDraggableSideArgs) => boolean;
|
|
6
14
|
};
|
|
15
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { rubberband } from "@maas/vue-equipment/utils";
|
|
2
|
+
export const SIDES = ["top", "right", "bottom", "left"];
|
|
2
3
|
export function useTrayUtils() {
|
|
3
4
|
function clampWithOvershoot(value, min, max, outer, inner) {
|
|
4
5
|
if (value < min) {
|
|
@@ -24,9 +25,24 @@ export function useTrayUtils() {
|
|
|
24
25
|
return "left";
|
|
25
26
|
}
|
|
26
27
|
}
|
|
28
|
+
function isSnapRange(entry) {
|
|
29
|
+
return typeof entry === "object";
|
|
30
|
+
}
|
|
31
|
+
function flattenSnapPoints(entries) {
|
|
32
|
+
return entries.flatMap(
|
|
33
|
+
(entry) => isSnapRange(entry) ? [entry.min, entry.max] : [entry]
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
function isDraggableSide(args) {
|
|
37
|
+
const { snapPoints, side } = args;
|
|
38
|
+
return (snapPoints[side]?.length ?? 0) > 0;
|
|
39
|
+
}
|
|
27
40
|
return {
|
|
28
41
|
clampWithOvershoot,
|
|
29
42
|
isVertical,
|
|
30
|
-
oppositeSide
|
|
43
|
+
oppositeSide,
|
|
44
|
+
isSnapRange,
|
|
45
|
+
flattenSnapPoints,
|
|
46
|
+
isDraggableSide
|
|
31
47
|
};
|
|
32
48
|
}
|
|
@@ -2,6 +2,12 @@ import type { RequireAllNested } from '@maas/vue-equipment/utils';
|
|
|
2
2
|
import type { EasingKey } from '@maas/vue-equipment/composables/useEasings';
|
|
3
3
|
export type MagicTraySide = 'top' | 'right' | 'bottom' | 'left';
|
|
4
4
|
export type MagicTraySnapPoint = number | `${number}px`;
|
|
5
|
+
export interface MagicTraySnapRange {
|
|
6
|
+
min: MagicTraySnapPoint;
|
|
7
|
+
max: MagicTraySnapPoint;
|
|
8
|
+
momentum?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export type MagicTraySnapEntry = MagicTraySnapPoint | MagicTraySnapRange;
|
|
5
11
|
export interface MagicTraySnapPointPayload {
|
|
6
12
|
side: MagicTraySide;
|
|
7
13
|
point: MagicTraySnapPoint;
|
|
@@ -12,7 +18,7 @@ export interface MagicTraySidePayload {
|
|
|
12
18
|
}
|
|
13
19
|
export type MagicTraySnapMode = 'closest' | 'step';
|
|
14
20
|
export type MagicTrayDragMode = 'free' | 'snap';
|
|
15
|
-
export type TraySnapPoints = Partial<Record<MagicTraySide,
|
|
21
|
+
export type TraySnapPoints = Partial<Record<MagicTraySide, Array<MagicTraySnapEntry>>>;
|
|
16
22
|
export type TrayMagneticDirection = 'inner' | 'outer' | 'both';
|
|
17
23
|
export type TrayMagneticSide = Partial<Record<MagicTraySnapPoint, TrayMagneticDirection>>;
|
|
18
24
|
export type TrayMagneticSides = false | Partial<Record<MagicTraySide, TrayMagneticSide>>;
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -88,6 +88,51 @@ interface SlugifyOptions {
|
|
|
88
88
|
}
|
|
89
89
|
declare function slugify(string: string, options?: SlugifyOptions): string;
|
|
90
90
|
|
|
91
|
+
type SnapRange = {
|
|
92
|
+
min: number;
|
|
93
|
+
max: number;
|
|
94
|
+
momentum?: boolean;
|
|
95
|
+
};
|
|
96
|
+
type SnapDirection = 'below' | 'above';
|
|
97
|
+
type SnapMode = 'closest' | 'step';
|
|
98
|
+
type SnapDrag = {
|
|
99
|
+
points: Array<number>;
|
|
100
|
+
ranges: Array<SnapRange>;
|
|
101
|
+
mode: SnapMode;
|
|
102
|
+
rest: number;
|
|
103
|
+
start: number;
|
|
104
|
+
position: number;
|
|
105
|
+
};
|
|
106
|
+
type SnapRangeAtArgs<RangeType extends SnapRange> = {
|
|
107
|
+
ranges: Array<RangeType>;
|
|
108
|
+
position: number;
|
|
109
|
+
};
|
|
110
|
+
type ClosestSnapPointArgs = {
|
|
111
|
+
points: Array<number>;
|
|
112
|
+
value: number;
|
|
113
|
+
direction?: SnapDirection | 'absolute';
|
|
114
|
+
};
|
|
115
|
+
type SnapTargetAtArgs = {
|
|
116
|
+
points: Array<number>;
|
|
117
|
+
ranges: Array<SnapRange>;
|
|
118
|
+
value: number;
|
|
119
|
+
};
|
|
120
|
+
type SnapCommitArgs = SnapDrag & {
|
|
121
|
+
distance: number;
|
|
122
|
+
flicked: boolean;
|
|
123
|
+
flickDirection?: SnapDirection;
|
|
124
|
+
};
|
|
125
|
+
type SnapReleaseArgs = SnapDrag & {
|
|
126
|
+
committed: number | undefined;
|
|
127
|
+
flicked: boolean;
|
|
128
|
+
tapped: boolean;
|
|
129
|
+
};
|
|
130
|
+
declare function snapRangeAt<RangeType extends SnapRange>(args: SnapRangeAtArgs<RangeType>): RangeType | undefined;
|
|
131
|
+
declare function closestSnapPoint(args: ClosestSnapPointArgs): number | undefined;
|
|
132
|
+
declare function snapTargetAt(args: SnapTargetAtArgs): number | undefined;
|
|
133
|
+
declare function snapCommit(args: SnapCommitArgs): number | undefined;
|
|
134
|
+
declare function snapRelease(args: SnapReleaseArgs): number;
|
|
135
|
+
|
|
91
136
|
declare function uniq<T extends unknown[]>(a: T): unknown[];
|
|
92
137
|
|
|
93
138
|
type PickPartial<T, K extends keyof T> = {
|
|
@@ -100,4 +145,4 @@ type RequireAllNested<T> = {
|
|
|
100
145
|
|
|
101
146
|
type ValueOf<T> = T[keyof T];
|
|
102
147
|
|
|
103
|
-
export { type CreateStore, type InterpolateArgs, type PickPartial, type RequireAllNested, type SlugifyOptions, type ValueOf, cancelEdgeNavigation, clampValue, convertToPixels, createStateStore, easeInCubic, easeInOutCubic, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInQuad, easeInQuart, easeInQuint, easeOutBack, easeOutCubic, easeOutQuad, easeOutQuart, easeOutQuint, formatTime, guardedReleasePointerCapture, guardedSetPointerCapture, hasEdgeNavigationGestures, interpolate, isAndroid, isIOS, isWithinRange, linear, lockSelection, mapValue, matchClass, rubberband, scrollbarGutterSupport, scrollbarWidth, slugify, uniq };
|
|
148
|
+
export { type CreateStore, type InterpolateArgs, type PickPartial, type RequireAllNested, type SlugifyOptions, type SnapDirection, type SnapDrag, type SnapMode, type SnapRange, type ValueOf, cancelEdgeNavigation, clampValue, closestSnapPoint, convertToPixels, createStateStore, easeInCubic, easeInOutCubic, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInQuad, easeInQuart, easeInQuint, easeOutBack, easeOutCubic, easeOutQuad, easeOutQuart, easeOutQuint, formatTime, guardedReleasePointerCapture, guardedSetPointerCapture, hasEdgeNavigationGestures, interpolate, isAndroid, isIOS, isWithinRange, linear, lockSelection, mapValue, matchClass, rubberband, scrollbarGutterSupport, scrollbarWidth, slugify, snapCommit, snapRangeAt, snapRelease, snapTargetAt, uniq };
|
package/dist/utils/index.js
CHANGED
|
@@ -378,6 +378,76 @@ function slugify(string, options) {
|
|
|
378
378
|
return slug;
|
|
379
379
|
}
|
|
380
380
|
|
|
381
|
+
// src/functions/snapTarget.ts
|
|
382
|
+
function snapRangeAt(args) {
|
|
383
|
+
const { ranges, position } = args;
|
|
384
|
+
return ranges.find((range) => position >= range.min && position <= range.max);
|
|
385
|
+
}
|
|
386
|
+
function closestSnapPoint(args) {
|
|
387
|
+
const { points, value, direction = "absolute" } = args;
|
|
388
|
+
if (!points.length) {
|
|
389
|
+
return void 0;
|
|
390
|
+
}
|
|
391
|
+
switch (direction) {
|
|
392
|
+
case "above":
|
|
393
|
+
return points.find((point) => point > value) ?? points.at(-1);
|
|
394
|
+
case "below":
|
|
395
|
+
return [...points].reverse().find((point) => point < value) ?? points[0];
|
|
396
|
+
case "absolute":
|
|
397
|
+
return points.reduce(
|
|
398
|
+
(closest, point) => Math.abs(point - value) < Math.abs(closest - value) ? point : closest
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
function snapTargetAt(args) {
|
|
403
|
+
const { points, ranges, value } = args;
|
|
404
|
+
return snapRangeAt({ ranges, position: value }) ? value : closestSnapPoint({ points, value });
|
|
405
|
+
}
|
|
406
|
+
function clampToRestRange(drag) {
|
|
407
|
+
const range = snapRangeAt({ ranges: drag.ranges, position: drag.rest });
|
|
408
|
+
return range ? clampValue(drag.position, range.min, range.max) : void 0;
|
|
409
|
+
}
|
|
410
|
+
function nextSnapPoint(args) {
|
|
411
|
+
const { points, mode, rest, position, direction } = args;
|
|
412
|
+
const value = mode === "step" ? rest : position;
|
|
413
|
+
return closestSnapPoint({ points, value, direction });
|
|
414
|
+
}
|
|
415
|
+
function restsInRange(args) {
|
|
416
|
+
const { ranges, mode, rest, position, flicked } = args;
|
|
417
|
+
const range = snapRangeAt({ ranges, position });
|
|
418
|
+
if (!range || flicked && range.momentum !== false) {
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
const startsInside = rest >= range.min && rest <= range.max;
|
|
422
|
+
if (mode !== "step" || startsInside) {
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
const direction = position < rest ? "below" : "above";
|
|
426
|
+
const next = nextSnapPoint({ ...args, direction });
|
|
427
|
+
return next === (direction === "above" ? range.min : range.max);
|
|
428
|
+
}
|
|
429
|
+
function snapCommit(args) {
|
|
430
|
+
const { distance, flicked, flickDirection, ...drag } = args;
|
|
431
|
+
const delta = drag.position - (clampToRestRange(drag) ?? drag.start);
|
|
432
|
+
if (Math.abs(delta) > distance) {
|
|
433
|
+
return nextSnapPoint({ ...drag, direction: delta < 0 ? "below" : "above" });
|
|
434
|
+
}
|
|
435
|
+
if (flicked && flickDirection) {
|
|
436
|
+
return nextSnapPoint({ ...drag, direction: flickDirection });
|
|
437
|
+
}
|
|
438
|
+
return void 0;
|
|
439
|
+
}
|
|
440
|
+
function snapRelease(args) {
|
|
441
|
+
const { committed, flicked, tapped, ...drag } = args;
|
|
442
|
+
if (tapped) {
|
|
443
|
+
return committed ?? drag.rest;
|
|
444
|
+
}
|
|
445
|
+
if (restsInRange({ ...drag, flicked })) {
|
|
446
|
+
return drag.position;
|
|
447
|
+
}
|
|
448
|
+
return committed ?? clampToRestRange(drag) ?? drag.rest;
|
|
449
|
+
}
|
|
450
|
+
|
|
381
451
|
// src/functions/uniq.ts
|
|
382
452
|
function uniq(a) {
|
|
383
453
|
return Array.from(new Set(a));
|
|
@@ -385,6 +455,7 @@ function uniq(a) {
|
|
|
385
455
|
export {
|
|
386
456
|
cancelEdgeNavigation,
|
|
387
457
|
clampValue,
|
|
458
|
+
closestSnapPoint,
|
|
388
459
|
convertToPixels,
|
|
389
460
|
createStateStore,
|
|
390
461
|
easeInCubic,
|
|
@@ -416,6 +487,10 @@ export {
|
|
|
416
487
|
scrollbarGutterSupport,
|
|
417
488
|
scrollbarWidth,
|
|
418
489
|
slugify,
|
|
490
|
+
snapCommit,
|
|
491
|
+
snapRangeAt,
|
|
492
|
+
snapRelease,
|
|
493
|
+
snapTargetAt,
|
|
419
494
|
uniq
|
|
420
495
|
};
|
|
421
496
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/convertToPixels.ts","../../packages/utils/src/functions/createStateStore.ts","../../packages/utils/src/functions/easings.ts","../../packages/utils/src/functions/edgeNavigation.ts","../../packages/utils/src/functions/toNumber.ts","../../packages/utils/src/functions/formatTime.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isAndroid.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/isWithinRange.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/matchClass.ts","../../packages/utils/src/functions/pointerCapture.ts","../../packages/utils/src/functions/rubberband.ts","../../packages/utils/src/functions/scrollbarGutterSupport.ts","../../packages/utils/src/functions/scrollbarWidth.ts","../../packages/utils/src/functions/selectionLock.ts","../../packages/utils/src/functions/slugify.ts","../../packages/utils/src/functions/uniq.ts"],"sourcesContent":["export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","// Converts a CSS length string in `px` or `rem` to an absolute pixel value.\n// Returns undefined for any other unit or an unparseable value, so callers can\n// warn with their own context.\nexport function convertToPixels(value: string): number | undefined {\n const match = value.trim().match(/^(\\d*\\.?\\d+)\\s*(rem|px)$/)\n if (!match) {\n return undefined\n }\n\n const numericValue = parseFloat(match[1] ?? '')\n\n if (match[2] === 'rem') {\n const rootFontSize =\n parseFloat(getComputedStyle(document.body).fontSize) || 16\n return numericValue * rootFontSize\n }\n\n return numericValue\n}\n","import { getCurrentInstance, ref } from 'vue'\nimport type { Ref } from 'vue'\n\nexport type CreateStore<T> = () => Ref<T>\n\nexport function createStateStore<T>(\n key: string,\n setInitialValue: () => T\n): CreateStore<T> {\n return function getOrCreateStore(): Ref<T> {\n const instance = getCurrentInstance()\n const app = instance?.appContext.app\n\n // If no app instance is found, return a fresh store. Event handlers,\n // timers and watcher callbacks run without one, so composables that use\n // a store must be called during setup, never from inside those.\n if (!app || !key) {\n return ref(setInitialValue()) as Ref<T>\n }\n\n // Create a global Map to hold all state stores\n if (!app.config.globalProperties.__VEStateStores) {\n app.config.globalProperties.__VEStateStores = new Map<string, Ref<T>>()\n }\n\n // Check if a store already exists for this app instance\n let store = app.config.globalProperties.__VEStateStores.get(key)\n\n // If no store exists for this app instance, create one\n if (!store) {\n store = ref(setInitialValue()) as Ref<T>\n app.config.globalProperties.__VEStateStores.set(key, store)\n }\n\n return store\n }\n}\n","export function linear(t: number) {\n return t\n}\nexport function easeInQuad(t: number) {\n return t * t\n}\nexport function easeOutQuad(t: number) {\n return t * (2 - t)\n}\nexport function easeInOutQuad(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t\n}\nexport function easeOutBack(t: number, o: number = 1.25) {\n return 1 + (t - 1) * (t - 1) * ((o + 1) * (t - 1) + o)\n}\nexport function easeInCubic(t: number) {\n return t * t * t\n}\nexport function easeOutCubic(t: number) {\n return --t * t * t + 1\n}\nexport function easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1\n}\nexport function easeInQuart(t: number) {\n return t * t * t * t\n}\nexport function easeOutQuart(t: number) {\n return 1 - --t * t * t * t\n}\nexport function easeInOutQuart(t: number) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t\n}\nexport function easeInQuint(t: number) {\n return t * t * t * t * t\n}\nexport function easeOutQuint(t: number) {\n return 1 + --t * t * t * t * t\n}\nexport function easeInOutQuint(t: number) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t\n}\n","interface CancelEdgeNavigationArgs {\n event: TouchEvent\n threshold?: number\n slop?: number\n exclude?: string[]\n}\n\ninterface RestoreClickArgs {\n target: HTMLElement\n touch: Touch\n slop: number\n}\n\n// iPadOS reports a Macintosh user agent, so touch support is the tell\nexport function hasEdgeNavigationGestures() {\n if (typeof window === 'undefined') {\n return false\n }\n\n return (\n /iPad|iPhone|iPod/.test(navigator?.userAgent) ||\n (/Macintosh/.test(navigator?.userAgent) && navigator?.maxTouchPoints > 1)\n )\n}\n\n// Canceling touchstart is the one signal WebKit honors to keep its edge\n// navigation swipe from arming; pointer events keep firing regardless\nexport function cancelEdgeNavigation(args: CancelEdgeNavigationArgs): boolean {\n const {\n event,\n threshold = 44,\n slop = 12,\n exclude = ['SELECT', 'OPTION', 'INPUT', 'TEXTAREA'],\n } = args\n\n if (!hasEdgeNavigationGestures() || !event.cancelable) {\n return false\n }\n\n if (event.touches.length !== 1) {\n return false\n }\n\n const touch = event.touches[0]\n const target =\n event.target instanceof Element ? closestHTMLElement(event.target) : null\n\n if (!touch || !target) {\n return false\n }\n\n if (\n exclude.some((tag) => tag.toUpperCase() === target.tagName) ||\n target.isContentEditable\n ) {\n return false\n }\n\n if (\n touch.clientX > threshold &&\n touch.clientX < window.innerWidth - threshold\n ) {\n return false\n }\n\n event.preventDefault()\n restoreClick({ target, touch, slop })\n\n return true\n}\n\n// An SVG element has no click(), so a touch on an icon restores the click on\n// the HTML element that holds it\nfunction closestHTMLElement(element: Element) {\n for (\n let current: Element | null = element;\n current;\n current = current.parentElement\n ) {\n if (current instanceof HTMLElement) {\n return current\n }\n }\n\n return null\n}\n\n// Canceling touchstart swallows the tap’s synthesized click; a touch that\n// ends within the slop dispatches a deferred replacement\nfunction restoreClick(args: RestoreClickArgs) {\n const { target, touch, slop } = args\n const { identifier, clientX, clientY } = touch\n\n function findTouch(list: TouchList) {\n for (let index = 0; index < list.length; index++) {\n const candidate = list[index]\n if (candidate?.identifier === identifier) {\n return candidate\n }\n }\n\n return undefined\n }\n\n function teardown() {\n document.removeEventListener('touchend', onTouchend, true)\n document.removeEventListener('touchcancel', onTouchcancel, true)\n }\n\n function onTouchend(event: TouchEvent) {\n const endTouch = findTouch(event.changedTouches)\n\n if (!endTouch) {\n return\n }\n\n teardown()\n\n const distance = Math.hypot(\n endTouch.clientX - clientX,\n endTouch.clientY - clientY\n )\n\n if (distance <= slop) {\n setTimeout(() => target.click())\n }\n }\n\n function onTouchcancel(event: TouchEvent) {\n if (findTouch(event.changedTouches)) {\n teardown()\n }\n }\n\n document.addEventListener('touchend', onTouchend, true)\n document.addEventListener('touchcancel', onTouchcancel, true)\n}\n","export function toNumber(value: string | number): number {\n return typeof value === 'string' ? parseFloat(value) : Number(value)\n}\n","import { toNumber } from './toNumber'\n\nexport function formatTime(seconds: number, guide: number) {\n seconds = seconds < 0 ? 0 : seconds\n let s: string | number = Math.floor(seconds % 60)\n let m: string | number = Math.floor((seconds / 60) % 60)\n let h: string | number = Math.floor(seconds / 3600)\n const gm = Math.floor((guide / 60) % 60)\n const gh = Math.floor(guide / 3600)\n\n // handle invalid times\n if (isNaN(seconds) || seconds === Infinity) {\n // '-' is false for all relational operators (e.g. <, >=) so this setting\n // will add the minimum number of fields specified by the guide\n h = m = s = '-'\n }\n\n // Check if we need to show hours\n h = toNumber(h) > 0 || gh > 0 ? h + ':' : ''\n\n // If hours are showing, we may need to add a leading zero.\n // Always show at least one digit of minutes.\n m = ((h || gm >= 10) && toNumber(m) < 10 ? '0' + m : m) + ':'\n\n // Check if leading zero is need for seconds\n s = toNumber(s) < 10 ? '0' + s : s\n\n return h + m + s\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n easing?: (t: number) => number\n callback: (result: number) => void\n interpolationIdCallback?: (id: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const {\n from,\n to,\n duration,\n callback,\n interpolationIdCallback = () => {},\n easing = (t) => t * (2 - t),\n } = args\n\n let startTime: number\n let interpolationId: number\n\n function animate(timestamp: number) {\n if (!startTime) {\n startTime = timestamp\n }\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 interpolationId = requestAnimationFrame(animate)\n interpolationIdCallback(interpolationId)\n }\n }\n\n interpolationId = requestAnimationFrame(animate)\n\n return interpolationId\n}\n","export function isAndroid() {\n if (typeof window === 'undefined') {\n return false\n }\n return /android/i.test(navigator?.userAgent)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') {\n return false\n }\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","interface isWithinRangeArgs {\n input: number\n base: number\n threshold: number\n}\n\nexport function isWithinRange(args: isWithinRangeArgs): boolean {\n const { input, base, threshold } = args\n return input >= base - threshold && input <= base + threshold\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","export function matchClass(el: Element, regex: RegExp) {\n return Array.from(el.classList).some((className) => regex.test(className))\n}\n","interface GuardedSetPointerCaptureArgs {\n event: PointerEvent\n element?: Element | null\n mouse?: boolean\n debug?: boolean\n}\n\ninterface GuardedReleasePointerCaptureArgs {\n event: PointerEvent\n element?: Element | null\n}\n\nexport function guardedSetPointerCapture(\n args: GuardedSetPointerCaptureArgs\n): void {\n const { event, element, mouse, debug } = args\n if (element && event.isPrimary && (mouse || event.pointerType !== 'mouse')) {\n try {\n const coalescedEvents: PointerEvent[] =\n 'getCoalescedEvents' in event ? event.getCoalescedEvents() : [event]\n\n if (coalescedEvents.length > 0 || mouse) {\n element?.setPointerCapture(event.pointerId)\n }\n } catch (error) {\n if (debug) {\n console.warn('Failed to set pointer capture:', error)\n }\n }\n }\n}\n\nexport function guardedReleasePointerCapture(\n args: GuardedReleasePointerCaptureArgs\n): void {\n const { event, element } = args\n if (element?.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId)\n }\n}\n","// Maps overdrag distance onto a diminishing, ever-increasing offset that\n// approaches `max` but never reaches it, so resistance always keeps growing.\n// Higher `tightness` climbs toward the edge sooner while staying elastic.\nexport function rubberband(distance: number, max: number, tightness = 2) {\n if (max <= 0 || distance <= 0) {\n return 0\n }\n return (1 - 1 / ((distance * tightness) / max + 1)) * max\n}\n","export function scrollbarGutterSupport() {\n return CSS.supports('scrollbar-gutter', 'stable')\n}\n","export function scrollbarWidth() {\n const wrapper = document.createElement('div')\n wrapper.style.position = 'absolute'\n wrapper.style.visibility = 'hidden'\n wrapper.style.overflow = 'hidden'\n wrapper.style.width = '100px'\n wrapper.style.height = '100px'\n wrapper.style.top = '-9999px'\n\n wrapper.innerHTML = '<div style=\"width: 200px; height: 200px;\"></div>'\n document.body.appendChild(wrapper)\n\n // Get the scrollbar width\n const withoutScrollbar = wrapper.clientWidth\n wrapper.style.overflow = 'scroll'\n const withScrollbar = wrapper.clientWidth\n\n // Clean up\n document.body.removeChild(wrapper)\n\n return Math.round(withoutScrollbar - withScrollbar)\n}\n","let lockCount = 0\nlet previousUserSelect = ''\nlet previousWebkitUserSelect = ''\n\nfunction onSelectstart(event: Event) {\n event.preventDefault()\n}\n\n// Blocks text selection page-wide, e.g. for the duration of a drag.\nexport function lockSelection(): () => void {\n if (typeof document === 'undefined') {\n return () => {}\n }\n\n if (lockCount === 0) {\n const { style } = document.documentElement\n previousUserSelect = style.userSelect\n previousWebkitUserSelect = style.webkitUserSelect\n style.userSelect = 'none'\n style.webkitUserSelect = 'none'\n document.addEventListener('selectstart', onSelectstart)\n }\n\n lockCount++\n\n let released = false\n\n return function releaseSelection() {\n if (released) {\n return\n }\n\n released = true\n lockCount--\n\n if (lockCount === 0) {\n const { style } = document.documentElement\n style.userSelect = previousUserSelect\n style.webkitUserSelect = previousWebkitUserSelect\n document.removeEventListener('selectstart', onSelectstart)\n }\n }\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) {\n appendChar = ch\n }\n if (appendChar === _options?.separator) {\n appendChar = ' '\n }\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","export function uniq<T extends unknown[]>(a: T) {\n return Array.from(new Set(a))\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/convertToPixels.ts","../../packages/utils/src/functions/createStateStore.ts","../../packages/utils/src/functions/easings.ts","../../packages/utils/src/functions/edgeNavigation.ts","../../packages/utils/src/functions/toNumber.ts","../../packages/utils/src/functions/formatTime.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isAndroid.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/isWithinRange.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/matchClass.ts","../../packages/utils/src/functions/pointerCapture.ts","../../packages/utils/src/functions/rubberband.ts","../../packages/utils/src/functions/scrollbarGutterSupport.ts","../../packages/utils/src/functions/scrollbarWidth.ts","../../packages/utils/src/functions/selectionLock.ts","../../packages/utils/src/functions/slugify.ts","../../packages/utils/src/functions/snapTarget.ts","../../packages/utils/src/functions/uniq.ts"],"sourcesContent":["export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","// Converts a CSS length string in `px` or `rem` to an absolute pixel value.\n// Returns undefined for any other unit or an unparseable value, so callers can\n// warn with their own context.\nexport function convertToPixels(value: string): number | undefined {\n const match = value.trim().match(/^(\\d*\\.?\\d+)\\s*(rem|px)$/)\n if (!match) {\n return undefined\n }\n\n const numericValue = parseFloat(match[1] ?? '')\n\n if (match[2] === 'rem') {\n const rootFontSize =\n parseFloat(getComputedStyle(document.body).fontSize) || 16\n return numericValue * rootFontSize\n }\n\n return numericValue\n}\n","import { getCurrentInstance, ref } from 'vue'\nimport type { Ref } from 'vue'\n\nexport type CreateStore<T> = () => Ref<T>\n\nexport function createStateStore<T>(\n key: string,\n setInitialValue: () => T\n): CreateStore<T> {\n return function getOrCreateStore(): Ref<T> {\n const instance = getCurrentInstance()\n const app = instance?.appContext.app\n\n // If no app instance is found, return a fresh store. Event handlers,\n // timers and watcher callbacks run without one, so composables that use\n // a store must be called during setup, never from inside those.\n if (!app || !key) {\n return ref(setInitialValue()) as Ref<T>\n }\n\n // Create a global Map to hold all state stores\n if (!app.config.globalProperties.__VEStateStores) {\n app.config.globalProperties.__VEStateStores = new Map<string, Ref<T>>()\n }\n\n // Check if a store already exists for this app instance\n let store = app.config.globalProperties.__VEStateStores.get(key)\n\n // If no store exists for this app instance, create one\n if (!store) {\n store = ref(setInitialValue()) as Ref<T>\n app.config.globalProperties.__VEStateStores.set(key, store)\n }\n\n return store\n }\n}\n","export function linear(t: number) {\n return t\n}\nexport function easeInQuad(t: number) {\n return t * t\n}\nexport function easeOutQuad(t: number) {\n return t * (2 - t)\n}\nexport function easeInOutQuad(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t\n}\nexport function easeOutBack(t: number, o: number = 1.25) {\n return 1 + (t - 1) * (t - 1) * ((o + 1) * (t - 1) + o)\n}\nexport function easeInCubic(t: number) {\n return t * t * t\n}\nexport function easeOutCubic(t: number) {\n return --t * t * t + 1\n}\nexport function easeInOutCubic(t: number) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1\n}\nexport function easeInQuart(t: number) {\n return t * t * t * t\n}\nexport function easeOutQuart(t: number) {\n return 1 - --t * t * t * t\n}\nexport function easeInOutQuart(t: number) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t\n}\nexport function easeInQuint(t: number) {\n return t * t * t * t * t\n}\nexport function easeOutQuint(t: number) {\n return 1 + --t * t * t * t * t\n}\nexport function easeInOutQuint(t: number) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t\n}\n","interface CancelEdgeNavigationArgs {\n event: TouchEvent\n threshold?: number\n slop?: number\n exclude?: string[]\n}\n\ninterface RestoreClickArgs {\n target: HTMLElement\n touch: Touch\n slop: number\n}\n\n// iPadOS reports a Macintosh user agent, so touch support is the tell\nexport function hasEdgeNavigationGestures() {\n if (typeof window === 'undefined') {\n return false\n }\n\n return (\n /iPad|iPhone|iPod/.test(navigator?.userAgent) ||\n (/Macintosh/.test(navigator?.userAgent) && navigator?.maxTouchPoints > 1)\n )\n}\n\n// Canceling touchstart is the one signal WebKit honors to keep its edge\n// navigation swipe from arming; pointer events keep firing regardless\nexport function cancelEdgeNavigation(args: CancelEdgeNavigationArgs): boolean {\n const {\n event,\n threshold = 44,\n slop = 12,\n exclude = ['SELECT', 'OPTION', 'INPUT', 'TEXTAREA'],\n } = args\n\n if (!hasEdgeNavigationGestures() || !event.cancelable) {\n return false\n }\n\n if (event.touches.length !== 1) {\n return false\n }\n\n const touch = event.touches[0]\n const target =\n event.target instanceof Element ? closestHTMLElement(event.target) : null\n\n if (!touch || !target) {\n return false\n }\n\n if (\n exclude.some((tag) => tag.toUpperCase() === target.tagName) ||\n target.isContentEditable\n ) {\n return false\n }\n\n if (\n touch.clientX > threshold &&\n touch.clientX < window.innerWidth - threshold\n ) {\n return false\n }\n\n event.preventDefault()\n restoreClick({ target, touch, slop })\n\n return true\n}\n\n// An SVG element has no click(), so a touch on an icon restores the click on\n// the HTML element that holds it\nfunction closestHTMLElement(element: Element) {\n for (\n let current: Element | null = element;\n current;\n current = current.parentElement\n ) {\n if (current instanceof HTMLElement) {\n return current\n }\n }\n\n return null\n}\n\n// Canceling touchstart swallows the tap’s synthesized click; a touch that\n// ends within the slop dispatches a deferred replacement\nfunction restoreClick(args: RestoreClickArgs) {\n const { target, touch, slop } = args\n const { identifier, clientX, clientY } = touch\n\n function findTouch(list: TouchList) {\n for (let index = 0; index < list.length; index++) {\n const candidate = list[index]\n if (candidate?.identifier === identifier) {\n return candidate\n }\n }\n\n return undefined\n }\n\n function teardown() {\n document.removeEventListener('touchend', onTouchend, true)\n document.removeEventListener('touchcancel', onTouchcancel, true)\n }\n\n function onTouchend(event: TouchEvent) {\n const endTouch = findTouch(event.changedTouches)\n\n if (!endTouch) {\n return\n }\n\n teardown()\n\n const distance = Math.hypot(\n endTouch.clientX - clientX,\n endTouch.clientY - clientY\n )\n\n if (distance <= slop) {\n setTimeout(() => target.click())\n }\n }\n\n function onTouchcancel(event: TouchEvent) {\n if (findTouch(event.changedTouches)) {\n teardown()\n }\n }\n\n document.addEventListener('touchend', onTouchend, true)\n document.addEventListener('touchcancel', onTouchcancel, true)\n}\n","export function toNumber(value: string | number): number {\n return typeof value === 'string' ? parseFloat(value) : Number(value)\n}\n","import { toNumber } from './toNumber'\n\nexport function formatTime(seconds: number, guide: number) {\n seconds = seconds < 0 ? 0 : seconds\n let s: string | number = Math.floor(seconds % 60)\n let m: string | number = Math.floor((seconds / 60) % 60)\n let h: string | number = Math.floor(seconds / 3600)\n const gm = Math.floor((guide / 60) % 60)\n const gh = Math.floor(guide / 3600)\n\n // handle invalid times\n if (isNaN(seconds) || seconds === Infinity) {\n // '-' is false for all relational operators (e.g. <, >=) so this setting\n // will add the minimum number of fields specified by the guide\n h = m = s = '-'\n }\n\n // Check if we need to show hours\n h = toNumber(h) > 0 || gh > 0 ? h + ':' : ''\n\n // If hours are showing, we may need to add a leading zero.\n // Always show at least one digit of minutes.\n m = ((h || gm >= 10) && toNumber(m) < 10 ? '0' + m : m) + ':'\n\n // Check if leading zero is need for seconds\n s = toNumber(s) < 10 ? '0' + s : s\n\n return h + m + s\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n easing?: (t: number) => number\n callback: (result: number) => void\n interpolationIdCallback?: (id: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const {\n from,\n to,\n duration,\n callback,\n interpolationIdCallback = () => {},\n easing = (t) => t * (2 - t),\n } = args\n\n let startTime: number\n let interpolationId: number\n\n function animate(timestamp: number) {\n if (!startTime) {\n startTime = timestamp\n }\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 interpolationId = requestAnimationFrame(animate)\n interpolationIdCallback(interpolationId)\n }\n }\n\n interpolationId = requestAnimationFrame(animate)\n\n return interpolationId\n}\n","export function isAndroid() {\n if (typeof window === 'undefined') {\n return false\n }\n return /android/i.test(navigator?.userAgent)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') {\n return false\n }\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","interface isWithinRangeArgs {\n input: number\n base: number\n threshold: number\n}\n\nexport function isWithinRange(args: isWithinRangeArgs): boolean {\n const { input, base, threshold } = args\n return input >= base - threshold && input <= base + threshold\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","export function matchClass(el: Element, regex: RegExp) {\n return Array.from(el.classList).some((className) => regex.test(className))\n}\n","interface GuardedSetPointerCaptureArgs {\n event: PointerEvent\n element?: Element | null\n mouse?: boolean\n debug?: boolean\n}\n\ninterface GuardedReleasePointerCaptureArgs {\n event: PointerEvent\n element?: Element | null\n}\n\nexport function guardedSetPointerCapture(\n args: GuardedSetPointerCaptureArgs\n): void {\n const { event, element, mouse, debug } = args\n if (element && event.isPrimary && (mouse || event.pointerType !== 'mouse')) {\n try {\n const coalescedEvents: PointerEvent[] =\n 'getCoalescedEvents' in event ? event.getCoalescedEvents() : [event]\n\n if (coalescedEvents.length > 0 || mouse) {\n element?.setPointerCapture(event.pointerId)\n }\n } catch (error) {\n if (debug) {\n console.warn('Failed to set pointer capture:', error)\n }\n }\n }\n}\n\nexport function guardedReleasePointerCapture(\n args: GuardedReleasePointerCaptureArgs\n): void {\n const { event, element } = args\n if (element?.hasPointerCapture(event.pointerId)) {\n element.releasePointerCapture(event.pointerId)\n }\n}\n","// Maps overdrag distance onto a diminishing, ever-increasing offset that\n// approaches `max` but never reaches it, so resistance always keeps growing.\n// Higher `tightness` climbs toward the edge sooner while staying elastic.\nexport function rubberband(distance: number, max: number, tightness = 2) {\n if (max <= 0 || distance <= 0) {\n return 0\n }\n return (1 - 1 / ((distance * tightness) / max + 1)) * max\n}\n","export function scrollbarGutterSupport() {\n return CSS.supports('scrollbar-gutter', 'stable')\n}\n","export function scrollbarWidth() {\n const wrapper = document.createElement('div')\n wrapper.style.position = 'absolute'\n wrapper.style.visibility = 'hidden'\n wrapper.style.overflow = 'hidden'\n wrapper.style.width = '100px'\n wrapper.style.height = '100px'\n wrapper.style.top = '-9999px'\n\n wrapper.innerHTML = '<div style=\"width: 200px; height: 200px;\"></div>'\n document.body.appendChild(wrapper)\n\n // Get the scrollbar width\n const withoutScrollbar = wrapper.clientWidth\n wrapper.style.overflow = 'scroll'\n const withScrollbar = wrapper.clientWidth\n\n // Clean up\n document.body.removeChild(wrapper)\n\n return Math.round(withoutScrollbar - withScrollbar)\n}\n","let lockCount = 0\nlet previousUserSelect = ''\nlet previousWebkitUserSelect = ''\n\nfunction onSelectstart(event: Event) {\n event.preventDefault()\n}\n\n// Blocks text selection page-wide, e.g. for the duration of a drag.\nexport function lockSelection(): () => void {\n if (typeof document === 'undefined') {\n return () => {}\n }\n\n if (lockCount === 0) {\n const { style } = document.documentElement\n previousUserSelect = style.userSelect\n previousWebkitUserSelect = style.webkitUserSelect\n style.userSelect = 'none'\n style.webkitUserSelect = 'none'\n document.addEventListener('selectstart', onSelectstart)\n }\n\n lockCount++\n\n let released = false\n\n return function releaseSelection() {\n if (released) {\n return\n }\n\n released = true\n lockCount--\n\n if (lockCount === 0) {\n const { style } = document.documentElement\n style.userSelect = previousUserSelect\n style.webkitUserSelect = previousWebkitUserSelect\n document.removeEventListener('selectstart', onSelectstart)\n }\n }\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) {\n appendChar = ch\n }\n if (appendChar === _options?.separator) {\n appendChar = ' '\n }\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","import { clampValue } from './clampValue'\n\nexport type SnapRange = {\n min: number\n max: number\n // False keeps a flick released inside the range from carrying on\n momentum?: boolean\n}\n\nexport type SnapDirection = 'below' | 'above'\n\nexport type SnapMode = 'closest' | 'step'\n\n// A drag along one axis, in pixels\nexport type SnapDrag = {\n // Snap points and range ends, sorted ascending\n points: Array<number>\n ranges: Array<SnapRange>\n mode: SnapMode\n // Where the side rests, where the drag started, and where it is now\n rest: number\n start: number\n position: number\n}\n\ntype SnapRangeAtArgs<RangeType extends SnapRange> = {\n ranges: Array<RangeType>\n position: number\n}\n\ntype ClosestSnapPointArgs = {\n points: Array<number>\n value: number\n direction?: SnapDirection | 'absolute'\n}\n\ntype SnapTargetAtArgs = {\n points: Array<number>\n ranges: Array<SnapRange>\n value: number\n}\n\ntype SnapCommitArgs = SnapDrag & {\n distance: number\n flicked: boolean\n flickDirection?: SnapDirection\n}\n\ntype SnapReleaseArgs = SnapDrag & {\n committed: number | undefined\n flicked: boolean\n tapped: boolean\n}\n\n// The range a position lies within, ends included\nexport function snapRangeAt<RangeType extends SnapRange>(\n args: SnapRangeAtArgs<RangeType>\n) {\n const { ranges, position } = args\n\n return ranges.find((range) => position >= range.min && position <= range.max)\n}\n\n// The closest point to a value, in a direction or either way. With nothing\n// past the value in the direction, the outermost point that way.\nexport function closestSnapPoint(args: ClosestSnapPointArgs) {\n const { points, value, direction = 'absolute' } = args\n\n if (!points.length) {\n return undefined\n }\n\n switch (direction) {\n case 'above':\n return points.find((point) => point > value) ?? points.at(-1)\n case 'below':\n return [...points].reverse().find((point) => point < value) ?? points[0]\n case 'absolute':\n return points.reduce((closest, point) =>\n Math.abs(point - value) < Math.abs(closest - value) ? point : closest\n )\n }\n}\n\n// Where a value lands without a drag: in place inside a range, otherwise at\n// the closest point\nexport function snapTargetAt(args: SnapTargetAtArgs) {\n const { points, ranges, value } = args\n\n return snapRangeAt({ ranges, position: value })\n ? value\n : closestSnapPoint({ points, value })\n}\n\n// For a drag that started inside a range, the position clamped to that\n// range, so travel within the range never counts toward a snap\nfunction clampToRestRange(drag: SnapDrag) {\n const range = snapRangeAt({ ranges: drag.ranges, position: drag.rest })\n\n return range ? clampValue(drag.position, range.min, range.max) : undefined\n}\n\n// The closest point in the drag direction, or in 'step' mode the next one\n// from where the side rests\nfunction nextSnapPoint(args: SnapDrag & { direction: SnapDirection }) {\n const { points, mode, rest, position, direction } = args\n const value = mode === 'step' ? rest : position\n\n return closestSnapPoint({ points, value, direction })\n}\n\n// A release inside a range rests in place, unless flicked in a range with\n// momentum. In 'step' mode only inside the range the side rests in, or the\n// one whose end is the next step.\nfunction restsInRange(args: SnapDrag & { flicked: boolean }) {\n const { ranges, mode, rest, position, flicked } = args\n const range = snapRangeAt({ ranges, position })\n\n if (!range || (flicked && range.momentum !== false)) {\n return false\n }\n\n const startsInside = rest >= range.min && rest <= range.max\n\n if (mode !== 'step' || startsInside) {\n return true\n }\n\n const direction = position < rest ? 'below' : 'above'\n const next = nextSnapPoint({ ...args, direction })\n\n return next === (direction === 'above' ? range.min : range.max)\n}\n\n// The point a drag commits to once it passes the distance threshold or is\n// flicked, otherwise undefined so a release reverts\nexport function snapCommit(args: SnapCommitArgs) {\n const { distance, flicked, flickDirection, ...drag } = args\n const delta = drag.position - (clampToRestRange(drag) ?? drag.start)\n\n if (Math.abs(delta) > distance) {\n return nextSnapPoint({ ...drag, direction: delta < 0 ? 'below' : 'above' })\n }\n\n if (flicked && flickDirection) {\n return nextSnapPoint({ ...drag, direction: flickDirection })\n }\n\n return undefined\n}\n\n// Where a release comes to rest: in place inside a range, at the committed\n// point, or back where the drag started. A tap never rests inside a range,\n// or a pulled handle would keep the pulled position.\nexport function snapRelease(args: SnapReleaseArgs) {\n const { committed, flicked, tapped, ...drag } = args\n\n if (tapped) {\n return committed ?? drag.rest\n }\n\n if (restsInRange({ ...drag, flicked })) {\n return drag.position\n }\n\n return committed ?? clampToRestRange(drag) ?? drag.rest\n}\n","export function uniq<T extends unknown[]>(a: T) {\n return Array.from(new Set(a))\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maas/vue-equipment",
|
|
3
3
|
"description": "Our Frontend Toolkit, Free and Open Source",
|
|
4
|
-
"version": "1.0
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"contributors": [
|
|
6
6
|
{
|
|
7
7
|
"name": "Robin Scholz",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"@floating-ui/vue": "^1 || ^2",
|
|
79
79
|
"@maas/magic-timer": "^1",
|
|
80
80
|
"@maas/vue-autosize": "^1",
|
|
81
|
-
"@maas/vue-primitive": "^1.
|
|
81
|
+
"@maas/vue-primitive": "^1.5",
|
|
82
82
|
"@nuxt/kit": ">=3",
|
|
83
83
|
"@vueuse/core": ">=12",
|
|
84
84
|
"@vueuse/integrations": ">=12",
|