From 43ff2a42e6d77251b3fe7987afa02c19cdb2f240 Mon Sep 17 00:00:00 2001
From: braks <78412429+bcakmakoglu@users.noreply.github.com>
Date: Tue, 18 Oct 2022 23:26:52 +0200
Subject: [PATCH] refactor(core,edges): add div based edge label renderer
---
.changeset/five-readers-teach.md | 5 +
.../components/Edges/EdgeLabelRenderer.vue | 23 +++
.../core/src/components/Edges/EdgeText.vue | 7 +-
packages/core/src/components/Edges/index.ts | 1 +
.../container/EdgeRenderer/EdgeRenderer.vue | 39 ++--
.../core/src/container/Viewport/Transform.vue | 3 +
packages/core/src/index.ts | 11 +-
packages/core/src/style.css | 7 +
packages/core/src/utils/graph.ts | 2 +-
packages/vue-flow/src/style.css | 177 ++++++++++--------
10 files changed, 168 insertions(+), 107 deletions(-)
create mode 100644 .changeset/five-readers-teach.md
create mode 100644 packages/core/src/components/Edges/EdgeLabelRenderer.vue
diff --git a/.changeset/five-readers-teach.md b/.changeset/five-readers-teach.md
new file mode 100644
index 00000000..37886f44
--- /dev/null
+++ b/.changeset/five-readers-teach.md
@@ -0,0 +1,5 @@
+---
+'@vue-flow/core': patch
+---
+
+Teleport edge labels into separate svg container (fixes edges overlapping edge labels)
diff --git a/packages/core/src/components/Edges/EdgeLabelRenderer.vue b/packages/core/src/components/Edges/EdgeLabelRenderer.vue
new file mode 100644
index 00000000..3de7b419
--- /dev/null
+++ b/packages/core/src/components/Edges/EdgeLabelRenderer.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/packages/core/src/components/Edges/EdgeText.vue b/packages/core/src/components/Edges/EdgeText.vue
index 752847b6..89c449b2 100644
--- a/packages/core/src/components/Edges/EdgeText.vue
+++ b/packages/core/src/components/Edges/EdgeText.vue
@@ -1,4 +1,5 @@
-
+
+
+
+
diff --git a/packages/core/src/container/Viewport/Transform.vue b/packages/core/src/container/Viewport/Transform.vue
index f45fd026..666aba73 100644
--- a/packages/core/src/container/Viewport/Transform.vue
+++ b/packages/core/src/container/Viewport/Transform.vue
@@ -53,6 +53,9 @@ export default {
:style="{ transform: `translate(${viewport.x}px,${viewport.y}px) scale(${viewport.zoom})`, opacity: ready ? undefined : 0 }"
>
+
+
+
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index 3bfbe49e..642d319b 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -7,7 +7,16 @@ export { default as VueFlow } from './container/VueFlow/VueFlow.vue'
export { default as Handle } from './components/Handle/Handle.vue'
-export { StraightEdge, StepEdge, BezierEdge, SimpleBezierEdge, SmoothStepEdge, BaseEdge, EdgeText } from './components/Edges'
+export {
+ StraightEdge,
+ StepEdge,
+ BezierEdge,
+ SimpleBezierEdge,
+ SmoothStepEdge,
+ BaseEdge,
+ EdgeText,
+ EdgeLabelRenderer,
+} from './components/Edges'
export { getBezierPath, getSimpleBezierPath, getSmoothStepPath, getStraightPath } from './components/Edges/utils'
diff --git a/packages/core/src/style.css b/packages/core/src/style.css
index e2bc3104..eed0db88 100644
--- a/packages/core/src/style.css
+++ b/packages/core/src/style.css
@@ -39,6 +39,13 @@
z-index: 5;
}
+.vue-flow__edge-labels {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+}
+
.vue-flow__nodesselection-rect:focus,
.vue-flow__nodesselection-rect:focus-visible {
outline: none;
diff --git a/packages/core/src/utils/graph.ts b/packages/core/src/utils/graph.ts
index 6ecca9a8..25a49cdd 100644
--- a/packages/core/src/utils/graph.ts
+++ b/packages/core/src/utils/graph.ts
@@ -106,7 +106,7 @@ export const parseEdge = (edge: Edge, defaults?: Partial): GraphEdge
selectable: edge.selectable,
data: shallowReactive(edge.data || {}),
events: shallowReactive(edge.events || {}),
- label: edge.label && !isString(edge.label) ? markRaw(edge.label) : undefined,
+ label: edge.label && !isString(edge.label) ? markRaw(edge.label) : edge.label,
...defaults,
} as GraphEdge)
: defaults
diff --git a/packages/vue-flow/src/style.css b/packages/vue-flow/src/style.css
index d8ed7a7c..4125a3ee 100644
--- a/packages/vue-flow/src/style.css
+++ b/packages/vue-flow/src/style.css
@@ -17,9 +17,9 @@
z-index: 1;
cursor: grab;
- &.dragging {
- cursor: grabbing;
- }
+&.dragging {
+ cursor: grabbing;
+ }
}
.vue-flow__transformationpane {
@@ -36,6 +36,13 @@
z-index: 5;
}
+.vue-flow__edge-labels {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+}
+
.vue-flow__nodesselection-rect:focus,
.vue-flow__nodesselection-rect:focus-visible {
outline: none;
@@ -57,48 +64,48 @@
pointer-events: visibleStroke;
cursor: pointer;
- &.animated path {
- stroke-dasharray: 5;
- animation: dashdraw 0.5s linear infinite;
- }
+&.animated path {
+ stroke-dasharray: 5;
+ animation: dashdraw 0.5s linear infinite;
+ }
- &.inactive {
- pointer-events: none;
- }
+&.inactive {
+ pointer-events: none;
+ }
- &.selected,
- &:focus,
- &:focus-visible {
- outline: none;
- }
+&.selected,
+&:focus,
+&:focus-visible {
+ outline: none;
+ }
- &.selected .vue-flow__edge-path,
- &:focus .vue-flow__edge-path,
- &:focus-visible .vue-flow__edge-path {
- stroke: #555;
- }
+&.selected .vue-flow__edge-path,
+&:focus .vue-flow__edge-path,
+&:focus-visible .vue-flow__edge-path {
+ stroke: #555;
+ }
- &-textwrapper {
- pointer-events: all;
- }
+&-textwrapper {
+ pointer-events: all;
+ }
- &-textbg {
- fill: white;
- }
+&-textbg {
+ fill: white;
+ }
- .vue-flow__edge-text {
- pointer-events: none;
- user-select: none;
- }
+&-text {
+ pointer-events: none;
+ user-select: none;
+ }
}
.vue-flow__connection {
pointer-events: none;
- &.animated {
- stroke-dasharray: 5;
- animation: dashdraw 0.5s linear infinite;
- }
+&.animated {
+ stroke-dasharray: 5;
+ animation: dashdraw 0.5s linear infinite;
+ }
}
.vue-flow__connectionline {
@@ -118,9 +125,9 @@
box-sizing: border-box;
cursor: grab;
- &.dragging {
- cursor: grabbing;
- }
+&.dragging {
+ cursor: grabbing;
+ }
}
.vue-flow__nodesselection {
@@ -128,11 +135,15 @@
transform-origin: left top;
pointer-events: none;
- &-rect {
- position: absolute;
- pointer-events: all;
- cursor: grab;
- }
+&-rect {
+ position: absolute;
+ pointer-events: all;
+ cursor: grab;
+
+&.dragging {
+ cursor: grabbing;
+ }
+}
}
.vue-flow__handle {
@@ -141,35 +152,35 @@
min-width: 5px;
min-height: 5px;
- &.connectable {
- pointer-events: all;
- cursor: crosshair;
- }
+&.connectable {
+ pointer-events: all;
+ cursor: crosshair;
+ }
- &-bottom {
- top: auto;
- left: 50%;
- bottom: -4px;
- transform: translate(-50%, 0);
- }
+&-bottom {
+ top: auto;
+ left: 50%;
+ bottom: -4px;
+ transform: translate(-50%, 0);
+ }
- &-top {
- left: 50%;
- top: -4px;
- transform: translate(-50%, 0);
- }
+&-top {
+ left: 50%;
+ top: -4px;
+ transform: translate(-50%, 0);
+ }
- &-left {
- top: 50%;
- left: -4px;
- transform: translate(0, -50%);
- }
+&-left {
+ top: 50%;
+ left: -4px;
+ transform: translate(0, -50%);
+ }
- &-right {
- right: -4px;
- top: 50%;
- transform: translate(0, -50%);
- }
+&-right {
+ right: -4px;
+ top: 50%;
+ transform: translate(0, -50%);
+ }
}
.vue-flow__edgeupdater {
@@ -182,26 +193,26 @@
z-index: 5;
margin: 15px;
- &.top {
- top: 0;
- }
+&.top {
+ top: 0;
+ }
- &.bottom {
- bottom: 0;
- }
+&.bottom {
+ bottom: 0;
+ }
- &.left {
- left: 0;
- }
+&.left {
+ left: 0;
+ }
- &.right {
- right: 0;
- }
+&.right {
+ right: 0;
+ }
- &.center {
- left: 50%;
- transform: translateX(-50%);
- }
+&.center {
+ left: 50%;
+ transform: translateX(-50%);
+ }
}
@keyframes dashdraw {