@maas/vue-equipment 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/composables/index.d.mts +87 -0
- package/dist/composables/index.d.ts +87 -0
- package/dist/composables/index.js +2 -0
- package/dist/composables/index.js.map +1 -0
- package/dist/composables/index.mjs +2 -0
- package/dist/composables/index.mjs.map +1 -0
- package/dist/nuxt/module.cjs +5 -0
- package/dist/nuxt/module.d.ts +11 -0
- package/dist/nuxt/module.json +5 -0
- package/dist/nuxt/module.mjs +123 -0
- package/dist/nuxt/types.d.ts +15 -0
- package/dist/plugins/MagicModal/index.d.ts +4 -0
- package/dist/plugins/MagicModal/index.mjs +8 -0
- package/dist/plugins/MagicModal/nuxt.d.ts +2 -0
- package/dist/plugins/MagicModal/nuxt.mjs +5 -0
- package/dist/plugins/MagicModal/src/components/MagicModal.vue +254 -0
- package/dist/plugins/MagicModal/src/components/MagicModal.vue.d.ts +43 -0
- package/dist/plugins/MagicModal/src/composables/useModalApi.d.ts +18 -0
- package/dist/plugins/MagicModal/src/composables/useModalApi.mjs +74 -0
- package/dist/plugins/MagicModal/src/composables/useModalStore.d.ts +5 -0
- package/dist/plugins/MagicModal/src/composables/useModalStore.mjs +15 -0
- package/dist/plugins/MagicModal/src/store/modals.d.ts +4 -0
- package/dist/plugins/MagicModal/src/store/modals.mjs +9 -0
- package/dist/plugins/MagicModal/src/types/index.d.ts +15 -0
- package/dist/plugins/MagicModal/src/types/index.mjs +0 -0
- package/dist/plugins/MagicModal/src/utils/defaultOptions.d.ts +3 -0
- package/dist/plugins/MagicModal/src/utils/defaultOptions.mjs +15 -0
- package/dist/plugins/MagicPlayer/index.d.ts +7 -0
- package/dist/plugins/MagicPlayer/index.mjs +15 -0
- package/dist/plugins/MagicPlayer/nuxt.d.ts +2 -0
- package/dist/plugins/MagicPlayer/nuxt.mjs +5 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue +103 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue.d.ts +86 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue +262 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue.d.ts +25 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +132 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue.d.ts +12 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue +155 -0
- package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/components/icons/FullscreenEnter.vue +13 -0
- package/dist/plugins/MagicPlayer/src/components/icons/FullscreenEnter.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/components/icons/FullscreenExit.vue +14 -0
- package/dist/plugins/MagicPlayer/src/components/icons/FullscreenExit.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/components/icons/Pause.vue +14 -0
- package/dist/plugins/MagicPlayer/src/components/icons/Pause.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/components/icons/Play.vue +11 -0
- package/dist/plugins/MagicPlayer/src/components/icons/Play.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/components/icons/VolumeOff.vue +14 -0
- package/dist/plugins/MagicPlayer/src/components/icons/VolumeOff.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/components/icons/VolumeOn.vue +11 -0
- package/dist/plugins/MagicPlayer/src/components/icons/VolumeOn.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/components/icons/Waiting.vue +38 -0
- package/dist/plugins/MagicPlayer/src/components/icons/Waiting.vue.d.ts +2 -0
- package/dist/plugins/MagicPlayer/src/composables/useControls.d.ts +8 -0
- package/dist/plugins/MagicPlayer/src/composables/useControls.mjs +15 -0
- package/dist/plugins/MagicPlayer/src/composables/useControlsApi.d.ts +17 -0
- package/dist/plugins/MagicPlayer/src/composables/useControlsApi.mjs +129 -0
- package/dist/plugins/MagicPlayer/src/composables/useMediaApi.d.ts +15 -0
- package/dist/plugins/MagicPlayer/src/composables/useMediaApi.mjs +122 -0
- package/dist/plugins/MagicPlayer/src/composables/usePlayer.d.ts +12 -0
- package/dist/plugins/MagicPlayer/src/composables/usePlayer.mjs +33 -0
- package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.d.ts +20 -0
- package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.mjs +50 -0
- package/dist/plugins/MagicPlayer/src/composables/useRuntimeSourceProvider.d.ts +8 -0
- package/dist/plugins/MagicPlayer/src/composables/useRuntimeSourceProvider.mjs +49 -0
- package/dist/plugins/MagicPlayer/src/types/index.d.ts +15 -0
- package/dist/plugins/MagicPlayer/src/types/index.mjs +1 -0
- package/dist/plugins/MagicPlayer/src/types/injectionKeys.d.ts +45 -0
- package/dist/plugins/MagicPlayer/src/types/injectionKeys.mjs +10 -0
- package/dist/plugins/MagicPlayer/src/utils/index.d.ts +4 -0
- package/dist/plugins/MagicPlayer/src/utils/index.mjs +19 -0
- package/dist/plugins/MagicScroll/index.d.ts +7 -0
- package/dist/plugins/MagicScroll/index.mjs +19 -0
- package/dist/plugins/MagicScroll/nuxt.d.ts +2 -0
- package/dist/plugins/MagicScroll/nuxt.mjs +5 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue +35 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue.d.ts +20 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue +34 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue.d.ts +21 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue +80 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue.d.ts +41 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue +42 -0
- package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue.d.ts +84 -0
- package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.d.ts +6 -0
- package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.mjs +116 -0
- package/dist/plugins/MagicScroll/src/composables/useEmitter.d.ts +15 -0
- package/dist/plugins/MagicScroll/src/composables/useEmitter.mjs +9 -0
- package/dist/plugins/MagicScroll/src/composables/useProgress.d.ts +7 -0
- package/dist/plugins/MagicScroll/src/composables/useProgress.mjs +59 -0
- package/dist/plugins/MagicScroll/src/store/index.d.ts +4 -0
- package/dist/plugins/MagicScroll/src/store/index.mjs +5 -0
- package/dist/plugins/MagicScroll/src/types/index.d.ts +34 -0
- package/dist/plugins/MagicScroll/src/types/index.mjs +1 -0
- package/dist/plugins/MagicScroll/src/types/injectionKeys.d.ts +12 -0
- package/dist/plugins/MagicScroll/src/types/injectionKeys.mjs +5 -0
- package/dist/plugins/MagicScroll/src/utils/index.d.ts +2 -0
- package/dist/plugins/MagicScroll/src/utils/index.mjs +6 -0
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.mjs +3 -0
- package/package.json +13 -13
|
@@ -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,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,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,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 };
|