@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.
Files changed (41) hide show
  1. package/dist/nuxt/module.json +1 -1
  2. package/dist/nuxt/module.mjs +2 -2
  3. package/dist/plugins/MagicCarousel/src/utils/defaultOptions.mjs +1 -1
  4. package/dist/plugins/MagicDraggable/src/utils/defaultOptions.mjs +1 -1
  5. package/dist/plugins/MagicDrawer/index.d.ts +2 -2
  6. package/dist/plugins/MagicDrawer/src/components/MagicDrawerContent.vue +4 -0
  7. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +128 -170
  8. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerProgress.mjs +57 -77
  9. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerSnap.d.ts +16 -11
  10. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerSnap.mjs +175 -175
  11. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerState.mjs +2 -1
  12. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerUtils.d.ts +3 -0
  13. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerUtils.mjs +11 -1
  14. package/dist/plugins/MagicDrawer/src/composables/useMagicDrawer.d.ts +1 -0
  15. package/dist/plugins/MagicDrawer/src/composables/useMagicDrawer.mjs +2 -1
  16. package/dist/plugins/MagicDrawer/src/types/index.d.ts +8 -1
  17. package/dist/plugins/MagicDrawer/src/utils/defaultOptions.mjs +1 -1
  18. package/dist/plugins/MagicTray/index.d.ts +4 -3
  19. package/dist/plugins/MagicTray/index.mjs +3 -0
  20. package/dist/plugins/MagicTray/src/components/MagicTrayContent.d.vue.ts +2 -2
  21. package/dist/plugins/MagicTray/src/components/MagicTrayContent.vue +17 -16
  22. package/dist/plugins/MagicTray/src/components/MagicTrayContent.vue.d.ts +2 -2
  23. package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.d.vue.ts +25 -0
  24. package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.vue +90 -0
  25. package/dist/plugins/MagicTray/src/components/MagicTrayTrigger.vue.d.ts +25 -0
  26. package/dist/plugins/MagicTray/src/composables/private/useTrayDrag.d.ts +0 -4
  27. package/dist/plugins/MagicTray/src/composables/private/useTrayDrag.mjs +27 -385
  28. package/dist/plugins/MagicTray/src/composables/private/useTrayGesture.d.ts +16 -0
  29. package/dist/plugins/MagicTray/src/composables/private/useTrayGesture.mjs +426 -0
  30. package/dist/plugins/MagicTray/src/composables/private/useTrayMagnetism.mjs +11 -37
  31. package/dist/plugins/MagicTray/src/composables/private/useTrayProgress.mjs +1 -1
  32. package/dist/plugins/MagicTray/src/composables/private/useTraySnap.d.ts +12 -7
  33. package/dist/plugins/MagicTray/src/composables/private/useTraySnap.mjs +88 -40
  34. package/dist/plugins/MagicTray/src/composables/private/useTrayUtils.d.ts +10 -1
  35. package/dist/plugins/MagicTray/src/composables/private/useTrayUtils.mjs +17 -1
  36. package/dist/plugins/MagicTray/src/types/index.d.ts +7 -1
  37. package/dist/plugins/MagicTray/src/utils/defaultOptions.mjs +1 -1
  38. package/dist/utils/index.d.ts +46 -1
  39. package/dist/utils/index.js +75 -0
  40. package/dist/utils/index.js.map +1 -1
  41. package/package.json +2 -2
@@ -1,10 +1,21 @@
1
1
  import { computed, nextTick, toValue } from "vue";
2
- import { clampValue, interpolate } from "@maas/vue-equipment/utils";
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 || mapped === 0) {
66
+ if (isMapped(mapped)) {
58
67
  map[mapped] = snapPoint;
59
68
  }
60
69
  }
61
70
  return map;
62
71
  }
63
- function findClosestNumber(value, numbers, direction) {
64
- if (!numbers.length) {
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
- let filtered = numbers;
68
- switch (direction) {
69
- case "above":
70
- filtered = numbers.filter((num) => num > value);
71
- break;
72
- case "below":
73
- filtered = numbers.filter((num) => num < value);
74
- break;
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
- if (filtered.length === 0) {
77
- switch (direction) {
78
- case "above":
79
- return Math.max(...numbers);
80
- case "below":
81
- return Math.min(...numbers);
82
- default:
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 filtered.reduce(
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 findClosestSnapPoint(args2) {
91
- const { side, value, direction = "absolute" } = args2;
92
- return findClosestNumber(value, mappedSnapPoints(side), direction);
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 = snapPointsMap(side)[to];
102
- if (!snapPoint && snapPoint !== 0) {
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 = findClosestSnapPoint({ side, value: mapped }) ?? mapped;
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
- snapPointsMap,
158
- findClosestSnapPoint,
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, MagicTraySnapPoint[]>>;
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>>;
@@ -19,7 +19,7 @@ const defaultOptions = {
19
19
  virtual: false
20
20
  },
21
21
  threshold: {
22
- lock: 0,
22
+ lock: 8,
23
23
  distance: 128,
24
24
  momentum: 1
25
25
  },
@@ -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 };
@@ -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
@@ -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.1",
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.4",
81
+ "@maas/vue-primitive": "^1.5",
82
82
  "@nuxt/kit": ">=3",
83
83
  "@vueuse/core": ">=12",
84
84
  "@vueuse/integrations": ">=12",