پرش به محتوا

آواتار

تصویر کاربری با امکان استفاده از حروف اول نام به‌عنوان جایگزین برای منوهای پروفایل، رشته‌های نظرات و فهرست‌های تیم — با جلوه‌ی neobrutalist و حاشیه‌ی ضخیم.

import {
  Avatar,
  AvatarBadge,

آواتار تصویر کاربر را نشان می‌دهد و هنگام بارگذاری یا شکست تصویر، AvatarFallback — حروف اول یا آیکون — را جایگزین می‌کند، بدون جابه‌جایی layout. بر پایهٔ Base UI Avatar ساخته شده و با دستور پخت نئوبروتالیستی استایل شده: حاشیهٔ ضخیم 2px و حروف اول با تایپ heading پررنگ.

برای این موارد از آن استفاده کنید:

  • منوهای پروفایل — آواتار سربرگ که اقدامات حساب را باز می‌کند؛ نمونهٔ Dropdown را ببینید.
  • رشته‌های نظر و فید فعالیت — یک چهره کنار هر خط نویسنده، با حروف اول برای عکس‌های خراب یا گم‌شده.
  • فهرست تیم و اعضا — همکاران را با AvatarGroup هم‌پوشان کنید و سرریز را با AvatarGroupCount محدود کنید.

نصب

pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/avatar.json
npx shadcn@latest add https://neobrutalism.com/r/base/avatar.json
yarn dlx shadcn@latest add https://neobrutalism.com/r/base/avatar.json
bunx --bun shadcn@latest add https://neobrutalism.com/r/base/avatar.json

وابستگی‌های زیر را نصب کنید:

pnpm add @base-ui/react
npm install @base-ui/react
yarn add @base-ui/react
bun add @base-ui/react

کد زیر را کپی کنید و در پروژهٔ خود بچسبانید.

components/ui/avatar.tsx
"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 را متناسب با ساختار پروژهٔ خود به‌روزرسانی کنید.

استفاده

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

نمونه‌ها

پایه

یک کامپوننت آواتار پایه با یک تصویر و یک جایگزین.

NB
import {
  Avatar,
  AvatarFallback,

Badge

از کامپوننت AvatarBadge برای افزودن یک badge به آواتار استفاده کنید. badge در گوشهٔ پایین-راست آواتار قرار می‌گیرد.

import {
  Avatar,
  AvatarBadge,

از پراپ className برای افزودن استایل‌های سفارشی به badge مانند رنگ‌ها، اندازه‌ها و غیره استفاده کنید.

<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 کامپوننت ریشه‌ای است که تصویر آواتار و جایگزین را در بر می‌گیرد.

PropTypeDefault
size"default" | "sm" | "lg""default"
classNamestring-

AvatarImage

کامپوننت AvatarImage تصویر آواتار را نمایش می‌دهد. همهٔ پراپ‌های Base UI Avatar Image را می‌پذیرد.

PropTypeDefault
srcstring-
altstring-
classNamestring-

AvatarFallback

کامپوننت AvatarFallback هنگام ناموفق بودن بارگذاری تصویر یک جایگزین نمایش می‌دهد. همهٔ پراپ‌های Base UI Avatar Fallback را می‌پذیرد.

PropTypeDefault
classNamestring-

AvatarBadge

کامپوننت AvatarBadge یک نشانگر badge روی آواتار نمایش می‌دهد که معمولاً در پایین-راست قرار می‌گیرد.

PropTypeDefault
classNamestring-

AvatarGroup

کامپوننت AvatarGroup یک گروه از آواتارها را با استایل هم‌پوشان نمایش می‌دهد.

PropTypeDefault
classNamestring-

AvatarGroupCount

کامپوننت AvatarGroupCount یک نشانگر شمارنده در یک گروه آواتار نمایش می‌دهد که معمولاً تعداد آواتارهای اضافی را نشان می‌دهد.

PropTypeDefault
classNamestring-

برای اطلاعات بیشتر دربارهٔ پراپ‌های Base UI Avatar، مستندات Base UI را ببینید.