import { cn } from '../../internal/utils' type BackgroundPatternVariant = 'dots' | 'grid' | 'dashed-grid' | 'hexagons' interface MaskSpec { maskImage: string maskSize?: string maskRepeat?: string cell: number tint: string spotlight: string className?: string } const CELL = 'var(--pattern-cell) var(--pattern-cell)' function svgMask(body: string, width = 12, height = width) { const svg = `${body}` return `url("data:image/svg+xml,${encodeURIComponent(svg)}")` } const PATTERN_MASKS: Record = { dots: { maskImage: 'radial-gradient(circle at 1px 1px, #000 1px, transparent 1.5px)', cell: 14, tint: 'bg-current/12', spotlight: 'bg-current/58 dark:bg-current/64', }, grid: { maskImage: 'linear-gradient(to right, #000 0 1px, transparent 1px), linear-gradient(to bottom, #000 0 1px, transparent 1px)', cell: 28, tint: 'bg-current/7', spotlight: 'bg-current/28 dark:bg-current/34', }, 'dashed-grid': { maskImage: svgMask(``), cell: 28, tint: 'bg-current/11', spotlight: 'bg-current/40 dark:bg-current/44', }, hexagons: { maskImage: svgMask( ``, 17.320508, 30, ), maskSize: 'var(--pattern-cell) calc(var(--pattern-cell) * 1.7320508)', cell: 40, tint: 'bg-current/7', spotlight: 'bg-current/28 dark:bg-current/34', }, } function patternCell(variant: BackgroundPatternVariant) { return PATTERN_MASKS[variant].cell } function patternTint(variant: BackgroundPatternVariant) { return PATTERN_MASKS[variant].tint } function patternSpotlight(variant: BackgroundPatternVariant) { return PATTERN_MASKS[variant].spotlight } interface PatternLayerProps { variant: BackgroundPatternVariant className?: string } function PatternLayer({ variant, className }: PatternLayerProps) { const spec = PATTERN_MASKS[variant] const maskImage = spec.maskImage const maskSize = spec.maskSize ?? CELL const maskRepeat = spec.maskRepeat ?? 'repeat' return (
) } export { PatternLayer, patternCell, patternTint, patternSpotlight } export type { BackgroundPatternVariant }