Grid & Dot Pattern
SVG grid and dot backdrops with maskable depth.
0.8 KB gzippedZero dependenciesReduced-motion safeBase UI & Radix compatible
Patterns
Installation
npx shadcn@latest add https://velora.colorlib.com/r/grid-pattern.jsonSource
import { useId } from "react";
import { cn } from "@/lib/utils";
interface GridPatternProps extends React.SVGProps<SVGSVGElement> {
width?: number;
height?: number;
x?: number;
y?: number;
/** Cells to fill, as [col, row] pairs */
squares?: Array<[number, number]>;
strokeDasharray?: string;
}
export function GridPattern({
width = 40,
height = 40,
x = -1,
y = -1,
strokeDasharray = "0",
squares,
className,
...props
}: GridPatternProps) {
const id = useId();
return (
<svg
aria-hidden
data-slot="grid-pattern"
className={cn(
"pointer-events-none absolute inset-0 size-full fill-muted/40 stroke-border",
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(([sx, sy]) => (
<rect
key={`${sx}-${sy}`}
strokeWidth="0"
width={width - 1}
height={height - 1}
x={sx * width + 1}
y={sy * height + 1}
/>
))}
</svg>
)}
</svg>
);
}
interface DotPatternProps extends React.SVGProps<SVGSVGElement> {
width?: number;
height?: number;
cx?: number;
cy?: number;
cr?: number;
}
export function DotPattern({
width = 20,
height = 20,
cx = 1,
cy = 1,
cr = 1,
className,
...props
}: DotPatternProps) {
const id = useId();
return (
<svg
aria-hidden
data-slot="dot-pattern"
className={cn(
"pointer-events-none absolute inset-0 size-full fill-muted-foreground/30",
className
)}
{...props}
>
<defs>
<pattern
id={id}
width={width}
height={height}
patternUnits="userSpaceOnUse"
>
<circle cx={cx} cy={cy} r={cr} />
</pattern>
</defs>
<rect width="100%" height="100%" strokeWidth={0} fill={`url(#${id})`} />
</svg>
);
}