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);
+
+
+
+
+
+
+
+
+
+