SHA256
Compare commits
| Author | SHA256 | Date | |
|---|---|---|---|
|
|
8801b93973 | ||
|
|
a66d7a64e6 | ||
|
|
a8596d3350 | ||
|
|
8a5dabee95 | ||
|
|
da859468d3 | ||
|
|
78ddb8ffb6 | ||
|
|
db37f35d09 | ||
|
|
d8f5fe4fd0 |
Binary file not shown.
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
client.version=1.7.6
|
client.version=1.10.0
|
||||||
server.version=1.6.2
|
server.version=1.8.0
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@
|
|||||||
<link rel="apple-touch-icon" href="./img/logo.jpg" />
|
<link rel="apple-touch-icon" href="./img/logo.jpg" />
|
||||||
<title>СИЯНИЕ</title>
|
<title>СИЯНИЕ</title>
|
||||||
<script>
|
<script>
|
||||||
window.__SHINE_BUILD_HASH__ = '20260826145335';
|
window.__SHINE_BUILD_HASH__ = '20260901134200';
|
||||||
window.__SHINE_CLIENT_VERSION__ = '1.2.10';
|
window.__SHINE_CLIENT_VERSION__ = '1.2.10';
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
@@ -17,11 +17,15 @@ import { formatRelativeTime } from '../services/channels-ux.js';
|
|||||||
|
|
||||||
export const pageMeta = { id: 'messages-list', title: 'Личные сообщения' };
|
export const pageMeta = { id: 'messages-list', title: 'Личные сообщения' };
|
||||||
const PREVIEW_MAX_LEN = 200;
|
const PREVIEW_MAX_LEN = 200;
|
||||||
|
const SVG_CHEVRON = `
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
||||||
|
<path d="M9 6l6 6-6 6"></path>
|
||||||
|
</svg>
|
||||||
|
`;
|
||||||
const DM_BLOB_PREVIEW_CACHE = new Map();
|
const DM_BLOB_PREVIEW_CACHE = new Map();
|
||||||
const DM_BLOB_PREVIEW_PENDING = new Map();
|
const DM_BLOB_PREVIEW_PENDING = new Map();
|
||||||
const dmAvatarSnapshotCache = new Map();
|
const dmAvatarSnapshotCache = new Map();
|
||||||
const dmAvatarPendingByLogin = new Map();
|
const dmAvatarPendingByLogin = new Map();
|
||||||
const SVG_CHEVRON = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"/></svg>';
|
|
||||||
|
|
||||||
const RELATION_ORDER = new Map([
|
const RELATION_ORDER = new Map([
|
||||||
['close_friend', 0],
|
['close_friend', 0],
|
||||||
@@ -187,6 +191,7 @@ function compareChatRows(a, b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function render({ navigate, chrome }) {
|
export function render({ navigate, chrome }) {
|
||||||
|
const login = String(state.session.login || '').trim();
|
||||||
const screen = document.createElement('section');
|
const screen = document.createElement('section');
|
||||||
screen.className = 'stack dm-screen dm-list-screen';
|
screen.className = 'stack dm-screen dm-list-screen';
|
||||||
const head = document.createElement('header');
|
const head = document.createElement('header');
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { makeProfileRoute } from '../services/shine-routes.js';
|
|||||||
import { makeProfileLinksRoute } from '../services/shine-routes.js';
|
import { makeProfileLinksRoute } from '../services/shine-routes.js';
|
||||||
import { createForceGraph } from './network/force-graph.js';
|
import { createForceGraph } from './network/force-graph.js';
|
||||||
import { engineModelFromGraphModel } from './network/adapter.js';
|
import { engineModelFromGraphModel } from './network/adapter.js';
|
||||||
import { openNodeMenu, relationLabelRu } from './network/node-menu.js';
|
import { openNodeMenu } from './network/node-menu.js';
|
||||||
|
|
||||||
export const pageMeta = { id: 'network-view', title: 'Связи' };
|
export const pageMeta = { id: 'network-view', title: 'Связи' };
|
||||||
|
|
||||||
@@ -24,6 +24,32 @@ function createDebounced(fn, delayMs = 2000) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createHeaderSearchIcon() {
|
||||||
|
const ns = 'http://www.w3.org/2000/svg';
|
||||||
|
const svg = document.createElementNS(ns, 'svg');
|
||||||
|
svg.setAttribute('viewBox', '0 0 24 24');
|
||||||
|
svg.setAttribute('aria-hidden', 'true');
|
||||||
|
svg.setAttribute('class', 'header-icon-svg header-icon-svg--search');
|
||||||
|
|
||||||
|
const circle = document.createElementNS(ns, 'circle');
|
||||||
|
circle.setAttribute('cx', '11');
|
||||||
|
circle.setAttribute('cy', '11');
|
||||||
|
circle.setAttribute('r', '6.5');
|
||||||
|
circle.setAttribute('fill', 'none');
|
||||||
|
circle.setAttribute('stroke', 'currentColor');
|
||||||
|
circle.setAttribute('stroke-width', '2');
|
||||||
|
|
||||||
|
const handle = document.createElementNS(ns, 'path');
|
||||||
|
handle.setAttribute('d', 'M16 16l4.5 4.5');
|
||||||
|
handle.setAttribute('fill', 'none');
|
||||||
|
handle.setAttribute('stroke', 'currentColor');
|
||||||
|
handle.setAttribute('stroke-width', '2');
|
||||||
|
handle.setAttribute('stroke-linecap', 'round');
|
||||||
|
|
||||||
|
svg.append(circle, handle);
|
||||||
|
return svg;
|
||||||
|
}
|
||||||
|
|
||||||
function normKey(value) {
|
function normKey(value) {
|
||||||
return normalizeLogin(value).toLowerCase();
|
return normalizeLogin(value).toLowerCase();
|
||||||
}
|
}
|
||||||
@@ -237,7 +263,6 @@ export function render({ navigate, route, chrome } = {}) {
|
|||||||
let centerLogin = normalizeLogin(persistedCenterLogin || state.session.login || '');
|
let centerLogin = normalizeLogin(persistedCenterLogin || state.session.login || '');
|
||||||
let centerHistory = Array.isArray(persistedCenterHistory) ? [...persistedCenterHistory] : [];
|
let centerHistory = Array.isArray(persistedCenterHistory) ? [...persistedCenterHistory] : [];
|
||||||
let engine = null;
|
let engine = null;
|
||||||
let sheetEl = null;
|
|
||||||
let loadSeq = 0;
|
let loadSeq = 0;
|
||||||
|
|
||||||
// Фильтры слоёв (Фаза 3). Фокус всегда виден; предикат применяется к периферийным узлам.
|
// Фильтры слоёв (Фаза 3). Фокус всегда виден; предикат применяется к периферийным узлам.
|
||||||
@@ -400,41 +425,6 @@ export function render({ navigate, route, chrome } = {}) {
|
|||||||
window.setTimeout(() => inputEl.focus(), 0);
|
window.setTimeout(() => inputEl.focus(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Нижний сниппет (bottom sheet) с краткой сводкой об узле; не блокирует карту.
|
|
||||||
function showNodeSheet(node) {
|
|
||||||
if (!sheetEl) {
|
|
||||||
sheetEl = document.createElement('div');
|
|
||||||
sheetEl.className = 'fg-sheet';
|
|
||||||
stage.append(sheetEl);
|
|
||||||
}
|
|
||||||
const login = normalizeLogin(node.login);
|
|
||||||
const shineBadge = node.shining ? '<span class="fg-sheet-badge">сияющий</span>' : '';
|
|
||||||
sheetEl.innerHTML = `
|
|
||||||
<button class="fg-sheet-close" type="button" data-act="close" aria-label="Закрыть">✕</button>
|
|
||||||
<div class="fg-sheet-body">
|
|
||||||
<div class="fg-sheet-title">${escapeHtml(login)} ${shineBadge}</div>
|
|
||||||
<div class="fg-sheet-rel">${escapeHtml(relationLabelRu(node.relationType))}</div>
|
|
||||||
</div>
|
|
||||||
<div class="fg-sheet-actions">
|
|
||||||
<button class="ghost-btn" type="button" data-act="profile">Профиль</button>
|
|
||||||
<button class="primary-btn" type="button" data-act="write">Написать</button>
|
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
sheetEl.classList.add('is-open');
|
|
||||||
sheetEl.onclick = (e) => {
|
|
||||||
const btn = e.target instanceof HTMLElement ? e.target.closest('[data-act]') : null;
|
|
||||||
if (!(btn instanceof HTMLElement)) return;
|
|
||||||
const act = btn.dataset.act;
|
|
||||||
if (act === 'close') hideNodeSheet();
|
|
||||||
else if (act === 'profile') { const r = profileInfoRoute(login); if (r) navigate(r); }
|
|
||||||
else if (act === 'write') navigate(`chat/${encodeURIComponent(login)}`);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideNodeSheet() {
|
|
||||||
if (sheetEl) sheetEl.classList.remove('is-open');
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensureEngine(model) {
|
function ensureEngine(model) {
|
||||||
if (engine) {
|
if (engine) {
|
||||||
engine.setModel(model);
|
engine.setModel(model);
|
||||||
@@ -443,8 +433,8 @@ export function render({ navigate, route, chrome } = {}) {
|
|||||||
engine = createForceGraph({
|
engine = createForceGraph({
|
||||||
stage: board,
|
stage: board,
|
||||||
model,
|
model,
|
||||||
// тап по периферийному узлу — центрируем (грузим его граф) и показываем нижний сниппет
|
// тап по периферийному узлу — только центрируем и загружаем его граф; нижней карточки больше нет
|
||||||
onNodeTap: (node) => { showNodeSheet(node); void load(node.login, { pushHistory: true }); },
|
onNodeTap: (node) => { void load(node.login, { pushHistory: true }); },
|
||||||
// тап по центру — полноценный профиль
|
// тап по центру — полноценный профиль
|
||||||
onCenterTap: (node) => {
|
onCenterTap: (node) => {
|
||||||
const routeTo = profileInfoRoute(node.login);
|
const routeTo = profileInfoRoute(node.login);
|
||||||
@@ -496,12 +486,15 @@ export function render({ navigate, route, chrome } = {}) {
|
|||||||
const header = renderHeader({
|
const header = renderHeader({
|
||||||
title: 'Связи',
|
title: 'Связи',
|
||||||
rightActions: [
|
rightActions: [
|
||||||
{ label: 'Найти', onClick: openSearchModal },
|
{
|
||||||
|
iconNode: createHeaderSearchIcon(),
|
||||||
|
title: 'Найти пользователя',
|
||||||
|
ariaLabel: 'Найти пользователя',
|
||||||
|
className: 'chat-header-icon-btn',
|
||||||
|
onClick: openSearchModal,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
// «Связи» используют тот же общий topbar, что и остальные страницы.
|
|
||||||
// Отдельный класс нужен только для page-specific fade графа, не для геометрии header.
|
|
||||||
header.classList.add('network-topbar');
|
|
||||||
|
|
||||||
// Ресайз и перерисовку рёбер движок обрабатывает сам (window resize + ResizeObserver внутри).
|
// Ресайз и перерисовку рёбер движок обрабатывает сам (window resize + ResizeObserver внутри).
|
||||||
screen.cleanup = () => {
|
screen.cleanup = () => {
|
||||||
|
|||||||
@@ -21,8 +21,9 @@ import { buildArweaveDataUrl } from '../../services/arweave-file-service.js';
|
|||||||
const SVGNS = 'http://www.w3.org/2000/svg';
|
const SVGNS = 'http://www.w3.org/2000/svg';
|
||||||
|
|
||||||
// --- Параметры физики и анимации ---------------------------------------------
|
// --- Параметры физики и анимации ---------------------------------------------
|
||||||
const ORBIT_MIN = 150; // минимальный радиус орбиты (защитный отступ от центра), px
|
const ORBIT_FIRST_R = 100; // первый круг связей: был ~150px, теперь на треть ближе к центру
|
||||||
const ORBIT_MAX = 240; // максимальный радиус орбиты (слабая связь — дальше), px
|
const ORBIT_GAP = 87; // между соседними кругами >= 1.5 диаметра аватарки (58px * 1.5)
|
||||||
|
const ORBIT_NODE_GAP = 87; // минимальная дистанция между центрами соседних аватарок на одном круге
|
||||||
const K_RADIAL = 0.035; // очень мягкая пружина пера к орбите — узлы выходят «как резина»
|
const K_RADIAL = 0.035; // очень мягкая пружина пера к орбите — узлы выходят «как резина»
|
||||||
const K_FOCUS = 0.12; // мягкая пружина фокуса к центру
|
const K_FOCUS = 0.12; // мягкая пружина фокуса к центру
|
||||||
const CHARGE = 1400; // базовое отталкивание (на старте перестроения временно ослабляется)
|
const CHARGE = 1400; // базовое отталкивание (на старте перестроения временно ослабляется)
|
||||||
@@ -146,11 +147,57 @@ function ensureShineFilter() {
|
|||||||
document.body.appendChild(svg);
|
document.body.appendChild(svg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Равномерный угол по кругу — гарантирует отсутствие угловых наложений при любом N.
|
// Равномерный угол по кругу. Небольшой постоянный сдвиг, чтобы первый узел
|
||||||
// Небольшой постоянный сдвиг, чтобы первый узел не «прилипал» к горизонтали.
|
// не «прилипал» к горизонтали.
|
||||||
function spreadAngle(index, total) {
|
function spreadAngle(index, total, phase = 0.52) {
|
||||||
if (total <= 0) return 0;
|
if (total <= 0) return 0;
|
||||||
return ((index / total) * Math.PI * 2 + 0.52) % (Math.PI * 2);
|
return ((index / total) * Math.PI * 2 + phase) % (Math.PI * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сколько аватарок гарантированно помещается на круге радиуса r, если расстояние
|
||||||
|
// между ЦЕНТРАМИ соседних аватарок должно быть не меньше ORBIT_NODE_GAP.
|
||||||
|
// Используем хорду, а не длину дуги — поэтому условие выполняется геометрически точно.
|
||||||
|
function orbitCapacity(radius) {
|
||||||
|
const r = Math.max(radius, ORBIT_NODE_GAP / 2 + 1);
|
||||||
|
const minAngle = 2 * Math.asin(Math.min(1, ORBIT_NODE_GAP / (2 * r)));
|
||||||
|
return Math.max(1, Math.floor((Math.PI * 2) / minAngle));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Детерминированная раскладка первого уровня по концентрическим кругам.
|
||||||
|
// Сначала максимально заполняем внутренний круг, затем второй, третий и т.д.
|
||||||
|
// Соседние кольца разнесены минимум на 87px, а каждое следующее чуть повёрнуто,
|
||||||
|
// чтобы линии второго/третьего круга естественно проходили под аватарками внутренних кругов.
|
||||||
|
function buildOrbitPlacements(total) {
|
||||||
|
const count = Math.max(0, Number(total) || 0);
|
||||||
|
const out = new Array(count);
|
||||||
|
let start = 0;
|
||||||
|
let ring = 0;
|
||||||
|
while (start < count) {
|
||||||
|
const radius = ORBIT_FIRST_R + ring * ORBIT_GAP;
|
||||||
|
const capacity = orbitCapacity(radius);
|
||||||
|
const ringCount = Math.min(capacity, count - start);
|
||||||
|
const phase = 0.52 + (ring % 2 ? Math.PI / Math.max(6, ringCount) : 0);
|
||||||
|
for (let i = 0; i < ringCount; i += 1) {
|
||||||
|
const angle = spreadAngle(i, ringCount, phase);
|
||||||
|
out[start + i] = { radius, angle, ring };
|
||||||
|
}
|
||||||
|
start += ringCount;
|
||||||
|
ring += 1;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyOrbitTargets(peers) {
|
||||||
|
const list = Array.isArray(peers) ? peers : [];
|
||||||
|
const placements = buildOrbitPlacements(list.length);
|
||||||
|
list.forEach((n, i) => {
|
||||||
|
const p = placements[i] || { radius: ORBIT_FIRST_R, angle: spreadAngle(i, list.length), ring: 0 };
|
||||||
|
n.targetR = p.radius;
|
||||||
|
n.angle = p.angle;
|
||||||
|
n.orbitRing = p.ring;
|
||||||
|
n.tx = Math.cos(n.angle) * n.targetR;
|
||||||
|
n.ty = Math.sin(n.angle) * n.targetR;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Детерминированный «джиттер» по id (0..1) — чтобы орбита была органически неровной,
|
// Детерминированный «джиттер» по id (0..1) — чтобы орбита была органически неровной,
|
||||||
@@ -360,8 +407,9 @@ export function createForceGraph({ stage, model, onCenterTap, onNodeTap, onNodeL
|
|||||||
}
|
}
|
||||||
const specs = [];
|
const specs = [];
|
||||||
const focusSrc = list.find((n) => String(n.id) === fId) || list[0];
|
const focusSrc = list.find((n) => String(n.id) === fId) || list[0];
|
||||||
if (focusSrc) specs.push({ src: focusSrc, id: String(focusSrc.id), isFocus: true, index: 0, total: 1, dotOnly: false });
|
const tier1Orbit = buildOrbitPlacements(tier1.length);
|
||||||
tier1.forEach((p, i) => specs.push({ src: p, id: String(p.id), isFocus: false, index: i, total: tier1.length, dotOnly: i >= MAX_FULL_NODES }));
|
if (focusSrc) specs.push({ src: focusSrc, id: String(focusSrc.id), isFocus: true, index: 0, total: 1, dotOnly: false, orbit: null });
|
||||||
|
tier1.forEach((p, i) => specs.push({ src: p, id: String(p.id), isFocus: false, index: i, total: tier1.length, dotOnly: i >= MAX_FULL_NODES, orbit: tier1Orbit[i] }));
|
||||||
// 3-й уровень рисуем точками (микрозвёзды), 2-й — маленькими аватарками
|
// 3-й уровень рисуем точками (микрозвёзды), 2-й — маленькими аватарками
|
||||||
deep.forEach((p) => specs.push({ src: p, id: String(p.id), isFocus: false, index: 0, total: 1, dotOnly: (Number(p.tier) || 2) >= 3 }));
|
deep.forEach((p) => specs.push({ src: p, id: String(p.id), isFocus: false, index: 0, total: 1, dotOnly: (Number(p.tier) || 2) >= 3 }));
|
||||||
return { focusId: fId, specs };
|
return { focusId: fId, specs };
|
||||||
@@ -370,17 +418,16 @@ export function createForceGraph({ stage, model, onCenterTap, onNodeTap, onNodeL
|
|||||||
function buildNodes(srcModel) {
|
function buildNodes(srcModel) {
|
||||||
const { focusId: fId, specs } = computeSpecs(srcModel);
|
const { focusId: fId, specs } = computeSpecs(srcModel);
|
||||||
focusId = fId;
|
focusId = fId;
|
||||||
return specs.map((s) => makeNodeState(s.src, s.isFocus, s.index, s.total, s.dotOnly));
|
return specs.map((s) => makeNodeState(s.src, s.isFocus, s.index, s.total, s.dotOnly, s.orbit));
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeNodeState(src, isFocus, index, total, dotOnly = false) {
|
function makeNodeState(src, isFocus, index, total, dotOnly = false, orbit = null) {
|
||||||
const strength = Math.max(0, Math.min(1, Number(src.strength) || 0.5));
|
const strength = Math.max(0, Math.min(1, Number(src.strength) || 0.5));
|
||||||
const tier = Number(src.tier) || 1;
|
const tier = Number(src.tier) || 1;
|
||||||
// органическая неровность: детерминированный джиттер радиуса (±9px) и угла (±0.2 рад)
|
// Первый уровень теперь раскладывается по строгим концентрическим кругам без джиттера:
|
||||||
const jr = (hash01(src.id) - 0.5) * 18;
|
// иначе случайное смещение могло бы снова нарушить минимальный зазор между аватарками.
|
||||||
const ja = (hash01(`${src.id}~a`) - 0.5) * 0.4;
|
const targetR = isFocus ? 0 : (orbit?.radius || ORBIT_FIRST_R);
|
||||||
const targetR = isFocus ? 0 : ORBIT_MIN + (1 - strength) * (ORBIT_MAX - ORBIT_MIN) + jr;
|
const angle = isFocus ? 0 : (orbit?.angle ?? spreadAngle(index, total));
|
||||||
const angle = isFocus ? 0 : spreadAngle(index, total) + ja;
|
|
||||||
// масштаб/прозрачность по уровню глубины: 2-й — вдвое меньше и полупрозрачный, 3-й — микрозвезда.
|
// масштаб/прозрачность по уровню глубины: 2-й — вдвое меньше и полупрозрачный, 3-й — микрозвезда.
|
||||||
const scale = isFocus ? FOCUS_SCALE : (tier === 2 ? DEEP2_SCALE : (tier >= 3 ? 1 : PRIMARY_SCALE));
|
const scale = isFocus ? FOCUS_SCALE : (tier === 2 ? DEEP2_SCALE : (tier >= 3 ? 1 : PRIMARY_SCALE));
|
||||||
const op = tier === 2 ? DEEP2_OPACITY : (tier >= 3 ? DEEP3_OPACITY : 1);
|
const op = tier === 2 ? DEEP2_OPACITY : (tier >= 3 ? DEEP3_OPACITY : 1);
|
||||||
@@ -404,6 +451,7 @@ export function createForceGraph({ stage, model, onCenterTap, onNodeTap, onNodeL
|
|||||||
strength,
|
strength,
|
||||||
targetR,
|
targetR,
|
||||||
angle,
|
angle,
|
||||||
|
orbitRing: orbit?.ring || 0,
|
||||||
tx,
|
tx,
|
||||||
ty,
|
ty,
|
||||||
x: tx * INTRO_FACTOR,
|
x: tx * INTRO_FACTOR,
|
||||||
@@ -567,10 +615,9 @@ export function createForceGraph({ stage, model, onCenterTap, onNodeTap, onNodeL
|
|||||||
node.strength = strength;
|
node.strength = strength;
|
||||||
node.relationType = src.relationType;
|
node.relationType = src.relationType;
|
||||||
node.shining = Boolean(src.shining);
|
node.shining = Boolean(src.shining);
|
||||||
const jr = (hash01(src.id) - 0.5) * 18;
|
node.targetR = spec.isFocus ? 0 : (spec.orbit?.radius || ORBIT_FIRST_R);
|
||||||
const ja = (hash01(`${src.id}~a`) - 0.5) * 0.4;
|
node.angle = spec.isFocus ? 0 : (spec.orbit?.angle ?? spreadAngle(spec.index, spec.total));
|
||||||
node.targetR = spec.isFocus ? 0 : ORBIT_MIN + (1 - strength) * (ORBIT_MAX - ORBIT_MIN) + jr;
|
node.orbitRing = spec.orbit?.ring || 0;
|
||||||
node.angle = spec.isFocus ? 0 : spreadAngle(spec.index, spec.total) + ja;
|
|
||||||
node.tx = Math.cos(node.angle) * node.targetR;
|
node.tx = Math.cos(node.angle) * node.targetR;
|
||||||
node.ty = Math.sin(node.angle) * node.targetR;
|
node.ty = Math.sin(node.angle) * node.targetR;
|
||||||
node.targetScale = spec.isFocus ? FOCUS_SCALE : (tier === 2 ? DEEP2_SCALE : (tier >= 3 ? 1 : PRIMARY_SCALE));
|
node.targetScale = spec.isFocus ? FOCUS_SCALE : (tier === 2 ? DEEP2_SCALE : (tier >= 3 ? 1 : PRIMARY_SCALE));
|
||||||
@@ -990,17 +1037,12 @@ export function createForceGraph({ stage, model, onCenterTap, onNodeTap, onNodeL
|
|||||||
target.vy = 0;
|
target.vy = 0;
|
||||||
to.set(target.id, { x: 0, y: 0, scale: FOCUS_SCALE });
|
to.set(target.id, { x: 0, y: 0, scale: FOCUS_SCALE });
|
||||||
|
|
||||||
peers.forEach((n, i) => {
|
applyOrbitTargets(peers);
|
||||||
n.targetR = ORBIT_MIN + (1 - n.strength) * (ORBIT_MAX - ORBIT_MIN);
|
peers.forEach((n) => {
|
||||||
n.angle = spreadAngle(i, peers.length);
|
|
||||||
n.vx = 0;
|
n.vx = 0;
|
||||||
n.vy = 0;
|
n.vy = 0;
|
||||||
const tx = Math.cos(n.angle) * n.targetR;
|
|
||||||
const ty = Math.sin(n.angle) * n.targetR;
|
|
||||||
n.tx = tx; // обновляем целевую точку, иначе физика после твина утянет узел назад
|
|
||||||
n.ty = ty;
|
|
||||||
const sc = n.tier >= 2 ? SECONDARY_SCALE : PRIMARY_SCALE;
|
const sc = n.tier >= 2 ? SECONDARY_SCALE : PRIMARY_SCALE;
|
||||||
to.set(n.id, { x: tx, y: ty, scale: sc });
|
to.set(n.id, { x: n.tx, y: n.ty, scale: sc });
|
||||||
});
|
});
|
||||||
|
|
||||||
tween = {
|
tween = {
|
||||||
@@ -1091,11 +1133,8 @@ export function createForceGraph({ stage, model, onCenterTap, onNodeTap, onNodeL
|
|||||||
const focus = nodes.find((n) => n.isFocus);
|
const focus = nodes.find((n) => n.isFocus);
|
||||||
if (focus) apply(focus, 0, 0, FOCUS_SCALE, 1);
|
if (focus) apply(focus, 0, 0, FOCUS_SCALE, 1);
|
||||||
|
|
||||||
visiblePeers.forEach((n, i) => {
|
applyOrbitTargets(visiblePeers);
|
||||||
n.targetR = ORBIT_MIN + (1 - n.strength) * (ORBIT_MAX - ORBIT_MIN);
|
visiblePeers.forEach((n) => {
|
||||||
n.angle = spreadAngle(i, visiblePeers.length);
|
|
||||||
n.tx = Math.cos(n.angle) * n.targetR;
|
|
||||||
n.ty = Math.sin(n.angle) * n.targetR;
|
|
||||||
const sc = n.tier >= 2 ? SECONDARY_SCALE : PRIMARY_SCALE;
|
const sc = n.tier >= 2 ? SECONDARY_SCALE : PRIMARY_SCALE;
|
||||||
apply(n, n.tx, n.ty, sc, 1);
|
apply(n, n.tx, n.ty, sc, 1);
|
||||||
});
|
});
|
||||||
@@ -1598,7 +1637,7 @@ export function createForceGraph({ stage, model, onCenterTap, onNodeTap, onNodeL
|
|||||||
node = oldNode; isNew = false;
|
node = oldNode; isNew = false;
|
||||||
} else {
|
} else {
|
||||||
if (oldNode) oldNode.el.remove(); // сменился тип (точка↔аватар) — заменяем элемент
|
if (oldNode) oldNode.el.remove(); // сменился тип (точка↔аватар) — заменяем элемент
|
||||||
node = makeNodeState(spec.src, spec.isFocus, spec.index, spec.total, spec.dotOnly);
|
node = makeNodeState(spec.src, spec.isFocus, spec.index, spec.total, spec.dotOnly, spec.orbit);
|
||||||
isNew = true;
|
isNew = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
.badge-line { display: flex; gap: 8px; flex-wrap: wrap; }
|
.badge-line { display: flex; gap: 8px; flex-wrap: wrap; }
|
||||||
.badge { display: inline-flex; align-items: center; border: 1px solid var(--border); border-radius: 999px; padding: 4px 10px; font-size: 11px; color: var(--text-muted); background: #0d0d0d; }
|
.badge { display: inline-flex; align-items: center; border: 1px solid var(--border); border-radius: 999px; padding: 4px 10px; font-size: 11px; color: var(--text-muted); background: #0d0d0d; }
|
||||||
.badge.ok { color: #7dcc7d; border-color: #2a4a2a; background: #1a2e1a; }
|
.badge.ok { color: #7dcc7d; border-color: #2a4a2a; background: #1a2e1a; }
|
||||||
.badge.warn { color: #ffd37a; border-color: #5f4b22; background: #2f2614; }
|
.badge.warn { color: #ffd37a; border-color: transparent; background: #2f2614; }
|
||||||
.badge.err { color: #f08080; border-color: #5a2a2a; background: #2e1a1a; }
|
.badge.err { color: #f08080; border-color: #5a2a2a; background: #2e1a1a; }
|
||||||
.details-wrap { margin-top: 12px; }
|
.details-wrap { margin-top: 12px; }
|
||||||
.details-wrap details { border: 1px solid var(--border); border-radius: var(--radius); background: #121212; }
|
.details-wrap details { border: 1px solid var(--border); border-radius: var(--radius); background: #121212; }
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
.expected-row:last-child { margin-bottom:0; }
|
.expected-row:last-child { margin-bottom:0; }
|
||||||
.expected-lbl { font-size:11px; color:var(--text-muted); margin-bottom:4px; }
|
.expected-lbl { font-size:11px; color:var(--text-muted); margin-bottom:4px; }
|
||||||
.expected-val { font-family:monospace; font-size:11px; word-break:break-all; }
|
.expected-val { font-family:monospace; font-size:11px; word-break:break-all; }
|
||||||
.gen-msg.warn { display:block; background:#2f2614; border:1px solid #5f4b22; color:#ffd37a; }
|
.gen-msg.warn { display:block; background:#2f2614; border: 1px solid transparent; color:#ffd37a; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
+184
-148
@@ -21,7 +21,7 @@
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
border-radius: 18px;
|
border-radius: 18px;
|
||||||
background: rgba(14, 21, 35, 0.92);
|
background: rgba(14, 21, 35, 0.92);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.18);
|
border: 1px solid transparent;
|
||||||
box-shadow: 0 10px 26px rgba(4, 8, 16, 0.28);
|
box-shadow: 0 10px 26px rgba(4, 8, 16, 0.28);
|
||||||
backdrop-filter: blur(14px);
|
backdrop-filter: blur(14px);
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,8 @@
|
|||||||
height: 1em;
|
height: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-icon-svg--phone {
|
.header-icon-svg--phone,
|
||||||
|
.header-icon-svg--search {
|
||||||
width: 22px;
|
width: 22px;
|
||||||
height: 22px;
|
height: 22px;
|
||||||
}
|
}
|
||||||
@@ -171,7 +172,7 @@
|
|||||||
.secondary-btn:hover,
|
.secondary-btn:hover,
|
||||||
.destructive-btn:hover,
|
.destructive-btn:hover,
|
||||||
.ghost-btn:hover {
|
.ghost-btn:hover {
|
||||||
border-color: var(--accent);
|
border-color: transparent;
|
||||||
transform: translateY(-1px);
|
transform: translateY(-1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,7 +190,7 @@
|
|||||||
|
|
||||||
.primary-btn {
|
.primary-btn {
|
||||||
background: linear-gradient(120deg, rgba(218, 179, 87, 0.95), rgba(184, 137, 54, 0.92));
|
background: linear-gradient(120deg, rgba(218, 179, 87, 0.95), rgba(184, 137, 54, 0.92));
|
||||||
border-color: rgba(242, 210, 129, 0.72);
|
border-color: transparent;
|
||||||
color: #101426;
|
color: #101426;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,7 +507,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.profile-relative-suggest-item:hover {
|
.profile-relative-suggest-item:hover {
|
||||||
border-color: rgba(216, 178, 95, 0.52);
|
border-color: transparent;
|
||||||
color: #f3dca8;
|
color: #f3dca8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -810,7 +811,7 @@
|
|||||||
|
|
||||||
.shine-btn:focus-visible,
|
.shine-btn:focus-visible,
|
||||||
.shine-local-demo-btn:focus-visible {
|
.shine-local-demo-btn:focus-visible {
|
||||||
outline: 2px solid rgba(235, 197, 117, 0.72);
|
outline: 2px solid transparent;
|
||||||
outline-offset: 3px;
|
outline-offset: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1061,8 +1062,7 @@
|
|||||||
|
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .input:focus,
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .input:focus,
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .select:focus {
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .select:focus {
|
||||||
border-color: rgba(222, 184, 99, 0.76);
|
border-color: transparent;
|
||||||
box-shadow: 0 0 0 3px rgba(222, 184, 99, 0.13);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .auth-footer-actions {
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .auth-footer-actions {
|
||||||
@@ -1085,7 +1085,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .primary-btn {
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .primary-btn {
|
||||||
border-color: rgba(255, 226, 163, 0.5);
|
border-color: transparent;
|
||||||
background:
|
background:
|
||||||
linear-gradient(180deg, rgba(255, 239, 198, 0.16), transparent 31%),
|
linear-gradient(180deg, rgba(255, 239, 198, 0.16), transparent 31%),
|
||||||
linear-gradient(180deg, rgba(144, 105, 55, 0.66), rgba(47, 34, 27, 0.76));
|
linear-gradient(180deg, rgba(144, 105, 55, 0.66), rgba(47, 34, 27, 0.76));
|
||||||
@@ -1104,7 +1104,7 @@
|
|||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .secondary-btn:hover,
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .secondary-btn:hover,
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .ghost-btn:hover,
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .ghost-btn:hover,
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .link-card:hover {
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .link-card:hover {
|
||||||
border-color: rgba(231, 202, 137, 0.66);
|
border-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .preauth-local-demo-btn {
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .preauth-local-demo-btn {
|
||||||
@@ -1121,7 +1121,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-progress {
|
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-progress {
|
||||||
border-color: rgba(226, 193, 124, 0.38);
|
border-color: transparent;
|
||||||
background: rgba(3, 9, 21, 0.62);
|
background: rgba(3, 9, 21, 0.62);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1708,7 +1708,6 @@
|
|||||||
|
|
||||||
.toolbar-connection-indicator.is-connecting .toolbar-connection-dot {
|
.toolbar-connection-indicator.is-connecting .toolbar-connection-dot {
|
||||||
background: #f0c56b;
|
background: #f0c56b;
|
||||||
box-shadow: 0 0 0 2px rgba(240, 197, 107, 0.22);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.toolbar-connection-indicator.is-disconnected .toolbar-connection-dot {
|
.toolbar-connection-indicator.is-disconnected .toolbar-connection-dot {
|
||||||
@@ -2456,7 +2455,6 @@
|
|||||||
|
|
||||||
.pwa-diag-indicator.is-warn {
|
.pwa-diag-indicator.is-warn {
|
||||||
background: #f0c56b;
|
background: #f0c56b;
|
||||||
box-shadow: 0 0 0 3px rgba(240, 197, 107, 0.18);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.pwa-diag-indicator.is-bad {
|
.pwa-diag-indicator.is-bad {
|
||||||
@@ -3033,7 +3031,7 @@ textarea.input {
|
|||||||
|
|
||||||
.ar-attachment-history-tile {
|
.ar-attachment-history-tile {
|
||||||
background: linear-gradient(135deg, rgba(15, 23, 42, 0.96), rgba(22, 36, 53, 0.96));
|
background: linear-gradient(135deg, rgba(15, 23, 42, 0.96), rgba(22, 36, 53, 0.96));
|
||||||
border: 1px solid rgba(212, 175, 55, 0.2);
|
border: 1px solid transparent;
|
||||||
border-radius: 0.52rem;
|
border-radius: 0.52rem;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
color: #f8fafc;
|
color: #f8fafc;
|
||||||
@@ -3185,7 +3183,7 @@ textarea.input {
|
|||||||
.arweave-uploads-toolbar {
|
.arweave-uploads-toolbar {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background: linear-gradient(135deg, rgba(15, 23, 42, 0.98), rgba(30, 41, 59, 0.98));
|
background: linear-gradient(135deg, rgba(15, 23, 42, 0.98), rgba(30, 41, 59, 0.98));
|
||||||
border-bottom: 1px solid rgba(212, 175, 55, 0.22);
|
border-bottom: 1px solid transparent;
|
||||||
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.22);
|
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.22);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -3228,7 +3226,7 @@ textarea.input {
|
|||||||
|
|
||||||
.arweave-uploads-menu {
|
.arweave-uploads-menu {
|
||||||
background: rgba(15, 23, 42, 0.98);
|
background: rgba(15, 23, 42, 0.98);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.24);
|
border: 1px solid transparent;
|
||||||
border-radius: 0.85rem;
|
border-radius: 0.85rem;
|
||||||
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35);
|
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35);
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -3607,7 +3605,7 @@ textarea.input {
|
|||||||
height: 18px;
|
height: 18px;
|
||||||
padding: 0 6px;
|
padding: 0 6px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
border: 1px solid rgba(255, 214, 130, 0.95);
|
border: 1px solid transparent;
|
||||||
background: linear-gradient(180deg, rgba(255, 219, 145, 0.98), rgba(232, 165, 64, 0.98));
|
background: linear-gradient(180deg, rgba(255, 219, 145, 0.98), rgba(232, 165, 64, 0.98));
|
||||||
color: #3a2003;
|
color: #3a2003;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
@@ -3884,7 +3882,7 @@ textarea.input {
|
|||||||
background:
|
background:
|
||||||
radial-gradient(circle at 18% -120%, rgba(228, 186, 94, 0.28), transparent 48%),
|
radial-gradient(circle at 18% -120%, rgba(228, 186, 94, 0.28), transparent 48%),
|
||||||
linear-gradient(160deg, rgba(14, 25, 47, 0.98), rgba(7, 16, 34, 0.98));
|
linear-gradient(160deg, rgba(14, 25, 47, 0.98), rgba(7, 16, 34, 0.98));
|
||||||
border: 1px solid rgba(197, 160, 85, 0.38);
|
border: 1px solid transparent;
|
||||||
box-shadow: 0 18px 32px rgba(2, 6, 13, 0.62);
|
box-shadow: 0 18px 32px rgba(2, 6, 13, 0.62);
|
||||||
border-radius: 18px;
|
border-radius: 18px;
|
||||||
padding: 9px;
|
padding: 9px;
|
||||||
@@ -3901,7 +3899,7 @@ textarea.input {
|
|||||||
background:
|
background:
|
||||||
linear-gradient(145deg, rgba(220, 181, 94, 0.32), rgba(39, 66, 122, 0.3)),
|
linear-gradient(145deg, rgba(220, 181, 94, 0.32), rgba(39, 66, 122, 0.3)),
|
||||||
rgba(20, 35, 64, 0.62);
|
rgba(20, 35, 64, 0.62);
|
||||||
border: 1px solid rgba(220, 183, 100, 0.44);
|
border: 1px solid transparent;
|
||||||
color: #f7e2ad;
|
color: #f7e2ad;
|
||||||
box-shadow: inset 0 1px 0 rgba(255, 242, 204, 0.42);
|
box-shadow: inset 0 1px 0 rgba(255, 242, 204, 0.42);
|
||||||
}
|
}
|
||||||
@@ -3912,7 +3910,7 @@ textarea.input {
|
|||||||
|
|
||||||
.modal-card {
|
.modal-card {
|
||||||
background: linear-gradient(165deg, rgba(16, 31, 58, 0.97), rgba(10, 18, 36, 0.97));
|
background: linear-gradient(165deg, rgba(16, 31, 58, 0.97), rgba(10, 18, 36, 0.97));
|
||||||
border-color: rgba(216, 179, 93, 0.4);
|
border-color: transparent;
|
||||||
box-shadow: 0 20px 38px rgba(2, 6, 12, 0.55);
|
box-shadow: 0 20px 38px rgba(2, 6, 12, 0.55);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3981,7 +3979,7 @@ textarea.input {
|
|||||||
background:
|
background:
|
||||||
linear-gradient(168deg, rgba(16, 31, 58, 0.95), rgba(8, 17, 34, 0.98)),
|
linear-gradient(168deg, rgba(16, 31, 58, 0.95), rgba(8, 17, 34, 0.98)),
|
||||||
radial-gradient(circle at 50% 0%, rgba(53, 90, 165, 0.2), transparent 52%);
|
radial-gradient(circle at 50% 0%, rgba(53, 90, 165, 0.2), transparent 52%);
|
||||||
border: 1px solid rgba(176, 144, 74, 0.3);
|
border: 1px solid transparent;
|
||||||
box-shadow: 0 14px 30px rgba(2, 7, 15, 0.54);
|
box-shadow: 0 14px 30px rgba(2, 7, 15, 0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3999,7 +3997,7 @@ textarea.input {
|
|||||||
gap: 12px;
|
gap: 12px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
border-color: rgba(214, 177, 95, 0.42);
|
border-color: transparent;
|
||||||
box-shadow: 0 14px 30px rgba(4, 9, 20, 0.54);
|
box-shadow: 0 14px 30px rgba(4, 9, 20, 0.54);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4008,7 +4006,7 @@ textarea.input {
|
|||||||
width: 62px;
|
width: 62px;
|
||||||
height: 62px;
|
height: 62px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
border: 1px solid rgba(220, 182, 98, 0.64);
|
border: 1px solid transparent;
|
||||||
background:
|
background:
|
||||||
radial-gradient(circle at 45% 40%, rgba(247, 217, 145, 0.9), rgba(199, 146, 61, 0.95) 46%, rgba(127, 88, 36, 0.96) 100%);
|
radial-gradient(circle at 45% 40%, rgba(247, 217, 145, 0.9), rgba(199, 146, 61, 0.95) 46%, rgba(127, 88, 36, 0.96) 100%);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
@@ -4028,7 +4026,7 @@ textarea.input {
|
|||||||
.channels-hero-emblem::after {
|
.channels-hero-emblem::after {
|
||||||
inset: 7px;
|
inset: 7px;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-color: rgba(228, 192, 109, 0.66);
|
border-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.channels-hero-copy {
|
.channels-hero-copy {
|
||||||
@@ -4072,7 +4070,6 @@ textarea.input {
|
|||||||
height: 9px;
|
height: 9px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: #ddb86f;
|
background: #ddb86f;
|
||||||
box-shadow: 0 0 0 6px rgba(221, 184, 111, 0.2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.channels-help-card strong {
|
.channels-help-card strong {
|
||||||
@@ -4096,7 +4093,7 @@ textarea.input {
|
|||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
padding: 10px 13px;
|
padding: 10px 13px;
|
||||||
color: #ead3a0;
|
color: #ead3a0;
|
||||||
border: 1px solid rgba(214, 175, 89, 0.4);
|
border: 1px solid transparent;
|
||||||
background: linear-gradient(134deg, rgba(180, 140, 62, 0.22), rgba(23, 44, 84, 0.3));
|
background: linear-gradient(134deg, rgba(180, 140, 62, 0.22), rgba(23, 44, 84, 0.3));
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 1.35;
|
line-height: 1.35;
|
||||||
@@ -4152,7 +4149,7 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channels-list-empty {
|
.channels-list-empty {
|
||||||
border: 1px dashed rgba(209, 172, 87, 0.35);
|
border: 1px dashed transparent;
|
||||||
border-radius: var(--radius-md);
|
border-radius: var(--radius-md);
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
color: #aeb9d8;
|
color: #aeb9d8;
|
||||||
@@ -4160,7 +4157,7 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channels-divider {
|
.channels-divider {
|
||||||
border-top-color: rgba(211, 170, 86, 0.22);
|
border-top-color: transparent;
|
||||||
margin: 2px 0;
|
margin: 2px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4171,7 +4168,7 @@ textarea.input {
|
|||||||
padding: 14px 13px;
|
padding: 14px 13px;
|
||||||
width: min(100%, 340px);
|
width: min(100%, 340px);
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
border: 1px solid rgba(193, 157, 82, 0.28);
|
border: 1px solid transparent;
|
||||||
background:
|
background:
|
||||||
linear-gradient(150deg, rgba(16, 31, 58, 0.9), rgba(10, 20, 40, 0.94)),
|
linear-gradient(150deg, rgba(16, 31, 58, 0.9), rgba(10, 20, 40, 0.94)),
|
||||||
radial-gradient(circle at 100% 0%, rgba(72, 106, 179, 0.22), transparent 46%);
|
radial-gradient(circle at 100% 0%, rgba(72, 106, 179, 0.22), transparent 46%);
|
||||||
@@ -4181,7 +4178,7 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channel-row:hover {
|
.channel-row:hover {
|
||||||
border-color: rgba(224, 188, 106, 0.52);
|
border-color: transparent;
|
||||||
box-shadow: 0 10px 22px rgba(2, 8, 16, 0.44);
|
box-shadow: 0 10px 22px rgba(2, 8, 16, 0.44);
|
||||||
transform: translateY(-1px);
|
transform: translateY(-1px);
|
||||||
}
|
}
|
||||||
@@ -4264,7 +4261,7 @@ textarea.input {
|
|||||||
letter-spacing: 0.08em;
|
letter-spacing: 0.08em;
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
border: 1px solid rgba(205, 166, 86, 0.42);
|
border: 1px solid transparent;
|
||||||
color: #f1d49a;
|
color: #f1d49a;
|
||||||
background: rgba(191, 149, 66, 0.16);
|
background: rgba(191, 149, 66, 0.16);
|
||||||
}
|
}
|
||||||
@@ -4352,7 +4349,7 @@ textarea.input {
|
|||||||
margin: 10px 0 12px;
|
margin: 10px 0 12px;
|
||||||
padding: 10px 14px;
|
padding: 10px 14px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
border: 1px solid rgba(244, 202, 102, 0.46);
|
border: 1px solid transparent;
|
||||||
background:
|
background:
|
||||||
linear-gradient(180deg, rgba(50, 39, 14, 0.9), rgba(22, 25, 39, 0.9));
|
linear-gradient(180deg, rgba(50, 39, 14, 0.9), rgba(22, 25, 39, 0.9));
|
||||||
color: #ffe6a7;
|
color: #ffe6a7;
|
||||||
@@ -4363,7 +4360,7 @@ textarea.input {
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
box-shadow: 0 0 0 1px rgba(255, 226, 155, 0.08), 0 10px 24px rgba(6, 10, 20, 0.35);
|
box-shadow: 0 10px 24px rgba(6, 10, 20, 0.35);
|
||||||
}
|
}
|
||||||
|
|
||||||
.channel-unread-line::before,
|
.channel-unread-line::before,
|
||||||
@@ -4484,7 +4481,7 @@ textarea.input {
|
|||||||
.channel-message-kind-badge--rating {
|
.channel-message-kind-badge--rating {
|
||||||
color: #ffe8b0;
|
color: #ffe8b0;
|
||||||
background: rgba(124, 92, 28, 0.36);
|
background: rgba(124, 92, 28, 0.36);
|
||||||
border: 1px solid rgba(255, 214, 117, 0.28);
|
border: 1px solid transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.channel-message-kind-badge--status {
|
.channel-message-kind-badge--status {
|
||||||
@@ -4521,7 +4518,7 @@ textarea.input {
|
|||||||
|
|
||||||
.channels-screen .channel-message-card.is-rating,
|
.channels-screen .channel-message-card.is-rating,
|
||||||
.thread-node-card.is-rating {
|
.thread-node-card.is-rating {
|
||||||
border-color: rgba(255, 214, 117, 0.34);
|
border-color: transparent;
|
||||||
background:
|
background:
|
||||||
linear-gradient(180deg, rgba(112, 84, 22, 0.12), rgba(20, 25, 35, 0.58)),
|
linear-gradient(180deg, rgba(112, 84, 22, 0.12), rgba(20, 25, 35, 0.58)),
|
||||||
rgba(20, 25, 35, 0.55);
|
rgba(20, 25, 35, 0.55);
|
||||||
@@ -4529,8 +4526,8 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channels-screen .channel-message-card.is-focus-flash {
|
.channels-screen .channel-message-card.is-focus-flash {
|
||||||
border-color: rgba(255, 214, 117, 0.5);
|
border-color: transparent;
|
||||||
box-shadow: 0 0 0 1px rgba(255, 214, 117, 0.28), 0 0 34px rgba(255, 214, 117, 0.16);
|
box-shadow: 0 0 34px rgba(255, 214, 117, 0.16);
|
||||||
}
|
}
|
||||||
|
|
||||||
.channel-message-body {
|
.channel-message-body {
|
||||||
@@ -4568,7 +4565,7 @@ textarea.input {
|
|||||||
max-width: min(88%, 460px);
|
max-width: min(88%, 460px);
|
||||||
margin: 0 auto 4px;
|
margin: 0 auto 4px;
|
||||||
padding: 8px 16px;
|
padding: 8px 16px;
|
||||||
border-color: rgba(255, 210, 130, 0.22);
|
border-color: transparent;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
background: rgba(89, 67, 31, 0.26);
|
background: rgba(89, 67, 31, 0.26);
|
||||||
color: rgba(255, 235, 188, 0.92);
|
color: rgba(255, 235, 188, 0.92);
|
||||||
@@ -4626,7 +4623,7 @@ textarea.input {
|
|||||||
align-self: center;
|
align-self: center;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: linear-gradient(145deg, rgba(255, 214, 122, 0.22), rgba(56, 41, 22, 0.65));
|
background: linear-gradient(145deg, rgba(255, 214, 122, 0.22), rgba(56, 41, 22, 0.65));
|
||||||
border: 1px solid rgba(255, 226, 155, 0.24);
|
border: 1px solid transparent;
|
||||||
color: rgba(255, 236, 194, 0.95);
|
color: rgba(255, 236, 194, 0.95);
|
||||||
font-size: calc(var(--channel-avatar-size) * 0.42);
|
font-size: calc(var(--channel-avatar-size) * 0.42);
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
@@ -4765,7 +4762,7 @@ textarea.input {
|
|||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
max-width: 180px;
|
max-width: 180px;
|
||||||
padding: 5px 8px;
|
padding: 5px 8px;
|
||||||
border: 1px solid rgba(255, 220, 140, 0.24);
|
border: 1px solid transparent;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background: rgba(20, 20, 24, 0.94);
|
background: rgba(20, 20, 24, 0.94);
|
||||||
color: rgba(255, 244, 210, 0.96);
|
color: rgba(255, 244, 210, 0.96);
|
||||||
@@ -4854,14 +4851,14 @@ textarea.input {
|
|||||||
|
|
||||||
.thread-summary {
|
.thread-summary {
|
||||||
color: #efd9a4;
|
color: #efd9a4;
|
||||||
border-color: rgba(212, 171, 90, 0.36);
|
border-color: transparent;
|
||||||
background: linear-gradient(130deg, rgba(178, 137, 58, 0.2), rgba(24, 41, 74, 0.24));
|
background: linear-gradient(130deg, rgba(178, 137, 58, 0.2), rgba(24, 41, 74, 0.24));
|
||||||
}
|
}
|
||||||
|
|
||||||
.thread-node-card {
|
.thread-node-card {
|
||||||
gap: 9px;
|
gap: 9px;
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
border-color: rgba(183, 150, 79, 0.3);
|
border-color: transparent;
|
||||||
backdrop-filter: blur(12px);
|
backdrop-filter: blur(12px);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4973,7 +4970,7 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.thread-block--focus {
|
.thread-block--focus {
|
||||||
border-color: rgba(214, 177, 95, 0.34);
|
border-color: transparent;
|
||||||
background: linear-gradient(160deg, rgba(33, 44, 72, 0.68), rgba(12, 20, 36, 0.8));
|
background: linear-gradient(160deg, rgba(33, 44, 72, 0.68), rgba(12, 20, 36, 0.8));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5113,7 +5110,7 @@ textarea.input {
|
|||||||
max-width: min(92vw, 420px);
|
max-width: min(92vw, 420px);
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
padding: 11px 14px;
|
padding: 11px 14px;
|
||||||
border: 1px solid rgba(223, 188, 110, 0.45);
|
border: 1px solid transparent;
|
||||||
color: #f2dca8;
|
color: #f2dca8;
|
||||||
background: rgba(10, 14, 23, 0.8);
|
background: rgba(10, 14, 23, 0.8);
|
||||||
backdrop-filter: blur(12px);
|
backdrop-filter: blur(12px);
|
||||||
@@ -5146,7 +5143,7 @@ textarea.input {
|
|||||||
.skeleton-line {
|
.skeleton-line {
|
||||||
height: 10px;
|
height: 10px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
background: linear-gradient(100deg, rgba(180, 151, 80, 0.16), rgba(228, 192, 109, 0.45), rgba(180, 151, 80, 0.16));
|
background: linear-gradient(100deg, rgba(93, 117, 154, 0.10), rgba(167, 191, 226, 0.24), rgba(93, 117, 154, 0.10));
|
||||||
background-size: 220% 100%;
|
background-size: 220% 100%;
|
||||||
animation: channels-shimmer 1.2s linear infinite;
|
animation: channels-shimmer 1.2s linear infinite;
|
||||||
}
|
}
|
||||||
@@ -5166,7 +5163,7 @@ textarea.input {
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
border: 1px solid rgba(188, 152, 79, 0.34);
|
border: 1px solid transparent;
|
||||||
background: linear-gradient(165deg, rgba(12, 24, 46, 0.92), rgba(9, 17, 34, 0.96));
|
background: linear-gradient(165deg, rgba(12, 24, 46, 0.92), rgba(9, 17, 34, 0.96));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5278,13 +5275,13 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channels-tab-btn.is-active {
|
.channels-tab-btn.is-active {
|
||||||
border-color: rgba(218, 183, 100, 0.48);
|
border-color: transparent;
|
||||||
color: #f4d99e;
|
color: #f4d99e;
|
||||||
background: linear-gradient(160deg, rgba(193, 154, 76, 0.22), rgba(18, 33, 62, 0.64));
|
background: linear-gradient(160deg, rgba(193, 154, 76, 0.22), rgba(18, 33, 62, 0.64));
|
||||||
}
|
}
|
||||||
|
|
||||||
.channels-empty-state {
|
.channels-empty-state {
|
||||||
border: 1px dashed rgba(199, 164, 90, 0.36);
|
border: 1px dashed transparent;
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -5338,7 +5335,7 @@ textarea.input {
|
|||||||
width: 34px;
|
width: 34px;
|
||||||
height: 34px;
|
height: 34px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid rgba(185, 154, 83, 0.42);
|
border: 1px solid transparent;
|
||||||
background: rgba(14, 25, 48, 0.82);
|
background: rgba(14, 25, 48, 0.82);
|
||||||
color: #efd9a4;
|
color: #efd9a4;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -5353,7 +5350,7 @@ textarea.input {
|
|||||||
z-index: 25;
|
z-index: 25;
|
||||||
width: min(240px, 70vw);
|
width: min(240px, 70vw);
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
border: 1px solid rgba(206, 170, 90, 0.38);
|
border: 1px solid transparent;
|
||||||
background: rgba(10, 14, 23, 0.8);
|
background: rgba(10, 14, 23, 0.8);
|
||||||
backdrop-filter: blur(12px);
|
backdrop-filter: blur(12px);
|
||||||
box-shadow: 0 16px 32px rgba(1, 5, 12, 0.62);
|
box-shadow: 0 16px 32px rgba(1, 5, 12, 0.62);
|
||||||
@@ -5418,7 +5415,7 @@ textarea.input {
|
|||||||
|
|
||||||
.channel-toggle-btn.is-on {
|
.channel-toggle-btn.is-on {
|
||||||
background: rgba(211, 173, 92, 0.34);
|
background: rgba(211, 173, 92, 0.34);
|
||||||
border-color: rgba(219, 182, 101, 0.6);
|
border-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.channel-toggle-btn.is-on::after {
|
.channel-toggle-btn.is-on::after {
|
||||||
@@ -5477,7 +5474,7 @@ textarea.input {
|
|||||||
min-height: 28px;
|
min-height: 28px;
|
||||||
padding: 4px 9px;
|
padding: 4px 9px;
|
||||||
border-radius: 9px;
|
border-radius: 9px;
|
||||||
border: 1px solid rgba(224, 190, 117, 0.38);
|
border: 1px solid transparent;
|
||||||
background: linear-gradient(180deg, rgba(57, 74, 119, 0.34), rgba(18, 29, 54, 0.34));
|
background: linear-gradient(180deg, rgba(57, 74, 119, 0.34), rgba(18, 29, 54, 0.34));
|
||||||
color: #f1d99c;
|
color: #f1d99c;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
@@ -5596,7 +5593,7 @@ textarea.input {
|
|||||||
width: 48px;
|
width: 48px;
|
||||||
height: 48px;
|
height: 48px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
border: 1px solid rgba(212, 175, 55, 0.45);
|
border: 1px solid transparent;
|
||||||
background: linear-gradient(160deg, rgba(16, 24, 38, 0.92), rgba(12, 18, 30, 0.86));
|
background: linear-gradient(160deg, rgba(16, 24, 38, 0.92), rgba(12, 18, 30, 0.86));
|
||||||
color: rgba(255, 227, 150, 0.95);
|
color: rgba(255, 227, 150, 0.95);
|
||||||
box-shadow: 0 12px 26px rgba(3, 8, 18, 0.45), 0 0 20px rgba(212, 175, 55, 0.16);
|
box-shadow: 0 12px 26px rgba(3, 8, 18, 0.45), 0 0 20px rgba(212, 175, 55, 0.16);
|
||||||
@@ -5692,7 +5689,7 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channel-search-item:hover {
|
.channel-search-item:hover {
|
||||||
border-color: rgba(216, 178, 95, 0.52);
|
border-color: transparent;
|
||||||
color: #f3dca8;
|
color: #f3dca8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5793,7 +5790,7 @@ textarea.input {
|
|||||||
|
|
||||||
.channels-tab-btn.is-active {
|
.channels-tab-btn.is-active {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border-bottom-color: rgba(255, 200, 50, 0.9);
|
border-bottom-color: transparent;
|
||||||
color: rgba(255, 200, 50, 0.9);
|
color: rgba(255, 200, 50, 0.9);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5855,7 +5852,7 @@ textarea.input {
|
|||||||
.channels-bottom-action,
|
.channels-bottom-action,
|
||||||
.primary-btn.channel-main-action {
|
.primary-btn.channel-main-action {
|
||||||
background: rgba(255, 180, 0, 0.12);
|
background: rgba(255, 180, 0, 0.12);
|
||||||
border: 1px solid rgba(255, 180, 0, 0.35);
|
border: 1px solid transparent;
|
||||||
color: rgba(255, 200, 50, 0.9);
|
color: rgba(255, 200, 50, 0.9);
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
padding: 14px;
|
padding: 14px;
|
||||||
@@ -5958,7 +5955,7 @@ textarea.input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channels-screen--channel .page-header .channel-header-entrypoint-btn {
|
.channels-screen--channel .page-header .channel-header-entrypoint-btn {
|
||||||
border: 1px solid rgba(224, 190, 117, 0.38);
|
border: 1px solid transparent;
|
||||||
background: linear-gradient(180deg, rgba(57, 74, 119, 0.34), rgba(18, 29, 54, 0.34));
|
background: linear-gradient(180deg, rgba(57, 74, 119, 0.34), rgba(18, 29, 54, 0.34));
|
||||||
color: #f1d99c;
|
color: #f1d99c;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
@@ -6060,7 +6057,7 @@ textarea.input {
|
|||||||
background: rgba(15, 18, 30, 0.92);
|
background: rgba(15, 18, 30, 0.92);
|
||||||
backdrop-filter: blur(24px);
|
backdrop-filter: blur(24px);
|
||||||
-webkit-backdrop-filter: blur(24px);
|
-webkit-backdrop-filter: blur(24px);
|
||||||
border: 1px solid rgba(255, 180, 0, 0.2);
|
border: 1px solid transparent;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
padding: 24px;
|
padding: 24px;
|
||||||
}
|
}
|
||||||
@@ -6123,7 +6120,7 @@ textarea.input {
|
|||||||
#channels-subscribe-modal .primary-btn,
|
#channels-subscribe-modal .primary-btn,
|
||||||
#thread-reply-modal .primary-btn {
|
#thread-reply-modal .primary-btn {
|
||||||
background: rgba(255, 180, 0, 0.15);
|
background: rgba(255, 180, 0, 0.15);
|
||||||
border: 1px solid rgba(255, 180, 0, 0.4);
|
border: 1px solid transparent;
|
||||||
color: rgba(255, 200, 50, 0.95);
|
color: rgba(255, 200, 50, 0.95);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 13px 24px;
|
padding: 13px 24px;
|
||||||
@@ -6170,7 +6167,7 @@ textarea.input {
|
|||||||
z-index: 12;
|
z-index: 12;
|
||||||
backdrop-filter: blur(16px);
|
backdrop-filter: blur(16px);
|
||||||
-webkit-backdrop-filter: blur(16px);
|
-webkit-backdrop-filter: blur(16px);
|
||||||
border-bottom: 1px solid rgba(212, 175, 55, 0.24);
|
border-bottom: 1px solid transparent;
|
||||||
background: rgba(10, 12, 18, 0.72);
|
background: rgba(10, 12, 18, 0.72);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6195,7 +6192,7 @@ textarea.input {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
.dm-dialog-card:focus-visible { outline: 2px solid var(--rel-link); outline-offset: 2px; }
|
.dm-dialog-card:focus-visible { outline: 2px solid var(--rel-link); outline-offset: 2px; }
|
||||||
.dm-card--family { border-color: rgba(240, 184, 46, 0.42); } /* линия связи: gold (семья) */
|
.dm-card--family { border-color: transparent; } /* линия связи: gold (семья) */
|
||||||
.dm-card--shining { border-color: rgba(104, 216, 255, 0.45); } /* линия связи: cyan (сияющий) */
|
.dm-card--shining { border-color: rgba(104, 216, 255, 0.45); } /* линия связи: cyan (сияющий) */
|
||||||
|
|
||||||
.dm-screen .list-item .avatar {
|
.dm-screen .list-item .avatar {
|
||||||
@@ -6204,7 +6201,7 @@ textarea.input {
|
|||||||
min-width: 40px;
|
min-width: 40px;
|
||||||
min-height: 40px;
|
min-height: 40px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
border: 1px solid rgba(212, 175, 55, 0.45);
|
border: 1px solid transparent;
|
||||||
background:
|
background:
|
||||||
radial-gradient(circle at 26% 24%, rgba(196, 165, 255, 0.95), rgba(78, 87, 197, 0.9) 58%, rgba(36, 45, 121, 0.9));
|
radial-gradient(circle at 26% 24%, rgba(196, 165, 255, 0.95), rgba(78, 87, 197, 0.9) 58%, rgba(36, 45, 121, 0.9));
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
@@ -6263,7 +6260,7 @@ textarea.input {
|
|||||||
.dm-head-plus {
|
.dm-head-plus {
|
||||||
justify-self: end; width: 48px; height: 48px; border-radius: 50%;
|
justify-self: end; width: 48px; height: 48px; border-radius: 50%;
|
||||||
display: grid; place-items: center; font-size: 24px; line-height: 1; font-weight: 300;
|
display: grid; place-items: center; font-size: 24px; line-height: 1; font-weight: 300;
|
||||||
color: #FFD98A; border: 1.5px solid rgba(240, 184, 46, 0.6);
|
color: #FFD98A; border: 1.5px solid transparent;
|
||||||
background: rgba(12, 12, 16, 0.66);
|
background: rgba(12, 12, 16, 0.66);
|
||||||
box-shadow: 0 0 20px rgba(240, 184, 46, 0.32), 0 0 6px rgba(240, 184, 46, 0.28), inset 0 0 12px rgba(240, 184, 46, 0.12);
|
box-shadow: 0 0 20px rgba(240, 184, 46, 0.32), 0 0 6px rgba(240, 184, 46, 0.28), inset 0 0 12px rgba(240, 184, 46, 0.12);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -6500,7 +6497,7 @@ html, body { overflow-x: hidden; }
|
|||||||
min-height: 34px;
|
min-height: 34px;
|
||||||
padding: 7px 14px;
|
padding: 7px 14px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
border: 1px solid rgba(212, 175, 55, 0.24);
|
border: 1px solid transparent;
|
||||||
background: rgba(9, 15, 26, 0.92);
|
background: rgba(9, 15, 26, 0.92);
|
||||||
color: rgba(245, 226, 179, 0.96);
|
color: rgba(245, 226, 179, 0.96);
|
||||||
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28);
|
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28);
|
||||||
@@ -6518,8 +6515,8 @@ html, body { overflow-x: hidden; }
|
|||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
border: 2px solid rgba(255, 234, 186, 0.22);
|
border: 2px solid transparent;
|
||||||
border-top-color: rgba(242, 201, 92, 0.96);
|
border-top-color: transparent;
|
||||||
box-shadow: 0 0 10px rgba(212, 175, 55, 0.18);
|
box-shadow: 0 0 10px rgba(212, 175, 55, 0.18);
|
||||||
animation: dm-history-loader-spin 0.85s linear infinite;
|
animation: dm-history-loader-spin 0.85s linear infinite;
|
||||||
}
|
}
|
||||||
@@ -6567,7 +6564,7 @@ html, body { overflow-x: hidden; }
|
|||||||
z-index: 10;
|
z-index: 10;
|
||||||
margin-inline: 0;
|
margin-inline: 0;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
border-top: 1px solid rgba(212, 175, 55, 0.22);
|
border-top: 1px solid transparent;
|
||||||
background: rgba(8, 12, 20, 0.9);
|
background: rgba(8, 12, 20, 0.9);
|
||||||
backdrop-filter: blur(12px);
|
backdrop-filter: blur(12px);
|
||||||
-webkit-backdrop-filter: blur(12px);
|
-webkit-backdrop-filter: blur(12px);
|
||||||
@@ -6581,7 +6578,7 @@ html, body { overflow-x: hidden; }
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
padding: 10px 12px;
|
padding: 10px 12px;
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
border: 1px solid rgba(212, 175, 55, 0.35);
|
border: 1px solid transparent;
|
||||||
background: rgba(212, 175, 55, 0.12);
|
background: rgba(212, 175, 55, 0.12);
|
||||||
color: rgba(255, 233, 176, 0.96);
|
color: rgba(255, 233, 176, 0.96);
|
||||||
box-shadow: 0 10px 22px rgba(0, 0, 0, 0.22);
|
box-shadow: 0 10px 22px rgba(0, 0, 0, 0.22);
|
||||||
@@ -6833,7 +6830,7 @@ html, body { overflow-x: hidden; }
|
|||||||
.dm-screen .input,
|
.dm-screen .input,
|
||||||
.dm-input {
|
.dm-input {
|
||||||
background: rgba(255, 255, 255, 0.04);
|
background: rgba(255, 255, 255, 0.04);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.35);
|
border: 1px solid transparent;
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
color: rgba(255, 255, 255, 0.92);
|
color: rgba(255, 255, 255, 0.92);
|
||||||
}
|
}
|
||||||
@@ -6844,7 +6841,7 @@ html, body { overflow-x: hidden; }
|
|||||||
|
|
||||||
.dm-send-btn {
|
.dm-send-btn {
|
||||||
background: rgba(212, 175, 55, 0.2);
|
background: rgba(212, 175, 55, 0.2);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.45);
|
border: 1px solid transparent;
|
||||||
color: rgba(255, 217, 128, 0.98);
|
color: rgba(255, 217, 128, 0.98);
|
||||||
border-radius: 14px;
|
border-radius: 14px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
@@ -6865,7 +6862,7 @@ html, body { overflow-x: hidden; }
|
|||||||
padding: 10px;
|
padding: 10px;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
border: 1px solid rgba(212, 175, 55, 0.22);
|
border: 1px solid transparent;
|
||||||
background: rgba(10, 12, 18, 0.96);
|
background: rgba(10, 12, 18, 0.96);
|
||||||
backdrop-filter: blur(22px);
|
backdrop-filter: blur(22px);
|
||||||
-webkit-backdrop-filter: blur(22px);
|
-webkit-backdrop-filter: blur(22px);
|
||||||
@@ -6933,7 +6930,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background: rgba(18, 24, 38, 0.42);
|
background: rgba(18, 24, 38, 0.42);
|
||||||
backdrop-filter: blur(25px);
|
backdrop-filter: blur(25px);
|
||||||
-webkit-backdrop-filter: blur(25px);
|
-webkit-backdrop-filter: blur(25px);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.32);
|
border: 1px solid transparent;
|
||||||
color: rgba(225, 233, 248, 0.86);
|
color: rgba(225, 233, 248, 0.86);
|
||||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||||
}
|
}
|
||||||
@@ -6943,7 +6940,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background:
|
background:
|
||||||
radial-gradient(circle at 18% -120%, rgba(228, 186, 94, 0.28), transparent 48%),
|
radial-gradient(circle at 18% -120%, rgba(228, 186, 94, 0.28), transparent 48%),
|
||||||
linear-gradient(160deg, rgba(14, 25, 47, 0.98), rgba(7, 16, 34, 0.98));
|
linear-gradient(160deg, rgba(14, 25, 47, 0.98), rgba(7, 16, 34, 0.98));
|
||||||
border: 1px solid rgba(197, 160, 85, 0.38);
|
border: 1px solid transparent;
|
||||||
box-shadow: 0 18px 32px rgba(2, 6, 13, 0.48);
|
box-shadow: 0 18px 32px rgba(2, 6, 13, 0.48);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6958,7 +6955,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background:
|
background:
|
||||||
linear-gradient(145deg, rgba(220, 181, 94, 0.32), rgba(39, 66, 122, 0.3)),
|
linear-gradient(145deg, rgba(220, 181, 94, 0.32), rgba(39, 66, 122, 0.3)),
|
||||||
rgba(20, 35, 64, 0.62);
|
rgba(20, 35, 64, 0.62);
|
||||||
border: 1px solid rgba(220, 183, 100, 0.44);
|
border: 1px solid transparent;
|
||||||
color: #f7e2ad;
|
color: #f7e2ad;
|
||||||
box-shadow: inset 0 1px 0 rgba(255, 242, 204, 0.42);
|
box-shadow: inset 0 1px 0 rgba(255, 242, 204, 0.42);
|
||||||
}
|
}
|
||||||
@@ -6976,7 +6973,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background: rgba(18, 24, 38, 0.4);
|
background: rgba(18, 24, 38, 0.4);
|
||||||
backdrop-filter: blur(25px);
|
backdrop-filter: blur(25px);
|
||||||
-webkit-backdrop-filter: blur(25px);
|
-webkit-backdrop-filter: blur(25px);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.3);
|
border: 1px solid transparent;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7017,7 +7014,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background:
|
background:
|
||||||
linear-gradient(145deg, rgba(212, 175, 55, 0.22), rgba(68, 92, 171, 0.2)),
|
linear-gradient(145deg, rgba(212, 175, 55, 0.22), rgba(68, 92, 171, 0.2)),
|
||||||
rgba(18, 24, 38, 0.44);
|
rgba(18, 24, 38, 0.44);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.42);
|
border: 1px solid transparent;
|
||||||
color: #D4AF37;
|
color: #D4AF37;
|
||||||
text-shadow: 0 0 10px rgba(212, 175, 55, 0.6);
|
text-shadow: 0 0 10px rgba(212, 175, 55, 0.6);
|
||||||
box-shadow: inset 0 1px 0 rgba(255, 238, 197, 0.3);
|
box-shadow: inset 0 1px 0 rgba(255, 238, 197, 0.3);
|
||||||
@@ -7033,7 +7030,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background: transparent;
|
background: transparent;
|
||||||
backdrop-filter: none;
|
backdrop-filter: none;
|
||||||
-webkit-backdrop-filter: none;
|
-webkit-backdrop-filter: none;
|
||||||
border: 1px solid rgba(212, 175, 55, 0.3);
|
border: 1px solid transparent;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7285,7 +7282,7 @@ html, body { overflow-x: hidden; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.channels-screen--add .page-header .icon-btn:hover {
|
.channels-screen--add .page-header .icon-btn:hover {
|
||||||
border-color: rgba(212, 175, 55, 0.44);
|
border-color: transparent;
|
||||||
color: rgba(255, 215, 126, 0.95);
|
color: rgba(255, 215, 126, 0.95);
|
||||||
background: rgba(255, 180, 0, 0.1);
|
background: rgba(255, 180, 0, 0.1);
|
||||||
transform: none;
|
transform: none;
|
||||||
@@ -7308,7 +7305,7 @@ html, body { overflow-x: hidden; }
|
|||||||
|
|
||||||
.channels-screen--add #submit-create-channel {
|
.channels-screen--add #submit-create-channel {
|
||||||
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
|
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
|
||||||
border: 1px solid rgba(212, 175, 55, 0.42);
|
border: 1px solid transparent;
|
||||||
color: rgba(255, 213, 118, 0.95);
|
color: rgba(255, 213, 118, 0.95);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7558,7 +7555,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background: rgba(20, 25, 35, 0.4);
|
background: rgba(20, 25, 35, 0.4);
|
||||||
backdrop-filter: blur(25px);
|
backdrop-filter: blur(25px);
|
||||||
-webkit-backdrop-filter: blur(25px);
|
-webkit-backdrop-filter: blur(25px);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.35);
|
border: 1px solid transparent;
|
||||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.37);
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.37);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7590,9 +7587,9 @@ html, body { overflow-x: hidden; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.profile-top-icon-btn.is-active {
|
.profile-top-icon-btn.is-active {
|
||||||
border-color: rgba(212, 175, 55, 0.46);
|
border-color: transparent;
|
||||||
background: rgba(212, 175, 55, 0.12);
|
background: rgba(212, 175, 55, 0.12);
|
||||||
box-shadow: 0 0 0 1px rgba(212, 175, 55, 0.08) inset, 0 10px 22px rgba(0, 0, 0, 0.22);
|
box-shadow: 0 10px 22px rgba(0, 0, 0, 0.22);
|
||||||
}
|
}
|
||||||
|
|
||||||
.profile-top-icon-btn:hover {
|
.profile-top-icon-btn:hover {
|
||||||
@@ -7796,7 +7793,7 @@ html, body { overflow-x: hidden; }
|
|||||||
|
|
||||||
.profile-screen .primary-btn {
|
.profile-screen .primary-btn {
|
||||||
background: rgba(212, 175, 55, 0.2);
|
background: rgba(212, 175, 55, 0.2);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.45);
|
border: 1px solid transparent;
|
||||||
color: rgba(255, 217, 128, 0.98);
|
color: rgba(255, 217, 128, 0.98);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7833,7 +7830,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background: rgba(20, 25, 35, 0.5);
|
background: rgba(20, 25, 35, 0.5);
|
||||||
backdrop-filter: blur(18px);
|
backdrop-filter: blur(18px);
|
||||||
-webkit-backdrop-filter: blur(18px);
|
-webkit-backdrop-filter: blur(18px);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.26);
|
border: 1px solid transparent;
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7843,7 +7840,7 @@ html, body { overflow-x: hidden; }
|
|||||||
|
|
||||||
.notifications-screen .tab-btn.active {
|
.notifications-screen .tab-btn.active {
|
||||||
background: rgba(255, 180, 0, 0.12);
|
background: rgba(255, 180, 0, 0.12);
|
||||||
border: 1px solid rgba(255, 180, 0, 0.28);
|
border: 1px solid transparent;
|
||||||
color: rgba(255, 200, 50, 0.92);
|
color: rgba(255, 200, 50, 0.92);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7948,7 +7945,7 @@ html, body { overflow-x: hidden; }
|
|||||||
|
|
||||||
.channels-screen--list .channels-bottom-action {
|
.channels-screen--list .channels-bottom-action {
|
||||||
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
|
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
|
||||||
border: 1px solid rgba(212, 175, 55, 0.3);
|
border: 1px solid transparent;
|
||||||
color: #D4AF37;
|
color: #D4AF37;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
@@ -7961,7 +7958,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background: rgba(18, 24, 38, 0.4) !important;
|
background: rgba(18, 24, 38, 0.4) !important;
|
||||||
backdrop-filter: blur(25px);
|
backdrop-filter: blur(25px);
|
||||||
-webkit-backdrop-filter: blur(25px);
|
-webkit-backdrop-filter: blur(25px);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.3) !important;
|
border: 1px solid transparent !important;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7977,7 +7974,7 @@ html, body { overflow-x: hidden; }
|
|||||||
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
|
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
|
||||||
backdrop-filter: blur(25px);
|
backdrop-filter: blur(25px);
|
||||||
-webkit-backdrop-filter: blur(25px);
|
-webkit-backdrop-filter: blur(25px);
|
||||||
border: 1px solid rgba(212, 175, 55, 0.3);
|
border: 1px solid transparent;
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
color: #D4AF37;
|
color: #D4AF37;
|
||||||
}
|
}
|
||||||
@@ -8031,7 +8028,7 @@ html, body { overflow-x: hidden; }
|
|||||||
margin: 16px 20px 0;
|
margin: 16px 20px 0;
|
||||||
width: calc(100% - 40px);
|
width: calc(100% - 40px);
|
||||||
background: linear-gradient(135deg, #f5cf4f, #e2ad1f);
|
background: linear-gradient(135deg, #f5cf4f, #e2ad1f);
|
||||||
border: 1px solid rgba(255, 215, 97, 0.85);
|
border: 1px solid transparent;
|
||||||
color: #2f2200;
|
color: #2f2200;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
box-shadow: 0 14px 28px rgba(226, 173, 31, 0.24);
|
box-shadow: 0 14px 28px rgba(226, 173, 31, 0.24);
|
||||||
@@ -8097,7 +8094,7 @@ html, body { overflow-x: hidden; }
|
|||||||
.dm-head-menu-btn:focus-visible {
|
.dm-head-menu-btn:focus-visible {
|
||||||
outline: none;
|
outline: none;
|
||||||
background: rgba(240, 184, 46, 0.08);
|
background: rgba(240, 184, 46, 0.08);
|
||||||
box-shadow: inset 0 0 0 1px rgba(240, 184, 46, 0.24), 0 0 18px rgba(240, 184, 46, 0.12);
|
box-shadow: 0 0 18px rgba(240, 184, 46, 0.12);
|
||||||
}
|
}
|
||||||
.dm-head-menu-dots {
|
.dm-head-menu-dots {
|
||||||
width: 6px;
|
width: 6px;
|
||||||
@@ -8123,7 +8120,7 @@ html, body { overflow-x: hidden; }
|
|||||||
width: max-content;
|
width: max-content;
|
||||||
min-width: 190px;
|
min-width: 190px;
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
border: 1px solid rgba(240, 184, 46, 0.26);
|
border: 1px solid transparent;
|
||||||
border-radius: 15px;
|
border-radius: 15px;
|
||||||
background: linear-gradient(155deg, rgba(22, 24, 31, 0.97), rgba(10, 12, 18, 0.97));
|
background: linear-gradient(155deg, rgba(22, 24, 31, 0.97), rgba(10, 12, 18, 0.97));
|
||||||
box-shadow: 0 16px 38px rgba(0, 0, 0, 0.42), 0 0 20px rgba(240, 184, 46, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
box-shadow: 0 16px 38px rgba(0, 0, 0, 0.42), 0 0 20px rgba(240, 184, 46, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.04);
|
||||||
@@ -8141,8 +8138,8 @@ html, body { overflow-x: hidden; }
|
|||||||
width: 9px;
|
width: 9px;
|
||||||
height: 9px;
|
height: 9px;
|
||||||
transform: rotate(45deg);
|
transform: rotate(45deg);
|
||||||
border-left: 1px solid rgba(240, 184, 46, 0.22);
|
border-left: 1px solid transparent;
|
||||||
border-top: 1px solid rgba(240, 184, 46, 0.22);
|
border-top: 1px solid transparent;
|
||||||
background: rgba(19, 21, 28, 0.98);
|
background: rgba(19, 21, 28, 0.98);
|
||||||
}
|
}
|
||||||
.dm-head-menu-item {
|
.dm-head-menu-item {
|
||||||
@@ -8312,7 +8309,7 @@ html, body { overflow-x: hidden; }
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
-webkit-tap-highlight-color: transparent;
|
-webkit-tap-highlight-color: transparent;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
border: 1px solid rgba(212, 175, 55, 0.45);
|
border: 1px solid transparent;
|
||||||
background: linear-gradient(160deg, rgba(16, 24, 38, 0.94), rgba(12, 18, 30, 0.9));
|
background: linear-gradient(160deg, rgba(16, 24, 38, 0.94), rgba(12, 18, 30, 0.9));
|
||||||
color: rgba(255, 227, 150, 0.96);
|
color: rgba(255, 227, 150, 0.96);
|
||||||
box-shadow: 0 12px 26px rgba(3, 8, 18, 0.45), 0 0 20px rgba(212, 175, 55, 0.16);
|
box-shadow: 0 12px 26px rgba(3, 8, 18, 0.45), 0 0 20px rgba(212, 175, 55, 0.16);
|
||||||
@@ -8337,7 +8334,7 @@ html, body { overflow-x: hidden; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.scroll-to-bottom-btn:focus-visible {
|
.scroll-to-bottom-btn:focus-visible {
|
||||||
outline: 2px solid rgba(255, 227, 150, 0.92);
|
outline: 2px solid transparent;
|
||||||
outline-offset: 3px;
|
outline-offset: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9623,16 +9620,10 @@ body.chat-topbar-overlay .composer-slot > * {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ===== Connections: restore canonical shared topbar (2026-08-22 14:00) =====
|
/* ===== Связи: общий topbar + такое же верхнее затухание, как в чате =====
|
||||||
* The toolbar itself is the standard renderHeader() mounted in #topbar-slot.
|
* Шапка остаётся стандартным renderHeader() внутри #topbar-slot. Собственного
|
||||||
* Network-specific positioning must never move .screen-content under it.
|
* fade у графа нет: используется глобальный .topbar-slot::before, который
|
||||||
* The graph fade lives inside .network-stage instead, so canvas layout cannot
|
* плавно продолжается ниже шапки так же, как на странице личного чата. */
|
||||||
* change toolbar height/position or overlap its controls. */
|
|
||||||
.topbar-slot:has(> .network-topbar)::before {
|
|
||||||
/* Keep the generic toolbar background/fade inside the toolbar bounds only. */
|
|
||||||
height: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Undo the previous Connections-only full-bleed-under-toolbar geometry. */
|
/* Undo the previous Connections-only full-bleed-under-toolbar geometry. */
|
||||||
.screen-content.network-scroll-lock {
|
.screen-content.network-scroll-lock {
|
||||||
top: calc(var(--call-minimized-bar-height, 0px) + var(--topbar-height, 0px)) !important;
|
top: calc(var(--call-minimized-bar-height, 0px) + var(--topbar-height, 0px)) !important;
|
||||||
@@ -9655,49 +9646,11 @@ body.chat-topbar-overlay .composer-slot > * {
|
|||||||
top: var(--app-primary-tabs-top-gap, 14px) !important;
|
top: var(--app-primary-tabs-top-gap, 14px) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fade belongs to the graph surface, not to the toolbar. It sits above graph
|
/* «Связи» не рисуют собственное затухание поверх графа. Верхний fade берётся
|
||||||
* nodes/edges but below filter chips (filter bar z-index is 11). */
|
* из общего .topbar-slot::before — ровно тот же слой, что используется в чате. */
|
||||||
.network-stage::before {
|
|
||||||
content: '';
|
/* «Связи» теперь используют ровно тот же .page-header.app-topbar-shell, что и личный чат. */
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 58px;
|
|
||||||
z-index: 10;
|
|
||||||
pointer-events: none;
|
|
||||||
background: linear-gradient(
|
|
||||||
to bottom,
|
|
||||||
rgba(5, 7, 10, 1) 0%,
|
|
||||||
rgba(5, 7, 10, 0.86) 28%,
|
|
||||||
rgba(5, 7, 10, 0.48) 58%,
|
|
||||||
rgba(5, 7, 10, 0.16) 82%,
|
|
||||||
rgba(5, 7, 10, 0) 100%
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Explicitly keep the Connections header on the canonical topbar contract.
|
|
||||||
* No network-only absolute positioning, dimensions or padding. */
|
|
||||||
.topbar-slot > .page-header.app-topbar-shell.network-topbar {
|
|
||||||
position: relative !important;
|
|
||||||
inset: auto !important;
|
|
||||||
width: 100% !important;
|
|
||||||
height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top)) !important;
|
|
||||||
min-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top)) !important;
|
|
||||||
max-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top)) !important;
|
|
||||||
margin: 0 !important;
|
|
||||||
padding: env(safe-area-inset-top) 0 0 !important;
|
|
||||||
display: grid !important;
|
|
||||||
grid-template-columns: minmax(44px, 1fr) minmax(0, auto) minmax(44px, 1fr) !important;
|
|
||||||
align-items: center !important;
|
|
||||||
gap: 8px !important;
|
|
||||||
border: 0 !important;
|
|
||||||
border-radius: 0 !important;
|
|
||||||
background: transparent !important;
|
|
||||||
box-shadow: none !important;
|
|
||||||
backdrop-filter: none !important;
|
|
||||||
-webkit-backdrop-filter: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===== Единая полировка меню, DM и управляющих кнопок (2026-08-26) ===== */
|
/* ===== Единая полировка меню, DM и управляющих кнопок (2026-08-26) ===== */
|
||||||
|
|
||||||
@@ -9988,7 +9941,7 @@ body.chat-topbar-overlay .composer-slot {
|
|||||||
width: 42px;
|
width: 42px;
|
||||||
height: 42px;
|
height: 42px;
|
||||||
border: 3px solid rgba(220, 232, 255, 0.18);
|
border: 3px solid rgba(220, 232, 255, 0.18);
|
||||||
border-top-color: rgba(238, 203, 126, 0.95);
|
border-top-color: transparent;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
animation: secret-generation-spin 0.82s linear infinite;
|
animation: secret-generation-spin 0.82s linear infinite;
|
||||||
}
|
}
|
||||||
@@ -10485,3 +10438,86 @@ body.chat-topbar-overlay .composer-slot {
|
|||||||
.channels-screen--list .channel-row-owner {
|
.channels-screen--list .channel-row-owner {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ===== Channel list alignment with Personal chats (2026-08-29) ===== */
|
||||||
|
/* Match the Personal tab width model exactly: only the list itself grows beyond
|
||||||
|
* the content gutter, rather than widening several nested channel containers. */
|
||||||
|
.channels-screen--list .channels-list-content,
|
||||||
|
.channels-screen--list .channels-groups {
|
||||||
|
width: 100% !important;
|
||||||
|
margin-left: 0 !important;
|
||||||
|
margin-right: 0 !important;
|
||||||
|
}
|
||||||
|
.channels-screen--list .stack:has(> .channel-row) {
|
||||||
|
width: calc(100% + 16px) !important;
|
||||||
|
margin-inline: -8px !important;
|
||||||
|
gap: 4px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slightly taller than Personal (~12%) to comfortably fit title + technical id
|
||||||
|
* + last-message preview, while keeping the compact list rhythm. */
|
||||||
|
.channels-screen--list .channel-row {
|
||||||
|
width: 100% !important;
|
||||||
|
min-height: 61px !important;
|
||||||
|
padding: 6px 7px 6px 5px !important;
|
||||||
|
grid-template-columns: 50px minmax(0, 1fr) !important;
|
||||||
|
gap: 8px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.channels-screen--list .channel-row-main {
|
||||||
|
display: grid !important;
|
||||||
|
align-content: center !important;
|
||||||
|
gap: 1px !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore the compact technical channel id: owner login / channel name. */
|
||||||
|
.channels-screen--list .channel-row-technical {
|
||||||
|
display: block !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
font-size: 10.5px !important;
|
||||||
|
line-height: 1.05 !important;
|
||||||
|
font-weight: 500 !important;
|
||||||
|
opacity: .72;
|
||||||
|
overflow: hidden !important;
|
||||||
|
text-overflow: ellipsis !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Keep only the requested two supporting lines; description/counters stay out of
|
||||||
|
* the compact channel tile. */
|
||||||
|
.channels-screen--list .channel-row-description,
|
||||||
|
.channels-screen--list .channel-row-owner {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Last message and its timestamp form one single line. The preview yields space
|
||||||
|
* to the timestamp and truncates with an ellipsis when necessary. */
|
||||||
|
.channels-screen--list .channel-row-preview-line {
|
||||||
|
display: flex !important;
|
||||||
|
align-items: baseline !important;
|
||||||
|
width: 100% !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
gap: 7px !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
.channels-screen--list .channel-row-preview-line .channel-row-message {
|
||||||
|
flex: 1 1 auto !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
font-size: 12px !important;
|
||||||
|
line-height: 1.1 !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
text-overflow: ellipsis !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
}
|
||||||
|
.channels-screen--list .channel-row-preview-line .channel-row-time {
|
||||||
|
flex: 0 0 auto !important;
|
||||||
|
align-self: baseline !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
font-size: 11px !important;
|
||||||
|
line-height: 1.1 !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ body::before {
|
|||||||
--toolbar-height: 78px;
|
--toolbar-height: 78px;
|
||||||
--keyboard-offset: 0px;
|
--keyboard-offset: 0px;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border-left: 1px solid rgba(211, 170, 86, 0.2);
|
border-left: 1px solid transparent;
|
||||||
border-right: 1px solid rgba(211, 170, 86, 0.2);
|
border-right: 1px solid transparent;
|
||||||
box-shadow: var(--shadow);
|
box-shadow: var(--shadow);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
@@ -178,7 +178,7 @@ body.chat-topbar-overlay .app-shell.keyboard-open .screen-content {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.connection-retry-banner.is-connecting {
|
.connection-retry-banner.is-connecting {
|
||||||
border-color: rgba(238, 196, 107, 0.42);
|
border-color: transparent;
|
||||||
color: #ffe8bb;
|
color: #ffe8bb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -531,79 +531,6 @@
|
|||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Нижний сниппет (bottom sheet) */
|
|
||||||
.fg-sheet {
|
|
||||||
position: absolute;
|
|
||||||
left: 12px;
|
|
||||||
right: 12px;
|
|
||||||
bottom: calc(12px + env(safe-area-inset-bottom));
|
|
||||||
z-index: 13;
|
|
||||||
display: none;
|
|
||||||
padding: 12px 14px 14px;
|
|
||||||
background: rgba(16, 24, 40, 0.95);
|
|
||||||
border: 1px solid rgba(166, 196, 245, 0.26);
|
|
||||||
border-radius: 16px;
|
|
||||||
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
|
|
||||||
backdrop-filter: blur(14px);
|
|
||||||
-webkit-backdrop-filter: blur(14px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg-sheet.is-open {
|
|
||||||
display: block;
|
|
||||||
animation: fg-sheet-in 200ms ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes fg-sheet-in {
|
|
||||||
from { transform: translateY(16px); opacity: 0; }
|
|
||||||
to { transform: translateY(0); opacity: 1; }
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg-sheet-close {
|
|
||||||
position: absolute;
|
|
||||||
top: 8px;
|
|
||||||
right: 10px;
|
|
||||||
background: transparent;
|
|
||||||
border: 0;
|
|
||||||
color: #9fb6e0;
|
|
||||||
font-size: 16px;
|
|
||||||
cursor: pointer;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg-sheet-title {
|
|
||||||
font-weight: 700;
|
|
||||||
font-size: 15px;
|
|
||||||
color: #eaf1ff;
|
|
||||||
display: flex;
|
|
||||||
gap: 8px;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg-sheet-badge {
|
|
||||||
font-size: 10px;
|
|
||||||
background: rgba(130, 235, 255, 0.2);
|
|
||||||
color: #bff0ff;
|
|
||||||
padding: 2px 8px;
|
|
||||||
border-radius: 999px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg-sheet-rel {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #9fb6e0;
|
|
||||||
margin-top: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg-sheet-actions {
|
|
||||||
display: flex;
|
|
||||||
gap: 8px;
|
|
||||||
margin-top: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fg-sheet-actions > button {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* === Партия 2: бейдж-счётчик связей, поиск, хлебные крошки, цветовые кластеры ============ */
|
/* === Партия 2: бейдж-счётчик связей, поиск, хлебные крошки, цветовые кластеры ============ */
|
||||||
|
|
||||||
/* Бейдж числа связей — маленькая пилюля в правом-верхнем углу аватарки */
|
/* Бейдж числа связей — маленькая пилюля в правом-верхнем углу аватарки */
|
||||||
@@ -722,6 +649,6 @@
|
|||||||
|
|
||||||
/* «Общая связь» (этот человек — и твой друг тоже): золотой ободок. Значок ★ убран по запросу. */
|
/* «Общая связь» (этот человек — и твой друг тоже): золотой ободок. Значок ★ убран по запросу. */
|
||||||
.fg-node.is-common .node-dot {
|
.fg-node.is-common .node-dot {
|
||||||
border-color: rgba(255, 214, 120, 0.95);
|
border-color: transparent;
|
||||||
box-shadow: 0 0 14px rgba(255, 200, 90, 0.4);
|
box-shadow: 0 0 14px rgba(255, 200, 90, 0.4);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user