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 = ``
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 }