diff --git a/playground/pages/avatar.vue b/playground/pages/avatar.vue
new file mode 100644
index 00000000..0582aa8e
--- /dev/null
+++ b/playground/pages/avatar.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/runtime/components/Avatar.vue b/src/runtime/components/Avatar.vue
new file mode 100644
index 00000000..053b1671
--- /dev/null
+++ b/src/runtime/components/Avatar.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+ {{ fallback }}
+
+
+
diff --git a/src/theme/avatar.ts b/src/theme/avatar.ts
new file mode 100644
index 00000000..a82aef8a
--- /dev/null
+++ b/src/theme/avatar.ts
@@ -0,0 +1,51 @@
+export default {
+ slots: {
+ root: 'inline-flex items-center justify-center shrink-0 select-none overflow-hidden rounded-full align-middle bg-gray-100 dark:bg-gray-800',
+ image: 'h-full w-full rounded-[inherit] object-cover',
+ fallback: 'font-medium leading-none text-gray-500 dark:text-gray-400 truncate',
+ icon: 'text-gray-500 dark:text-gray-400 shrink-0'
+ },
+ variants: {
+ size: {
+ '3xs': {
+ root: 'size-4 text-[8px]',
+ icon: 'size-2'
+ },
+ '2xs': {
+ root: 'size-5 text-[10px]',
+ icon: 'size-2.5'
+ },
+ xs: {
+ root: 'size-6 text-xs',
+ icon: 'size-3'
+ },
+ sm: {
+ root: 'size-8 text-sm',
+ icon: 'size-4'
+ },
+ md: {
+ root: 'size-10 text-base',
+ icon: 'size-5'
+ },
+ lg: {
+ root: 'size-12 text-lg',
+ icon: 'size-6'
+ },
+ xl: {
+ root: 'size-14 text-xl',
+ icon: 'size-7'
+ },
+ '2xl': {
+ root: 'size-16 text-2xl',
+ icon: 'size-8'
+ },
+ '3xl': {
+ root: 'size-20 text-3xl',
+ icon: 'size-10'
+ }
+ }
+ },
+ defaultVariants: {
+ size: 'sm'
+ }
+}
\ No newline at end of file
diff --git a/src/theme/index.ts b/src/theme/index.ts
index ccdc562e..792a88b3 100644
--- a/src/theme/index.ts
+++ b/src/theme/index.ts
@@ -1,3 +1,4 @@
+export { default as avatar } from './avatar'
export { default as badge } from './badge'
export { default as button } from './button'
export { default as collapsible } from './collapsible'