vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 33.5 kB
Source Map (JSON)
{"version":3,"file":"native-scroll.mjs","sources":["../../../components/native-scroll/native-scroll.tsx"],"sourcesContent":["import { Scrollbar } from '@/components/scrollbar'\nimport { ResizeObserver } from '@/components/resize-observer'\n\nimport {\n computed,\n defineComponent,\n nextTick,\n onBeforeUnmount,\n ref,\n renderSlot,\n shallowReadonly,\n toRef,\n watch,\n} from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { createSlotRender, flatVNodes, useRtl } from '@vexip-ui/hooks'\nimport { USE_TOUCH, createEventEmitter, isClient, isElement, isTrue } from '@vexip-ui/utils'\nimport { nativeScrollProps } from './props'\nimport { useScrollWrapper } from './hooks'\n\nimport type { EventHandler } from '@vexip-ui/utils'\nimport type { NativeScrollMode } from './symbol'\n\nconst scrollModes = Object.freeze<NativeScrollMode[]>(['horizontal', 'vertical', 'both'])\n\nconst MOVE_EVENT = 'mousemove'\nconst UP_EVENT = 'mouseup'\n\nexport default defineComponent({\n name: 'NativeScroll',\n inheritAttrs: false,\n props: nativeScrollProps,\n emits: [],\n setup(_props, { attrs, slots, expose }) {\n const props = useProps('nativeScroll', _props, {\n scrollClass: null,\n scrollStyle: null,\n scrollAttrs: null,\n mode: {\n default: 'vertical',\n validator: value => scrollModes.includes(value),\n },\n width: '',\n height: '',\n disabled: false,\n pointer: false,\n scrollX: {\n default: 0,\n static: true,\n },\n scrollY: {\n default: 0,\n static: true,\n },\n useXBar: false,\n useYBar: false,\n barFade: 1500,\n barClass: null,\n autoplay: false,\n playWaiting: 500,\n appear: false,\n barDuration: null,\n useBarTrack: false,\n scrollTag: 'div',\n observeDeep: false,\n scrollOnly: false,\n })\n\n const emitter = createEventEmitter()\n\n const nh = useNameHelper('native-scroll')\n const { isRtl } = useRtl()\n const usingBar = ref(false)\n const scrolling = ref(false)\n\n const wrapper = ref<HTMLElement>()\n const xBar = ref<InstanceType<typeof Scrollbar>>()\n const yBar = ref<InstanceType<typeof Scrollbar>>()\n\n let initialized = false\n\n const {\n contentEl,\n\n content,\n x,\n y,\n percentX,\n percentY,\n xScrollLimit,\n yScrollLimit,\n enableXScroll,\n enableYScroll,\n xBarLength,\n yBarLength,\n\n handleResize,\n setScrollX,\n setScrollY,\n computePercent,\n refresh,\n scrollTo,\n scrollBy,\n scrollToElement,\n triggerUpdate,\n } = useScrollWrapper({\n mode: toRef(props, 'mode'),\n disabled: toRef(props, 'disabled'),\n appear: toRef(props, 'appear'),\n // width: toRef(props, 'width'),\n // height: toRef(props, 'height'),\n scrollX: toRef(props, 'scrollX'),\n scrollY: toRef(props, 'scrollY'),\n onResize: entry => {\n emitEvent(props.onResize, entry)\n },\n // onBeforeRefresh: stopAutoplay,\n onAfterRefresh: () => {\n syncBarScroll()\n\n if (!initialized) {\n initialized = true\n startAutoplay()\n }\n },\n })\n\n const slotParams = shallowReadonly({\n getState,\n refresh,\n scrollTo,\n scrollBy,\n scrollToElement,\n ensureInView,\n })\n\n /* autoplay */\n const canPlay = ref(false)\n\n const canAutoplay = computed(() => {\n return (\n props.mode !== 'both' &&\n (isTrue(props.autoplay) || +props.autoplay > 1000) &&\n ((props.mode === 'horizontal' && enableXScroll.value) ||\n (props.mode === 'vertical' && enableYScroll.value))\n )\n })\n\n watch([() => props.autoplay, () => props.playWaiting, contentEl], () => {\n stopAutoplay()\n nextTick(startAutoplay)\n })\n\n let playTimer: ReturnType<typeof setTimeout>\n let startTimer: ReturnType<typeof setTimeout>\n let endTimer: ReturnType<typeof setTimeout>\n\n onBeforeUnmount(stopAutoplay)\n\n function startAutoplay() {\n stopAutoplay()\n\n if (!canAutoplay.value || !contentEl.value) return\n\n const mode = props.mode\n const distance = mode === 'horizontal' ? 'offsetWidth' : 'offsetHeight'\n const limit = mode === 'horizontal' ? xScrollLimit : yScrollLimit\n const prop = mode === 'horizontal' ? x : y\n const waiting = props.playWaiting < 20 ? 20 : props.playWaiting\n const setScroll = mode === 'horizontal' ? setScrollX : setScrollY\n\n let playSpeed = 0.5\n\n if (typeof props.autoplay === 'number') {\n playSpeed = (contentEl.value[distance] / props.autoplay) * 16\n }\n\n const scroll = () => {\n setScroll(prop.value + playSpeed)\n\n if (prop.value >= limit.value) {\n setScroll(limit.value)\n canPlay.value = false\n\n computePercent()\n triggerUpdate()\n syncBarScroll()\n\n endTimer = setTimeout(() => {\n scrollTo(0, 0, 500)\n\n startTimer = setTimeout(() => {\n canPlay.value = true\n scroll()\n }, 500 + waiting)\n }, waiting)\n } else {\n computePercent()\n triggerUpdate()\n syncBarScroll()\n\n if (canPlay.value) {\n requestAnimationFrame(scroll)\n }\n }\n }\n\n playTimer = setTimeout(() => {\n canPlay.value = true\n scroll()\n }, waiting)\n }\n\n function stopAutoplay() {\n canPlay.value = false\n\n clearTimeout(playTimer)\n clearTimeout(startTimer)\n clearTimeout(endTimer)\n }\n /* autoplay */\n\n const className = computed(() => {\n return [\n nh.b(),\n nh.bm(props.mode),\n {\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('scrolling')]: scrolling.value,\n [nh.bm('using-bar')]: usingBar.value,\n },\n ]\n })\n const style = computed(() => {\n const { width, height } = props\n\n return {\n width: width\n ? typeof width === 'string'\n ? Number.isNaN(Number(width))\n ? width\n : `${Number(width)}px`\n : `${width}px`\n : undefined,\n height: height\n ? typeof height === 'string'\n ? Number.isNaN(Number(height))\n ? height\n : `${Number(height)}px`\n : `${height}px`\n : undefined,\n }\n })\n const wrapperClass = computed(() => {\n return [props.scrollAttrs?.class, props.scrollClass, nh.be('wrapper')]\n })\n const barFade = computed(() => (canAutoplay.value ? 0 : props.barFade))\n\n const willMutate = ref(false)\n\n function handleMutate() {\n willMutate.value = true\n nextTick(refresh)\n requestAnimationFrame(() => {\n willMutate.value = false\n })\n }\n\n let observer: MutationObserver | undefined\n\n function createMutation() {\n if (!isClient || !contentEl.value) return\n\n observer = new MutationObserver(handleMutate)\n observer.observe(contentEl.value, {\n childList: true,\n })\n }\n\n function clearMutation() {\n observer?.disconnect()\n observer = undefined\n }\n\n watch(\n contentEl,\n () => {\n clearMutation()\n createMutation()\n },\n { immediate: true },\n )\n watch(enableXScroll, value => {\n emitEvent(props.onXEnabledChange, value)\n })\n watch(enableYScroll, value => {\n emitEvent(props.onYEnabledChange, value)\n })\n\n expose({\n x,\n y,\n percentX,\n percentY,\n xScrollLimit,\n yScrollLimit,\n\n xBarLength,\n yBarLength,\n enableXScroll,\n enableYScroll,\n\n wrapper,\n content: contentEl,\n xBar,\n yBar,\n\n refresh,\n scrollTo,\n scrollBy,\n scrollToElement,\n ensureInView,\n getXScrollLimit,\n getYScrollLimit,\n addScrollListener,\n removeScrollListener,\n })\n\n function getCommonPayload() {\n return {\n clientX: (isRtl.value ? -1 : 1) * x.value,\n clientY: y.value,\n percentX: percentX.value,\n percentY: percentY.value,\n }\n }\n\n function syncBarScroll() {\n xBar.value?.handleScroll(percentX.value)\n yBar.value?.handleScroll(percentY.value)\n }\n\n function handleMouseDown(event: MouseEvent) {\n if (!props.pointer || event.button !== 0 || USE_TOUCH) {\n return false\n }\n\n handlePointerDown(event)\n }\n\n // 记录滚动开始位置\n let xScrollStartAt = 0\n let yScrollStartAt = 0\n\n // 记录滚动开始鼠标位置\n let cursorXPosition = 0\n let cursorYPosition = 0\n\n function handlePointerDown(event: MouseEvent) {\n if (!enableXScroll.value && !enableYScroll.value) {\n return false\n }\n\n prepareScroll()\n\n xScrollStartAt = x.value\n yScrollStartAt = y.value\n cursorXPosition = event.clientX\n cursorYPosition = event.clientY\n\n document.addEventListener(MOVE_EVENT, handlePointerMove)\n document.addEventListener(UP_EVENT, handlePointerUp)\n\n emitEvent(props.onScrollStart, getCommonPayload())\n }\n\n function handlePointerMove(event: MouseEvent) {\n event.stopPropagation()\n event.preventDefault()\n\n scrolling.value = true\n\n if (enableXScroll.value) {\n setScrollX(xScrollStartAt - (event.clientX - cursorXPosition))\n }\n\n if (enableYScroll.value) {\n setScrollY(yScrollStartAt - (event.clientY - cursorYPosition))\n }\n\n computePercent()\n triggerUpdate()\n syncBarScroll()\n emitScrollEvent(props.mode)\n }\n\n function handlePointerUp() {\n document.removeEventListener(MOVE_EVENT, handlePointerMove)\n document.removeEventListener(UP_EVENT, handlePointerUp)\n\n emitEvent(props.onScrollEnd, getCommonPayload())\n startAutoplay()\n }\n\n function handleWheel(event: WheelEvent, type: 'vertical' | 'horizontal') {\n const isVerticalScroll = enableYScroll.value && type === 'vertical'\n const isHorizontalScroll = enableXScroll.value && type === 'horizontal'\n const sign = event.deltaY > 0 ? 1 : -1\n\n emitEvent(props.onWheel, event, type)\n\n if (isVerticalScroll || isHorizontalScroll) {\n const maxLimit = isVerticalScroll ? yScrollLimit.value : xScrollLimit.value\n const scroll = isVerticalScroll ? y.value : x.value\n\n if (sign > 0 ? scroll < maxLimit : scroll > 0) {\n event.stopPropagation()\n\n return false\n }\n }\n }\n\n function handleScroll(event: UIEvent) {\n if (!contentEl.value) return\n\n event.stopPropagation()\n\n const type = contentEl.value?.scrollLeft !== x.value ? 'horizontal' : 'vertical'\n\n y.value = contentEl.value.scrollTop\n x.value = contentEl.value.scrollLeft\n\n computePercent()\n triggerUpdate()\n syncBarScroll()\n emitScrollEvent(type)\n }\n\n function prepareScroll() {\n stopAutoplay()\n }\n\n function handleBarScrollStart(type: 'vertical' | 'horizontal') {\n usingBar.value = true\n prepareScroll()\n emitEvent(props.onBarScrollStart, {\n ...getCommonPayload(),\n type,\n })\n }\n\n function handleBarScrollEnd(type: 'vertical' | 'horizontal') {\n usingBar.value = false\n startAutoplay()\n emitEvent(props.onBarScrollEnd, {\n ...getCommonPayload(),\n type,\n })\n }\n\n function handleXBarScroll(percent: number) {\n percentX.value = percent\n setScrollX((percent * xScrollLimit.value) / 100)\n triggerUpdate()\n emitEvent(props.onBarScroll, {\n ...getCommonPayload(),\n type: 'horizontal',\n })\n emitScrollEvent('horizontal')\n }\n\n function handleYBarScroll(percent: number) {\n percentY.value = percent\n setScrollY((percent * yScrollLimit.value) / 100)\n triggerUpdate()\n emitEvent(props.onBarScroll, {\n ...getCommonPayload(),\n type: 'vertical',\n })\n emitScrollEvent('vertical')\n }\n\n function emitScrollEvent(type: NativeScrollMode) {\n emitEvent(props.onScroll, {\n ...getCommonPayload(),\n type,\n })\n emitter.emit('scroll', {\n ...getCommonPayload(),\n type,\n })\n }\n\n function getState() {\n const { clientX: scrollX, clientY: scrollY, percentX, percentY } = getCommonPayload()\n\n return {\n scrollX,\n scrollY,\n percentX,\n percentY,\n enableXScroll: enableXScroll.value,\n enableYScroll: enableYScroll.value,\n }\n }\n\n function getXScrollLimit() {\n return [0, xScrollLimit.value]\n }\n\n function getYScrollLimit() {\n return [0, yScrollLimit.value]\n }\n\n function ensureInView(el: string | Element, duration?: number, offset = 0) {\n if (!wrapper.value) return Promise.resolve()\n\n if (typeof el === 'string') {\n el = wrapper.value.querySelector(el)!\n }\n\n if (!isElement(el)) return Promise.resolve()\n\n const wrapperRect = wrapper.value.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n\n let clientX = 0\n let clientY = 0\n\n if (props.mode !== 'vertical') {\n if (elRect.left < wrapperRect.left + offset) {\n clientX = elRect.left - wrapperRect.left - offset\n } else if (elRect.right > wrapperRect.right - offset) {\n clientX = elRect.right - wrapperRect.right + offset\n }\n }\n\n if (props.mode !== 'horizontal') {\n if (elRect.top < wrapperRect.top + offset) {\n clientY = elRect.top - wrapperRect.top - offset\n } else if (elRect.bottom > wrapperRect.bottom - offset) {\n clientY = elRect.bottom - wrapperRect.bottom + offset\n }\n }\n\n return scrollBy(clientX, clientY, duration)\n }\n\n function addScrollListener(listener: EventHandler) {\n emitter.on('scroll', listener)\n }\n\n function removeScrollListener(listener: EventHandler) {\n emitter.off('scroll', listener)\n }\n\n function renderContent() {\n const Content = (props.scrollTag || 'div') as any\n const children =\n props.observeDeep && slots.default ? renderSlot(slots, 'default', slotParams).children : []\n\n return (\n <Content\n {...props.scrollAttrs}\n {...(props.scrollOnly ? attrs : {})}\n ref={contentEl}\n class={wrapperClass.value}\n style={[props.scrollAttrs?.style, props.scrollStyle, props.scrollOnly && style.value]}\n onMousedown={handleMouseDown}\n onWheelPassive={(event: WheelEvent) =>\n handleWheel(event, event.shiftKey ? 'horizontal' : 'vertical')}\n onScroll={handleScroll}\n >\n {slots.extra && (\n <div\n class={nh.be('extra')}\n style={{\n width: willMutate.value ? undefined : `${content.scrollWidth}px`,\n height: willMutate.value ? undefined : `${content.scrollHeight}px`,\n }}\n >\n <div\n class={nh.be('extra-inner')}\n style={{\n width: `${content.offsetWidth}px`,\n height: `${content.offsetHeight}px`,\n }}\n >\n {renderSlot(slots, 'extra', slotParams)}\n </div>\n </div>\n )}\n {slots.default &&\n (props.observeDeep\n ? flatVNodes(children).map((vnode, index) => {\n return (\n <ResizeObserver key={vnode.key ?? index} on-resize={handleResize}>\n {() => vnode}\n </ResizeObserver>\n )\n })\n : renderSlot(slots, 'default', slotParams))}\n </Content>\n )\n }\n\n return () => {\n if (props.scrollOnly) {\n return <ResizeObserver on-resize={handleResize}>{renderContent()}</ResizeObserver>\n }\n\n return (\n <div\n {...attrs}\n ref={wrapper}\n class={[className.value, attrs.class]}\n style={[style.value, attrs.style as any]}\n >\n {createSlotRender(slots, ['prefix-trap', 'prefixTrap'])?.()}\n <ResizeObserver on-resize={handleResize}>{renderContent()}</ResizeObserver>\n {props.useXBar && (\n <Scrollbar\n ref={xBar}\n inherit\n placement={'bottom'}\n class={[nh.bem('bar', 'horizontal'), props.barClass]}\n fade={barFade.value}\n bar-length={xBarLength.value}\n disabled={!enableXScroll.value}\n appear={props.appear}\n duration={props.barDuration}\n use-track={props.useBarTrack}\n onScrollStart={() => handleBarScrollStart('horizontal')}\n onScroll={handleXBarScroll}\n onScrollEnd={() => handleBarScrollEnd('horizontal')}\n ></Scrollbar>\n )}\n {props.useYBar && (\n <Scrollbar\n ref={yBar}\n inherit\n placement={'right'}\n class={[nh.bem('bar', 'vertical'), props.barClass]}\n fade={barFade.value}\n bar-length={yBarLength.value}\n disabled={!enableYScroll.value}\n appear={props.appear}\n duration={props.barDuration}\n use-track={props.useBarTrack}\n onScrollStart={() => handleBarScrollStart('vertical')}\n onScroll={handleYBarScroll}\n onScrollEnd={() => handleBarScrollEnd('vertical')}\n ></Scrollbar>\n )}\n {createSlotRender(slots, ['suffix-trap', 'suffixTrap'])?.()}\n </div>\n )\n }\n },\n})\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","scrollModes","freeze","MOVE_EVENT","UP_EVENT","defineComponent","name","inheritAttrs","props","nativeScrollProps","emits","setup","_props","attrs","slots","expose","useProps","scrollClass","scrollStyle","scrollAttrs","mode","default","validator","value","includes","width","height","disabled","pointer","scrollX","static","scrollY","useXBar","useYBar","barFade","barClass","autoplay","playWaiting","appear","barDuration","useBarTrack","scrollTag","observeDeep","scrollOnly","emitter","createEventEmitter","nh","useNameHelper","isRtl","useRtl","usingBar","ref","scrolling","wrapper","xBar","yBar","initialized","contentEl","content","x","y","percentX","percentY","xScrollLimit","yScrollLimit","enableXScroll","enableYScroll","xBarLength","yBarLength","handleResize","setScrollX","setScrollY","computePercent","refresh","scrollTo","scrollBy","scrollToElement","triggerUpdate","useScrollWrapper","toRef","onResize","entry","emitEvent","onAfterRefresh","syncBarScroll","startAutoplay","slotParams","shallowReadonly","getState","ensureInView","canPlay","canAutoplay","computed","isTrue","watch","stopAutoplay","nextTick","playTimer","startTimer","endTimer","onBeforeUnmount","distance","limit","prop","waiting","setScroll","playSpeed","scroll","setTimeout","requestAnimationFrame","clearTimeout","className","b","bm","inherit","style","Number","isNaN","undefined","wrapperClass","class","be","willMutate","handleMutate","observer","createMutation","isClient","MutationObserver","observe","childList","clearMutation","disconnect","immediate","onXEnabledChange","onYEnabledChange","getXScrollLimit","getYScrollLimit","addScrollListener","removeScrollListener","getCommonPayload","clientX","clientY","handleScroll","handleMouseDown","event","button","USE_TOUCH","handlePointerDown","xScrollStartAt","yScrollStartAt","cursorXPosition","cursorYPosition","prepareScroll","document","addEventListener","handlePointerMove","handlePointerUp","onScrollStart","stopPropagation","preventDefault","emitScrollEvent","removeEventListener","onScrollEnd","handleWheel","type","isVerticalScroll","isHorizontalScroll","sign","deltaY","onWheel","maxLimit","scrollLeft","scrollTop","handleBarScrollStart","onBarScrollStart","handleBarScrollEnd","onBarScrollEnd","handleXBarScroll","percent","onBarScroll","handleYBarScroll","onScroll","emit","el","duration","offset","querySelector","isElement","Promise","resolve","wrapperRect","getBoundingClientRect","elRect","left","right","top","bottom","listener","on","off","renderContent","Content","children","renderSlot","_createVNode","_mergeProps","shiftKey","extra","scrollWidth","scrollHeight","offsetWidth","offsetHeight","flatVNodes","map","vnode","index","ResizeObserver","key","_slot2","_slot","createSlotRender","Scrollbar","bem"],"mappings":"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"}