{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "event-card",
"title": "Event Card",
"description": "Event card with CTA that opens a responsive drawer (right on desktop, bottom on mobile).",
"dependencies": [
"@radix-ui/react-dialog",
"@phosphor-icons/react",
"lucide-react",
"react-markdown",
"remark-gfm",
"rehype-raw",
"rehype-sanitize"
],
"files": [
{
"path": "registry/components/event-card/index.ts",
"content": "export { EventCard } from \"./index.tsx\"\nexport type { EventCardProps, EventTimelineItem, DrawerDirection } from \"./types\"\n",
"type": "registry:block"
},
{
"path": "registry/components/event-card/index.tsx",
"content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { EventCardDrawer } from \"./event-card-drawer\"\nimport { EventCardPreview } from \"./event-card-preview\"\nimport type { DrawerDirection, EventCardProps } from \"./types\"\n\nfunction useResolvedDirection(direction: DrawerDirection) {\n const [isDesktop, setIsDesktop] = React.useState(false)\n\n React.useEffect(() => {\n const mediaQuery = window.matchMedia(\"(min-width: 768px)\")\n const sync = () => setIsDesktop(mediaQuery.matches)\n sync()\n mediaQuery.addEventListener(\"change\", sync)\n return () => mediaQuery.removeEventListener(\"change\", sync)\n }, [])\n\n return direction === \"auto\" ? (isDesktop ? \"right\" : \"bottom\") : direction\n}\n\nexport function EventCard({\n title,\n miniDescription,\n ctaText,\n cardCtaText,\n drawerCtaText,\n hideCardCta = false,\n hideDrawerCta = false,\n isActive,\n category,\n image,\n date,\n time,\n isOnline,\n eventLocationLink,\n showLocationTextInMapsTag = true,\n eventLocationText,\n eventMode,\n eventDetailDescription,\n eventTimeline,\n onCtaClick,\n onDrawerOpen,\n onDrawerCtaClick,\n drawerDirection = \"auto\",\n drawerBottomInsetClassName,\n drawerBodyClassName,\n drawerPinFooter = true,\n drawerFooterClassName,\n className,\n}: EventCardProps) {\n const [open, setOpen] = React.useState(false)\n const wasOpenRef = React.useRef(false)\n const resolvedDirection = useResolvedDirection(drawerDirection)\n const resolvedCardCtaText = cardCtaText ?? ctaText\n const resolvedDrawerCtaText = drawerCtaText ?? ctaText\n\n const handleCtaClick = () => {\n setOpen(true)\n }\n const handleDrawerCtaClick = () => {\n onDrawerCtaClick?.()\n onCtaClick?.()\n }\n\n React.useEffect(() => {\n if (open && !wasOpenRef.current) {\n onDrawerOpen?.()\n }\n wasOpenRef.current = open\n }, [open, onDrawerOpen])\n\n return (\n <>\n
\n {resolvedMiniDescription}\n
\n\n {!hideCardCta ? (\n\n {toCapitalizedWords(item.time)}\n
\n\n {toCapitalizedWords(item.text)}\n
\n