{"version":3,"file":"anchor.mjs","sources":["../../../../../../../packages/components/anchor/src/anchor.vue"],"sourcesContent":["<template>\n  <div ref=\"anchorRef\" :class=\"cls\">\n    <div\n      v-if=\"marker\"\n      ref=\"markerRef\"\n      :class=\"ns.e('marker')\"\n      :style=\"markerStyle\"\n    />\n    <div :class=\"ns.e('list')\">\n      <slot />\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n  computed,\n  nextTick,\n  onMounted,\n  provide,\n  ref,\n  useSlots,\n  watch,\n} from 'vue'\nimport { useEventListener } from '@vueuse/core'\nimport { useNamespace } from '@hd-front-end/hooks'\nimport {\n  animateScrollTo,\n  getElement,\n  getOffsetTopDistance,\n  getScrollElement,\n  getScrollTop,\n  isUndefined,\n  isWindow,\n  throttleByRaf,\n} from '@hd-front-end/utils'\nimport { CHANGE_EVENT } from '@hd-front-end/constants'\nimport { anchorEmits, anchorProps } from './anchor'\nimport { anchorKey } from './constants'\n\nimport type { CSSProperties } from 'vue'\nimport type { AnchorLinkState } from './constants'\n\ndefineOptions({\n  name: 'ElAnchor',\n})\n\nconst props = defineProps(anchorProps)\nconst emit = defineEmits(anchorEmits)\nconst slots = useSlots()\n\nconst currentAnchor = ref('')\nconst markerStyle = ref<CSSProperties>({})\nconst anchorRef = ref<HTMLElement | null>(null)\nconst markerRef = ref<HTMLElement | null>(null)\nconst containerEl = ref<HTMLElement | Window>()\n\nconst links: Record<string, HTMLElement> = {}\nlet isScrolling = false\nlet currentScrollTop = 0\n\nconst ns = useNamespace('anchor')\n\nconst cls = computed(() => [\n  ns.b(),\n  props.type === 'underline' ? ns.m('underline') : '',\n  ns.m(props.direction),\n])\n\nconst addLink = (state: AnchorLinkState) => {\n  links[state.href] = state.el\n}\n\nconst removeLink = (href: string) => {\n  delete links[href]\n}\n\nconst setCurrentAnchor = (href: string) => {\n  const activeHref = currentAnchor.value\n  if (activeHref !== href) {\n    currentAnchor.value = href\n    emit(CHANGE_EVENT, href)\n  }\n}\n\nlet clearAnimate: (() => void) | null = null\n\nconst scrollToAnchor = (href: string) => {\n  if (!containerEl.value) return\n  const target = getElement(href)\n  if (!target) return\n  if (clearAnimate) clearAnimate()\n  isScrolling = true\n  const scrollEle = getScrollElement(target, containerEl.value)\n  const distance = getOffsetTopDistance(target, scrollEle)\n  const max = scrollEle.scrollHeight - scrollEle.clientHeight\n  const to = Math.min(distance - props.offset, max)\n  clearAnimate = animateScrollTo(\n    containerEl.value,\n    currentScrollTop,\n    to,\n    props.duration,\n    () => {\n      // make sure it is executed after throttleByRaf's handleScroll\n      setTimeout(() => {\n        isScrolling = false\n      }, 20)\n    }\n  )\n}\n\nconst scrollTo = (href?: string) => {\n  if (href) {\n    setCurrentAnchor(href)\n    scrollToAnchor(href)\n  }\n}\n\nconst handleClick = (e: MouseEvent, href?: string) => {\n  emit('click', e, href)\n  scrollTo(href)\n}\n\nconst handleScroll = throttleByRaf(() => {\n  if (containerEl.value) {\n    currentScrollTop = getScrollTop(containerEl.value)\n  }\n  const currentHref = getCurrentHref()\n  if (isScrolling || isUndefined(currentHref)) return\n  setCurrentAnchor(currentHref)\n})\n\nconst getCurrentHref = () => {\n  if (!containerEl.value) return\n  const scrollTop = getScrollTop(containerEl.value)\n  const anchorTopList: { top: number; href: string }[] = []\n\n  for (const href of Object.keys(links)) {\n    const target = getElement(href)\n    if (!target) continue\n    const scrollEle = getScrollElement(target, containerEl.value)\n    const distance = getOffsetTopDistance(target, scrollEle)\n    anchorTopList.push({\n      top: distance - props.offset - props.bound,\n      href,\n    })\n  }\n  anchorTopList.sort((prev, next) => prev.top - next.top)\n  for (let i = 0; i < anchorTopList.length; i++) {\n    const item = anchorTopList[i]\n    const next = anchorTopList[i + 1]\n\n    if (i === 0 && scrollTop === 0) {\n      return props.selectScrollTop ? item.href : ''\n    }\n    if (item.top <= scrollTop && (!next || next.top > scrollTop)) {\n      return item.href\n    }\n  }\n}\n\nconst getContainer = () => {\n  const el = getElement(props.container)\n  if (!el || isWindow(el)) {\n    containerEl.value = window\n  } else {\n    containerEl.value = el\n  }\n}\n\nuseEventListener(containerEl, 'scroll', handleScroll)\n\nconst updateMarkerStyle = () => {\n  nextTick(() => {\n    if (!anchorRef.value || !markerRef.value || !currentAnchor.value) {\n      markerStyle.value = {}\n      return\n    }\n    const currentLinkEl = links[currentAnchor.value]\n    if (!currentLinkEl) {\n      markerStyle.value = {}\n      return\n    }\n    const anchorRect = anchorRef.value.getBoundingClientRect()\n    const markerRect = markerRef.value.getBoundingClientRect()\n    const linkRect = currentLinkEl.getBoundingClientRect()\n\n    if (props.direction === 'horizontal') {\n      const left = linkRect.left - anchorRect.left\n      markerStyle.value = {\n        left: `${left}px`,\n        width: `${linkRect.width}px`,\n        opacity: 1,\n      }\n    } else {\n      const top =\n        linkRect.top -\n        anchorRect.top +\n        (linkRect.height - markerRect.height) / 2\n      markerStyle.value = {\n        top: `${top}px`,\n        opacity: 1,\n      }\n    }\n  })\n}\n\nwatch(currentAnchor, updateMarkerStyle)\nwatch(() => slots.default?.(), updateMarkerStyle)\n\nonMounted(() => {\n  getContainer()\n  const hash = decodeURIComponent(window.location.hash)\n  const target = getElement(hash)\n  if (target) {\n    scrollTo(hash)\n  } else {\n    handleScroll()\n  }\n})\n\nwatch(\n  () => props.container,\n  () => {\n    getContainer()\n  }\n)\n\nprovide(anchorKey, {\n  ns,\n  direction: props.direction,\n  currentAnchor,\n  addLink,\n  removeLink,\n  handleClick,\n})\n\ndefineExpose({\n  scrollTo,\n})\n</script>\n"],"names":["_openBlock","_createElementBlock","_normalizeClass","marker","_unref","_normalizeStyle","_createElementVNode","_renderSlot"],"mappings":"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"}