{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "profile-card", "type": "registry:ui", "title": "Profile Card", "description": "A glassmorphic profile card with two variants — full-bleed image overlay and split half layout. Includes follow button, favorite toggle, and verified badge.", "dependencies": [ "lucide-react" ], "files": [ { "path": "registry/ruixenui/profile-card.tsx", "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport Image from \"next/image\";\nimport { BadgeCheck, UserRound, Images, Heart, Plus } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\n/* ── Types ── */\n\ninterface ProfileCardProps {\n variant: \"full\" | \"half\";\n image: string;\n name: string;\n bio: string;\n followers: number;\n posts: number;\n verified?: boolean;\n onFollow?: () => void;\n onFavorite?: (favorited: boolean) => void;\n className?: string;\n}\n\n/* ── Constants ── */\n\nconst shell = [\n \"group w-full rounded-[40px] p-2.5\",\n \"bg-white dark:bg-neutral-900\",\n \"shadow-[0_2px_4px_-1px_rgba(0,0,0,0.06),0_12px_48px_-8px_rgba(0,0,0,0.12)]\",\n \"dark:shadow-[0_2px_4px_-1px_rgba(0,0,0,0.3),0_12px_48px_-8px_rgba(0,0,0,0.5)]\",\n];\n\nconst BLUR_MASK =\n \"linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.02) 10%, rgba(0,0,0,0.06) 20%, rgba(0,0,0,0.14) 30%, rgba(0,0,0,0.28) 40%, rgba(0,0,0,0.5) 50%, rgba(0,0,0,0.72) 60%, rgba(0,0,0,0.9) 70%, black 80%)\";\n\n/* ── Component ── */\n\nexport function ProfileCard({\n variant,\n image,\n name,\n bio,\n followers,\n posts,\n verified = true,\n onFollow,\n onFavorite,\n className,\n}: ProfileCardProps) {\n const [favorited, setFavorited] = useState(false);\n\n const toggleFavorite = () => {\n const next = !favorited;\n setFavorited(next);\n onFavorite?.(next);\n };\n\n /* ── Full variant ── */\n if (variant === \"full\") {\n return (\n
\n {bio}\n
\n\n\n {bio}\n
\n