import React, { memo, useMemo, FC, HTMLAttributes } from 'react'; import cc from 'classcat'; import { useStore } from '../../store'; import { BackgroundVariant, ReactFlowState } from '../../types'; import { createGridLinesPath, createGridDotsPath } from './utils'; export interface BackgroundProps extends HTMLAttributes { variant?: BackgroundVariant; gap?: number; color?: string; size?: number; } const defaultColors = { [BackgroundVariant.Dots]: '#81818a', [BackgroundVariant.Lines]: '#eee', }; const transformSelector = (s: ReactFlowState) => s.transform; const Background: FC = ({ variant = BackgroundVariant.Dots, gap = 15, size = 0.4, color, style, className, }) => { const [x, y, scale] = useStore(transformSelector); // when there are multiple flows on a page we need to make sure that every background gets its own pattern. const patternId = useMemo(() => `pattern-${Math.floor(Math.random() * 100000)}`, []); const bgClasses = cc(['react-flow__background', className]); const scaledGap = gap * scale; const xOffset = x % scaledGap; const yOffset = y % scaledGap; const isLines = variant === BackgroundVariant.Lines; const bgColor = color ? color : defaultColors[variant]; const path = isLines ? createGridLinesPath(scaledGap, size, bgColor) : createGridDotsPath(size * scale, bgColor); return ( {path} ); }; Background.displayName = 'Background'; export default memo(Background);