<template> <ImagePreview :url="image?.image ?? null" class="tw-inline-flex tw-h-64 tw-max-w-full tw-min-w-[320px] tw-bg-gray-700 tw-rounded tw-flex-1" v-bind="attrs" > <div class="tw-absolute tw-inset-0 tw-flex tw-items-end tw-text-white tw-bg-gradient-to-b tw-from-0% tw-to-100% tw-from-transparent tw-to-black/80" > <div v-if="!disabled" class="tw-flex tw-items-stretch tw-m-3 tw-gap-3"> <button type="button" class="btn btn-sm tw-text-white tw-backdrop-blur tw-bg-black/30 tw-ring-0 hocus:tw-bg-aura-primary/25" @click="showPicker = true" > <icon-carbon-image-search class="tw-w-6 tw-h-6" /> {{ t('imagePicker.chooseAnImage') }} </button> <button v-if="modelValue" type="button" class="btn btn-sm tw-text-white tw-ring-0 hocus:tw-bg-aura-primary/25" @click="localImageId = null" > {{ t('imagePicker.reset') }} </button> </div> </div> </ImagePreview> <ImagePickerDialog v-model="localImageId" :is-open="showPicker" @show="showPicker = $event" /> </template> <script lang="ts" setup> import { computed, ref, useAttrs } from 'vue' import { useI18n } from '@/i18n' import { useCopy } from '@/form' import { useImage } from '@/stores/images' import ImagePickerDialog from './ImagePickerDialog.vue' import ImagePreview from './ImagePreview.vue' const props = defineProps<{ modelValue: number | null disabled?: boolean }>() const emit = defineEmits<{ (e: 'update:modelValue', imageId: number | null): void }>() const attrs = useAttrs() const { t } = useI18n() const showPicker = ref(false) const localImageId = useCopy<number | null>(() => props.modelValue, { save: (value) => emit('update:modelValue', value), }) const image = useImage(computed(() => props.modelValue)) </script> <script lang="ts"> export default { inheritAttrs: false, compatConfig: { MODE: 3, }, } </script>