{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "pill-card", "title": "Pill Card", "description": "A card with animated SVG paths and synchronized glow effects.", "dependencies": [ "motion", "lucide-react" ], "files": [ { "path": "registry/new-york/components/pill-card/pill-card.tsx", "type": "registry:component", "content": "\"use client\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { ShieldCheck, Database, Radio, Monitor, Wallet } from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport { cn } from \"@/lib/utils\";\n\nconst CYCLE = 2.4;\nconst ARRIVE = 0.65;\nconst DOT_LEN = 0.15;\nconst STAGGER = 0.15;\n\nconst ICON_LIST = [\n { IconComponent: Monitor },\n { IconComponent: Wallet },\n { IconComponent: ShieldCheck },\n { IconComponent: Database },\n];\n\nconst ICON_SIZE = 38;\nconst ICON_GAP = 36;\nconst PATH_START_Y = 38;\n\nconst PillCard = () => {\n const containerRef = useRef(null);\n const [dimensions, setDimensions] = useState({ w: 350, h: 450 });\n\n useEffect(() => {\n if (!containerRef.current) return;\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setDimensions({\n w: entry.contentRect.width,\n h: entry.contentRect.height,\n });\n }\n });\n observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n const { w: W, h: H } = dimensions;\n const ICON_Y = H - 155;\n const PATH_END_Y = ICON_Y + 3;\n\n const totalWidth = ICON_LIST.length * ICON_SIZE + (ICON_LIST.length - 1) * ICON_GAP;\n const startX = (W - totalWidth) / 2;\n\n const ICONS = ICON_LIST.map((icon, i) => ({\n ...icon,\n x: startX + i * (ICON_SIZE + ICON_GAP) + ICON_SIZE / 2,\n }));\n\n const generatePath = (targetX: number) => {\n const mid = PATH_START_Y + (PATH_END_Y - PATH_START_Y) * 0.35;\n const cx = W / 2;\n return `M ${cx} ${PATH_START_Y} C ${cx} ${mid * 0.6 + PATH_START_Y * 0.4}, ${targetX} ${mid}, ${targetX} ${PATH_END_Y}`;\n };\n\n return (\n
\n
\n \n {ICONS.map((icon, i) => (\n \n ))}\n \n\n {ICONS.map((icon, i) => (\n \n \n \n \n
\n ))}\n
\n\n
\n \n\n
\n

MCP Server

\n

\n A hosted server with 160+ blockchain tools for any MCP client.\n

\n
\n
\n \n );\n};\n\nconst Icon = ({\n children,\n cycle,\n arrive,\n delay,\n}: {\n children: React.ReactNode;\n cycle: number;\n arrive: number;\n delay: number;\n}) => (\n \n {children}\n \n);\n\nexport default PillCard;\n" } ], "type": "registry:component" }