CNL2
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
export default function AvatarDemo() {
return (
<div className="flex justify-center gap-3">
<Avatar>
<AvatarImage src="https://github.com/vercel.png" alt="@logic2b" />
<AvatarFallback>CN</AvatarFallback>
</Avatar>
<Avatar>
<AvatarFallback>L2</AvatarFallback>
</Avatar>
</div>
)
}Installation
npx logic2b@latest add avatarWorking with an AI assistant? Copy this prompt into Claude Code, Cursor or Copilot — it carries the install steps, a no-CLI fallback and a verification checklist.
Add the "avatar" item from the logic2b ui registry (https://ui.logic2b.com) to this project. Follow every step and verify at the end. ## Steps 1. If the project has no `components.json` yet, set up logic2b ui first: ```bash npx logic2b@latest init ``` 2. Install the item (the CLI resolves registry dependencies automatically): ```bash npx logic2b@latest add avatar ``` 3. Install any npm dependencies the command prints. ## If the CLI is not available Do it manually from the registry payload: 1. Fetch https://ui.logic2b.com/r/avatar.json. 2. Write every entry in `files[]` to its mapped project path (see below). 3. Repeat (recursively) for each name in `registryDependencies`. 4. Install every package listed in `dependencies` across those payloads. ## Registry reference - Index of every item: https://ui.logic2b.com/r/index.json - Item payload (full source): https://ui.logic2b.com/r/<name>.json - Usage examples per item: https://ui.logic2b.com/r/demos/index.json → https://ui.logic2b.com/r/demos/<demo>.json - Docs index for agents: https://ui.logic2b.com/llms.txt (full docs: https://ui.logic2b.com/llms-full.txt) - Every docs page is Markdown when you append `.md` to its URL. Registry file paths map to project paths like this: - `ui/*` → `@/components/ui/*` - `blocks/<name>/*` → `@/components/*` - `charts/*` → `@/components/charts/*` - `hooks/*` → `@/hooks/*` - `lib/utils.ts` → `@/lib/utils.ts` - `theme.css` → next to the project's Tailwind entry stylesheet ## Conventions (do not break these) - Tailwind CSS v4 (CSS-first config; no tailwind.config.js needed) and React 19. - All colors go through semantic tokens (`bg-primary`, `text-muted-foreground`, `border-border`, …). Never hardcode hex/oklch values in components. - Dark mode is class-based: toggle `.dark` on `<html>`. - Icons come from lucide-react. ## Verify before finishing 1. The dev server starts and the app renders without console errors. 2. TypeScript compiles (`tsc --noEmit` or the framework's check). 3. Components use the theme: a `<Button>` shows the primary token color, and toggling `.dark` on `<html>` switches the palette.
Install the dependencies:
npm install radix-uiCopy into 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,
...props
}: React.ComponentProps<typeof AvatarPrimitive.Root>) {
return (
<AvatarPrimitive.Root
data-slot="avatar"
className={cn(
"relative flex size-8 shrink-0 overflow-hidden rounded-full",
className
)}
{...props}
/>
)
}
function AvatarImage({
className,
...props
}: React.ComponentProps<typeof AvatarPrimitive.Image>) {
return (
<AvatarPrimitive.Image
data-slot="avatar-image"
className={cn("aspect-square size-full", className)}
{...props}
/>
)
}
function AvatarFallback({
className,
...props
}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
return (
<AvatarPrimitive.Fallback
data-slot="avatar-fallback"
className={cn(
"bg-muted flex size-full items-center justify-center rounded-full",
className
)}
{...props}
/>
)
}
export { Avatar, AvatarImage, AvatarFallback }Usage
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
<Avatar>
<AvatarImage src="https://github.com/vercel.png" alt="@logic2b" />
<AvatarFallback>CN</AvatarFallback>
</Avatar>
API
| Prop | Type | Default |
|---|---|---|
src (AvatarImage) |
string — image source |
— |
alt (AvatarImage) |
string |
— |
onLoadingStatusChange (AvatarImage) |
(status: "idle" | "loading" | "loaded" | "error") => void |
— |
delayMs (AvatarFallback) |
number — wait before showing the fallback |
— |
Avatar, AvatarImage, and AvatarFallback also forward standard element props. Size the avatar with a className (e.g. size-12).
Examples
Group
Overlap several avatars to represent a set of users.
VCABCD+3
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
export default function AvatarGroupDemo() {
return (
<div className="flex -space-x-2">
<Avatar className="ring-background ring-2">
<AvatarImage src="https://github.com/vercel.png" alt="@vercel" />
<AvatarFallback>VC</AvatarFallback>
</Avatar>
<Avatar className="ring-background ring-2">
<AvatarFallback>AB</AvatarFallback>
</Avatar>
<Avatar className="ring-background ring-2">
<AvatarFallback>CD</AvatarFallback>
</Avatar>
<Avatar className="ring-background ring-2">
<AvatarFallback>+3</AvatarFallback>
</Avatar>
</div>
)
}Fallback
When the image is missing or fails to load, the fallback is shown.
L2UI
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
export default function AvatarFallbackDemo() {
return (
<div className="flex items-center gap-3">
<Avatar className="size-12">
<AvatarImage src="/does-not-exist.png" alt="Broken source" />
<AvatarFallback>L2</AvatarFallback>
</Avatar>
<Avatar className="size-12">
<AvatarFallback>UI</AvatarFallback>
</Avatar>
</div>
)
}