2
2
import { useVueFlow } from ' @vue-flow/core'
3
3
import { BackgroundVariant } from ' ./types'
4
4
import type { BackgroundProps } from ' ./types'
5
+ import { LinePattern } from ' ./patterns'
5
6
6
7
const {
8
+ id,
7
9
variant = ' dots' as BackgroundVariant ,
8
10
gap = 10 ,
9
- size = 0.4 ,
11
+ size = 1 ,
12
+ lineWidth = 1 ,
10
13
height = 100 ,
11
14
width = 100 ,
12
15
x = 0 ,
13
16
y = 0 ,
14
17
bgColor,
15
18
patternColor : initialPatternColor,
19
+ offset = 2 ,
16
20
} = defineProps <BackgroundProps >()
17
21
18
22
const defaultColors: Record <BackgroundVariant , string > = {
19
23
[BackgroundVariant .Dots ]: ' #81818a' ,
20
24
[BackgroundVariant .Lines ]: ' #eee' ,
21
25
}
22
26
23
- const { id, viewport } = useVueFlow ()
27
+ const { id : vueFlowId, viewport } = useVueFlow ()
28
+
29
+ const gapXY = computed (() => (Array .isArray (gap ) ? gap : [gap , gap ]))
24
30
25
31
const background = $computed (() => {
26
- const scaledGap = gap && gap * viewport .value .zoom
27
- const xOffset = scaledGap && viewport .value .x % scaledGap
28
- const yOffset = scaledGap && viewport .value .y % scaledGap
29
- const bgSize = size * viewport .value .zoom
32
+ const scaledGap = [gapXY .value [0 ] * viewport .value .zoom || 1 , gapXY .value [1 ] * viewport .value .zoom || 1 ]
33
+
34
+ const scaledSize = size * viewport .value .zoom
35
+
36
+ const patternOffset =
37
+ variant === BackgroundVariant .Dots
38
+ ? [scaledSize / offset , scaledSize / offset ]
39
+ : [scaledGap [0 ] / offset , scaledGap [1 ] / offset ]
30
40
31
41
return {
32
42
scaledGap ,
33
- xOffset ,
34
- yOffset ,
35
- size: bgSize ,
43
+ offset: patternOffset ,
44
+ size: scaledSize ,
36
45
}
37
46
})
38
47
39
48
// when there are multiple flows on a page we need to make sure that every background gets its own pattern.
40
- const patternId = ` pattern-${id } `
49
+ const patternId = computed (() => ` pattern-${vueFlowId }${ id ? ` -${ id } ` : ' ' } ` )
41
50
42
51
const patternColor = computed (() => initialPatternColor || defaultColors [variant || BackgroundVariant .Dots ])
43
-
44
- const d = computed (
45
- () => ` M${background .scaledGap / 2 } 0 V${background .scaledGap } M0 ${background .scaledGap / 2 } H${background .scaledGap } ` ,
46
- )
47
52
</script >
48
53
49
54
<script lang="ts">
@@ -61,22 +66,24 @@ export default {
61
66
width: `${width > 100 ? 100 : width}%`,
62
67
}"
63
68
>
69
+ <!-- todo: rename to `pattern -->
64
70
<slot :id =" patternId" name =" pattern-container" >
65
71
<pattern
66
72
:id =" patternId"
67
- :x =" background.xOffset"
68
- :y =" background.yOffset"
69
- :width =" background.scaledGap"
70
- :height =" background.scaledGap"
73
+ :x =" viewport.x % background.scaledGap[0]"
74
+ :y =" viewport.y % background.scaledGap[1]"
75
+ :width =" background.scaledGap[0]"
76
+ :height =" background.scaledGap[1]"
77
+ :patternTransform =" `translate(-${background.offset[0]},-${background.offset[1]})`"
71
78
patternUnits =" userSpaceOnUse"
72
79
>
73
80
<slot name =" pattern" >
74
81
<template v-if =" variant === BackgroundVariant .Lines " >
75
- <path :stroke = " patternColor " :stroke-width = " size " :d = " d " />
82
+ <LinePattern :size = " lineWidth " :color = " patternColor " :dimensions = " background.size " />
76
83
</template >
77
84
78
85
<template v-else-if =" variant === BackgroundVariant .Dots " >
79
- <circle :cx = " background.size " :cy =" background.size" :r = " background.size " :fill = " patternColor " />
86
+ <DotPattern :color = " patternColor " :radius =" background.size / offset " />
80
87
</template >
81
88
82
89
<svg v-if =" bgColor" height =" 100" width =" 100" >
0 commit comments