diff --git a/packages/editor-ui/src/components/canvas/Canvas.spec.ts b/packages/editor-ui/src/components/canvas/Canvas.spec.ts index 5ab4c6e96ed..8e534255327 100644 --- a/packages/editor-ui/src/components/canvas/Canvas.spec.ts +++ b/packages/editor-ui/src/components/canvas/Canvas.spec.ts @@ -207,4 +207,17 @@ describe('Canvas', () => { await waitFor(() => expect(getByTestId('canvas-minimap')).not.toBeVisible()); }); }); + + describe('background', () => { + it('should render default background', () => { + const { container } = renderComponent(); + expect(container.querySelector('#pattern-canvas')).toBeInTheDocument(); + }); + + it('should render striped background', () => { + const { container } = renderComponent({ props: { readOnly: true } }); + expect(container.querySelector('#pattern-canvas')).not.toBeInTheDocument(); + expect(container.querySelector('#diagonalHatch')).toBeInTheDocument(); + }); + }); }); diff --git a/packages/editor-ui/src/components/canvas/Canvas.vue b/packages/editor-ui/src/components/canvas/Canvas.vue index 521406ade54..7037b0a580e 100644 --- a/packages/editor-ui/src/components/canvas/Canvas.vue +++ b/packages/editor-ui/src/components/canvas/Canvas.vue @@ -32,6 +32,7 @@ import { CanvasKey } from '@/constants'; import { onKeyDown, onKeyUp, useDebounceFn } from '@vueuse/core'; import CanvasArrowHeadMarker from './elements/edges/CanvasArrowHeadMarker.vue'; import { CanvasNodeRenderType } from '@/types'; +import CanvasBackgroundStripedPattern from './elements/CanvasBackgroundStripedPattern.vue'; const $style = useCssModule(); @@ -110,6 +111,7 @@ const { onPaneReady, findNode, onNodesInitialized, + viewport, } = useVueFlow({ id: props.id, deleteKeyCode: null }); const isPaneReady = ref(false); @@ -562,7 +564,11 @@ provide(CanvasKey, { - + + + +/* eslint-disable vue/no-multiple-template-root */ +/** + * @see https://github.com/bcakmakoglu/vue-flow/blob/master/packages/background/src/Background.vue + */ +import { computed } from 'vue'; +const props = defineProps<{ + x: number; + y: number; + zoom: number; +}>(); + +const scaledGap = computed(() => 20 * props.zoom || 1); +const patternOffset = computed(() => scaledGap.value / 2); + + + + +