pinakes/crates/pinakes-ui/assets/styles/_graph.scss
NotAShelf 3ccddce7fd
treewide: fix various UI bugs; optimize crypto dependencies & format
Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: If8fe8b38c1d9c4fecd40ff71f88d2ae06a6a6964
2026-03-06 18:29:33 +03:00

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;
}