skeleton-img.js 1.29 KB
import { extend, mergeData } from '../../vue'
import { NAME_SKELETON_IMG } from '../../constants/components'
import { PROP_TYPE_BOOLEAN, PROP_TYPE_STRING } from '../../constants/props'
import { makeProp, makePropsConfigurable } from '../../utils/props'
import { BAspect } from '../aspect'
import { BSkeleton } from './skeleton'

// --- Props ---

export const props = makePropsConfigurable(
  {
    animation: makeProp(PROP_TYPE_STRING),
    aspect: makeProp(PROP_TYPE_STRING, '16:9'),
    cardImg: makeProp(PROP_TYPE_STRING),
    height: makeProp(PROP_TYPE_STRING),
    noAspect: makeProp(PROP_TYPE_BOOLEAN, false),
    variant: makeProp(PROP_TYPE_STRING),
    width: makeProp(PROP_TYPE_STRING)
  },
  NAME_SKELETON_IMG
)

// --- Main component ---

// @vue/component
export const BSkeletonImg = /*#__PURE__*/ extend({
  name: NAME_SKELETON_IMG,
  functional: true,
  props,
  render(h, { data, props }) {
    const { aspect, width, height, animation, variant, cardImg } = props

    const $img = h(
      BSkeleton,
      mergeData(data, {
        props: {
          type: 'img',
          width,
          height,
          animation,
          variant
        },
        class: { [`card-img-${cardImg}`]: cardImg }
      })
    )

    return props.noAspect ? $img : h(BAspect, { props: { aspect } }, [$img])
  }
})