{"version":3,"file":"image.vue2.cjs","sources":["../../../components/image/image.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ImageViewer } from '@/components/image-viewer'\nimport { Renderer } from '@/components/renderer'\nimport { Skeleton } from '@/components/skeleton'\n\nimport { computed, inject, onBeforeUnmount, reactive, ref, watch, watchEffect } from 'vue'\n\nimport { emitEvent, useLocale, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useIntersection } from '@vexip-ui/hooks'\nimport { isClient, supportImgLoading, toCssSize } from '@vexip-ui/utils'\nimport { imageProps } from './props'\nimport { GROUP_STATE, objectFitValues } from './symbol'\n\nimport type { ImageSlots, ImageState } from './symbol'\n\nconst useImgLoading = supportImgLoading()\n\ndefineOptions({ name: 'Image' })\n\nconst _props = defineProps(imageProps)\nconst props = useProps('image', _props, {\n  src: {\n    default: '',\n    static: true,\n  },\n  fallbackSrc: '',\n  alt: '',\n  fit: {\n    default: 'cover',\n    validator: value => objectFitValues.includes(value),\n  },\n  width: '',\n  height: '',\n  imgAttrs: () => ({}),\n  lazy: false,\n  root: {\n    default: null,\n    static: true,\n  },\n  rootMargin: '',\n  preview: false,\n  skeleton: false,\n  placeholder: '',\n  errorTip: '',\n  radius: 0,\n  border: false,\n  previewSrc: '',\n  viewerTransfer: null,\n  viewerProps: () => ({}),\n  slots: () => ({}),\n})\n\nconst slots = defineSlots<ImageSlots>()\n\nconst groupState = inject(GROUP_STATE, null)\n\nconst nh = useNameHelper('image')\nconst locale = useLocale('image')\n\nconst showImg = ref(useImgLoading)\nconst loading = ref(showImg.value)\nconst currentSrc = ref('')\nconst loadFail = ref(false)\nconst fallbackFail = ref(false)\nconst viewerActive = ref(false)\nconst hidden = ref(false)\n\nconst wrapper = ref<HTMLElement>()\n\nconst showError = computed(() => {\n  return loadFail.value && (!props.fallbackSrc || fallbackFail.value)\n})\nconst hasPreview = computed(() => !groupState && props.preview)\nconst className = computed(() => {\n  return [\n    nh.b(),\n    nh.bs('vars'),\n    {\n      [nh.bm('inherit')]: props.inherit,\n      [nh.bm('border')]: props.border,\n      [nh.bm('loading')]: loading.value,\n      [nh.bm('error')]: showError.value,\n      [nh.bm('preview')]: groupState?.preview || hasPreview.value,\n    },\n  ]\n})\nconst style = computed(() => {\n  const style: Record<string, string> = {\n    width: toCssSize(props.width),\n    height: toCssSize(props.height),\n    [nh.cv('fit')]: props.fit,\n    [nh.cv('radius')]: props.radius ? `${props.radius}px` : '',\n  }\n\n  if (props.border && typeof props.border === 'string') {\n    style[nh.cv('b-color')] = props.border\n  }\n\n  return style\n})\nconst imageSrc = computed(() => props.src || (props.imgAttrs?.src as string))\nconst imgLoading = computed(() => {\n  return hidden.value || (useImgLoading && props.lazy) ? 'lazy' : undefined\n})\nconst skeletonProps = computed(() => {\n  return typeof props.skeleton === 'object'\n    ? Object.assign({ activated: true }, props.skeleton)\n    : { activated: true }\n})\n\nwatch(imageSrc, value => {\n  loading.value = showImg.value\n  currentSrc.value = value\n  loadFail.value = false\n  fallbackFail.value = false\n})\nwatch(\n  () => props.fallbackSrc,\n  value => {\n    fallbackFail.value = false\n\n    if (loadFail.value) {\n      loading.value = showImg.value\n      currentSrc.value = value\n    }\n  },\n)\n\ncurrentSrc.value = imageSrc.value\n\nconst state: ImageState = reactive({\n  src: computed(() => props.previewSrc || currentSrc.value),\n  index: 0,\n  total: 0,\n})\n\nif (groupState) {\n  groupState.increaseItem(state)\n\n  const stopWatch = watchEffect(() => {\n    hidden.value = !groupState.showAll && state.index > 0\n  })\n\n  onBeforeUnmount(() => {\n    stopWatch()\n    groupState.decreaseItem(state)\n  })\n}\n\nif (!useImgLoading) {\n  let disconnect: (() => void) | undefined\n\n  const stopWatch = watchEffect(() => {\n    disconnect?.()\n    disconnect = undefined\n\n    if (!isClient) return\n\n    const root =\n      typeof props.root === 'string' ? document.querySelector(props.root) : (props.root as Element)\n\n    if (props.lazy) {\n      disconnect = useIntersection({\n        root: typeof root === 'object' ? root : document.documentElement,\n        rootMargin: props.rootMargin,\n        target: wrapper,\n        handler: () => {\n          disconnect?.()\n          disconnect = undefined\n          showImg.value = true\n          loading.value = true\n        },\n      }).disconnect\n    }\n  })\n\n  onBeforeUnmount(() => {\n    stopWatch()\n    disconnect?.()\n  })\n}\n\ndefineExpose({\n  loading,\n  fallbackFail,\n  viewerActive,\n  hidden,\n  wrapper,\n})\n\nfunction handleLoad(event: Event) {\n  loading.value = false\n\n  if (!props.fallbackSrc || currentSrc.value !== props.fallbackSrc) {\n    emitEvent(props.onLoad, event)\n  }\n}\n\nfunction handleError(event: Event) {\n  if (props.fallbackSrc) {\n    if (currentSrc.value === props.fallbackSrc) {\n      loading.value = false\n      fallbackFail.value = true\n\n      return\n    }\n\n    currentSrc.value = props.fallbackSrc\n  } else {\n    loading.value = false\n  }\n\n  loadFail.value = true\n  emitEvent(props.onError, event)\n}\n\nfunction handlePreview() {\n  if (!groupState) {\n    if (props.preview) {\n      viewerActive.value = true\n    }\n\n    emitEvent(props.onPreview, props.previewSrc || currentSrc.value)\n    return\n  }\n\n  groupState.handlePreview(state)\n}\n</script>\n\n<template>\n  <div\n    v-show=\"!hidden\"\n    ref=\"wrapper\"\n    :class=\"className\"\n    role=\"none\"\n    :style=\"style\"\n  >\n    <slot v-if=\"loading\" name=\"placeholder\">\n      <Renderer :renderer=\"props.slots.placeholder\">\n        <Skeleton\n          v-if=\"props.skeleton\"\n          v-bind=\"skeletonProps\"\n          :class=\"nh.be('skeleton')\"\n          image\n        ></Skeleton>\n        <template v-else>\n          <span :class=\"nh.be('placeholder')\">\n            {{ props.placeholder || locale.placeholder }}\n          </span>\n        </template>\n      </Renderer>\n    </slot>\n    <slot v-else-if=\"showError\" name=\"error\">\n      <Renderer :renderer=\"props.slots.error\">\n        <span :class=\"nh.be('error')\">\n          {{ props.errorTip || props.alt || locale.error }}\n        </span>\n      </Renderer>\n    </slot>\n    <img\n      v-if=\"showImg && !showError\"\n      v-bind=\"props.imgAttrs\"\n      :class=\"nh.be('img')\"\n      :src=\"currentSrc\"\n      :alt=\"props.alt\"\n      :width=\"props.width || undefined\"\n      :height=\"props.height || undefined\"\n      :loading=\"imgLoading\"\n      :aria-label=\"props.alt\"\n      @load=\"handleLoad\"\n      @error=\"handleError\"\n      @click=\"handlePreview\"\n    />\n    <ImageViewer\n      v-if=\"hasPreview\"\n      v-bind=\"viewerProps\"\n      v-model:active=\"viewerActive\"\n      :src-list=\"props.previewSrc || currentSrc\"\n      :transfer=\"props.viewerTransfer\"\n    >\n      <template v-if=\"slots.preview || props.slots.preview\" #default=\"{ src }\">\n        <slot name=\"preview\" :src=\"src\">\n          <Renderer :renderer=\"props.slots.preview\" :data=\"{ src }\"></Renderer>\n        </slot>\n      </template>\n    </ImageViewer>\n  </div>\n</template>\n"],"names":["useImgLoading","supportImgLoading","_props","__props","props","useProps","value","objectFitValues","slots","_useSlots","groupState","inject","GROUP_STATE","nh","useNameHelper","locale","useLocale","showImg","ref","loading","currentSrc","loadFail","fallbackFail","viewerActive","hidden","wrapper","showError","computed","hasPreview","className","style","toCssSize","imageSrc","_a","imgLoading","skeletonProps","watch","state","reactive","stopWatch","watchEffect","onBeforeUnmount","disconnect","isClient","root","useIntersection","__expose","handleLoad","event","emitEvent","handleError","handlePreview","_createElementBlock","_renderSlot","_ctx","_createVNode","_unref","Renderer","_createBlock","Skeleton","_mergeProps","_normalizeClass","_toDisplayString","_createElementVNode","_openBlock","ImageViewer","viewerProps","$event","_withCtx","src"],"mappings":"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"}