صورة رمزية
صورة مستخدم مع خيار بديل بالأحرف الأولى في قوائم الملفات الشخصية وسلسلة التعليقات وقوائم الفرق — مع تطبيق أسلوب «النيوبروتاليزم» الذي يتميز بالحدود السميكة.
import {
Avatar,
AvatarBadge,يعرض الـ avatar صورة المستخدم ويستبدلها بـ AvatarFallback — أحرف أولية أو أيقونة — أثناء التحميل أو عند الفشل، بلا إزاحة تخطيط. مبني على مكوّن Base UI Avatar ومصمَّم وفق وصفة النيوبروتالية: حدود سميكة، وظلال حادة، وخط عريض مع حدّ سميك 2px وأحرف أولية بخط العناوين العريض.
استخدمه عندما:
- قوائم الملف الشخصي — صورة الرأس التي تفتح إجراءات الحساب؛ انظر مثال Dropdown.
- سلاسل التعليقات وموجزات النشاط — وجه بجانب كل سطر مؤلف، مع الأحرف الأولية عند الصور المكسورة أو المفقودة.
- قوائم الفريق والأعضاء — تراكب المتعاونين بـ
AvatarGroupوحدّ الفائض بـAvatarGroupCount.
التثبيت#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/avatar.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/avatar.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/avatar.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/avatar.json
ثبّت التبعيات التالية:
pnpm add @base-ui/reactnpm install @base-ui/reactyarn add @base-ui/reactbun add @base-ui/react
انسخ الشيفرة التالية والصقها في مشروعك.
"use client"
import * as React from "react"
import { Avatar as AvatarPrimitive } from "radix-ui"
import { cn } from "@/lib/utils"
function Avatar({
className,
size = "default",
...props
}: React.ComponentProps<typeof AvatarPrimitive.Root> & {
size?: "default" | "sm" | "lg"
}) {
return (
<AvatarPrimitive.Root
data-slot="avatar"
data-size={size}
className={cn(
"group/avatar relative flex size-8 shrink-0 rounded-full border-2 select-none data-[size=lg]:size-10 data-[size=sm]:size-6",
className
)}
{...props}
/>
)
}
function AvatarImage({
className,
...props
}: React.ComponentProps<typeof AvatarPrimitive.Image>) {
return (
<AvatarPrimitive.Image
data-slot="avatar-image"
className={cn(
"aspect-square size-full rounded-full object-cover",
className
)}
{...props}
/>
)
}
function AvatarFallback({
className,
...props
}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
return (
<AvatarPrimitive.Fallback
data-slot="avatar-fallback"
className={cn(
"flex size-full items-center justify-center rounded-full bg-muted font-head text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs",
className
)}
{...props}
/>
)
}
function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
return (
<span
data-slot="avatar-badge"
className={cn(
"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none",
"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
className
)}
{...props}
/>
)
}
function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="avatar-group"
className={cn(
"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background",
className
)}
{...props}
/>
)
}
function AvatarGroupCount({
className,
...props
}: React.ComponentProps<"div">) {
return (
<div
data-slot="avatar-group-count"
className={cn(
"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
className
)}
{...props}
/>
)
}
export {
Avatar,
AvatarImage,
AvatarFallback,
AvatarGroup,
AvatarGroupCount,
AvatarBadge,
}
حدّث مسارات الاستيراد لتطابق إعداد مشروعك.
الاستخدام#
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"<Avatar>
<AvatarImage src="https://github.com/shadcn.png" />
<AvatarFallback>CN</AvatarFallback>
</Avatar>التركيب#
استخدم التركيب التالي لبناء Avatar:
Avatar
├── AvatarImage
├── AvatarFallback
└── AvatarBadgeاستخدم التركيب التالي لبناء AvatarGroup:
AvatarGroup
├── Avatar
│ ├── AvatarImage
│ ├── AvatarFallback
│ └── AvatarBadge
├── Avatar
│ ├── AvatarImage
│ ├── AvatarFallback
│ └── AvatarBadge
└── AvatarGroupCountأمثلة#
أساسي#
مكوّن أفاتار أساسي مع صورة وبديل احتياطي.
import {
Avatar,
AvatarFallback,Badge#
استخدم مكوّن AvatarBadge لإضافة شارة إلى الأفاتار. توضع الشارة في الزاوية اليمنى السفلية للأفاتار.
import {
Avatar,
AvatarBadge,استخدم خاصية className لإضافة أنماط مخصصة إلى الشارة مثل الألوان والأحجام وما إلى ذلك.
<Avatar>
<AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
<AvatarFallback>CN</AvatarFallback>
<AvatarBadge className="bg-green-600 dark:bg-green-800" />
</Avatar>Badge مع أيقونة#
يمكنك أيضًا استخدام أيقونة داخل <AvatarBadge>.
import { PlusIcon } from "lucide-react"
import {مجموعة الأفاتارات#
استخدم مكوّن AvatarGroup لإضافة مجموعة من الأفاتارات.
import {
Avatar,
AvatarFallback,عدّاد مجموعة الأفاتارات#
استخدم <AvatarGroupCount> لإضافة عدّاد إلى المجموعة.
import {
Avatar,
AvatarFallback,مجموعة الأفاتارات مع أيقونة#
يمكنك أيضًا استخدام أيقونة داخل <AvatarGroupCount>.
import { PlusIcon } from "lucide-react"
import {الأحجام#
استخدم خاصية size لتغيير حجم الأفاتار.
import {
Avatar,
AvatarFallback,قائمة منسدلة#
يمكنك استخدام مكوّن Avatar كمشغّل لقائمة منسدلة.
"use client"
import {RTL#
لتفعيل RTL في Neobrutalism، راجع دليل إعداد RTL.
"use client"
import * as React from "react"إمكانية الوصول#
الصورة الرمزية صورة، فتسري قواعد الصور: امنح AvatarImage نص alt يسمّي الشخص عندما تكون الصورة الرمزية المعرّف الوحيد، وalt="" عندما يظهر اسم مرئي بجانبها — وإلا تعلن قارئات الشاشة الاسم مرتين. أحرف AvatarFallback نص عادي يُقرأ بصوت عالٍ، فلتبقَ ذات معنى. عندما تفتح الصورة قائمة (انظر Dropdown)، ضع الاسم الميسَّر على زر المشغّل لا على الصورة.
مرجع API#
Avatar#
مكوّن Avatar هو المكوّن الجذر الذي يغلّف صورة الأفاتار والبديل الاحتياطي.
| Prop | Type | Default |
|---|---|---|
size | "default" | "sm" | "lg" | "default" |
className | string | - |
AvatarImage#
يعرض مكوّن AvatarImage صورة الأفاتار. يقبل جميع props الخاصة بـ Base UI Avatar Image.
| Prop | Type | Default |
|---|---|---|
src | string | - |
alt | string | - |
className | string | - |
AvatarFallback#
يعرض مكوّن AvatarFallback بديلاً احتياطيًا عند فشل تحميل الصورة. يقبل جميع props الخاصة بـ Base UI Avatar Fallback.
| Prop | Type | Default |
|---|---|---|
className | string | - |
AvatarBadge#
يعرض مكوّن AvatarBadge مؤشّر شارة على الأفاتار، يوضع عادةً في الزاوية اليمنى السفلية.
| Prop | Type | Default |
|---|---|---|
className | string | - |
AvatarGroup#
يعرض مكوّن AvatarGroup مجموعة من الأفاتارات بتنسيق متداخل.
| Prop | Type | Default |
|---|---|---|
className | string | - |
AvatarGroupCount#
يعرض مكوّن AvatarGroupCount مؤشّر عدّاد في مجموعة أفاتارات، يعرض عادةً عدد الأفاتارات الإضافية.
| Prop | Type | Default |
|---|---|---|
className | string | - |
لمزيد من المعلومات حول props الخاصة بـ Base UI Avatar، راجع وثائق Base UI.