Vulture/VApp/node_modules/vuetify/lib/components/VParallax/VParallax.mjs.map

1 line
7.4 KiB
Plaintext
Raw Normal View History

{"version":3,"file":"VParallax.mjs","names":["VImg","useDisplay","makeComponentProps","useIntersectionObserver","useResizeObserver","computed","onBeforeUnmount","ref","watch","watchEffect","clamp","genericComponent","getScrollParent","propsFactory","useRender","floor","val","Math","abs","sign","makeVParallaxProps","scale","type","Number","String","default","VParallax","name","props","setup","_ref","slots","intersectionRef","isIntersecting","resizeRef","contentRect","height","displayHeight","root","value","$el","scrollParent","document","scrollingElement","addEventListener","onScroll","passive","removeEventListener","frame","cancelAnimationFrame","requestAnimationFrame","el","querySelector","scrollHeight","Document","documentElement","clientHeight","scrollPos","window","scrollY","scrollTop","top","getBoundingClientRect","center","translate","sizeScale","max","style","setProperty","_createVNode","class"],"sources":["../../../src/components/VParallax/VParallax.tsx"],"sourcesContent":["// Styles\nimport './VParallax.sass'\n\n// Components\nimport { VImg } from '@/components/VImg'\n\n// Composables\nimport { useDisplay } from '@/composables'\nimport { makeComponentProps } from '@/composables/component'\nimport { useIntersectionObserver } from '@/composables/intersectionObserver'\nimport { useResizeObserver } from '@/composables/resizeObserver'\n\n// Utilities\nimport { computed, onBeforeUnmount, ref, watch, watchEffect } from 'vue'\nimport { clamp, genericComponent, getScrollParent, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { VImgSlots } from '@/components/VImg/VImg'\n\nfunction floor (val: number) {\n return Math.floor(Math.abs(val)) * Math.sign(val)\n}\n\nexport const makeVParallaxProps = propsFactory({\n scale: {\n type: [Number, String],\n default: 0.5,\n },\n\n ...makeComponentProps(),\n}, 'VParallax')\n\nexport const VParallax = genericComponent<VImgSlots>()({\n name: 'VParallax',\n\n props: makeVParallaxProps(),\n\n setup (props, { slots }) {\n const { intersectionRef, isIntersecting } = useIntersectionObserver()\n const { resizeRef, contentRect } = useResizeObserver()\n const { height: displayHeight } = useDisplay()\n\n const root = ref<VImg>()\n\n watchEffect(() => {\n intersectionRef.value = resizeRef.value = root.value?.$el\n })\n\n let scrollParent: Element | Document\n watch(isIntersecting, val => {\n if (val) {\n scrollParent = getScrollParent(intersectionRef.value)\n scrollParent = scrollParent === document.scrollingElement ? document : scrollParent\n scrollParent.addEventListener('scroll', onScroll, { passive: true })\n onScroll()\n } else {\n scrollParent.removeEventListener('scroll', onScroll)\n }\n })\n\n onBeforeUnmount(() => {\n scrollParent?.removeEventListener('scroll', onScroll)\n })\n\n watch(displayHeight, onScroll)\n watch(() => contentRect.value?.height, onScroll)\n\n const scale = computed(() => {\n return 1 - clamp(+props.scale)\n })\n\n let frame = -1\n function onScroll () {\n if (!isIntersecting.value) return\n\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n const el: HTMLElement | null = (root.value?.$el as Element).querySelector('.v-img__img')\n if (!el) return\n\n const scrollHeight = scrollParent instanceof Document ? document.documentElement.clientHeight : scrollParent.clientHeight\n const scrollPos = scrollParent instanceof Document ? window.scrollY : scrollParent.scrollTop\n const top = intersectionRef.value!.getBoundingClientRect().top + scrollPos\n const height = contentRect.value!.height\n\n const center = top + (height - scrollHeight) / 2\n const translate = floor((scrollPos - center) * scale.value)\n const sizeScale = Math.max(1, (scale.value * (scrollHeight - height) + height) / height)\n\n el.style.setProperty('transform', `translateY(${translate}px) scale(${sizeScale})`)\n })\n }\n\n useRender(() => (\n <V