@maas/vue-equipment 1.0.0-beta.56 → 1.0.0-beta.58

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 (38) hide show
  1. package/dist/composables/useScrollTo/index.js +3 -1
  2. package/dist/composables/useScrollTo/index.js.map +1 -1
  3. package/dist/nuxt/module.json +1 -1
  4. package/dist/nuxt/module.mjs +1 -1
  5. package/dist/plugins/MagicCommand/src/composables/private/useCommandView.mjs +3 -1
  6. package/dist/plugins/MagicCookie/src/components/MagicCookieProvider.d.vue.ts +2 -2
  7. package/dist/plugins/MagicCookie/src/components/MagicCookieProvider.vue +3 -8
  8. package/dist/plugins/MagicCookie/src/components/MagicCookieProvider.vue.d.ts +2 -2
  9. package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue +8 -8
  10. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +17 -8
  11. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerGuards.mjs +6 -0
  12. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerProgress.mjs +6 -2
  13. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerUtils.d.ts +1 -1
  14. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerUtils.mjs +8 -5
  15. package/dist/plugins/MagicEmitter/src/composables/useMagicEmitter.d.ts +36 -36
  16. package/dist/plugins/MagicMenu/src/composables/private/useMenuView.mjs +3 -1
  17. package/dist/plugins/MagicModal/src/components/MagicModal.vue +11 -11
  18. package/dist/plugins/MagicPlayer/src/components/MagicPlayerAudio.vue +4 -2
  19. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +7 -2
  20. package/dist/plugins/MagicPlayer/src/components/MagicPlayerOverlay.vue +3 -1
  21. package/dist/plugins/MagicPlayer/src/components/MagicPlayerProvider.vue +26 -2
  22. package/dist/plugins/MagicPlayer/src/components/MagicPlayerVideo.vue +6 -4
  23. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerMediaApi.mjs +2 -1
  24. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerPlaylistApi.d.ts +10 -0
  25. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerPlaylistApi.mjs +27 -0
  26. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.d.ts +1 -1
  27. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerRuntime.mjs +52 -7
  28. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerState.mjs +5 -1
  29. package/dist/plugins/MagicPlayer/src/composables/useMagicPlayer.d.ts +6 -0
  30. package/dist/plugins/MagicPlayer/src/composables/useMagicPlayer.mjs +12 -1
  31. package/dist/plugins/MagicPlayer/src/symbols/index.d.ts +3 -2
  32. package/dist/plugins/MagicPlayer/src/symbols/index.mjs +2 -0
  33. package/dist/plugins/MagicPlayer/src/types/index.d.ts +6 -2
  34. package/dist/plugins/MagicToast/src/components/MagicToastProvider.vue +5 -1
  35. package/dist/plugins/tsconfig.test.json +8 -0
  36. package/dist/utils/index.js +9 -3
  37. package/dist/utils/index.js.map +1 -1
  38. package/package.json +8 -4
@@ -80,7 +80,9 @@ function useScrollTo() {
80
80
  const startTime = Date.now();
81
81
  const { x: fromX, y: fromY } = getScrollPosition(parent);
82
82
  if (fromX === top && fromY === left) {
83
- if (callback) callback();
83
+ if (callback) {
84
+ callback();
85
+ }
84
86
  return;
85
87
  }
86
88
  const mappedDuration = { x: 500, y: 500, ...duration };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../packages/composables/useScrollTo/index.ts"],"sourcesContent":["import {\n unrefElement,\n type MaybeComputedElementRef,\n type MaybeElement,\n} from '@vueuse/core'\nimport { easeOutQuad } from '@maas/vue-equipment/utils'\n\nexport type ScrollToTarget =\n | string\n | Element\n | MaybeElement\n | MaybeComputedElementRef\n\nexport type ScrollToParent = ScrollToTarget | Window\n\nexport type ScrollToParams = {\n parent?: Element | Window\n left: number\n top: number\n duration?: { x?: number; y?: number }\n easing?: (t: number) => number\n callback?: () => void\n}\n\nexport type getScrollDurationParams = {\n parent: Element | Window\n left: number\n top: number\n speed: number\n}\n\nexport type scrollToTargetParams = {\n target: ScrollToTarget\n parent?: ScrollToParent\n offset?: {\n x?: number\n y?: number\n }\n speed?: number\n easing?: (t: number) => number\n}\n\n// Private functions\nfunction min(a: number, b: number) {\n return a < b ? a : b\n}\n\nfunction unwrapParent(parent: ScrollToParent) {\n if (parent === window) {\n return parent\n } else if (typeof parent === 'string') {\n return document.querySelector(parent) || document.documentElement\n } else {\n return (\n unrefElement(parent as MaybeComputedElementRef<MaybeElement>) ||\n document.documentElement\n )\n }\n}\n\nfunction unwrapTarget(target: ScrollToTarget, parentEl: Element | Window) {\n if (typeof target === 'string') {\n const queryTarget = parentEl === window ? document : (parentEl as Element)\n return queryTarget.querySelector(target)\n } else {\n return unrefElement(target as MaybeComputedElementRef<MaybeElement>)\n }\n}\n\nfunction isHtmlElement(\n parentEl: Window | SVGElement | Element\n): parentEl is HTMLElement {\n return parentEl instanceof HTMLElement\n}\n\nfunction disableScrollSnap(parentEl: Window | SVGElement | Element) {\n if (isHtmlElement(parentEl)) {\n parentEl.style.scrollSnapType = 'none'\n }\n}\n\nfunction reenableScrollSnap(parentEl: Window | SVGElement | Element) {\n if (isHtmlElement(parentEl)) {\n parentEl.style.scrollSnapType = ''\n }\n}\n\n// Public composable\nexport function useScrollTo() {\n function getScrollPosition(element: Element | Window): {\n x: number\n y: number\n } {\n if (element === window) {\n return { x: window.scrollX, y: window.scrollY }\n } else if (element instanceof Element) {\n return { x: element.scrollLeft, y: element.scrollTop }\n } else {\n return { x: 0, y: 0 }\n }\n }\n\n function getDistance(\n target: Element,\n parent?: Element | Window\n ): { top: number; left: number } {\n const rect = target.getBoundingClientRect()\n const scrollEl =\n parent || document.scrollingElement || document.documentElement\n\n const scrollTop = scrollEl instanceof Window ? 0 : scrollEl.scrollTop\n const scrollLeft = scrollEl instanceof Window ? 0 : scrollEl.scrollLeft\n\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft,\n }\n }\n\n function getScrollDuration({\n parent = document.documentElement || document.body,\n left = 0,\n top = 0,\n speed = 500,\n }: getScrollDurationParams) {\n const currentPos = getScrollPosition(parent)\n const distanceX = currentPos.x - left\n const distanceY = currentPos.y - top\n const durationX = Math.abs((distanceX / speed) * 100)\n const durationY = Math.abs((distanceY / speed) * 100)\n\n return { x: durationX, y: durationY }\n }\n\n function scrollTo({\n parent = document.documentElement || document.body,\n top,\n left,\n duration = {},\n easing = easeOutQuad,\n callback,\n }: ScrollToParams) {\n const startTime = Date.now()\n const { x: fromX, y: fromY } = getScrollPosition(parent)\n\n if (fromX === top && fromY === left) {\n if (callback) callback()\n return\n }\n\n const mappedDuration = { x: 500, y: 500, ...duration }\n\n const scroll = () => {\n const currentTime = Date.now()\n\n const timeX = min(1, (currentTime - startTime) / mappedDuration.x)\n const timeY = min(1, (currentTime - startTime) / mappedDuration.y)\n const easedTimeX = easing(timeX)\n const easedTimeY = easing(timeY)\n\n // We use the min of the two times to make sure we scroll at the same speed\n const minTime = Math.min(easedTimeX, easedTimeY)\n\n parent.scroll({\n left: minTime * (left - fromX) + fromX,\n top: minTime * (top - fromY) + fromY,\n })\n\n if (easedTimeX < 1 || easedTimeY < 1) {\n requestAnimationFrame(scroll)\n } else if (callback) {\n callback()\n }\n }\n\n requestAnimationFrame(scroll)\n }\n\n function scrollToTarget({\n target,\n parent = document.documentElement || document.body,\n offset = {},\n speed = 500,\n easing = easeOutQuad,\n }: scrollToTargetParams) {\n const parentEl = unwrapParent(parent)\n if (!parentEl) {\n return\n }\n const targetEl = unwrapTarget(target, parentEl)\n if (!targetEl) {\n return\n }\n\n disableScrollSnap(parentEl)\n\n const mappedOffset = { x: 0, y: 0, ...offset }\n const distance = getDistance(targetEl, parentEl)\n const leftDistance = distance.left - mappedOffset.x\n const topDistance = distance.top - mappedOffset.y\n\n const scrollDuration = getScrollDuration({\n parent: parentEl,\n left: leftDistance,\n top: topDistance,\n speed: speed,\n })\n\n scrollTo({\n parent: parentEl,\n left: leftDistance,\n top: topDistance,\n duration: scrollDuration,\n easing: easing,\n callback: () => reenableScrollSnap(parentEl),\n })\n }\n\n return {\n getScrollPosition,\n getDistance,\n getScrollDuration,\n scrollTo,\n scrollToTarget,\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../packages/composables/useScrollTo/index.ts"],"sourcesContent":["import {\n unrefElement,\n type MaybeComputedElementRef,\n type MaybeElement,\n} from '@vueuse/core'\nimport { easeOutQuad } from '@maas/vue-equipment/utils'\n\nexport type ScrollToTarget =\n | string\n | Element\n | MaybeElement\n | MaybeComputedElementRef\n\nexport type ScrollToParent = ScrollToTarget | Window\n\nexport type ScrollToParams = {\n parent?: Element | Window\n left: number\n top: number\n duration?: { x?: number; y?: number }\n easing?: (t: number) => number\n callback?: () => void\n}\n\nexport type getScrollDurationParams = {\n parent: Element | Window\n left: number\n top: number\n speed: number\n}\n\nexport type scrollToTargetParams = {\n target: ScrollToTarget\n parent?: ScrollToParent\n offset?: {\n x?: number\n y?: number\n }\n speed?: number\n easing?: (t: number) => number\n}\n\n// Private functions\nfunction min(a: number, b: number) {\n return a < b ? a : b\n}\n\nfunction unwrapParent(parent: ScrollToParent) {\n if (parent === window) {\n return parent\n } else if (typeof parent === 'string') {\n return document.querySelector(parent) || document.documentElement\n } else {\n return (\n unrefElement(parent as MaybeComputedElementRef<MaybeElement>) ||\n document.documentElement\n )\n }\n}\n\nfunction unwrapTarget(target: ScrollToTarget, parentEl: Element | Window) {\n if (typeof target === 'string') {\n const queryTarget = parentEl === window ? document : (parentEl as Element)\n return queryTarget.querySelector(target)\n } else {\n return unrefElement(target as MaybeComputedElementRef<MaybeElement>)\n }\n}\n\nfunction isHtmlElement(\n parentEl: Window | SVGElement | Element\n): parentEl is HTMLElement {\n return parentEl instanceof HTMLElement\n}\n\nfunction disableScrollSnap(parentEl: Window | SVGElement | Element) {\n if (isHtmlElement(parentEl)) {\n parentEl.style.scrollSnapType = 'none'\n }\n}\n\nfunction reenableScrollSnap(parentEl: Window | SVGElement | Element) {\n if (isHtmlElement(parentEl)) {\n parentEl.style.scrollSnapType = ''\n }\n}\n\n// Public composable\nexport function useScrollTo() {\n function getScrollPosition(element: Element | Window): {\n x: number\n y: number\n } {\n if (element === window) {\n return { x: window.scrollX, y: window.scrollY }\n } else if (element instanceof Element) {\n return { x: element.scrollLeft, y: element.scrollTop }\n } else {\n return { x: 0, y: 0 }\n }\n }\n\n function getDistance(\n target: Element,\n parent?: Element | Window\n ): { top: number; left: number } {\n const rect = target.getBoundingClientRect()\n const scrollEl =\n parent || document.scrollingElement || document.documentElement\n\n const scrollTop = scrollEl instanceof Window ? 0 : scrollEl.scrollTop\n const scrollLeft = scrollEl instanceof Window ? 0 : scrollEl.scrollLeft\n\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft,\n }\n }\n\n function getScrollDuration({\n parent = document.documentElement || document.body,\n left = 0,\n top = 0,\n speed = 500,\n }: getScrollDurationParams) {\n const currentPos = getScrollPosition(parent)\n const distanceX = currentPos.x - left\n const distanceY = currentPos.y - top\n const durationX = Math.abs((distanceX / speed) * 100)\n const durationY = Math.abs((distanceY / speed) * 100)\n\n return { x: durationX, y: durationY }\n }\n\n function scrollTo({\n parent = document.documentElement || document.body,\n top,\n left,\n duration = {},\n easing = easeOutQuad,\n callback,\n }: ScrollToParams) {\n const startTime = Date.now()\n const { x: fromX, y: fromY } = getScrollPosition(parent)\n\n if (fromX === top && fromY === left) {\n if (callback) {\n callback()\n }\n return\n }\n\n const mappedDuration = { x: 500, y: 500, ...duration }\n\n const scroll = () => {\n const currentTime = Date.now()\n\n const timeX = min(1, (currentTime - startTime) / mappedDuration.x)\n const timeY = min(1, (currentTime - startTime) / mappedDuration.y)\n const easedTimeX = easing(timeX)\n const easedTimeY = easing(timeY)\n\n // We use the min of the two times to make sure we scroll at the same speed\n const minTime = Math.min(easedTimeX, easedTimeY)\n\n parent.scroll({\n left: minTime * (left - fromX) + fromX,\n top: minTime * (top - fromY) + fromY,\n })\n\n if (easedTimeX < 1 || easedTimeY < 1) {\n requestAnimationFrame(scroll)\n } else if (callback) {\n callback()\n }\n }\n\n requestAnimationFrame(scroll)\n }\n\n function scrollToTarget({\n target,\n parent = document.documentElement || document.body,\n offset = {},\n speed = 500,\n easing = easeOutQuad,\n }: scrollToTargetParams) {\n const parentEl = unwrapParent(parent)\n if (!parentEl) {\n return\n }\n const targetEl = unwrapTarget(target, parentEl)\n if (!targetEl) {\n return\n }\n\n disableScrollSnap(parentEl)\n\n const mappedOffset = { x: 0, y: 0, ...offset }\n const distance = getDistance(targetEl, parentEl)\n const leftDistance = distance.left - mappedOffset.x\n const topDistance = distance.top - mappedOffset.y\n\n const scrollDuration = getScrollDuration({\n parent: parentEl,\n left: leftDistance,\n top: topDistance,\n speed: speed,\n })\n\n scrollTo({\n parent: parentEl,\n left: leftDistance,\n top: topDistance,\n duration: scrollDuration,\n easing: easing,\n callback: () => reenableScrollSnap(parentEl),\n })\n }\n\n return {\n getScrollPosition,\n getDistance,\n getScrollDuration,\n scrollTo,\n scrollToTarget,\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment/nuxt",
3
3
  "configKey": "vueEquipment",
4
- "version": "1.0.0-beta.55",
4
+ "version": "1.0.0-beta.57",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "unknown"
@@ -137,7 +137,7 @@ const functions$1 = [
137
137
  {
138
138
  name: "useScrollTo",
139
139
  "package": "composables",
140
- lastUpdated: 1757314730000,
140
+ lastUpdated: 1780311933000,
141
141
  docs: "https://maas.egineering/vue-equipment/composables/useScrollTo/",
142
142
  description: "Scroll to an element with consistent speed"
143
143
  }
@@ -68,7 +68,9 @@ export function useCommandView(id) {
68
68
  let view = viewMap.get(id2);
69
69
  if (!view) {
70
70
  view = state.views.find((v) => v.id === id2);
71
- if (view) viewMap.set(id2, view);
71
+ if (view) {
72
+ viewMap.set(id2, view);
73
+ }
72
74
  }
73
75
  return view;
74
76
  }
@@ -4,9 +4,9 @@ type MagicCookieProviderProps = {
4
4
  id: MaybeRef<string>;
5
5
  options?: MagicCookieOptions;
6
6
  };
7
- declare var __VLS_7: {};
7
+ declare var __VLS_1: {};
8
8
  type __VLS_Slots = {} & {
9
- default?: (props: typeof __VLS_7) => any;
9
+ default?: (props: typeof __VLS_1) => any;
10
10
  };
11
11
  declare const __VLS_base: import("vue").DefineComponent<MagicCookieProviderProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MagicCookieProviderProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
12
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,9 +1,7 @@
1
1
  <template>
2
- <client-only>
3
- <div class="magic-cookie-provider" v-bind="$attrs">
4
- <slot />
5
- </div>
6
- </client-only>
2
+ <div class="magic-cookie-provider">
3
+ <slot />
4
+ </div>
7
5
  </template>
8
6
 
9
7
  <script setup>
@@ -12,9 +10,6 @@ import { defu } from "defu";
12
10
  import { useCookieState } from "../composables/private/useCookieState";
13
11
  import { defaultOptions } from "../utils/defaultOptions";
14
12
  import { MagicCookieInstanceId } from "../symbols";
15
- defineOptions({
16
- inheritAttrs: false
17
- });
18
13
  const { id, options } = defineProps({
19
14
  id: { type: null, required: true },
20
15
  options: { type: Object, required: false }
@@ -4,9 +4,9 @@ type MagicCookieProviderProps = {
4
4
  id: MaybeRef<string>;
5
5
  options?: MagicCookieOptions;
6
6
  };
7
- declare var __VLS_7: {};
7
+ declare var __VLS_1: {};
8
8
  type __VLS_Slots = {} & {
9
- default?: (props: typeof __VLS_7) => any;
9
+ default?: (props: typeof __VLS_1) => any;
10
10
  };
11
11
  declare const __VLS_base: import("vue").DefineComponent<MagicCookieProviderProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MagicCookieProviderProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
12
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -309,15 +309,15 @@ onUnmounted(() => {
309
309
  --magic-drawer-padding: 0px;
310
310
  --magic-drawer-drag-overshoot-x: 0px;
311
311
  --magic-drawer-drag-overshoot-y: 0px;
312
- position: fixed;
313
- inset: 0;
314
- width: 100%;
315
- height: 100%;
316
- display: flex;
317
- pointer-events: none;
312
+ position: var(--magic-drawer-position, fixed);
313
+ inset: var(--magic-drawer-inset, 0);
314
+ display: var(--magic-drawer-display, flex);
318
315
  justify-content: var(--magic-drawer-justify-content);
319
316
  align-items: var(--magic-drawer-align-items);
320
317
  z-index: var(--magic-drawer-z-index, 999);
318
+ width: 100%;
319
+ height: 100%;
320
+ pointer-events: none;
321
321
  background: transparent;
322
322
  color: inherit;
323
323
  padding: 0;
@@ -402,8 +402,8 @@ onUnmounted(() => {
402
402
  }
403
403
 
404
404
  .magic-drawer__content {
405
- width: 100%;
406
- max-height: 100%;
405
+ width: var(--magic-drawer-content-width, 100%);
406
+ max-height: var(--magic-drawer-content-max-height, 100%);
407
407
  height: var(--magic-drawer-content-height, 100%);
408
408
  position: relative;
409
409
  }
@@ -213,31 +213,40 @@ export function useDrawerDrag(args) {
213
213
  }
214
214
  }
215
215
  function setDragged({ x, y }) {
216
+ const os = toValue(overshoot);
216
217
  switch (position) {
217
218
  case "bottom": {
218
- const newDraggedB = clamp(y - originY.value, 0, toValue(overshoot) * -1);
219
- if (newDraggedB === draggedY.value) break;
219
+ const newDraggedB = clamp(y - originY.value, 0, os * -1, false);
220
+ if (newDraggedB === draggedY.value) {
221
+ break;
222
+ }
220
223
  relDirectionY.value = newDraggedB < draggedY.value ? "below" : "above";
221
224
  draggedY.value = newDraggedB;
222
225
  break;
223
226
  }
224
227
  case "top": {
225
- const newDraggedT = clamp(y - originY.value, 0, toValue(overshoot));
226
- if (newDraggedT === draggedY.value) break;
228
+ const newDraggedT = clamp(y - originY.value, 0, os, true);
229
+ if (newDraggedT === draggedY.value) {
230
+ break;
231
+ }
227
232
  relDirectionY.value = newDraggedT < draggedY.value ? "below" : "above";
228
233
  draggedY.value = newDraggedT;
229
234
  break;
230
235
  }
231
236
  case "right": {
232
- const newDraggedR = clamp(x - originX.value, 0, toValue(overshoot) * -1);
233
- if (newDraggedR === draggedX.value) break;
237
+ const newDraggedR = clamp(x - originX.value, 0, os * -1, false);
238
+ if (newDraggedR === draggedX.value) {
239
+ break;
240
+ }
234
241
  relDirectionX.value = newDraggedR < draggedX.value ? "below" : "above";
235
242
  draggedX.value = newDraggedR;
236
243
  break;
237
244
  }
238
245
  case "left": {
239
- const newDraggedL = clamp(x - originX.value, 0, toValue(overshoot));
240
- if (newDraggedL === draggedX.value) break;
246
+ const newDraggedL = clamp(x - originX.value, 0, os, true);
247
+ if (newDraggedL === draggedX.value) {
248
+ break;
249
+ }
241
250
  relDirectionX.value = newDraggedL < draggedX.value ? "below" : "above";
242
251
  draggedX.value = newDraggedL;
243
252
  break;
@@ -9,6 +9,9 @@ export function useDrawerGuards(args) {
9
9
  return toValue(activeSnapPoint) !== 1 && !!toValue(activeSnapPoint);
10
10
  });
11
11
  function canScrollY(element) {
12
+ if (!(element instanceof Element)) {
13
+ return false;
14
+ }
12
15
  const style = window.getComputedStyle(element);
13
16
  const overflowY = style.overflowY;
14
17
  const canScroll = ["auto", "scroll"].includes(overflowY);
@@ -16,6 +19,9 @@ export function useDrawerGuards(args) {
16
19
  return canScroll && hasOverflow;
17
20
  }
18
21
  function canScrollX(element) {
22
+ if (!(element instanceof Element)) {
23
+ return false;
24
+ }
19
25
  const style = window.getComputedStyle(element);
20
26
  const overflowX = style.overflowX;
21
27
  const canScroll = ["auto", "scroll"].includes(overflowX);
@@ -82,8 +82,12 @@ export function useDrawerProgress(args) {
82
82
  );
83
83
  break;
84
84
  }
85
- rawX = rawX === -0 ? 0 : rawX;
86
- rawY = rawY === -0 ? 0 : rawY;
85
+ if (Object.is(rawX, -0)) {
86
+ rawX = 0;
87
+ }
88
+ if (Object.is(rawY, -0)) {
89
+ rawY = 0;
90
+ }
87
91
  const x = clampValue(rawX, 0, 1);
88
92
  const y = clampValue(rawY, 0, 1);
89
93
  progress.value = { x, y };
@@ -1,3 +1,3 @@
1
1
  export declare function useDrawerUtils(): {
2
- clamp: (value: number, from: number, to: number) => number;
2
+ clamp: (value: number, from: number, to: number, flip: boolean) => number;
3
3
  };
@@ -1,5 +1,5 @@
1
1
  export function useDrawerUtils() {
2
- function clamp(value, from, to) {
2
+ function clamp(value, from, to, flip) {
3
3
  if (from > to) {
4
4
  if (value > from) {
5
5
  return value;
@@ -19,10 +19,13 @@ export function useDrawerUtils() {
19
19
  return value;
20
20
  }
21
21
  } else {
22
- if (value < to) {
23
- return to;
24
- } else {
25
- return value;
22
+ switch (flip) {
23
+ case true:
24
+ return value > to ? to : value;
25
+ case false:
26
+ return value < to ? to : value;
27
+ default:
28
+ return value < to ? to : value;
26
29
  }
27
30
  }
28
31
  }
@@ -74,26 +74,26 @@ export declare function useMagicEmitter(): {
74
74
  } & Omit<{
75
75
  beforeSnap: {
76
76
  id: string;
77
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
77
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
78
78
  } | {
79
79
  id: string;
80
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
80
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
81
81
  };
82
82
  snapTo: {
83
83
  id: string;
84
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
84
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
85
85
  duration?: number;
86
86
  } | {
87
87
  id: string;
88
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
88
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
89
89
  duration?: number;
90
90
  };
91
91
  afterSnap: {
92
92
  id: string;
93
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
93
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
94
94
  } | {
95
95
  id: string;
96
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
96
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
97
97
  };
98
98
  beforeDrag: {
99
99
  id: string;
@@ -341,26 +341,26 @@ export declare function useMagicEmitter(): {
341
341
  } & Omit<{
342
342
  beforeSnap: {
343
343
  id: string;
344
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
344
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
345
345
  } | {
346
346
  id: string;
347
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
347
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
348
348
  };
349
349
  snapTo: {
350
350
  id: string;
351
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
351
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
352
352
  duration?: number;
353
353
  } | {
354
354
  id: string;
355
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
355
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
356
356
  duration?: number;
357
357
  };
358
358
  afterSnap: {
359
359
  id: string;
360
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
360
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
361
361
  } | {
362
362
  id: string;
363
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
363
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
364
364
  };
365
365
  beforeDrag: {
366
366
  id: string;
@@ -610,26 +610,26 @@ export declare function useMagicEmitter(): {
610
610
  } & Omit<{
611
611
  beforeSnap: {
612
612
  id: string;
613
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
613
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
614
614
  } | {
615
615
  id: string;
616
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
616
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
617
617
  };
618
618
  snapTo: {
619
619
  id: string;
620
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
620
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
621
621
  duration?: number;
622
622
  } | {
623
623
  id: string;
624
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
624
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
625
625
  duration?: number;
626
626
  };
627
627
  afterSnap: {
628
628
  id: string;
629
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
629
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
630
630
  } | {
631
631
  id: string;
632
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
632
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
633
633
  };
634
634
  beforeDrag: {
635
635
  id: string;
@@ -877,26 +877,26 @@ export declare function useMagicEmitter(): {
877
877
  } & Omit<{
878
878
  beforeSnap: {
879
879
  id: string;
880
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
880
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
881
881
  } | {
882
882
  id: string;
883
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
883
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
884
884
  };
885
885
  snapTo: {
886
886
  id: string;
887
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
887
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
888
888
  duration?: number;
889
889
  } | {
890
890
  id: string;
891
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
891
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
892
892
  duration?: number;
893
893
  };
894
894
  afterSnap: {
895
895
  id: string;
896
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
896
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
897
897
  } | {
898
898
  id: string;
899
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
899
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
900
900
  };
901
901
  beforeDrag: {
902
902
  id: string;
@@ -1146,26 +1146,26 @@ export declare function useMagicEmitter(): {
1146
1146
  } & Omit<{
1147
1147
  beforeSnap: {
1148
1148
  id: string;
1149
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1149
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1150
1150
  } | {
1151
1151
  id: string;
1152
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1152
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1153
1153
  };
1154
1154
  snapTo: {
1155
1155
  id: string;
1156
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1156
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1157
1157
  duration?: number;
1158
1158
  } | {
1159
1159
  id: string;
1160
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1160
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1161
1161
  duration?: number;
1162
1162
  };
1163
1163
  afterSnap: {
1164
1164
  id: string;
1165
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1165
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1166
1166
  } | {
1167
1167
  id: string;
1168
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1168
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1169
1169
  };
1170
1170
  beforeDrag: {
1171
1171
  id: string;
@@ -1413,26 +1413,26 @@ export declare function useMagicEmitter(): {
1413
1413
  } & Omit<{
1414
1414
  beforeSnap: {
1415
1415
  id: string;
1416
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1416
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1417
1417
  } | {
1418
1418
  id: string;
1419
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1419
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1420
1420
  };
1421
1421
  snapTo: {
1422
1422
  id: string;
1423
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1423
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1424
1424
  duration?: number;
1425
1425
  } | {
1426
1426
  id: string;
1427
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1427
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1428
1428
  duration?: number;
1429
1429
  };
1430
1430
  afterSnap: {
1431
1431
  id: string;
1432
- snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1432
+ snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1433
1433
  } | {
1434
1434
  id: string;
1435
- snapPoint: import("../../../MagicDraggable/src/types/index.js").DraggableSnapPoint;
1435
+ snapPoint: import("../../../MagicDrawer/src/types/index.js").DrawerSnapPoint;
1436
1436
  };
1437
1437
  beforeDrag: {
1438
1438
  id: string;
@@ -64,7 +64,9 @@ export function useMenuView(instanceId) {
64
64
  let view = viewMap.get(id);
65
65
  if (!view) {
66
66
  view = state.views.find((v) => v.id === id);
67
- if (view) viewMap.set(id, view);
67
+ if (view) {
68
+ viewMap.set(id, view);
69
+ }
68
70
  }
69
71
  return view;
70
72
  }
@@ -35,9 +35,9 @@
35
35
  @after-leave="onAfterLeave"
36
36
  >
37
37
  <component
38
- ref="component"
39
38
  :is="mappedOptions.tag"
40
39
  v-show="innerActive"
40
+ ref="component"
41
41
  class="magic-modal__content"
42
42
  @pointerdown.self="onPointerdown"
43
43
  >
@@ -183,13 +183,13 @@ onUnmounted(() => {
183
183
  }
184
184
 
185
185
  .magic-modal {
186
- position: fixed;
187
- inset: 0;
188
- width: 100%;
189
- height: 100%;
190
- display: flex;
191
- justify-content: center;
192
- align-items: center;
186
+ position: var(--magic-modal-position, fixed);
187
+ inset: var(--magic-modal-inset, 0);
188
+ width: var(--magic-modal-width, 100%);
189
+ height: var(--magic-modal-height, 100%);
190
+ display: var(--magic-modal-display, flex);
191
+ justify-content: var(--magic-modal-justify-content, center);
192
+ align-items: var(--magic-modal-align-items, center);
193
193
  z-index: var(--magic-modal-z-index, 999);
194
194
  background: transparent;
195
195
  color: inherit;
@@ -200,9 +200,9 @@ onUnmounted(() => {
200
200
  .magic-modal__content {
201
201
  -webkit-overflow-scrolling: touch;
202
202
  scroll-behavior: smooth;
203
- max-height: 100%;
204
- width: 100%;
205
- display: flex;
203
+ max-height: var(--magic-modal-content-max-height, 100%);
204
+ width: var(--magic-modal-content-width, 100%);
205
+ display: var(--magic-modal-content-display, flex);
206
206
  align-items: var(--magic-modal-content-align-items, center);
207
207
  justify-content: var(--magic-modal-content-justify-content, center);
208
208
  overflow-y: var(--magic-modal-content-overflow-y, auto);
@@ -29,7 +29,8 @@ import { audioModePlaybackDefaults } from "../utils/playbackDefaults";
29
29
  import {
30
30
  MagicPlayerInstanceId,
31
31
  MagicPlayerOptionsKey,
32
- MagicPlayerRef
32
+ MagicPlayerRef,
33
+ MagicPlayerCurrentSrcKey
33
34
  } from "../symbols";
34
35
  const magicError = useMagicError({
35
36
  prefix: "MagicPlayer",
@@ -38,6 +39,7 @@ const magicError = useMagicError({
38
39
  const injectedInstanceId = inject(MagicPlayerInstanceId, void 0);
39
40
  const injectedOptions = inject(MagicPlayerOptionsKey, void 0);
40
41
  const injectedPlayerRef = inject(MagicPlayerRef, void 0);
42
+ const injectedCurrentSrc = inject(MagicPlayerCurrentSrcKey, void 0);
41
43
  let cancelFocus = void 0;
42
44
  let cancelBlur = void 0;
43
45
  magicError.assert(injectedInstanceId, {
@@ -52,7 +54,7 @@ const elRef = useTemplateRef("el");
52
54
  const { initialize } = usePlayerRuntime({
53
55
  id: injectedInstanceId,
54
56
  mediaRef: elRef,
55
- src: injectedOptions.src,
57
+ src: injectedCurrentSrc,
56
58
  srcType: injectedOptions.srcType,
57
59
  debug: injectedOptions.debug
58
60
  });
@@ -29,7 +29,11 @@ import {
29
29
  useMagicError
30
30
  } from "@maas/vue-equipment/plugins/MagicError";
31
31
  import { usePlayerState } from "../composables/private/usePlayerState";
32
- import { MagicPlayerInstanceId, MagicPlayerOptionsKey } from "../symbols";
32
+ import {
33
+ MagicPlayerInstanceId,
34
+ MagicPlayerOptionsKey,
35
+ MagicPlayerCurrentSrcKey
36
+ } from "../symbols";
33
37
  const { playbackId } = defineProps({
34
38
  playbackId: { type: String, required: false }
35
39
  });
@@ -39,6 +43,7 @@ const magicError = useMagicError({
39
43
  });
40
44
  const instanceId = inject(MagicPlayerInstanceId, void 0);
41
45
  const injectedOptions = inject(MagicPlayerOptionsKey, void 0);
46
+ const injectedCurrentSrc = inject(MagicPlayerCurrentSrcKey, void 0);
42
47
  magicError.assert(instanceId, {
43
48
  message: "MagicPlayerMuxPopover must be nested inside MagicPlayerVideoControls",
44
49
  errorCode: "missing_instance_id"
@@ -107,7 +112,7 @@ function drawFrame(time) {
107
112
  );
108
113
  }
109
114
  async function initialize() {
110
- const parsedPlaybackId = getMuxId(injectedOptions?.src);
115
+ const parsedPlaybackId = getMuxId(injectedCurrentSrc?.value);
111
116
  const mappedPlaybackId = playbackId ?? parsedPlaybackId;
112
117
  if (!mappedPlaybackId) {
113
118
  magicError.throwError({
@@ -83,7 +83,8 @@ const {
83
83
  muted,
84
84
  loaded,
85
85
  waiting,
86
- hasOverlay
86
+ hasOverlay,
87
+ skipping
87
88
  } = toRefs(state);
88
89
  hasOverlay.value = true;
89
90
  const mappedOverlayTransition = computed(
@@ -98,6 +99,7 @@ const { togglePlay } = usePlayerVideoApi({
98
99
  const { idle } = useIdle(injectedOptions?.threshold?.idle);
99
100
  const isVisible = computed(() => {
100
101
  switch (true) {
102
+ case skipping.value:
101
103
  case (playing.value && idle.value):
102
104
  case (playing.value && !mouseEntered.value):
103
105
  case (injectedOptions?.autoplay && (!started.value || !mouseEntered.value)):
@@ -21,13 +21,22 @@
21
21
  </template>
22
22
 
23
23
  <script setup>
24
- import { toRefs, provide, onMounted, useTemplateRef } from "vue";
24
+ import {
25
+ toRefs,
26
+ provide,
27
+ onMounted,
28
+ useTemplateRef,
29
+ computed,
30
+ watch
31
+ } from "vue";
25
32
  import defu from "defu";
26
33
  import { usePlayerState } from "../composables/private/usePlayerState";
34
+ import { usePlayerPlaylistApi } from "../composables/private/usePlayerPlaylistApi";
27
35
  import {
28
36
  MagicPlayerInstanceId,
29
37
  MagicPlayerOptionsKey,
30
- MagicPlayerRef
38
+ MagicPlayerRef,
39
+ MagicPlayerCurrentSrcKey
31
40
  } from "../symbols";
32
41
  import { defaultOptions } from "../utils/defaultOptions";
33
42
  import { usePlayerEmitter } from "../composables/private/usePlayerEmitter";
@@ -49,6 +58,20 @@ const {
49
58
  fullscreen,
50
59
  touched
51
60
  } = toRefs(state);
61
+ const rawSrc = options?.src ?? "";
62
+ const srcs = Array.isArray(rawSrc) ? rawSrc : [rawSrc];
63
+ state.playlistCount = srcs.length;
64
+ state.loop = mappedOptions.loop;
65
+ const currentSrc = computed(() => srcs[state.playlistIndex] ?? "");
66
+ const { next } = usePlayerPlaylistApi({ id });
67
+ watch(
68
+ () => state.ended,
69
+ (value) => {
70
+ if (value && state.playlistCount > 1) {
71
+ next();
72
+ }
73
+ }
74
+ );
52
75
  const { onMouseenter, onMouseleave, onPointerdown } = usePlayerProvider(id);
53
76
  const playerRef = useTemplateRef("player");
54
77
  const { initializeEmitter } = usePlayerEmitter({ id });
@@ -58,6 +81,7 @@ onMounted(() => {
58
81
  provide(MagicPlayerInstanceId, id);
59
82
  provide(MagicPlayerOptionsKey, mappedOptions);
60
83
  provide(MagicPlayerRef, playerRef);
84
+ provide(MagicPlayerCurrentSrcKey, currentSrc);
61
85
  </script>
62
86
 
63
87
  <style>
@@ -5,7 +5,7 @@
5
5
  playsinline
6
6
  disablePictureInPicture
7
7
  :preload="injectedOptions.preload"
8
- :loop="injectedOptions.loop"
8
+ :loop="playlistCount <= 1 && injectedOptions.loop"
9
9
  :muted="muted"
10
10
  />
11
11
  </template>
@@ -37,7 +37,8 @@ import { videoModePlaybackDefaults } from "../utils/playbackDefaults";
37
37
  import {
38
38
  MagicPlayerInstanceId,
39
39
  MagicPlayerOptionsKey,
40
- MagicPlayerRef
40
+ MagicPlayerRef,
41
+ MagicPlayerCurrentSrcKey
41
42
  } from "../symbols";
42
43
  const magicError = useMagicError({
43
44
  prefix: "MagicPlayer",
@@ -46,6 +47,7 @@ const magicError = useMagicError({
46
47
  const injectedInstanceId = inject(MagicPlayerInstanceId, void 0);
47
48
  const injectedOptions = inject(MagicPlayerOptionsKey, void 0);
48
49
  const injectedPlayerRef = inject(MagicPlayerRef, void 0);
50
+ const injectedCurrentSrc = inject(MagicPlayerCurrentSrcKey, void 0);
49
51
  let cancelFocus = void 0;
50
52
  let cancelBlur = void 0;
51
53
  magicError.assert(injectedInstanceId, {
@@ -60,13 +62,13 @@ const elRef = useTemplateRef("el");
60
62
  const { initialize } = usePlayerRuntime({
61
63
  id: injectedInstanceId,
62
64
  mediaRef: elRef,
63
- src: injectedOptions.src,
65
+ src: injectedCurrentSrc,
64
66
  srcType: injectedOptions.srcType,
65
67
  debug: injectedOptions.debug
66
68
  });
67
69
  const { initializeState } = usePlayerState(injectedInstanceId);
68
70
  const state = initializeState();
69
- const { muted, playing, started, loaded } = toRefs(state);
71
+ const { muted, playing, started, loaded, playlistCount } = toRefs(state);
70
72
  usePlayerMediaApi({
71
73
  id: injectedInstanceId,
72
74
  mediaRef: elRef
@@ -76,8 +76,9 @@ export function usePlayerMediaApi(args) {
76
76
  }
77
77
  function timeRangeToArray(timeRanges) {
78
78
  let ranges = [];
79
- for (let i = 0; i < timeRanges.length; ++i)
79
+ for (let i = 0; i < timeRanges.length; ++i) {
80
80
  ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];
81
+ }
81
82
  return ranges;
82
83
  }
83
84
  watch(volume, () => {
@@ -0,0 +1,10 @@
1
+ import { type MaybeRef } from 'vue';
2
+ export type UsePlayerPlaylistApiArgs = {
3
+ id: MaybeRef<string>;
4
+ };
5
+ export declare function usePlayerPlaylistApi(args: UsePlayerPlaylistApiArgs): {
6
+ next: () => void;
7
+ prev: () => void;
8
+ goTo: (index: number) => void;
9
+ };
10
+ export type UsePlayerPlaylistApiReturn = ReturnType<typeof usePlayerPlaylistApi>;
@@ -0,0 +1,27 @@
1
+ import { toValue } from "vue";
2
+ import { usePlayerState } from "./usePlayerState.mjs";
3
+ export function usePlayerPlaylistApi(args) {
4
+ const { id } = args;
5
+ const { initializeState } = usePlayerState(toValue(id));
6
+ const state = initializeState();
7
+ function next() {
8
+ if (state.playlistIndex < state.playlistCount - 1) {
9
+ state.playlistIndex++;
10
+ } else if (state.loop) {
11
+ state.playlistIndex = 0;
12
+ }
13
+ }
14
+ function prev() {
15
+ if (state.playlistIndex > 0) {
16
+ state.playlistIndex--;
17
+ } else if (state.loop) {
18
+ state.playlistIndex = state.playlistCount - 1;
19
+ }
20
+ }
21
+ function goTo(index) {
22
+ if (index >= 0 && index < state.playlistCount) {
23
+ state.playlistIndex = index;
24
+ }
25
+ }
26
+ return { next, prev, goTo };
27
+ }
@@ -4,7 +4,7 @@ export type UsePlayerRuntimeArgs = {
4
4
  id: MaybeRef<string>;
5
5
  mediaRef?: Ref<HTMLVideoElement | HTMLAudioElement | null>;
6
6
  srcType?: MagicPlayerOptions['srcType'];
7
- src?: string;
7
+ src?: MaybeRef<string>;
8
8
  debug?: boolean;
9
9
  };
10
10
  export declare function usePlayerRuntime(args: UsePlayerRuntimeArgs): {
@@ -2,7 +2,8 @@ import {
2
2
  onScopeDispose,
3
3
  shallowRef,
4
4
  toRefs,
5
- toValue
5
+ toValue,
6
+ watch
6
7
  } from "vue";
7
8
  import { useEventListener } from "@vueuse/core";
8
9
  import { useMagicError } from "@maas/vue-equipment/plugins/MagicError";
@@ -21,6 +22,8 @@ export function usePlayerRuntime(args) {
21
22
  let cancelLoaded = void 0;
22
23
  let cancelPlay = void 0;
23
24
  let cancelPause = void 0;
25
+ let cancelResumeOnLoad = void 0;
26
+ let initialized = false;
24
27
  function handleHlsRuntimeError(args2) {
25
28
  const { data, hls: hls2 } = args2;
26
29
  const error = new Error(data.details || "HLS error");
@@ -75,11 +78,12 @@ export function usePlayerRuntime(args) {
75
78
  return;
76
79
  }
77
80
  const el = toValue(mediaRef);
78
- if (!el || !src) {
81
+ const currentSrc = toValue(src);
82
+ if (!el || !currentSrc) {
79
83
  return;
80
84
  }
81
85
  try {
82
- el.src = src;
86
+ el.src = currentSrc;
83
87
  cancelLoaded?.();
84
88
  cancelLoaded = useEventListener(
85
89
  mediaRef,
@@ -102,6 +106,10 @@ export function usePlayerRuntime(args) {
102
106
  if (!el) {
103
107
  return;
104
108
  }
109
+ const currentSrc = toValue(src);
110
+ if (!currentSrc) {
111
+ return;
112
+ }
105
113
  deferredLoading.value = autoplay;
106
114
  try {
107
115
  const { default: Hls } = await import("hls.js");
@@ -110,9 +118,6 @@ export function usePlayerRuntime(args) {
110
118
  useNative();
111
119
  return;
112
120
  }
113
- if (!src) {
114
- return;
115
- }
116
121
  hls.on(Hls.Events.FRAG_LOADED, () => {
117
122
  loaded.value = true;
118
123
  });
@@ -135,7 +140,7 @@ export function usePlayerRuntime(args) {
135
140
  cancelPlay = useEventListener(mediaRef, "play", () => {
136
141
  hls?.startLoad();
137
142
  });
138
- hls.loadSource(src);
143
+ hls.loadSource(currentSrc);
139
144
  hls.attachMedia(el);
140
145
  } catch (error) {
141
146
  throwError({
@@ -149,6 +154,7 @@ export function usePlayerRuntime(args) {
149
154
  cancelLoaded?.();
150
155
  cancelPlay?.();
151
156
  cancelPause?.();
157
+ cancelResumeOnLoad?.();
152
158
  try {
153
159
  hls?.destroy();
154
160
  } finally {
@@ -156,7 +162,46 @@ export function usePlayerRuntime(args) {
156
162
  deferredLoading.value = false;
157
163
  }
158
164
  }
165
+ function resetState() {
166
+ state.playing = false;
167
+ state.loaded = false;
168
+ state.started = false;
169
+ state.ended = false;
170
+ state.currentTime = 0;
171
+ state.duration = 0;
172
+ state.buffered = [];
173
+ state.waiting = false;
174
+ state.stalled = false;
175
+ }
176
+ watch(
177
+ () => state.playlistIndex,
178
+ (newIndex, oldIndex) => {
179
+ if (!initialized || newIndex === oldIndex || state.playlistCount <= 1) {
180
+ return;
181
+ }
182
+ const wasPlaying = state.playing;
183
+ state.skipping = true;
184
+ resetState();
185
+ destroy();
186
+ cancelResumeOnLoad = watch(loaded, (value) => {
187
+ if (value) {
188
+ state.skipping = false;
189
+ if (wasPlaying) {
190
+ state.playing = true;
191
+ }
192
+ cancelResumeOnLoad?.();
193
+ cancelResumeOnLoad = void 0;
194
+ }
195
+ });
196
+ if (srcType === "native") {
197
+ useNative();
198
+ } else if (srcType === "hls") {
199
+ useHlsJS(wasPlaying);
200
+ }
201
+ }
202
+ );
159
203
  function initialize(autoplay = false) {
204
+ initialized = true;
160
205
  if (srcType === "native") {
161
206
  useNative();
162
207
  } else if (srcType === "hls") {
@@ -40,7 +40,11 @@ export function usePlayerState(id) {
40
40
  hasControls: false,
41
41
  controlsBarRect: void 0,
42
42
  controlsTrackRect: void 0,
43
- controlsPopoverRect: void 0
43
+ controlsPopoverRect: void 0,
44
+ playlistIndex: 0,
45
+ playlistCount: 0,
46
+ loop: false,
47
+ skipping: false
44
48
  };
45
49
  return reactive(state);
46
50
  }
@@ -22,6 +22,12 @@ export declare function useMagicPlayer(id: MaybeRef<string>): {
22
22
  scrubbedPercentage: import("vue").Ref<number, number>;
23
23
  thumbPercentage: import("vue").Ref<number, number>;
24
24
  popoverOffsetX: import("vue").Ref<number | null, number | null>;
25
+ playlistIndex: import("vue").Ref<number, number>;
26
+ playlistCount: import("vue").Ref<number, number>;
27
+ skipping: import("vue").Ref<boolean, boolean>;
28
+ next: () => void;
29
+ prev: () => void;
30
+ goTo: (index: number) => void;
25
31
  audioApi: {
26
32
  play: () => void;
27
33
  pause: () => void;
@@ -4,11 +4,13 @@ import { usePlayerAudioApi } from "./private/usePlayerAudioApi.mjs";
4
4
  import { usePlayerRuntime } from "./private/usePlayerRuntime.mjs";
5
5
  import { usePlayerControlsApi } from "./private/usePlayerControlsApi.mjs";
6
6
  import { usePlayerState } from "./private/usePlayerState.mjs";
7
+ import { usePlayerPlaylistApi } from "./private/usePlayerPlaylistApi.mjs";
7
8
  export function useMagicPlayer(id) {
8
9
  const audioApi = usePlayerAudioApi({ id });
9
10
  const videoApi = usePlayerVideoApi({ id });
10
11
  const controlsApi = usePlayerControlsApi({ id });
11
12
  const playerRuntime = usePlayerRuntime({ id });
13
+ const { next, prev, goTo } = usePlayerPlaylistApi({ id });
12
14
  const { initializeState } = usePlayerState(id);
13
15
  const state = initializeState();
14
16
  const {
@@ -33,7 +35,10 @@ export function useMagicPlayer(id) {
33
35
  seekedPercentage,
34
36
  scrubbedPercentage,
35
37
  thumbPercentage,
36
- popoverOffsetX
38
+ popoverOffsetX,
39
+ playlistIndex,
40
+ playlistCount,
41
+ skipping
37
42
  } = toRefs(state);
38
43
  return {
39
44
  duration,
@@ -58,6 +63,12 @@ export function useMagicPlayer(id) {
58
63
  scrubbedPercentage,
59
64
  thumbPercentage,
60
65
  popoverOffsetX,
66
+ playlistIndex,
67
+ playlistCount,
68
+ skipping,
69
+ next,
70
+ prev,
71
+ goTo,
61
72
  audioApi,
62
73
  videoApi,
63
74
  controlsApi,
@@ -1,9 +1,10 @@
1
- import type { InjectionKey, MaybeRef, Ref } from 'vue';
1
+ import type { ComputedRef, InjectionKey, MaybeRef, Ref } from 'vue';
2
2
  import type { MagicPlayerOptions } from '../types/index.js';
3
3
  declare const MagicPlayerInstanceId: InjectionKey<MaybeRef<string>>;
4
4
  declare const MagicPlayerOptionsKey: InjectionKey<MagicPlayerOptions>;
5
5
  declare const MagicPlayerRef: InjectionKey<Ref<HTMLDivElement | null>>;
6
+ declare const MagicPlayerCurrentSrcKey: InjectionKey<ComputedRef<string>>;
6
7
  declare const MagicPlayerTrackRef: InjectionKey<Ref<HTMLDivElement | null>>;
7
8
  declare const MagicPlayerBarRef: InjectionKey<Ref<HTMLDivElement | null>>;
8
9
  declare const MagicPlayerPopoverRef: InjectionKey<Ref<HTMLDivElement | null>>;
9
- export { MagicPlayerInstanceId, MagicPlayerOptionsKey, MagicPlayerRef, MagicPlayerTrackRef, MagicPlayerBarRef, MagicPlayerPopoverRef, };
10
+ export { MagicPlayerInstanceId, MagicPlayerOptionsKey, MagicPlayerRef, MagicPlayerCurrentSrcKey, MagicPlayerTrackRef, MagicPlayerBarRef, MagicPlayerPopoverRef, };
@@ -1,6 +1,7 @@
1
1
  const MagicPlayerInstanceId = Symbol();
2
2
  const MagicPlayerOptionsKey = Symbol();
3
3
  const MagicPlayerRef = Symbol();
4
+ const MagicPlayerCurrentSrcKey = Symbol();
4
5
  const MagicPlayerTrackRef = Symbol();
5
6
  const MagicPlayerBarRef = Symbol();
6
7
  const MagicPlayerPopoverRef = Symbol();
@@ -8,6 +9,7 @@ export {
8
9
  MagicPlayerInstanceId,
9
10
  MagicPlayerOptionsKey,
10
11
  MagicPlayerRef,
12
+ MagicPlayerCurrentSrcKey,
11
13
  MagicPlayerTrackRef,
12
14
  MagicPlayerBarRef,
13
15
  MagicPlayerPopoverRef
@@ -1,6 +1,6 @@
1
1
  type PlayerMode = 'audio' | 'video';
2
2
  export interface MagicPlayerOptions {
3
- src: string;
3
+ src: string | string[];
4
4
  mode?: PlayerMode;
5
5
  srcType?: 'native' | 'hls';
6
6
  preload?: 'auto' | 'metadata' | 'none';
@@ -18,7 +18,7 @@ export interface MagicPlayerOptions {
18
18
  };
19
19
  }
20
20
  export interface RequiredMagicPlayerOptions {
21
- src: string;
21
+ src: string | string[];
22
22
  mode: 'audio' | 'video';
23
23
  srcType: 'native' | 'hls';
24
24
  preload: 'auto' | 'metadata' | 'none';
@@ -68,6 +68,10 @@ export interface PlayerState {
68
68
  controlsBarRect: DOMRect | undefined;
69
69
  controlsTrackRect: DOMRect | undefined;
70
70
  controlsPopoverRect: DOMRect | undefined;
71
+ playlistIndex: number;
72
+ playlistCount: number;
73
+ loop: boolean;
74
+ skipping: boolean;
71
75
  }
72
76
  export interface PlayerEvents {
73
77
  onDragStart: string;
@@ -35,7 +35,11 @@
35
35
  v-bind="view.props"
36
36
  @remove="deleteView(view.id)"
37
37
  >
38
- <template v-for="(slot, name) in view.slots" #[name]="slotProps">
38
+ <template
39
+ v-for="(slot, name) in view.slots"
40
+ :key="name"
41
+ #[name]="slotProps"
42
+ >
39
43
  <component :is="slot" v-bind="slotProps" />
40
44
  </template>
41
45
  </component>
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "moduleResolution": "bundler",
5
+ "types": ["vitest/globals"]
6
+ },
7
+ "include": ["**/tests/**/*.ts", "**/src/**/*.ts", "**/src/**/*.vue", "shims-vue.d.ts", "tests/**/*.ts"]
8
+ }
@@ -104,7 +104,9 @@ function interpolate(args) {
104
104
  let startTime;
105
105
  let interpolationId;
106
106
  function animate(timestamp) {
107
- if (!startTime) startTime = timestamp;
107
+ if (!startTime) {
108
+ startTime = timestamp;
109
+ }
108
110
  const progress = Math.min(1, (timestamp - startTime) / duration);
109
111
  const easedProgress = easing(progress);
110
112
  const value = from + (to - from) * easedProgress;
@@ -212,8 +214,12 @@ function slugify(string, options) {
212
214
  const charMap = {};
213
215
  let slug = string.normalize().split("").reduce(function(result, ch) {
214
216
  let appendChar = charMap[ch];
215
- if (appendChar === void 0) appendChar = ch;
216
- if (appendChar === (_options == null ? void 0 : _options.separator)) appendChar = " ";
217
+ if (appendChar === void 0) {
218
+ appendChar = ch;
219
+ }
220
+ if (appendChar === (_options == null ? void 0 : _options.separator)) {
221
+ appendChar = " ";
222
+ }
217
223
  return result + appendChar.replace((_options == null ? void 0 : _options.remove) || /[^\w\s$*_+~.()'"!\-:@]+/g, "");
218
224
  }, "");
219
225
  if (_options.strict) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/createStateStore.ts","../../packages/utils/src/functions/easings.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/scrollbarGutterSupport.ts","../../packages/utils/src/functions/scrollbarWidth.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","import { getCurrentInstance, ref, 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\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","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) startTime = timestamp\n\n const progress = Math.min(1, (timestamp - startTime) / duration)\n const easedProgress = easing(progress)\n const value = from + (to - from) * easedProgress\n\n callback(value)\n\n if (progress < 1) {\n 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","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","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n","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/createStateStore.ts","../../packages/utils/src/functions/easings.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/scrollbarGutterSupport.ts","../../packages/utils/src/functions/scrollbarWidth.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","import { getCurrentInstance, ref, 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\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","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","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","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":[]}
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.0-beta.56",
4
+ "version": "1.0.0-beta.58",
5
5
  "contributors": [
6
6
  {
7
7
  "name": "Robin Scholz",
@@ -13,16 +13,20 @@
13
13
  }
14
14
  ],
15
15
  "devDependencies": {
16
- "@maas/config": "^1.10.1",
16
+ "@maas/config": "^1.13.0",
17
17
  "@maas/mirror": "catalog:",
18
18
  "@release-it/bumper": "^7.0.5",
19
19
  "@types/node": "catalog:",
20
+ "@vitejs/plugin-vue": "^6.0.5",
21
+ "@vitest/browser-playwright": "^4.1.2",
20
22
  "eslint": "^9.39.1",
21
23
  "prettier": "catalog:",
22
24
  "prettier-plugin-tailwindcss": "^0.7.1",
23
25
  "release-it": "^19.0.5",
24
26
  "turbo": "^2.6.0",
25
- "typescript": "catalog:"
27
+ "typescript": "catalog:",
28
+ "vitest": "^4.1.2",
29
+ "vitest-browser-vue": "^2.1.0"
26
30
  },
27
31
  "exports": {
28
32
  "./nuxt": {
@@ -134,7 +138,7 @@
134
138
  "build:docs": "turbo run build --filter=docs",
135
139
  "preview:docs": "turbo run preview --filter=docs",
136
140
  "update:metadata": "turbo run update --filter=metadata",
137
- "test": "echo \"Error: no test specified\" && exit 1",
141
+ "test": "turbo run test",
138
142
  "lint": "turbo run lint",
139
143
  "uninstall": "pnpm dlx rimraf --glob ./**/node_modules --glob ./**/pnpm-lock.yaml",
140
144
  "release": "turbo run t:release && release-it",