/* 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% ); }