{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "linkedin-post",
  "version": "3.1.0",
  "category": "social",
  "meta": {
    "preview": "https://ui.manifest.build/previews/linkedin-post.png",
    "version": "3.1.0",
    "changelog": {
      "1.0.0": "Initial release with professional styling",
      "1.0.2": "Added comprehensive JSDoc documentation",
      "1.1.0": "Moved to social category for better organization",
      "1.1.1": "Updated Props interface with decorative header and sub-parameter JSDoc documentation",
      "2.0.0": "BREAKING: Simplified component - removed engagement stats and action buttons, added LinkedIn icon link and optional repost button",
      "2.1.0": "Added image support, engagement stats with reaction icons, expandable content with maxLines prop, and moved repost button to the right",
      "2.1.1": "Fixed avatar circle visibility - now hides entirely when avatar prop is not provided",
      "3.0.0": "BREAKING: Moved postUrl and repostUrl from actions to data prop",
      "3.0.1": "Fixed JSX namespace deprecation and removed dynamic Tailwind class",
      "3.1.0": "Added demo data defaults - component renders demo content when no data prop is provided"
    }
  },
  "changelog": {
    "1.0.0": "Initial release with professional styling",
    "1.0.2": "Added comprehensive JSDoc documentation",
    "1.1.0": "Moved to social category for better organization",
    "1.1.1": "Updated Props interface with decorative header and sub-parameter JSDoc documentation",
    "2.0.0": "BREAKING: Simplified component - removed engagement stats and action buttons, added LinkedIn icon link and optional repost button",
    "2.1.0": "Added image support, engagement stats with reaction icons, expandable content with maxLines prop, and moved repost button to the right",
    "2.1.1": "Fixed avatar circle visibility - now hides entirely when avatar prop is not provided",
    "3.0.0": "BREAKING: Moved postUrl and repostUrl from actions to data prop",
    "3.0.1": "Fixed JSX namespace deprecation and removed dynamic Tailwind class",
    "3.1.0": "Added demo data defaults - component renders demo content when no data prop is provided"
  },
  "title": "LinkedIn Post",
  "author": "MNFST, Inc",
  "description": "LinkedIn post card with professional styling.",
  "dependencies": [
    "lucide-react"
  ],
  "files": [
    {
      "path": "registry/social/linkedin-post.tsx",
      "content": "'use client';\n\nimport { Repeat2 } from 'lucide-react';\nimport type { JSX } from 'react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { demoLinkedInPost } from './demo/social';\n\n/** Reaction type for LinkedIn posts */\ntype ReactionType = 'like' | 'celebrate' | 'support' | 'love' | 'insightful' | 'funny';\n\n/**\n * ═══════════════════════════════════════════════════════════════════════════\n * LinkedInPostProps\n * ═══════════════════════════════════════════════════════════════════════════\n *\n * Props for the LinkedInPost component, which displays a LinkedIn-style\n * post with professional author info.\n */\nexport interface LinkedInPostProps {\n  data?: {\n    /** Author's display name. */\n    author?: string;\n    /** Author's professional headline or title. */\n    headline?: string;\n    /** Avatar letter fallback or image URL for the profile picture. */\n    avatar?: string;\n    /** Post text content (supports line breaks and hashtags). */\n    content?: string;\n    /** Time since posted (e.g., \"2h\"). */\n    time?: string;\n    /** Optional image URL for the post. */\n    image?: string;\n    /** Number of reactions (e.g., \"1,234\" or \"1.2K\"). */\n    reactions?: string;\n    /** Top reaction types to display (max 3 icons shown). */\n    topReactions?: ReactionType[];\n    /** Number of comments (e.g., \"56\"). */\n    comments?: string;\n    /** Number of reposts (e.g., \"12\"). */\n    reposts?: string;\n    /** URL to the original LinkedIn post. If provided, shows the LinkedIn icon. */\n    postUrl?: string;\n    /** URL for the repost action. If provided, shows the repost button in footer. */\n    repostUrl?: string;\n  };\n  appearance?: {\n    /** Maximum number of lines to show before truncating. @default 3 */\n    maxLines?: number;\n  };\n}\n\n/** Parses content and styles hashtags and links */\nfunction formatContent(content: string): React.ReactNode[] {\n  // Regex to match hashtags and URLs\n  const pattern = /(#\\w+)|(https?:\\/\\/[^\\s]+)/g;\n  const parts: React.ReactNode[] = [];\n  let lastIndex = 0;\n  let match;\n\n  while ((match = pattern.exec(content)) !== null) {\n    // Add text before the match\n    if (match.index > lastIndex) {\n      parts.push(content.slice(lastIndex, match.index));\n    }\n\n    const hashtag = match[1];\n    const url = match[2];\n\n    if (hashtag) {\n      // Style hashtag\n      parts.push(\n        <span key={match.index} className=\"font-semibold\" style={{ color: '#0a66c2' }}>\n          {hashtag}\n        </span>\n      );\n    } else if (url) {\n      // Style link\n      parts.push(\n        <a\n          key={match.index}\n          href={url}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"font-semibold hover:underline\"\n          style={{ color: '#0a66c2' }}\n        >\n          {url}\n        </a>\n      );\n    }\n\n    lastIndex = pattern.lastIndex;\n  }\n\n  // Add remaining text\n  if (lastIndex < content.length) {\n    parts.push(content.slice(lastIndex));\n  }\n\n  return parts;\n}\n\n/** LinkedIn logo icon component */\nfunction LinkedInIcon({ className }: { className?: string }) {\n  return (\n    <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n      <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n    </svg>\n  );\n}\n\n/** Reaction icon components - Official LinkedIn reaction SVGs */\nconst reactionIcons: Record<ReactionType, JSX.Element> = {\n  like: (\n    <svg viewBox=\"0 0 48 48\" className=\"h-5 w-5\">\n      <circle cx=\"24\" cy=\"24\" r=\"22\" fill=\"#378fe9\" />\n      <path\n        d=\"M25.22 19.08H11.76A2.7 2.7 0 009 22a2.85 2.85 0 002.91 2.67h.5A2.43 2.43 0 0010 27.18a2.52 2.52 0 002.31 2.5 2.51 2.51 0 001.05 4.45 2.54 2.54 0 00-.19 1.87 2.69 2.69 0 002.66 2H23a11.51 11.51 0 002.8-.37l4.52-1.32c.27-.08 4.19 0 6 0 3.15-.12 4-14.57 0-14.57 0 0-1.45.05-1.73 0s-.46-.6-1.25-1.45l-.07-.09c-1.15-1.24-2.45-2.85-3.37-3.75-2.24-2.19-4.08-4.07-5.38-6.92-.73-1.62-.81-2.35-2.35-2.35a2.45 2.45 0 00-2.1 2.56 23.77 23.77 0 00.32 2.52 23.64 23.64 0 003.1 6.92\"\n        fill=\"#d0e8ff\"\n        fillRule=\"evenodd\"\n      />\n      <path\n        d=\"M25.22 19.08H11.76a2.76 2.76 0 00-2.76 3 2.84 2.84 0 002.92 2.64h.5a2.43 2.43 0 00-2.37 2.51 2.52 2.52 0 002.31 2.5h0a2.51 2.51 0 001.05 4.45 2.51 2.51 0 00-.24 1.82 2.69 2.69 0 002.66 2H23a12.08 12.08 0 002.8-.36l4.52-1.32c.27-.08 4.19 0 6 0 3.15-.12 4-14.57 0-14.57h-1.73c-.28 0-.46-.59-1.25-1.44l-.07-.09c-1.15-1.25-2.45-2.85-3.37-3.76-2.24-2.18-4.08-4.06-5.38-6.92-.73-1.61-.81-2.41-2.35-2.34a2.32 2.32 0 00-1.58.8 2.35 2.35 0 00-.52 1.71 23.45 23.45 0 00.32 2.52 23.32 23.32 0 003.1 6.89\"\n        fill=\"none\"\n        stroke=\"#004182\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n    </svg>\n  ),\n  celebrate: (\n    <svg viewBox=\"0 0 48 48\" className=\"h-5 w-5\">\n      <circle cx=\"24\" cy=\"24\" r=\"22\" fill=\"#6dae4f\" />\n      <path\n        d=\"M45.57 31l-1.42-1.07s-.59-5.63-1.61-6.71a18.45 18.45 0 01-3.81-7.49c-.49-1.67-.83-2.26-2.33-2.29a2.29 2.29 0 00-2 2.52 17.11 17.11 0 00.21 2.25c.55 2.92 1.15 5.31 1.23 5.45L22.3 13.53c-1-.77-2.49-1.11-3.49.22s-.19 2.55.83 3.32l7.07 5.32L28.83 24l-11.32-8.53c-1-.77-2.49-1.11-3.48.22s-.2 2.55.82 3.32l7.07 5.32 4.25 3.19L17 20.6c-1-.76-2.48-1.11-3.48.22s-.19 2.56.82 3.32l7.08 5.33L25 32.13l-7.1-5.33c-1-.76-2.46-1.14-3.42.13a2.37 2.37 0 00.76 3.41l12.67 9.47c2.24 1.67 6.26 1.89 6.2 1.89a19.63 19.63 0 002.44 1.3 10.12 10.12 0 006.36-4 15 15 0 002.66-8z\"\n        fill=\"#ddf6d1\"\n        fillRule=\"evenodd\"\n      />\n      <path\n        d=\"M15.57 5.44l.7 3.12M25.49 9.25l-2.6 1.85M21.48 4.87l-1.9 5\"\n        fill=\"none\"\n        stroke=\"#165209\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n      <path\n        d=\"M45.42 31A7 7 0 0144 28.61c-.16-.67-.2-1.36-.33-2-.19-1-.36-2.59-1.12-3.4a18.45 18.45 0 01-3.81-7.49c-.49-1.67-.83-2.26-2.33-2.29a2.29 2.29 0 00-2 2.52 17.11 17.11 0 00.21 2.25c.55 2.92 1.15 5.31 1.23 5.45L22.3 13.53c-1-.77-2.49-1.11-3.49.22s-.19 2.55.83 3.32l7.07 5.32L28.83 24l-11.32-8.53c-1-.77-2.49-1.11-3.48.22s-.2 2.55.82 3.32l7.07 5.32 4.25 3.19L17 20.6c-1-.76-2.48-1.11-3.48.22s-.19 2.56.82 3.32l7.08 5.33L25 32.13l-7.1-5.33c-1-.76-2.46-1.14-3.42.13a2.37 2.37 0 00.76 3.41l12.67 9.47a8.29 8.29 0 003.55 1.56c.57.1 1.17.16 1.83.28a9.08 9.08 0 012.73.92 2.6 2.6 0 001.9.15 11.78 11.78 0 005.55-4.06 11.28 11.28 0 002.19-6.25 2.61 2.61 0 00-.24-1.41zM37.07 24.58L34.94 23\"\n        fill=\"none\"\n        stroke=\"#165209\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n    </svg>\n  ),\n  support: (\n    <svg viewBox=\"0 0 48 48\" className=\"h-5 w-5\">\n      <circle cx=\"24\" cy=\"24\" r=\"22\" fill=\"#bba9d1\" />\n      <path\n        d=\"M42.46 40.81a68.7 68.7 0 01-10.61-1h-.19a60.42 60.42 0 01-7.87-1.64c-2.29-.69-4.54-1.58-6.73-2.44l-1-.38c-2.09-.81-3.75-1.49-5.29-2.14l-.58-.24a21.88 21.88 0 01-2.68-1.27C6.34 31 6 30.06 6.49 29v-.09a1.77 1.77 0 011.74-1h.13a4.69 4.69 0 01.53 0c1.9.21 7.41 2.3 8.5 2.72l3.55.12H21l8 .28c-.62-.57-2.2-1.57-6-2.57-.73-.18-1.4-.39-1.56-.93a2.16 2.16 0 01.7-2.26 2.86 2.86 0 011.69-.39 8.72 8.72 0 012.09.25c.4.1.74.21 1 .31a12.13 12.13 0 002.59.58 27 27 0 014.29.98c4.48 1.2 5.35 3.45 5.92 4.81-.18-.56 0-.15.08-.36l.13-.17h.69c.77 0 2.23-.08 2.25-.08.37 0 2.1-.43 2.1-.08a18.84 18.84 0 01-2 9.41.61.61 0 01-.43.3z\"\n        fill=\"#eae2f3\"\n      />\n      <path\n        d=\"M17.81 10.09a4.52 4.52 0 00-6.4-.08l-.07.08a4.7 4.7 0 000 6.58l7 7.07 7-7.08a4.71 4.71 0 000-6.57 4.5 4.5 0 00-6.46 0l-.52.52z\"\n        fill=\"#ecaa96\"\n        fillRule=\"evenodd\"\n      />\n      <path\n        d=\"M45.79 31.2c.32.23.33 2.66-.37 4.79a10.73 10.73 0 01-3.05 4.16c-.37.34-13.21-1.15-16.29-1.66S8 31.29 7.37 31s-.63-2.65 1-3.13 5.93 2.1 8.59 2.33 8.78.47 11 .47-2-1.51-3.11-1.91S22 28 21.64 26.9s.83-1.9 1.82-1.9a29.24 29.24 0 015.31 1.26 18.66 18.66 0 017 1.13A8.06 8.06 0 0140 31.2c.32.61 5.46-.2 5.79 0z\"\n        fill=\"none\"\n        stroke=\"#493d57\"\n        strokeWidth=\"2\"\n      />\n      <path\n        d=\"M9.2 27.44c-.66-1.93.42-2.94 1.64-2.94s2.5 1.22 4.54 2.59A48.66 48.66 0 0022 30.5\"\n        fill=\"none\"\n        stroke=\"#493d57\"\n        strokeWidth=\"2\"\n      />\n      <path\n        d=\"M17.92 9.45a5 5 0 00-7 7L18.47 24l7.59-7.55a4.93 4.93 0 001.37-4.32 5 5 0 00-2.71-3.63 4.81 4.81 0 00-2.18-.5 4.93 4.93 0 00-3.49 1.47l-.58.54z\"\n        fill=\"none\"\n        stroke=\"#77280c\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n    </svg>\n  ),\n  love: (\n    <svg viewBox=\"0 0 48 48\" className=\"h-5 w-5\">\n      <circle cx=\"24\" cy=\"24\" r=\"22\" fill=\"#df704d\" />\n      <path\n        d=\"M23.08 14.6a8.21 8.21 0 00-11.66 0 8.35 8.35 0 000 11.76L24 39l12.58-12.64a8.35 8.35 0 000-11.75 8.13 8.13 0 00-11.63 0l-.94.9z\"\n        fill=\"#fff3f0\"\n        stroke=\"#77280c\"\n        fillRule=\"evenodd\"\n      />\n      <path\n        d=\"M23.08 14.44a8.18 8.18 0 00-11.66 0 8.35 8.35 0 000 11.76L24 38.83 36.58 26.2a8.37 8.37 0 000-11.76 8.11 8.11 0 00-11.62 0l-.94.9z\"\n        fill=\"none\"\n        stroke=\"#77280c\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n      <path\n        d=\"M23 15.71a9.93 9.93 0 01.84 1.2 1 1 0 001.72-1 13 13 0 00-1.15-1.6 1 1 0 00-1.76.39 1 1 0 00.35 1.01z\"\n        fill=\"#77280c\"\n        fillRule=\"evenodd\"\n      />\n    </svg>\n  ),\n  insightful: (\n    <svg viewBox=\"0 0 48 48\" className=\"h-5 w-5\">\n      <circle cx=\"24\" cy=\"24\" r=\"22\" fill=\"#f5bb5c\" />\n      <path\n        d=\"M26.58 41h-5a1.68 1.68 0 01-1.68-1.68v-4.2h8.4v4.2A1.69 1.69 0 0126.58 41z\"\n        fill=\"#ffe1b2\"\n        fillRule=\"evenodd\"\n      />\n      <path\n        d=\"M19.87 35.92v-.84a10 10 0 00-.48-3.08 10.08 10.08 0 00-1.62-2.51 10.23 10.23 0 01-3.77-7.8v-.05a10.08 10.08 0 1120.16 0 10.55 10.55 0 01-4 8l-.13.11a3.75 3.75 0 00-.57.62 5.43 5.43 0 00-.72 1.47 10.05 10.05 0 00-.47 3.22v.84\"\n        fill=\"#fcf0de\"\n        fillRule=\"evenodd\"\n      />\n      <path\n        d=\"M14 7.36l2.12 2.77M35 7.36l-2.12 2.77M24.06 4v4.2\"\n        fill=\"none\"\n        stroke=\"#5d3b01\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n      <path\n        d=\"M22.3 13.86a7 7 0 00-3.84 2.08 7.85 7.85 0 00-2.14 3.8\"\n        fill=\"none\"\n        stroke=\"#fff\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"3\"\n      />\n      <path\n        d=\"M26.58 41h-5a1.68 1.68 0 01-1.68-1.68v-4.2h8.4v4.2A1.69 1.69 0 0126.58 41z\"\n        fill=\"none\"\n        stroke=\"#5d3b01\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n      <path\n        d=\"M19.86 35.92v-.84a10 10 0 00-.48-3.08 5.7 5.7 0 00-.82-1.49 8.06 8.06 0 00-1.16-1.31 11.05 11.05 0 01-1.17-1.2A10.53 10.53 0 0114 21.66v-.05a10.08 10.08 0 1117.88 6.28 12.25 12.25 0 01-1.79 1.81 3.54 3.54 0 00-.62.66 5.74 5.74 0 00-.72 1.47 10.34 10.34 0 00-.47 3.22v.84\"\n        fill=\"none\"\n        stroke=\"#5d3b01\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n      />\n    </svg>\n  ),\n  funny: (\n    <svg viewBox=\"0 0 48 48\" className=\"h-5 w-5\">\n      <circle cx=\"24\" cy=\"24\" r=\"22\" fill=\"#44bfd3\" />\n      <circle cx=\"24\" cy=\"24\" r=\"16\" fill=\"#d5f9fe\" stroke=\"#104e58\" strokeWidth=\"1.8\" />\n      <path\n        d=\"M14.67,21.01l-.19,.3,.68,.7,.42-.26c1.82-1.12,4.02-1.45,6.08-.9l.46-.86c-2.28-1.99-5.79-1.5-7.45,1.02Z\"\n        fill=\"#104e58\"\n      />\n      <path\n        d=\"M33.44,21.34c-1.46-2.65-4.92-3.39-7.35-1.59l-.28,.21,.41,.89h0c2.23-.52,4.59-.11,6.51,1.15l.71-.66Z\"\n        fill=\"#104e58\"\n      />\n      <path\n        d=\"M19.49,14.23c-1.34-.06-3.99,.27-5.49,2.77\"\n        fill=\"none\"\n        stroke=\"#104e58\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.8\"\n      />\n      <path\n        d=\"M29,14.72c1.34-.06,3.99,.27,5.49,2.77\"\n        fill=\"none\"\n        stroke=\"#104e58\"\n        strokeLinecap=\"round\"\n        strokeWidth=\"1.8\"\n      />\n      <path\n        d=\"M31.59,26h-15.18c-.69,0-1.18,.76-.93,1.48,1.1,3.13,3.24,7.47,8.51,7.47s7.42-4.34,8.51-7.47c.25-.72-.24-1.48-.93-1.48Z\"\n        fill=\"#2199ac\"\n      />\n      <path\n        d=\"M24,30c-4,0-6.62,1.74-5,3,.91,.71,3,1.49,5,1.5,2,0,4.26-.76,5-1.5,1.26-1.26-1-3-5-3Z\"\n        fill=\"#d5f9fe\"\n      />\n      <path\n        d=\"M31.56,25.1h-15.11c-1.4,0-2.47,1.38-1.97,2.76,.58,1.61,1.46,3.6,2.94,5.21,1.51,1.63,3.63,2.83,6.59,2.83s5.08-1.2,6.59-2.83c1.48-1.6,2.36-3.6,2.94-5.21,.5-1.38-.57-2.76-1.97-2.76Zm-2.29,6.74c-1.21,1.31-2.87,2.26-5.26,2.26s-4.06-.95-5.26-2.26c-1.24-1.33-2.02-3.06-2.57-4.59-.05-.15,.05-.35,.28-.35h15.11c.22,0,.33,.2,.28,.35-.55,1.53-1.33,3.26-2.57,4.59Z\"\n        fill=\"#104e58\"\n      />\n    </svg>\n  ),\n};\n\n/**\n * A LinkedIn post embed component with professional styling.\n * Displays author info and content with optional repost action.\n *\n * Features:\n * - Author avatar with headline\n * - Multi-line content with hashtag support\n * - Optional post image\n * - Expandable content with \"...more\" button\n * - LinkedIn icon link to original post (optional)\n * - Repost button in footer (optional, footer only shows if repostUrl provided)\n *\n * @component\n * @example\n * ```tsx\n * <LinkedInPost\n *   data={{\n *     author: \"Manifest\",\n *     headline: \"Building the future of AI\",\n *     avatar: \"M\",\n *     content: \"Excited to share our latest update!\",\n *     time: \"2h\",\n *     image: \"https://images.pexels.com/photos/417173/pexels-photo-417173.jpeg\"\n *   }}\n *   actions={{\n *     postUrl: \"https://linkedin.com/posts/...\",\n *     repostUrl: \"https://linkedin.com/shareArticle?...\"\n *   }}\n *   appearance={{\n *     maxLines: 3\n *   }}\n * />\n * ```\n */\nexport function LinkedInPost({ data, appearance }: LinkedInPostProps) {\n  const resolved: NonNullable<LinkedInPostProps['data']> = data ?? demoLinkedInPost;\n  const {\n    author,\n    headline,\n    avatar,\n    content,\n    time,\n    image,\n    reactions,\n    topReactions,\n    comments,\n    reposts,\n    postUrl,\n    repostUrl,\n  } = resolved;\n\n  const { maxLines = 3 } = appearance ?? {};\n\n  const hasEngagement = reactions || comments || reposts;\n\n  const [isExpanded, setIsExpanded] = useState(false);\n  const [isTruncated, setIsTruncated] = useState(false);\n  const contentRef = useRef<HTMLParagraphElement>(null);\n\n  useEffect(() => {\n    const el = contentRef.current;\n    if (el) {\n      // Check if content is truncated\n      setIsTruncated(el.scrollHeight > el.clientHeight);\n    }\n  }, [content, maxLines]);\n\n  const handleExpand = () => {\n    setIsExpanded(true);\n  };\n\n  return (\n    <div className=\"rounded-xl border bg-card\">\n      <div className=\"p-4\">\n        <div className=\"flex gap-3\">\n          {avatar && (\n            <div className=\"h-12 w-12 rounded-full bg-[#0A66C2] text-white flex items-center justify-center font-semibold shrink-0\">\n              {avatar}\n            </div>\n          )}\n          <div className=\"flex-1 min-w-0\">\n            <div className=\"flex items-start justify-between\">\n              <div>\n                <p className=\"font-semibold text-sm\">{author}</p>\n                <p className=\"text-xs text-muted-foreground line-clamp-1\">{headline}</p>\n                <p className=\"text-xs text-muted-foreground\">{time}</p>\n              </div>\n              {postUrl && (\n                <a\n                  href={postUrl}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                  className=\"text-[#0A66C2] hover:text-[#004182] transition-colors\"\n                  aria-label=\"View on LinkedIn\"\n                >\n                  <LinkedInIcon className=\"h-5 w-5\" />\n                </a>\n              )}\n            </div>\n          </div>\n        </div>\n        <div className=\"mt-3\">\n          <p\n            ref={contentRef}\n            className=\"text-sm whitespace-pre-wrap\"\n            style={\n              !isExpanded\n                ? {\n                    WebkitLineClamp: maxLines,\n                    display: '-webkit-box',\n                    WebkitBoxOrient: 'vertical',\n                    overflow: 'hidden',\n                  }\n                : undefined\n            }\n          >\n            {content ? formatContent(content) : null}\n          </p>\n          {isTruncated && !isExpanded && (\n            <button\n              onClick={handleExpand}\n              className=\"text-sm text-muted-foreground hover:text-foreground transition-colors cursor-pointer\"\n            >\n              ...more\n            </button>\n          )}\n        </div>\n      </div>\n\n      {/* Image section */}\n      {image && (\n        <div className=\"w-full\">\n          <img src={image} alt=\"Post image\" className=\"w-full object-cover max-h-[400px]\" />\n        </div>\n      )}\n\n      {/* Engagement stats - reactions, comments, reposts */}\n      {hasEngagement && (\n        <div className=\"px-4 py-2 flex items-center justify-between text-xs text-muted-foreground\">\n          <div className=\"flex items-center gap-1\">\n            {topReactions && topReactions.length > 0 && (\n              <div className=\"flex -space-x-1\">\n                {topReactions.slice(0, 3).map((type, idx) => (\n                  <div\n                    key={type}\n                    className=\"ring-2 ring-card rounded-full\"\n                    style={{ zIndex: 3 - idx }}\n                  >\n                    {reactionIcons[type]}\n                  </div>\n                ))}\n              </div>\n            )}\n            {reactions && <span className=\"ml-1\">{reactions}</span>}\n          </div>\n          <div className=\"flex items-center gap-3\">\n            {comments && <span>{comments} comments</span>}\n            {reposts && <span>{reposts} reposts</span>}\n          </div>\n        </div>\n      )}\n\n      {/* Footer with repost button - only shows if repostUrl is provided */}\n      {repostUrl && (\n        <div className=\"px-4 py-2 border-t flex justify-end\">\n          <a\n            href={repostUrl}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"inline-flex items-center gap-2 px-4 py-2 hover:bg-muted rounded-md transition-colors text-sm text-muted-foreground\"\n          >\n            <Repeat2 className=\"h-5 w-5\" />\n            <span>Repost</span>\n          </a>\n        </div>\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:block",
      "target": "components/ui/linkedin-post.tsx"
    },
    {
      "path": "registry/social/demo/social.ts",
      "content": "// Demo data for Social category components\n// This file contains sample data used for component previews and documentation\n\nexport const demoXPost = {\n  author: 'Manifest',\n  username: 'manifest_ui',\n  avatar: 'M',\n  verified: true,\n  content: 'Just shipped a new batch of agentic UI components. Build conversational interfaces faster than ever.',\n  time: '2h',\n  likes: '1.2K',\n  retweets: '234',\n  replies: '56',\n  views: '45.2K',\n}\n\nexport const demoInstagramPost = {\n  author: 'manifest.ui',\n  avatar: 'M',\n  verified: true,\n  image:\n    'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800',\n  caption: 'Building the future of agentic UIs, one component at a time.',\n  likes: '2,847',\n  time: '2h',\n}\n\nexport const demoLinkedInPost = {\n  author: 'Manifest',\n  headline: 'Manifest UI | Open Source',\n  avatar: 'M',\n  content: 'Excited to announce our latest milestone! We\\'ve just crossed 10,000 developers using Manifest to build agentic UIs.',\n  time: '1d',\n  reactions: '1,234',\n  topReactions: ['like', 'celebrate', 'love'] as ('like' | 'celebrate' | 'support' | 'love' | 'insightful' | 'funny')[],\n  comments: '56',\n  reposts: '12',\n  postUrl: 'https://linkedin.com/posts/manifest-123',\n  repostUrl: 'https://linkedin.com/shareArticle?url=...',\n}\n\nexport const demoYouTubePost = {\n  channel: 'Manifest',\n  avatar: 'M',\n  title: 'Building Agentic UIs with Manifest',\n  views: '12K',\n  time: '3 days ago',\n  thumbnail:\n    'https://images.unsplash.com/photo-1677442136019-21780ecad995?w=800',\n  duration: '15:42',\n}\n",
      "type": "registry:lib",
      "target": "components/ui/demo/social.ts"
    }
  ],
  "categories": [
    "social"
  ],
  "type": "registry:block"
}