UNPKG

@extclp/vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 33.5 kB
{"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 syncing,\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 || syncing.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","syncing","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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"}