{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "share-row",
  "title": "Share Row",
  "author": "Alex Chih (https://alexchih.com)",
  "description": "URL-intent share row — native share sheet when supported, clipboard copy fallback, X/LinkedIn intents. No SDKs, no trackers.",
  "dependencies": [
    "lucide-react"
  ],
  "registryDependencies": [
    "https://washiveil.alexchih.com/r/theme.json"
  ],
  "files": [
    {
      "path": "registry/washiveil/ui/share-row.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { Link, Share2 } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction XIcon({ className }: { className?: string }) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className}>\n      <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n    </svg>\n  )\n}\n\nfunction LinkedInIcon({ className }: { className?: string }) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className}>\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.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564zM22.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 0z\" />\n    </svg>\n  )\n}\n\nconst btn =\n  'grid size-9 place-items-center rounded-full border transition-colors border-foreground/10 text-muted-foreground hover:border-ruri hover:text-ruri dark:border-white/10 dark:hover:border-ruri-soft dark:hover:text-ruri-soft focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background'\n\ninterface ShareRowProps {\n  url: string\n  title: string\n  label?: string\n  copiedLabel?: string\n  className?: string\n}\n\nfunction ShareRow({ url, title, label = 'Share', copiedLabel = 'Link copied', className }: ShareRowProps) {\n  const [copied, setCopied] = React.useState(false)\n  const [supportsShare, setSupportsShare] = React.useState(false)\n  const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n  React.useEffect(() => {\n    if (typeof navigator !== 'undefined' && 'share' in navigator) {\n      setSupportsShare(true)\n    }\n  }, [])\n\n  React.useEffect(() => {\n    return () => {\n      if (timerRef.current) clearTimeout(timerRef.current)\n    }\n  }, [])\n\n  const enc = encodeURIComponent\n\n  const nets = [\n    {\n      label: 'X',\n      icon: XIcon,\n      href: `https://twitter.com/intent/tweet?text=${enc(title)}&url=${enc(url)}`,\n    },\n    {\n      label: 'LinkedIn',\n      icon: LinkedInIcon,\n      href: `https://www.linkedin.com/sharing/share-offsite/?url=${enc(url)}`,\n    },\n  ]\n\n  async function handleCopy() {\n    try {\n      await navigator.clipboard.writeText(url)\n      setCopied(true)\n      if (timerRef.current) clearTimeout(timerRef.current)\n      timerRef.current = setTimeout(() => setCopied(false), 1800)\n    } catch {\n      /* clipboard blocked */\n    }\n  }\n\n  async function handleNativeShare() {\n    try {\n      await navigator.share({ title, url })\n    } catch {\n      /* user dismissed the sheet */\n    }\n  }\n\n  return (\n    <div className={cn('flex flex-wrap items-center gap-3', className)}>\n      <span className=\"font-mono text-[0.75rem] tracking-[0.2em] text-muted-foreground uppercase\">{label}</span>\n      <div className=\"flex items-center gap-2\">\n        {nets.map((n) => (\n          <a key={n.label} href={n.href} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={n.label} className={btn}>\n            <n.icon className=\"size-4.5\" />\n          </a>\n        ))}\n        <button type=\"button\" onClick={handleCopy} aria-label=\"Copy link\" className={btn}>\n          <Link className=\"size-4.5\" />\n        </button>\n        {supportsShare && (\n          <button type=\"button\" onClick={handleNativeShare} aria-label={label} className={btn}>\n            <Share2 className=\"size-4.5\" />\n          </button>\n        )}\n      </div>\n      {copied && <span className=\"text-xs text-ruri dark:text-ruri-soft\">{copiedLabel}</span>}\n    </div>\n  )\n}\n\nexport { ShareRow }\nexport type { ShareRowProps }\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}