1 |
- {"version":3,"file":"scroll.mjs","names":["computed","onBeforeUnmount","onMounted","ref","shallowRef","watch","clamp","consoleWarn","propsFactory","makeScrollProps","scrollTarget","type","String","scrollThreshold","Number","default","useScroll","props","args","arguments","length","undefined","canScroll","previousScroll","previousScrollHeight","target","currentScroll","savedScroll","currentThreshold","isScrollActive","isScrollingUp","scrollRatio","value","onScroll","targetEl","pageYOffset","scrollTop","currentScrollHeight","Window","document","documentElement","scrollHeight","Math","abs","newTarget","querySelector","window","removeEventListener","addEventListener","passive","immediate"],"sources":["../../src/composables/scroll.ts"],"sourcesContent":["// Utilities\nimport {\n computed,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n watch,\n} from 'vue'\nimport { clamp, consoleWarn, propsFactory } from '@/util'\n\n// Types\nimport type { Ref } from 'vue'\n\nexport interface ScrollProps {\n scrollTarget?: string\n scrollThreshold?: string | number\n}\n\nexport interface ThresholdMetCallbackData {\n isScrollingUp: boolean\n currentThreshold: number\n savedScroll: Ref<number>\n}\n\n// Composables\nexport const makeScrollProps = propsFactory({\n scrollTarget: {\n type: String,\n },\n scrollThreshold: {\n type: [String, Number],\n default: 300,\n },\n}, 'scroll')\n\nexport interface ScrollArguments {\n canScroll?: Readonly<Ref<boolean>>\n}\n\nexport function useScroll (\n props: ScrollProps,\n args: ScrollArguments = {},\n) {\n const { canScroll } = args\n let previousScroll = 0\n let previousScrollHeight = 0\n const target = ref<Element | Window | null>(null)\n const currentScroll = shallowRef(0)\n const savedScroll = shallowRef(0)\n const currentThreshold = shallowRef(0)\n const isScrollActive = shallowRef(false)\n const isScrollingUp = shallowRef(false)\n\n const scrollThreshold = computed(() => {\n return Number(props.scrollThreshold)\n })\n\n /**\n * 1: at top\n * 0: at threshold\n */\n const scrollRatio = computed(() => {\n return clamp(((scrollThreshold.value - currentScroll.value) / scrollThreshold.value) || 0)\n })\n\n const onScroll = () => {\n const targetEl = target.value\n\n if (!targetEl || (canScroll && !canScroll.value)) return\n\n previousScroll = currentScroll.value\n currentScroll.value = ('window' in targetEl) ? targetEl.pageYOffset : targetEl.scrollTop\n\n const currentScrollHeight = targetEl instanceof Window ? document.documentElement.scrollHeight : targetEl.scrollHeight\n if (previousScrollHeight !== currentScrollHeight) {\n previousScrollHeight = currentScrollHeight\n return\n }\n\n isScrollingUp.value = currentScroll.value < previousScroll\n currentThreshold.value = Math.abs(currentScroll.value - scrollThreshold.value)\n }\n\n watch(isScrollingUp, () => {\n savedScroll.value = savedScroll.value || currentScroll.value\n })\n\n watch(isScrollActive, () => {\n savedScroll.value = 0\n })\n\n onMounted(() => {\n watch(() => props.scrollTarget, scrollTarget => {\n const newTarget = scrollTarget ? document.querySelector(scrollTarget) : window\n\n if (!newTarget) {\n consoleWarn(`Unable to locate element with identifier ${scrollTarget}`)\n return\n }\n\n if (newTarget === target.value) return\n\n target.value?.removeEventListener('scroll', onScroll)\n target.value = newTarget\n target.value.addEventListener('scroll', onScroll, { passive: true })\n }, { immediate: true })\n })\n\n onBeforeUnmount(() => {\n target.value?.removeEventListener('scroll', onScroll)\n })\n\n // Do we need this? If yes - seems that\n // there's no need to expose onScroll\n canScroll && watch(canScroll, onScroll, { immediate: true })\n\n return {\n scrollThreshold,\n currentScroll,\n currentThreshold,\n isScrollActive,\n scrollRatio,\n\n // required only for testing\n // probably can be removed\n // later (2 chars chlng)\n isScrollingUp,\n savedScroll,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|