Components / Linkedin
Linked In Profile
Free Linkedin React component — LinkedInProfileCard. MIT licensed, copy-paste ready for Next.js and Tailwind CSS.
LinkedIn profile card with cover photo, avatar, headline, stats, bio, and Connect/Message buttons. Professional social, component-sized.
Preview

Bidyut Kundu
Software Developer at OpenSourceUI
West Bengal, India · 500+ connections
Passionate about open-source, minimal UI, and developer tools.
42
Posts
500+
Connections
2.5yr
Experience
Setup
How to use
Free for personal and commercial use. No UI attribution required. Include the MIT copyright notice when copying component source into your project. Read the MIT license.
- 1
Run in your terminal:
$npm install clsx tailwind-merge lucide-react - 2
Copy
lib/cn.tsbelow. Skip if you already havecn(). - 3
Copy the code below and create
components/linkedin/linked-in-profile-card.tsxin your project. - 4
Import and render:
Exampleimport { LinkedInProfileCard } from "@/components/linkedin/linked-in-profile-card";
lib/cn.ts
import { type ClassValue, clsx } from "clsx";import { twMerge } from "tailwind-merge";export function cn(...inputs: ClassValue[]) {return twMerge(clsx(inputs));}
components/linkedin/linked-in-profile-card.tsx
"use client";import {forwardRef,type ComponentPropsWithoutRef,type ReactNode,} from "react";import Image from "next/image";import { cn } from "@/lib/cn";export type LinkedInProfileCardProps = Readonly<{name?: string;headline?: string;location?: string;connections?: string | number;bio?: string;posts?: string | number;experience?: string;coverImage?: string;avatar?: string;coverImageAlt?: string;avatarAlt?: string;connectLabel?: string;messageLabel?: string;connectButton?: ReactNode;messageButton?: ReactNode;onConnect?: () => void;onMessage?: () => void;} & ComponentPropsWithoutRef<"div">>;// Production-ready Linked In Profile component — styled with Tailwind CSS.export const LinkedInProfileCard = forwardRef<HTMLDivElement,LinkedInProfileCardProps>(({className,name = "Bidyut Kundu",headline = "Software Developer at OpenSourceUI",location = "West Bengal, India",connections = "500+",bio = "Passionate about open-source, minimal UI, and developer tools.",posts = 42,experience = "2.5yr",coverImage = "/wallpaper-15.png",avatar = "/profile-picture.png",coverImageAlt = "LinkedIn cover image",avatarAlt = "Profile avatar",connectLabel = "Connect",messageLabel = "Message",connectButton,messageButton,onConnect,onMessage,...props},ref,) => {return (<divref={ref}data-slot="linkedin-profile-card"className={cn("w-72 overflow-hidden rounded-xl border border-neutral-100 bg-white font-sans shadow-lg",className,)}{...props}>{/* Cover */}<div className="relative h-20"><Imagesrc={coverImage}alt={coverImageAlt}fillclassName="object-cover"sizes="288px"/>{/* Avatar */}<div className="absolute -bottom-8 left-4 flex h-16 w-16 items-center justify-center rounded-full border-4 border-white bg-neutral-800 shadow"><Imagesrc={avatar}alt={avatarAlt}width={28}height={28}className="w-7"sizes="28px"/></div></div><div className="px-4 pt-10 pb-4">{/* Name */}<h4 title={name} className="mt-2 font-bold text-neutral-900">{name}</h4>{/* Headline */}<p title={headline} className="text-xs text-neutral-600">{headline}</p>{/* Location + connections */}<p className="mt-0.5 text-xs text-neutral-400">{location} · {connections} connections</p>{/* Bio */}<ptitle={bio}className="mt-2 text-xs leading-relaxed text-neutral-600">{bio}</p><div className="mt-3 flex gap-2">{connectButton ?? (<buttontype="button"aria-label={`Connect with ${name}`}onClick={onConnect}className="flex-1 cursor-pointer rounded-full bg-neutral-800 py-1.5 text-xs font-semibold text-white transition-colors hover:bg-black">{connectLabel}</button>)}{messageButton ?? (<buttontype="button"aria-label={`Message ${name}`}onClick={onMessage}className="flex-1 cursor-pointer rounded-full border border-neutral-200 py-1.5 text-xs font-medium text-neutral-600 transition-colors hover:bg-neutral-50">{messageLabel}</button>)}</div></div>{/* Stats */}<div className="flex justify-around border-t border-neutral-100 px-4 py-3 text-center"><div><p className="text-sm font-bold text-neutral-900">{posts}</p><p className="text-[10px] tracking-wide text-neutral-400 uppercase">Posts</p></div><div><p className="text-sm font-bold text-neutral-900">{connections}</p><p className="text-[10px] tracking-wide text-neutral-400 uppercase">Connections</p></div><div><p className="text-sm font-bold text-neutral-900">{experience}</p><p className="text-[10px] tracking-wide text-neutral-400 uppercase">Experience</p></div></div></div>);},);LinkedInProfileCard.displayName = "LinkedInProfileCard";