66 lines
1.4 KiB
Vue
66 lines
1.4 KiB
Vue
<script lang="ts" setup>
|
|
import type { ThemeImage } from '../../shared/index.js'
|
|
import { computed } from 'vue'
|
|
import { withBase } from 'vuepress/client'
|
|
import { numToUnit } from '../utils/index.js'
|
|
|
|
const { image, alt } = defineProps<{
|
|
image: ThemeImage
|
|
alt?: string
|
|
}>()
|
|
|
|
const styles = computed(() => {
|
|
if (!image || typeof image === 'string')
|
|
return ''
|
|
if (!image.width || !image.height)
|
|
return ''
|
|
return {
|
|
width: numToUnit(image.width),
|
|
height: numToUnit(image.height),
|
|
}
|
|
})
|
|
</script>
|
|
|
|
<script lang="ts">
|
|
export default {
|
|
inheritAttrs: false,
|
|
} as { inheritAttrs: boolean }
|
|
</script>
|
|
|
|
<template>
|
|
<template v-if="image">
|
|
<img
|
|
v-if="typeof image === 'string' || 'src' in image"
|
|
class="vp-image"
|
|
:style="styles"
|
|
v-bind="typeof image === 'string' ? $attrs : { ...image, ...$attrs }"
|
|
:src="withBase(typeof image === 'string' ? image : image.src)"
|
|
:alt="alt ?? (typeof image === 'string' ? '' : image.alt || '')"
|
|
>
|
|
<template v-else>
|
|
<VPImage
|
|
class="dark"
|
|
:image="image.dark"
|
|
:alt="image.alt"
|
|
v-bind="$attrs"
|
|
/>
|
|
<VPImage
|
|
class="light"
|
|
:image="image.light"
|
|
:alt="image.alt"
|
|
v-bind="$attrs"
|
|
/>
|
|
</template>
|
|
</template>
|
|
</template>
|
|
|
|
<style scoped>
|
|
html:not([data-theme="dark"]) .vp-image.dark {
|
|
display: none;
|
|
}
|
|
|
|
[data-theme="dark"] .vp-image.light {
|
|
display: none;
|
|
}
|
|
</style>
|