vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 14.8 kB
Source Map (JSON)
{"version":3,"file":"scrollbar.vue2.cjs","sources":["../../../components/scrollbar/scrollbar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n computed,\n getCurrentInstance,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n toRef,\n watch,\n watchEffect,\n} from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useManualRef, useRtl, useSetTimeout } from '@vexip-ui/hooks'\nimport { USE_TOUCH, boundRange, isDefined, throttle } from '@vexip-ui/utils'\nimport { scrollbarProps } from './props'\nimport { useTrack } from './hooks'\nimport { ScrollbarType, scrollbarPlacements } from './symbol'\n\ndefineOptions({ name: 'Scrollbar' })\n\nconst _props = defineProps(scrollbarProps)\nconst props = useProps('scrollbar', _props, {\n placement: {\n default: 'right',\n validator: value => scrollbarPlacements.includes(value),\n },\n scroll: {\n default: 0,\n validator: value => value >= 0 && value <= 100,\n static: true,\n },\n barLength: {\n default: 35,\n validator: value => value > 0 && value < 100,\n },\n width: null,\n appear: false,\n fade: 1500,\n barColor: null,\n trackColor: null,\n disabled: false,\n wrapper: null,\n duration: null,\n useTrack: false,\n trackSpeed: {\n default: 2,\n validator: value => value > 0 && value < 10,\n },\n})\n\nconst nh = useNameHelper('scrollbar')\nconst active = ref(false)\nconst scrolling = ref(false)\n\nconst { manualRef, triggerUpdate } = useManualRef()\n\nconst { isRtl } = useRtl()\n\nconst currentScroll = manualRef(props.scroll)\n\nconst container = ref<HTMLElement>()\nconst bar = ref<HTMLElement>()\nconst track = ref<HTMLElement>()\n\nconst { timer } = useSetTimeout()\n\nconst type = computed(() => {\n return props.placement === 'right' || props.placement === 'left'\n ? ScrollbarType.VERTICAL\n : ScrollbarType.HORIZONTAL\n})\n\nconst { tracking, handleMouseDown: handleTrackMouseDown } = useTrack({\n currentScroll,\n track,\n bar,\n type,\n trackSpeed: toRef(props, 'trackSpeed'),\n barLength: toRef(props, 'barLength'),\n disabled: toRef(props, 'disabled'),\n onDown: scroll => {\n clearTimeout(timer.fade)\n emitEvent(props.onScrollStart, scroll)\n },\n // onMove: () => clearTimeout(timer.fade),\n onUp: scroll => {\n setScrollbarFade()\n triggerUpdate()\n emitEvent(props.onScrollEnd, scroll)\n },\n onScroll: scroll => {\n triggerUpdate()\n emitEvent(props.onScroll, scroll)\n },\n})\n\nconst className = computed(() => {\n return [\n nh.b(),\n nh.bs('vars'),\n nh.bm(props.placement),\n {\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('fade')]: props.fade,\n [nh.bm('scrolling')]: scrolling.value,\n [nh.bm('tracking')]: tracking.value,\n [nh.bm('active')]: active.value,\n [nh.bm('disabled')]: props.disabled,\n },\n ]\n})\nconst style = computed<Record<string, string>>(() => {\n return {\n [nh.cv('bar-bg-color')]: props.barColor,\n [nh.cv('track-bg-color')]: props.trackColor,\n [nh.cv('width')]: props.width ? `${props.width}px` : null!,\n }\n})\n\nwatch(\n () => props.scroll,\n value => {\n currentScroll.value = value\n triggerUpdate()\n },\n)\nwatchEffect(() => {\n if (!bar.value) return\n\n const position = `${((100 - props.barLength) * currentScroll.value) / props.barLength}%`\n const length = `${props.barLength}%`\n\n if (type.value === ScrollbarType.VERTICAL) {\n bar.value.style.height = length\n bar.value.style.transform = `translate3d(0, ${position}, 0)`\n } else {\n bar.value.style.width = length\n bar.value.style.transform = `translate3d(${isRtl.value ? '-' : ''}${position}, 0, 0)`\n }\n})\nwatchEffect(() => {\n if (!bar.value) return\n\n bar.value.style.transitionDuration =\n isDefined(props.duration) && props.duration >= 0 ? `${props.duration}ms` : ''\n})\n\nif (props.appear) {\n watch(currentScroll, () => {\n clearTimeout(timer.fade)\n active.value = true\n\n if (!scrolling.value && !tracking.value) {\n setScrollbarFade()\n }\n })\n}\n\nconst handleWrapperMouseMove = throttle(() => {\n clearTimeout(timer.fade)\n\n if (props.disabled) {\n active.value = false\n } else {\n active.value = true\n\n if (!scrolling.value && !tracking.value) {\n setScrollbarFade()\n }\n }\n})\n\nlet wrapperElement: HTMLElement | null\n\nonMounted(() => {\n let instance = getCurrentInstance()\n\n nextTick(() => {\n if (typeof props.wrapper === 'string') {\n wrapperElement = document.querySelector(props.wrapper)\n } else {\n wrapperElement = props.wrapper\n }\n\n if (!wrapperElement) {\n if (instance?.parent) {\n wrapperElement = instance.parent.proxy?.$el\n\n if (!wrapperElement) {\n wrapperElement = container.value?.parentElement ?? null\n }\n } else {\n wrapperElement = container.value?.parentElement ?? null\n }\n }\n\n if (wrapperElement && props.fade >= 300) {\n wrapperElement.addEventListener('mousemove', handleWrapperMouseMove)\n }\n\n instance = null\n\n if (!props.appear) {\n watch(currentScroll, () => {\n clearInterval(timer.fade)\n active.value = true\n setScrollbarFade()\n })\n }\n })\n})\n\nonBeforeUnmount(() => {\n if (wrapperElement) {\n wrapperElement.removeEventListener('mousemove', handleWrapperMouseMove)\n }\n\n wrapperElement = null\n clearTimeout(timer.fade)\n})\n\ndefineExpose({\n currentScroll,\n container,\n bar,\n track,\n handleScroll,\n})\n\nlet length: number\nlet startAt: number\nlet cursorAt: number\n\nfunction handleMouseDown(event: PointerEvent) {\n if (event.button !== 0 || props.disabled) {\n return false\n }\n\n event.stopPropagation()\n event.preventDefault()\n\n if (!track.value || !bar.value) return false\n\n document.addEventListener('pointermove', handleMouseMove)\n document.addEventListener('pointerup', handleMouseUp)\n\n const rect = track.value.getBoundingClientRect()\n const barRect = bar.value.getBoundingClientRect()\n\n if (type.value === ScrollbarType.VERTICAL) {\n length = rect.height\n startAt = barRect.top - rect.top\n cursorAt = event.clientY\n } else {\n length = rect.width\n startAt = isRtl.value ? barRect.right - rect.right : barRect.left - rect.left\n cursorAt = event.clientX\n }\n\n clearTimeout(timer.fade)\n\n scrolling.value = true\n emitEvent(props.onScrollStart, currentScroll.value)\n}\n\nfunction handleMouseMove(event: PointerEvent) {\n event.stopPropagation()\n\n if (!USE_TOUCH) {\n event.preventDefault()\n }\n\n let position: number\n\n if (type.value === ScrollbarType.VERTICAL) {\n position = startAt + event.clientY - cursorAt\n } else {\n position = isRtl.value\n ? -(startAt + event.clientX - cursorAt)\n : startAt + event.clientX - cursorAt\n }\n\n // position / length * 100 === (100 - barLength) * currentScroll / 100\n currentScroll.value = (position / length / (100 - props.barLength)) * 1e4\n\n verifyScroll()\n triggerUpdate()\n emitEvent(props.onScroll, currentScroll.value)\n}\n\nfunction handleMouseUp(event: PointerEvent) {\n event.preventDefault()\n\n document.removeEventListener('pointermove', handleMouseMove)\n document.removeEventListener('pointerup', handleMouseUp)\n\n setScrollbarFade()\n\n scrolling.value = false\n emitEvent(props.onScrollEnd, currentScroll.value)\n}\n\nfunction verifyScroll() {\n currentScroll.value = Math.max(0, Math.min(currentScroll.value, 100))\n}\n\nfunction setScrollbarFade() {\n if (props.fade >= 300) {\n timer.fade = setTimeout(() => {\n active.value = false\n }, props.fade)\n }\n}\n\nfunction handleScroll(scroll: number) {\n if (Math.abs(currentScroll.value - scroll) < 0.0001) return\n\n currentScroll.value = boundRange(scroll, 0, 100)\n triggerUpdate()\n}\n\nfunction disableEvent<E extends Event>(event: E) {\n if (event.cancelable) {\n event.stopPropagation()\n event.preventDefault()\n }\n}\n</script>\n\n<template>\n <div\n ref=\"container\"\n :class=\"className\"\n role=\"scrollbar\"\n :style=\"style\"\n >\n <div\n ref=\"track\"\n :class=\"[nh.be('track'), props.useTrack ? null : nh.bem('track', 'disabled')]\"\n @touchstart=\"disableEvent\"\n @pointerdown=\"handleTrackMouseDown\"\n ></div>\n <div\n ref=\"bar\"\n :class=\"nh.be('bar')\"\n @touchstart=\"disableEvent\"\n @pointerdown=\"handleMouseDown\"\n ></div>\n </div>\n</template>\n"],"names":["_props","__props","props","useProps","value","scrollbarPlacements","nh","useNameHelper","active","ref","scrolling","manualRef","triggerUpdate","useManualRef","isRtl","useRtl","currentScroll","container","bar","track","timer","useSetTimeout","type","computed","ScrollbarType","tracking","handleTrackMouseDown","useTrack","toRef","scroll","emitEvent","setScrollbarFade","className","style","watch","watchEffect","position","length","isDefined","handleWrapperMouseMove","throttle","wrapperElement","onMounted","instance","getCurrentInstance","nextTick","_a","_b","_c","onBeforeUnmount","__expose","handleScroll","startAt","cursorAt","handleMouseDown","event","handleMouseMove","handleMouseUp","rect","barRect","USE_TOUCH","verifyScroll","boundRange","disableEvent","_createElementBlock","_createElementVNode","_normalizeClass","_unref","_cache","args"],"mappings":"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"}