2025-11-21 12:18:04 +01:00
|
|
|
<script lang="ts">
|
|
|
|
|
import { Skeleton } from '@cio/ui/base/skeleton';
|
|
|
|
|
|
|
|
|
|
let { src, className, alt }: { src: string | undefined; className?: string; alt?: string } = $props();
|
|
|
|
|
|
|
|
|
|
function loadImage(src: string | undefined): Promise<void> {
|
|
|
|
|
if (!src) return Promise.reject();
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
const img = new Image();
|
|
|
|
|
img.onload = () => resolve();
|
|
|
|
|
img.onerror = reject;
|
|
|
|
|
img.src = src;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
{#await loadImage(src)}
|
2025-12-22 02:36:48 +01:00
|
|
|
<Skeleton class={className} />
|
2025-11-21 12:18:04 +01:00
|
|
|
{:then}
|
|
|
|
|
<img {src} {alt} class={className} />
|
|
|
|
|
{:catch}
|
|
|
|
|
<div class="flex h-[200px] w-full items-center justify-center rounded bg-gray-100 dark:bg-neutral-800">
|
2025-12-22 02:36:48 +01:00
|
|
|
<p class="text-sm text-red-600">Failed to load</p>
|
2025-11-21 12:18:04 +01:00
|
|
|
</div>
|
|
|
|
|
{/await}
|