Spaces:
Running
Running
| import { useId } from "react"; | |
| import { cn } from "@/lib/utils"; | |
| interface GridPatternProps extends React.SVGProps<SVGSVGElement> { | |
| width?: number; | |
| height?: number; | |
| x?: number; | |
| y?: number; | |
| squares?: Array<[x: number, y: number]>; | |
| strokeDasharray?: string; | |
| className?: string; | |
| [key: string]: unknown; | |
| } | |
| export function GridPattern({ | |
| width = 40, | |
| height = 40, | |
| x = -1, | |
| y = -1, | |
| strokeDasharray = "0", | |
| squares, | |
| className, | |
| ...props | |
| }: GridPatternProps) { | |
| const id = useId(); | |
| return ( | |
| <svg | |
| aria-hidden="true" | |
| className={cn( | |
| "pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-neutral-700 -z-[1]", | |
| className | |
| )} | |
| {...props} | |
| > | |
| <defs> | |
| <pattern | |
| id={id} | |
| width={width} | |
| height={height} | |
| patternUnits="userSpaceOnUse" | |
| x={x} | |
| y={y} | |
| > | |
| <path | |
| d={`M.5 ${height}V.5H${width}`} | |
| fill="none" | |
| strokeDasharray={strokeDasharray} | |
| /> | |
| </pattern> | |
| </defs> | |
| <rect width="100%" height="100%" strokeWidth={0} fill={`url(#${id})`} /> | |
| {squares && ( | |
| <svg x={x} y={y} className="overflow-visible"> | |
| {squares.map(([x, y]) => ( | |
| <rect | |
| strokeWidth="0" | |
| key={`${x}-${y}`} | |
| width={width - 1} | |
| height={height - 1} | |
| x={x * width + 1} | |
| y={y * height + 1} | |
| /> | |
| ))} | |
| </svg> | |
| )} | |
| </svg> | |
| ); | |
| } | |