{"version":3,"file":"backtop2.mjs","sources":["../../../../../../packages/components/backtop/src/backtop.vue"],"sourcesContent":["<template>\n  <transition :name=\"`${ns.namespace.value}-fade-in`\">\n    <div\n      v-if=\"visible\"\n      :style=\"{\n        right: styleRight,\n        bottom: styleBottom,\n      }\"\n      :class=\"ns.b()\"\n      @click.stop=\"handleClick\"\n    >\n      <slot>\n        <el-icon :class=\"ns.e('icon')\"><caret-top /></el-icon>\n      </slot>\n    </div>\n  </transition>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, computed, onMounted, shallowRef } from 'vue'\nimport { useEventListener, useThrottleFn } from '@vueuse/core'\nimport { ElIcon } from '@element-plus/components/icon'\nimport { easeInOutCubic, throwError } from '@element-plus/utils'\nimport { CaretTop } from '@element-plus/icons-vue'\nimport { useNamespace } from '@element-plus/hooks'\n\nimport { backtopEmits, backtopProps } from './backtop'\n\nconst COMPONENT_NAME = 'ElBacktop'\n\nexport default defineComponent({\n  name: COMPONENT_NAME,\n  components: {\n    ElIcon,\n    CaretTop,\n  },\n  props: backtopProps,\n  emits: backtopEmits,\n\n  setup(props, { emit }) {\n    const ns = useNamespace('backtop')\n    const el = shallowRef<HTMLElement | undefined>(document.documentElement)\n    const container = shallowRef<Document | HTMLElement>(document)\n    const visible = ref(false)\n    const styleBottom = computed(() => `${props.bottom}px`)\n    const styleRight = computed(() => `${props.right}px`)\n\n    const scrollToTop = () => {\n      if (!el.value) return\n      const beginTime = Date.now()\n      const beginValue = el.value.scrollTop\n      const frameFunc = () => {\n        if (!el.value) return\n        const progress = (Date.now() - beginTime) / 500\n        if (progress < 1) {\n          el.value.scrollTop = beginValue * (1 - easeInOutCubic(progress))\n          requestAnimationFrame(frameFunc)\n        } else {\n          el.value.scrollTop = 0\n        }\n      }\n      requestAnimationFrame(frameFunc)\n    }\n    const handleScroll = () => {\n      if (el.value) visible.value = el.value.scrollTop >= props.visibilityHeight\n    }\n    const handleClick = (event: MouseEvent) => {\n      scrollToTop()\n      emit('click', event)\n    }\n\n    const handleScrollThrottled = useThrottleFn(handleScroll, 300)\n\n    onMounted(() => {\n      if (props.target) {\n        el.value =\n          document.querySelector<HTMLElement>(props.target) ?? undefined\n        if (!el.value) {\n          throwError(COMPONENT_NAME, `target is not existed: ${props.target}`)\n        }\n        container.value = el.value\n      }\n\n      useEventListener(container, 'scroll', handleScrollThrottled)\n    })\n\n    return {\n      visible,\n      styleBottom,\n      styleRight,\n      handleClick,\n      ns,\n    }\n  },\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;AA4BA,MAAM,iBAAiB;AAEvB,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,IACA;AAAA;AAAA,EAEF,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,MAAM,OAAO,EAAE,QAAQ;AACrB,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,WAAoC,SAAS;AACxD,UAAM,YAAY,WAAmC;AACrD,UAAM,UAAU,IAAI;AACpB,UAAM,cAAc,SAAS,MAAM,GAAG,MAAM;AAC5C,UAAM,aAAa,SAAS,MAAM,GAAG,MAAM;AAE3C,UAAM,cAAc,MAAM;AACxB,UAAI,CAAC,GAAG;AAAO;AACf,YAAM,YAAY,KAAK;AACvB,YAAM,aAAa,GAAG,MAAM;AAC5B,YAAM,YAAY,MAAM;AACtB,YAAI,CAAC,GAAG;AAAO;AACf,cAAM,WAAY,MAAK,QAAQ,aAAa;AAC5C,YAAI,WAAW,GAAG;AAChB,aAAG,MAAM,YAAY,kBAAkB,eAAe;AACtD,gCAAsB;AAAA,eACjB;AACL,aAAG,MAAM,YAAY;AAAA;AAAA;AAGzB,4BAAsB;AAAA;AAExB,UAAM,eAAe,MAAM;AACzB,UAAI,GAAG;AAAO,gBAAQ,QAAQ,GAAG,MAAM,aAAa,MAAM;AAAA;AAE5D,UAAM,cAAc,CAAC,UAAsB;AACzC;AACA,WAAK,SAAS;AAAA;AAGhB,UAAM,wBAAwB,cAAc,cAAc;AAE1D,cAAU,MAAM;AACd,UAAI;AACF;AAEA,gBAAQ;AACN,qBAAW;AAAgD;AAE7D;AAAqB;AAGvB;AAAsC;AAGxC;AAAO;AACL,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA;;;;;AA1FoC;;;AAEvB;;AACP;AAA6B;AAAkB;;;AAK/C;;AAEN;AACwD;AAAlC;;;AAAwB;;;;;;;;;;;;;;;"}