{"version":3,"file":"image2.mjs","sources":["../../../../../../packages/components/image/src/image.vue"],"sourcesContent":["<template>\n  <div\n    ref=\"container\"\n    :class=\"[ns.b(), $attrs.class]\"\n    :style=\"containerStyle\"\n    data-test-name=\"image\"\n    data-test-variant=\"\"\n    data-test-state=\"\"\n  >\n    <img\n      v-if=\"imageSrc !== undefined && !hasLoadError\"\n      v-bind=\"attrs\"\n      :src=\"imageSrc\"\n      :loading=\"loading\"\n      :style=\"imageStyle\"\n      :class=\"[\n        ns.e('inner'),\n        preview && ns.e('preview'),\n        isLoading && ns.is('loading'),\n      ]\"\n      @click=\"clickHandler\"\n      @load=\"handleLoad\"\n      @error=\"handleError\"\n    />\n    <div v-if=\"isLoading || hasLoadError\" :class=\"ns.e('wrapper')\">\n      <slot v-if=\"isLoading\" name=\"placeholder\">\n        <div v-loading=\"isLoading\" :class=\"ns.e('placeholder')\" />\n      </slot>\n      <slot v-else-if=\"hasLoadError\" name=\"error\">\n        <div :class=\"ns.e('error')\">{{ t('b.image.error') }}</div>\n      </slot>\n    </div>\n    <template v-if=\"preview\">\n      <image-viewer\n        v-if=\"showViewer\"\n        :z-index=\"zIndex\"\n        :initial-index=\"imageIndex\"\n        :infinite=\"infinite\"\n        :url-list=\"previewSrcList\"\n        :hide-on-click-modal=\"hideOnClickModal\"\n        :teleported=\"previewTeleported\"\n        :close-on-press-escape=\"closeOnPressEscape\"\n        @close=\"closeViewer\"\n        @switch=\"switchViewer\"\n      >\n        <div v-if=\"$slots.viewer\">\n          <slot name=\"viewer\" />\n        </div>\n      </image-viewer>\n    </template>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n  computed,\n  nextTick,\n  onMounted,\n  ref,\n  useAttrs as useRawAttrs,\n  watch,\n} from 'vue'\nimport { isClient, useEventListener, useThrottleFn } from '@vueuse/core'\nimport { useAttrs, useLocale, useNamespace } from '@bigin/hooks'\nimport ImageViewer from '@bigin/components/image-viewer'\nimport {\n  getScrollContainer,\n  isElement,\n  isInContainer,\n  isString,\n} from '@bigin/utils'\nimport { imageEmits, imageProps } from './image'\n\nimport type { CSSProperties, StyleValue } from 'vue'\n\ndefineOptions({\n  name: 'BImage',\n  inheritAttrs: false,\n})\n\nconst props = defineProps(imageProps)\nconst emit = defineEmits(imageEmits)\n\nlet prevOverflow = ''\n\nconst { t } = useLocale()\nconst ns = useNamespace('image')\nconst rawAttrs = useRawAttrs()\nconst attrs = useAttrs()\n\nconst imageSrc = ref<string | undefined>()\nconst hasLoadError = ref(false)\nconst isLoading = ref(true)\nconst showViewer = ref(false)\nconst container = ref<HTMLElement>()\nconst _scrollContainer = ref<HTMLElement | Window>()\n\nconst supportLoading = isClient && 'loading' in HTMLImageElement.prototype\nlet stopScrollListener: (() => void) | undefined\nlet stopWheelListener: (() => void) | undefined\n\nconst containerStyle = computed(() => rawAttrs.style as StyleValue)\n\nconst imageStyle = computed<CSSProperties>(() => {\n  const { fit } = props\n  if (isClient && fit) {\n    return { objectFit: fit }\n  }\n  return {}\n})\n\nconst preview = computed(() => {\n  const { previewSrcList } = props\n  return Array.isArray(previewSrcList) && previewSrcList.length > 0\n})\n\nconst imageIndex = computed(() => {\n  const { previewSrcList, initialIndex } = props\n  let previewIndex = initialIndex\n  if (initialIndex > previewSrcList.length - 1) {\n    previewIndex = 0\n  }\n  return previewIndex\n})\n\nconst isManual = computed(() => {\n  if (props.loading === 'eager') return false\n  return (!supportLoading && props.loading === 'lazy') || props.lazy\n})\n\nconst loadImage = () => {\n  if (!isClient) return\n\n  // reset status\n  isLoading.value = true\n  hasLoadError.value = false\n  imageSrc.value = props.src\n}\n\nfunction handleLoad(event: Event) {\n  isLoading.value = false\n  hasLoadError.value = false\n  emit('load', event)\n}\n\nfunction handleError(event: Event) {\n  isLoading.value = false\n  hasLoadError.value = true\n  emit('error', event)\n}\n\nfunction handleLazyLoad() {\n  if (isInContainer(container.value, _scrollContainer.value)) {\n    loadImage()\n    removeLazyLoadListener()\n  }\n}\n\nconst lazyLoadHandler = useThrottleFn(handleLazyLoad, 200)\n\nasync function addLazyLoadListener() {\n  if (!isClient) return\n\n  await nextTick()\n\n  const { scrollContainer } = props\n  if (isElement(scrollContainer)) {\n    _scrollContainer.value = scrollContainer\n  } else if (isString(scrollContainer) && scrollContainer !== '') {\n    _scrollContainer.value =\n      document.querySelector<HTMLElement>(scrollContainer) ?? undefined\n  } else if (container.value) {\n    _scrollContainer.value = getScrollContainer(container.value)\n  }\n\n  if (_scrollContainer.value) {\n    stopScrollListener = useEventListener(\n      _scrollContainer,\n      'scroll',\n      lazyLoadHandler\n    )\n    setTimeout(() => handleLazyLoad(), 100)\n  }\n}\n\nfunction removeLazyLoadListener() {\n  if (!isClient || !_scrollContainer.value || !lazyLoadHandler) return\n\n  stopScrollListener?.()\n  _scrollContainer.value = undefined\n}\n\nfunction wheelHandler(e: WheelEvent) {\n  if (!e.ctrlKey) return\n\n  if (e.deltaY < 0) {\n    e.preventDefault()\n    return false\n  } else if (e.deltaY > 0) {\n    e.preventDefault()\n    return false\n  }\n}\n\nfunction clickHandler() {\n  // don't show viewer when preview is false\n  if (!preview.value) return\n\n  stopWheelListener = useEventListener('wheel', wheelHandler, {\n    passive: false,\n  })\n\n  // prevent body scroll\n  prevOverflow = document.body.style.overflow\n  document.body.style.overflow = 'hidden'\n  showViewer.value = true\n  emit('show')\n}\n\nfunction closeViewer() {\n  stopWheelListener?.()\n  document.body.style.overflow = prevOverflow\n  showViewer.value = false\n  emit('close')\n}\n\nfunction switchViewer(val: number) {\n  emit('switch', val)\n}\n\nwatch(\n  () => props.src,\n  () => {\n    if (isManual.value) {\n      // reset status\n      isLoading.value = true\n      hasLoadError.value = false\n      removeLazyLoadListener()\n      addLazyLoadListener()\n    } else {\n      loadImage()\n    }\n  }\n)\n\nonMounted(() => {\n  if (isManual.value) {\n    addLazyLoadListener()\n  } else {\n    loadImage()\n  }\n})\n</script>\n"],"names":["useRawAttrs","useAttrs"],"mappings":"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"}