Components
- Accordion new
- ActionSheet new
- Alert new
- Alert Dialog new
- Angle Slider new
- Autocomplete new
- Avatar new
- Badge new
- Breadcrumb new
- Button new
- Button Group new
- Card new
- Carousel new
- Checkbox new
- Clipboard new
- Collapsible new
- Color Picker new
- Date Input new
- Date Picker new
- Dialog new
- DialogCaller new
- Drawer beta
- Editable new
- Empty new
- Field new
- Fieldset new
- File Upload new
- Filters new
- Floating Panel new
- Hover Card new
- Image new
- Image Cropper new
- Input new
- Input Group new
- Json Tree View new
- Kbd new
- Listbox new
- Marquee new
- Menu new
- Number Input new
- Pagination new
- Password Input new
- PhoneField new
- Pin Input new
- Popover new
- Progress Circular new
- Progress Linear new
- Qr Code new
- Radio Group new
- Rating Group new
- Scroll Area new
- ScrollSpy new
- Segment Group new
- Select new
- Separator new
- Sidebar new
- Signature Pad new
- Skeleton new
- Slider new
- Splitter new
- Steps new
- Switch new
- Table new
- Tabs new
- Tags Input new
- Textarea new
- Timeline new
- Timer new
- Toast new
- Toc new
- Toggle new
- Toggle Group new
- Tooltip new
- Tour new
- Tree View new
- Typography new
Features
- Loading states — Automatic detection of loading, error, and success states
- Fallback support — Display placeholder content during loading or on error
- Composable — Flexible slot-based architecture with
Image.Source,Image.Loading,Image.Error, andImage.Fallback - Zag-powered — State machine API via
useImageandImage.Provider
Installation
Install from the Vuzeno registry:
bunx --bun shadcn-vue@latest add https://vuzeno.com/r/image.json
npx shadcn-vue@latest add https://vuzeno.com/r/image.json
yarn dlx shadcn-vue@latest add https://vuzeno.com/r/image.json
pnpm dlx shadcn-vue@latest add https://vuzeno.com/r/image.json
Usage
<script setup lang="ts">
import { Image } from "@/components/ui/image";
import { Skeleton } from "@/components/ui/skeleton";
</script>
<template>
<Image.Root>
<Image.Source class="aspect-video w-72" src="https://picsum.photos/id/229/600/400" alt="..." />
<Image.Loading as-child>
<Skeleton class="aspect-video w-72" />
</Image.Loading>
<Image.Error>
<div class="bg-destructive p-2 text-center text-destructive-foreground">
An error occurred while loading the image.
</div>
</Image.Error>
</Image.Root>
</template>
Composition
Image.Root
├── Image.Source
├── Image.Loading
├── Image.Error
└── Image.Fallback
Examples
Fallback
Use Image.Fallback to display a placeholder while the image is loading or when it fails to load.
Loading
Use Image.Loading to show a dedicated loading indicator.
Controlled
For a controlled image, manage the state with v-model:state. When controlled, image load and error events no longer update the state automatically — use setState from useImage or bind the model yourself.
API
Built with a custom Zag.js state machine. Use useImage() with Image.Provider for imperative control (api.value.setState(...), api.value.state). Polymorphic parts use Ark UI ark / as-child.