Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: If8fe8b38c1d9c4fecd40ff71f88d2ae06a6a6964
310 lines
5.2 KiB
SCSS
310 lines
5.2 KiB
SCSS
@use 'variables' as *;
|
|
@use 'mixins' as *;
|
|
|
|
// Graph view
|
|
|
|
.graph-view {
|
|
@include flex(column);
|
|
height: 100%;
|
|
background: $bg-1;
|
|
border-radius: $radius;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.graph-toolbar {
|
|
@include flex(row, flex-start, center, $space-8);
|
|
padding: $space-6 $space-8;
|
|
background: $bg-2;
|
|
border-bottom: 1px solid $border;
|
|
}
|
|
|
|
.graph-title {
|
|
font-size: $font-size-xl;
|
|
font-weight: $font-weight-semibold;
|
|
color: $text-0;
|
|
}
|
|
|
|
.graph-controls {
|
|
@include flex(row, flex-start, center, $space-4);
|
|
font-size: $font-size-md;
|
|
color: $text-1;
|
|
|
|
select {
|
|
padding: $space-2 20px $space-2 $space-4;
|
|
font-size: $font-size-base;
|
|
background: $bg-3;
|
|
}
|
|
}
|
|
|
|
.graph-stats {
|
|
margin-left: auto;
|
|
font-size: $font-size-base;
|
|
color: $text-2;
|
|
}
|
|
|
|
.graph-container {
|
|
flex: 1;
|
|
position: relative;
|
|
@include flex-center;
|
|
overflow: hidden;
|
|
background: $bg-0;
|
|
}
|
|
|
|
.graph-loading,
|
|
.graph-error,
|
|
.graph-empty {
|
|
@include flex(column, center, center, $space-5);
|
|
padding: 48px;
|
|
color: $text-2;
|
|
font-size: $font-size-lg;
|
|
text-align: center;
|
|
}
|
|
|
|
.graph-svg {
|
|
max-width: 100%;
|
|
max-height: 100%;
|
|
cursor: grab;
|
|
}
|
|
|
|
.graph-svg-container {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.graph-zoom-controls {
|
|
position: absolute;
|
|
top: $space-8;
|
|
left: $space-8;
|
|
@include flex(column, flex-start, stretch, $space-4);
|
|
z-index: 5;
|
|
}
|
|
|
|
.zoom-btn {
|
|
width: 36px;
|
|
height: 36px;
|
|
border-radius: 6px;
|
|
background: $bg-2;
|
|
border: 1px solid $border;
|
|
color: $text-0;
|
|
font-size: 18px;
|
|
font-weight: bold;
|
|
@include flex-center;
|
|
cursor: pointer;
|
|
transition: all $transition-slow;
|
|
box-shadow: $shadow-sm;
|
|
|
|
&:hover {
|
|
background: $bg-3;
|
|
border-color: $border-strong;
|
|
transform: scale(1.05);
|
|
}
|
|
|
|
&:active {
|
|
transform: scale(0.95);
|
|
}
|
|
}
|
|
|
|
// Graph elements
|
|
|
|
.graph-edges line {
|
|
stroke: $border-strong;
|
|
stroke-width: 1;
|
|
opacity: 0.6;
|
|
|
|
&.edge-type-wikilink {
|
|
stroke: $accent;
|
|
}
|
|
|
|
&.edge-type-embed {
|
|
stroke: $graph-edge-embed;
|
|
stroke-dasharray: 4 2;
|
|
}
|
|
}
|
|
|
|
.graph-nodes {
|
|
.graph-node {
|
|
cursor: pointer;
|
|
|
|
circle {
|
|
fill: $graph-node-fill;
|
|
stroke: $graph-node-stroke;
|
|
stroke-width: 2;
|
|
transition: fill $transition-slow, stroke $transition-slow;
|
|
}
|
|
|
|
&:hover circle {
|
|
fill: $graph-node-hover;
|
|
}
|
|
|
|
&.selected circle {
|
|
fill: $accent;
|
|
stroke: $graph-node-selected;
|
|
}
|
|
|
|
text {
|
|
fill: $text-1;
|
|
font-size: 11px;
|
|
pointer-events: none;
|
|
text-anchor: middle;
|
|
dominant-baseline: central;
|
|
transform: translateY(16px);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Node details panel
|
|
|
|
.node-details-panel {
|
|
position: absolute;
|
|
top: $space-8;
|
|
right: $space-8;
|
|
width: 280px;
|
|
background: $bg-2;
|
|
border: 1px solid $border;
|
|
border-radius: $radius;
|
|
box-shadow: $shadow;
|
|
z-index: 10;
|
|
}
|
|
|
|
.node-details-header {
|
|
@include flex-between;
|
|
padding: $space-5 14px;
|
|
border-bottom: 1px solid $border-subtle;
|
|
|
|
h3 {
|
|
font-size: $font-size-lg;
|
|
font-weight: $font-weight-semibold;
|
|
color: $text-0;
|
|
margin: 0;
|
|
@include text-truncate;
|
|
}
|
|
|
|
.close-btn {
|
|
background: none;
|
|
border: none;
|
|
color: $text-2;
|
|
cursor: pointer;
|
|
font-size: 14px;
|
|
padding: $space-1 $space-3;
|
|
line-height: 1;
|
|
|
|
&:hover {
|
|
color: $text-0;
|
|
}
|
|
}
|
|
}
|
|
|
|
.node-details-content {
|
|
padding: 14px;
|
|
|
|
.node-title {
|
|
font-size: $font-size-md;
|
|
color: $text-1;
|
|
margin-bottom: $space-6;
|
|
}
|
|
}
|
|
|
|
.node-stats {
|
|
display: flex;
|
|
gap: $space-8;
|
|
margin-bottom: $space-6;
|
|
|
|
.stat {
|
|
font-size: $font-size-md;
|
|
color: $text-2;
|
|
|
|
strong {
|
|
color: $text-0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Physics controls
|
|
|
|
.physics-controls-panel {
|
|
position: absolute;
|
|
top: $space-8;
|
|
right: $space-8;
|
|
width: 300px;
|
|
background: $bg-2;
|
|
border: 1px solid $border;
|
|
border-radius: $radius;
|
|
box-shadow: $shadow;
|
|
padding: $space-8;
|
|
z-index: 10;
|
|
|
|
h4 {
|
|
font-size: $font-size-lg;
|
|
font-weight: $font-weight-semibold;
|
|
color: $text-0;
|
|
margin: 0 0 $space-8 0;
|
|
padding-bottom: $space-4;
|
|
border-bottom: 1px solid $border-subtle;
|
|
}
|
|
|
|
.btn {
|
|
width: 100%;
|
|
margin-top: $space-4;
|
|
}
|
|
}
|
|
|
|
.control-group {
|
|
margin-bottom: 14px;
|
|
|
|
label {
|
|
display: block;
|
|
font-size: $font-size-base;
|
|
font-weight: $font-weight-medium;
|
|
color: $text-1;
|
|
margin-bottom: 6px;
|
|
text-transform: uppercase;
|
|
letter-spacing: $letter-spacing-uppercase;
|
|
}
|
|
|
|
input[type='range'] {
|
|
width: 100%;
|
|
height: 4px;
|
|
border-radius: $space-2;
|
|
background: $bg-3;
|
|
outline: none;
|
|
-webkit-appearance: none;
|
|
|
|
&::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
appearance: none;
|
|
width: 14px;
|
|
height: 14px;
|
|
border-radius: 50%;
|
|
background: $accent;
|
|
cursor: pointer;
|
|
transition: transform $transition-base;
|
|
|
|
&:hover {
|
|
transform: scale(1.15);
|
|
}
|
|
}
|
|
|
|
&::-moz-range-thumb {
|
|
width: 14px;
|
|
height: 14px;
|
|
border-radius: 50%;
|
|
background: $accent;
|
|
cursor: pointer;
|
|
border: none;
|
|
transition: transform $transition-base;
|
|
|
|
&:hover {
|
|
transform: scale(1.15);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.control-value {
|
|
display: inline-block;
|
|
margin-top: $space-1;
|
|
font-size: $font-size-base;
|
|
color: $text-2;
|
|
font-family: $font-family-mono;
|
|
}
|