| 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> |
| ); |
| } |
|
|