| <script labg="ts" context="module"> | |
| const defaultSize = { | |
| [BackgroundVariant.Dots]: 1, | |
| [BackgroundVariant.Lines]: 1, | |
| [BackgroundVariant.Cross]: 6 | |
| }; | |
| </script> | |
| <script>import cc from 'classcat'; | |
| import DotPattern from './DotPattern.svelte'; | |
| import LinePattern from './LinePattern.svelte'; | |
| import { useStore } from '../../store'; | |
| import { BackgroundVariant } from './types'; | |
| export let id = undefined; | |
| export let variant = BackgroundVariant.Dots; | |
| export let gap = 20; | |
| export let size = 1; | |
| export let lineWidth = 1; | |
| export let bgColor = undefined; | |
| export let patternColor = undefined; | |
| export let patternClass = undefined; | |
| let className = ''; | |
| export { className as class }; | |
| const { viewport, flowId } = useStore(); | |
| const patternSize = size || defaultSize[variant]; | |
| const isDots = variant === BackgroundVariant.Dots; | |
| const isCross = variant === BackgroundVariant.Cross; | |
| const gapXY = Array.isArray(gap) ? gap : [gap, gap]; | |
| $: patternId = `background-pattern-${$flowId}-${id ? id : ''}`; | |
| $: scaledGap = [gapXY[0] * $viewport.zoom || 1, gapXY[1] * $viewport.zoom || 1]; | |
| $: scaledSize = patternSize * $viewport.zoom; | |
| $: patternDimensions = (isCross ? [scaledSize, scaledSize] : scaledGap); | |
| $: patternOffset = isDots | |
| ? [scaledSize / 2, scaledSize / 2] | |
| : [patternDimensions[0] / 2, patternDimensions[1] / 2]; | |
| </script> | |
| <svg | |
| class={cc(['svelte-flow__background', className])} | |
| data-testid="svelte-flow__background" | |
| style:--xy-background-color-props={bgColor} | |
| style:--xy-background-pattern-color-props={patternColor} | |
| > | |
| <pattern | |
| id={patternId} | |
| x={$viewport.x % scaledGap[0]} | |
| y={$viewport.y % scaledGap[1]} | |
| width={scaledGap[0]} | |
| height={scaledGap[1]} | |
| patternUnits="userSpaceOnUse" | |
| patternTransform={`translate(-${patternOffset[0]},-${patternOffset[1]})`} | |
| > | |
| {#if isDots} | |
| <DotPattern radius={scaledSize / 2} class={patternClass} /> | |
| {:else} | |
| <LinePattern dimensions={patternDimensions} {variant} {lineWidth} class={patternClass} /> | |
| {/if} | |
| </pattern> | |
| <rect x="0" y="0" width="100%" height="100%" fill={`url(#${patternId})`} /> | |
| </svg> | |
| <style> | |
| .svelte-flow__background { | |
| position: absolute; | |
| width: 100%; | |
| height: 100%; | |
| top: 0; | |
| left: 0; | |
| } | |
| </style> | |