Files
SHiNE-server/shine-UI/styles/features/network.css
T

397 lines
8.1 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Connections/network feature styles layered before network-graph.css. */
.node-dot img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
border-radius: 50%;
display: block;
opacity: 0;
transition: opacity 120ms ease;
}
.network-board {
position: relative;
height: 290px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: var(--radius-lg);
background: radial-gradient(circle at center, rgba(83, 216, 251, 0.08), rgba(255, 255, 255, 0.01));
overflow: hidden;
}
.network-screen {
position: relative;
margin: -14px -14px -24px;
min-height: calc(100dvh - 74px);
}
.app-shell--scroll-locked .screen-content .network-screen {
margin: 0 0 -24px;
}
.network-stage {
position: relative;
height: calc(100dvh - 74px);
overflow: hidden;
}
.network-board--full {
position: absolute;
inset: 0;
min-height: 0;
height: 100%;
border-radius: 0;
}
.network-legend {
display: flex;
flex-wrap: wrap;
gap: 10px;
font-size: 12px;
color: #bfd2ff;
}
.network-legend span {
display: inline-flex;
align-items: center;
gap: 6px;
}
.legend-line,
.legend-arrow {
width: 18px;
height: 2px;
display: inline-block;
border-radius: 2px;
background: rgba(120, 179, 255, 0.95);
position: relative;
}
.legend-line.relative {
background: rgba(255, 159, 94, 0.95);
}
.legend-arrow::after {
content: "";
position: absolute;
right: -1px;
top: -3px;
border-top: 4px solid transparent;
border-bottom: 4px solid transparent;
border-left: 6px solid rgba(120, 179, 255, 0.95);
}
.network-svg {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.network-link {
stroke-width: 2;
}
.network-link.is-friend {
stroke: rgba(120, 179, 255, 0.88);
}
.network-link.is-relative {
stroke: rgba(255, 159, 94, 0.9);
}
.node-dot {
position: relative;
width: 52px;
height: 52px;
margin: 0 auto 4px;
border-radius: 50%;
display: grid;
place-items: center;
font-weight: 700;
background: #2b3f66;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 8px 16px rgba(4, 8, 15, 0.35);
}
.node-badge-official {
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
min-width: 26px;
height: 18px;
padding: 0 6px;
border-radius: 999px;
border: 1px solid transparent;
background: linear-gradient(180deg, rgba(255, 219, 145, 0.98), rgba(232, 165, 64, 0.98));
color: #3a2003;
font-size: 10px;
line-height: 16px;
font-weight: 800;
letter-spacing: 0.3px;
text-transform: uppercase;
box-shadow: 0 6px 14px rgba(0, 0, 0, 0.3);
z-index: 2;
}
.node.is-shine .node-dot::before {
content: "";
position: absolute;
inset: -14px;
border-radius: 50%;
background: radial-gradient(circle, rgba(130, 235, 255, 0.62) 0%, rgba(130, 235, 255, 0.28) 42%, rgba(130, 235, 255, 0) 76%);
filter: blur(2px);
z-index: -1;
}
.node.is-shine .node-dot {
box-shadow: 0 0 0 2px rgba(143, 231, 255, 0.5), 0 0 28px rgba(102, 220, 255, 0.58), 0 8px 16px rgba(4, 8, 15, 0.35);
}
.node.is-friend .node-dot {
background: linear-gradient(165deg, #2f4f80, #2a3f62);
}
.node.is-relative .node-dot {
background: linear-gradient(165deg, #785038, #5f3e2c);
border-color: rgba(255, 194, 143, 0.55);
}
.node.center .node-dot {
width: 60px;
height: 60px;
background: linear-gradient(130deg, #3a5f8e, #3dc4df);
color: #061119;
}
.node-label {
display: grid;
gap: 1px;
margin-top: 1px;
font-size: 10px;
color: #d6e2ff;
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.28);
line-height: 1.12;
}
.node-label.is-login-only .node-name {
display: none;
}
.node-name {
display: grid;
gap: 1px;
color: #f2f6ff;
}
.node-name-line {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.node-login {
display: block;
color: #c8dafd;
font-size: 10px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.node-relation {
display: block;
color: #ffd5b3;
font-size: 10px;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.network-search-candidate {
width: 100%;
justify-content: flex-start;
}
.network-search-candidate.is-selected {
border-color: rgba(132, 209, 255, 0.78);
background: rgba(65, 118, 191, 0.24);
}
.node:focus-visible .node-dot,
.node:hover .node-dot {
border-color: rgba(166, 218, 255, 0.92);
box-shadow: 0 0 0 3px rgba(77, 160, 255, 0.2), 0 8px 16px rgba(4, 8, 15, 0.35);
}
.node-menu {
position: absolute;
z-index: 3;
min-width: 240px;
padding: 8px;
}
.node-menu-actions {
display: grid;
gap: 8px;
}
/* Граф занимает ровно доступную область между общей шапкой и нижним toolbar. */
.app-shell--scroll-locked .screen-content .network-screen {
width: 100%;
height: 100%;
min-height: 0;
margin: 0;
}
.app-shell--scroll-locked .screen-content .network-stage {
width: 100%;
height: 100%;
min-height: 0;
}
/* В «Связях» screen-content намеренно без padding, поэтому тот же отступ задаём явно. */
.network-stage > .fg-filter-bar.app-top-tabs {
position: absolute;
top: var(--app-primary-tabs-top-gap);
left: 14px;
right: 14px;
z-index: 11;
min-height: var(--app-primary-tab-min-height);
padding: 0;
}
/* Одинаковая фактическая высота и типографика самих верхних чипов. */
.app-top-tabs .fg-filter-chip {
min-height: var(--app-primary-tab-min-height);
height: var(--app-primary-tab-min-height);
padding: 0 14px;
display: inline-flex;
align-items: center;
justify-content: center;
font-family: var(--font-main);
font-size: 12px;
font-weight: 600;
line-height: 1;
white-space: nowrap;
}
/* «Связи»: фильтры остаются ниже интерактивной части общего TopBar. */
.app-shell--scroll-locked .network-stage > .fg-filter-bar.app-top-tabs {
top: calc(var(--topbar-height, 64px) + var(--app-primary-tabs-top-gap, 14px));
}
/* ===== «Связи»: боковой fade, ослабленный в зоне центрального света =====
* Радиальная виньетка давала слишком общий эффект. Здесь края затухают независимо:
* по X — узкой мягкой полосой от левого/правого края, а по Y сила этой полосы
* уменьшается возле источника света графа (50% / 47%) и растёт к углам.
* Поэтому центральное свечение визуально доходит почти до боковой кромки, тогда как
* верхние/нижние участки графа растворяются по краям раньше. Blur не используется. */
.app-shell--scroll-locked .network-stage::after {
content: "";
position: absolute;
inset: 0;
z-index: 10;
pointer-events: none;
background:
linear-gradient(
to right,
rgba(5, 7, 10, 0.96) 0%,
rgba(5, 7, 10, 0.72) 4%,
rgba(5, 7, 10, 0.42) 8%,
rgba(5, 7, 10, 0.18) 12%,
rgba(5, 7, 10, 0.06) 15%,
rgba(5, 7, 10, 0) 18%
) left center / 50% 100% no-repeat,
linear-gradient(
to left,
rgba(5, 7, 10, 0.96) 0%,
rgba(5, 7, 10, 0.72) 4%,
rgba(5, 7, 10, 0.42) 8%,
rgba(5, 7, 10, 0.18) 12%,
rgba(5, 7, 10, 0.06) 15%,
rgba(5, 7, 10, 0) 18%
) right center / 50% 100% no-repeat;
-webkit-mask-image: linear-gradient(
to bottom,
rgba(0, 0, 0, 0.96) 0%,
rgba(0, 0, 0, 0.76) 18%,
rgba(0, 0, 0, 0.46) 34%,
rgba(0, 0, 0, 0.18) 47%,
rgba(0, 0, 0, 0.28) 58%,
rgba(0, 0, 0, 0.54) 72%,
rgba(0, 0, 0, 0.82) 88%,
rgba(0, 0, 0, 0.96) 100%
);
mask-image: linear-gradient(
to bottom,
rgba(0, 0, 0, 0.96) 0%,
rgba(0, 0, 0, 0.76) 18%,
rgba(0, 0, 0, 0.46) 34%,
rgba(0, 0, 0, 0.18) 47%,
rgba(0, 0, 0, 0.28) 58%,
rgba(0, 0, 0, 0.54) 72%,
rgba(0, 0, 0, 0.82) 88%,
rgba(0, 0, 0, 0.96) 100%
);
}