// hikari-extra-components/styles/components/node_graph.scss
// Node graph editor styles
@use '../../../theme/styles/mixins.scss' as *;
// ============================================
// Canvas
// ============================================
.hi-node-graph-canvas {
position: relative;
overflow: hidden;
background-color: var(--hi-color-background);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-lg;
outline: none;
&:focus {
border-color: var(--hi-color-primary);
box-shadow: 0 0 0 2px rgba(var(--hi-color-primary-rgb, 255, 179, 167), 0.2);
}
}
.hi-node-graph-svg-layer {
position: absolute;
inset: 0;
pointer-events: none;
svg {
pointer-events: auto;
}
}
.hi-node-graph-nodes {
position: absolute;
inset: 0;
transform-origin: 0 0;
}
.hi-node-graph-overlay-layer {
position: absolute;
inset: 0;
pointer-events: none;
z-index: 1000;
}
// ============================================
// Node
// ============================================
.hi-node-graph-node {
position: absolute;
min-width: 120px;
background-color: var(--hi-color-surface);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-md;
box-shadow: $hikari-shadow-md;
cursor: grab;
user-select: none;
transition: box-shadow $hikari-transition-fast;
&:hover {
box-shadow: $hikari-shadow-lg, 0 0 12px rgba(59, 130, 246, 0.15);
}
&:active {
cursor: grabbing;
}
}
.hi-node-selected {
border-color: var(--hi-color-primary);
box-shadow: $hikari-shadow-lg, 0 0 20px rgba(var(--hi-color-primary-rgb, 255, 179, 167), 0.3);
}
.hi-node-minimized {
.hi-node-body,
.hi-node-ports {
display: none;
}
}
.hi-node-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: $hikari-spacing-sm $hikari-spacing-md;
background: linear-gradient(135deg, rgba(0, 0, 0, 0.03), transparent);
border-bottom: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-md $hikari-radius-md 0 0;
font-size: $hikari-font-size-sm;
font-weight: 600;
color: var(--hi-color-text-primary);
}
.hi-node-title {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 160px;
}
.hi-node-minimized-icon {
font-size: $hikari-font-size-xs;
color: var(--hi-color-text-secondary);
}
.hi-node-body {
padding: $hikari-spacing-sm $hikari-spacing-md;
font-size: $hikari-font-size-sm;
color: var(--hi-color-text-secondary);
}
// ============================================
// Ports
// ============================================
.hi-node-ports {
display: flex;
flex-direction: column;
gap: $hikari-spacing-xs;
padding: $hikari-spacing-xs $hikari-spacing-sm $hikari-spacing-sm;
}
.hi-node-port {
display: flex;
align-items: center;
gap: $hikari-spacing-sm;
padding: $hikari-spacing-xs $hikari-spacing-sm;
font-size: $hikari-font-size-xs;
color: var(--hi-color-text-secondary);
border-radius: $hikari-radius-sm;
transition: all $hikari-transition-fast;
&:hover {
background-color: rgba(0, 0, 0, 0.04);
color: var(--hi-color-text-primary);
}
}
.hi-port-input {
flex-direction: row;
}
.hi-port-output {
flex-direction: row-reverse;
text-align: right;
}
.hi-port-dot {
width: 10px;
height: 10px;
border-radius: 50%;
border: 2px solid var(--hi-color-border);
background-color: var(--hi-color-surface);
flex-shrink: 0;
transition: all $hikari-transition-fast;
&:hover {
border-color: var(--hi-color-primary);
box-shadow: 0 0 8px rgba(var(--hi-color-primary-rgb, 255, 179, 167), 0.4);
}
}
.hi-port-dot-connected {
background-color: var(--hi-color-primary);
border-color: var(--hi-color-primary);
}
.hi-port-label {
font-size: $hikari-font-size-xs;
}
// ============================================
// Connections
// ============================================
.hi-connection-path {
stroke: var(--hi-color-border);
stroke-width: 2;
fill: none;
transition: stroke $hikari-transition-fast;
&:hover {
stroke: var(--hi-color-primary);
stroke-width: 3;
}
}
.hi-connection-selected {
stroke: var(--hi-color-primary);
stroke-width: 2.5;
filter: drop-shadow(0 0 6px rgba(var(--hi-color-primary-rgb, 255, 179, 167), 0.5));
}
// ============================================
// Controls
// ============================================
.hi-node-graph-controls {
position: absolute;
bottom: $hikari-spacing-md;
left: $hikari-spacing-md;
display: flex;
gap: $hikari-spacing-sm;
z-index: 100;
}
.hi-controls-group {
display: flex;
gap: $hikari-spacing-xs;
padding: $hikari-spacing-xs;
background-color: var(--hi-color-surface);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-md;
box-shadow: $hikari-shadow-md;
backdrop-filter: blur(8px);
}
.hi-control-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: $hikari-spacing-xs $hikari-spacing-sm;
background-color: transparent;
border: 1px solid transparent;
border-radius: $hikari-radius-sm;
font-size: $hikari-font-size-xs;
font-weight: 500;
color: var(--hi-color-text-primary);
cursor: pointer;
transition: all $hikari-transition-fast;
&:hover:not(:disabled) {
background-color: rgba(0, 0, 0, 0.05);
border-color: var(--hi-color-border);
}
&:active:not(:disabled) {
transform: scale(0.95);
}
&:disabled {
opacity: 0.4;
cursor: not-allowed;
}
}
// ============================================
// Minimap
// ============================================
.hi-minimap {
position: absolute;
bottom: $hikari-spacing-md;
right: $hikari-spacing-md;
width: 200px;
height: 150px;
background-color: var(--hi-color-surface);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-md;
box-shadow: $hikari-shadow-md;
overflow: hidden;
z-index: 100;
opacity: 0.9;
&:hover {
opacity: 1;
}
}
.hi-minimap-nodes {
position: absolute;
inset: 0;
}
.hi-minimap-node {
position: absolute;
background-color: rgba(var(--hi-color-primary-rgb, 255, 179, 167), 0.6);
border: 1px solid var(--hi-color-primary);
border-radius: 2px;
}
.hi-minimap-viewport {
position: absolute;
border: 2px solid var(--hi-color-primary);
background-color: rgba(var(--hi-color-primary-rgb, 255, 179, 167), 0.1);
border-radius: 2px;
pointer-events: none;
}
.hi-minimap-connections {
position: absolute;
inset: 0;
pointer-events: none;
}
// ============================================
// Viewport Info
// ============================================
.hi-viewport-info {
display: flex;
align-items: center;
gap: $hikari-spacing-sm;
padding: $hikari-spacing-xs $hikari-spacing-sm;
font-family: $hikari-font-family-mono;
font-size: $hikari-font-size-xs;
color: var(--hi-color-text-secondary);
}
.hi-viewport-zoom {
min-width: 40px;
text-align: center;
font-weight: 600;
color: var(--hi-color-text-primary);
}
// ============================================
// Grid Pattern (SVG)
// ============================================
.hi-node-graph-svg {
.hi-node-graph-connections {
pointer-events: auto;
}
}
// ============================================
// Responsive
// ============================================
@include mobile {
.hi-node-graph-controls {
flex-direction: column;
bottom: $hikari-spacing-sm;
left: $hikari-spacing-sm;
}
.hi-minimap {
width: 120px;
height: 90px;
}
.hi-control-btn {
padding: $hikari-spacing-xs;
font-size: $hikari-font-size-xs;
}
}