@maas/vue-equipment 0.24.3 → 0.24.5

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 (27) hide show
  1. package/dist/composables/index.d.mts +2 -2
  2. package/dist/composables/index.d.ts +2 -2
  3. package/dist/composables/index.js.map +1 -1
  4. package/dist/composables/index.mjs.map +1 -1
  5. package/dist/nuxt/module.json +1 -1
  6. package/dist/nuxt/module.mjs +2 -2
  7. package/dist/plugins/MagicDrawer/src/components/MagicDrawer.vue +6 -7
  8. package/dist/plugins/MagicDrawer/src/composables/private/useDrawerDrag.mjs +3 -1
  9. package/dist/plugins/MagicPlayer/index.d.ts +3 -1
  10. package/dist/plugins/MagicPlayer/index.mjs +3 -2
  11. package/dist/plugins/MagicPlayer/src/components/MagicAudioPlayer.vue +1 -1
  12. package/dist/plugins/MagicPlayer/src/components/MagicAudioPlayerControls.vue +23 -22
  13. package/dist/plugins/MagicPlayer/src/components/MagicAudioPlayerControls.vue.d.ts +0 -2
  14. package/dist/plugins/MagicPlayer/src/components/MagicPlayerDisplayTime.vue +41 -0
  15. package/dist/plugins/MagicPlayer/src/components/MagicPlayerDisplayTime.vue.d.ts +29 -0
  16. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerMediaApi.d.ts +1 -0
  17. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerMediaApi.mjs +3 -1
  18. package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.d.ts +1 -0
  19. package/dist/utils/index.d.mts +7 -5
  20. package/dist/utils/index.d.ts +7 -5
  21. package/dist/utils/index.js +37 -13
  22. package/dist/utils/index.js.map +1 -1
  23. package/dist/utils/index.mjs +36 -13
  24. package/dist/utils/index.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/dist/plugins/MagicPlayer/src/components/MagicPlayerCurrentTime.vue +0 -58
  27. package/dist/plugins/MagicPlayer/src/components/MagicPlayerCurrentTime.vue.d.ts +0 -14
@@ -46,8 +46,8 @@ type useGlyphToSvgOptions = {
46
46
  fontFile: Ref<Font> | Font;
47
47
  };
48
48
  declare function useGlyphToSvg({ fontSize, fontWeight, fontFile, }: useGlyphToSvgOptions): {
49
- copySvg: (codePoint: string) => Promise<void>;
50
- renderSvg: (codePoint: string) => Promise<string>;
49
+ copySvg: (codePoint: number) => Promise<void>;
50
+ renderSvg: (codePoint: number) => Promise<string>;
51
51
  };
52
52
 
53
53
  type UseMetaViewportArgs = {
@@ -46,8 +46,8 @@ type useGlyphToSvgOptions = {
46
46
  fontFile: Ref<Font> | Font;
47
47
  };
48
48
  declare function useGlyphToSvg({ fontSize, fontWeight, fontFile, }: useGlyphToSvgOptions): {
49
- copySvg: (codePoint: string) => Promise<void>;
50
- renderSvg: (codePoint: string) => Promise<string>;
49
+ copySvg: (codePoint: number) => Promise<void>;
50
+ renderSvg: (codePoint: number) => Promise<string>;
51
51
  };
52
52
 
53
53
  type UseMetaViewportArgs = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/composables/index.ts","../../packages/composables/useCountdown/index.ts","../../packages/composables/useEasings/index.ts","../../packages/composables/useGlyphToSvg/index.ts","../../packages/composables/useMetaViewport/index.ts","../../packages/composables/useScrollTo/index.ts","../../packages/composables/useViewportDimensions/index.ts"],"sourcesContent":["export * from './useCountdown'\nexport * from './useEasings'\nexport * from './useGlyphToSvg'\nexport * from './useMetaViewport'\nexport * from './useScrollTo'\nexport * from './useViewportDimensions'\n","import { computed, onMounted, ref, unref, watch, type MaybeRef } from 'vue'\nimport { MagicTimer } from '@maas/magic-timer'\nimport { DateTime } from 'luxon'\n\n// Type for [YYYY, MM, DD, HH, MM, SS]\nexport type DateTimeArray = [number, number, number, number?, number?, number?]\n\n// Interface for the options\nexport interface CountdownOptions {\n endDateTime: MaybeRef<DateTimeArray>\n timezone?: MaybeRef<string>\n zeroIndexedMonths?: boolean\n}\n\n// Define the default options\nconst defaultOptions: CountdownOptions = {\n endDateTime: [1970, 1, 1, 0, 0, 0],\n zeroIndexedMonths: false,\n}\n\nexport function useCountdown(options: CountdownOptions, callback?: () => void) {\n // Merge the options with the default options\n options = { ...defaultOptions, ...options } as CountdownOptions\n\n // Check if the endDateTime is valid\n if (unref(options.endDateTime).length < 3) {\n console.error(\n 'useCountdownClock: The \"endDateTime\" option needs to be an array with the format [YYYY, MM, DD, HH?, MM?, SS?]'\n )\n }\n\n // Check if the timezone is valid\n const timezone = unref(options.timezone)\n if (timezone) {\n if (!DateTime.now().setZone(timezone).isValid) {\n console.error(\n `useCountdownClock: The \"timezone\" option \"${timezone}\" is not a valid timezone. Do you mean ${\n DateTime.local().zoneName\n }? For more information see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones`\n )\n }\n }\n\n // Create a new timer instance\n const timer = new MagicTimer()\n\n // Create the countdown values\n const years = ref(0)\n const days = ref(0)\n const hours = ref(0)\n const minutes = ref(0)\n const seconds = ref(0)\n\n // Parse the end dateTime array into an date and time object\n // if the hour, minute and second are not set, set them to 0\n // if the month is not zero indexed, add 1 to the month (defined in the options)\n const parseDateTimeArray = (dateTimeArr: DateTimeArray) => {\n const [year, month, day, hour, minute, second] = dateTimeArr\n return {\n year,\n month: options.zeroIndexedMonths ? month + 1 : month,\n day,\n hour: hour ?? 0,\n minute: minute ?? 0,\n second: second ?? 0,\n }\n }\n\n // Get the computed endDateTime value from the options\n const endDateTime = computed(() => {\n const { year, month, day, hour, minute, second } = parseDateTimeArray(\n unref(options.endDateTime)\n )\n\n return DateTime.fromObject(\n {\n year,\n month,\n day,\n hour,\n minute,\n second,\n },\n {\n zone: unref(options.timezone),\n }\n )\n })\n\n // Update the countdown values on each tick\n // if the timer reached the endDateTime stop the timer, reset the values and call the callback\n function tick() {\n const now = DateTime.now().setZone(unref(options.timezone))\n const end = endDateTime.value\n\n if (end <= now) {\n timer.stop()\n reset()\n if (callback) callback()\n return\n }\n\n const diff = end\n .diff(now, [\n 'years',\n 'days',\n 'hours',\n 'minutes',\n 'seconds',\n 'milliseconds',\n ])\n .toObject()\n\n years.value = diff.years ?? 0\n days.value = diff.days ?? 0\n hours.value = diff.hours ?? 0\n minutes.value = diff.minutes ?? 0\n seconds.value = diff.seconds ?? 0\n }\n\n // Function to pad the values with a leading zero\n function pad(value: number): string {\n return ('0' + value).slice(-2)\n }\n\n // Listen to the tick event\n function onTick(callback: () => void) {\n timer.on('tick', callback)\n }\n\n // Listen to the tick event\n timer.on('tick', tick)\n\n // Reset the countdown values\n function reset() {\n years.value = 0\n days.value = 0\n hours.value = 0\n minutes.value = 0\n seconds.value = 0\n }\n\n // Restart the timer\n function restart() {\n timer.reset()\n timer.start()\n }\n\n // Start the timer on mount\n onMounted(() => {\n tick()\n timer.start()\n })\n\n // Watch for changes in the endDateTime\n // and restart the timer\n watch(endDateTime, () => {\n // check timer is running to prevent restart on initial load\n if (timer.state === 'running') return\n restart()\n })\n\n // Return the values and functions\n return {\n years,\n days,\n hours,\n minutes,\n seconds,\n endDateTime,\n pad,\n restart,\n onTick,\n }\n}\n","export type EasingKey =\n | 'linear'\n | 'easeInQuad'\n | 'easeOutQuad'\n | 'easeInOutQuad'\n | 'easeInCubic'\n | 'easeOutCubic'\n | 'easeInOutCubic'\n | 'easeInQuart'\n | 'easeOutQuart'\n | 'easeInOutQuart'\n | 'easeInQuint'\n | 'easeOutQuint'\n | 'easeInOutQuint'\n\nexport type EasingFunction = (t: number) => number\n\nexport function useEasings() {\n const easings = {\n linear: (t: number) => t,\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t * t * t * t,\n easeOutQuart: (t: number) => 1 - --t * t * t * t,\n easeInOutQuart: (t: number) =>\n t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t,\n easeInQuint: (t: number) => t * t * t * t * t,\n easeOutQuint: (t: number) => 1 + --t * t * t * t * t,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t,\n }\n\n return easings\n}\n","import { useClipboard } from '@vueuse/core'\nimport { unref } from 'vue'\n\nimport type { Ref } from 'vue'\nimport type { Font } from 'fontkit'\n\nexport type useGlyphToSvgOptions = {\n fontSize: Ref<number> | number\n fontWeight: Ref<number> | number\n fontFile: Ref<Font> | Font\n}\n\nexport function useGlyphToSvg({\n fontSize,\n fontWeight,\n fontFile,\n}: useGlyphToSvgOptions) {\n const { copy } = useClipboard()\n const mappedFontFile = unref(fontFile)\n const mappedFontSize = unref(fontSize)\n const mappedFontWeight = unref(fontWeight)\n\n const loadVariableFont = () => {\n // @ts-ignore\n const variableFont = mappedFontFile.getVariation({\n wght: mappedFontWeight,\n })\n return variableFont\n }\n\n const convertToSvg = (glyph: any) => {\n // Scale according to current font size\n const scale = mappedFontSize / mappedFontFile.unitsPerEm\n const path = glyph.path.scale(scale, scale).scale(-1, 1).rotate(Math.PI)\n\n // Center inside square bounding box\n const bbox = path.bbox\n const minX = bbox.minX\n const minY = bbox.minY\n const height = bbox.height\n const width = bbox.width\n const dims = unref(fontSize)\n\n const centeredY = (height - dims) / 2 + minY\n const centeredX = (width - dims) / 2 + minX\n\n const viewBox = `${centeredX} ${centeredY} ${dims} ${dims}`\n\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">`\n svg += `<path d=\"${path.toSVG()}\" fill=\"currentColor\" />`\n svg += '</svg>'\n\n return svg\n }\n\n const renderSvg = async (codePoint: string) => {\n const font = await loadVariableFont()\n const glyph = font.glyphForCodePoint(codePoint)\n const svg = convertToSvg(glyph)\n return svg\n }\n\n const copySvg = async (codePoint: string) => {\n const svg = await renderSvg(codePoint)\n copy(svg)\n }\n\n return { copySvg, renderSvg }\n}\n","import { ref } from 'vue'\n\nexport type UseMetaViewportArgs = {\n content: string\n}\n\nexport function useMetaViewport(args?: UseMetaViewportArgs) {\n const content =\n args?.content ||\n 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'\n\n const metaViewport = ref<string | undefined>(undefined)\n\n function setMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n metaViewport.value = metaElement.content\n metaElement.setAttribute('content', content)\n }\n\n function resetMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n if (metaViewport.value) {\n metaElement.setAttribute('content', metaViewport.value)\n }\n }\n\n return {\n setMetaViewport,\n resetMetaViewport,\n }\n}\n","import { useEasings } from '../useEasings'\nimport { unrefElement } from '@vueuse/core'\nimport type { EasingFunction } from '../useEasings'\nimport type { MaybeComputedElementRef, MaybeElement } from '@vueuse/core'\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?: EasingFunction\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?: EasingFunction\n}\n\nconst easings = useEasings()\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 = easings.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 = easings.easeOutQuad,\n }: scrollToTargetParams) {\n let parentEl = unwrapParent(parent)\n if (!parentEl) return\n let targetEl = unwrapTarget(target, parentEl)\n if (!targetEl) return\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","import { onMounted, onUnmounted } from 'vue'\n\nexport type UseViewportDimensionsOptions = {\n width?: false | string\n height?: false | string\n initialWidth?: false | string\n initialHeight?: false | string\n}\n\nexport function useViewportDimensions(options?: UseViewportDimensionsOptions) {\n const mappedOptions = {\n width: '--vw',\n height: '--vh',\n initialWidth: '--initial-vw',\n initialHeight: '--initial-vh',\n ...options,\n }\n\n const setViewportWidth = (initial?: boolean) => {\n const vw = Number(window.innerWidth * 0.01).toFixed(2)\n\n if (mappedOptions.width) {\n document.documentElement.style.setProperty(mappedOptions.width, `${vw}px`)\n }\n\n if (initial && mappedOptions.initialWidth) {\n document.documentElement.style.setProperty(\n mappedOptions.initialWidth,\n `${vw}px`,\n )\n }\n }\n\n const setViewportHeight = (initial?: boolean) => {\n const vh = Number(window.innerHeight * 0.01).toFixed(2)\n\n if (mappedOptions.height) {\n document.documentElement.style.setProperty(\n mappedOptions.height || '--vh',\n `${vh}px`,\n )\n }\n\n if (initial && mappedOptions.initialHeight) {\n document.documentElement.style.setProperty(\n mappedOptions.initialHeight || '--initial-vh',\n `${vh}px`,\n )\n }\n }\n\n const setDimensions = () => {\n setViewportWidth()\n setViewportHeight()\n }\n\n onMounted(() => {\n setViewportWidth(true)\n setViewportHeight(true)\n\n window.addEventListener('resize', setDimensions, { passive: true })\n })\n\n onUnmounted(() => {\n window.removeEventListener('resize', setDimensions)\n })\n}\n"],"mappings":"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","names":["callback","easings","import_vue","import_vue","import_core","import_vue"]}
1
+ {"version":3,"sources":["../../packages/composables/index.ts","../../packages/composables/useCountdown/index.ts","../../packages/composables/useEasings/index.ts","../../packages/composables/useGlyphToSvg/index.ts","../../packages/composables/useMetaViewport/index.ts","../../packages/composables/useScrollTo/index.ts","../../packages/composables/useViewportDimensions/index.ts"],"sourcesContent":["export * from './useCountdown'\nexport * from './useEasings'\nexport * from './useGlyphToSvg'\nexport * from './useMetaViewport'\nexport * from './useScrollTo'\nexport * from './useViewportDimensions'\n","import { computed, onMounted, ref, unref, watch, type MaybeRef } from 'vue'\nimport { MagicTimer } from '@maas/magic-timer'\nimport { DateTime } from 'luxon'\n\n// Type for [YYYY, MM, DD, HH, MM, SS]\nexport type DateTimeArray = [number, number, number, number?, number?, number?]\n\n// Interface for the options\nexport interface CountdownOptions {\n endDateTime: MaybeRef<DateTimeArray>\n timezone?: MaybeRef<string>\n zeroIndexedMonths?: boolean\n}\n\n// Define the default options\nconst defaultOptions: CountdownOptions = {\n endDateTime: [1970, 1, 1, 0, 0, 0],\n zeroIndexedMonths: false,\n}\n\nexport function useCountdown(options: CountdownOptions, callback?: () => void) {\n // Merge the options with the default options\n options = { ...defaultOptions, ...options } as CountdownOptions\n\n // Check if the endDateTime is valid\n if (unref(options.endDateTime).length < 3) {\n console.error(\n 'useCountdownClock: The \"endDateTime\" option needs to be an array with the format [YYYY, MM, DD, HH?, MM?, SS?]'\n )\n }\n\n // Check if the timezone is valid\n const timezone = unref(options.timezone)\n if (timezone) {\n if (!DateTime.now().setZone(timezone).isValid) {\n console.error(\n `useCountdownClock: The \"timezone\" option \"${timezone}\" is not a valid timezone. Do you mean ${\n DateTime.local().zoneName\n }? For more information see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones`\n )\n }\n }\n\n // Create a new timer instance\n const timer = new MagicTimer()\n\n // Create the countdown values\n const years = ref(0)\n const days = ref(0)\n const hours = ref(0)\n const minutes = ref(0)\n const seconds = ref(0)\n\n // Parse the end dateTime array into an date and time object\n // if the hour, minute and second are not set, set them to 0\n // if the month is not zero indexed, add 1 to the month (defined in the options)\n const parseDateTimeArray = (dateTimeArr: DateTimeArray) => {\n const [year, month, day, hour, minute, second] = dateTimeArr\n return {\n year,\n month: options.zeroIndexedMonths ? month + 1 : month,\n day,\n hour: hour ?? 0,\n minute: minute ?? 0,\n second: second ?? 0,\n }\n }\n\n // Get the computed endDateTime value from the options\n const endDateTime = computed(() => {\n const { year, month, day, hour, minute, second } = parseDateTimeArray(\n unref(options.endDateTime)\n )\n\n return DateTime.fromObject(\n {\n year,\n month,\n day,\n hour,\n minute,\n second,\n },\n {\n zone: unref(options.timezone),\n }\n )\n })\n\n // Update the countdown values on each tick\n // if the timer reached the endDateTime stop the timer, reset the values and call the callback\n function tick() {\n const now = DateTime.now().setZone(unref(options.timezone))\n const end = endDateTime.value\n\n if (end <= now) {\n timer.stop()\n reset()\n if (callback) callback()\n return\n }\n\n const diff = end\n .diff(now, [\n 'years',\n 'days',\n 'hours',\n 'minutes',\n 'seconds',\n 'milliseconds',\n ])\n .toObject()\n\n years.value = diff.years ?? 0\n days.value = diff.days ?? 0\n hours.value = diff.hours ?? 0\n minutes.value = diff.minutes ?? 0\n seconds.value = diff.seconds ?? 0\n }\n\n // Function to pad the values with a leading zero\n function pad(value: number): string {\n return ('0' + value).slice(-2)\n }\n\n // Listen to the tick event\n function onTick(callback: () => void) {\n timer.on('tick', callback)\n }\n\n // Listen to the tick event\n timer.on('tick', tick)\n\n // Reset the countdown values\n function reset() {\n years.value = 0\n days.value = 0\n hours.value = 0\n minutes.value = 0\n seconds.value = 0\n }\n\n // Restart the timer\n function restart() {\n timer.reset()\n timer.start()\n }\n\n // Start the timer on mount\n onMounted(() => {\n tick()\n timer.start()\n })\n\n // Watch for changes in the endDateTime\n // and restart the timer\n watch(endDateTime, () => {\n // check timer is running to prevent restart on initial load\n if (timer.state === 'running') return\n restart()\n })\n\n // Return the values and functions\n return {\n years,\n days,\n hours,\n minutes,\n seconds,\n endDateTime,\n pad,\n restart,\n onTick,\n }\n}\n","export type EasingKey =\n | 'linear'\n | 'easeInQuad'\n | 'easeOutQuad'\n | 'easeInOutQuad'\n | 'easeInCubic'\n | 'easeOutCubic'\n | 'easeInOutCubic'\n | 'easeInQuart'\n | 'easeOutQuart'\n | 'easeInOutQuart'\n | 'easeInQuint'\n | 'easeOutQuint'\n | 'easeInOutQuint'\n\nexport type EasingFunction = (t: number) => number\n\nexport function useEasings() {\n const easings = {\n linear: (t: number) => t,\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t * t * t * t,\n easeOutQuart: (t: number) => 1 - --t * t * t * t,\n easeInOutQuart: (t: number) =>\n t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t,\n easeInQuint: (t: number) => t * t * t * t * t,\n easeOutQuint: (t: number) => 1 + --t * t * t * t * t,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t,\n }\n\n return easings\n}\n","import { useClipboard } from '@vueuse/core'\nimport { unref } from 'vue'\n\nimport type { Ref } from 'vue'\nimport type { Font } from 'fontkit'\n\nexport type useGlyphToSvgOptions = {\n fontSize: Ref<number> | number\n fontWeight: Ref<number> | number\n fontFile: Ref<Font> | Font\n}\n\nexport function useGlyphToSvg({\n fontSize,\n fontWeight,\n fontFile,\n}: useGlyphToSvgOptions) {\n const { copy } = useClipboard()\n const mappedFontFile = unref(fontFile)\n const mappedFontSize = unref(fontSize)\n const mappedFontWeight = unref(fontWeight)\n\n const loadVariableFont = () => {\n // @ts-ignore\n const variableFont = mappedFontFile.getVariation({\n wght: mappedFontWeight,\n })\n return variableFont\n }\n\n const convertToSvg = (glyph: any) => {\n // Scale according to current font size\n const scale = mappedFontSize / mappedFontFile.unitsPerEm\n const path = glyph.path.scale(scale, scale).scale(-1, 1).rotate(Math.PI)\n\n // Center inside square bounding box\n const bbox = path.bbox\n const minX = bbox.minX\n const minY = bbox.minY\n const height = bbox.height\n const width = bbox.width\n const dims = unref(fontSize)\n\n const centeredY = (height - dims) / 2 + minY\n const centeredX = (width - dims) / 2 + minX\n\n const viewBox = `${centeredX} ${centeredY} ${dims} ${dims}`\n\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">`\n svg += `<path d=\"${path.toSVG()}\" fill=\"currentColor\" />`\n svg += '</svg>'\n\n return svg\n }\n\n const renderSvg = async (codePoint: number) => {\n const font = await loadVariableFont()\n const glyph = font.glyphForCodePoint(codePoint)\n const svg = convertToSvg(glyph)\n return svg\n }\n\n const copySvg = async (codePoint: number) => {\n const svg = await renderSvg(codePoint)\n copy(svg)\n }\n\n return { copySvg, renderSvg }\n}\n","import { ref } from 'vue'\n\nexport type UseMetaViewportArgs = {\n content: string\n}\n\nexport function useMetaViewport(args?: UseMetaViewportArgs) {\n const content =\n args?.content ||\n 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'\n\n const metaViewport = ref<string | undefined>(undefined)\n\n function setMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n metaViewport.value = metaElement.content\n metaElement.setAttribute('content', content)\n }\n\n function resetMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n if (metaViewport.value) {\n metaElement.setAttribute('content', metaViewport.value)\n }\n }\n\n return {\n setMetaViewport,\n resetMetaViewport,\n }\n}\n","import { useEasings } from '../useEasings'\nimport { unrefElement } from '@vueuse/core'\nimport type { EasingFunction } from '../useEasings'\nimport type { MaybeComputedElementRef, MaybeElement } from '@vueuse/core'\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?: EasingFunction\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?: EasingFunction\n}\n\nconst easings = useEasings()\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 = easings.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 = easings.easeOutQuad,\n }: scrollToTargetParams) {\n let parentEl = unwrapParent(parent)\n if (!parentEl) return\n let targetEl = unwrapTarget(target, parentEl)\n if (!targetEl) return\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","import { onMounted, onUnmounted } from 'vue'\n\nexport type UseViewportDimensionsOptions = {\n width?: false | string\n height?: false | string\n initialWidth?: false | string\n initialHeight?: false | string\n}\n\nexport function useViewportDimensions(options?: UseViewportDimensionsOptions) {\n const mappedOptions = {\n width: '--vw',\n height: '--vh',\n initialWidth: '--initial-vw',\n initialHeight: '--initial-vh',\n ...options,\n }\n\n const setViewportWidth = (initial?: boolean) => {\n const vw = Number(window.innerWidth * 0.01).toFixed(2)\n\n if (mappedOptions.width) {\n document.documentElement.style.setProperty(mappedOptions.width, `${vw}px`)\n }\n\n if (initial && mappedOptions.initialWidth) {\n document.documentElement.style.setProperty(\n mappedOptions.initialWidth,\n `${vw}px`,\n )\n }\n }\n\n const setViewportHeight = (initial?: boolean) => {\n const vh = Number(window.innerHeight * 0.01).toFixed(2)\n\n if (mappedOptions.height) {\n document.documentElement.style.setProperty(\n mappedOptions.height || '--vh',\n `${vh}px`,\n )\n }\n\n if (initial && mappedOptions.initialHeight) {\n document.documentElement.style.setProperty(\n mappedOptions.initialHeight || '--initial-vh',\n `${vh}px`,\n )\n }\n }\n\n const setDimensions = () => {\n setViewportWidth()\n setViewportHeight()\n }\n\n onMounted(() => {\n setViewportWidth(true)\n setViewportHeight(true)\n\n window.addEventListener('resize', setDimensions, { passive: true })\n })\n\n onUnmounted(() => {\n window.removeEventListener('resize', setDimensions)\n })\n}\n"],"mappings":"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","names":["callback","easings","import_vue","import_vue","import_core","import_vue"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/composables/useCountdown/index.ts","../../packages/composables/useEasings/index.ts","../../packages/composables/useGlyphToSvg/index.ts","../../packages/composables/useMetaViewport/index.ts","../../packages/composables/useScrollTo/index.ts","../../packages/composables/useViewportDimensions/index.ts"],"sourcesContent":["import { computed, onMounted, ref, unref, watch, type MaybeRef } from 'vue'\nimport { MagicTimer } from '@maas/magic-timer'\nimport { DateTime } from 'luxon'\n\n// Type for [YYYY, MM, DD, HH, MM, SS]\nexport type DateTimeArray = [number, number, number, number?, number?, number?]\n\n// Interface for the options\nexport interface CountdownOptions {\n endDateTime: MaybeRef<DateTimeArray>\n timezone?: MaybeRef<string>\n zeroIndexedMonths?: boolean\n}\n\n// Define the default options\nconst defaultOptions: CountdownOptions = {\n endDateTime: [1970, 1, 1, 0, 0, 0],\n zeroIndexedMonths: false,\n}\n\nexport function useCountdown(options: CountdownOptions, callback?: () => void) {\n // Merge the options with the default options\n options = { ...defaultOptions, ...options } as CountdownOptions\n\n // Check if the endDateTime is valid\n if (unref(options.endDateTime).length < 3) {\n console.error(\n 'useCountdownClock: The \"endDateTime\" option needs to be an array with the format [YYYY, MM, DD, HH?, MM?, SS?]'\n )\n }\n\n // Check if the timezone is valid\n const timezone = unref(options.timezone)\n if (timezone) {\n if (!DateTime.now().setZone(timezone).isValid) {\n console.error(\n `useCountdownClock: The \"timezone\" option \"${timezone}\" is not a valid timezone. Do you mean ${\n DateTime.local().zoneName\n }? For more information see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones`\n )\n }\n }\n\n // Create a new timer instance\n const timer = new MagicTimer()\n\n // Create the countdown values\n const years = ref(0)\n const days = ref(0)\n const hours = ref(0)\n const minutes = ref(0)\n const seconds = ref(0)\n\n // Parse the end dateTime array into an date and time object\n // if the hour, minute and second are not set, set them to 0\n // if the month is not zero indexed, add 1 to the month (defined in the options)\n const parseDateTimeArray = (dateTimeArr: DateTimeArray) => {\n const [year, month, day, hour, minute, second] = dateTimeArr\n return {\n year,\n month: options.zeroIndexedMonths ? month + 1 : month,\n day,\n hour: hour ?? 0,\n minute: minute ?? 0,\n second: second ?? 0,\n }\n }\n\n // Get the computed endDateTime value from the options\n const endDateTime = computed(() => {\n const { year, month, day, hour, minute, second } = parseDateTimeArray(\n unref(options.endDateTime)\n )\n\n return DateTime.fromObject(\n {\n year,\n month,\n day,\n hour,\n minute,\n second,\n },\n {\n zone: unref(options.timezone),\n }\n )\n })\n\n // Update the countdown values on each tick\n // if the timer reached the endDateTime stop the timer, reset the values and call the callback\n function tick() {\n const now = DateTime.now().setZone(unref(options.timezone))\n const end = endDateTime.value\n\n if (end <= now) {\n timer.stop()\n reset()\n if (callback) callback()\n return\n }\n\n const diff = end\n .diff(now, [\n 'years',\n 'days',\n 'hours',\n 'minutes',\n 'seconds',\n 'milliseconds',\n ])\n .toObject()\n\n years.value = diff.years ?? 0\n days.value = diff.days ?? 0\n hours.value = diff.hours ?? 0\n minutes.value = diff.minutes ?? 0\n seconds.value = diff.seconds ?? 0\n }\n\n // Function to pad the values with a leading zero\n function pad(value: number): string {\n return ('0' + value).slice(-2)\n }\n\n // Listen to the tick event\n function onTick(callback: () => void) {\n timer.on('tick', callback)\n }\n\n // Listen to the tick event\n timer.on('tick', tick)\n\n // Reset the countdown values\n function reset() {\n years.value = 0\n days.value = 0\n hours.value = 0\n minutes.value = 0\n seconds.value = 0\n }\n\n // Restart the timer\n function restart() {\n timer.reset()\n timer.start()\n }\n\n // Start the timer on mount\n onMounted(() => {\n tick()\n timer.start()\n })\n\n // Watch for changes in the endDateTime\n // and restart the timer\n watch(endDateTime, () => {\n // check timer is running to prevent restart on initial load\n if (timer.state === 'running') return\n restart()\n })\n\n // Return the values and functions\n return {\n years,\n days,\n hours,\n minutes,\n seconds,\n endDateTime,\n pad,\n restart,\n onTick,\n }\n}\n","export type EasingKey =\n | 'linear'\n | 'easeInQuad'\n | 'easeOutQuad'\n | 'easeInOutQuad'\n | 'easeInCubic'\n | 'easeOutCubic'\n | 'easeInOutCubic'\n | 'easeInQuart'\n | 'easeOutQuart'\n | 'easeInOutQuart'\n | 'easeInQuint'\n | 'easeOutQuint'\n | 'easeInOutQuint'\n\nexport type EasingFunction = (t: number) => number\n\nexport function useEasings() {\n const easings = {\n linear: (t: number) => t,\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t * t * t * t,\n easeOutQuart: (t: number) => 1 - --t * t * t * t,\n easeInOutQuart: (t: number) =>\n t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t,\n easeInQuint: (t: number) => t * t * t * t * t,\n easeOutQuint: (t: number) => 1 + --t * t * t * t * t,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t,\n }\n\n return easings\n}\n","import { useClipboard } from '@vueuse/core'\nimport { unref } from 'vue'\n\nimport type { Ref } from 'vue'\nimport type { Font } from 'fontkit'\n\nexport type useGlyphToSvgOptions = {\n fontSize: Ref<number> | number\n fontWeight: Ref<number> | number\n fontFile: Ref<Font> | Font\n}\n\nexport function useGlyphToSvg({\n fontSize,\n fontWeight,\n fontFile,\n}: useGlyphToSvgOptions) {\n const { copy } = useClipboard()\n const mappedFontFile = unref(fontFile)\n const mappedFontSize = unref(fontSize)\n const mappedFontWeight = unref(fontWeight)\n\n const loadVariableFont = () => {\n // @ts-ignore\n const variableFont = mappedFontFile.getVariation({\n wght: mappedFontWeight,\n })\n return variableFont\n }\n\n const convertToSvg = (glyph: any) => {\n // Scale according to current font size\n const scale = mappedFontSize / mappedFontFile.unitsPerEm\n const path = glyph.path.scale(scale, scale).scale(-1, 1).rotate(Math.PI)\n\n // Center inside square bounding box\n const bbox = path.bbox\n const minX = bbox.minX\n const minY = bbox.minY\n const height = bbox.height\n const width = bbox.width\n const dims = unref(fontSize)\n\n const centeredY = (height - dims) / 2 + minY\n const centeredX = (width - dims) / 2 + minX\n\n const viewBox = `${centeredX} ${centeredY} ${dims} ${dims}`\n\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">`\n svg += `<path d=\"${path.toSVG()}\" fill=\"currentColor\" />`\n svg += '</svg>'\n\n return svg\n }\n\n const renderSvg = async (codePoint: string) => {\n const font = await loadVariableFont()\n const glyph = font.glyphForCodePoint(codePoint)\n const svg = convertToSvg(glyph)\n return svg\n }\n\n const copySvg = async (codePoint: string) => {\n const svg = await renderSvg(codePoint)\n copy(svg)\n }\n\n return { copySvg, renderSvg }\n}\n","import { ref } from 'vue'\n\nexport type UseMetaViewportArgs = {\n content: string\n}\n\nexport function useMetaViewport(args?: UseMetaViewportArgs) {\n const content =\n args?.content ||\n 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'\n\n const metaViewport = ref<string | undefined>(undefined)\n\n function setMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n metaViewport.value = metaElement.content\n metaElement.setAttribute('content', content)\n }\n\n function resetMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n if (metaViewport.value) {\n metaElement.setAttribute('content', metaViewport.value)\n }\n }\n\n return {\n setMetaViewport,\n resetMetaViewport,\n }\n}\n","import { useEasings } from '../useEasings'\nimport { unrefElement } from '@vueuse/core'\nimport type { EasingFunction } from '../useEasings'\nimport type { MaybeComputedElementRef, MaybeElement } from '@vueuse/core'\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?: EasingFunction\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?: EasingFunction\n}\n\nconst easings = useEasings()\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 = easings.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 = easings.easeOutQuad,\n }: scrollToTargetParams) {\n let parentEl = unwrapParent(parent)\n if (!parentEl) return\n let targetEl = unwrapTarget(target, parentEl)\n if (!targetEl) return\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","import { onMounted, onUnmounted } from 'vue'\n\nexport type UseViewportDimensionsOptions = {\n width?: false | string\n height?: false | string\n initialWidth?: false | string\n initialHeight?: false | string\n}\n\nexport function useViewportDimensions(options?: UseViewportDimensionsOptions) {\n const mappedOptions = {\n width: '--vw',\n height: '--vh',\n initialWidth: '--initial-vw',\n initialHeight: '--initial-vh',\n ...options,\n }\n\n const setViewportWidth = (initial?: boolean) => {\n const vw = Number(window.innerWidth * 0.01).toFixed(2)\n\n if (mappedOptions.width) {\n document.documentElement.style.setProperty(mappedOptions.width, `${vw}px`)\n }\n\n if (initial && mappedOptions.initialWidth) {\n document.documentElement.style.setProperty(\n mappedOptions.initialWidth,\n `${vw}px`,\n )\n }\n }\n\n const setViewportHeight = (initial?: boolean) => {\n const vh = Number(window.innerHeight * 0.01).toFixed(2)\n\n if (mappedOptions.height) {\n document.documentElement.style.setProperty(\n mappedOptions.height || '--vh',\n `${vh}px`,\n )\n }\n\n if (initial && mappedOptions.initialHeight) {\n document.documentElement.style.setProperty(\n mappedOptions.initialHeight || '--initial-vh',\n `${vh}px`,\n )\n }\n }\n\n const setDimensions = () => {\n setViewportWidth()\n setViewportHeight()\n }\n\n onMounted(() => {\n setViewportWidth(true)\n setViewportHeight(true)\n\n window.addEventListener('resize', setDimensions, { passive: true })\n })\n\n onUnmounted(() => {\n window.removeEventListener('resize', setDimensions)\n })\n}\n"],"mappings":"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","names":["callback","easings","unref","ref","onMounted"]}
1
+ {"version":3,"sources":["../../packages/composables/useCountdown/index.ts","../../packages/composables/useEasings/index.ts","../../packages/composables/useGlyphToSvg/index.ts","../../packages/composables/useMetaViewport/index.ts","../../packages/composables/useScrollTo/index.ts","../../packages/composables/useViewportDimensions/index.ts"],"sourcesContent":["import { computed, onMounted, ref, unref, watch, type MaybeRef } from 'vue'\nimport { MagicTimer } from '@maas/magic-timer'\nimport { DateTime } from 'luxon'\n\n// Type for [YYYY, MM, DD, HH, MM, SS]\nexport type DateTimeArray = [number, number, number, number?, number?, number?]\n\n// Interface for the options\nexport interface CountdownOptions {\n endDateTime: MaybeRef<DateTimeArray>\n timezone?: MaybeRef<string>\n zeroIndexedMonths?: boolean\n}\n\n// Define the default options\nconst defaultOptions: CountdownOptions = {\n endDateTime: [1970, 1, 1, 0, 0, 0],\n zeroIndexedMonths: false,\n}\n\nexport function useCountdown(options: CountdownOptions, callback?: () => void) {\n // Merge the options with the default options\n options = { ...defaultOptions, ...options } as CountdownOptions\n\n // Check if the endDateTime is valid\n if (unref(options.endDateTime).length < 3) {\n console.error(\n 'useCountdownClock: The \"endDateTime\" option needs to be an array with the format [YYYY, MM, DD, HH?, MM?, SS?]'\n )\n }\n\n // Check if the timezone is valid\n const timezone = unref(options.timezone)\n if (timezone) {\n if (!DateTime.now().setZone(timezone).isValid) {\n console.error(\n `useCountdownClock: The \"timezone\" option \"${timezone}\" is not a valid timezone. Do you mean ${\n DateTime.local().zoneName\n }? For more information see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones`\n )\n }\n }\n\n // Create a new timer instance\n const timer = new MagicTimer()\n\n // Create the countdown values\n const years = ref(0)\n const days = ref(0)\n const hours = ref(0)\n const minutes = ref(0)\n const seconds = ref(0)\n\n // Parse the end dateTime array into an date and time object\n // if the hour, minute and second are not set, set them to 0\n // if the month is not zero indexed, add 1 to the month (defined in the options)\n const parseDateTimeArray = (dateTimeArr: DateTimeArray) => {\n const [year, month, day, hour, minute, second] = dateTimeArr\n return {\n year,\n month: options.zeroIndexedMonths ? month + 1 : month,\n day,\n hour: hour ?? 0,\n minute: minute ?? 0,\n second: second ?? 0,\n }\n }\n\n // Get the computed endDateTime value from the options\n const endDateTime = computed(() => {\n const { year, month, day, hour, minute, second } = parseDateTimeArray(\n unref(options.endDateTime)\n )\n\n return DateTime.fromObject(\n {\n year,\n month,\n day,\n hour,\n minute,\n second,\n },\n {\n zone: unref(options.timezone),\n }\n )\n })\n\n // Update the countdown values on each tick\n // if the timer reached the endDateTime stop the timer, reset the values and call the callback\n function tick() {\n const now = DateTime.now().setZone(unref(options.timezone))\n const end = endDateTime.value\n\n if (end <= now) {\n timer.stop()\n reset()\n if (callback) callback()\n return\n }\n\n const diff = end\n .diff(now, [\n 'years',\n 'days',\n 'hours',\n 'minutes',\n 'seconds',\n 'milliseconds',\n ])\n .toObject()\n\n years.value = diff.years ?? 0\n days.value = diff.days ?? 0\n hours.value = diff.hours ?? 0\n minutes.value = diff.minutes ?? 0\n seconds.value = diff.seconds ?? 0\n }\n\n // Function to pad the values with a leading zero\n function pad(value: number): string {\n return ('0' + value).slice(-2)\n }\n\n // Listen to the tick event\n function onTick(callback: () => void) {\n timer.on('tick', callback)\n }\n\n // Listen to the tick event\n timer.on('tick', tick)\n\n // Reset the countdown values\n function reset() {\n years.value = 0\n days.value = 0\n hours.value = 0\n minutes.value = 0\n seconds.value = 0\n }\n\n // Restart the timer\n function restart() {\n timer.reset()\n timer.start()\n }\n\n // Start the timer on mount\n onMounted(() => {\n tick()\n timer.start()\n })\n\n // Watch for changes in the endDateTime\n // and restart the timer\n watch(endDateTime, () => {\n // check timer is running to prevent restart on initial load\n if (timer.state === 'running') return\n restart()\n })\n\n // Return the values and functions\n return {\n years,\n days,\n hours,\n minutes,\n seconds,\n endDateTime,\n pad,\n restart,\n onTick,\n }\n}\n","export type EasingKey =\n | 'linear'\n | 'easeInQuad'\n | 'easeOutQuad'\n | 'easeInOutQuad'\n | 'easeInCubic'\n | 'easeOutCubic'\n | 'easeInOutCubic'\n | 'easeInQuart'\n | 'easeOutQuart'\n | 'easeInOutQuart'\n | 'easeInQuint'\n | 'easeOutQuint'\n | 'easeInOutQuint'\n\nexport type EasingFunction = (t: number) => number\n\nexport function useEasings() {\n const easings = {\n linear: (t: number) => t,\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => --t * t * t + 1,\n easeInOutCubic: (t: number) =>\n t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n easeInQuart: (t: number) => t * t * t * t,\n easeOutQuart: (t: number) => 1 - --t * t * t * t,\n easeInOutQuart: (t: number) =>\n t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t,\n easeInQuint: (t: number) => t * t * t * t * t,\n easeOutQuint: (t: number) => 1 + --t * t * t * t * t,\n easeInOutQuint: (t: number) =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t,\n }\n\n return easings\n}\n","import { useClipboard } from '@vueuse/core'\nimport { unref } from 'vue'\n\nimport type { Ref } from 'vue'\nimport type { Font } from 'fontkit'\n\nexport type useGlyphToSvgOptions = {\n fontSize: Ref<number> | number\n fontWeight: Ref<number> | number\n fontFile: Ref<Font> | Font\n}\n\nexport function useGlyphToSvg({\n fontSize,\n fontWeight,\n fontFile,\n}: useGlyphToSvgOptions) {\n const { copy } = useClipboard()\n const mappedFontFile = unref(fontFile)\n const mappedFontSize = unref(fontSize)\n const mappedFontWeight = unref(fontWeight)\n\n const loadVariableFont = () => {\n // @ts-ignore\n const variableFont = mappedFontFile.getVariation({\n wght: mappedFontWeight,\n })\n return variableFont\n }\n\n const convertToSvg = (glyph: any) => {\n // Scale according to current font size\n const scale = mappedFontSize / mappedFontFile.unitsPerEm\n const path = glyph.path.scale(scale, scale).scale(-1, 1).rotate(Math.PI)\n\n // Center inside square bounding box\n const bbox = path.bbox\n const minX = bbox.minX\n const minY = bbox.minY\n const height = bbox.height\n const width = bbox.width\n const dims = unref(fontSize)\n\n const centeredY = (height - dims) / 2 + minY\n const centeredX = (width - dims) / 2 + minX\n\n const viewBox = `${centeredX} ${centeredY} ${dims} ${dims}`\n\n let svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">`\n svg += `<path d=\"${path.toSVG()}\" fill=\"currentColor\" />`\n svg += '</svg>'\n\n return svg\n }\n\n const renderSvg = async (codePoint: number) => {\n const font = await loadVariableFont()\n const glyph = font.glyphForCodePoint(codePoint)\n const svg = convertToSvg(glyph)\n return svg\n }\n\n const copySvg = async (codePoint: number) => {\n const svg = await renderSvg(codePoint)\n copy(svg)\n }\n\n return { copySvg, renderSvg }\n}\n","import { ref } from 'vue'\n\nexport type UseMetaViewportArgs = {\n content: string\n}\n\nexport function useMetaViewport(args?: UseMetaViewportArgs) {\n const content =\n args?.content ||\n 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'\n\n const metaViewport = ref<string | undefined>(undefined)\n\n function setMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n metaViewport.value = metaElement.content\n metaElement.setAttribute('content', content)\n }\n\n function resetMetaViewport() {\n const metaElement = document.querySelector(\n 'meta[name=\"viewport\"]'\n ) as HTMLMetaElement\n\n if (metaViewport.value) {\n metaElement.setAttribute('content', metaViewport.value)\n }\n }\n\n return {\n setMetaViewport,\n resetMetaViewport,\n }\n}\n","import { useEasings } from '../useEasings'\nimport { unrefElement } from '@vueuse/core'\nimport type { EasingFunction } from '../useEasings'\nimport type { MaybeComputedElementRef, MaybeElement } from '@vueuse/core'\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?: EasingFunction\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?: EasingFunction\n}\n\nconst easings = useEasings()\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 = easings.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 = easings.easeOutQuad,\n }: scrollToTargetParams) {\n let parentEl = unwrapParent(parent)\n if (!parentEl) return\n let targetEl = unwrapTarget(target, parentEl)\n if (!targetEl) return\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","import { onMounted, onUnmounted } from 'vue'\n\nexport type UseViewportDimensionsOptions = {\n width?: false | string\n height?: false | string\n initialWidth?: false | string\n initialHeight?: false | string\n}\n\nexport function useViewportDimensions(options?: UseViewportDimensionsOptions) {\n const mappedOptions = {\n width: '--vw',\n height: '--vh',\n initialWidth: '--initial-vw',\n initialHeight: '--initial-vh',\n ...options,\n }\n\n const setViewportWidth = (initial?: boolean) => {\n const vw = Number(window.innerWidth * 0.01).toFixed(2)\n\n if (mappedOptions.width) {\n document.documentElement.style.setProperty(mappedOptions.width, `${vw}px`)\n }\n\n if (initial && mappedOptions.initialWidth) {\n document.documentElement.style.setProperty(\n mappedOptions.initialWidth,\n `${vw}px`,\n )\n }\n }\n\n const setViewportHeight = (initial?: boolean) => {\n const vh = Number(window.innerHeight * 0.01).toFixed(2)\n\n if (mappedOptions.height) {\n document.documentElement.style.setProperty(\n mappedOptions.height || '--vh',\n `${vh}px`,\n )\n }\n\n if (initial && mappedOptions.initialHeight) {\n document.documentElement.style.setProperty(\n mappedOptions.initialHeight || '--initial-vh',\n `${vh}px`,\n )\n }\n }\n\n const setDimensions = () => {\n setViewportWidth()\n setViewportHeight()\n }\n\n onMounted(() => {\n setViewportWidth(true)\n setViewportHeight(true)\n\n window.addEventListener('resize', setDimensions, { passive: true })\n })\n\n onUnmounted(() => {\n window.removeEventListener('resize', setDimensions)\n })\n}\n"],"mappings":"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","names":["callback","easings","unref","ref","onMounted"]}
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@maas/vue-equipment/nuxt",
3
3
  "configKey": "vueEquipment",
4
- "version": "0.24.2"
4
+ "version": "0.24.4"
5
5
  }
@@ -46,7 +46,7 @@ const functions$1 = [
46
46
  {
47
47
  name: "MagicPlayer",
48
48
  "package": "plugins",
49
- lastUpdated: 1709136225000,
49
+ lastUpdated: 1710321122000,
50
50
  docs: "https://maas.egineering/vue-equipment/plugins/MagicPlayer/",
51
51
  description: "player"
52
52
  },
@@ -81,7 +81,7 @@ const functions$1 = [
81
81
  {
82
82
  name: "useGlyphToSvg",
83
83
  "package": "composables",
84
- lastUpdated: 1690192429000,
84
+ lastUpdated: 1709721437000,
85
85
  docs: "https://maas.egineering/vue-equipment/composables/useGlyphToSvg/",
86
86
  description: "render [fontkit](https://github.com/foliojs/fontkit) glyphs as SVG"
87
87
  },
@@ -187,9 +187,9 @@ const {
187
187
 
188
188
  useDrawerProgress({ id: props.id, elRef, drawerRef, position, overshoot })
189
189
 
190
- // Surpress animation on initial mount if the options call for it
191
- // To achive this, the transition names are set to undefined
192
- const surpressTransition = computed(() => {
190
+ // Prevent animation on initial mount if the options call for it
191
+ // To achieve this, the transition names are set to undefined
192
+ const preventTransition = computed(() => {
193
193
  return (
194
194
  mappedOptions.beforeMount.open &&
195
195
  !mappedOptions.beforeMount.animate &&
@@ -198,13 +198,13 @@ const surpressTransition = computed(() => {
198
198
  })
199
199
 
200
200
  const backdropTransition = computed(() => {
201
- return surpressTransition.value
201
+ return preventTransition.value
202
202
  ? undefined
203
203
  : mappedOptions.transitions?.backdrop
204
204
  })
205
205
 
206
206
  const contentTransition = computed(() => {
207
- return surpressTransition.value
207
+ return preventTransition.value
208
208
  ? undefined
209
209
  : mappedOptions.transitions?.content
210
210
  })
@@ -257,7 +257,6 @@ function saveOvershoot() {
257
257
  const overshootVar = getComputedStyle(element!).getPropertyValue(
258
258
  '--magic-drawer-drag-overshoot'
259
259
  )
260
-
261
260
  overshoot.value = convertToPixels(overshootVar) || 0
262
261
  }
263
262
 
@@ -298,5 +297,5 @@ onBeforeUnmount(() => {
298
297
  </script>
299
298
 
300
299
  <style>
301
- :root{--magic-drawer-height:75svh;--magic-drawer-width:100%;--magic-drawer-z-index:999;--magic-drawer-justify-content:center;--magic-drawer-align-items:flex-end;--magic-drawer-backdrop-color:rgba(0,0,0,.5);--magic-drawer-backdrop-filter:unset;--magic-drawer-content-overflow-x:hidden;--magic-drawer-content-overflow-y:hidden;--magic-drawer-enter-animation:slide-btt-in 300ms ease;--magic-drawer-leave-animation:slide-btt-out 300ms ease;--magic-drawer-drag-overshoot:4rem;--magic-drawer-padding:0px}.magic-drawer{--magic-drawer-drag-overshoot-x:0px;--magic-drawer-drag-overshoot-y:0px;align-items:var(--magic-drawer-align-items);background:transparent;border:none;color:inherit;display:flex;height:100%;inset:0;justify-content:var(--magic-drawer-justify-content);padding:0;pointer-events:none;position:fixed;width:100%;z-index:var(--magic-drawer-z-index)}.magic-drawer.-bottom{--magic-drawer-drag-overshoot-y:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 0 var(--magic-drawer-drag-overshoot-y) 0}.magic-drawer.-bottom>.magic-drawer__wrapper{height:calc(var(--magic-drawer-height, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer.-top{--magic-drawer-enter-animation:slide-ttb-in 300ms ease;--magic-drawer-leave-animation:slide-ttb-out 300ms ease;--magic-drawer-align-items:flex-start;--magic-drawer-drag-overshoot-y:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:var(--magic-drawer-drag-overshoot-y) 0 0 0}.magic-drawer.-top>.magic-drawer__wrapper{height:calc(var(--magic-drawer-height, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer.-right{--magic-drawer-enter-animation:slide-rtl-in 300ms ease;--magic-drawer-leave-animation:slide-rtl-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-end;--magic-drawer-drag-overshoot-x:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 var(--magic-drawer-drag-overshoot-x) 0 0}.magic-drawer.-right>.magic-drawer__wrapper{width:calc(var(--magic-drawer-width, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer.-left{--magic-drawer-enter-animation:slide-ltr-in 300ms ease;--magic-drawer-leave-animation:slide-ltr-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-start;--magic-drawer-drag-overshoot-x:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:0 0 0 var(--magic-drawer-drag-overshoot-x)}.magic-drawer.-left>.magic-drawer__wrapper{width:calc(var(--magic-drawer-width, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer__wrapper{height:var(--magic-drawer-height);pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:var(--magic-drawer-width)}.magic-drawer__content{height:100%;max-height:100%;position:relative;width:100%}.magic-drawer__drag{-webkit-overflow-scrolling:touch;align-items:var(--magic-drawer-align-items);cursor:grab;display:flex;height:100%;justify-content:var(--magic-drawer-justify-content);overflow-x:var(--magic-drawer-content-overflow-x);overflow-y:var(--magic-drawer-content-overflow-y);pointer-events:auto;position:relative;scroll-behavior:smooth;width:100%}.magic-drawer.-dragging .magic-drawer__drag{cursor:grabbing;-webkit-user-select:none;-moz-user-select:none;user-select:none}.magic-drawer__drag>*{padding:var(--magic-drawer-padding)}.magic-drawer__overlay{inset:0;position:absolute;z-index:9999}.magic-drawer__backdrop{-webkit-backdrop-filter:var(--magic-drawer-backdrop-filter);backdrop-filter:var(--magic-drawer-backdrop-filter);background-color:var(--magic-drawer-backdrop-color);bottom:0;height:100%;left:0;pointer-events:auto;position:fixed;right:0;top:0;width:100%;z-index:-1}.magic-drawer--content-enter-active{animation:var(--magic-drawer-enter-animation)}.magic-drawer--content-leave-active{animation:var(--magic-drawer-leave-animation)}.magic-drawer--backdrop-enter-active{animation:fade-in .3s ease}.magic-drawer--backdrop-leave-active{animation:fade-out .3s ease}
300
+ :root{--magic-drawer-height:75svh;--magic-drawer-width:100%;--magic-drawer-z-index:999;--magic-drawer-justify-content:center;--magic-drawer-align-items:flex-end;--magic-drawer-backdrop-color:rgba(0,0,0,.5);--magic-drawer-backdrop-filter:unset;--magic-drawer-content-overflow-x:hidden;--magic-drawer-content-overflow-y:hidden;--magic-drawer-enter-animation:slide-btt-in 300ms ease;--magic-drawer-leave-animation:slide-btt-out 300ms ease;--magic-drawer-drag-overshoot:4rem;--magic-drawer-padding:0px}.magic-drawer{--magic-drawer-drag-overshoot-x:0px;--magic-drawer-drag-overshoot-y:0px;align-items:var(--magic-drawer-align-items);background:transparent;border:none;color:inherit;display:flex;height:100%;inset:0;justify-content:var(--magic-drawer-justify-content);padding:0;pointer-events:none;position:fixed;width:100%;z-index:var(--magic-drawer-z-index)}.magic-drawer.-bottom{--magic-drawer-drag-overshoot-y:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 0 var(--magic-drawer-drag-overshoot-y) 0}.magic-drawer.-bottom>.magic-drawer__wrapper{height:calc(var(--magic-drawer-height, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer.-top{--magic-drawer-enter-animation:slide-ttb-in 300ms ease;--magic-drawer-leave-animation:slide-ttb-out 300ms ease;--magic-drawer-align-items:flex-start;--magic-drawer-drag-overshoot-y:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:var(--magic-drawer-drag-overshoot-y) 0 0 0}.magic-drawer.-top>.magic-drawer__wrapper{height:calc(var(--magic-drawer-height, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer.-right{--magic-drawer-enter-animation:slide-rtl-in 300ms ease;--magic-drawer-leave-animation:slide-rtl-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-end;--magic-drawer-drag-overshoot-x:var(--magic-drawer-drag-overshoot);--magic-drawer-padding:0 var(--magic-drawer-drag-overshoot-x) 0 0}.magic-drawer.-right>.magic-drawer__wrapper{width:calc(var(--magic-drawer-width, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer.-left{--magic-drawer-enter-animation:slide-ltr-in 300ms ease;--magic-drawer-leave-animation:slide-ltr-out 300ms ease;--magic-drawer-align-items:center;--magic-drawer-justify-content:flex-start;--magic-drawer-drag-overshoot-x:calc(var(--magic-drawer-drag-overshoot)*-1);--magic-drawer-padding:0 0 0 var(--magic-drawer-drag-overshoot-x)}.magic-drawer.-left>.magic-drawer__wrapper{width:calc(var(--magic-drawer-width, 0px) + var(--magic-drawer-drag-overshoot, 0px))}.magic-drawer__wrapper{height:var(--magic-drawer-height);pointer-events:none;transform:translate(var(--magic-drawer-drag-overshoot-x),var(--magic-drawer-drag-overshoot-y));width:var(--magic-drawer-width)}.magic-drawer__content{height:100%;max-height:100%;position:relative;width:100%}.magic-drawer__drag{-webkit-overflow-scrolling:touch;align-items:var(--magic-drawer-align-items);cursor:grab;display:flex;height:100%;justify-content:var(--magic-drawer-justify-content);overflow-x:var(--magic-drawer-content-overflow-x);overflow-y:var(--magic-drawer-content-overflow-y);pointer-events:auto;position:relative;scroll-behavior:smooth;width:100%}dialog.magic-drawer__drag{background:transparent;border:0;margin:0;outline:0;padding:0}dialog.magic-drawer__drag::backdrop{background-color:transparent}.magic-drawer.-dragging .magic-drawer__drag{cursor:grabbing;-webkit-user-select:none;-moz-user-select:none;user-select:none}.magic-drawer__drag>*{padding:var(--magic-drawer-padding)}.magic-drawer__overlay{inset:0;position:absolute;z-index:9999}.magic-drawer__backdrop{-webkit-backdrop-filter:var(--magic-drawer-backdrop-filter);backdrop-filter:var(--magic-drawer-backdrop-filter);background-color:var(--magic-drawer-backdrop-color);bottom:0;height:100%;left:0;pointer-events:auto;position:fixed;right:0;top:0;width:100%;z-index:-1}.magic-drawer--content-enter-active{animation:var(--magic-drawer-enter-animation)}.magic-drawer--content-leave-active{animation:var(--magic-drawer-leave-animation)}.magic-drawer--backdrop-enter-active{animation:fade-in .3s ease}.magic-drawer--backdrop-leave-active{animation:fade-out .3s ease}
302
301
  </style>
@@ -289,6 +289,8 @@ export function useDrawerDrag(args) {
289
289
  }
290
290
  }
291
291
  function onPointerup(e) {
292
+ const eventTarget = e.target;
293
+ const tagNameBlacklist = ["INPUT", "TEXTAREA", "BUTTON", "SELECT", "A"];
292
294
  if (shouldClose.value) {
293
295
  close();
294
296
  } else if (interpolateTo.value || interpolateTo.value === 0) {
@@ -309,7 +311,7 @@ export function useDrawerDrag(args) {
309
311
  snappedX.value = interpolateTo.value;
310
312
  break;
311
313
  }
312
- } else {
314
+ } else if (!tagNameBlacklist.includes(eventTarget.tagName)) {
313
315
  switch (position) {
314
316
  case "bottom":
315
317
  case "top":
@@ -1,10 +1,12 @@
1
1
  import type { Plugin } from 'vue';
2
2
  import MagicPlayer from './src/components/MagicPlayer.vue.js';
3
3
  import MagicPlayerControls from './src/components/MagicPlayerControls.vue.js';
4
+ import MagicPlayerDisplayTime from './src/components/MagicPlayerDisplayTime.vue.js';
4
5
  import MagicPlayerMuxPopover from './src/components/MagicPlayerMuxPopover.vue.js';
5
6
  import MagicPlayerOverlay from './src/components/MagicPlayerOverlay.vue.js';
6
7
  import MagicPlayerPoster from './src/components/MagicPlayerPoster.vue.js';
7
8
  import MagicPlayerTimeline from './src/components/MagicPlayerTimeline.vue.js';
8
9
  import { usePlayerApi } from './src/composables/usePlayerApi.js';
9
10
  declare const MagicPlayerPlugin: Plugin;
10
- export { MagicPlayerPlugin, MagicPlayer, MagicPlayerControls, MagicPlayerMuxPopover, MagicPlayerPoster, MagicPlayerOverlay, MagicPlayerTimeline, usePlayerApi, };
11
+ export { MagicPlayerPlugin, MagicPlayer, MagicPlayerControls, MagicPlayerDisplayTime, MagicPlayerMuxPopover, MagicPlayerPoster, MagicPlayerOverlay, MagicPlayerTimeline, usePlayerApi, };
12
+ export type * from './src/types/index';
@@ -1,7 +1,7 @@
1
1
  import MagicAudioPlayer from "./src/components/MagicAudioPlayer.vue";
2
2
  import MagicPlayer from "./src/components/MagicPlayer.vue";
3
3
  import MagicPlayerControls from "./src/components/MagicPlayerControls.vue";
4
- import MagicPlayerCurrentTime from "./src/components/MagicPlayerCurrentTime.vue";
4
+ import MagicPlayerDisplayTime from "./src/components/MagicPlayerDisplayTime.vue";
5
5
  import MagicPlayerMuxPopover from "./src/components/MagicPlayerMuxPopover.vue";
6
6
  import MagicPlayerOverlay from "./src/components/MagicPlayerOverlay.vue";
7
7
  import MagicPlayerPoster from "./src/components/MagicPlayerPoster.vue";
@@ -12,7 +12,7 @@ const MagicPlayerPlugin = {
12
12
  app.component("MagicAudioPlayer", MagicAudioPlayer);
13
13
  app.component("MagicPlayer", MagicPlayer);
14
14
  app.component("MagicPlayerControls", MagicPlayerControls);
15
- app.component("MagicPlayerCurrentTime", MagicPlayerCurrentTime);
15
+ app.component("MagicPlayerDisplayTime", MagicPlayerDisplayTime);
16
16
  app.component("MagicPlayerMuxPopover", MagicPlayerMuxPopover);
17
17
  app.component("MagicPlayerOverlay", MagicPlayerOverlay);
18
18
  app.component("MagicPlayerPoster", MagicPlayerPoster);
@@ -23,6 +23,7 @@ export {
23
23
  MagicPlayerPlugin,
24
24
  MagicPlayer,
25
25
  MagicPlayerControls,
26
+ MagicPlayerDisplayTime,
26
27
  MagicPlayerMuxPopover,
27
28
  MagicPlayerPoster,
28
29
  MagicPlayerOverlay,
@@ -81,5 +81,5 @@ onBeforeUnmount(() => {
81
81
  </script>
82
82
 
83
83
  <style>
84
- :root{--magic-audio-player-color:#fff;--magic-audio-player-background:rgba(32,32,32,.8);--magic-audio-player-background-slot:hsla(0,0%,98%,.15);--magic-audio-player-backdrop-filter:blur(80px);--magic-audio-player-border-radius:1.25rem;--magic-audio-player-padding:0.25rem;--magic-audio-player-gap:0.25rem;--magic-audio-player-slot-padding:0.75rem 1rem;--magic-audio-player-slot-radius:calc(var(--magic-audio-player-border-radius) - var(--magic-audio-player-padding));--magic-audio-player-slot-background:rgba(32,32,32,.8)}.magic-audio-player{-webkit-backdrop-filter:var(--magic-audio-player-backdrop-filter);backdrop-filter:var(--magic-audio-player-backdrop-filter);background:var(--magic-audio-player-background);border-radius:var(--magic-audio-player-border-radius);color:var(--magic-audio-player-color);padding:var(--magic-audio-player-padding);position:relative;width:100%}.magic-audio-player.-slot{background:var(--magic-audio-player-background-slot)}.magic-audio-player__container{display:flex;flex-direction:column;gap:var(--magic-audio-player-gap);height:100%;position:relative;width:100%}.magic-audio-player__slot{background-color:var(--magic-audio-player-background);border-radius:var(--magic-audio-player-slot-radius);color:inherit;padding:var(--magic-audio-player-slot-padding)}.magic-audio-player__audio{width:100%}
84
+ :root{--magic-audio-player-color:#fff;--magic-audio-player-background:rgba(32,32,32,.8);--magic-audio-player-background-slot:hsla(0,0%,98%,.15);--magic-audio-player-backdrop-filter:blur(80px);--magic-audio-player-border-radius:1.25rem;--magic-audio-player-padding:0.25rem;--magic-audio-player-gap:0.25rem;--magic-audio-player-slot-padding:0.75rem 1rem;--magic-audio-player-slot-radius:calc(var(--magic-audio-player-border-radius) - var(--magic-audio-player-padding));--magic-audio-player-slot-background:rgba(32,32,32,.8)}.magic-audio-player{-webkit-backdrop-filter:var(--magic-audio-player-backdrop-filter);backdrop-filter:var(--magic-audio-player-backdrop-filter);background:var(--magic-audio-player-background);border-radius:var(--magic-audio-player-border-radius);color:var(--magic-audio-player-color);container-type:inline-size;padding:var(--magic-audio-player-padding);position:relative;width:100%}.magic-audio-player.-slot{background:var(--magic-audio-player-background-slot)}.magic-audio-player__container{display:flex;flex-direction:column;gap:var(--magic-audio-player-gap);height:100%;position:relative;width:100%}.magic-audio-player__slot{background-color:var(--magic-audio-player-background);border-radius:var(--magic-audio-player-slot-radius);color:inherit;padding:var(--magic-audio-player-slot-padding)}.magic-audio-player__audio{width:100%}
85
85
  </style>
@@ -15,7 +15,10 @@
15
15
  >
16
16
  <div class="magic-audio-player-controls__bar">
17
17
  <div class="magic-audio-player-controls__bar--inner" ref="barRef">
18
- <div class="magic-audio-player-controls__item -shrink-0">
18
+ <div
19
+ class="magic-audio-player-controls__item -shrink-0"
20
+ data-slot="play-toggle"
21
+ >
19
22
  <button v-if="!playing" @click="play">
20
23
  <slot name="playIcon">
21
24
  <icon-play />
@@ -27,25 +30,25 @@
27
30
  </slot>
28
31
  </button>
29
32
  </div>
30
- <div class="magic-audio-player-controls__item -shrink-0">
31
- <magic-player-current-time :id="id" />
33
+ <div
34
+ class="magic-audio-player-controls__item -shrink-0"
35
+ data-slot="display-time-current"
36
+ >
37
+ <magic-player-display-time :id="id" type="current" />
32
38
  </div>
33
- <div class="magic-audio-player-controls__item -grow">
39
+ <div
40
+ class="magic-audio-player-controls__item -grow"
41
+ data-slot="timeline"
42
+ >
34
43
  <div class="magic-audio-player-controls__timeline" ref="trackRef">
35
44
  <magic-player-timeline :id="id" />
36
45
  </div>
37
46
  </div>
38
- <div class="magic-audio-player-controls__item -shrink-0">
39
- <button v-if="muted" @click="unmute">
40
- <slot name="volumeOffIcon">
41
- <icon-volume-off />
42
- </slot>
43
- </button>
44
- <button v-else @click="mute">
45
- <slot name="volumeOnIcon">
46
- <icon-volume-on />
47
- </slot>
48
- </button>
47
+ <div
48
+ class="magic-audio-player-controls__item -shrink-0"
49
+ data-slot="display-time-duration"
50
+ >
51
+ <magic-player-display-time :id="id" type="duration" />
49
52
  </div>
50
53
  </div>
51
54
  </div>
@@ -55,13 +58,11 @@
55
58
  <script setup lang="ts">
56
59
  import { ref } from 'vue'
57
60
  import { useIdle } from '@vueuse/core'
58
- import IconPlay from './icons/Play.vue'
59
- import IconPause from './icons/Pause.vue'
60
- import IconVolumeOn from './icons/VolumeOn.vue'
61
- import IconVolumeOff from './icons/VolumeOff.vue'
62
61
  import { usePlayerMediaApi } from '../composables/private/usePlayerMediaApi'
63
62
  import { usePlayerAudioApi } from '../composables/private/usePlayerAudioApi'
64
63
  import { usePlayerControlsApi } from '../composables/private/usePlayerControlsApi'
64
+ import IconPlay from './icons/Play.vue'
65
+ import IconPause from './icons/Pause.vue'
65
66
 
66
67
  interface Props {
67
68
  id: string
@@ -72,11 +73,11 @@ const props = defineProps<Props>()
72
73
  const barRef = ref<HTMLDivElement | undefined>(undefined)
73
74
  const trackRef = ref<HTMLDivElement | undefined>(undefined)
74
75
 
75
- const { playing, waiting, muted } = usePlayerMediaApi({
76
+ const { playing, waiting } = usePlayerMediaApi({
76
77
  id: props.id,
77
78
  })
78
79
 
79
- const { play, pause, mute, unmute, touched, mouseEntered } = usePlayerAudioApi({
80
+ const { play, pause, touched, mouseEntered } = usePlayerAudioApi({
80
81
  id: props.id,
81
82
  })
82
83
 
@@ -90,5 +91,5 @@ const { idle } = useIdle(3000)
90
91
  </script>
91
92
 
92
93
  <style>
93
- :root{--magic-audio-player-controls-height:3rem;--magic-audio-player-controls-padding:0rem;--magic-audio-player-controls-color:inherit;--magic-audio-player-controls-icon-width:1.25rem;--magic-audio-player-controls-button-width:4rem}.magic-audio-player-controls{pointer-events:none;width:100%}.magic-audio-player-controls__bar{align-items:flex-start;display:flex;flex-direction:column;margin:0 auto;pointer-events:auto;width:100%}.magic-audio-player-controls__bar--inner{align-items:center;box-sizing:border-box;color:var(--magic-audio-player-controls-color);display:flex;height:var(--magic-audio-player-controls-height);padding:0 var(--magic-audio-player-controls-padding);width:100%}.magic-audio-player-controls__item{align-items:center;display:inline-flex;-webkit-user-select:none;-moz-user-select:none;user-select:none}.magic-audio-player-controls__item.-shrink-0{flex-shrink:0}.magic-audio-player-controls__item.-grow{flex-grow:1}.magic-audio-player-controls__item button{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0;border-radius:0;color:inherit;cursor:pointer;display:flex;height:var(--magic-audio-player-controls-height);justify-content:center;outline:none;padding:0;width:var(--magic-audio-player-controls-button-width)}.magic-audio-player-controls__item button svg{display:block;height:auto;width:var(--magic-audio-player-controls-icon-width)}.magic-audio-player-controls__timeline{width:100%}
94
+ :root{--magic-audio-player-controls-height:3rem;--magic-audio-player-controls-padding:0rem;--magic-audio-player-controls-color:inherit;--magic-audio-player-controls-icon-width:1.25rem;--magic-audio-player-controls-button-width:4rem}.magic-audio-player-controls{pointer-events:none;width:100%}.magic-audio-player-controls__bar{align-items:flex-start;display:flex;flex-direction:column;margin:0 auto;pointer-events:auto;width:100%}.magic-audio-player-controls__bar--inner{align-items:center;box-sizing:border-box;color:var(--magic-audio-player-controls-color);display:flex;height:var(--magic-audio-player-controls-height);padding:0 var(--magic-audio-player-controls-padding);width:100%}.magic-audio-player-controls__item{align-items:center;display:inline-flex;-webkit-user-select:none;-moz-user-select:none;user-select:none}.magic-audio-player-controls__item.-shrink-0{flex-shrink:0}.magic-audio-player-controls__item.-grow{flex-grow:1}.magic-audio-player-controls__item button{align-items:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0;border-radius:0;color:inherit;cursor:pointer;display:flex;height:var(--magic-audio-player-controls-height);justify-content:center;outline:none;padding:0;width:var(--magic-audio-player-controls-button-width)}.magic-audio-player-controls__item button svg{display:block;height:auto;width:var(--magic-audio-player-controls-icon-width)}.magic-audio-player-controls__timeline{width:100%}@container (max-width: 480px){.magic-audio-player-controls__item[data-slot=display-time-current]{display:none}}@container (max-width: 320px ){.magic-audio-player-controls__item[data-slot=display-time-duration]{display:none}.magic-audio-player-controls__item[data-slot=timeline]{padding-right:1rem}}@container (max-width: 240px){.magic-audio-player-controls__item[data-slot=timeline]{display:none}.magic-audio-player-controls__bar--inner{justify-content:center}}
94
95
  </style>
@@ -4,8 +4,6 @@ interface Props {
4
4
  declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__VLS_TypePropsToRuntimeProps<Props>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<Props>>>, {}, {}>, {
5
5
  playIcon?(_: {}): any;
6
6
  pauseIcon?(_: {}): any;
7
- volumeOffIcon?(_: {}): any;
8
- volumeOnIcon?(_: {}): any;
9
7
  }>;
10
8
  export default _default;
11
9
  type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
@@ -0,0 +1,41 @@
1
+ <template>
2
+ <div class="magic-player-time-display">
3
+ {{ stringifiedTime }}
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { computed } from 'vue'
9
+ import { usePlayerMediaApi } from '../composables/private/usePlayerMediaApi'
10
+ import { formatTime } from '@maas/vue-equipment/utils'
11
+
12
+ interface Props {
13
+ id: string
14
+ type: 'current' | 'remaining' | 'duration'
15
+ }
16
+
17
+ const props = withDefaults(defineProps<Props>(), {
18
+ type: 'current',
19
+ })
20
+
21
+ const { currentTime, remainingTime, duration } = usePlayerMediaApi({
22
+ id: props.id,
23
+ })
24
+
25
+ const stringifiedTime = computed(() => {
26
+ switch (props.type) {
27
+ case 'current':
28
+ return formatTime(currentTime.value, currentTime.value)
29
+ case 'remaining':
30
+ return `-${formatTime(remainingTime.value, remainingTime.value)}`
31
+ case 'duration':
32
+ return formatTime(duration.value, duration.value)
33
+ default:
34
+ return ''
35
+ }
36
+ })
37
+ </script>
38
+
39
+ <style>
40
+ :root{--magic-player-time-display-font-size:0.875rem;--magic-player-time-display-color:inherit;--magic-player-time-display-width:4rem;--magic-player-time-display-justify-content:center;--magic-player-time-display-font-variant-numeric:tabular-nums}.magic-player-time-display{align-items:center;color:var(--magic-player-time-display-color);display:flex;font-size:var(--magic-player-time-display-font-size);font-variant-numeric:var(--magic-player-time-display-font-variant-numeric);height:100%;justify-content:var(--magic-player-time-display-justify-content);width:var(--magic-player-time-display-width)}
41
+ </style>
@@ -0,0 +1,29 @@
1
+ interface Props {
2
+ id: string;
3
+ type: 'current' | 'remaining' | 'duration';
4
+ }
5
+ declare const _default: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<Props>, {
6
+ type: string;
7
+ }>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<Props>, {
8
+ type: string;
9
+ }>>>, {
10
+ type: "duration" | "current" | "remaining";
11
+ }, {}>;
12
+ export default _default;
13
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
14
+ type __VLS_TypePropsToRuntimeProps<T> = {
15
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
16
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
17
+ } : {
18
+ type: import('vue').PropType<T[K]>;
19
+ required: true;
20
+ };
21
+ };
22
+ type __VLS_WithDefaults<P, D> = {
23
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
24
+ default: D[K];
25
+ }> : P[K];
26
+ };
27
+ type __VLS_Prettify<T> = {
28
+ [K in keyof T]: T[K];
29
+ } & {};
@@ -5,6 +5,7 @@ export type UsePlayerMediaApiArgs = {
5
5
  };
6
6
  export declare function usePlayerMediaApi(args: UsePlayerMediaApiArgs): {
7
7
  currentTime: import("vue").Ref<number>;
8
+ remainingTime: import("vue").ComputedRef<number>;
8
9
  duration: import("vue").Ref<number>;
9
10
  seeking: import("vue").Ref<boolean>;
10
11
  volume: import("vue").Ref<number>;
@@ -1,4 +1,4 @@
1
- import { ref, watch, unref, toValue } from "vue";
1
+ import { ref, computed, watch, unref, toValue } from "vue";
2
2
  import { useEventListener, watchIgnorable } from "@vueuse/core";
3
3
  import { usePlayerStateEmitter } from "./usePlayerStateEmitter.mjs";
4
4
  export function usePlayerMediaApi(args) {
@@ -14,6 +14,7 @@ export function usePlayerMediaApi(args) {
14
14
  const buffered = ref([]);
15
15
  const muted = ref(false);
16
16
  const { mediaRef } = args;
17
+ const remainingTime = computed(() => duration.value - currentTime.value);
17
18
  function timeRangeToArray(timeRanges) {
18
19
  let ranges = [];
19
20
  for (let i = 0; i < timeRanges.length; ++i)
@@ -249,6 +250,7 @@ export function usePlayerMediaApi(args) {
249
250
  });
250
251
  return {
251
252
  currentTime,
253
+ remainingTime,
252
254
  duration,
253
255
  seeking,
254
256
  volume,
@@ -5,6 +5,7 @@ type usePlayerApiArgs = {
5
5
  export declare function usePlayerApi(args: usePlayerApiArgs): {
6
6
  mediaApi: {
7
7
  currentTime: import("vue").Ref<number>;
8
+ remainingTime: import("vue").ComputedRef<number>;
8
9
  duration: import("vue").Ref<number>;
9
10
  seeking: import("vue").Ref<boolean>;
10
11
  volume: import("vue").Ref<number>;
@@ -1,5 +1,7 @@
1
1
  declare function clampValue(value: number, min: number, max: number): number;
2
2
 
3
+ declare function formatTime(seconds: number, guide: number): string;
4
+
3
5
  type InterpolateArgs = {
4
6
  from: number;
5
7
  to: number;
@@ -16,10 +18,6 @@ declare function mapValue(value: number, inMin: number, inMax: number, outMin: n
16
18
 
17
19
  declare function matchClass(el: Element, regex: RegExp): boolean;
18
20
 
19
- declare function uuid(): string;
20
-
21
- declare function uniq<T extends any[]>(a: T): any[];
22
-
23
21
  interface SlugifyOptions {
24
22
  separator?: string;
25
23
  trim?: boolean;
@@ -29,6 +27,10 @@ interface SlugifyOptions {
29
27
  }
30
28
  declare function slugify(string: string, options?: SlugifyOptions): string;
31
29
 
30
+ declare function uuid(): string;
31
+
32
+ declare function uniq<T extends any[]>(a: T): any[];
33
+
32
34
  type PickPartial<T, K extends keyof T> = {
33
35
  [P in K]: Partial<T[P]>;
34
36
  };
@@ -41,4 +43,4 @@ type RequireAllNested<T> = {
41
43
  [P in keyof T]-?: RequireAllNested<T[P]>;
42
44
  };
43
45
 
44
- export { type InterpolateArgs, type PickPartial, type RequireAll, type RequireAllNested, type SlugifyOptions, clampValue, interpolate, isIOS, mapValue, matchClass, slugify, uniq, uuid };
46
+ export { type InterpolateArgs, type PickPartial, type RequireAll, type RequireAllNested, type SlugifyOptions, clampValue, formatTime, interpolate, isIOS, mapValue, matchClass, slugify, uniq, uuid };
@@ -1,5 +1,7 @@
1
1
  declare function clampValue(value: number, min: number, max: number): number;
2
2
 
3
+ declare function formatTime(seconds: number, guide: number): string;
4
+
3
5
  type InterpolateArgs = {
4
6
  from: number;
5
7
  to: number;
@@ -16,10 +18,6 @@ declare function mapValue(value: number, inMin: number, inMax: number, outMin: n
16
18
 
17
19
  declare function matchClass(el: Element, regex: RegExp): boolean;
18
20
 
19
- declare function uuid(): string;
20
-
21
- declare function uniq<T extends any[]>(a: T): any[];
22
-
23
21
  interface SlugifyOptions {
24
22
  separator?: string;
25
23
  trim?: boolean;
@@ -29,6 +27,10 @@ interface SlugifyOptions {
29
27
  }
30
28
  declare function slugify(string: string, options?: SlugifyOptions): string;
31
29
 
30
+ declare function uuid(): string;
31
+
32
+ declare function uniq<T extends any[]>(a: T): any[];
33
+
32
34
  type PickPartial<T, K extends keyof T> = {
33
35
  [P in K]: Partial<T[P]>;
34
36
  };
@@ -41,4 +43,4 @@ type RequireAllNested<T> = {
41
43
  [P in keyof T]-?: RequireAllNested<T[P]>;
42
44
  };
43
45
 
44
- export { type InterpolateArgs, type PickPartial, type RequireAll, type RequireAllNested, type SlugifyOptions, clampValue, interpolate, isIOS, mapValue, matchClass, slugify, uniq, uuid };
46
+ export { type InterpolateArgs, type PickPartial, type RequireAll, type RequireAllNested, type SlugifyOptions, clampValue, formatTime, interpolate, isIOS, mapValue, matchClass, slugify, uniq, uuid };
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var utils_exports = {};
22
22
  __export(utils_exports, {
23
23
  clampValue: () => clampValue,
24
+ formatTime: () => formatTime,
24
25
  interpolate: () => interpolate,
25
26
  isIOS: () => isIOS,
26
27
  mapValue: () => mapValue,
@@ -36,6 +37,28 @@ function clampValue(value, min, max) {
36
37
  return value <= min ? min : value >= max ? max : value;
37
38
  }
38
39
 
40
+ // src/functions/toNumber.ts
41
+ function toNumber(value) {
42
+ return typeof value === "string" ? parseFloat(value) : Number(value);
43
+ }
44
+
45
+ // src/functions/formatTime.ts
46
+ function formatTime(seconds, guide) {
47
+ seconds = seconds < 0 ? 0 : seconds;
48
+ let s = Math.floor(seconds % 60);
49
+ let m = Math.floor(seconds / 60 % 60);
50
+ let h = Math.floor(seconds / 3600);
51
+ const gm = Math.floor(guide / 60 % 60);
52
+ const gh = Math.floor(guide / 3600);
53
+ if (isNaN(seconds) || seconds === Infinity) {
54
+ h = m = s = "-";
55
+ }
56
+ h = toNumber(h) > 0 || gh > 0 ? h + ":" : "";
57
+ m = ((h || gm >= 10) && toNumber(m) < 10 ? "0" + m : m) + ":";
58
+ s = toNumber(s) < 10 ? "0" + s : s;
59
+ return h + m + s;
60
+ }
61
+
39
62
  // src/functions/interpolate.ts
40
63
  function interpolate(args) {
41
64
  const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args;
@@ -71,19 +94,6 @@ function matchClass(el, regex) {
71
94
  return Array.from(el.classList).some((className) => regex.test(className));
72
95
  }
73
96
 
74
- // src/functions/uuid.ts
75
- function uuid() {
76
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("").reduce(
77
- (c, i) => c + (i === "x" ? Math.floor(Math.random() * 15).toString(16) : i === "y" ? Math.floor(Math.random() * 4 + 8).toString(16) : i),
78
- ""
79
- );
80
- }
81
-
82
- // src/functions/uniq.ts
83
- function uniq(a) {
84
- return Array.from(new Set(a));
85
- }
86
-
87
97
  // src/functions/slugify.ts
88
98
  var defaultOptions = {
89
99
  separator: "-",
@@ -120,9 +130,23 @@ function slugify(string, options) {
120
130
  }
121
131
  return slug;
122
132
  }
133
+
134
+ // src/functions/uuid.ts
135
+ function uuid() {
136
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("").reduce(
137
+ (c, i) => c + (i === "x" ? Math.floor(Math.random() * 15).toString(16) : i === "y" ? Math.floor(Math.random() * 4 + 8).toString(16) : i),
138
+ ""
139
+ );
140
+ }
141
+
142
+ // src/functions/uniq.ts
143
+ function uniq(a) {
144
+ return Array.from(new Set(a));
145
+ }
123
146
  // Annotate the CommonJS export names for ESM import in node:
124
147
  0 && (module.exports = {
125
148
  clampValue,
149
+ formatTime,
126
150
  interpolate,
127
151
  isIOS,
128
152
  mapValue,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/utils/index.ts","../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/matchClass.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export * from './src/functions/clampValue'\nexport * from './src/functions/interpolate'\nexport * from './src/functions/isIOS'\nexport * from './src/functions/mapValue'\nexport * from './src/functions/matchClass'\nexport * from './src/functions/uuid'\nexport * from './src/functions/uniq'\nexport * from './src/functions/slugify'\n\nexport type * from './src/types'\n","export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n\n function animate(timestamp: number) {\n if (!startTime) startTime = timestamp\n\n const progress = Math.min(1, (timestamp - startTime) / duration)\n const easedProgress = easing(progress)\n const value = from + (to - from) * easedProgress\n\n callback(value)\n\n if (progress < 1) {\n requestAnimationFrame(animate)\n }\n }\n\n requestAnimationFrame(animate)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","export function matchClass(el: Element, regex: RegExp) {\n return Array.from(el.classList).some((className) => regex.test(className))\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;ACOO,SAAS,YAAY,MAAuB;AACjD,QAAM,EAAE,MAAM,IAAI,UAAU,UAAU,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI;AAEtE,MAAI;AAEJ,WAAS,QAAQ,WAAmB;AAClC,QAAI,CAAC;AAAW,kBAAY;AAE5B,UAAM,WAAW,KAAK,IAAI,IAAI,YAAY,aAAa,QAAQ;AAC/D,UAAM,gBAAgB,OAAO,QAAQ;AACrC,UAAM,QAAQ,QAAQ,KAAK,QAAQ;AAEnC,aAAS,KAAK;AAEd,QAAI,WAAW,GAAG;AAChB,4BAAsB,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,wBAAsB,OAAO;AAC/B;;;AC7BO,SAAS,QAAQ;AACtB,MAAI,OAAO,WAAW;AAAa,WAAO;AAC1C,SAAO,mBAAmB,KAAK,uCAAW,SAAS;AACrD;;;ACHO,SAAS,SACd,OACA,OACA,OACA,QACA,QACA;AACA,UAAS,QAAQ,UAAU,SAAS,WAAY,QAAQ,SAAS;AACnE;;;ACRO,SAAS,WAAW,IAAa,OAAe;AACrD,SAAO,MAAM,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,cAAc,MAAM,KAAK,SAAS,CAAC;AAC3E;;;ACEO,SAAS,OAAO;AACrB,SAAO,uCACJ,MAAM,EAAE,EACR;AAAA,IACC,CAAC,GAAG,MACF,KACC,MAAM,MACH,KAAK,MAAM,KAAK,OAAO,IAAI,EAAG,EAAE,SAAS,EAAE,IAC3C,MAAM,MACN,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,SAAS,EAAE,IAC7C;AAAA,IACN;AAAA,EACF;AACJ;;;ACjBO,SAAS,KAAsB,GAAM;AAC1C,SAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;AAC9B;;;ACMA,IAAM,iBAAiC;AAAA,EACrC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,SAAS,QAAQ,QAAgB,SAAkC;AACxE,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAGA,QAAM,WAAW,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAEjD,QAAM,UAAqC,CAAC;AAE5C,MAAI,OAAO,OACR,UAAU,EACV,MAAM,EAAE,EACR,OAAO,SAAU,QAAQ,IAAI;AAC5B,QAAI,aAAa,QAAQ,EAAE;AAC3B,QAAI,eAAe;AAAW,mBAAa;AAC3C,QAAI,gBAAe,qCAAU;AAAW,mBAAa;AACrD,WACE,SACA,WAAW,SAAQ,qCAAU,WAAU,4BAA4B,EAAE;AAAA,EAEzE,GAAG,EAAE;AAEP,MAAI,SAAS,QAAQ;AACnB,WAAO,KAAK,QAAQ,mBAAmB,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,QAAQ,OAAO,SAAS,SAAS;AAAA,EAC/C;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../packages/utils/index.ts","../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/toNumber.ts","../../packages/utils/src/functions/formatTime.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/matchClass.ts","../../packages/utils/src/functions/slugify.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts"],"sourcesContent":["export * from './src/functions/clampValue'\nexport * from './src/functions/formatTime'\nexport * from './src/functions/interpolate'\nexport * from './src/functions/isIOS'\nexport * from './src/functions/mapValue'\nexport * from './src/functions/matchClass'\nexport * from './src/functions/slugify'\nexport * from './src/functions/uuid'\nexport * from './src/functions/uniq'\n\nexport type * from './src/types'\n","export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export 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 interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n\n function animate(timestamp: number) {\n if (!startTime) startTime = timestamp\n\n const progress = Math.min(1, (timestamp - startTime) / duration)\n const easedProgress = easing(progress)\n const value = from + (to - from) * easedProgress\n\n callback(value)\n\n if (progress < 1) {\n requestAnimationFrame(animate)\n }\n }\n\n requestAnimationFrame(animate)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","export function matchClass(el: Element, regex: RegExp) {\n return Array.from(el.classList).some((className) => regex.test(className))\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","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n"],"mappings":"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","names":[]}
@@ -3,6 +3,28 @@ function clampValue(value, min, max) {
3
3
  return value <= min ? min : value >= max ? max : value;
4
4
  }
5
5
 
6
+ // src/functions/toNumber.ts
7
+ function toNumber(value) {
8
+ return typeof value === "string" ? parseFloat(value) : Number(value);
9
+ }
10
+
11
+ // src/functions/formatTime.ts
12
+ function formatTime(seconds, guide) {
13
+ seconds = seconds < 0 ? 0 : seconds;
14
+ let s = Math.floor(seconds % 60);
15
+ let m = Math.floor(seconds / 60 % 60);
16
+ let h = Math.floor(seconds / 3600);
17
+ const gm = Math.floor(guide / 60 % 60);
18
+ const gh = Math.floor(guide / 3600);
19
+ if (isNaN(seconds) || seconds === Infinity) {
20
+ h = m = s = "-";
21
+ }
22
+ h = toNumber(h) > 0 || gh > 0 ? h + ":" : "";
23
+ m = ((h || gm >= 10) && toNumber(m) < 10 ? "0" + m : m) + ":";
24
+ s = toNumber(s) < 10 ? "0" + s : s;
25
+ return h + m + s;
26
+ }
27
+
6
28
  // src/functions/interpolate.ts
7
29
  function interpolate(args) {
8
30
  const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args;
@@ -38,19 +60,6 @@ function matchClass(el, regex) {
38
60
  return Array.from(el.classList).some((className) => regex.test(className));
39
61
  }
40
62
 
41
- // src/functions/uuid.ts
42
- function uuid() {
43
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("").reduce(
44
- (c, i) => c + (i === "x" ? Math.floor(Math.random() * 15).toString(16) : i === "y" ? Math.floor(Math.random() * 4 + 8).toString(16) : i),
45
- ""
46
- );
47
- }
48
-
49
- // src/functions/uniq.ts
50
- function uniq(a) {
51
- return Array.from(new Set(a));
52
- }
53
-
54
63
  // src/functions/slugify.ts
55
64
  var defaultOptions = {
56
65
  separator: "-",
@@ -87,8 +96,22 @@ function slugify(string, options) {
87
96
  }
88
97
  return slug;
89
98
  }
99
+
100
+ // src/functions/uuid.ts
101
+ function uuid() {
102
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("").reduce(
103
+ (c, i) => c + (i === "x" ? Math.floor(Math.random() * 15).toString(16) : i === "y" ? Math.floor(Math.random() * 4 + 8).toString(16) : i),
104
+ ""
105
+ );
106
+ }
107
+
108
+ // src/functions/uniq.ts
109
+ function uniq(a) {
110
+ return Array.from(new Set(a));
111
+ }
90
112
  export {
91
113
  clampValue,
114
+ formatTime,
92
115
  interpolate,
93
116
  isIOS,
94
117
  mapValue,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/matchClass.ts","../../packages/utils/src/functions/uuid.ts","../../packages/utils/src/functions/uniq.ts","../../packages/utils/src/functions/slugify.ts"],"sourcesContent":["export function clampValue(value: number, min: number, max: number) {\n return value <= min ? min : value >= max ? max : value\n}\n","export type InterpolateArgs = {\n from: number\n to: number\n duration: number\n interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n\n function animate(timestamp: number) {\n if (!startTime) startTime = timestamp\n\n const progress = Math.min(1, (timestamp - startTime) / duration)\n const easedProgress = easing(progress)\n const value = from + (to - from) * easedProgress\n\n callback(value)\n\n if (progress < 1) {\n requestAnimationFrame(animate)\n }\n }\n\n requestAnimationFrame(animate)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","export function matchClass(el: Element, regex: RegExp) {\n return Array.from(el.classList).some((className) => regex.test(className))\n}\n","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n","export interface SlugifyOptions {\n separator?: string\n trim?: boolean\n remove?: RegExp\n strict?: boolean\n lowercase?: boolean\n}\n\nconst defaultOptions: SlugifyOptions = {\n separator: '-',\n trim: true,\n remove: undefined,\n strict: true,\n lowercase: true,\n}\n\nexport function slugify(string: string, options?: SlugifyOptions): string {\n if (typeof string !== 'string') {\n throw new Error('slugify: string argument expected')\n }\n\n // Merge provided options with default options\n const _options = { ...defaultOptions, ...options }\n\n const charMap: { [key: string]: string } = {}\n\n let slug = string\n .normalize()\n .split('')\n .reduce(function (result, ch) {\n let appendChar = charMap[ch]\n if (appendChar === undefined) appendChar = ch\n if (appendChar === _options?.separator) appendChar = ' '\n return (\n result +\n appendChar.replace(_options?.remove || /[^\\w\\s$*_+~.()'\"!\\-:@]+/g, '')\n )\n }, '')\n\n if (_options.strict) {\n slug = slug.replace(/[^A-Za-z0-9\\s]/g, '')\n }\n\n if (_options.trim) {\n slug = slug.trim()\n }\n\n if (_options.separator) {\n slug = slug.replace(/ +/g, _options.separator)\n }\n\n if (_options.lowercase) {\n slug = slug.toLocaleLowerCase()\n }\n\n return slug\n}\n"],"mappings":";AAAO,SAAS,WAAW,OAAe,KAAa,KAAa;AAClE,SAAO,SAAS,MAAM,MAAM,SAAS,MAAM,MAAM;AACnD;;;ACOO,SAAS,YAAY,MAAuB;AACjD,QAAM,EAAE,MAAM,IAAI,UAAU,UAAU,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI;AAEtE,MAAI;AAEJ,WAAS,QAAQ,WAAmB;AAClC,QAAI,CAAC;AAAW,kBAAY;AAE5B,UAAM,WAAW,KAAK,IAAI,IAAI,YAAY,aAAa,QAAQ;AAC/D,UAAM,gBAAgB,OAAO,QAAQ;AACrC,UAAM,QAAQ,QAAQ,KAAK,QAAQ;AAEnC,aAAS,KAAK;AAEd,QAAI,WAAW,GAAG;AAChB,4BAAsB,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,wBAAsB,OAAO;AAC/B;;;AC7BO,SAAS,QAAQ;AACtB,MAAI,OAAO,WAAW;AAAa,WAAO;AAC1C,SAAO,mBAAmB,KAAK,uCAAW,SAAS;AACrD;;;ACHO,SAAS,SACd,OACA,OACA,OACA,QACA,QACA;AACA,UAAS,QAAQ,UAAU,SAAS,WAAY,QAAQ,SAAS;AACnE;;;ACRO,SAAS,WAAW,IAAa,OAAe;AACrD,SAAO,MAAM,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,cAAc,MAAM,KAAK,SAAS,CAAC;AAC3E;;;ACEO,SAAS,OAAO;AACrB,SAAO,uCACJ,MAAM,EAAE,EACR;AAAA,IACC,CAAC,GAAG,MACF,KACC,MAAM,MACH,KAAK,MAAM,KAAK,OAAO,IAAI,EAAG,EAAE,SAAS,EAAE,IAC3C,MAAM,MACN,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,SAAS,EAAE,IAC7C;AAAA,IACN;AAAA,EACF;AACJ;;;ACjBO,SAAS,KAAsB,GAAM;AAC1C,SAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC;AAC9B;;;ACMA,IAAM,iBAAiC;AAAA,EACrC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,SAAS,QAAQ,QAAgB,SAAkC;AACxE,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAGA,QAAM,WAAW,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAEjD,QAAM,UAAqC,CAAC;AAE5C,MAAI,OAAO,OACR,UAAU,EACV,MAAM,EAAE,EACR,OAAO,SAAU,QAAQ,IAAI;AAC5B,QAAI,aAAa,QAAQ,EAAE;AAC3B,QAAI,eAAe;AAAW,mBAAa;AAC3C,QAAI,gBAAe,qCAAU;AAAW,mBAAa;AACrD,WACE,SACA,WAAW,SAAQ,qCAAU,WAAU,4BAA4B,EAAE;AAAA,EAEzE,GAAG,EAAE;AAEP,MAAI,SAAS,QAAQ;AACnB,WAAO,KAAK,QAAQ,mBAAmB,EAAE;AAAA,EAC3C;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,QAAQ,OAAO,SAAS,SAAS;AAAA,EAC/C;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../packages/utils/src/functions/clampValue.ts","../../packages/utils/src/functions/toNumber.ts","../../packages/utils/src/functions/formatTime.ts","../../packages/utils/src/functions/interpolate.ts","../../packages/utils/src/functions/isIOS.ts","../../packages/utils/src/functions/mapValue.ts","../../packages/utils/src/functions/matchClass.ts","../../packages/utils/src/functions/slugify.ts","../../packages/utils/src/functions/uuid.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","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 interval?: number\n easing?: (t: number) => number\n callback: (result: number) => void\n}\n\nexport function interpolate(args: InterpolateArgs) {\n const { from, to, duration, callback, easing = (t) => t * (2 - t) } = args\n\n let startTime: number\n\n function animate(timestamp: number) {\n if (!startTime) startTime = timestamp\n\n const progress = Math.min(1, (timestamp - startTime) / duration)\n const easedProgress = easing(progress)\n const value = from + (to - from) * easedProgress\n\n callback(value)\n\n if (progress < 1) {\n requestAnimationFrame(animate)\n }\n }\n\n requestAnimationFrame(animate)\n}\n","export function isIOS() {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator?.userAgent)\n}\n","export function mapValue(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number\n) {\n return ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n}\n","export function matchClass(el: Element, regex: RegExp) {\n return Array.from(el.classList).some((className) => regex.test(className))\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","// This implementation is meant for internal use only.\n// It is only used to generate a unique IDs for the `key` props.\n// It should not replace crypto.randomUUID() or window.crypto.randomUUID().\n\nexport function uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n .split('')\n .reduce(\n (c, i) =>\n c +\n (i === 'x'\n ? Math.floor(Math.random() * 0xf).toString(16)\n : i === 'y'\n ? Math.floor(Math.random() * 4 + 8).toString(16)\n : i),\n '',\n )\n}\n","export function uniq<T extends any[]>(a: T) {\n return Array.from(new Set(a))\n}\n"],"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": "A magic collection of Vue composables, plugins, components and directives",
4
- "version": "0.24.3",
4
+ "version": "0.24.5",
5
5
  "author": "Robin Scholz <https://github.com/robinscholz>, Christoph Jeworutzki <https://github.com/ChristophJeworutzki>",
6
6
  "devDependencies": {
7
7
  "@antfu/ni": "^0.21.12",
@@ -1,58 +0,0 @@
1
- <template>
2
- <div class="magic-player-current-time">
3
- {{ stringifiedTime }}
4
- </div>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { computed } from 'vue'
9
- import { usePlayerMediaApi } from '../composables/private/usePlayerMediaApi'
10
-
11
- interface Props {
12
- id: string
13
- }
14
-
15
- const props = defineProps<Props>()
16
-
17
- const { currentTime } = usePlayerMediaApi({
18
- id: props.id,
19
- })
20
-
21
- function toNumber(value: string | number): number {
22
- return typeof value === 'string' ? parseFloat(value) : Number(value)
23
- }
24
-
25
- const formatTime = function (seconds: number, guide: number) {
26
- seconds = seconds < 0 ? 0 : seconds
27
- let s: string | number = Math.floor(seconds % 60)
28
- let m: string | number = Math.floor((seconds / 60) % 60)
29
- let h: string | number = Math.floor(seconds / 3600)
30
- const gm = Math.floor((guide / 60) % 60)
31
- const gh = Math.floor(guide / 3600)
32
-
33
- // handle invalid times
34
- if (isNaN(seconds) || seconds === Infinity) {
35
- // '-' is false for all relational operators (e.g. <, >=) so this setting
36
- // will add the minimum number of fields specified by the guide
37
- h = m = s = '-'
38
- }
39
-
40
- // Check if we need to show hours
41
- h = toNumber(h) > 0 || gh > 0 ? h + ':' : ''
42
-
43
- // If hours are showing, we may need to add a leading zero.
44
- // Always show at least one digit of minutes.
45
- m = ((h || gm >= 10) && toNumber(m) < 10 ? '0' + m : m) + ':'
46
-
47
- // Check if leading zero is need for seconds
48
- s = toNumber(s) < 10 ? '0' + s : s
49
-
50
- return h + m + s
51
- }
52
-
53
- const stringifiedTime = computed(() => formatTime(currentTime.value, 60))
54
- </script>
55
-
56
- <style>
57
- :root{--magic-player-current-time-font-size:0.875rem;--magic-player-current-time-color:inherit;--magic-player-current-time-width:3.25rem;--magic-player-current-time-justify-content:flex-start}.magic-player-current-time{align-items:center;color:var(--magic-player-current-time-color);display:flex;font-size:var(--magic-player-current-time-font-size);height:100%;justify-content:var(--magic-player-current-time-justify-content);width:var(--magic-player-current-time-width)}
58
- </style>
@@ -1,14 +0,0 @@
1
- interface Props {
2
- id: string;
3
- }
4
- declare const _default: import("vue").DefineComponent<__VLS_TypePropsToRuntimeProps<Props>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToRuntimeProps<Props>>>, {}, {}>;
5
- export default _default;
6
- type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
7
- type __VLS_TypePropsToRuntimeProps<T> = {
8
- [K in keyof T]-?: {} extends Pick<T, K> ? {
9
- type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
10
- } : {
11
- type: import('vue').PropType<T[K]>;
12
- required: true;
13
- };
14
- };