{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "avatar",
  "title": "Avatar",
  "description": "A resilient profile image with fallback, status badge, and group support.",
  "dependencies": [
    "@base-ui/react"
  ],
  "registryDependencies": [
    "@neumorphism-ui/utils"
  ],
  "files": [
    {
      "path": "src/components/ui/avatar.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\n\nimport { cn, mergeClassName } from \"@/lib/utils\";\n\nconst avatarSizes = {\n  sm: \"size-8 text-xs\",\n  default: \"size-10 text-sm\",\n  lg: \"size-12 text-base\",\n} as const;\n\ntype AvatarSize = keyof typeof avatarSizes;\n\ninterface AvatarProps extends AvatarPrimitive.Root.Props {\n  size?: AvatarSize;\n}\n\nfunction Avatar({ className, size = \"default\", ...props }: AvatarProps) {\n  return (\n    <AvatarPrimitive.Root\n      data-slot=\"avatar\"\n      data-size={size}\n      className={mergeClassName<AvatarPrimitive.Root.State>(\n        cn(\n          \"group/avatar relative flex shrink-0 rounded-full border border-[color:var(--neu-edge)] bg-[var(--neu-surface)] [box-shadow:var(--neu-shadow-raised-sm)]\",\n          avatarSizes[size],\n        ),\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n  return (\n    <AvatarPrimitive.Image\n      data-slot=\"avatar-image\"\n      className={mergeClassName<AvatarPrimitive.Image.State>(\n        \"aspect-square size-full rounded-full object-cover\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction AvatarFallback({\n  className,\n  ...props\n}: AvatarPrimitive.Fallback.Props) {\n  return (\n    <AvatarPrimitive.Fallback\n      data-slot=\"avatar-fallback\"\n      className={mergeClassName<AvatarPrimitive.Fallback.State>(\n        \"flex size-full items-center justify-center rounded-full bg-[var(--neu-surface)] font-semibold text-[var(--muted-foreground)] [box-shadow:none]\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n  return (\n    <span\n      data-slot=\"avatar-badge\"\n      className={cn(\n        \"absolute right-0 bottom-0 z-10 size-2.5 rounded-full border-2 border-[var(--background)] bg-[var(--primary)] group-data-[size=lg]/avatar:size-3 group-data-[size=sm]/avatar:size-2\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"avatar-group\"\n      className={cn(\n        \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-[var(--background)]\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction AvatarGroupCount({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"avatar-group-count\"\n      className={cn(\n        \"relative flex size-10 shrink-0 items-center justify-center rounded-full border border-[color:var(--neu-edge)] bg-[var(--neu-surface)] text-sm font-semibold text-[var(--muted-foreground)] ring-2 ring-[var(--background)] [box-shadow:var(--neu-shadow-raised-sm)] group-has-data-[size=lg]/avatar-group:size-12 group-has-data-[size=sm]/avatar-group:size-8\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Avatar,\n  AvatarBadge,\n  AvatarFallback,\n  AvatarGroup,\n  AvatarGroupCount,\n  AvatarImage,\n  avatarSizes,\n};\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}