"use client"; import { GridPattern } from "@/components/docs/GridPattern"; import { Heading } from "@/components/docs/Heading"; import { type MotionValue, motion, useMotionTemplate, useMotionValue, } from "framer-motion"; import { Mail, MessageSquare, User, Users } from "lucide-react"; import Link from "next/link"; interface Resource { href: string; name: string; description: string; icon: React.ComponentType<{ className?: string }>; pattern: Omit< React.ComponentPropsWithoutRef, "width" | "height" | "x" >; } const resources: Array = [ { href: "/contacts", name: "Contacts", description: "Learn about the contact model and how to create, retrieve, update, delete, and list contacts.", icon: User, pattern: { y: 16, squares: [ [0, 1], [1, 3], ], }, }, { href: "/conversations", name: "Conversations", description: "Learn about the conversation model and how to create, retrieve, update, delete, and list conversations.", icon: MessageSquare, pattern: { y: -6, squares: [ [-1, 2], [1, 3], ], }, }, { href: "/messages", name: "Messages", description: "Learn about the message model and how to create, retrieve, update, delete, and list messages.", icon: Mail, pattern: { y: 32, squares: [ [0, 2], [1, 4], ], }, }, { href: "/groups", name: "Groups", description: "Learn about the group model and how to create, retrieve, update, delete, and list groups.", icon: Users, pattern: { y: 22, squares: [[0, 1]], }, }, ]; function ResourceIcon({ icon: Icon }: { icon: Resource["icon"] }) { return (
); } function ResourcePattern({ mouseX, mouseY, ...gridProps }: Resource["pattern"] & { mouseX: MotionValue; mouseY: MotionValue; }) { const maskImage = useMotionTemplate`radial-gradient(180px at ${mouseX}px ${mouseY}px, white, transparent)`; const style = { maskImage, WebkitMaskImage: maskImage }; return (
); } function Resource({ resource }: { resource: Resource }) { const mouseX = useMotionValue(0); const mouseY = useMotionValue(0); function onMouseMove({ currentTarget, clientX, clientY, }: React.MouseEvent) { const { left, top } = currentTarget.getBoundingClientRect(); mouseX.set(clientX - left); mouseY.set(clientY - top); } return (

{resource.name}

{resource.description}

); } export function Resources() { return (
Resources
{resources.map((resource) => ( ))}
); }