UNPKG

vexip-ui

Version:

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

1 lines 32.1 kB
{"version":3,"file":"native-scroll.cjs","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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"}