{"version":3,"file":"image.mjs","sources":["../../../../../../../packages/components/image/src/image.tsx"],"sourcesContent":["import {\n  type CSSProperties,\n  type ExtractPropTypes,\n  type ImgHTMLAttributes,\n  type PropType,\n  type Slot,\n  computed,\n  defineComponent,\n  getCurrentInstance,\n  nextTick,\n  onBeforeUnmount,\n  onMounted,\n  ref,\n  watch,\n} from 'vue'\n\n// Utils\nimport {\n  addUnit,\n  createNamespace,\n  inBrowser,\n  isDef,\n  makeObjectProp,\n  // makeStringProp,\n  numericProp,\n  truthProp,\n} from '@xzx-design/utils'\n\n// Components\nimport { Icon } from '@xzx-design/components/icon'\nimport { Caution, Pic } from '@xzx-design/icons-vue'\n\n// Types\nimport type { ImageFit, ImagePosition } from './types'\nimport type { IconsComponent } from '@xzx-design/components/icon'\n\nconst [name, bem] = createNamespace('image')\n\nexport const imageProps = {\n  src: String,\n  alt: String,\n  fit: String as PropType<ImageFit>,\n  position: String as PropType<ImagePosition>,\n  round: Boolean,\n  block: Boolean,\n  width: numericProp,\n  height: numericProp,\n  radius: numericProp,\n  lazyLoad: Boolean,\n  iconSize: numericProp,\n  showError: truthProp,\n  errorIcon: makeObjectProp<IconsComponent>(Caution),\n  iconPrefix: String,\n  showLoading: truthProp,\n  loadingIcon: makeObjectProp<IconsComponent>(Pic),\n  crossorigin: String as PropType<ImgHTMLAttributes['crossorigin']>,\n  referrerpolicy: String as PropType<ImgHTMLAttributes['referrerpolicy']>,\n}\n\nexport type ImageProps = ExtractPropTypes<typeof imageProps>\n\nexport default defineComponent({\n  name,\n\n  props: imageProps,\n\n  emits: ['load', 'error'],\n\n  setup(props, { emit, slots }) {\n    const error = ref(false)\n    const loading = ref(true)\n    const imageRef = ref<HTMLImageElement>()\n\n    const { $Lazyload } = getCurrentInstance()!.proxy as any\n\n    const style = computed(() => {\n      const style: CSSProperties = {\n        width: addUnit(props.width),\n        height: addUnit(props.height),\n      }\n\n      if (isDef(props.radius)) {\n        style.overflow = 'hidden'\n        style.borderRadius = addUnit(props.radius)\n      }\n\n      return style\n    })\n\n    watch(\n      () => props.src,\n      () => {\n        error.value = false\n        loading.value = true\n      }\n    )\n\n    const onLoad = (event: Event) => {\n      if (loading.value) {\n        loading.value = false\n        emit('load', event)\n      }\n    }\n\n    const triggerLoad = () => {\n      const loadEvent = new Event('load')\n      Object.defineProperty(loadEvent, 'target', {\n        value: imageRef.value,\n        enumerable: true,\n      })\n      onLoad(loadEvent)\n    }\n\n    const onError = (event?: Event) => {\n      error.value = true\n      loading.value = false\n      emit('error', event)\n    }\n\n    const renderIcon = (\n      defIcon: IconsComponent,\n      className: unknown,\n      slot?: Slot\n    ) => {\n      if (slot) {\n        return slot()\n      }\n      const IconComp = defIcon\n      return (\n        <Icon\n          name={name}\n          size={props.iconSize}\n          class={className}\n          classPrefix={props.iconPrefix}\n        >\n          <IconComp />\n        </Icon>\n      )\n    }\n\n    const renderPlaceholder = () => {\n      if (loading.value && props.showLoading) {\n        return (\n          <div class={bem('loading')}>\n            {renderIcon(props.loadingIcon, bem('loading-icon'), slots.loading)}\n          </div>\n        )\n      }\n      if (error.value && props.showError) {\n        return (\n          <div class={bem('error')}>\n            {renderIcon(props.errorIcon, bem('error-icon'), slots.error)}\n          </div>\n        )\n      }\n    }\n\n    const renderImage = () => {\n      if (error.value || !props.src) {\n        return\n      }\n\n      const attrs = {\n        alt: props.alt,\n        class: bem('img'),\n        style: {\n          objectFit: props.fit,\n          objectPosition: props.position,\n        },\n        crossorigin: props.crossorigin,\n        referrerpolicy: props.referrerpolicy,\n      }\n\n      if (props.lazyLoad) {\n        return <img ref={imageRef} v-lazy={props.src} {...attrs} />\n      }\n\n      return (\n        <img\n          ref={imageRef}\n          src={props.src}\n          onLoad={onLoad}\n          onError={onError}\n          {...attrs}\n        />\n      )\n    }\n\n    const onLazyLoaded = ({ el }: { el: HTMLElement }) => {\n      const check = () => {\n        if (el === imageRef.value && loading.value) {\n          triggerLoad()\n        }\n      }\n      if (imageRef.value) {\n        check()\n      } else {\n        // LazyLoad may trigger loaded event before Image mounted\n        // https://github.com/vant-ui/vant/issues/10046\n        nextTick(check)\n      }\n    }\n\n    const onLazyLoadError = ({ el }: { el: HTMLElement }) => {\n      if (el === imageRef.value && !error.value) {\n        onError()\n      }\n    }\n\n    if ($Lazyload && inBrowser) {\n      $Lazyload.$on('loaded', onLazyLoaded)\n      $Lazyload.$on('error', onLazyLoadError)\n\n      onBeforeUnmount(() => {\n        $Lazyload.$off('loaded', onLazyLoaded)\n        $Lazyload.$off('error', onLazyLoadError)\n      })\n    }\n\n    // In nuxt3, the image may not trigger load event,\n    // so the initial complete state should be checked.\n    // https://github.com/youzan/vant/issues/11335\n    onMounted(() => {\n      nextTick(() => {\n        if (imageRef.value?.complete && !props.lazyLoad) {\n          triggerLoad()\n        }\n      })\n    })\n\n    return () => (\n      <div\n        class={bem({ round: props.round, block: props.block })}\n        style={style.value}\n      >\n        {renderImage()}\n        {renderPlaceholder()}\n        {slots.default?.()}\n      </div>\n    )\n  },\n})\n"],"names":["name","bem","createNamespace","imageProps","src","String","alt","fit","position","round","Boolean","block","width","numericProp","height","radius","lazyLoad","iconSize","showError","truthProp","errorIcon","makeObjectProp","Caution","iconPrefix","showLoading","loadingIcon","Pic","crossorigin","referrerpolicy","defineComponent","props","emits","setup","emit","slots","error","ref","loading","imageRef","$Lazyload","getCurrentInstance","proxy","style","computed","addUnit","isDef","overflow","borderRadius","watch","value","onLoad","event","triggerLoad","loadEvent","Event","Object","defineProperty","enumerable","onError","renderIcon","defIcon","className","slot","IconComp","_createVNode","Icon","default","renderPlaceholder","renderImage","attrs","class","objectFit","objectPosition","_withDirectives","_mergeProps","_resolveDirective","onLazyLoaded","el","check","nextTick","onLazyLoadError","inBrowser","$on","onBeforeUnmount","$off","onMounted","complete"],"mappings":"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"}