.dioxus-flow {
--df-bg: #fafafa;
--df-node-bg: #ffffff;
--df-node-color: #1a1a2e;
--df-node-border: #d4d4d8;
--df-accent: #6366f1;
--df-edge: #9ca3af;
--df-edge-selected: var(--df-accent);
--df-edge-label: #52525b;
--df-handle-bg: #ffffff;
--df-handle-border: #71717a;
--df-grid: #d4d4d8;
--df-panel-bg: #ffffff;
--df-panel-border: #e4e4e7;
--df-panel-color: #52525b;
--df-minimap-node: #e4e4e7;
--df-minimap-mask: rgba(99, 102, 241, 0.08);
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
overflow: clip;
background: var(--df-bg);
cursor: var(--df-cursor, default);
touch-action: none;
user-select: none;
-webkit-user-select: none;
outline: none;
}
@media (prefers-color-scheme: dark) {
.dioxus-flow {
--df-bg: #101014;
--df-node-bg: #1c1c22;
--df-node-color: #e4e4e7;
--df-node-border: #3f3f46;
--df-edge: #52525b;
--df-edge-label: #a1a1aa;
--df-handle-bg: #27272a;
--df-handle-border: #a1a1aa;
--df-grid: #2b2b31;
--df-panel-bg: #1c1c22;
--df-panel-border: #33333a;
--df-panel-color: #d4d4d8;
--df-minimap-node: #3f3f46;
--df-minimap-mask: rgba(99, 102, 241, 0.15);
}
}
.dioxus-flow:focus-visible {
outline: 2px solid var(--df-accent);
outline-offset: -2px;
}
.dioxus-flow.df-panning {
cursor: grabbing;
}
.dioxus-flow.df-connecting {
cursor: crosshair;
}
.df-viewport {
position: absolute;
top: 0;
left: 0;
transform-origin: 0 0;
will-change: transform;
z-index: 1;
}
.df-background {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
z-index: 0;
pointer-events: none;
}
.df-background-dot {
fill: var(--df-grid);
}
.df-background-line {
stroke: var(--df-grid);
}
.df-edges,
.df-connection {
position: absolute;
top: 0;
left: 0;
width: 2px;
height: 2px;
overflow: visible;
pointer-events: none;
}
.df-nodes {
position: absolute;
top: 0;
left: 0;
}
.df-world-layer {
position: absolute;
top: 0;
left: 0;
transform-origin: 0 0;
z-index: 2;
pointer-events: none;
}
.df-node {
position: absolute;
top: 0;
left: 0;
cursor: grab;
animation: df-node-enter 220ms ease-out;
outline: none;
}
.df-node:focus-visible {
outline: 2px solid var(--df-accent);
outline-offset: 3px;
border-radius: 8px;
}
.df-node.df-dragging {
cursor: grabbing;
}
@keyframes df-node-enter {
from {
opacity: 0;
scale: 0.85;
}
to {
opacity: 1;
scale: 1;
}
}
.df-node-default {
min-width: 130px;
max-width: 240px;
padding: 9px 16px;
border-radius: 8px;
border: 1px solid var(--df-node-border);
background: var(--df-node-bg);
color: var(--df-node-color);
font-size: 13px;
font-family: inherit;
text-align: center;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.07);
transition: box-shadow 120ms ease, border-color 120ms ease;
}
.df-node-default .df-node-label {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.df-node.df-selected .df-node-default {
border-color: var(--df-accent);
box-shadow:
0 0 0 1px var(--df-accent),
0 4px 12px rgba(0, 0, 0, 0.12);
}
.df-node.df-dragging .df-node-default {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
}
.df-handle {
position: absolute;
width: 10px;
height: 10px;
border-radius: 9999px;
background: var(--df-handle-bg);
border: 1.5px solid var(--df-handle-border);
transform: translate(-50%, -50%);
cursor: crosshair;
transition:
scale 120ms ease,
border-color 120ms ease,
background 120ms ease;
z-index: 10;
}
.df-handle:hover,
.df-handle.df-connecting-from {
border-color: var(--df-accent);
scale: 1.35;
}
.df-handle.df-valid-target {
border-color: var(--df-accent);
animation: df-handle-pulse 900ms ease-in-out infinite;
}
.df-handle.df-snap {
background: var(--df-accent);
border-color: var(--df-accent);
scale: 1.6;
animation: none;
}
@keyframes df-handle-pulse {
0%,
100% {
box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.45);
}
50% {
box-shadow: 0 0 0 5px rgba(99, 102, 241, 0);
}
}
.df-edge-path {
fill: none;
stroke: var(--df-edge);
stroke-width: 1.5;
transition: stroke 120ms ease;
}
.df-edge:hover .df-edge-path {
stroke: var(--df-edge-selected);
}
.df-edge.df-selected .df-edge-path {
stroke: var(--df-edge-selected);
stroke-width: 2;
}
.df-edge.df-animated .df-edge-path {
stroke-dasharray: 6 4;
animation: df-edge-dash 500ms linear infinite;
}
@keyframes df-edge-dash {
from {
stroke-dashoffset: 10;
}
to {
stroke-dashoffset: 0;
}
}
.df-edge-hit {
fill: none;
stroke: transparent;
stroke-width: 14;
pointer-events: stroke;
cursor: pointer;
}
.df-edge-arrow {
fill: var(--df-edge);
stroke: none;
transition: fill 120ms ease;
}
.df-edge:hover .df-edge-arrow,
.df-edge.df-selected .df-edge-arrow {
fill: var(--df-edge-selected);
}
.df-ports {
z-index: 2;
}
.df-port {
fill: var(--df-handle-border);
transition: fill 120ms ease;
}
.df-ports g.df-selected .df-port {
fill: var(--df-edge-selected);
}
.df-edge:hover .df-edge-label,
.df-edge.df-selected .df-edge-label {
fill: var(--df-edge-selected);
}
.df-edge-label {
fill: var(--df-edge-label);
font-size: 11px;
font-family: inherit;
text-anchor: middle;
dominant-baseline: middle;
paint-order: stroke;
stroke: var(--df-bg);
stroke-width: 4px;
stroke-linejoin: round;
pointer-events: none;
transition: fill 120ms ease;
}
.df-connection-path {
fill: none;
stroke: var(--df-accent);
stroke-width: 1.8;
stroke-dasharray: 6 4;
animation: df-edge-dash 500ms linear infinite;
}
.df-controls {
position: absolute;
bottom: 14px;
left: 14px;
z-index: 5;
display: flex;
flex-direction: column;
border-radius: 8px;
overflow: hidden;
border: 1px solid var(--df-panel-border);
background: var(--df-panel-bg);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.df-control-btn {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
padding: 0;
border: none;
border-bottom: 1px solid var(--df-panel-border);
background: transparent;
color: var(--df-panel-color);
cursor: pointer;
transition: background 100ms ease;
}
.df-control-btn:last-child {
border-bottom: none;
}
.df-control-btn:hover {
background: rgba(127, 127, 127, 0.12);
}
.df-control-btn svg {
width: 15px;
height: 15px;
}
.df-minimap {
position: absolute;
bottom: 14px;
right: 14px;
z-index: 5;
border-radius: 8px;
border: 1px solid var(--df-panel-border);
background: var(--df-panel-bg);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
cursor: pointer;
}
.df-minimap-node {
fill: var(--df-minimap-node);
pointer-events: none;
}
.df-minimap-node.df-selected {
fill: var(--df-accent);
}
.df-minimap-viewport {
fill: var(--df-minimap-mask);
stroke: var(--df-accent);
stroke-width: 1;
vector-effect: non-scaling-stroke;
pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
.df-node {
animation: none;
}
.df-edge.df-animated .df-edge-path,
.df-connection-path {
animation: none;
}
.df-handle.df-valid-target {
animation: none;
}
}