diff --git a/mateclaw-ui/src/assets/main.css b/mateclaw-ui/src/assets/main.css
index 50b396d4..f7e43ed3 100644
--- a/mateclaw-ui/src/assets/main.css
+++ b/mateclaw-ui/src/assets/main.css
@@ -276,39 +276,66 @@ html.dark {
/* Vue Flow theme bridge — its default stylesheet ships hard-coded
light colors for handles / mini-map / control buttons. Map them to
- our theme tokens so dark mode inherits cleanly. */
-.vue-flow__handle {
+ our theme tokens so dark mode inherits cleanly.
+
+ Each selector is bumped to (0,2,0) specificity by scoping to
+ `.workflow-canvas` because vue-flow's component CSS imports inside
+ WorkflowCanvas.vue land in the bundle AFTER main.css; equal
+ specificity would lose. */
+.workflow-canvas .vue-flow__handle {
background: var(--mc-edge-strong, #777);
border-color: var(--mc-bg-elevated, #fff);
}
-.vue-flow__edge-path {
+.workflow-canvas .vue-flow__edge-path {
stroke: var(--mc-edge, #999);
}
-.vue-flow__edge-text {
+.workflow-canvas .vue-flow__edge-text {
fill: var(--mc-text-secondary, #555);
font-size: 11px;
}
-.vue-flow__edge-textbg {
+.workflow-canvas .vue-flow__edge-textbg {
fill: var(--mc-bg-elevated, #fff);
}
-.vue-flow__minimap {
- background: var(--mc-bg-sunken, rgba(0, 0, 0, 0.04)) !important;
+.workflow-canvas .vue-flow__background {
+ background: transparent;
+}
+.workflow-canvas .vue-flow__minimap {
+ background: var(--mc-bg-sunken, rgba(0, 0, 0, 0.04));
+ border: 1px solid var(--mc-border-light, rgba(0, 0, 0, 0.08));
+ border-radius: 6px;
+}
+.workflow-canvas .vue-flow__minimap-mask {
+ fill: var(--mc-bg-muted, rgba(0, 0, 0, 0.06));
+ stroke: var(--mc-border, transparent);
+}
+.workflow-canvas .vue-flow__controls {
+ box-shadow: var(--mc-shadow-soft, 0 2px 6px rgba(0, 0, 0, 0.1));
+ border-radius: 6px;
+ overflow: hidden;
+ background: var(--mc-bg-elevated, #ffffff);
border: 1px solid var(--mc-border-light, rgba(0, 0, 0, 0.08));
}
-.vue-flow__minimap-mask {
- fill: var(--mc-bg-muted, rgba(0, 0, 0, 0.06));
-}
-.vue-flow__controls {
- box-shadow: var(--mc-shadow-soft, 0 2px 6px rgba(0, 0, 0, 0.1));
-}
-.vue-flow__controls-button {
- background: var(--mc-bg-elevated, #fff);
- border-bottom-color: var(--mc-border-light, rgba(0, 0, 0, 0.08));
+.workflow-canvas .vue-flow__controls-button {
+ background: var(--mc-bg-elevated, #ffffff);
+ border-bottom: 1px solid var(--mc-border-light, rgba(0, 0, 0, 0.08));
fill: var(--mc-text-primary, #333);
+ color: var(--mc-text-primary, #333);
}
-.vue-flow__controls-button:hover {
+.workflow-canvas .vue-flow__controls-button svg {
+ fill: currentColor;
+}
+.workflow-canvas .vue-flow__controls-button:hover {
background: var(--mc-bg-muted, rgba(0, 0, 0, 0.05));
}
+/* Round the bottom button so the corner doesn't show the hardcoded grey
+ border vue-flow ships with. */
+.workflow-canvas .vue-flow__controls-button:last-child {
+ border-bottom: none;
+}
+/* Selection ring matches the brand accent in both modes. */
+.workflow-canvas .vue-flow__node.selected {
+ box-shadow: 0 0 0 2px var(--mc-primary, #4084ff);
+}
/* ================================================================
Base resets
diff --git a/mateclaw-ui/src/components/workflow/StepNode.vue b/mateclaw-ui/src/components/workflow/StepNode.vue
index 049f2883..74737a2d 100644
--- a/mateclaw-ui/src/components/workflow/StepNode.vue
+++ b/mateclaw-ui/src/components/workflow/StepNode.vue
@@ -3,8 +3,7 @@
class="step-node"
:class="`mode-${data.modeType}`"
:data-selected="props.selected"
- @click.stop="handleClick"
- @pointerdown.stop
+ @click="handleClick"
>