-import { computed } from 'vue'
+import { useImage } from '@vueuse/core'
+import { computed, useId } from 'vue'
import AssetBadgeGroup from '@/platform/assets/components/AssetBadgeGroup.vue'
import type { AssetDisplayItem } from '@/platform/assets/composables/useAssetBrowser'
@@ -94,13 +87,51 @@ const props = defineProps<{
interactive?: boolean
}>()
+const titleId = useId()
+const descId = useId()
+
+const { error } = useImage({
+ src: props.asset.preview_url ?? '',
+ alt: props.asset.name
+})
+
+const shouldShowImage = computed(() => props.asset.preview_url && !error.value)
+
+const cardClasses = computed(() => {
+ const base = [
+ 'rounded-xl',
+ 'overflow-hidden',
+ 'transition-all',
+ 'duration-200'
+ ]
+
+ if (!props.interactive) {
+ return cn(...base, 'bg-gray-100 dark-theme:bg-charcoal-800')
+ }
+
+ return cn(
+ ...base,
+ 'group',
+ 'appearance-none bg-transparent p-0 m-0',
+ 'font-inherit text-inherit outline-none cursor-pointer text-left',
+ 'bg-gray-100 dark-theme:bg-charcoal-800',
+ 'hover:bg-gray-200 dark-theme:hover:bg-charcoal-600',
+ 'border-none',
+ 'focus:outline-solid outline-blue-100 outline-4'
+ )
+})
+
const elementProps = computed(() =>
props.interactive
? {
type: 'button',
- 'aria-label': `Select asset ${props.asset.name}`
+ 'aria-labelledby': titleId,
+ 'aria-describedby': descId
+ }
+ : {
+ 'aria-labelledby': titleId,
+ 'aria-describedby': descId
}
- : {}
)
defineEmits<{