UNPKG

vexip-ui

Version:

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

1 lines 17.2 kB
{"version":3,"file":"anchor.vue2.cjs","sources":["../../../components/anchor/anchor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { AnchorLink } from '@/components/anchor-link'\nimport { Renderer } from '@/components/renderer'\n\nimport {\n getCurrentInstance,\n isVNode,\n nextTick,\n onBeforeUnmount,\n onMounted,\n provide,\n reactive,\n ref,\n watch,\n} from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { proxyExposed } from '@vexip-ui/hooks'\nimport { isClient, isElement } from '@vexip-ui/utils'\nimport { anchorProps } from './props'\nimport { animateScrollTo } from './helper'\nimport { ANCHOR_STATE } from './symbol'\n\nimport type { ComponentInternalInstance } from 'vue'\nimport type { NativeScrollExposed } from '@/components/native-scroll'\nimport type { Scroll } from '@/components/scroll'\nimport type { AnchorLinkState, AnchorSlots, AnchorState } from './symbol'\n\ntype ScrollType = NativeScrollExposed & InstanceType<typeof Scroll>\n\ndefineOptions({ name: 'Anchor' })\n\nconst nh = useNameHelper('anchor')\n\nconst _props = defineProps(anchorProps)\nconst props = useProps('anchor', _props, {\n active: {\n default: '',\n static: true,\n },\n viewer: {\n default: null,\n static: true,\n },\n offset: 8,\n marker: false,\n scrollDuration: 500,\n markerTransition: () => nh.ns('fade'),\n options: {\n default: () => [],\n static: true,\n },\n bindHash: false,\n forceActive: false,\n slots: () => ({}),\n})\n\nconst emit = defineEmits(['update:active'])\n\ndefineSlots<AnchorSlots>()\n\nconst currentActive = ref(props.active)\nconst animating = ref(false)\nconst markerTop = ref(0)\nconst linkStates = new Set<AnchorLinkState>()\n\nconst wrapper = ref<HTMLElement>()\n\nlet timer: ReturnType<typeof setTimeout>\n\nlet isRawViewer = false\nlet container: Window | HTMLElement | null = null\nlet scroller: ScrollType | null = null\nlet prevScrollTop = 0\n\nif (isClient && !currentActive.value && props.bindHash) {\n currentActive.value = decodeURIComponent(location.hash)\n}\n\nprovide<AnchorState>(\n ANCHOR_STATE,\n reactive({\n currentActive,\n increaseLink,\n decreaseLink,\n handleActive,\n }),\n)\n\nwatch(\n () => props.active,\n value => {\n currentActive.value = value\n },\n)\nwatch(() => props.viewer, updateContainer)\n\nonMounted(() => {\n updateContainer()\n computeMarkerPosition()\n})\n\nonBeforeUnmount(() => {\n removeListener()\n clearTimeout(timer)\n})\n\nfunction increaseLink(state: AnchorLinkState) {\n linkStates.add(state)\n state.active = currentActive.value === state.to\n}\n\nfunction decreaseLink(state: AnchorLinkState) {\n linkStates.delete(state)\n}\n\nconst instance = getCurrentInstance()!\n\nfunction updateContainer() {\n removeListener()\n isClient &&\n nextTick(() => {\n const viewer: unknown = props.viewer\n\n prevScrollTop = 0\n\n let _container: Window | Node | ComponentInternalInstance | null = null\n let refName = 'scroll'\n\n if (typeof viewer === 'string') {\n if (viewer.startsWith('ref:')) {\n refName = viewer.substring(4)\n refName = refName || 'scroll'\n } else if (['window', 'document', 'html'].includes(viewer)) {\n _container = window\n } else if (viewer === 'body') {\n _container = document.body\n } else if (viewer === 'root') {\n _container = instance.root\n } else {\n _container = document.querySelector(viewer)\n }\n } else if (typeof viewer === 'function') {\n _container = viewer()\n } else if (isElement(viewer)) {\n _container = viewer\n }\n\n if (_container === window || isElement(_container)) {\n isRawViewer = true\n } else {\n isRawViewer = false\n // container = this.$parent\n }\n\n if (!isRawViewer) {\n // ComponentInternalInstance\n _container = _container as ComponentInternalInstance\n _container = isVNode(_container?.vnode) ? _container : instance.parent\n\n while (_container) {\n const name = _container.type?.name\n\n if (name === 'Scroll' || name === 'NativeScroll') {\n scroller = proxyExposed({ component: _container } as any)\n\n break\n }\n\n const refTemp = _container.refs?.[refName]\n\n if (refTemp) {\n if (isElement(refTemp)) {\n isRawViewer = true\n container = refTemp as HTMLElement\n } else {\n scroller = refTemp as ScrollType\n }\n\n break\n }\n\n _container = _container.parent\n }\n\n if (scroller) {\n scroller.addScrollListener(handleContainerScroll)\n container = scroller.$el\n } else if (!container) {\n isRawViewer = true\n container = instance.parent?.proxy?.$el as HTMLElement\n }\n\n if (isRawViewer && container) {\n container.addEventListener('scroll', handleContainerScroll)\n }\n } else {\n container = _container as HTMLElement\n container.addEventListener('scroll', handleContainerScroll)\n }\n })\n}\n\nfunction getContainerEl() {\n if (!container) return null\n\n return container === window ? document.documentElement : (container as HTMLElement)\n}\n\nfunction computeCurrentLink(scrollTop: number) {\n if (!linkStates.size || !container) return\n\n const containerTop = getContainerEl()!.offsetTop\n const offsetList: { link: string, offset: number }[] = []\n\n let offset = scrollTop + props.offset\n\n if (isRawViewer) {\n offset += containerTop\n }\n\n linkStates.forEach(state => {\n const id = state.to\n\n if (!id.startsWith('#')) return\n\n const element = document.querySelector(id) as HTMLElement | null\n\n if (element) {\n offsetList.push({\n link: id,\n offset: element.offsetTop,\n })\n }\n })\n\n offsetList.sort((prev, next) => prev.offset - next.offset)\n offsetList.push({\n link: '',\n offset: Infinity,\n })\n\n let currentLink = ''\n\n for (let i = 0, len = offsetList.length - 1; i < len; ++i) {\n const current = offsetList[i]\n const next = offsetList[i + 1]\n\n if (current.offset <= offset && next.offset > offset) {\n currentLink = current.link\n\n break\n }\n }\n\n prevScrollTop = scrollTop\n\n if (currentActive.value !== currentLink) {\n currentActive.value = currentLink\n emit('update:active', currentLink)\n emitEvent(props.onChange, currentLink)\n }\n}\n\nfunction handleContainerScroll(event: Event) {\n if (animating.value) return\n\n const scrollTop = isRawViewer\n ? (\n (event.target === window || event.target === document\n ? document.documentElement\n : event.target) as HTMLElement\n ).scrollTop\n : (event as MouseEvent).clientY\n\n computeCurrentLink(scrollTop)\n computeMarkerPosition()\n}\n\nfunction removeListener() {\n if (scroller) {\n scroller.removeScrollListener(handleContainerScroll)\n scroller = null\n }\n\n if (container) {\n container.removeEventListener('scroll', handleContainerScroll)\n }\n}\n\nfunction handleActive(link: string) {\n if (\n (!props.forceActive && link === currentActive.value) ||\n !link.startsWith('#') ||\n link.length < 2\n ) {\n return\n }\n\n const element = document.querySelector(link) as HTMLElement | null\n\n if (!element) return\n\n clearTimeout(timer)\n\n animating.value = true\n\n const elementTop = element.offsetTop\n const duration = Math.max(props.scrollDuration, 0)\n\n if (isRawViewer && container) {\n const containerEl = getContainerEl()!\n // const from = containerEl.scrollTop\n const to = Math.min(\n elementTop - containerEl.offsetTop - props.offset,\n containerEl.scrollHeight - containerEl.clientHeight,\n )\n\n animateScrollTo(containerEl, prevScrollTop, to, duration, () => {\n timer = setTimeout(() => {\n animating.value = false\n }, 10)\n })\n computeCurrentLink(to)\n computeMarkerPosition()\n } else if (scroller) {\n const [min, max] = scroller.getYScrollLimit()\n const clientY = Math.max(Math.min(elementTop - props.offset, max), min)\n\n scroller.scrollTo(0, clientY, duration).then(() => {\n timer = setTimeout(() => {\n animating.value = false\n }, duration + 10)\n })\n\n computeCurrentLink(clientY)\n computeMarkerPosition()\n } else {\n animating.value = false\n }\n\n if (isClient && props.bindHash && location) {\n location.hash = encodeURIComponent(currentActive.value.replace(/^#/, ''))\n }\n}\n\nfunction computeMarkerPosition() {\n const currentLink = Array.from(linkStates).find(\n state => state.to && state.to === currentActive.value,\n )\n\n if (currentLink?.el) {\n const linkRect = currentLink.el.getBoundingClientRect()\n const wrapperTop = wrapper.value?.getBoundingClientRect().top ?? 0\n\n markerTop.value = linkRect.top - wrapperTop + linkRect.height / 2 + 0.5\n }\n}\n</script>\n\n<template>\n <div\n ref=\"wrapper\"\n :class=\"{\n [nh.b()]: true,\n [nh.bs('vars')]: true,\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('no-marker')]: !props.marker\n }\"\n >\n <ul :class=\"nh.be('list')\">\n <slot>\n <Renderer :renderer=\"props.slots.default\">\n <AnchorLink\n v-for=\"link in props.options\"\n :key=\"link.to\"\n :to=\"link.to\"\n :title=\"link.title\"\n :children=\"link.children\"\n >\n {{ link.label }}\n </AnchorLink>\n </Renderer>\n </slot>\n </ul>\n <Transition appear :name=\"props.markerTransition\">\n <div\n v-if=\"props.marker && currentActive\"\n :class=\"nh.be('marker')\"\n :style=\"{ top: `${markerTop}px` }\"\n >\n <slot name=\"marker\">\n <Renderer :renderer=\"props.slots.marker\">\n <div :class=\"nh.be('pointer')\"></div>\n </Renderer>\n </slot>\n </div>\n </Transition>\n </div>\n</template>\n"],"names":["nh","useNameHelper","_props","__props","props","useProps","emit","__emit","currentActive","ref","animating","markerTop","linkStates","wrapper","timer","isRawViewer","container","scroller","prevScrollTop","isClient","provide","ANCHOR_STATE","reactive","increaseLink","decreaseLink","handleActive","watch","value","updateContainer","onMounted","computeMarkerPosition","onBeforeUnmount","removeListener","state","instance","getCurrentInstance","nextTick","viewer","_container","refName","isElement","handleContainerScroll","isVNode","name","_a","proxyExposed","refTemp","_b","_d","_c","getContainerEl","computeCurrentLink","scrollTop","containerTop","offsetList","offset","id","element","prev","next","currentLink","i","len","current","emitEvent","event","link","elementTop","duration","containerEl","to","animateScrollTo","min","max","clientY","linkRect","wrapperTop","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_ctx","_createVNode","Renderer","_openBlock","_Fragment","_renderList","_createBlock","AnchorLink","_createTextVNode","_toDisplayString","_Transition"],"mappings":"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"}