{"version":3,"file":"scrollbar.vue2.mjs","sources":["../../../../../../packages/components/scrollbar/src/scrollbar.vue"],"sourcesContent":["<script lang=\"ts\">\n  import { computed, defineComponent, ref, onMounted } from 'vue'\n  import type { StyleValue } from 'vue'\n  import { getComponentNamespace, getNamespace } from '../../../utils/global-config'\n  import { isObject } from '../../../utils/is'\n  import ResizeObserver from '../../../shared/resize-observer'\n  import { scrollbarProps } from './scrollbar'\n  import { TRACK_SIZE } from './constant'\n  import Thumb from './thumb.vue'\n\n  import type { ThumbData } from './types'\n\n  export default defineComponent({\n    name: getComponentNamespace('Scrollbar'),\n    components: {\n      Thumb,\n      ResizeObserver\n    },\n    inheritAttrs: false,\n    props: scrollbarProps,\n    emits: ['scroll'],\n    setup(props, { emit }) {\n      const ns = getNamespace('scrollbar')\n      const cls = computed(() => [\n        ns,\n        props.outerClass,\n        isBoth.value && 'is-both',\n        `${ns}__${props.type}`\n      ])\n\n      const containerRef = ref<HTMLElement>()\n      const horizontalData = ref<ThumbData>()\n      const verticalData = ref<ThumbData>()\n      const horizontalThumbRef = ref()\n      const verticalThumbRef = ref()\n\n      const _hasHorizontalScrollbar = ref(false)\n      const _hasVerticalScrollbar = ref(false)\n      const hasHorizontalScrollbar = computed(\n        () => _hasHorizontalScrollbar.value && !props.disableHorizontal\n      )\n      const hasVerticalScrollbar = computed(\n        () => _hasVerticalScrollbar.value && !props.disableVertical\n      )\n\n      const isBoth = ref(false)\n\n      const getContainerSize = () => {\n        if (containerRef.value) {\n          const {\n            clientWidth,\n            clientHeight,\n            offsetWidth,\n            offsetHeight,\n            scrollWidth,\n            scrollHeight,\n            scrollTop,\n            scrollLeft\n          } = containerRef.value\n\n          _hasHorizontalScrollbar.value = scrollWidth > clientWidth\n          _hasVerticalScrollbar.value = scrollHeight > clientHeight\n\n          isBoth.value = hasHorizontalScrollbar.value && hasVerticalScrollbar.value\n          const horizontalTrackWidth =\n            props.type === 'embed' && isBoth.value ? offsetWidth - TRACK_SIZE : offsetWidth\n          const verticalTrackHeight =\n            props.type === 'embed' && isBoth.value ? offsetHeight - TRACK_SIZE : offsetHeight\n\n          const horizontalThumbWidth = Math.round(\n            horizontalTrackWidth / Math.min(scrollWidth / clientWidth, horizontalTrackWidth)\n          )\n          const maxHorizontalOffset = horizontalTrackWidth - horizontalThumbWidth\n          const horizontalRatio = (scrollWidth - clientWidth) / maxHorizontalOffset\n          const verticalThumbHeight = Math.round(\n            verticalTrackHeight / Math.min(scrollHeight / clientHeight, verticalTrackHeight)\n          )\n          const maxVerticalOffset = verticalTrackHeight - verticalThumbHeight\n          const verticalRatio = (scrollHeight - clientHeight) / maxVerticalOffset\n\n          horizontalData.value = {\n            ratio: horizontalRatio,\n            thumbSize: horizontalThumbWidth,\n            max: maxHorizontalOffset\n          }\n          verticalData.value = {\n            ratio: verticalRatio,\n            thumbSize: verticalThumbHeight,\n            max: maxVerticalOffset\n          }\n          if (scrollTop > 0) {\n            const verticalOffset = Math.round(scrollTop / (verticalData.value?.ratio ?? 1))\n            verticalThumbRef.value?.setOffset(verticalOffset)\n          }\n          if (scrollLeft > 0) {\n            const horizontalOffset = Math.round(scrollLeft / (verticalData.value?.ratio ?? 1))\n            horizontalThumbRef.value?.setOffset(horizontalOffset)\n          }\n        }\n      }\n\n      const handleResize = () => {\n        getContainerSize()\n      }\n\n      const handleVerticalScroll = (offset: number) => {\n        if (containerRef.value) {\n          containerRef.value.scrollTo({\n            top: offset * (verticalData.value?.ratio ?? 1)\n          })\n        }\n      }\n\n      const handleHorizontalScroll = (offset: number) => {\n        if (containerRef.value) {\n          containerRef.value.scrollTo({\n            left: offset * (horizontalData.value?.ratio ?? 1)\n          })\n        }\n      }\n\n      const style = computed(() => {\n        const style: StyleValue = {}\n        if (props.type === 'track') {\n          if (hasHorizontalScrollbar.value) {\n            style.paddingBottom = `${TRACK_SIZE}px`\n          }\n          if (hasVerticalScrollbar.value) {\n            style.paddingRight = `${TRACK_SIZE}px`\n          }\n        }\n        return [style, props.outerStyle ?? {}]\n      })\n\n      const handleScroll = (ev: Event) => {\n        if (containerRef.value) {\n          if (hasHorizontalScrollbar.value && !props.disableHorizontal) {\n            const horizontalOffset = Math.round(\n              containerRef.value.scrollLeft / (horizontalData.value?.ratio ?? 1)\n            )\n            horizontalThumbRef.value?.setOffset(horizontalOffset)\n          }\n          if (hasVerticalScrollbar.value && !props.disableVertical) {\n            const verticalOffset = Math.round(\n              containerRef.value.scrollTop / (verticalData.value?.ratio ?? 1)\n            )\n            verticalThumbRef.value?.setOffset(verticalOffset)\n          }\n        }\n        emit('scroll', ev)\n      }\n\n      onMounted(() => {\n        getContainerSize()\n      })\n\n      return {\n        ns,\n        cls,\n        style,\n        containerRef,\n        horizontalThumbRef,\n        verticalThumbRef,\n        horizontalData,\n        verticalData,\n        isBoth,\n        hasHorizontalScrollbar,\n        hasVerticalScrollbar,\n        handleScroll,\n        handleHorizontalScroll,\n        handleVerticalScroll,\n        handleResize\n      }\n    },\n    methods: {\n      scrollTo(\n        options?:\n          | number\n          | {\n              left?: number\n              top?: number\n            },\n        y?: number\n      ) {\n        if (isObject(options)) {\n          ;(this.$refs.containerRef as HTMLElement)?.scrollTo(options)\n        } else if (options || y) {\n          ;(this.$refs.containerRef as HTMLElement)?.scrollTo(options as number, y as number)\n        }\n      },\n      scrollTop(top: number) {\n        ;(this.$refs.containerRef as HTMLElement)?.scrollTo({\n          top\n        })\n      },\n      scrollLeft(left: number) {\n        ;(this.$refs.containerRef as HTMLElement)?.scrollTo({\n          left\n        })\n      }\n    }\n  })\n</script>\n\n<template>\n  <div :class=\"cls\" :style=\"style\">\n    <div ref=\"containerRef\" :class=\"`${ns}__container`\" v-bind=\"$attrs\" @scroll=\"handleScroll\">\n      <ResizeObserver @resize=\"handleResize\">\n        <slot></slot>\n      </ResizeObserver>\n    </div>\n\n    <Thumb\n      v-if=\"!hide && hasHorizontalScrollbar\"\n      ref=\"horizontalThumbRef\"\n      :data=\"horizontalData\"\n      direction=\"horizontal\"\n      :both=\"isBoth\"\n      @scroll=\"handleHorizontalScroll\"\n    />\n    <Thumb\n      v-if=\"!hide && hasVerticalScrollbar\"\n      ref=\"verticalThumbRef\"\n      :data=\"verticalData\"\n      direction=\"vertical\"\n      :both=\"isBoth\"\n      @scroll=\"handleVerticalScroll\"\n    />\n  </div>\n</template>\n"],"names":["style"],"mappings":"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"}