@maas/vue-equipment 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/composables/index.d.mts +87 -0
  2. package/dist/composables/index.d.ts +87 -0
  3. package/dist/composables/index.js +284 -0
  4. package/dist/composables/index.js.map +1 -0
  5. package/dist/composables/index.mjs +254 -0
  6. package/dist/composables/index.mjs.map +1 -0
  7. package/dist/nuxt/module.cjs +5 -0
  8. package/dist/nuxt/module.d.ts +9 -0
  9. package/dist/nuxt/module.json +5 -0
  10. package/dist/nuxt/module.mjs +121 -0
  11. package/dist/nuxt/types.d.ts +15 -0
  12. package/dist/plugins/MagicModal/index.d.ts +4 -0
  13. package/dist/plugins/MagicModal/index.mjs +8 -0
  14. package/dist/plugins/MagicModal/nuxt.d.ts +2 -0
  15. package/dist/plugins/MagicModal/nuxt.mjs +5 -0
  16. package/dist/plugins/MagicModal/src/components/MagicModal.vue +254 -0
  17. package/dist/plugins/MagicModal/src/components/MagicModal.vue.d.ts +43 -0
  18. package/dist/plugins/MagicModal/src/composables/useModalApi.d.ts +18 -0
  19. package/dist/plugins/MagicModal/src/composables/useModalApi.mjs +74 -0
  20. package/dist/plugins/MagicModal/src/composables/useModalStore.d.ts +5 -0
  21. package/dist/plugins/MagicModal/src/composables/useModalStore.mjs +15 -0
  22. package/dist/plugins/MagicModal/src/store/modals.d.ts +4 -0
  23. package/dist/plugins/MagicModal/src/store/modals.mjs +9 -0
  24. package/dist/plugins/MagicModal/src/types/index.d.ts +15 -0
  25. package/dist/plugins/MagicModal/src/types/index.mjs +0 -0
  26. package/dist/plugins/MagicModal/src/utils/defaultOptions.d.ts +3 -0
  27. package/dist/plugins/MagicModal/src/utils/defaultOptions.mjs +15 -0
  28. package/dist/plugins/MagicPlayer/index.d.ts +7 -0
  29. package/dist/plugins/MagicPlayer/index.mjs +15 -0
  30. package/dist/plugins/MagicPlayer/nuxt.d.ts +2 -0
  31. package/dist/plugins/MagicPlayer/nuxt.mjs +5 -0
  32. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue +103 -0
  33. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue.d.ts +86 -0
  34. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue +262 -0
  35. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue.d.ts +25 -0
  36. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +132 -0
  37. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue.d.ts +12 -0
  38. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue +155 -0
  39. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue.d.ts +2 -0
  40. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenEnter.vue +13 -0
  41. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenEnter.vue.d.ts +2 -0
  42. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenExit.vue +14 -0
  43. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenExit.vue.d.ts +2 -0
  44. package/dist/plugins/MagicPlayer/src/components/icons/Pause.vue +14 -0
  45. package/dist/plugins/MagicPlayer/src/components/icons/Pause.vue.d.ts +2 -0
  46. package/dist/plugins/MagicPlayer/src/components/icons/Play.vue +11 -0
  47. package/dist/plugins/MagicPlayer/src/components/icons/Play.vue.d.ts +2 -0
  48. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOff.vue +14 -0
  49. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOff.vue.d.ts +2 -0
  50. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOn.vue +11 -0
  51. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOn.vue.d.ts +2 -0
  52. package/dist/plugins/MagicPlayer/src/components/icons/Waiting.vue +38 -0
  53. package/dist/plugins/MagicPlayer/src/components/icons/Waiting.vue.d.ts +2 -0
  54. package/dist/plugins/MagicPlayer/src/composables/useControls.d.ts +8 -0
  55. package/dist/plugins/MagicPlayer/src/composables/useControls.mjs +15 -0
  56. package/dist/plugins/MagicPlayer/src/composables/useControlsApi.d.ts +17 -0
  57. package/dist/plugins/MagicPlayer/src/composables/useControlsApi.mjs +129 -0
  58. package/dist/plugins/MagicPlayer/src/composables/useMediaApi.d.ts +15 -0
  59. package/dist/plugins/MagicPlayer/src/composables/useMediaApi.mjs +122 -0
  60. package/dist/plugins/MagicPlayer/src/composables/usePlayer.d.ts +12 -0
  61. package/dist/plugins/MagicPlayer/src/composables/usePlayer.mjs +33 -0
  62. package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.d.ts +20 -0
  63. package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.mjs +50 -0
  64. package/dist/plugins/MagicPlayer/src/composables/useRuntimeSourceProvider.d.ts +8 -0
  65. package/dist/plugins/MagicPlayer/src/composables/useRuntimeSourceProvider.mjs +49 -0
  66. package/dist/plugins/MagicPlayer/src/types/index.d.ts +15 -0
  67. package/dist/plugins/MagicPlayer/src/types/index.mjs +1 -0
  68. package/dist/plugins/MagicPlayer/src/types/injectionKeys.d.ts +45 -0
  69. package/dist/plugins/MagicPlayer/src/types/injectionKeys.mjs +10 -0
  70. package/dist/plugins/MagicPlayer/src/utils/index.d.ts +4 -0
  71. package/dist/plugins/MagicPlayer/src/utils/index.mjs +19 -0
  72. package/dist/plugins/MagicScroll/index.d.ts +7 -0
  73. package/dist/plugins/MagicScroll/index.mjs +19 -0
  74. package/dist/plugins/MagicScroll/nuxt.d.ts +2 -0
  75. package/dist/plugins/MagicScroll/nuxt.mjs +5 -0
  76. package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue +35 -0
  77. package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue.d.ts +20 -0
  78. package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue +34 -0
  79. package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue.d.ts +21 -0
  80. package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue +80 -0
  81. package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue.d.ts +41 -0
  82. package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue +42 -0
  83. package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue.d.ts +84 -0
  84. package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.d.ts +6 -0
  85. package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.mjs +116 -0
  86. package/dist/plugins/MagicScroll/src/composables/useEmitter.d.ts +15 -0
  87. package/dist/plugins/MagicScroll/src/composables/useEmitter.mjs +9 -0
  88. package/dist/plugins/MagicScroll/src/composables/useProgress.d.ts +7 -0
  89. package/dist/plugins/MagicScroll/src/composables/useProgress.mjs +59 -0
  90. package/dist/plugins/MagicScroll/src/store/index.d.ts +4 -0
  91. package/dist/plugins/MagicScroll/src/store/index.mjs +5 -0
  92. package/dist/plugins/MagicScroll/src/types/index.d.ts +34 -0
  93. package/dist/plugins/MagicScroll/src/types/index.mjs +1 -0
  94. package/dist/plugins/MagicScroll/src/types/injectionKeys.d.ts +12 -0
  95. package/dist/plugins/MagicScroll/src/types/injectionKeys.mjs +5 -0
  96. package/dist/plugins/MagicScroll/src/utils/index.d.ts +2 -0
  97. package/dist/plugins/MagicScroll/src/utils/index.mjs +6 -0
  98. package/dist/plugins/index.d.ts +3 -0
  99. package/dist/plugins/index.mjs +3 -0
  100. package/package.json +13 -16
@@ -0,0 +1,19 @@
1
+ import MagicScrollProvider from "./src/components/MagicScrollProvider.vue";
2
+ import MagicScrollScene from "./src/components/MagicScrollScene.vue";
3
+ import MagicScrollTransform from "./src/components/MagicScrollTransform.vue";
4
+ import MagicScrollCollision from "./src/components/MagicScrollCollision.vue";
5
+ import { magicScrollStore } from "./src/store/index.mjs";
6
+ import { useEmitter } from "./src/composables/useEmitter.mjs";
7
+ import { useProgress } from "./src/composables/useProgress.mjs";
8
+ import { useCollisionDetect } from "./src/composables/useCollisionDetect.mjs";
9
+ import { StoreKey } from "./src/types/index.mjs";
10
+ const MagicScroll = {
11
+ install: (app) => {
12
+ app.component("MagicScrollProvider", MagicScrollProvider);
13
+ app.component("MagicScrollScene", MagicScrollScene);
14
+ app.component("MagicScrollTransform", MagicScrollTransform);
15
+ app.component("MagicScrollCollision", MagicScrollCollision);
16
+ app.provide(StoreKey, magicScrollStore);
17
+ }
18
+ };
19
+ export { MagicScroll, useEmitter, useProgress, useCollisionDetect };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("nuxt/app").Plugin<Record<string, unknown>>;
2
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import { defineNuxtPlugin } from "nuxt/app";
2
+ import { MagicScroll } from "./index.mjs";
3
+ export default defineNuxtPlugin((nuxtApp) => {
4
+ nuxtApp.vueApp.use(MagicScroll);
5
+ });
@@ -0,0 +1,35 @@
1
+ <template>
2
+ <div ref="targetRef" :style="{ display: 'contents' }">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { ref, inject, computed, onMounted } from 'vue'
9
+ import { toValue } from '@vueuse/shared'
10
+ import { useCollisionDetect } from '../composables/useCollisionDetect'
11
+ import { WindowDimensionsKey, WindowScrollKey } from '../types'
12
+
13
+ import type { CollisionEntry } from '../types'
14
+
15
+ interface Props {
16
+ collisionEntries: CollisionEntry[]
17
+ }
18
+
19
+ const props = defineProps<Props>()
20
+ const targetRef = ref<HTMLElement | undefined>(undefined)
21
+ const colDetect = ref()
22
+
23
+ const scrollPosition = inject(WindowScrollKey, { x: 0, y: 0 })
24
+ const windowDimensions = inject(WindowDimensionsKey, { vh: 0, vw: 0 })
25
+ const pageYOffset = computed(() => scrollPosition.y)
26
+
27
+ onMounted(() => {
28
+ colDetect.value = useCollisionDetect(
29
+ pageYOffset,
30
+ windowDimensions,
31
+ props.collisionEntries,
32
+ toValue(targetRef.value)
33
+ )
34
+ })
35
+ </script>
@@ -0,0 +1,20 @@
1
+ import type { CollisionEntry } from '../types';
2
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
3
+ collisionEntries: {
4
+ type: import("vue").PropType<CollisionEntry[]>;
5
+ required: true;
6
+ };
7
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
8
+ collisionEntries: {
9
+ type: import("vue").PropType<CollisionEntry[]>;
10
+ required: true;
11
+ };
12
+ }>>, {}, {}>, {
13
+ default?(_: {}): any;
14
+ }>;
15
+ export default _default;
16
+ type __VLS_WithTemplateSlots<T, S> = T & {
17
+ new (): {
18
+ $slots: S;
19
+ };
20
+ };
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <div ref="el" class="magic-scroll-provider">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { ref, provide, reactive, readonly } from 'vue'
9
+ import { useWindowScroll, useWindowSize, toValue } from '@vueuse/core'
10
+ import { WindowScrollKey, WindowDimensionsKey } from '../types'
11
+
12
+ interface Props {
13
+ hasScrollListener?: Boolean
14
+ }
15
+ const props = withDefaults(defineProps<Props>(), {
16
+ hasScrollListener: () => true,
17
+ })
18
+
19
+ const el = ref()
20
+
21
+ const scrollPosition = props.hasScrollListener
22
+ ? useWindowScroll()
23
+ : { x: 0, y: 0 }
24
+ const { width, height } = useWindowSize()
25
+
26
+ const windowscrollDefault = reactive(scrollPosition)
27
+ const windowDimensionsDefault = reactive({
28
+ vw: toValue(width),
29
+ vh: toValue(height),
30
+ })
31
+
32
+ provide(WindowScrollKey, readonly(windowscrollDefault))
33
+ provide(WindowDimensionsKey, readonly(windowDimensionsDefault))
34
+ </script>
@@ -0,0 +1,21 @@
1
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
2
+ hasScrollListener: {
3
+ type: import("vue").PropType<Boolean>;
4
+ default: () => true;
5
+ };
6
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
7
+ hasScrollListener: {
8
+ type: import("vue").PropType<Boolean>;
9
+ default: () => true;
10
+ };
11
+ }>>, {
12
+ hasScrollListener: Boolean;
13
+ }, {}>, {
14
+ default?(_: {}): any;
15
+ }>;
16
+ export default _default;
17
+ type __VLS_WithTemplateSlots<T, S> = T & {
18
+ new (): {
19
+ $slots: S;
20
+ };
21
+ };
@@ -0,0 +1,80 @@
1
+ <template>
2
+ <div ref="sceneRef" class="magic-scroll-scene">
3
+ <slot :map-value="mapValue" :progress="progress" />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import {
9
+ ref,
10
+ provide,
11
+ inject,
12
+ computed,
13
+ onMounted,
14
+ watch,
15
+ nextTick,
16
+ toRaw,
17
+ readonly,
18
+ } from 'vue'
19
+ import { useIntersectionObserver } from '@vueuse/core'
20
+ import { mapValue } from '../utils'
21
+ import { useProgress } from '../composables/useProgress'
22
+ import { WindowScrollKey, ScrollProgressKey } from '../types'
23
+
24
+ import type { FromTo } from '../types'
25
+
26
+ interface Props {
27
+ from?: FromTo
28
+ to?: FromTo
29
+ debug?: boolean
30
+ }
31
+ const props = withDefaults(defineProps<Props>(), {
32
+ from: 'top-bottom',
33
+ to: 'bottom-top',
34
+ })
35
+
36
+ const scrollPosition = inject(WindowScrollKey, { x: 0, y: 0 })
37
+ const pageYOffset = computed(() => scrollPosition.y)
38
+
39
+ const sceneRef = ref<HTMLElement | undefined>(undefined)
40
+ const progress = ref(0)
41
+
42
+ const { getCalculations, getProgress } = useProgress(
43
+ sceneRef,
44
+ props.from,
45
+ props.to
46
+ )
47
+
48
+ const calculate = () => {
49
+ getCalculations()
50
+ nextTick(() => {
51
+ progress.value = getProgress()
52
+ })
53
+ }
54
+
55
+ onMounted(() => {
56
+ calculate()
57
+ })
58
+
59
+ watch(
60
+ () => pageYOffset.value,
61
+ () => {
62
+ if (intersecting.value) {
63
+ calculate()
64
+ }
65
+ }
66
+ )
67
+
68
+ const intersecting = ref()
69
+
70
+ useIntersectionObserver(
71
+ toRaw(sceneRef),
72
+ ([{ isIntersecting }]) => {
73
+ intersecting.value = isIntersecting
74
+ },
75
+ { rootMargin: '150% 0px 150% 0px' }
76
+ )
77
+
78
+ provide('mapValue', mapValue)
79
+ provide(ScrollProgressKey, readonly(progress))
80
+ </script>
@@ -0,0 +1,41 @@
1
+ import { mapValue } from '../utils';
2
+ import type { FromTo } from '../types';
3
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
4
+ to: {
5
+ type: import("vue").PropType<FromTo>;
6
+ default: string;
7
+ };
8
+ from: {
9
+ type: import("vue").PropType<FromTo>;
10
+ default: string;
11
+ };
12
+ debug: {
13
+ type: import("vue").PropType<boolean>;
14
+ };
15
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
16
+ to: {
17
+ type: import("vue").PropType<FromTo>;
18
+ default: string;
19
+ };
20
+ from: {
21
+ type: import("vue").PropType<FromTo>;
22
+ default: string;
23
+ };
24
+ debug: {
25
+ type: import("vue").PropType<boolean>;
26
+ };
27
+ }>>, {
28
+ to: FromTo;
29
+ from: FromTo;
30
+ }, {}>, {
31
+ default?(_: {
32
+ mapValue: typeof mapValue;
33
+ progress: number;
34
+ }): any;
35
+ }>;
36
+ export default _default;
37
+ type __VLS_WithTemplateSlots<T, S> = T & {
38
+ new (): {
39
+ $slots: S;
40
+ };
41
+ };
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <component :is="as" :style="computedStyle" v-bind="$attrs">
3
+ <slot />
4
+ </component>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { computed } from 'vue'
9
+
10
+ interface Props {
11
+ as?: string
12
+ scale?: number
13
+ scaleX?: number
14
+ scaleY?: number
15
+ skewX?: number
16
+ skewY?: number
17
+ translateX?: number
18
+ translateY?: number
19
+ }
20
+
21
+ const props = withDefaults(defineProps<Props>(), {
22
+ as: 'div',
23
+ scale: 1,
24
+ scaleX: 1,
25
+ scaleY: 1,
26
+ skewX: 0,
27
+ skewY: 0,
28
+ translateX: 0,
29
+ translateY: 0,
30
+ })
31
+
32
+ const computedStyle = computed(() => {
33
+ return {
34
+ willChange: 'transform',
35
+ transform: `matrix(${props.scale || props.scaleX}, ${props.skewY}, ${
36
+ props.skewX
37
+ }, ${props.scale || props.scaleY}, ${props.translateX}, ${
38
+ props.translateY
39
+ })`,
40
+ }
41
+ })
42
+ </script>
@@ -0,0 +1,84 @@
1
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
2
+ scale: {
3
+ type: import("vue").PropType<number>;
4
+ default: number;
5
+ };
6
+ as: {
7
+ type: import("vue").PropType<string>;
8
+ default: string;
9
+ };
10
+ scaleX: {
11
+ type: import("vue").PropType<number>;
12
+ default: number;
13
+ };
14
+ scaleY: {
15
+ type: import("vue").PropType<number>;
16
+ default: number;
17
+ };
18
+ skewX: {
19
+ type: import("vue").PropType<number>;
20
+ default: number;
21
+ };
22
+ skewY: {
23
+ type: import("vue").PropType<number>;
24
+ default: number;
25
+ };
26
+ translateX: {
27
+ type: import("vue").PropType<number>;
28
+ default: number;
29
+ };
30
+ translateY: {
31
+ type: import("vue").PropType<number>;
32
+ default: number;
33
+ };
34
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
35
+ scale: {
36
+ type: import("vue").PropType<number>;
37
+ default: number;
38
+ };
39
+ as: {
40
+ type: import("vue").PropType<string>;
41
+ default: string;
42
+ };
43
+ scaleX: {
44
+ type: import("vue").PropType<number>;
45
+ default: number;
46
+ };
47
+ scaleY: {
48
+ type: import("vue").PropType<number>;
49
+ default: number;
50
+ };
51
+ skewX: {
52
+ type: import("vue").PropType<number>;
53
+ default: number;
54
+ };
55
+ skewY: {
56
+ type: import("vue").PropType<number>;
57
+ default: number;
58
+ };
59
+ translateX: {
60
+ type: import("vue").PropType<number>;
61
+ default: number;
62
+ };
63
+ translateY: {
64
+ type: import("vue").PropType<number>;
65
+ default: number;
66
+ };
67
+ }>>, {
68
+ scale: number;
69
+ as: string;
70
+ scaleX: number;
71
+ scaleY: number;
72
+ skewX: number;
73
+ skewY: number;
74
+ translateX: number;
75
+ translateY: number;
76
+ }, {}>, {
77
+ default?(_: {}): any;
78
+ }>;
79
+ export default _default;
80
+ type __VLS_WithTemplateSlots<T, S> = T & {
81
+ new (): {
82
+ $slots: S;
83
+ };
84
+ };
@@ -0,0 +1,6 @@
1
+ import type { ComputedRef, Ref } from 'vue';
2
+ import type { CollisionEntry, CollisionMappedEntry, WindowDimensions } from '../types.js';
3
+ export declare function useCollisionDetect(pageYOffset: ComputedRef<number>, windowDimensions: WindowDimensions, collisionEntries: CollisionEntry[], parent: HTMLElement | undefined): {
4
+ collisionMappedEntries: Ref<CollisionMappedEntry[]>;
5
+ };
6
+ export type UseCollisionDetectReturn = ReturnType<typeof useCollisionDetect>;
@@ -0,0 +1,116 @@
1
+ import { ref, watch, unref, computed } from "vue";
2
+ import { useIntersectionObserver } from "@vueuse/core";
3
+ import { useEmitter } from "./useEmitter.mjs";
4
+ export function useCollisionDetect(pageYOffset, windowDimensions, collisionEntries, parent) {
5
+ const scrolled = ref(0);
6
+ const intersecting = ref();
7
+ const scrollDirection = ref();
8
+ const collisionMappedEntries = ref([]);
9
+ const oppositeScrollDirection = computed(
10
+ () => scrollDirection.value === "up" ? "down" : "up"
11
+ );
12
+ function getOffset(value) {
13
+ return typeof value === "function" ? value({
14
+ vh: unref(windowDimensions.vh),
15
+ vw: unref(windowDimensions.vw)
16
+ }) : value || 0;
17
+ }
18
+ function initialize() {
19
+ if (!parent)
20
+ return;
21
+ collisionMappedEntries.value = collisionEntries.map((entry) => {
22
+ const alerted = {
23
+ up: {
24
+ top: false,
25
+ bottom: false
26
+ },
27
+ down: {
28
+ top: false,
29
+ bottom: false
30
+ }
31
+ };
32
+ const offset = { top: 0, bottom: 0, ...entry.offset };
33
+ const element = entry.element ? parent?.querySelector(entry.element) : parent;
34
+ return { ...entry, offset, element, alerted };
35
+ });
36
+ useIntersectionObserver(
37
+ parent.querySelector("*"),
38
+ ([{ isIntersecting }]) => {
39
+ intersecting.value = isIntersecting;
40
+ },
41
+ { rootMargin: "50% 0px 50% 0px", threshold: 0.01 }
42
+ );
43
+ observeAll();
44
+ }
45
+ function observeAll() {
46
+ if (!scrolled.value) {
47
+ scrolled.value = pageYOffset.value;
48
+ resetAll();
49
+ return;
50
+ }
51
+ scrollDirection.value = scrolled.value <= pageYOffset.value ? "down" : "up";
52
+ scrolled.value = pageYOffset.value;
53
+ let i = collisionMappedEntries.value.length;
54
+ while (i--) {
55
+ const entry = collisionMappedEntries.value[i];
56
+ if (!entry.element)
57
+ return;
58
+ const boundingRect = entry.element.getBoundingClientRect();
59
+ if (scrollDirection.value) {
60
+ observeEntry("top", scrollDirection.value, boundingRect, entry);
61
+ observeEntry("bottom", scrollDirection.value, boundingRect, entry);
62
+ resetEntry("top", oppositeScrollDirection.value, boundingRect, entry);
63
+ resetEntry("bottom", oppositeScrollDirection.value, boundingRect, entry);
64
+ }
65
+ }
66
+ }
67
+ function resetAll() {
68
+ collisionMappedEntries.value = collisionMappedEntries.value.map((entry) => {
69
+ const alerted = {
70
+ up: {
71
+ top: false,
72
+ bottom: false
73
+ },
74
+ down: {
75
+ top: false,
76
+ bottom: false
77
+ }
78
+ };
79
+ return { ...entry, alerted };
80
+ });
81
+ }
82
+ function observeEntry(pos, dir, boundingRect, entry) {
83
+ const offset = getOffset(entry.offset[pos] || 0);
84
+ if (entry.alerted[dir][pos])
85
+ return;
86
+ if (dir === "down" && boundingRect[pos] <= offset || dir === "up" && boundingRect[pos] >= offset) {
87
+ entry.alerted[dir][pos] = true;
88
+ useEmitter().emit("magic-scroll:collision", {
89
+ dir,
90
+ pos,
91
+ el: entry.element,
92
+ data: entry.data
93
+ });
94
+ }
95
+ }
96
+ function resetEntry(pos, dir, boundingRect, entry) {
97
+ const offset = getOffset(entry.offset[pos] || 0);
98
+ if (!entry.alerted[dir][pos])
99
+ return;
100
+ if (dir === "down" && boundingRect[pos] >= offset || dir === "up" && boundingRect[pos] <= offset) {
101
+ entry.alerted[dir][pos] = false;
102
+ }
103
+ }
104
+ initialize();
105
+ watch(
106
+ () => pageYOffset.value,
107
+ () => {
108
+ if (intersecting.value) {
109
+ observeAll();
110
+ }
111
+ }
112
+ );
113
+ return {
114
+ collisionMappedEntries
115
+ };
116
+ }
@@ -0,0 +1,15 @@
1
+ import type { CollisionEvents } from '../types.js';
2
+ export declare function useEmitter(): {
3
+ on: {
4
+ <Key extends "magic-scroll:collision">(type: Key, handler: import("mitt").Handler<CollisionEvents[Key]>): void;
5
+ (type: "*", handler: import("mitt").WildcardHandler<CollisionEvents>): void;
6
+ };
7
+ off: {
8
+ <Key_1 extends "magic-scroll:collision">(type: Key_1, handler?: import("mitt").Handler<CollisionEvents[Key_1]> | undefined): void;
9
+ (type: "*", handler: import("mitt").WildcardHandler<CollisionEvents>): void;
10
+ };
11
+ emit: {
12
+ <Key_2 extends "magic-scroll:collision">(type: Key_2, event: CollisionEvents[Key_2]): void;
13
+ <Key_3 extends "magic-scroll:collision">(type: undefined extends CollisionEvents[Key_3] ? Key_3 : never): void;
14
+ };
15
+ };
@@ -0,0 +1,9 @@
1
+ import mitt from "mitt";
2
+ const emitter = mitt();
3
+ export function useEmitter() {
4
+ return {
5
+ on: emitter.on,
6
+ off: emitter.off,
7
+ emit: emitter.emit
8
+ };
9
+ }
@@ -0,0 +1,7 @@
1
+ import type { MaybeRef } from '@vueuse/shared';
2
+ import type { FromTo } from '../types.js';
3
+ export declare function useProgress(target: MaybeRef<HTMLElement | null | undefined>, from: FromTo, to: FromTo): {
4
+ getCalculations: () => void;
5
+ getProgress: () => number;
6
+ };
7
+ export type UseProgressReturn = ReturnType<typeof useProgress>;
@@ -0,0 +1,59 @@
1
+ import { ref, inject } from "vue";
2
+ import { toValue } from "@vueuse/shared";
3
+ import { WindowDimensionsKey, WindowScrollKey } from "../types/index.mjs";
4
+ import { clampValue } from "../utils/index.mjs";
5
+ export function useProgress(target, from, to) {
6
+ const dimensions = inject(WindowDimensionsKey, { vw: 0, vh: 0 });
7
+ const scrollPosition = inject(WindowScrollKey, { x: 0, y: 0 });
8
+ const targetRect = ref();
9
+ const start = ref(0);
10
+ const end = ref(0);
11
+ const splitLocation = (location) => {
12
+ return {
13
+ el: location.match(/^[a-z]+/)[0],
14
+ vp: location.match(/[a-z]+$/)[0]
15
+ };
16
+ };
17
+ const getOffsetTop = (points) => {
18
+ let y = 0;
19
+ if (!targetRect.value)
20
+ return y;
21
+ switch (points.el) {
22
+ case "top":
23
+ y += targetRect.value.top + scrollPosition.y;
24
+ break;
25
+ case "center":
26
+ y += targetRect.value.top + targetRect.value.height / 2 + scrollPosition.y;
27
+ break;
28
+ case "bottom":
29
+ y += targetRect.value.top + targetRect.value.height + scrollPosition.y;
30
+ break;
31
+ }
32
+ switch (points.vp) {
33
+ case "top":
34
+ y -= 0;
35
+ break;
36
+ case "center":
37
+ y -= dimensions.vh / 2;
38
+ break;
39
+ case "bottom":
40
+ y -= dimensions.vh;
41
+ break;
42
+ case "initial":
43
+ y -= targetRect.value.top + scrollPosition.y;
44
+ break;
45
+ }
46
+ return y;
47
+ };
48
+ const getCalculations = () => {
49
+ targetRect.value = toValue(target)?.getBoundingClientRect();
50
+ start.value = getOffsetTop(splitLocation(from));
51
+ end.value = getOffsetTop(splitLocation(to));
52
+ };
53
+ const getProgress = () => {
54
+ const total = Math.abs(end.value - start.value);
55
+ const current = scrollPosition.y - start.value;
56
+ return clampValue(current / total, 0, 1);
57
+ };
58
+ return { getCalculations, getProgress };
59
+ }
@@ -0,0 +1,4 @@
1
+ declare const magicScrollStore: {
2
+ isNavigating: boolean;
3
+ };
4
+ export { magicScrollStore };
@@ -0,0 +1,5 @@
1
+ import { reactive } from "vue";
2
+ const magicScrollStore = reactive({
3
+ isNavigating: false
4
+ });
5
+ export { magicScrollStore };
@@ -0,0 +1,34 @@
1
+ type AlertPositions = {
2
+ top: boolean;
3
+ bottom: boolean;
4
+ };
5
+ type CollisionEvents = {
6
+ 'magic-scroll:collision': {
7
+ dir: 'up' | 'down';
8
+ pos: 'top' | 'bottom';
9
+ el: HTMLElement;
10
+ data?: Record<string, any>;
11
+ };
12
+ };
13
+ interface CollisionEntry {
14
+ offset?: {
15
+ top: number | (() => number);
16
+ bottom: number | (() => number);
17
+ };
18
+ element?: string;
19
+ data: Record<string, any>;
20
+ }
21
+ interface CollisionMappedEntry extends Omit<CollisionEntry, 'element'> {
22
+ alerted: {
23
+ up: AlertPositions;
24
+ down: AlertPositions;
25
+ };
26
+ element: HTMLElement;
27
+ }
28
+ type WindowDimensions = {
29
+ vw: number;
30
+ vh: number;
31
+ };
32
+ type FromTo = 'top-top' | 'top-center' | 'top-bottom' | 'center-top' | 'center-center' | 'center-bottom' | 'bottom-top' | 'bottom-center' | 'bottom-bottom';
33
+ export * from './injectionKeys.js';
34
+ export type { FromTo, CollisionEvents, CollisionEntry, CollisionMappedEntry, WindowDimensions, };
@@ -0,0 +1 @@
1
+ export * from "./injectionKeys.mjs";
@@ -0,0 +1,12 @@
1
+ import type { InjectionKey, Ref } from 'vue';
2
+ import type { WindowDimensions } from './index.js';
3
+ declare const WindowDimensionsKey: InjectionKey<WindowDimensions>;
4
+ declare const WindowScrollKey: InjectionKey<{
5
+ x: number;
6
+ y: number;
7
+ }>;
8
+ declare const ScrollProgressKey: InjectionKey<Ref<number>>;
9
+ declare const StoreKey: InjectionKey<{
10
+ isNavigating: boolean;
11
+ }>;
12
+ export { WindowDimensionsKey, WindowScrollKey, ScrollProgressKey, StoreKey };