Files
SHiNE-server/shine-UI/styles/components.css
T

11403 lines
262 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.
/* Глобально отключаем синюю tap-подсветку мобильных браузеров/WebView на ВСЕХ элементах
(Android/Chromium): синего квадрата при нажатии нигде быть не должно. */
* {
-webkit-tap-highlight-color: transparent;
}
.page-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 14px;
gap: 8px;
padding-top: max(0px, env(safe-area-inset-top));
}
.topbar-slot .page-header,
.topbar-slot .dm-head,
.topbar-slot .channels-top-bar {
margin-bottom: 0;
min-height: calc(68px + env(safe-area-inset-top));
box-sizing: border-box;
border-radius: 18px;
background: rgba(14, 21, 35, 0.92);
border: 1px solid transparent;
box-shadow: 0 10px 26px rgba(4, 8, 16, 0.28);
backdrop-filter: blur(14px);
}
.topbar-slot .page-header {
padding: calc(10px + env(safe-area-inset-top)) 12px 10px;
}
.topbar-slot .dm-head,
.topbar-slot .channels-top-bar {
min-height: calc(68px + env(safe-area-inset-top));
padding-top: calc(10px + env(safe-area-inset-top));
padding-bottom: 10px;
}
.topbar-slot .dm-head {
position: relative;
top: auto;
}
.topbar-slot .page-header,
.topbar-slot .dm-head,
.topbar-slot .channels-top-bar {
align-items: center;
}
.app-topbar-shell .page-title {
flex: 1 1 auto;
text-align: center;
}
.app-topbar-shell--profile {
justify-content: flex-end;
}
.app-topbar-shell--profile .header-actions {
min-width: 0;
margin-left: auto;
}
.app-topbar-shell .header-left,
.app-topbar-shell .header-actions {
min-width: 92px;
}
.page-title {
font-size: 22px;
font-weight: 700;
letter-spacing: 0.2px;
}
.header-actions,
.header-left {
display: flex;
align-items: center;
gap: 8px;
min-width: 74px;
}
.header-left {
justify-content: flex-start;
}
.header-left-label {
display: inline-block;
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 12px;
color: #a8bcdf;
}
.header-actions {
justify-content: flex-end;
}
.chat-header-icon-btn {
min-width: 44px;
width: 44px;
min-height: 44px;
height: 44px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 20px;
line-height: 1;
}
.chat-header-call-btn {
border-radius: 12px;
}
.header-icon-svg {
display: block;
width: 1em;
height: 1em;
}
.header-icon-svg--phone,
.header-icon-svg--search {
width: 22px;
height: 22px;
}
.chat-header-menu-btn {
border-radius: 12px;
font-size: 24px;
}
.icon-btn,
.text-btn,
.primary-btn,
.secondary-btn,
.destructive-btn,
.ghost-btn {
border: 1px solid rgba(255, 255, 255, 0.14);
border-radius: var(--radius-sm);
background: rgba(255, 255, 255, 0.03);
color: var(--text);
padding: 9px 12px;
min-height: 38px;
font-weight: 600;
cursor: pointer;
transition: 0.2s ease;
}
.icon-btn,
.text-btn,
.primary-btn,
.secondary-btn,
.destructive-btn,
.ghost-btn,
.badge.profile-badge-trigger,
.entrypoint-history-item,
.toolbar-item,
.toolbar-action,
.toolbar-button {
user-select: none;
-webkit-user-select: none;
-webkit-touch-callout: none;
}
.icon-btn:hover,
.text-btn:hover,
.primary-btn:hover,
.secondary-btn:hover,
.destructive-btn:hover,
.ghost-btn:hover {
border-color: transparent;
transform: translateY(-1px);
}
.icon-btn:active,
.text-btn:active,
.primary-btn:active,
.secondary-btn:active,
.destructive-btn:active,
.ghost-btn:active,
.badge.profile-badge-trigger:active,
.entrypoint-history-item:active {
transform: scale(0.98);
filter: brightness(0.96);
}
.primary-btn {
background: linear-gradient(120deg, rgba(218, 179, 87, 0.95), rgba(184, 137, 54, 0.92));
border-color: transparent;
color: #101426;
}
.secondary-btn {
background: linear-gradient(180deg, rgba(19, 35, 63, 0.9), rgba(14, 26, 50, 0.95));
border-color: rgba(132, 162, 228, 0.42);
color: #e7efff;
}
.destructive-btn {
background: linear-gradient(120deg, rgba(129, 37, 54, 0.9), rgba(92, 23, 37, 0.94));
border-color: rgba(255, 129, 147, 0.46);
color: #ffe4ea;
}
.ghost-btn {
background: rgba(17, 26, 46, 0.62);
border-color: rgba(255, 255, 255, 0.16);
}
.icon-btn:disabled,
.text-btn:disabled,
.primary-btn:disabled,
.secondary-btn:disabled,
.destructive-btn:disabled,
.ghost-btn:disabled {
opacity: 1;
color: #93a6cc;
background: linear-gradient(180deg, rgba(18, 30, 54, 0.8), rgba(11, 20, 39, 0.86));
border-color: rgba(124, 145, 189, 0.28);
box-shadow: none;
cursor: not-allowed;
transform: none;
}
.card {
background: linear-gradient(180deg, rgba(31, 44, 67, 0.62), rgba(21, 30, 48, 0.9));
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: var(--radius-lg);
padding: 14px;
}
.row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.stack {
display: grid;
gap: 10px;
}
.badge {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
border-radius: 999px;
border: 1px solid rgba(132, 244, 161, 0.35);
color: #d7ffe3;
background: rgba(132, 244, 161, 0.09);
font-size: 12px;
font-weight: 600;
}
.badge.profile-badge-trigger {
cursor: pointer;
}
.badge.alt {
border-color: rgba(83, 216, 251, 0.35);
color: #dff8ff;
background: rgba(83, 216, 251, 0.11);
}
.badge.is-no {
border-color: rgba(170, 180, 205, 0.3);
color: #c5cedd;
background: rgba(152, 164, 190, 0.14);
}
.badge.is-yes-official {
border-color: rgba(132, 244, 161, 0.5);
color: #ddffe7;
background: rgba(132, 244, 161, 0.2);
}
.badge.is-yes-shine {
border-color: rgba(183, 122, 255, 0.6);
color: #f4e7ff;
background: rgba(176, 102, 255, 0.22);
}
.badge.profile-toggle-btn.is-no {
border-color: rgba(170, 180, 205, 0.3);
color: #c5cedd;
background: rgba(152, 164, 190, 0.14);
}
.badge.profile-toggle-btn.is-yes-official {
border-color: rgba(132, 244, 161, 0.5);
color: #ddffe7;
background: rgba(132, 244, 161, 0.2);
}
.badge.profile-toggle-btn.is-yes-shine {
border-color: rgba(183, 122, 255, 0.6);
color: #f4e7ff;
background: rgba(176, 102, 255, 0.22);
}
.profile-help-modal[hidden] {
display: none;
}
.profile-help-modal {
position: fixed;
inset: 0;
z-index: 20;
}
.profile-help-backdrop {
position: absolute;
inset: 0;
background: rgba(5, 9, 16, 0.72);
backdrop-filter: blur(4px);
}
.profile-help-dialog {
position: absolute;
left: 16px;
right: 16px;
bottom: 24px;
display: grid;
gap: 12px;
padding: 16px;
box-shadow: var(--shadow);
}
.profile-help-text {
color: #d8e3ff;
line-height: 1.45;
font-size: 14px;
}
.profile-data-help p {
margin-top: 6px;
line-height: 1.4;
color: #d8e3ff;
}
.profile-param-list {
gap: 8px;
}
.profile-identity-lines {
display: grid;
gap: 4px;
}
.profile-identity-line {
line-height: 1.2;
color: #eef3ff;
font-size: 17px;
}
.profile-identity-login {
font-weight: 700;
font-size: 20px;
}
.profile-avatar-block {
display: grid;
justify-items: center;
gap: 8px;
}
.profile-avatar {
position: relative;
overflow: hidden;
}
.profile-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
display: block;
}
.profile-avatar-change-btn {
min-height: 34px;
padding: 6px 10px;
}
.avatar-preview-circle {
width: 124px;
height: 124px;
margin: 0 auto;
border-radius: 50%;
overflow: hidden;
border: 1px solid rgba(155, 182, 233, 0.46);
background: rgba(13, 26, 50, 0.86);
box-shadow: inset 0 0 0 1px rgba(240, 248, 255, 0.1);
}
.avatar-preview-circle img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
display: block;
}
.avatar-wizard-preview {
width: 140px;
height: 140px;
}
.avatar-wizard-meta {
font-size: 13px;
line-height: 1.35;
color: #d9e7ff;
word-break: break-word;
}
.avatar-wizard-error {
min-height: 18px;
font-size: 13px;
color: #f6a8b3;
}
.avatar-wizard-actions {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.avatar-wizard-choice-grid {
display: grid;
gap: 10px;
}
.profile-param-item {
padding: 10px;
gap: 6px;
}
.profile-param-head {
display: flex;
justify-content: space-between;
gap: 8px;
}
.profile-param-value {
font-size: 15px;
color: #eef3ff;
word-break: break-word;
}
.profile-param-value-small {
font-size: 13px;
}
.profile-gender-select,
.profile-relation-select {
min-height: 46px;
border-radius: 12px;
border: 1px solid rgba(157, 185, 238, 0.35);
background:
linear-gradient(150deg, rgba(23, 43, 79, 0.9), rgba(10, 22, 44, 0.92));
color: #eef4ff;
font-weight: 600;
letter-spacing: 0.01em;
}
.profile-gender-select:focus,
.profile-relation-select:focus {
border-color: rgba(120, 211, 255, 0.9);
box-shadow: 0 0 0 3px rgba(65, 174, 255, 0.2);
}
.profile-relative-search-meta {
font-size: 12px;
line-height: 1.35;
}
.profile-relative-search-suggest {
max-height: 180px;
overflow-y: auto;
border: 1px solid rgba(150, 174, 224, 0.3);
border-radius: 12px;
background: rgba(9, 18, 35, 0.94);
padding: 6px;
}
.profile-relative-suggest-item {
width: 100%;
text-align: left;
border: 1px solid rgba(132, 162, 224, 0.28);
border-radius: 9px;
background: rgba(16, 30, 56, 0.78);
color: #e5eeff;
padding: 8px 10px;
cursor: pointer;
margin-bottom: 6px;
}
.profile-relative-suggest-item:last-child {
margin-bottom: 0;
}
.profile-relative-suggest-item:hover {
border-color: transparent;
color: #f3dca8;
}
.profile-param-time {
font-size: 12px;
}
.auth-screen {
min-height: calc(100dvh - 48px - env(safe-area-inset-bottom));
display: grid;
align-content: center;
justify-items: center;
gap: 18px;
text-align: center;
}
.initial-splash {
position: fixed;
inset: 0;
z-index: 10000;
display: grid;
align-content: center;
justify-items: center;
gap: clamp(12px, 2.4vh, 20px);
padding: 24px;
overflow: hidden;
background:
radial-gradient(circle at 50% 18%, rgba(224, 172, 75, 0.08), transparent 26%),
radial-gradient(circle at 50% 67%, rgba(45, 81, 143, 0.06), transparent 38%),
linear-gradient(180deg, #040816 0%, #020611 54%, #01040c 100%);
font-family: "Manrope", "Inter", "SF Pro Display", system-ui, sans-serif;
opacity: 1;
visibility: visible;
transition: opacity 520ms ease, visibility 520ms ease;
}
.initial-splash.is-leaving {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.initial-splash__logo-wrap {
position: relative;
isolation: isolate;
width: clamp(156px, 42vw, 208px);
aspect-ratio: 1;
}
.initial-splash__logo-wrap::before {
content: "";
position: absolute;
inset: 16%;
z-index: -1;
border-radius: 50%;
background: rgba(214, 155, 56, 0.2);
filter: blur(30px);
animation: shine-halo-breathe 4.8s ease-in-out infinite;
}
.initial-splash__logo {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
filter:
drop-shadow(0 0 8px rgba(255, 211, 121, 0.72))
drop-shadow(0 8px 22px rgba(225, 158, 48, 0.38));
animation: shine-logo-breathe 4.8s ease-in-out infinite;
}
.initial-splash__brand {
margin-top: -2px;
color: #f4ebdd;
font-size: clamp(34px, 7vw, 46px);
font-weight: 500;
line-height: 1;
text-shadow: 0 3px 22px rgba(210, 168, 90, 0.2);
}
.auth-screen--welcome {
position: relative;
isolation: isolate;
align-content: center;
justify-items: center;
gap: clamp(12px, 2.4vh, 20px);
padding-block: 8px;
font-family: "Manrope", "Inter", "SF Pro Display", system-ui, sans-serif;
}
.screen-content.no-app-chrome:has(> .auth-screen--welcome) {
overflow: hidden;
overscroll-behavior: none;
}
.auth-screen--welcome::before {
content: "";
position: absolute;
inset: -14px -14px calc(-24px - env(safe-area-inset-bottom));
z-index: -2;
background:
radial-gradient(circle at 50% 18%, rgba(224, 172, 75, 0.08), transparent 26%),
radial-gradient(circle at 50% 67%, rgba(45, 81, 143, 0.06), transparent 38%),
linear-gradient(180deg, #040816 0%, #020611 54%, #01040c 100%);
}
.auth-screen--welcome::after {
content: "";
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.015) 50%, transparent);
opacity: 0.7;
}
.auth-screen--lower {
align-content: start;
padding-top: clamp(80px, 18vh, 180px);
}
.auth-logo {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
filter:
drop-shadow(0 0 8px rgba(255, 211, 121, 0.72))
drop-shadow(0 8px 22px rgba(225, 158, 48, 0.38));
animation: shine-logo-breathe 4.8s ease-in-out infinite;
}
.auth-logo-wrap {
position: relative;
width: clamp(232px, 59vw, 284px);
aspect-ratio: 1;
}
.auth-logo-wrap::before {
content: "";
position: absolute;
inset: 16%;
z-index: -1;
border-radius: 50%;
background: rgba(214, 155, 56, 0.2);
filter: blur(30px);
animation: shine-halo-breathe 4.8s ease-in-out infinite;
}
.auth-brand {
margin: -4px 0 clamp(4px, 1vh, 10px);
color: #f4ebdd;
font-size: clamp(42px, 9vw, 56px);
font-weight: 500;
line-height: 1;
letter-spacing: 0;
text-shadow: 0 3px 22px rgba(210, 168, 90, 0.2);
}
.auth-actions,
.auth-footer-actions {
display: grid;
gap: 10px;
}
.auth-actions {
width: min(100%, 320px);
}
.shine-actions {
width: min(100%, 390px);
max-width: calc(100% - 48px);
gap: 12px;
}
.shine-btn {
position: relative;
isolation: isolate;
overflow: hidden;
width: 100%;
height: 56px;
min-height: 48px;
padding: 0 24px;
border: 1px solid rgba(183, 203, 235, 0.28);
border-radius: 18px;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.09), transparent 28%),
linear-gradient(180deg, rgba(13, 27, 57, 0.68), rgba(5, 11, 27, 0.74));
color: #f4ebdd;
font-family: "Manrope", "Inter", "SF Pro Display", system-ui, sans-serif;
font-size: 18px;
font-weight: 500;
line-height: 1.2;
letter-spacing: 0;
text-align: center;
text-shadow: 0 1px 12px rgba(238, 213, 166, 0.1);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.14),
inset 0 -18px 30px rgba(0, 0, 0, 0.22),
0 14px 30px rgba(0, 0, 0, 0.38),
0 2px 7px rgba(29, 57, 103, 0.2);
backdrop-filter: blur(18px) saturate(125%);
-webkit-backdrop-filter: blur(18px) saturate(125%);
cursor: pointer;
transition:
transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1),
border-color 180ms cubic-bezier(0.2, 0.8, 0.2, 1),
box-shadow 180ms cubic-bezier(0.2, 0.8, 0.2, 1),
filter 180ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
.shine-btn::before {
content: "";
position: absolute;
inset: 1px;
z-index: -1;
border-radius: 16px;
background:
radial-gradient(120% 65% at 50% 115%, rgba(63, 103, 169, 0.24), transparent 64%),
linear-gradient(105deg, rgba(255, 255, 255, 0.05), transparent 38%);
pointer-events: none;
}
.shine-btn::after {
content: "";
position: absolute;
right: 18px;
bottom: 0;
width: 52px;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(235, 197, 117, 0.72));
box-shadow: 0 0 10px rgba(216, 173, 98, 0.3);
pointer-events: none;
}
.shine-btn--primary {
border-color: rgba(var(--shine-action-blue-rgb), 0.72);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.10), transparent 30%),
linear-gradient(180deg, rgba(var(--shine-action-blue-rgb), 0.92), rgba(8, 20, 44, 0.92));
color: #eef5ff;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.24),
inset 0 -20px 34px rgba(0, 0, 0, 0.30),
0 15px 34px rgba(0, 0, 0, 0.38),
0 4px 20px rgba(var(--shine-action-blue-rgb), 0.18);
}
.shine-btn--primary::before {
background:
radial-gradient(115% 65% at 50% 110%, rgba(122, 170, 255, 0.32), transparent 64%),
linear-gradient(108deg, rgba(255, 255, 255, 0.12), transparent 38%);
}
.shine-btn--register {
border-color: rgba(var(--shine-action-blue-rgb), 0.34);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.06), transparent 28%),
linear-gradient(180deg, rgba(12, 36, 82, 0.88), rgba(5, 14, 32, 0.82));
}
.shine-btn--view {
color: rgba(236, 244, 255, 0.92);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.05), transparent 28%),
linear-gradient(180deg, rgba(15, 42, 94, 0.78), rgba(5, 13, 30, 0.82));
}
.shine-btn--view::after {
opacity: 0.58;
}
.shine-btn--settings {
color: rgba(236, 244, 255, 0.9);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.05), transparent 28%),
linear-gradient(180deg, rgba(12, 34, 78, 0.78), rgba(4, 10, 24, 0.82));
}
.shine-btn--settings::after {
opacity: 0.38;
}
.shine-btn:hover {
transform: translateY(-1px);
border-color: rgba(213, 225, 247, 0.42);
filter: brightness(1.06);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.18),
inset 0 -18px 30px rgba(0, 0, 0, 0.2),
0 17px 34px rgba(0, 0, 0, 0.42),
0 3px 12px rgba(40, 78, 137, 0.24);
}
.shine-btn:active {
transform: translateY(1px) scale(0.99);
box-shadow:
inset 0 2px 10px rgba(0, 0, 0, 0.28),
0 8px 18px rgba(0, 0, 0, 0.34);
}
.shine-btn:focus-visible,
.shine-local-demo-btn:focus-visible {
outline: 2px solid transparent;
outline-offset: 3px;
}
.shine-btn:disabled {
opacity: 0.45;
filter: none;
transform: none;
cursor: not-allowed;
}
.shine-local-demo-btn {
min-height: 32px;
padding: 5px 12px;
border: 0;
background: transparent;
color: rgba(162, 180, 215, 0.68);
font-size: 12px;
cursor: pointer;
}
.shine-local-demo-btn:hover {
color: rgba(216, 226, 247, 0.9);
}
@keyframes shine-logo-breathe {
0%, 100% {
filter:
drop-shadow(0 0 8px rgba(255, 211, 121, 0.62))
drop-shadow(0 8px 22px rgba(225, 158, 48, 0.34));
}
50% {
filter:
drop-shadow(0 0 14px rgba(255, 220, 147, 0.88))
drop-shadow(0 10px 28px rgba(225, 158, 48, 0.5));
}
}
@keyframes shine-halo-breathe {
0%, 100% { opacity: 0.66; transform: scale(0.96); }
50% { opacity: 1; transform: scale(1.05); }
}
@media (min-width: 768px) {
.shine-btn {
height: 60px;
font-size: 20px;
}
}
@media (max-height: 760px) {
.initial-splash__logo-wrap {
width: 206px;
}
.initial-splash__brand {
font-size: 40px;
}
.auth-screen--welcome {
gap: 10px;
}
.auth-logo-wrap {
width: 206px;
}
.auth-brand {
font-size: 40px;
margin-bottom: 2px;
}
.shine-actions {
gap: 10px;
}
.shine-btn {
height: 52px;
}
}
@media (prefers-reduced-motion: reduce) {
.initial-splash {
transition-duration: 1ms;
}
.initial-splash__logo,
.initial-splash__logo-wrap::before,
.auth-logo,
.auth-logo-wrap::before,
.shine-btn {
animation: none;
transition: none;
}
}
.login-actions-wide {
width: 100%;
}
/* Shared visual language for every screen before a user enters the app. */
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) {
--preauth-ivory: #f4ebdd;
--preauth-muted: #b7c4de;
--preauth-line: rgba(182, 201, 235, 0.24);
--preauth-card: rgba(9, 18, 37, 0.78);
padding: 18px 16px calc(28px + env(safe-area-inset-bottom));
overflow-x: hidden;
background:
radial-gradient(circle at 50% 18%, rgba(224, 172, 75, 0.08), transparent 26%),
radial-gradient(circle at 50% 67%, rgba(45, 81, 143, 0.06), transparent 38%),
linear-gradient(180deg, #040816 0%, #020611 54%, #01040c 100%);
color: var(--preauth-ivory);
font-family: "SF Pro Text", "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
overscroll-behavior: contain;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) > section.stack {
width: min(100%, 420px);
margin-inline: auto;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .page-header {
display: grid;
grid-template-columns: 42px minmax(0, 1fr) 42px;
align-items: center;
min-height: 42px;
margin-bottom: 18px;
gap: 8px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .page-title {
min-width: 0;
margin: 0;
color: var(--preauth-ivory);
font-size: 20px;
font-weight: 650;
letter-spacing: 0;
line-height: 1.2;
text-align: center;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .header-left,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .header-actions {
min-width: 0;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .header-actions {
justify-content: flex-end;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .header-left .icon-btn,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .header-actions .icon-btn {
display: grid;
place-items: center;
width: 40px;
min-width: 40px;
height: 40px;
min-height: 40px;
padding: 0;
border-radius: 12px;
border-color: var(--preauth-line);
background: rgba(12, 23, 46, 0.72);
color: var(--preauth-ivory);
font-size: 22px;
line-height: 1;
text-align: center;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-choice-screen {
align-content: start;
justify-items: stretch;
padding-top: 0;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-choice-screen .page-header {
margin-bottom: clamp(72px, 14vh, 132px);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-choice-screen .page-title {
display: none;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-choice-screen .header-left .icon-btn {
justify-self: start;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .card,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-panel {
border: 1px solid var(--preauth-line);
border-radius: 16px;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.055), transparent 24%),
var(--preauth-card);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.075),
0 16px 34px rgba(0, 0, 0, 0.24);
backdrop-filter: blur(16px) saturate(120%);
-webkit-backdrop-filter: blur(16px) saturate(120%);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .card {
padding: 18px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .card .card {
padding: 0;
border: 0;
background: transparent;
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-panel {
width: min(100%, 420px);
padding: 20px;
gap: 16px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-panel-title,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-faq-title,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .modal-title {
color: var(--preauth-ivory);
letter-spacing: 0;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-panel-title {
font-size: 24px;
font-weight: 650;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .field-label,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .auth-copy,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .status-line,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-word-number {
color: var(--preauth-muted);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .input,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .select {
min-height: 48px;
border-color: rgba(182, 201, 235, 0.22);
border-radius: 12px;
background: rgba(4, 11, 25, 0.64);
color: var(--preauth-ivory);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .input:focus,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .select:focus {
border-color: transparent;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .auth-footer-actions {
grid-template-columns: minmax(0, 1fr);
width: min(100%, 420px);
margin-inline: auto;
gap: 10px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .primary-btn,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .secondary-btn,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .ghost-btn,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .link-card {
min-height: 50px;
border-radius: 14px;
color: var(--preauth-ivory);
font-family: inherit;
font-weight: 600;
letter-spacing: 0;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .primary-btn {
border-color: transparent;
background:
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));
box-shadow: inset 0 1px 0 rgba(255, 246, 216, 0.26), 0 10px 24px rgba(0, 0, 0, 0.28);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .secondary-btn,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .ghost-btn,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .link-card {
border-color: var(--preauth-line);
background: linear-gradient(180deg, rgba(24, 43, 79, 0.84), rgba(8, 17, 35, 0.86));
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 8px 18px rgba(0, 0, 0, 0.18);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .primary-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)) .link-card:hover {
border-color: transparent;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .preauth-local-demo-btn {
min-height: 44px;
border-style: dashed;
color: #c8d7f2;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-toggle,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .session-item {
border-color: var(--preauth-line);
background: rgba(9, 19, 38, 0.58);
color: var(--preauth-ivory);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-progress {
border-color: transparent;
background: rgba(3, 9, 21, 0.62);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-progress-bar {
background: linear-gradient(90deg, #b27c38, #f1cd80);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .camera-shell {
min-height: min(48dvh, 360px);
border-radius: 16px;
border-color: var(--preauth-line);
background: #050b18;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .camera-video {
min-height: min(48dvh, 360px);
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-screen {
gap: 12px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-form {
gap: 14px;
padding: 16px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-form .field-label {
font-size: 14px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-password-single {
gap: 6px;
}
.password-length-hint {
margin: 0;
color: rgba(183, 196, 222, 0.76);
font-size: 12px;
line-height: 1.3;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .registration-toggle {
min-height: 48px;
padding: 10px 12px;
border-radius: 12px;
font-size: 15px;
}
.registration-login-status {
margin: 0;
font-size: 13px;
}
.registration-faq-link {
justify-self: center;
min-height: 30px;
padding: 4px 8px;
border: 0;
background: transparent;
color: rgba(204, 218, 245, 0.72);
font: inherit;
font-size: 13px;
cursor: pointer;
}
.registration-faq-link:hover,
.registration-faq-link:focus-visible {
color: #f0d69b;
}
@media (max-width: 360px) {
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) {
padding-inline: 12px;
}
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .card,
.screen-content.preauth-flow:not(:has(> .auth-screen--welcome)) .login-panel {
padding: 16px;
}
}
.login-panel {
width: min(100%, 360px);
gap: 14px;
}
.login-panel--wide {
width: min(100%, 420px);
}
.login-panel-title {
font-size: 28px;
font-weight: 700;
color: var(--text);
text-align: center;
}
.auth-footer-actions {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.auth-copy {
line-height: 1.45;
color: #d8e3ff;
}
.auth-status-card {
width: min(100%, 320px);
color: #d8e3ff;
}
.field-label {
color: #b2c2e6;
font-size: 13px;
}
.select {
width: 100%;
border: 1px solid var(--line);
border-radius: 12px;
background: rgba(255, 255, 255, 0.04);
min-height: 44px;
padding: 0 12px;
color: var(--text);
}
.select:focus {
outline: none;
border-color: rgba(83, 216, 251, 0.55);
box-shadow: 0 0 0 3px rgba(83, 216, 251, 0.12);
}
.wrap-row {
flex-wrap: wrap;
}
.status-line {
font-size: 13px;
color: var(--text-muted);
}
.status-line.is-available {
color: #8ef0a8;
}
.status-line.is-unavailable {
color: #ff8d97;
}
.server-check-btn.is-available {
border-color: rgba(132, 244, 161, 0.42);
background: rgba(132, 244, 161, 0.12);
color: #d7ffe3;
}
.server-check-btn.is-unavailable {
border-color: rgba(255, 113, 143, 0.42);
background: rgba(255, 113, 143, 0.12);
color: #ffd7df;
}
.help-fab,
.square-btn {
width: 42px;
height: 42px;
border: 1px solid var(--line);
border-radius: 12px;
background: var(--card-soft);
color: var(--text);
cursor: pointer;
}
.help-fab {
position: fixed;
right: max(20px, calc((100vw - min(100vw, 430px)) / 2 + 20px));
bottom: calc(20px + env(safe-area-inset-bottom));
z-index: 12;
}
.inline-input-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 8px;
align-items: center;
}
.link-card {
display: block;
padding: 14px;
border-radius: var(--radius-md);
background: rgba(83, 216, 251, 0.08);
border: 1px solid rgba(83, 216, 251, 0.22);
color: #d9f8ff;
}
.qr-card {
justify-items: center;
}
.qr-code {
width: min(220px, 100%);
aspect-ratio: 1;
fill: #eff5ff;
background: #111723;
border-radius: 22px;
padding: 18px;
}
.camera-shell {
position: relative;
min-height: 380px;
border-radius: var(--radius-lg);
overflow: hidden;
background: #09101a;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.camera-video {
width: 100%;
height: 100%;
min-height: 380px;
object-fit: cover;
display: block;
}
.camera-frame {
position: absolute;
inset: 70px 40px 110px;
border: 3px solid rgba(83, 216, 251, 0.85);
border-radius: 24px;
box-shadow: 0 0 0 999px rgba(5, 9, 16, 0.38);
}
.camera-hint,
.camera-error {
position: absolute;
left: 16px;
right: 16px;
text-align: center;
padding: 10px 12px;
border-radius: 12px;
background: rgba(10, 14, 23, 0.78);
}
.camera-hint {
bottom: 18px;
}
.camera-error {
top: 18px;
color: #ffd7df;
}
.camera-placeholder {
width: 100%;
min-height: 380px;
display: grid;
place-items: center;
color: #c8d6f9;
background:
radial-gradient(circle at 20% 10%, rgba(83, 216, 251, 0.16), transparent 48%),
linear-gradient(180deg, #0a1220, #070d17);
}
.checkbox-row {
display: flex;
align-items: center;
gap: 10px;
}
.key-storage-option {
gap: 6px;
}
.key-storage-option__description {
margin: 0;
}
.key-storage-note {
margin: 0;
line-height: 1.45;
}
.key-storage-note--strong {
font-size: 17px;
font-weight: 700;
color: #eef4ff;
}
.key-card {
padding: 12px;
border-radius: var(--radius-md);
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
}
.list-item {
display: grid;
grid-template-columns: 44px 1fr auto;
gap: 10px;
align-items: center;
padding: 11px;
border-radius: var(--radius-md);
border: 1px solid rgba(255, 255, 255, 0.06);
background: rgba(255, 255, 255, 0.02);
cursor: pointer;
}
.avatar {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
flex: 0 0 auto;
aspect-ratio: 1 / 1;
border-radius: 50%;
background: linear-gradient(130deg, #3c4f73, #243352);
display: grid;
place-items: center;
font-weight: 700;
color: #e5ebff;
font-size: 14px;
}
.avatar.avatar-xs,
.avatar.xs {
width: 20px;
height: 20px;
min-width: 20px;
min-height: 20px;
font-size: 9px;
}
.avatar.avatar-sm,
.avatar.small {
width: 28px;
height: 28px;
min-width: 28px;
min-height: 28px;
font-size: 10px;
}
.avatar.avatar-md,
.avatar.medium {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
font-size: 14px;
}
.avatar.avatar-lg,
.avatar.big {
width: 56px;
height: 56px;
min-width: 56px;
min-height: 56px;
font-size: 18px;
}
.avatar.avatar-xl,
.avatar.large,
.avatar.xlarge {
width: 96px;
height: 96px;
min-width: 96px;
min-height: 96px;
font-size: 26px;
}
.avatar-image {
position: relative;
overflow: hidden;
display: grid;
place-items: center;
}
.avatar-image > .avatar-fallback,
.avatar-image > img {
grid-area: 1 / 1;
}
.avatar-fallback {
width: 100%;
height: 100%;
display: grid;
place-items: center;
opacity: 1;
transition: opacity 120ms ease;
}
.avatar-image img,
.profile-avatar img,
.node-dot img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
border-radius: 50%;
display: block;
opacity: 0;
transition: opacity 120ms ease;
}
.avatar-image.has-image img {
opacity: 1;
}
.avatar-image.has-image .avatar-fallback {
opacity: 0;
visibility: hidden;
}
.meta-muted {
color: var(--text-muted);
font-size: 13px;
}
.registration-finish-card {
width: 100%;
max-width: 100%;
overflow: hidden;
}
.registration-finish-title {
margin: 0;
font-size: clamp(1.7rem, 6vw, 2.15rem);
line-height: 1.18;
text-wrap: balance;
}
.registration-finish-text,
.registration-finish-tx,
.registration-finish-progress {
max-width: 100%;
overflow-wrap: anywhere;
word-break: break-word;
}
.registration-finish-tx-link {
color: #9fd8ff;
text-decoration: underline;
overflow-wrap: anywhere;
word-break: break-all;
}
.registration-finish-tx-link:hover,
.registration-finish-tx-link:focus-visible {
color: #c9ebff;
}
.session-status {
color: var(--text-muted);
font-size: 13px;
}
.session-status--online {
color: #3dbb72;
}
.unread {
min-width: 20px;
height: 20px;
border-radius: 999px;
display: grid;
place-items: center;
background: var(--accent);
color: #08212a;
font-size: 12px;
font-weight: 700;
padding: 0 6px;
}
.toolbar {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px;
padding: 4px 4px 2px;
background: rgba(20, 28, 44, 0.95);
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 16px;
backdrop-filter: blur(8px);
}
.toolbar-btn {
border: 0;
border-radius: 12px;
background: transparent;
color: var(--text-muted);
padding: 4px 3px 2px;
cursor: pointer;
display: grid;
justify-items: center;
gap: 2px;
font-size: 11px;
align-content: end;
min-height: 48px;
}
.toolbar-label-wrap {
display: grid;
justify-items: center;
line-height: 1.05;
}
.toolbar-btn-profile {
position: relative;
}
.toolbar-btn-messages {
position: relative;
}
.toolbar-unread-badge {
position: absolute;
top: 2px;
right: 6px;
min-width: 16px;
height: 16px;
border-radius: 999px;
padding: 0 5px;
display: inline-flex;
align-items: center;
justify-content: center;
background: #f07f8a;
color: #fff2f4;
border: 1px solid rgba(255, 222, 227, 0.55);
box-shadow: 0 4px 10px rgba(152, 36, 52, 0.35);
font-size: 10px;
font-weight: 700;
line-height: 1;
pointer-events: none;
}
.toolbar-btn-profile .toolbar-label-wrap {
padding-bottom: 0;
}
.toolbar-btn-profile .toolbar-connection-indicator {
display: none;
}
.toolbar-connection-indicator {
position: absolute;
left: 50%;
bottom: 0;
transform: translateX(-50%);
display: inline-flex;
align-items: center;
gap: 3px;
min-height: 9px;
}
.toolbar-connection-text {
display: none;
font-size: 8px;
letter-spacing: 0.02em;
text-transform: lowercase;
color: rgba(191, 213, 255, 0.8);
opacity: 0;
transition: opacity 0.2s ease;
}
.toolbar-connection-dot {
width: 7px;
height: 7px;
border-radius: 999px;
background: rgba(148, 162, 195, 0.65);
box-shadow: 0 0 0 2px rgba(97, 116, 156, 0.25);
transition: 0.2s ease;
}
.toolbar-connection-indicator.is-connected .toolbar-connection-text {
opacity: 1;
color: rgba(145, 255, 192, 0.9);
}
.toolbar-connection-indicator.is-connected .toolbar-connection-dot {
background: #71e9a5;
box-shadow: 0 0 0 2px rgba(72, 201, 134, 0.28);
}
.toolbar-connection-indicator.is-connecting .toolbar-connection-dot {
background: #f0c56b;
}
.toolbar-connection-indicator.is-disconnected .toolbar-connection-dot {
background: #e48792;
box-shadow: 0 0 0 2px rgba(228, 135, 146, 0.24);
}
.toolbar-btn.active {
background: rgba(83, 216, 251, 0.14);
color: var(--text);
}
.page-label {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
border-radius: 10px;
padding: 8px 10px;
color: #c5d2f4;
background: rgba(17, 24, 39, 0.9);
border: 1px solid rgba(255, 255, 255, 0.08);
}
.page-label.is-collapsed {
width: fit-content;
padding: 6px;
}
.page-label-content {
min-width: 0;
}
.page-label-hint {
margin-bottom: 3px;
color: #8ea2cd;
font-size: 10px;
line-height: 1;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.page-label-caption {
font-size: 12px;
line-height: 1.2;
}
.page-label-toggle {
width: 16px;
height: 16px;
flex: 0 0 16px;
border: 1px solid rgba(255, 255, 255, 0.16);
border-radius: 4px;
background: rgba(255, 255, 255, 0.06);
cursor: pointer;
}
.page-label-toggle:hover {
border-color: rgba(83, 216, 251, 0.5);
background: rgba(83, 216, 251, 0.16);
}
.chat-wrap {
display: grid;
grid-template-rows: 1fr auto;
gap: 10px;
min-height: calc(100dvh - 210px);
}
.messages-log {
display: grid;
gap: 8px;
align-content: start;
}
.chat-unread-separator {
display: flex;
align-items: center;
gap: 10px;
margin: 8px 0;
color: #9ab0de;
font-size: 12px;
}
.chat-unread-separator::before,
.chat-unread-separator::after {
content: '';
flex: 1 1 auto;
height: 1px;
background: linear-gradient(90deg, rgba(126, 150, 199, 0.12), rgba(126, 150, 199, 0.45), rgba(126, 150, 199, 0.12));
}
.chat-unread-separator > span {
white-space: nowrap;
}
.bubble {
max-width: 76%;
padding: 10px 12px;
border-radius: 14px;
font-size: 14px;
line-height: 1.35;
}
.bubble-text {
white-space: pre-wrap;
word-break: break-word;
}
.bubble-reply-preview {
display: block;
width: 100%;
margin: 0 0 8px;
padding: 8px 10px;
border: 1px solid rgba(142, 173, 232, 0.22);
border-radius: 10px;
background: rgba(11, 22, 41, 0.34);
text-align: left;
color: inherit;
cursor: pointer;
}
.bubble-reply-preview-author {
font-size: 12px;
font-weight: 700;
color: rgba(250, 221, 155, 0.94);
}
.bubble-reply-preview-text {
margin-top: 3px;
font-size: 12px;
line-height: 1.3;
color: rgba(223, 233, 250, 0.86);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.bubble-meta {
margin-top: 0;
display: flex;
justify-content: flex-end;
align-items: center;
gap: 5px;
font-size: 9px;
line-height: 1.1;
color: rgba(198, 214, 247, 0.78);
}
.bubble-meta-edited {
margin-top: 3px;
justify-content: flex-end;
color: rgba(235, 208, 137, 0.88);
}
.bubble-time {
letter-spacing: 0.01em;
}
.bubble-status {
min-width: 14px;
text-align: right;
color: rgba(148, 163, 184, 0.92);
}
.bubble-status--delivered,
.bubble-status--read {
color: rgba(215, 230, 255, 0.96);
text-shadow: 0 0 6px rgba(126, 180, 255, 0.36);
}
.bubble-status--failed {
color: rgba(255, 145, 145, 0.96);
}
.bubble-delivery-note {
max-width: 280px;
margin-top: 6px;
font-size: 10px;
line-height: 1.3;
color: rgba(255, 220, 142, 0.92);
}
.bubble-delivery-note--failed {
color: rgba(255, 145, 145, 0.96);
}
.bubble.in {
justify-self: start;
background: #1f2c46;
border-top-left-radius: 6px;
}
.bubble.out {
justify-self: end;
background: #273f63;
border-top-right-radius: 6px;
}
.bubble.call-tech {
max-width: 90%;
justify-self: center;
border-radius: 16px;
border: 1px solid rgba(132, 170, 231, 0.28);
background: rgba(24, 36, 58, 0.72);
color: #dce8ff;
font-size: 12px;
padding: 12px 14px;
}
.bubble-call-card {
display: grid;
min-width: min(280px, 72vw);
}
.bubble-call-head {
display: inline-flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.bubble-call-icon {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
color: #d9ecff;
flex: 0 0 auto;
}
.bubble-call-icon-phone {
font-size: 28px;
line-height: 1;
transform: translateY(-1px);
}
.bubble-call-icon-arrow {
position: absolute;
right: 4px;
bottom: 3px;
font-size: 10px;
line-height: 1;
font-weight: 700;
}
.bubble-call-icon--incoming .bubble-call-icon-arrow {
color: rgba(167, 225, 255, 0.98);
}
.bubble-call-icon--outgoing .bubble-call-icon-arrow {
color: rgba(255, 214, 132, 0.98);
}
.bubble-call-title {
font-size: 14px;
font-weight: 700;
color: #eef6ff;
line-height: 1.2;
}
.bubble-call-line {
font-size: 12px;
line-height: 1.2;
margin-left: 2px;
}
.bubble-call-line--success {
color: #7ee19e;
}
.bubble-call-line--plain {
color: rgba(230, 240, 255, 0.94);
}
.chat-input {
display: grid;
grid-template-columns: 1fr auto;
gap: 8px;
}
.call-overlay[hidden] {
display: none;
}
.call-ui-root[hidden] {
display: none;
}
.call-ui-root {
position: absolute;
inset: 0;
z-index: 80;
pointer-events: none;
}
.call-minimized-bar {
position: absolute;
top: 0;
left: 0;
right: 0;
display: flex;
align-items: center;
gap: 10px;
min-height: 44px;
padding: calc(8px + env(safe-area-inset-top)) 14px 8px;
border-bottom: 1px solid rgba(159, 255, 196, 0.28);
background: linear-gradient(180deg, rgba(30, 138, 79, 0.98), rgba(18, 106, 60, 0.98));
box-shadow: 0 10px 24px rgba(5, 30, 16, 0.28);
pointer-events: auto;
}
.call-minimized-bar-text {
flex: 1 1 auto;
min-width: 0;
border: 0;
background: transparent;
color: #f3fff8;
font-size: 13px;
font-weight: 700;
line-height: 1.2;
text-align: left;
padding: 0;
cursor: pointer;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.call-minimized-bar-actions {
display: flex;
align-items: center;
gap: 8px;
flex: 0 0 auto;
}
.call-icon-btn {
width: 40px;
min-width: 40px;
height: 40px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 12px;
border: 1px solid rgba(132, 162, 228, 0.42);
background: linear-gradient(180deg, rgba(19, 35, 63, 0.9), rgba(14, 26, 50, 0.95));
color: #e7efff;
cursor: pointer;
transition: 0.2s ease;
}
.call-icon-btn:hover {
transform: translateY(-1px);
}
.call-icon-btn:disabled {
opacity: 1;
color: #93a6cc;
background: linear-gradient(180deg, rgba(18, 30, 54, 0.8), rgba(11, 20, 39, 0.86));
border-color: rgba(124, 145, 189, 0.28);
box-shadow: none;
cursor: not-allowed;
transform: none;
}
.call-icon-btn svg {
width: 20px;
height: 20px;
}
.call-icon-btn--secondary {
border-color: rgba(132, 162, 228, 0.42);
background: linear-gradient(180deg, rgba(19, 35, 63, 0.9), rgba(14, 26, 50, 0.95));
color: #e7efff;
}
.call-icon-btn--secondary:hover {
border-color: rgba(167, 195, 255, 0.76);
}
.call-icon-btn--danger {
border-color: rgba(255, 129, 147, 0.52);
background: linear-gradient(120deg, rgba(188, 42, 65, 0.96), rgba(142, 28, 47, 0.98));
color: #fff2f5;
}
.call-icon-btn--danger:hover {
border-color: rgba(255, 163, 176, 0.82);
}
.call-icon-btn--bar {
width: 34px;
min-width: 34px;
height: 34px;
border-radius: 10px;
}
.call-icon-btn--bar svg {
width: 18px;
height: 18px;
}
.call-overlay {
position: absolute;
inset: 0;
background: rgba(4, 8, 16, 0.88);
backdrop-filter: blur(8px);
pointer-events: auto;
}
.call-overlay-panel {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
background:
radial-gradient(circle at 50% 18%, rgba(79, 124, 208, 0.24), transparent 34%),
linear-gradient(180deg, rgba(11, 20, 38, 0.98), rgba(3, 7, 15, 1));
}
.call-overlay-panel--remote-video {
background: #010203;
}
.call-overlay-head {
position: absolute;
top: calc(12px + env(safe-area-inset-top));
left: 14px;
right: 14px;
z-index: 4;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
pointer-events: none;
}
.call-overlay-title {
margin: 0;
min-height: 22px;
font-size: 14px;
font-weight: 700;
color: rgba(236, 242, 255, 0.94);
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.44);
}
.call-overlay-minimize-btn {
flex: 0 0 auto;
pointer-events: auto;
}
.call-overlay-status {
position: absolute;
left: 18px;
right: 18px;
bottom: calc(12px + env(safe-area-inset-bottom));
z-index: 4;
text-align: center;
color: rgba(207, 219, 246, 0.84);
font-size: 13px;
pointer-events: none;
}
.call-video-stage {
position: absolute;
inset: 0;
overflow: hidden;
background:
radial-gradient(circle at 50% 24%, rgba(54, 88, 151, 0.48), transparent 30%),
linear-gradient(180deg, rgba(9, 17, 32, 0.98), rgba(2, 5, 12, 1));
}
.call-video-stage--remote-video {
background: #000;
}
.call-remote-video,
.call-local-video {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
background: #02050a;
}
.call-remote-video[hidden],
.call-local-preview[hidden],
.call-hero[hidden] {
display: none !important;
}
.call-hero {
position: absolute;
left: 0;
right: 0;
top: clamp(8vh, 16vh, 19vh);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 14px;
padding: 0 24px;
text-align: center;
z-index: 2;
}
.call-peer-avatar-slot {
width: min(42vw, 168px);
height: min(42vw, 168px);
display: grid;
place-items: center;
}
.call-peer-avatar-slot .call-peer-avatar {
width: 100%;
height: 100%;
min-width: 100%;
min-height: 100%;
border-radius: 999px;
border: 2px solid rgba(221, 233, 255, 0.2);
background: linear-gradient(180deg, rgba(18, 31, 58, 0.96), rgba(9, 15, 29, 0.98));
box-shadow: 0 24px 48px rgba(0, 0, 0, 0.34);
}
.call-peer-avatar-slot .call-peer-avatar.call-peer-avatar--empty {
border-color: rgba(221, 233, 255, 0.28);
background: radial-gradient(circle at 35% 30%, rgba(68, 92, 136, 0.68), rgba(15, 24, 43, 0.98));
}
.call-peer-avatar-slot .call-peer-avatar .avatar-fallback {
font-size: clamp(28px, 7.2vw, 46px);
font-weight: 800;
}
.call-peer-avatar-slot .call-peer-avatar.call-peer-avatar--empty .avatar-fallback {
display: none;
}
.call-peer-login {
max-width: 86vw;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #f4f8ff;
font-size: clamp(20px, 5.8vw, 28px);
font-weight: 700;
letter-spacing: 0.02em;
}
.call-kind {
color: #ffffff;
font-size: clamp(27px, 8vw, 40px);
font-weight: 800;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.call-hero-status {
max-width: 88vw;
color: rgba(211, 223, 246, 0.9);
font-size: 14px;
line-height: 1.35;
}
.call-local-preview {
position: absolute;
right: 16px;
bottom: calc(18px + env(safe-area-inset-bottom));
z-index: 4;
width: min(30vw, 130px);
aspect-ratio: 3 / 4;
border-radius: 14px;
overflow: hidden;
border: 1px solid rgba(176, 205, 255, 0.38);
background: rgba(7, 12, 22, 0.94);
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.32);
cursor: grab;
touch-action: none;
user-select: none;
}
.call-local-preview:active {
cursor: grabbing;
}
.call-overlay-controls {
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: calc(env(safe-area-inset-bottom) + clamp(54px, 16vh, 112px));
display: flex;
flex-wrap: nowrap;
gap: 18px;
align-items: center;
justify-content: center;
width: min(92vw, 520px);
z-index: 4;
}
.call-overlay-controls[hidden],
.call-overlay-controls--incoming[hidden],
.call-overlay-controls--active[hidden],
.call-icon-btn[hidden],
.call-accept-btn[hidden],
.call-decline-btn[hidden],
.call-minimized-bar-actions[hidden] {
display: none !important;
}
.call-overlay-controls--incoming {
justify-content: center;
}
.call-overlay-controls--active {
justify-content: center;
}
.call-overlay .call-icon-btn {
background: rgba(4, 9, 18, 0.18);
border-width: 1.5px;
backdrop-filter: blur(3px);
box-shadow: none;
}
.call-overlay .call-icon-btn--secondary {
border-color: rgba(229, 237, 255, 0.64);
background: rgba(4, 9, 18, 0.12);
color: rgba(244, 248, 255, 0.96);
}
.call-overlay .call-icon-btn--secondary:hover {
border-color: rgba(255, 255, 255, 0.96);
background: rgba(10, 20, 36, 0.22);
}
.call-overlay .call-icon-btn--danger {
border-color: rgba(255, 98, 123, 0.92);
background: rgba(60, 8, 18, 0.12);
color: #ff5b76;
}
.call-overlay .call-icon-btn--danger:hover {
border-color: rgba(255, 131, 150, 0.98);
background: rgba(82, 10, 24, 0.2);
color: #ff788d;
}
.call-decline-btn {
min-width: 132px;
}
.call-accept-btn {
border: 1px solid rgba(122, 230, 166, 0.64);
border-radius: var(--radius-sm);
background: linear-gradient(120deg, rgba(98, 210, 146, 0.95), rgba(61, 164, 108, 0.94));
color: #052113;
padding: 9px 12px;
min-height: 38px;
min-width: 132px;
font-weight: 700;
cursor: pointer;
transition: 0.2s ease;
}
.call-accept-btn:hover {
border-color: rgba(156, 246, 194, 0.88);
transform: translateY(-1px);
}
.call-accept-btn:disabled {
opacity: 1;
color: #93a6cc;
background: linear-gradient(180deg, rgba(18, 30, 54, 0.8), rgba(11, 20, 39, 0.86));
border-color: rgba(124, 145, 189, 0.28);
box-shadow: none;
cursor: not-allowed;
transform: none;
}
@media (max-width: 420px) {
.call-overlay-controls {
gap: 16px;
bottom: calc(env(safe-area-inset-bottom) + clamp(48px, 14vh, 96px));
}
.call-icon-btn {
width: 46px;
min-width: 46px;
height: 46px;
border-radius: 14px;
}
.call-icon-btn svg {
width: 22px;
height: 22px;
}
.call-accept-btn,
.call-decline-btn {
min-width: 124px;
}
}
.pwa-diag-list {
gap: 8px;
}
.pwa-diag-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto 10px;
align-items: center;
gap: 8px;
padding: 8px 10px;
border-radius: 10px;
border: 1px solid rgba(143, 167, 215, 0.18);
background: rgba(14, 24, 45, 0.42);
}
.pwa-diag-key {
color: #cdd9f2;
font-size: 13px;
}
.pwa-diag-value {
color: #edf3ff;
font-size: 13px;
text-align: right;
word-break: break-word;
}
.pwa-diag-indicator {
width: 10px;
height: 10px;
border-radius: 50%;
background: #64708a;
}
.pwa-diag-indicator.is-ok {
background: #66d69a;
box-shadow: 0 0 0 3px rgba(102, 214, 154, 0.18);
}
.pwa-diag-indicator.is-warn {
background: #f0c56b;
}
.pwa-diag-indicator.is-bad {
background: #e48792;
box-shadow: 0 0 0 3px rgba(228, 135, 146, 0.18);
}
.pwa-diag-indicator.is-neutral {
background: #8994ab;
}
.pwa-diag-actions {
display: grid;
grid-template-columns: 1fr;
gap: 8px;
}
.pwa-diag-recommendations {
gap: 6px;
}
.pwa-diag-json {
margin: 0;
max-height: 260px;
overflow: auto;
border-radius: 10px;
padding: 10px;
font-size: 12px;
line-height: 1.35;
color: #dfe9ff;
background: rgba(8, 15, 28, 0.82);
border: 1px solid rgba(134, 157, 205, 0.2);
}
.settings-developer-card {
margin-top: 4px;
}
.settings-developer-panel {
margin-top: 2px;
padding-top: 8px;
border-top: 1px solid rgba(132, 157, 206, 0.22);
}
.settings-dev-avatar-modal-card {
max-width: 520px;
}
.settings-dev-avatar-meta {
min-height: 18px;
font-size: 13px;
color: #d9e7ff;
}
.settings-dev-avatar-error {
min-height: 18px;
color: #f0a9b3;
}
.settings-dev-avatar-result {
gap: 8px;
}
.contact-search-actions {
display: grid;
grid-template-columns: 1fr;
gap: 8px;
}
.contact-search-form-card,
.contact-search-results-card {
margin: 0 6px;
padding: 14px;
border-radius: 24px;
background: rgba(7, 10, 18, 0.88);
border: 1px solid rgba(140, 99, 255, 0.24);
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.34);
}
.contact-search-input {
min-height: 48px;
border-radius: 16px;
padding: 0 14px;
}
.contact-search-results-title {
font-size: 14px;
font-weight: 700;
color: rgba(252, 234, 192, 0.92);
text-align: center;
}
.contact-search-result-main {
min-width: 0;
display: flex;
align-items: center;
}
.input {
border: 1px solid var(--line);
border-radius: 12px;
background: rgba(255, 255, 255, 0.04);
min-height: 40px;
padding: 0 12px;
width: 100%;
outline: none;
color: #f3f7ff;
font-size: 16px;
line-height: 1.4;
caret-color: #f1d18a;
-webkit-text-fill-color: #f3f7ff;
}
.input:focus {
border-color: rgba(83, 216, 251, 0.55);
box-shadow: 0 0 0 3px rgba(83, 216, 251, 0.12);
}
.input::placeholder {
color: rgba(190, 206, 238, 0.82);
}
input.input:-webkit-autofill,
input.input:-webkit-autofill:hover,
input.input:-webkit-autofill:focus,
textarea.input:-webkit-autofill,
textarea.input:-webkit-autofill:hover,
textarea.input:-webkit-autofill:focus {
-webkit-text-fill-color: #f3f7ff !important;
caret-color: #f1d18a;
border-color: var(--line);
box-shadow: 0 0 0 1000px rgba(11, 24, 46, 0.96) inset !important;
transition: background-color 9999s ease-out 0s;
}
textarea.input {
padding: 10px 12px;
min-height: 92px;
resize: vertical;
}
.modal-title {
font-size: 19px;
line-height: 1.2;
color: #f1d69a;
}
.inline-error {
min-height: 18px;
}
.form-actions-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.attachment-trigger-btn {
justify-self: start;
min-width: 3.25rem;
padding-inline: 0.8rem;
}
.draft-attachments {
display: flex;
flex-wrap: wrap;
gap: 0.45rem;
}
.draft-attachment-chip {
border: 1px solid rgba(30, 64, 175, 0.2);
border-radius: 999px;
background: rgba(219, 234, 254, 0.92);
color: #1e3a8a;
cursor: pointer;
font-size: 0.82rem;
max-width: 100%;
overflow: hidden;
padding: 0.4rem 0.65rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.message-attachments {
display: grid;
gap: 0.5rem;
}
.message-attachment-carousel {
gap: 0.35rem;
margin: 0.5rem 0 0.4rem;
max-width: min(100%, 34rem);
}
.message-attachment-carousel-viewport {
align-items: center;
background: linear-gradient(135deg, rgba(15, 23, 42, 0.05), rgba(20, 184, 166, 0.08));
border: 1px solid rgba(15, 23, 42, 0.1);
border-radius: 1.15rem;
display: grid;
min-height: 12rem;
overflow: hidden;
position: relative;
touch-action: pan-y;
}
.message-attachment-carousel-viewport.has-landscape-media {
align-items: start;
min-height: 0;
}
.message-attachment-slide {
align-items: stretch;
display: grid;
min-height: 12rem;
}
.message-attachment-slide.has-landscape-media {
min-height: 0;
}
.message-attachment-arrow {
align-items: center;
background: rgba(15, 23, 42, 0.62);
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 999px;
color: #fff;
cursor: pointer;
display: inline-flex;
font-size: 1.85rem;
height: 2.35rem;
justify-content: center;
line-height: 1;
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 2.35rem;
z-index: 2;
}
.message-attachment-arrow[hidden] {
display: none;
}
.message-attachment-arrow:disabled {
cursor: default;
opacity: 0.28;
}
.message-attachment-arrow--prev {
left: 0.55rem;
}
.message-attachment-arrow--next {
right: 0.55rem;
}
.message-attachment-counter {
color: #64748b;
font-size: 0.78rem;
text-align: center;
}
.message-attachment-media-frame {
align-items: center;
background: #0f172a;
cursor: zoom-in;
display: grid;
min-height: 12rem;
overflow: hidden;
position: relative;
}
.message-attachment-media-frame.is-landscape {
min-height: 0;
}
.message-attachment-media {
display: block;
height: min(52vh, 20rem);
max-height: 20rem;
object-fit: contain;
width: 100%;
}
.message-attachment-media.is-landscape {
height: auto;
}
.message-attachment-play {
align-items: center;
background: rgba(15, 23, 42, 0.72);
border: 1px solid rgba(255, 255, 255, 0.25);
border-radius: 999px;
color: #fff;
display: inline-flex;
font-size: 1.7rem;
height: 4rem;
justify-content: center;
left: 50%;
padding-left: 0.18rem;
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
width: 4rem;
}
.message-attachment-download {
background: rgba(20, 184, 166, 0.95);
border-radius: 999px;
color: #fff;
font-size: 0.82rem;
font-weight: 700;
padding: 0.45rem 0.75rem;
position: relative;
text-decoration: none;
width: max-content;
z-index: 3;
}
.message-attachment-media-frame > .message-attachment-download {
bottom: 0.75rem;
position: absolute;
right: 0.75rem;
}
.message-attachment-file-card {
align-items: center;
background: linear-gradient(135deg, rgba(15, 23, 42, 0.94), rgba(30, 41, 59, 0.94));
border: 1px solid rgba(20, 184, 166, 0.28);
border-radius: 0.8rem;
color: #f8fafc;
cursor: pointer;
display: grid;
gap: 0.55rem;
grid-template-columns: auto minmax(0, 1fr);
min-height: 3.25rem;
padding: 0.55rem 0.7rem;
}
.message-attachment-file-ext {
align-items: center;
background: rgba(20, 184, 166, 0.95);
border-radius: 999px;
color: #fff;
display: inline-flex;
font-size: 0.72rem;
font-weight: 800;
height: 1.7rem;
justify-content: center;
min-width: 3.25rem;
padding: 0 0.55rem;
}
.message-attachment-file-main {
display: grid;
gap: 0.08rem;
min-width: 0;
}
.message-attachment-file-main .message-attachment-meta {
color: #cbd5e1;
}
.message-attachment-unavailable {
align-items: center;
background: linear-gradient(135deg, rgba(254, 242, 242, 0.96), rgba(255, 247, 237, 0.96));
color: #7f1d1d;
display: flex;
font-weight: 700;
justify-content: center;
min-height: 12rem;
padding: 1.25rem;
text-align: center;
}
.message-attachment-card {
align-items: center;
background: linear-gradient(135deg, rgba(240, 253, 250, 0.95), rgba(239, 246, 255, 0.95));
border: 1px solid rgba(20, 184, 166, 0.25);
border-radius: 1rem;
color: #0f172a;
display: flex;
gap: 0.7rem;
padding: 0.75rem 0.85rem;
text-decoration: none;
}
.message-attachment-icon {
align-items: center;
background: #0f766e;
border-radius: 0.8rem;
color: #fff;
display: inline-flex;
flex: 0 0 auto;
height: 2.1rem;
justify-content: center;
width: 2.1rem;
}
.message-attachment-main {
display: grid;
min-width: 0;
}
.message-attachment-name {
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.message-attachment-meta {
color: #64748b;
font-size: 0.78rem;
overflow-wrap: anywhere;
}
.attachment-viewer-modal {
z-index: 80;
}
.attachment-viewer-card {
background: rgba(15, 23, 42, 0.96);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 1.2rem;
box-shadow: 0 24px 90px rgba(0, 0, 0, 0.45);
color: #fff;
display: grid;
gap: 0.8rem;
max-height: 92vh;
max-width: min(94vw, 68rem);
padding: 0.9rem;
width: 100%;
}
.attachment-viewer-head,
.attachment-viewer-actions {
align-items: center;
display: flex;
gap: 0.8rem;
justify-content: space-between;
}
.attachment-viewer-title {
font-weight: 800;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.attachment-viewer-body {
align-items: center;
display: grid;
justify-items: center;
min-height: 12rem;
}
.attachment-viewer-media {
background: #020617;
border-radius: 0.8rem;
max-height: 76vh;
max-width: 100%;
object-fit: contain;
}
@media (max-width: 640px) {
.message-attachment-carousel {
max-width: 100%;
}
.message-attachment-carousel-viewport,
.message-attachment-slide,
.message-attachment-media-frame,
.message-attachment-unavailable {
min-height: 10rem;
}
.message-attachment-media {
height: min(42vh, 16rem);
}
.message-attachment-file-card {
grid-template-columns: auto minmax(0, 1fr);
}
.message-attachment-file-card .message-attachment-download {
grid-column: 1 / -1;
}
}
.ar-attachment-manager-card {
max-width: min(92vw, 34rem);
}
.ar-attachment-manager-card--wide {
max-width: min(96vw, 58rem);
}
.ar-attachment-meta {
color: #cbd5e1;
display: grid;
font-size: 0.86rem;
gap: 0.25rem;
overflow-wrap: anywhere;
}
.ar-attachment-wallet-select,
.ar-attachment-wallet-select option {
color: #38bdf8;
}
.ar-attachment-history-table-wrap {
max-height: 55vh;
overflow: auto;
}
.ar-attachment-history-table {
border-collapse: collapse;
font-size: 0.84rem;
min-width: 48rem;
width: 100%;
}
.ar-attachment-history-table th,
.ar-attachment-history-table td {
border-bottom: 1px solid rgba(148, 163, 184, 0.25);
padding: 0.55rem;
text-align: left;
vertical-align: top;
}
.ar-attachment-history-table th {
color: #cbd5e1;
font-weight: 700;
}
.ar-attachment-history-tiles {
align-content: start;
box-sizing: border-box;
display: grid;
gap: 0.28rem;
grid-auto-rows: min-content;
max-height: 58vh;
max-width: 100%;
min-width: 0;
overflow-x: hidden;
overflow-y: auto;
padding: 0.35rem;
scrollbar-color: rgba(212, 175, 55, 0.65) rgba(255, 255, 255, 0.06);
scrollbar-width: thin;
width: 100%;
}
.ar-attachment-history-tiles::-webkit-scrollbar {
display: block;
height: 4px;
width: 4px;
}
.ar-attachment-history-tiles::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.04);
}
.ar-attachment-history-tiles::-webkit-scrollbar-thumb {
background: rgba(212, 175, 55, 0.7);
border-radius: 999px;
}
.ar-attachment-history-tiles::-webkit-scrollbar-thumb:hover {
background: rgba(240, 198, 76, 0.9);
}
.ar-attachment-history-tile {
background: linear-gradient(135deg, rgba(15, 23, 42, 0.96), rgba(22, 36, 53, 0.96));
border: 1px solid transparent;
border-radius: 0.52rem;
box-sizing: border-box;
color: #f8fafc;
display: grid;
gap: 0.12rem;
max-width: 100%;
min-width: 0;
overflow: hidden;
padding: 0.28rem 0.42rem;
width: 100%;
}
.ar-attachment-history-tile.is-selected {
border-color: rgba(34, 197, 94, 0.55);
box-shadow: inset 0 0 0 1px rgba(34, 197, 94, 0.18);
}
.ar-attachment-history-tile--page {
box-shadow: 0 8px 22px rgba(0, 0, 0, 0.18);
}
.ar-attachment-history-tile--with-preview {
gap: 0.32rem;
padding: 0.42rem;
}
.ar-attachment-history-preview {
align-items: flex-end;
background: rgba(255, 255, 255, 0.05);
border-radius: 0.42rem;
display: flex;
justify-content: space-between;
min-height: 7rem;
overflow: hidden;
position: relative;
}
.ar-attachment-history-preview-image {
display: block;
height: 100%;
object-fit: cover;
width: 100%;
}
.ar-attachment-history-preview-badge {
background: rgba(15, 23, 42, 0.72);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 999px;
bottom: 0.42rem;
color: #f8fafc;
font-size: 0.62rem;
left: 0.42rem;
padding: 0.2rem 0.46rem;
position: absolute;
}
.ar-attachment-history-tile-head {
align-items: flex-start;
display: flex;
gap: 0.65rem;
justify-content: space-between;
}
.ar-attachment-history-name {
display: block;
font-size: 0.78rem;
line-height: 1.08;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.ar-attachment-history-tile-head strong {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.ar-attachment-history-meta-row {
align-items: center;
color: #cbd5e1;
display: flex;
flex-wrap: wrap;
font-size: 0.6rem;
gap: 0.22rem;
line-height: 1.05;
min-width: 0;
}
.ar-attachment-history-txid {
background: rgba(255, 255, 255, 0.06);
border-radius: 0.34rem;
color: rgba(226, 232, 240, 0.86);
font-size: 0.56rem;
line-height: 1.05;
max-width: 100%;
min-width: 0;
overflow: hidden;
padding: 0.14rem 0.24rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.ar-attachment-status {
border-radius: 999px;
flex: 0 0 auto;
font-size: 0.58rem;
font-weight: 800;
line-height: 1;
padding: 0.2rem 0.32rem;
}
.ar-attachment-status--available {
background: rgba(220, 252, 231, 0.96);
color: #166534;
}
.ar-attachment-status--pending {
background: rgba(254, 249, 195, 0.96);
color: #854d0e;
}
.ar-attachment-status--unavailable {
background: rgba(254, 226, 226, 0.96);
color: #991b1b;
}
.ar-attachment-placement-flag {
background: rgba(219, 234, 254, 0.96);
border-radius: 999px;
color: #1e3a8a;
flex: 0 0 auto;
font-size: 0.58rem;
font-weight: 800;
line-height: 1;
padding: 0.2rem 0.32rem;
}
.arweave-uploads-screen {
box-sizing: border-box;
min-height: 100vh;
max-width: 100%;
overflow-x: hidden;
padding-top: 3.25rem;
}
.arweave-uploads-toolbar {
align-items: center;
background: linear-gradient(135deg, rgba(15, 23, 42, 0.98), rgba(30, 41, 59, 0.98));
border-bottom: 1px solid transparent;
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.22);
box-sizing: border-box;
display: grid;
gap: 0.42rem;
grid-template-columns: 2.4rem minmax(0, 1fr) 2.4rem 2.4rem;
justify-content: stretch;
left: 0;
margin: 0;
padding: max(0.35rem, env(safe-area-inset-top)) 0.45rem 0.45rem;
position: fixed;
right: 0;
top: 0;
z-index: 15;
}
.arweave-uploads-back,
.arweave-uploads-add,
.arweave-uploads-menu-btn {
align-items: center;
aspect-ratio: 1;
display: inline-flex;
font-size: 1.2rem;
height: 2.35rem;
justify-content: center;
min-width: 0;
padding: 0;
}
.arweave-uploads-title {
align-self: center;
color: #f8fafc;
font-size: 0.94rem;
font-weight: 800;
min-width: 0;
overflow: hidden;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
}
.arweave-uploads-menu {
background: rgba(15, 23, 42, 0.98);
border: 1px solid transparent;
border-radius: 0.85rem;
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35);
display: grid;
min-width: 13rem;
padding: 0.35rem;
position: absolute;
right: 0.45rem;
top: calc(100% + 0.35rem);
z-index: 20;
}
.arweave-uploads-menu[hidden] {
display: none;
}
.arweave-uploads-menu .text-btn {
color: #f8fafc;
text-align: left;
}
.arweave-uploads-list {
max-height: calc(100vh - 4.1rem);
min-height: calc(100vh - 4.1rem);
width: 100%;
}
.mono-cell {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
overflow-wrap: anywhere;
}
.modal-danger-action {
width: 100%;
}
.small-btn {
padding: 6px 10px;
font-size: 13px;
}
.session-item {
width: 100%;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: var(--radius-md);
background: rgba(255, 255, 255, 0.03);
color: inherit;
padding: 10px;
cursor: pointer;
}
.session-item:hover {
border-color: rgba(83, 216, 251, 0.4);
}
.session-tabs {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.session-tab {
border: 1px solid var(--line);
border-radius: 10px;
background: rgba(255, 255, 255, 0.03);
color: var(--text-muted);
min-height: 36px;
padding: 6px 8px;
cursor: pointer;
}
.session-tab.is-active {
color: var(--text);
border-color: rgba(83, 216, 251, 0.45);
background: rgba(83, 216, 251, 0.15);
}
.session-current-badge {
display: inline-flex;
margin-top: 8px;
padding: 4px 9px;
border-radius: 999px;
font-size: 12px;
color: #d7ffe3;
border: 1px solid rgba(132, 244, 161, 0.36);
background: rgba(132, 244, 161, 0.1);
}
.key-value {
font-family: "IBM Plex Mono", "Fira Code", monospace;
font-size: 13px;
line-height: 1.35;
word-break: break-all;
color: #dce7ff;
}
.key-value--compact {
font-size: 11px;
line-height: 1.25;
}
.key-input {
font-family: "IBM Plex Mono", "Fira Code", monospace;
font-size: 12px;
letter-spacing: 0;
}
.key-toggle-btn {
width: 36px;
height: 36px;
min-height: 36px;
min-width: 36px;
padding: 0;
display: grid;
place-items: center;
flex: 0 0 auto;
border-radius: 10px;
}
.key-toggle-icon {
width: 18px;
height: 18px;
display: block;
}
.qr-demo {
width: 64px;
height: 64px;
border-radius: 8px;
border: 2px solid rgba(255, 255, 255, 0.85);
background:
linear-gradient(
90deg,
#f6fbff 0 8px,
#0f1524 8px 16px,
#f6fbff 16px 24px,
#0f1524 24px 32px,
#f6fbff 32px 40px,
#0f1524 40px 48px,
#f6fbff 48px 56px,
#0f1524 56px 64px
);
}
.qr-image {
width: 64px;
height: 64px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.22);
background: #fff;
}
.modal-shell[hidden] {
display: none;
}
.modal-shell {
position: fixed;
inset: 0;
z-index: 24;
}
.boot-error-menu-shell {
z-index: 1000000;
}
.modal-backdrop {
position: absolute;
inset: 0;
background: rgba(5, 9, 16, 0.74);
backdrop-filter: blur(4px);
}
.modal-dialog {
position: absolute;
left: 16px;
right: 16px;
bottom: 24px;
display: grid;
gap: 12px;
box-shadow: var(--shadow);
}
.boot-error-menu-card {
gap: 10px;
}
.boot-error-menu-message {
white-space: pre-wrap;
overflow-wrap: anywhere;
line-height: 1.4;
}
.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);
}
.screen-content.network-scroll-lock .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-header-overlay {
position: absolute;
top: max(8px, env(safe-area-inset-top));
left: max(8px, env(safe-area-inset-left));
right: max(8px, env(safe-area-inset-right));
box-sizing: border-box;
margin-bottom: 0;
z-index: 12;
pointer-events: none;
padding: 9px 12px 0;
}
.network-header-overlay.page-header {
width: auto;
margin-bottom: 0;
gap: 10px;
}
.network-header-overlay .header-left,
.network-header-overlay .header-actions {
flex: 0 0 auto;
min-width: 0;
gap: 6px;
}
.network-header-overlay .header-left {
justify-content: flex-start;
}
.network-header-overlay .header-actions {
justify-content: flex-end;
}
.network-header-overlay .icon-btn {
pointer-events: auto;
min-height: 32px;
padding: 6px 10px;
font-size: 12px;
border-radius: 10px;
}
.network-header-overlay .page-title {
flex: 1 1 auto;
font-size: 16px;
line-height: 32px;
min-width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-align: center;
text-shadow: 0 1px 8px rgba(0, 0, 0, 0.45);
}
.network-header-overlay .icon-btn {
background: rgba(10, 20, 37, 0.6);
border-color: rgba(166, 196, 245, 0.32);
backdrop-filter: blur(10px);
}
.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 {
position: absolute;
transform: translate(-50%, -50%);
width: 126px;
border: 0;
background: transparent;
padding: 0;
text-align: center;
color: inherit;
cursor: pointer;
z-index: 1;
}
.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;
}
.user-relations-list {
gap: 6px;
}
.user-rel-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 10px;
min-height: 38px;
padding: 6px 8px;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(8, 14, 24, 0.34);
color: #d8e3ff;
font-size: 14px;
}
.user-rel-text {
min-height: 1em;
color: #dbe8ff;
line-height: 1.3;
}
.user-rel-action {
min-height: 32px;
padding: 5px 10px;
white-space: nowrap;
}
.user-rel-row.is-empty .user-rel-text {
color: transparent;
}
.user-rel-opinions-wrap {
display: grid;
gap: 8px;
padding: 6px 8px;
border-radius: 10px;
border: 1px dashed rgba(131, 196, 255, 0.45);
background: rgba(9, 18, 31, 0.42);
}
.user-rel-opinions-wrap.is-empty .user-rel-opinions-list {
display: none;
}
.user-rel-opinions-list {
display: grid;
gap: 6px;
}
.user-rel-opinion-item {
color: #d7e6ff;
line-height: 1.35;
font-size: 13px;
}
.user-rel-opinions-hint {
color: rgba(173, 199, 236, 0.9);
font-size: 12px;
}
.user-opinion-modal-btn {
text-align: left;
}
.user-opinion-modal-btn.is-add {
border-color: rgba(97, 170, 255, 0.7);
color: #9fcbff;
}
.user-opinion-modal-btn.is-remove {
border-color: rgba(255, 120, 120, 0.72);
color: #ff9b9b;
}
.tabs {
display: grid;
grid-template-columns: repeat(2, 1fr);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 4px;
background: rgba(255, 255, 255, 0.02);
}
.tab-btn {
border: 0;
background: transparent;
border-radius: 9px;
padding: 8px;
color: var(--text-muted);
cursor: pointer;
}
.tab-btn.active {
background: rgba(83, 216, 251, 0.16);
color: var(--text);
}
.modal {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.62);
display: grid;
place-items: center;
padding: 20px;
z-index: 20;
}
.modal-card {
width: min(100%, 390px);
background: #172238;
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 16px;
padding: 14px;
}
.channels-screen .modal-card .input {
background: linear-gradient(180deg, rgba(16, 31, 58, 0.9), rgba(11, 22, 43, 0.94));
}
.section-title {
font-size: 14px;
font-weight: 700;
color: #dbe7ff;
margin: 4px 2px;
}
.channels-scroll-wrap {
position: relative;
max-height: 58vh;
overflow-y: auto;
padding-right: 12px;
}
.channels-groups {
min-height: min-content;
}
.channels-divider {
border: 0;
border-top: 1px solid rgba(255, 255, 255, 0.14);
margin: 6px 0 8px;
}
.channels-scroll-hint {
position: absolute;
top: 4px;
right: 0;
width: 4px;
height: calc(100% - 8px);
border-radius: 999px;
background: linear-gradient(180deg, rgba(83, 216, 251, 0.55), rgba(83, 216, 251, 0.15));
pointer-events: none;
}
.toolbar {
background:
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));
border: 1px solid transparent;
box-shadow: 0 18px 32px rgba(2, 6, 13, 0.62);
border-radius: 18px;
padding: 9px;
}
.toolbar-btn {
color: #b8c7ea;
border-radius: 12px;
min-height: 52px;
transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease;
}
.toolbar-btn.active {
background:
linear-gradient(145deg, rgba(220, 181, 94, 0.32), rgba(39, 66, 122, 0.3)),
rgba(20, 35, 64, 0.62);
border: 1px solid transparent;
color: #f7e2ad;
box-shadow: inset 0 1px 0 rgba(255, 242, 204, 0.42);
}
.toolbar-btn:active {
transform: translateY(1px);
}
.modal-card {
background: linear-gradient(165deg, rgba(16, 31, 58, 0.97), rgba(10, 18, 36, 0.97));
border-color: transparent;
box-shadow: 0 20px 38px rgba(2, 6, 12, 0.55);
}
.channels-screen {
position: relative;
gap: 11px;
isolation: isolate;
}
.channels-screen::before {
content: "";
position: absolute;
inset: -24px -18px 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(circle at 16% -4%, rgba(232, 191, 92, 0.22), transparent 40%),
radial-gradient(circle at 80% 6%, rgba(77, 114, 189, 0.35), transparent 39%),
radial-gradient(circle at 52% 22%, rgba(13, 33, 70, 0.54), transparent 44%),
linear-gradient(180deg, rgba(4, 11, 24, 0.92), rgba(4, 11, 23, 0.4) 46%, transparent 100%);
}
.channels-screen.channels-screen--channel::before {
background:
radial-gradient(circle at 14% 16%, rgba(82, 73, 184, 0.2), transparent 44%),
radial-gradient(circle at 86% 8%, rgba(57, 89, 161, 0.22), transparent 46%),
radial-gradient(circle at 54% 84%, rgba(64, 47, 138, 0.15), transparent 42%),
linear-gradient(180deg, #0a0b10 0%, #0a0b10 62%, rgba(10, 11, 16, 0.92) 100%);
}
.channels-screen .page-header {
margin-bottom: 0;
align-items: flex-end;
position: sticky;
top: calc(-1 * max(10px, env(safe-area-inset-top)));
z-index: 14;
padding: calc(max(10px, env(safe-area-inset-top)) + 2px) 0 6px;
border-bottom: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(8, 12, 20, 0.9);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
}
.channels-screen .page-header .icon-btn,
.channels-screen .page-header .text-btn {
background: linear-gradient(180deg, rgba(20, 37, 67, 0.9), rgba(13, 24, 47, 0.94));
border-color: rgba(146, 173, 229, 0.38);
color: #d9e6ff;
}
.channels-screen .page-title {
font-size: 29px;
line-height: 1.05;
font-family: "Cormorant Garamond", "Times New Roman", serif;
letter-spacing: 0.01em;
color: #f5db9e;
text-shadow: 0 10px 20px rgba(0, 0, 0, 0.48);
}
.channels-screen--list .page-title {
font-size: 37px;
line-height: 0.95;
}
.channels-screen .card {
background:
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%);
border: 1px solid transparent;
box-shadow: 0 14px 30px rgba(2, 7, 15, 0.54);
}
.channels-screen .meta-muted {
color: #c3cfea;
}
.channels-screen .status-line.is-unavailable {
color: #ffd9e1;
}
.channels-hero {
display: grid;
grid-template-columns: auto 1fr;
gap: 12px;
align-items: center;
padding: 12px;
border-color: transparent;
box-shadow: 0 14px 30px rgba(4, 9, 20, 0.54);
}
.channels-hero-emblem {
position: relative;
width: 62px;
height: 62px;
border-radius: 50%;
border: 1px solid transparent;
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%);
box-shadow:
inset 0 0 0 5px rgba(20, 38, 74, 0.76),
0 10px 20px rgba(3, 7, 16, 0.52);
}
.channels-hero-emblem::before,
.channels-hero-emblem::after {
content: "";
position: absolute;
inset: 14px;
border-radius: 50%;
border: 2px solid rgba(27, 47, 85, 0.74);
}
.channels-hero-emblem::after {
inset: 7px;
border-width: 1px;
border-color: transparent;
}
.channels-hero-copy {
min-width: 0;
display: grid;
gap: 2px;
}
.channels-hero-kicker {
font-size: 11px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: #e8cc8f;
}
.channels-hero-title {
font-family: "Cormorant Garamond", "Times New Roman", serif;
font-size: 26px;
line-height: 1;
color: #f4ddab;
}
.channels-hero-subtitle {
color: #afc1e3;
font-size: 12px;
line-height: 1.35;
}
.channels-user-chip {
display: flex;
align-items: center;
gap: 9px;
color: #e9f0ff;
min-height: 46px;
font-size: 15px;
}
.channels-user-chip::before {
content: "";
width: 9px;
height: 9px;
border-radius: 50%;
background: #ddb86f;
}
.channels-help-card strong {
font-size: 17px;
color: #f3d79c;
font-family: "Cormorant Garamond", "Times New Roman", serif;
}
.channels-help-card .meta-muted {
line-height: 1.34;
font-size: 13px;
}
.channels-help-card {
gap: 6px;
padding-top: 12px;
padding-bottom: 12px;
}
.channels-info-strip {
border-radius: 14px;
padding: 10px 13px;
color: #ead3a0;
border: 1px solid transparent;
background: linear-gradient(134deg, rgba(180, 140, 62, 0.22), rgba(23, 44, 84, 0.3));
font-size: 12px;
line-height: 1.35;
}
.channels-action-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 9px;
}
.channels-action-btn {
min-height: 50px;
border-radius: 999px;
text-align: center;
line-height: 1.25;
padding: 9px 10px;
font-weight: 700;
letter-spacing: 0.01em;
font-size: 13px;
}
.channels-action-btn.primary-btn {
box-shadow: inset 0 1px 0 rgba(255, 247, 214, 0.6), 0 10px 18px rgba(5, 8, 16, 0.46);
}
.channels-action-btn.destructive-btn {
border-color: rgba(248, 141, 163, 0.5);
background: linear-gradient(120deg, rgba(126, 31, 52, 0.94), rgba(88, 22, 37, 0.95));
box-shadow: inset 0 1px 0 rgba(171, 198, 255, 0.26), 0 9px 16px rgba(5, 8, 16, 0.36);
}
.channels-scroll-wrap {
max-height: none;
padding-right: 8px;
}
.channels-groups {
gap: 11px;
justify-items: start;
}
.channels-section {
gap: 8px;
}
.channels-section .section-title {
font-size: 21px;
color: #f2d395;
margin: 0 2px;
font-family: "Cormorant Garamond", "Times New Roman", serif;
letter-spacing: 0.01em;
}
.channels-list-empty {
border: 1px dashed transparent;
border-radius: var(--radius-md);
padding: 12px;
color: #aeb9d8;
background: rgba(10, 18, 36, 0.5);
}
.channels-divider {
border-top-color: transparent;
margin: 2px 0;
}
.channel-row {
display: grid;
grid-template-columns: 46px minmax(0, 1fr) 72px;
gap: 12px;
padding: 14px 13px;
width: min(100%, 340px);
border-radius: 16px;
border: 1px solid transparent;
background:
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%);
cursor: pointer;
transition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
backdrop-filter: blur(10px);
}
.channel-row:hover {
border-color: transparent;
box-shadow: 0 10px 22px rgba(2, 8, 16, 0.44);
transform: translateY(-1px);
}
.channel-row .avatar {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
border-radius: 50%;
background: linear-gradient(138deg, #efd193, #c18c42);
color: #17233f;
box-shadow: inset 0 1px 0 rgba(255, 244, 208, 0.58);
}
.channel-row-main {
min-width: 0;
display: grid;
gap: 4px;
}
.channel-row-title {
font-size: 18px;
color: #f5daa0;
line-height: 1.2;
letter-spacing: 0.01em;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
}
.channel-row-description {
font-size: 11px;
color: #9db0dc;
word-break: break-word;
opacity: 0.95;
}
.channel-row-message {
color: #e5eeff;
font-size: 14px;
line-height: 1.35;
word-break: break-word;
min-height: 18px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.channel-row-owner {
font-size: 12px;
color: #bdcdeb;
}
.channel-counter-meta,
.channel-counter-value {
opacity: 0;
transform: translateY(3px);
transition: opacity 0.22s ease, transform 0.22s ease;
}
.channel-row.is-counters-visible .channel-counter-meta,
.channel-row.is-counters-visible .channel-counter-value {
opacity: 1;
transform: translateY(0);
}
.channel-row-meta {
display: grid;
justify-items: center;
align-content: start;
gap: 6px;
}
.channel-row-kind {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
padding: 4px 8px;
border-radius: 999px;
border: 1px solid transparent;
color: #f1d49a;
background: rgba(191, 149, 66, 0.16);
}
.channel-row-time {
font-size: 11px;
color: #96a7ce;
}
.channel-row-count {
min-width: 28px;
justify-content: center;
background: linear-gradient(180deg, #57b6ff 0%, #2a86ff 100%);
color: #ffffff;
box-shadow:
0 0 0 1px rgba(255, 255, 255, 0.08) inset,
0 0 10px rgba(52, 146, 255, 0.68),
0 0 18px rgba(52, 146, 255, 0.32);
font-size: 12px;
font-weight: 700;
line-height: 1;
}
.channels-screen--list .channel-row-count {
grid-row: 1;
align-self: start;
justify-self: end;
}
.channels-screen--list .channel-row-count[hidden] {
display: none !important;
}
.channels-bottom-action {
margin-top: 6px;
min-height: 48px;
border-radius: 13px;
font-size: 14px;
}
.channels-status {
border-color: rgba(227, 127, 144, 0.45);
background: linear-gradient(165deg, rgba(68, 24, 36, 0.55), rgba(19, 17, 33, 0.82));
}
.channel-head-card {
display: grid;
gap: 6px;
}
.channel-head-actions {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 8px;
flex-wrap: wrap;
}
.channel-head-title {
font-size: 24px;
color: #f0d089;
line-height: 1.1;
font-family: "Cormorant Garamond", "Times New Roman", serif;
}
.channel-head-meta {
font-size: 13px;
color: #aebddd;
}
.channel-note {
font-size: 13px;
color: #e8d8b0;
line-height: 1.4;
}
.channel-feed {
gap: 10px;
}
.channel-unread-line {
display: flex;
align-items: center;
gap: 10px;
margin: 10px 0 12px;
padding: 10px 14px;
border-radius: 999px;
border: 1px solid transparent;
background:
linear-gradient(180deg, rgba(50, 39, 14, 0.9), rgba(22, 25, 39, 0.9));
color: #ffe6a7;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.08em;
line-height: 1;
text-transform: uppercase;
text-align: center;
justify-content: center;
box-shadow: 0 10px 24px rgba(6, 10, 20, 0.35);
}
.channel-unread-line::before,
.channel-unread-line::after {
content: '';
flex: 1 1 0;
height: 1px;
min-width: 18px;
background: linear-gradient(90deg, transparent, rgba(244, 202, 102, 0.8), transparent);
}
.channels-screen--channel .channel-feed {
gap: 2px;
margin-left: -7px;
margin-right: -7px;
}
.channels-screen .channel-message-card {
gap: 14px;
padding: 20px;
margin-bottom: 24px;
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.07);
background: rgba(20, 25, 35, 0.55);
backdrop-filter: blur(24px);
box-shadow: 0 0 60px rgba(80, 60, 180, 0.15);
}
.channels-screen--channel .channel-message-card {
margin-bottom: 6px;
}
.channels-screen--channel .channel-message-card.is-diary-entry {
width: min(100%, 28rem);
max-width: min(84vw, 28rem);
padding: 16px 16px 15px;
justify-self: center;
align-self: center;
}
.channel-message-top {
display: flex;
align-items: center;
gap: 12px;
}
.channel-message-author-tile {
appearance: none;
-webkit-appearance: none;
display: flex;
align-items: center;
gap: 12px;
flex: 1 1 auto;
width: auto;
min-width: 0;
padding: 8px 10px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(19, 24, 33, 0.9);
color: #f5f8ff;
text-align: left;
cursor: pointer;
min-height: 0;
}
.channel-message-author-tile:hover {
background: rgba(28, 35, 48, 0.94);
}
.channel-message-avatar {
width: 28px;
height: 28px;
min-width: 28px;
min-height: 28px;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 10px;
font-weight: 700;
color: #f4f6ff;
background: radial-gradient(circle at 30% 30%, #8a73ff, #4f4bda 58%, #3b2b89);
}
.channel-message-avatar.avatar-image {
display: grid;
place-items: center;
}
.channel-message-author {
display: grid;
gap: 4px;
min-width: 0;
}
.channel-message-head-row {
display: flex;
align-items: stretch;
gap: 8px;
}
.channel-message-title {
font-size: 15px;
color: #f5f8ff;
}
.channel-message-kind-badge {
display: inline-flex;
align-items: center;
justify-content: center;
width: fit-content;
padding: 3px 8px;
border-radius: 999px;
font-size: 12px;
line-height: 1.2;
}
.channel-message-kind-badge--rating {
color: #ffe8b0;
background: rgba(124, 92, 28, 0.36);
border: 1px solid transparent;
}
.channel-message-kind-badge--status {
color: #bfe9d1;
background: rgba(38, 92, 62, 0.32);
border: 1px solid rgba(137, 223, 176, 0.26);
}
.channel-message-target-preview {
display: grid;
gap: 4px;
padding: 9px 11px;
border-radius: 10px;
border: 1px solid rgba(154, 178, 224, 0.16);
background: rgba(13, 22, 39, 0.56);
}
.channel-message-target-preview strong {
color: #f0d99c;
font-size: 12px;
}
.channel-message-target-preview span {
color: rgba(188, 208, 244, 0.82);
font-size: 12px;
}
.channel-message-target-preview p {
margin: 0;
color: #d9e6ff;
font-size: 13px;
line-height: 1.35;
}
.channels-screen .channel-message-card.is-rating,
.thread-node-card.is-rating {
border-color: transparent;
background:
linear-gradient(180deg, rgba(112, 84, 22, 0.12), rgba(20, 25, 35, 0.58)),
rgba(20, 25, 35, 0.55);
box-shadow: 0 0 38px rgba(181, 136, 42, 0.14);
}
.channels-screen .channel-message-card.is-focus-flash {
border-color: transparent;
box-shadow: 0 0 34px rgba(255, 214, 117, 0.16);
}
.channel-message-body {
color: #ffffff;
line-height: 1.5;
font-size: 15px;
white-space: pre-wrap;
word-break: break-word;
margin: 0;
padding: 0;
background: transparent;
border: 0;
}
.channel-message-body--deleted {
color: #ff9e9e;
border: 1px solid rgba(255, 126, 126, 0.5);
background: rgba(120, 18, 18, 0.28);
border-radius: 10px;
padding: 8px 10px;
}
.channel-message-card--deleted-compact {
gap: 7px;
padding-top: 9px;
padding-bottom: 9px;
}
.channel-system-event-card {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
width: fit-content;
max-width: min(88%, 460px);
margin: 0 auto 4px;
padding: 8px 16px;
border-color: transparent;
border-radius: 999px;
background: rgba(89, 67, 31, 0.26);
color: rgba(255, 235, 188, 0.92);
cursor: pointer;
text-align: center;
}
.channel-system-event-card__label {
display: block;
font-size: 13px;
line-height: 1.2;
}
.channel-meta-details-grid {
display: grid;
grid-template-columns: minmax(96px, 120px) 1fr;
gap: 10px 14px;
align-items: start;
color: rgba(255, 255, 255, 0.92);
}
.channel-meta-details-grid > span:nth-child(odd) {
color: rgba(255, 255, 255, 0.48);
}
.channel-meta-details-grid code {
color: rgba(255, 214, 117, 0.92);
word-break: break-word;
}
.channel-profile-card {
align-items: stretch;
}
.channel-profile-modal-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.channel-profile-edit-btn {
width: 38px;
padding-left: 0;
padding-right: 0;
}
.channel-profile-avatar {
--channel-avatar-size: 96px;
width: var(--channel-avatar-size);
height: var(--channel-avatar-size);
display: inline-flex;
align-items: center;
justify-content: center;
align-self: center;
border-radius: 50%;
background: linear-gradient(145deg, rgba(255, 214, 122, 0.22), rgba(56, 41, 22, 0.65));
border: 1px solid transparent;
color: rgba(255, 236, 194, 0.95);
font-size: calc(var(--channel-avatar-size) * 0.42);
font-weight: 700;
overflow: hidden;
}
.channel-profile-avatar img,
.avatar img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
}
.deleted-message-pill {
appearance: none;
width: 100%;
border: 1px solid rgba(255, 160, 120, 0.28);
border-radius: 12px;
background: rgba(70, 31, 25, 0.45);
color: rgba(255, 216, 190, 0.9);
font-size: 13px;
line-height: 1.2;
text-align: left;
padding: 8px 10px;
cursor: pointer;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.deleted-message-pill:hover,
.deleted-message-pill:focus-visible {
border-color: rgba(255, 196, 142, 0.55);
background: rgba(98, 42, 31, 0.58);
outline: none;
}
.channel-message-time {
font-size: 11px;
color: rgba(255, 255, 255, 0.48);
}
.channel-message-views {
margin: 0;
font-size: 12px;
line-height: 1.35;
color: rgba(255, 255, 255, 0.58);
}
.channel-message-stats.is-hidden,
.thread-node-stats.is-hidden {
opacity: 0;
max-height: 0;
overflow: hidden;
margin: 0;
}
.channel-message-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
flex-wrap: nowrap;
overflow-x: auto;
padding-top: 14px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.channel-message-actions::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.channel-action-item {
appearance: none;
border: 0;
background: transparent;
position: relative;
min-height: 0;
padding: 0;
margin: 0;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 5px;
min-width: 24px;
color: rgba(255, 255, 255, 0.55);
cursor: pointer;
transition: color 0.18s ease, text-shadow 0.18s ease, transform 0.18s ease;
white-space: nowrap;
}
.channel-action-item:disabled {
opacity: 0.56;
cursor: not-allowed;
}
.channel-action-item:focus-visible {
outline: none;
color: rgba(255, 220, 100, 0.9);
}
.channel-action-item:hover,
.channel-action-item.is-liked,
.channel-action-item.is-long-press {
color: rgba(255, 220, 100, 0.9);
text-shadow: 0 0 12px rgba(255, 220, 100, 0.25);
}
.channel-action-icon {
font-size: 14px;
line-height: 1;
}
.channel-action-label {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.channel-action-item:hover::after,
.channel-action-item:focus-visible::after {
content: attr(title);
position: absolute;
left: 50%;
bottom: calc(100% + 8px);
z-index: 30;
transform: translateX(-50%);
max-width: 180px;
padding: 5px 8px;
border: 1px solid transparent;
border-radius: 8px;
background: rgba(20, 20, 24, 0.94);
color: rgba(255, 244, 210, 0.96);
font-size: 11px;
line-height: 1.15;
letter-spacing: 0.01em;
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.35);
pointer-events: none;
white-space: nowrap;
}
.message-edited-marker {
appearance: none;
border: none;
background: transparent;
color: rgba(255, 220, 100, 0.85);
font-size: 11px;
line-height: 1;
padding: 0;
margin-left: 6px;
cursor: pointer;
text-decoration: underline;
text-underline-offset: 2px;
}
.message-edited-marker:hover,
.message-edited-marker:focus-visible {
color: rgba(255, 232, 150, 0.95);
}
.channel-action-counter {
font-size: 11px;
color: rgba(255, 255, 255, 0.45);
opacity: 0;
max-width: 0;
overflow: hidden;
transform: translateX(-3px);
transition: opacity 0.2s ease, max-width 0.2s ease, transform 0.2s ease, margin-left 0.2s ease;
}
.channels-screen .channel-message-card.is-counters-visible .channel-action-counter {
opacity: 1;
max-width: 40px;
margin-left: 2px;
transform: translateX(0);
}
.blockchain-details-card {
max-width: min(620px, calc(100vw - 28px));
}
.blockchain-details-grid {
display: grid;
grid-template-columns: max-content minmax(0, 1fr);
gap: 8px 12px;
padding: 12px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 14px;
background: rgba(255, 255, 255, 0.035);
}
.blockchain-details-grid span {
color: rgba(255, 255, 255, 0.58);
font-size: 12px;
}
.blockchain-details-grid code,
.blockchain-details-grid strong {
min-width: 0;
color: rgba(255, 244, 210, 0.96);
font-size: 12px;
overflow-wrap: anywhere;
}
.blockchain-raw-block {
max-height: 280px;
overflow: auto;
padding: 12px;
border-radius: 14px;
background: rgba(0, 0, 0, 0.32);
color: rgba(255, 255, 255, 0.82);
font-size: 11px;
line-height: 1.45;
white-space: pre-wrap;
}
.thread-summary {
color: #efd9a4;
border-color: transparent;
background: linear-gradient(130deg, rgba(178, 137, 58, 0.2), rgba(24, 41, 74, 0.24));
}
.thread-node-card {
gap: 9px;
border-radius: 16px;
border-color: transparent;
backdrop-filter: blur(12px);
}
.channel-header-route-btn {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -66%) !important;
max-width: 72vw;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 14px;
min-height: 40px;
border-radius: 10px;
text-align: center;
}
.channels-screen .page-header .channel-header-route-btn:hover,
.channels-screen .page-header .channel-header-route-btn:focus-visible {
transform: translate(-50%, -66%) !important;
}
.channels-screen .page-header .channel-header-route-btn:active,
.channels-screen .page-header .channel-header-route-btn.is-springing {
transform: translate(-50%, -66%) !important;
}
.thread-node-heading {
color: #f1dcab;
font-size: 15px;
}
.thread-node-meta {
color: #aebddd;
font-size: 12px;
}
.thread-node-body {
color: #eef3ff;
font-size: 14px;
line-height: 1.45;
white-space: pre-wrap;
word-break: break-word;
border-radius: 10px;
padding: 8px 10px;
background: linear-gradient(170deg, rgba(22, 40, 73, 0.72), rgba(12, 25, 48, 0.78));
border: 1px solid rgba(116, 141, 193, 0.24);
}
.thread-node-stats {
color: #99acd6;
font-size: 12px;
}
.thread-node-views {
margin: 0;
font-size: 12px;
line-height: 1.35;
color: rgba(255, 255, 255, 0.58);
}
.thread-node-actions {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 8px;
}
.channels-screen--thread .thread-node-actions {
display: flex !important;
grid-template-columns: none !important;
}
.thread-node-level {
--depth: 0;
margin-left: calc(var(--depth) * 12px);
}
.thread-block {
gap: 8px;
border-radius: 15px;
padding: 8px;
border: 1px solid rgba(151, 174, 221, 0.2);
background: linear-gradient(160deg, rgba(10, 21, 43, 0.72), rgba(8, 16, 31, 0.78));
}
.channels-screen--thread .thread-node-card {
padding: 14px;
margin-bottom: 10px;
}
.thread-history-divider {
height: 0;
border-top: 2px solid rgba(255, 255, 255, 0.26);
margin: 6px 0 10px;
}
.thread-block--ancestors > .section-title {
color: #b9cbef;
}
.thread-block--ancestors {
border-color: rgba(141, 166, 214, 0.26);
background: linear-gradient(160deg, rgba(12, 28, 56, 0.73), rgba(7, 15, 32, 0.78));
}
.thread-block--focus > .section-title {
color: #f0d9a4;
}
.thread-block--focus {
border-color: transparent;
background: linear-gradient(160deg, rgba(33, 44, 72, 0.68), rgba(12, 20, 36, 0.8));
}
.thread-block--replies > .section-title {
color: #c8d6f5;
}
.thread-block--replies {
border-color: rgba(161, 186, 233, 0.24);
}
.channel-main-action {
min-height: 48px;
border-radius: 13px;
}
.channel-back-btn {
min-height: 44px;
}
.channel-action-like.is-liked,
.thread-like-btn.is-liked {
color: rgba(255, 220, 100, 0.9);
}
.channel-action-like,
.thread-like-btn {
transition: transform 0.18s ease, box-shadow 0.18s ease, filter 0.18s ease;
}
.channel-action-like.is-long-press,
.thread-like-btn.is-long-press {
transform: scale(0.96);
filter: brightness(1.08) drop-shadow(0 0 8px rgba(255, 220, 100, 0.28));
box-shadow: none;
}
.channel-action-reply,
.thread-reply-btn {
color: rgba(255, 255, 255, 0.55);
}
.channel-action-thread {
color: rgba(255, 255, 255, 0.55);
}
.channel-action-share,
.thread-share-btn {
color: rgba(255, 255, 255, 0.55);
}
.thread-open-btn {
color: rgba(255, 255, 255, 0.62);
}
@media (max-width: 430px) {
.channels-screen .page-title {
font-size: 26px;
}
.channels-screen--list .page-title {
font-size: 34px;
}
.channels-hero-title {
font-size: 24px;
}
.channels-action-btn {
min-height: 48px;
font-size: 12px;
}
.channel-row {
grid-template-columns: 64px minmax(0, 1fr) 64px;
gap: 10px;
padding: 12px;
}
.channel-row .avatar {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
}
.channel-row-title {
font-size: 16px;
}
.channel-row-message {
font-size: 13px;
}
.channel-message-actions {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.thread-node-actions {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 365px) {
.channels-screen .page-title {
font-size: 24px;
}
.channels-action-grid {
grid-template-columns: 1fr;
}
.channel-message-actions {
grid-template-columns: 1fr;
}
.thread-node-actions {
grid-template-columns: 1fr;
}
}
/* ===== Channels UX Stabilization ===== */
.toast-host {
position: fixed;
left: 0;
right: 0;
bottom: calc(18px + env(safe-area-inset-bottom));
display: grid;
justify-items: center;
gap: 8px;
z-index: 60;
pointer-events: none;
}
.toast {
min-width: min(88vw, 320px);
max-width: min(92vw, 420px);
border-radius: 14px;
padding: 11px 14px;
border: 1px solid transparent;
color: #f2dca8;
background: rgba(10, 14, 23, 0.8);
backdrop-filter: blur(12px);
box-shadow: 0 16px 30px rgba(1, 6, 12, 0.55);
opacity: 0;
transform: translateY(8px);
transition: opacity 0.22s ease, transform 0.22s ease;
}
.toast.is-visible {
opacity: 1;
transform: translateY(0);
}
.toast.is-hiding {
opacity: 0;
transform: translateY(8px);
}
.toast.toast--error {
color: #ffd8e0;
border-color: rgba(234, 122, 150, 0.45);
}
.skeleton-card {
display: grid;
gap: 8px;
}
.skeleton-line {
height: 10px;
border-radius: 999px;
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%;
animation: channels-shimmer 1.2s linear infinite;
}
.skeleton-line.w-40 { width: 40%; }
.skeleton-line.w-70 { width: 70%; }
.skeleton-line.w-90 { width: 90%; }
@keyframes channels-shimmer {
0% { background-position: 210% 0; }
100% { background-position: -10% 0; }
}
.channels-tabs {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
padding: 6px;
border-radius: 14px;
border: 1px solid transparent;
background: linear-gradient(165deg, rgba(12, 24, 46, 0.92), rgba(9, 17, 34, 0.96));
}
.channels-top-bar {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 8px;
}
.channels-top-left {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.channels-top-right {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 8px;
min-width: 0;
}
.channels-top-title {
font-size: 16px;
line-height: 1.2;
color: rgba(255, 255, 255, 0.9);
white-space: nowrap;
}
.channels-top-switch-btn {
min-height: 36px;
white-space: nowrap;
}
.channels-top-back-btn,
.channels-top-add-btn,
.channels-top-search-btn,
.channels-top-more-btn {
width: 36px;
height: 36px;
min-width: 36px;
min-height: 36px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
}
.channels-top-search-btn {
border-color: rgba(105, 211, 255, 0.58);
background: linear-gradient(150deg, rgba(26, 81, 118, 0.78), rgba(12, 30, 55, 0.96));
box-shadow: inset 0 0 0 1px rgba(177, 239, 255, 0.12), 0 0 13px rgba(77, 194, 255, 0.2);
}
.channels-top-search-btn:hover,
.channels-top-search-btn:focus-visible {
border-color: rgba(166, 237, 255, 0.9);
background: linear-gradient(150deg, rgba(38, 111, 153, 0.88), rgba(14, 39, 68, 0.98));
box-shadow: inset 0 0 0 1px rgba(214, 249, 255, 0.2), 0 0 18px rgba(93, 211, 255, 0.38);
}
.channels-top-more-btn {
font-size: 20px;
line-height: 1;
padding-bottom: 1px;
}
.channels-search-icon {
position: relative;
display: block;
width: 13px;
height: 13px;
border: 1.8px solid #d9f5ff;
border-radius: 50%;
box-shadow: 0 0 6px rgba(133, 225, 255, 0.58);
}
.channels-search-icon::after {
content: '';
position: absolute;
width: 6px;
height: 1.8px;
right: -4px;
bottom: -2px;
border-radius: 999px;
background: #d9f5ff;
box-shadow: 0 0 5px rgba(133, 225, 255, 0.58);
transform: rotate(45deg);
transform-origin: left center;
}
.channels-top-action-btn {
min-height: 38px;
padding: 8px 12px;
white-space: nowrap;
}
.channels-tab-btn {
min-height: 38px;
border-radius: 10px;
border: 1px solid rgba(122, 151, 210, 0.26);
background: rgba(18, 33, 62, 0.55);
color: #b8c9ec;
font-weight: 600;
cursor: pointer;
}
.channels-tab-btn.is-active {
border-color: transparent;
color: #f4d99e;
background: linear-gradient(160deg, rgba(193, 154, 76, 0.22), rgba(18, 33, 62, 0.64));
}
.channels-empty-state {
border: 1px dashed transparent;
border-radius: 14px;
padding: 16px;
display: grid;
gap: 10px;
color: #b7c6e8;
background: rgba(10, 18, 34, 0.52);
}
.channels-empty-state--compact {
border: 0;
background: transparent;
border-radius: 0;
padding: 4px 2px;
gap: 6px;
}
.channels-empty-icon {
font-size: 20px;
color: #d9b56d;
}
.channel-row {
position: relative;
grid-template-columns: 46px minmax(0, 1fr) auto;
}
.channel-row-main {
padding-right: 6px;
}
.channel-row-description {
display: none;
}
.channel-row-controls {
display: grid;
justify-items: end;
align-content: start;
gap: 6px;
position: relative;
min-width: 44px;
grid-template-rows: auto auto;
}
.channels-screen--list .channel-row-time {
grid-row: 2;
align-self: end;
}
.channel-menu-trigger {
width: 34px;
height: 34px;
border-radius: 10px;
border: 1px solid transparent;
background: rgba(14, 25, 48, 0.82);
color: #efd9a4;
cursor: pointer;
font-size: 18px;
line-height: 1;
}
.channel-menu-wrap {
position: absolute;
top: 52px;
right: 12px;
z-index: 25;
width: min(240px, 70vw);
border-radius: 14px;
border: 1px solid transparent;
background: rgba(10, 14, 23, 0.8);
backdrop-filter: blur(12px);
box-shadow: 0 16px 32px rgba(1, 5, 12, 0.62);
padding: 10px;
display: grid;
gap: 8px;
}
.channel-menu-item {
border: 1px solid rgba(125, 154, 212, 0.34);
border-radius: 10px;
background: rgba(17, 31, 56, 0.72);
color: #e6efff;
min-height: 36px;
padding: 6px 10px;
cursor: pointer;
text-align: left;
}
.channel-menu-item.destructive {
border-color: rgba(235, 120, 147, 0.46);
color: #ffdfe7;
background: rgba(84, 20, 38, 0.52);
}
.channel-menu-item:disabled {
opacity: 0.68;
cursor: not-allowed;
}
.channel-menu-toggle {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
color: #d9e6ff;
font-size: 13px;
}
.channel-toggle-btn {
width: 48px;
height: 28px;
border-radius: 999px;
border: 1px solid rgba(146, 171, 225, 0.45);
background: rgba(27, 43, 75, 0.84);
position: relative;
cursor: pointer;
transition: background 0.2s ease, border-color 0.2s ease;
}
.channel-toggle-btn::after {
content: "";
position: absolute;
top: 3px;
left: 3px;
width: 20px;
height: 20px;
border-radius: 50%;
background: #d9e6ff;
transition: transform 0.24s cubic-bezier(.2,.9,.3,1.15), background 0.2s ease;
}
.channel-toggle-btn.is-on {
background: rgba(211, 173, 92, 0.34);
border-color: transparent;
}
.channel-toggle-btn.is-on::after {
transform: translateX(20px);
background: #f4dca6;
}
.channel-head-description {
margin: 0;
color: #c8d7f6;
font-size: 14px;
line-height: 1.4;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.channel-head-description.is-expanded {
-webkit-line-clamp: unset;
display: block;
}
.channel-head-more {
border: 0;
background: transparent;
color: #efcf8b;
font-size: 12px;
padding: 0;
width: fit-content;
cursor: pointer;
}
.author-line {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 6px;
width: 100%;
}
.author-line-main {
display: inline-flex;
align-items: center;
gap: 6px;
min-width: 0;
flex-wrap: wrap;
}
.channel-message-type-chip,
.channel-message-type-button {
flex: 0 0 auto;
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 28px;
padding: 4px 9px;
border-radius: 9px;
border: 1px solid transparent;
background: linear-gradient(180deg, rgba(57, 74, 119, 0.34), rgba(18, 29, 54, 0.34));
color: #f1d99c;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.channel-message-type-button {
min-width: 82px;
padding: 6px 10px;
border-radius: 10px;
cursor: pointer;
}
.channel-message-type-button.is-static,
.channel-message-type-button:disabled {
opacity: 1;
cursor: default;
}
.channel-message-tools {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 8px;
align-items: center;
}
.channel-message-type-select {
min-width: 0;
min-height: 46px;
}
.author-line-login {
font-weight: 700;
color: #f5f8ff;
}
.author-line-num {
font-weight: 400;
color: rgba(255, 255, 255, 0.44);
}
.channels-screen .channel-message-card.is-own-new,
.thread-node-card.is-own-new {
box-shadow: 0 0 52px rgba(88, 69, 176, 0.2), 0 12px 24px rgba(2, 8, 16, 0.46);
}
.is-springing {
animation: spring-tap 0.28s ease;
}
@keyframes spring-tap {
0% { transform: scale(1); }
30% { transform: scale(0.95); }
60% { transform: scale(1.06); }
100% { transform: scale(1); }
}
@media (max-width: 420px) {
.channel-message-actions {
grid-template-columns: 1fr;
}
.thread-node-actions {
grid-template-columns: 1fr;
}
.channels-action-grid {
grid-template-columns: 1fr;
}
}
/* ===== Channels cleanup overrides ===== */
.screen-content.channels-scroll-clean {
scrollbar-width: none;
-ms-overflow-style: none;
}
.screen-content.channels-scroll-clean::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.channels-tabs--sticky {
position: sticky;
top: 0;
z-index: 8;
backdrop-filter: blur(12px);
}
.channels-list-content {
display: grid;
gap: 10px;
min-height: 0;
}
.channels-unread-divider {
display: flex;
align-items: center;
justify-content: center;
margin: 6px 0 2px;
padding: 8px 12px;
border-top: 1px solid rgba(255, 255, 255, 0.12);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 220, 130, 0.9);
font-size: 12px;
letter-spacing: 0.03em;
}
.channels-unread-jump {
position: fixed;
right: 18px;
bottom: 96px;
width: 48px;
height: 48px;
border-radius: 999px;
border: 1px solid transparent;
background: linear-gradient(160deg, rgba(16, 24, 38, 0.92), rgba(12, 18, 30, 0.86));
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);
display: inline-flex;
align-items: center;
justify-content: center;
z-index: 38;
opacity: 0;
pointer-events: none;
transform: translateY(8px);
transition: opacity 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
}
.channels-unread-jump.is-visible {
opacity: 1;
pointer-events: auto;
transform: translateY(0);
}
.channels-unread-jump:hover {
box-shadow: 0 14px 30px rgba(3, 8, 18, 0.55), 0 0 24px rgba(212, 175, 55, 0.22);
}
.channels-unread-jump-icon {
font-size: 18px;
line-height: 1;
}
.channels-unread-jump-badge {
position: absolute;
top: -6px;
right: -6px;
min-width: 20px;
height: 20px;
border-radius: 999px;
background: rgba(212, 175, 55, 0.95);
color: #1f1702;
font-size: 11px;
font-weight: 700;
padding: 0 5px;
display: inline-flex;
align-items: center;
justify-content: center;
box-shadow: 0 0 0 2px rgba(10, 14, 24, 0.9);
}
.channels-list-body-fade {
animation: channels-fade-in 0.2s ease;
}
@keyframes channels-fade-in {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
.channels-menu-overlay {
position: fixed;
inset: 0;
z-index: 45;
background: transparent;
}
.channel-menu-wrap--portal {
position: fixed;
right: auto;
top: auto;
z-index: 46;
}
.channels-search-suggest {
max-height: 172px;
overflow-y: auto;
border: 1px solid rgba(150, 174, 224, 0.3);
border-radius: 12px;
background: rgba(9, 18, 35, 0.94);
padding: 6px;
}
.channel-search-item {
width: 100%;
text-align: left;
border: 1px solid rgba(132, 162, 224, 0.28);
border-radius: 9px;
background: rgba(16, 30, 56, 0.78);
color: #e5eeff;
padding: 8px 10px;
cursor: pointer;
margin-bottom: 6px;
}
.channel-search-item:last-child {
margin-bottom: 0;
}
.channel-search-item:hover {
border-color: transparent;
color: #f3dca8;
}
/* ===== Final Glass Polish (channels) ===== */
.channels-screen {
color: rgba(255, 255, 255, 0.9);
}
.channels-screen::before {
background:
radial-gradient(600px 600px at 100% 0%, rgba(100, 60, 200, 0.12), transparent 70%),
radial-gradient(500px 500px at 0% 100%, rgba(40, 80, 200, 0.08), transparent 70%),
linear-gradient(180deg, #0a0b10 0%, #0a0b10 100%);
}
.channels-screen .card,
.channel-row,
.thread-node-card,
.thread-block,
.thread-summary {
background: rgba(20, 25, 35, 0.55);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 20px;
box-shadow: 0 0 60px rgba(80, 60, 180, 0.15);
}
.channel-row,
.channels-screen .channel-message-card,
.thread-node-card {
padding: 20px;
margin-bottom: 16px;
}
.channels-screen .channel-message-card,
.thread-node-card,
.thread-block,
.thread-summary,
.channel-row {
border-color: rgba(255, 255, 255, 0.07);
}
.channels-screen .channel-message-card,
.thread-node-card {
background: rgba(20, 25, 35, 0.55);
}
.channel-message-actions,
.thread-node-actions {
display: flex !important;
align-items: center;
justify-content: space-between;
gap: 8px;
flex-wrap: nowrap;
overflow-x: auto;
padding-top: 14px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.thread-node-actions .secondary-btn,
.channel-action-item {
display: inline-flex;
align-items: center;
gap: 5px;
background: none;
border: none;
color: rgba(255, 255, 255, 0.45);
font-size: 12px;
cursor: pointer;
padding: 0;
min-height: 0;
white-space: nowrap;
}
.channel-action-like.is-liked,
.thread-like-btn.is-liked {
color: rgba(255, 200, 50, 0.9);
}
.channel-action-item:hover,
.thread-node-actions .secondary-btn:hover {
color: rgba(255, 200, 50, 0.9);
}
.channels-tabs {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
}
.channels-tab-btn {
background: transparent;
border: none;
border-bottom: 2px solid transparent;
border-radius: 0;
color: rgba(255, 255, 255, 0.4);
}
.channels-tab-btn.is-active {
background: transparent;
border-bottom-color: transparent;
color: rgba(255, 200, 50, 0.9);
}
.channel-row .avatar {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
border-radius: 50%;
overflow: hidden;
color: #ffffff;
font-weight: 700;
}
.channel-row .avatar img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
object-position: center;
border-radius: 50%;
}
.channel-row-title {
color: #ffffff;
font-size: 17px;
font-weight: 800;
letter-spacing: 0.01em;
}
.channel-row-technical {
margin: -2px 0 0;
color: rgba(255, 255, 255, 0.46);
font-size: 11px;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.channel-row-message {
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
}
.channel-row-time {
color: rgba(255, 255, 255, 0.35);
font-size: 12px;
text-align: right;
width: 100%;
}
.channel-menu-trigger {
border: none;
background: none;
color: rgba(255, 255, 255, 0.4);
}
.channels-bottom-action,
.primary-btn.channel-main-action {
background: rgba(255, 180, 0, 0.12);
border: 1px solid transparent;
color: rgba(255, 200, 50, 0.9);
border-radius: 14px;
padding: 14px;
width: 100%;
}
.channel-head-card {
background: transparent !important;
border: none !important;
box-shadow: none !important;
padding: 0 !important;
margin-bottom: 6px !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
.channel-head-title,
.channel-head-meta {
line-height: 1.35;
font-family: inherit;
}
.channel-head-title {
color: rgba(255, 255, 255, 0.95);
font-size: 22px;
font-weight: 700;
text-align: center;
}
.channel-head-meta {
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
font-weight: 500;
text-align: center;
}
.channels-screen--thread .channels-user-chip {
background: transparent !important;
border: none !important;
box-shadow: none !important;
padding: 0 !important;
margin-bottom: 0 !important;
color: rgba(255, 255, 255, 0.35);
min-height: 0;
font-size: 12px;
}
.channels-screen--thread .page-title {
color: rgba(255, 255, 255, 0.95);
font-weight: 700;
}
.channels-screen--thread .page-header.channel-thread-topbar {
display: flex;
align-items: center;
gap: 8px;
}
.channels-screen--thread .page-header.channel-thread-topbar .page-title,
.channels-screen--thread .page-header.channel-thread-topbar .header-actions {
display: none;
}
.channels-screen--thread .page-header.channel-thread-topbar .header-left {
min-width: 0;
width: 100%;
flex: 1 1 auto;
gap: 8px;
flex-wrap: nowrap;
}
.channels-screen--channel .page-header .icon-btn,
.channels-screen--thread .page-header .icon-btn {
border: none;
background: none;
color: rgba(255, 255, 255, 0.9);
box-shadow: none;
transform: translateY(-40%);
}
.channels-screen--thread .page-header.channel-thread-topbar .icon-btn {
transform: none;
flex: 0 0 auto;
}
.channels-screen--channel .page-header .channel-header-route-btn,
.channels-screen--thread .page-header .channel-header-route-btn {
border: 1px solid rgba(146, 173, 229, 0.38);
background: linear-gradient(180deg, rgba(20, 37, 67, 0.9), rgba(13, 24, 47, 0.94));
color: #d9e6ff;
}
.channels-screen--thread .page-header.channel-thread-topbar .channel-header-route-btn {
min-width: 0;
flex: 1 1 auto;
justify-content: flex-start;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.channels-screen--channel .page-header .channel-header-entrypoint-btn {
border: 1px solid transparent;
background: linear-gradient(180deg, rgba(57, 74, 119, 0.34), rgba(18, 29, 54, 0.34));
color: #f1d99c;
border-radius: 10px;
min-height: 36px;
padding: 6px 10px;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.02em;
text-transform: uppercase;
transform: translateY(-40%);
}
.channels-screen--channel-about .screen-footer {
margin-top: auto;
padding: 8px 4px 0;
text-align: center;
font-size: 12px;
letter-spacing: 0.02em;
}
.entrypoint-history-list {
display: grid;
gap: 10px;
max-height: min(58vh, 30rem);
overflow: auto;
}
.entrypoint-history-item {
appearance: none;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 14px;
background: rgba(17, 24, 39, 0.72);
color: #eef3ff;
display: grid;
gap: 4px;
padding: 12px 13px;
text-align: left;
}
.entrypoint-history-item strong {
color: #f1d99c;
font-size: 13px;
}
.entrypoint-history-item span {
color: rgba(188, 208, 244, 0.74);
font-size: 12px;
}
.entrypoint-history-item p {
margin: 0;
color: #f5f8ff;
font-size: 13px;
line-height: 1.4;
white-space: pre-wrap;
word-break: break-word;
}
.channel-head-actions .secondary-btn {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.12);
color: rgba(255, 255, 255, 0.6);
border-radius: 12px;
padding: 10px 16px;
}
.thread-block--replies > .section-title {
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
font-weight: 500;
margin: 0 0 2px;
}
.channels-empty-state--compact .meta-muted {
color: rgba(255, 255, 255, 0.4);
text-align: center;
font-style: italic;
}
#about-channel-modal.modal,
#edit-channel-modal.modal,
#reply-modal.modal,
#channel-message-modal.modal,
#channel-edit-description-modal.modal,
#channels-subscribe-modal.modal,
#thread-reply-modal.modal {
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
#about-channel-modal .modal-card,
#edit-channel-modal .modal-card,
#reply-modal .modal-card,
#channel-message-modal .modal-card,
#channel-edit-description-modal .modal-card,
#channels-subscribe-modal .modal-card,
#thread-reply-modal .modal-card {
background: rgba(15, 18, 30, 0.92);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
border: 1px solid transparent;
border-radius: 20px;
padding: 24px;
}
#about-channel-modal .modal-title,
#edit-channel-modal .modal-title,
#reply-modal .modal-title,
#channel-message-modal .modal-title,
#channel-edit-description-modal .modal-title,
#channels-subscribe-modal .modal-title,
#thread-reply-modal .modal-title {
color: rgba(255, 200, 50, 0.95);
font-size: 18px;
font-weight: 700;
margin-bottom: 16px;
}
#about-channel-modal .input,
#edit-channel-modal .input,
#reply-modal .input,
#channel-message-modal .input,
#channel-edit-description-modal .input,
#channels-subscribe-modal .input,
#thread-reply-modal .input {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
color: #ffffff;
padding: 12px 16px;
font-size: 14px;
resize: vertical;
width: 100%;
}
#channel-edit-description-counter,
#channel-edit-description-modal #channel-description-counter {
color: rgba(255, 255, 255, 0.35);
font-size: 12px;
}
#about-channel-modal .secondary-btn,
#edit-channel-modal .secondary-btn,
#reply-modal .secondary-btn,
#channel-message-modal .secondary-btn,
#channel-edit-description-modal .secondary-btn,
#channels-subscribe-modal .secondary-btn,
#thread-reply-modal .secondary-btn {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.12);
color: rgba(255, 255, 255, 0.6);
border-radius: 12px;
padding: 13px 24px;
}
#about-channel-modal .primary-btn,
#edit-channel-modal .primary-btn,
#reply-modal .primary-btn,
#channel-message-modal .primary-btn,
#channel-edit-description-modal .primary-btn,
#channels-subscribe-modal .primary-btn,
#thread-reply-modal .primary-btn {
background: rgba(255, 180, 0, 0.15);
border: 1px solid transparent;
color: rgba(255, 200, 50, 0.95);
border-radius: 12px;
padding: 13px 24px;
font-weight: 600;
}
/* ===== Direct Messages Glass Theme (DM-only) ===== */
.dm-screen {
position: relative;
isolation: isolate;
background: #05070A;
color: rgba(255, 255, 255, 0.9);
min-height: 100%;
align-content: start;
}
.dm-screen::before {
content: "";
position: absolute;
inset: -12px -12px 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(260px 260px at 86% 10%, rgba(147, 112, 219, 0.25), transparent 72%),
radial-gradient(220px 220px at 14% 84%, rgba(147, 112, 219, 0.2), transparent 72%),
radial-gradient(220px 220px at 76% 68%, rgba(212, 175, 55, 0.16), transparent 75%),
radial-gradient(190px 190px at 26% 20%, rgba(212, 175, 55, 0.12), transparent 74%),
#05070A;
animation: dm-orbs-drift 16s ease-in-out infinite alternate;
}
.screen-content .dm-screen {
min-height: 100%;
}
@keyframes dm-orbs-drift {
from { transform: translate3d(0, 0, 0) scale(1); }
to { transform: translate3d(0, -8px, 0) scale(1.02); }
}
.dm-screen .page-header {
position: sticky;
top: 0;
z-index: 12;
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-bottom: 1px solid transparent;
background: rgba(10, 12, 18, 0.72);
}
.dm-screen .page-title {
color: rgba(255, 255, 255, 0.95);
}
.dm-dialog-card {
position: relative;
display: grid;
grid-template-columns: 60px minmax(0, 1fr) auto;
gap: 12px;
align-items: center;
min-height: 74px;
padding: 10px 12px 10px 10px;
border-radius: 26px;
background: rgba(7, 10, 18, 0.88);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
border: 1px solid rgba(140, 99, 255, 0.32); /* оконтовка = цвет линии связи; default = violet (контакт) */
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.42);
cursor: pointer;
}
.dm-dialog-card:focus-visible { outline: 2px solid var(--rel-link); outline-offset: 2px; }
.dm-card--family { border-color: transparent; } /* линия связи: gold (семья) */
.dm-card--shining { border-color: rgba(104, 216, 255, 0.45); } /* линия связи: cyan (сияющий) */
.dm-screen .list-item .avatar {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
border-radius: 50%;
border: 1px solid transparent;
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));
color: #ffffff;
font-weight: 700;
}
.dm-screen .list-item {
align-items: stretch;
}
.dm-screen .meta-muted {
color: rgba(255, 255, 255, 0.5);
}
/* ===== «Личные сообщения» v2 — списочная форма «Связей» ===== */
/* Токены-мост: НЕ придумываем цвета, наследуем канонический язык «Связей» (network-graph.css :root). */
.dm-screen {
--dm-tone-default: var(--rel-contact);
--dm-tone-family: var(--rel-family);
--dm-tone-shining: var(--rel-shining);
}
/* DM-шапка через grid 1fr auto 1fr: бренд слева, title строго по центру, «+» справа. */
.dm-head {
position: sticky; top: 0; z-index: 12;
display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 8px;
padding: 14px 14px 0;
backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px);
background: linear-gradient(180deg, rgba(10,12,18,0.82), rgba(10,12,18,0.0));
}
.dm-head-brand { display: flex; align-items: center; gap: 8px; min-width: 0; }
.dm-head-logo-wrap { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; flex: 0 0 auto; }
.dm-head-logo {
width: 36px;
height: 36px;
object-fit: contain;
display: block;
filter: drop-shadow(0 0 7px rgba(71, 196, 255, 0.38));
}
.dm-head-id { min-width: 0; display: grid; }
.dm-head-name { font-size: 15px; font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dm-head-sub { font-size: 11px; color: rgba(244, 246, 255, 0.48); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dm-head-title { font-size: 18px; font-weight: 700; color: var(--text); white-space: nowrap; text-align: center; padding: 0 6px; }
.dm-list-screen .dm-head-title { color: #FCEAC0; text-shadow: 0 0 6px rgba(240, 184, 46, 0.32), 0 0 14px rgba(240, 184, 46, 0.12); }
/* Центр шапки — светящийся бренд «Shine» */
.dm-head-shine {
font-size: 21px; letter-spacing: 0.6px; color: #FCEAC0;
text-shadow: 0 0 6px rgba(240, 184, 46, 0.55), 0 0 16px rgba(240, 184, 46, 0.38), 0 0 30px rgba(240, 184, 46, 0.20);
animation: dm-shine-pulse 3.4s ease-in-out infinite;
}
@keyframes dm-shine-pulse {
0%, 100% { text-shadow: 0 0 5px rgba(240, 184, 46, 0.42), 0 0 12px rgba(240, 184, 46, 0.26), 0 0 22px rgba(240, 184, 46, 0.12); }
50% { text-shadow: 0 0 9px rgba(240, 184, 46, 0.68), 0 0 20px rgba(240, 184, 46, 0.46), 0 0 34px rgba(240, 184, 46, 0.26); }
}
@media (prefers-reduced-motion: reduce) { .dm-head-shine { animation: none; } }
.dm-head-plus {
justify-self: end; width: 48px; height: 48px; border-radius: 50%;
display: grid; place-items: center; font-size: 24px; line-height: 1; font-weight: 300;
color: #FFD98A; border: 1.5px solid transparent;
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);
cursor: pointer;
}
.dm-divider { position: relative; height: 18px; margin: 6px 14px 8px; }
.dm-divider::before { content: ''; position: absolute; left: 0; right: 0; top: 50%; height: 1px; background: linear-gradient(90deg, transparent, rgba(240, 184, 46, 0.5), transparent); }
.dm-divider::after { content: ''; position: absolute; left: 50%; top: 50%; width: 6px; height: 6px; transform: translate(-50%, -50%) rotate(45deg); background: var(--rel-family); box-shadow: 0 0 8px var(--rel-family-glow); }
/* список: скролл внутри контента, карточки не ужимаем, отступ снизу под bottom nav (86px) + 16px */
.dm-list { display: flex; flex-direction: column; gap: 8px; padding: 0 6px; padding-bottom: calc(86px + 16px); }
/* текст карточки */
.dm-row-main { min-width: 0; }
.dm-row-titleline { display: flex; align-items: center; gap: 6px; min-width: 0; }
.dm-row-titlewrap { flex-wrap: wrap; row-gap: 6px; }
.dm-dialog-card .dm-row-title { font-size: 16px; font-weight: 600; color: var(--text); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dm-dialog-card .dm-row-last-message { font-size: 14px; color: rgba(244, 246, 255, 0.48); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dm-contact-note {
display: inline-flex;
align-items: center;
min-height: 22px;
padding: 0 8px;
border-radius: 999px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.05);
color: rgba(244, 246, 255, 0.62);
font-size: 11px;
font-weight: 600;
white-space: nowrap;
}
/* галочка-подтверждён у имени (золотая, без слова «Подтверждён») */
.dm-name-check { display: inline-flex; flex: 0 0 auto; color: var(--rel-family); }
.dm-name-check svg { width: 16px; height: 16px; }
/* AvatarRing — обод/свечение по тону (адаптация орбов «Связей», без тяжёлой магии) */
.dm-av { width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center; position: relative; }
.dm-av .avatar { width: 40px; height: 40px; min-width: 40px; min-height: 40px; border: none; box-shadow: none; }
/* Цветные обводки вокруг аватаров (violet/gold) убраны по просьбе. Свечение оставляем только у сияющих (ниже). */
.dm-av--default { box-shadow: none; }
.dm-av--family { box-shadow: none; }
/* Сияющий аватар = АДАПТАЦИЯ сияющего узла экрана «Связи»: та же небесная палитра, тот же небесный rim,
тот же двойной «дышащий» пульс. Переиспользуем ОБЩИЕ keyframes графа (fg-shine-glow — пульс box-shadow,
fg-shine-halo — дыхание радиального ореола; объявлены в network-graph.css, грузится глобально), а не рисуем
второй похожий эффект. Радиальный ореол повторяет стопы узла графа; SVG-фильтр #fg-shine-glow есть только на
стр. «Связи», поэтому здесь мягкий CSS-blur. Мини-сфера компактная — не размывает текст/соседей. */
.dm-av--shining {
border: 1px solid rgba(150, 240, 255, 0.62);
animation: fg-shine-glow 3.6s ease-in-out infinite;
}
.dm-av--shining::before {
content: ''; position: absolute; inset: -12px; border-radius: 50%; z-index: -1; pointer-events: none;
background: radial-gradient(circle, rgba(140, 240, 255, 0.5) 0%, rgba(130, 235, 255, 0.18) 46%, rgba(130, 235, 255, 0) 72%);
filter: blur(3.4px); /* = stdDeviation 3.4 SVG-фильтра #fg-shine-glow графа; геометрия inset −12px тоже как у узла (58px↔56px, scale≈1) */
animation: fg-shine-halo 3.6s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
.dm-av--shining { animation: none; }
.dm-av--shining::before { animation: none; }
}
.dm-row-meta-col {
display: inline-flex;
min-width: 0;
align-self: stretch;
flex-direction: column;
align-items: flex-end;
justify-content: space-between;
gap: 4px;
}
.dm-row-meta-line {
display: inline-flex;
align-items: center;
gap: 6px;
min-height: 24px;
}
.dm-row-meta-spacer {
width: 24px;
height: 24px;
}
.dm-row-time {
font-size: 12px;
font-weight: 600;
color: rgba(244, 246, 255, 0.44);
}
.dm-row-time--empty {
width: 0;
min-width: 0;
overflow: hidden;
}
/* непрочитанные — отдельная violet-сфера (НЕ изумруд) */
.dm-unread-badge {
min-width: 24px; height: 24px; padding: 0 7px; border-radius: 12px;
display: inline-flex; align-items: center; justify-content: center;
font-size: 12px; font-weight: 700; color: var(--text);
background: rgba(140, 99, 255, 0.16); border: 1px solid rgba(140, 99, 255, 0.55);
}
.dm-chevron { display: inline-flex; color: rgba(244, 246, 255, 0.32); }
.dm-chevron svg { width: 16px; height: 16px; }
@media (max-width: 380px) {
.dm-dialog-card {
grid-template-columns: 60px minmax(0, 1fr);
row-gap: 10px;
}
.dm-row-meta-col {
grid-column: 2;
justify-self: end;
}
}
/* Значок «связь через кого» — ТОЛЬКО иконка (кликабельная); детали пути в попапе ниже */
.dm-via {
display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
width: 24px; height: 24px; padding: 0; border-radius: 8px; cursor: pointer;
color: var(--rel-link); border: 1px solid rgba(25, 229, 138, 0.5); background: rgba(25, 229, 138, 0.08);
}
.dm-via-icon { display: inline-flex; }
.dm-via-icon svg { width: 14px; height: 14px; }
/* попап пути связи: Ты → …посредники… → он; узлы = аватар+имя, кликабельные → профиль */
.dm-via-path {
display: none; position: absolute; left: 14px; right: 14px; top: 46px; z-index: 6;
flex-wrap: wrap; align-items: center; gap: 6px; padding: 9px 11px; border-radius: 12px;
background: rgba(8, 12, 20, 0.97); border: 1px solid rgba(25, 229, 138, 0.35);
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.55);
}
.dm-via-path.is-open { display: flex; }
.dm-via-node {
display: inline-flex; align-items: center; gap: 5px; padding: 3px 7px 3px 4px; border-radius: 11px;
background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.08);
color: var(--text); font-size: 12px; cursor: default;
}
button.dm-via-node { cursor: pointer; }
button.dm-via-node:hover { border-color: rgba(25, 229, 138, 0.5); }
.dm-via-node-ava { width: 20px; height: 20px; border-radius: 50%; overflow: hidden; flex: 0 0 auto; }
.dm-via-node-ava .avatar { width: 20px; height: 20px; min-width: 20px; min-height: 20px; border: none; box-shadow: none; }
.dm-via-node-ava .avatar-fallback { font-size: 9px; font-weight: 700; }
.dm-via-me { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; background: linear-gradient(150deg, #F0B82E, #D49F22); color: #1a1205; font-size: 10px; font-weight: 700; }
.dm-via-node-name { white-space: nowrap; }
.dm-via-arrow { font-size: 12px; color: rgba(25, 229, 138, 0.8); }
/* Горизонтальный overflow: орб-ореол .dm-screen::before выходит на 12px по бокам (inset -12px) и
даёт лишний скролл. Фон НЕ меняем — клиппим overflow на уровне страницы (как просит ТЗ, п.4). */
html, body { overflow-x: hidden; }
.dm-chat-wrap {
gap: 12px;
}
.dm-chat-screen {
display: flex;
flex-direction: column;
min-height: 0;
gap: 12px;
}
.dm-chat-screen > .dm-chat-wrap {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
}
.dm-chat-composer {
position: sticky;
bottom: 0;
z-index: 12;
flex: 0 0 auto;
}
.screen-content:has(> .dm-chat-screen) {
display: flex;
flex-direction: column;
overflow: hidden;
}
.screen-content:has(> .dm-chat-screen) > .dm-chat-screen {
flex: 1 1 auto;
min-height: 0;
}
.screen-content:has(> .dm-screen) {
scrollbar-width: none;
-ms-overflow-style: none;
}
.screen-content:has(> .dm-screen)::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.screen-content:has(> .dm-chat-screen) {
padding-top: 0;
padding-bottom: 0;
scrollbar-width: none;
-ms-overflow-style: none;
}
.screen-content:has(> .dm-chat-screen)::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.dm-messages-log {
gap: 10px;
}
.dm-add-contact-card {
margin: 0 14px 2px;
}
.dm-add-contact-card .secondary-btn {
width: 100%;
}
.dm-history-loader {
position: sticky;
top: 0;
z-index: 3;
display: flex;
justify-content: center;
pointer-events: none;
margin-bottom: -4px;
opacity: 0;
transform: translateY(-8px);
transition: opacity 160ms ease, transform 160ms ease;
}
.dm-history-loader[hidden] {
display: none;
}
.dm-history-loader.is-visible {
opacity: 1;
transform: translateY(0);
}
.dm-history-loader__pill {
display: inline-flex;
align-items: center;
gap: 10px;
min-height: 34px;
padding: 7px 14px;
border-radius: 999px;
border: 1px solid transparent;
background: rgba(9, 15, 26, 0.92);
color: rgba(245, 226, 179, 0.96);
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.28);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
}
.dm-history-loader__label {
font-size: 12px;
font-weight: 600;
letter-spacing: 0.02em;
}
.dm-history-loader__spinner {
width: 16px;
height: 16px;
border-radius: 50%;
border: 2px solid transparent;
border-top-color: transparent;
box-shadow: 0 0 10px rgba(212, 175, 55, 0.18);
animation: dm-history-loader-spin 0.85s linear infinite;
}
@keyframes dm-history-loader-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.dm-screen .bubble {
max-width: 78%;
padding: 11px 14px;
line-height: 1.42;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.32);
}
.dm-screen .bubble.in {
justify-self: start;
border-radius: 18px 18px 18px 4px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(20, 25, 35, 0.58);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
}
.dm-screen .bubble.out {
justify-self: end;
border-radius: 18px 18px 4px 18px;
border: 1px solid rgba(83, 216, 251, 0.4);
background: rgba(83, 216, 251, 0.16);
color: rgba(225, 248, 255, 0.97);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
}
.dm-chat-input {
gap: 10px;
grid-template-columns: minmax(0, 1fr) auto;
align-items: end;
position: relative;
z-index: 10;
margin-inline: 0;
padding: 10px 0;
border-top: 1px solid transparent;
background: rgba(8, 12, 20, 0.9);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.dm-edit-banner {
grid-column: 1 / -1;
display: grid;
grid-template-columns: 1fr auto;
align-items: start;
gap: 10px;
padding: 10px 12px;
border-radius: 14px;
border: 1px solid transparent;
background: rgba(212, 175, 55, 0.12);
color: rgba(255, 233, 176, 0.96);
box-shadow: 0 10px 22px rgba(0, 0, 0, 0.22);
}
.dm-edit-banner[hidden] {
display: none;
}
.dm-edit-banner__text {
min-width: 0;
font-size: 12px;
line-height: 1.35;
white-space: pre-line;
overflow: hidden;
}
.dm-edit-banner__close {
min-width: 30px;
width: 30px;
height: 30px;
padding: 0;
border-radius: 10px;
}
.dm-actions-col {
display: grid;
grid-template-columns: repeat(2, 46px);
grid-template-rows: 46px;
grid-template-areas: "emoji send";
gap: 6px;
align-self: end;
}
.dm-chat-input--multiline .dm-actions-col {
grid-template-columns: 46px;
grid-template-rows: repeat(2, 46px);
grid-template-areas:
"emoji"
"send";
}
.dm-emoji-btn {
grid-area: emoji;
min-width: 46px;
width: 46px;
padding: 0;
line-height: 1;
}
.dm-emoji-btn__glyph {
display: inline-grid;
place-items: center;
width: 100%;
height: 100%;
font-size: 27px;
line-height: 1;
}
.emoji-picker-slot {
grid-column: 1 / -1;
}
.emoji-picker-slot[hidden] {
display: none;
}
.emoji-picker {
display: grid;
gap: 8px;
max-height: min(40vh, 292px);
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
padding: 10px;
border-radius: 14px;
background: rgba(12, 19, 31, 0.98);
box-shadow: 0 -10px 24px rgba(0, 0, 0, 0.2);
}
.emoji-picker::-webkit-scrollbar,
.emoji-picker-tabs::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.emoji-picker-section {
display: grid;
gap: 6px;
}
.emoji-picker-section-title {
color: rgba(205, 218, 246, 0.78);
font-size: 12px;
font-weight: 600;
}
.emoji-picker-tabs {
display: flex;
gap: 4px;
overflow-x: auto;
padding-bottom: 2px;
scrollbar-width: none;
-ms-overflow-style: none;
}
.emoji-picker-tab {
flex: 0 0 38px;
width: 38px;
}
.emoji-picker-tab,
.emoji-picker-item {
border: 0;
background: transparent;
box-shadow: none;
color: inherit;
cursor: pointer;
appearance: none;
-webkit-appearance: none;
-webkit-tap-highlight-color: transparent;
}
.emoji-picker-tab {
min-height: 34px;
border-radius: 8px;
font-size: 19px;
}
.emoji-picker-tab.is-active {
background: rgba(212, 175, 55, 0.16);
}
.emoji-picker-grid {
display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr));
gap: 3px;
}
.emoji-picker-item {
min-height: 38px;
border-radius: 8px;
font-size: 24px;
line-height: 1;
}
.emoji-picker-tab:focus,
.emoji-picker-item:focus {
outline: none;
box-shadow: none;
}
.emoji-picker-tab:active,
.emoji-picker-item:active {
background: transparent;
box-shadow: none;
transform: none;
}
.emoji-picker-tab:focus-visible,
.emoji-picker-item:focus-visible {
outline: 2px solid rgba(166, 218, 255, 0.8);
outline-offset: 2px;
background: transparent;
box-shadow: none;
}
.twemoji,
.emoji-picker-preview {
display: inline-grid;
place-items: center;
width: 1em;
height: 1em;
vertical-align: -0.12em;
}
.twemoji-image {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
pointer-events: none;
}
.twemoji.is-error .twemoji-image,
.emoji-picker-preview.is-error .twemoji-image {
visibility: hidden;
}
.bubble.bubble--emoji-only,
.dm-screen .bubble.bubble--emoji-only {
padding: 0;
border: 0;
background: transparent;
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
color: inherit;
}
.bubble.bubble--emoji-only.in,
.dm-screen .bubble.bubble--emoji-only.in,
.bubble.bubble--emoji-only.out,
.dm-screen .bubble.bubble--emoji-only.out {
border: 0;
background: transparent;
}
.bubble.bubble--emoji-only .bubble-meta {
margin-top: 2px;
padding: 0 4px;
color: rgba(198, 214, 247, 0.72);
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
.bubble-text--twemoji-only {
font-size: 56px;
line-height: 1;
}
.bubble-text--twemoji-only .chat-twemoji {
width: 1em;
height: 1em;
}
.dm-chat-input .dm-input {
min-height: 42px;
max-height: 180px;
width: 100%;
min-width: 0;
resize: none;
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
line-height: 1.35;
padding: 10px 12px;
}
.dm-chat-input--multiline .dm-input {
padding-right: 14px;
}
.dm-chat-input .dm-input::-webkit-scrollbar {
width: 0;
height: 0;
}
.dm-screen .input,
.dm-input {
background: rgba(255, 255, 255, 0.04);
border: 1px solid transparent;
border-radius: 14px;
color: rgba(255, 255, 255, 0.92);
}
.dm-input::placeholder {
color: rgba(255, 255, 255, 0.42);
}
.dm-send-btn {
background: rgba(212, 175, 55, 0.2);
border: 1px solid transparent;
color: rgba(255, 217, 128, 0.98);
border-radius: 14px;
font-weight: 700;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
}
.dm-send-icon-btn {
grid-area: send;
min-width: 46px;
width: 46px;
padding: 0;
font-size: 15px;
line-height: 1;
}
.dm-message-actions-menu {
width: min(72vw, 220px);
padding: 10px;
gap: 8px;
border-radius: 16px;
border: 1px solid transparent;
background: rgba(10, 12, 18, 0.96);
backdrop-filter: blur(22px);
-webkit-backdrop-filter: blur(22px);
}
.dm-floating-menu-layer {
position: fixed;
inset: 0;
z-index: 120;
pointer-events: none;
}
.dm-message-actions-popover {
position: fixed;
left: 12px;
top: 12px;
margin: 0;
pointer-events: auto;
opacity: 0;
transform: translateY(8px) scale(0.98);
transition: opacity 120ms ease, transform 120ms ease;
box-shadow: 0 18px 34px rgba(0, 0, 0, 0.42);
}
.dm-message-actions-popover.is-visible {
opacity: 1;
transform: translateY(0) scale(1);
}
.dm-message-action-btn {
width: 100%;
min-height: 42px;
justify-content: flex-start;
padding: 0 14px;
border-radius: 12px;
}
.dm-message-action-btn--danger {
color: rgba(255, 182, 182, 0.98);
border-color: rgba(255, 120, 120, 0.3);
background: rgba(112, 28, 28, 0.22);
}
.dm-confirm-check {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 10px 12px;
border-radius: 14px;
background: rgba(17, 26, 46, 0.62);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #d9e6ff;
font-size: 14px;
}
.dm-confirm-check input {
margin-top: 2px;
}
.dm-screen .dm-list > .card.meta-muted {
width: calc(100% - 40px);
margin: 0 20px;
padding: 14px 16px;
border-radius: 14px;
background: rgba(18, 24, 38, 0.42);
backdrop-filter: blur(25px);
-webkit-backdrop-filter: blur(25px);
border: 1px solid transparent;
color: rgba(225, 233, 248, 0.86);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
/* ===== Channels list tabs: match toolbar active button background ===== */
.channels-screen--list .channels-tabs {
background:
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));
border: 1px solid transparent;
box-shadow: 0 18px 32px rgba(2, 6, 13, 0.48);
}
.channels-screen--list .channels-tab-btn {
color: #b8c7ea;
border-radius: 12px;
border: 1px solid transparent;
background: transparent;
}
.channels-screen--list .channels-tab-btn.is-active {
background:
linear-gradient(145deg, rgba(220, 181, 94, 0.32), rgba(39, 66, 122, 0.3)),
rgba(20, 35, 64, 0.62);
border: 1px solid transparent;
color: #f7e2ad;
box-shadow: inset 0 1px 0 rgba(255, 242, 204, 0.42);
}
/* ===== SHiNE Web3 Glassmorphism polish ===== */
.channels-screen {
color: rgba(255, 255, 255, 0.9);
}
.channels-screen--list .channels-tabs,
.channels-screen--list .channel-row,
.channels-screen--list .channels-status,
.channels-screen--list .channels-empty-state,
.channels-screen--list .channels-bottom-action {
background: rgba(18, 24, 38, 0.4);
backdrop-filter: blur(25px);
-webkit-backdrop-filter: blur(25px);
border: 1px solid transparent;
border-radius: 20px;
}
.channels-screen--list .channels-tabs,
.channels-screen--list .channel-row,
.channels-screen--list .channels-empty-state,
.channels-screen--list .channels-status,
.channels-screen--list .channels-bottom-action {
margin-left: 24px;
margin-right: 24px;
}
.channels-screen--list .channels-top-bar {
margin-left: 24px;
margin-right: 24px;
margin-top: 16px;
margin-bottom: 12px;
}
.channels-screen--list .channel-row {
margin-top: 16px;
margin-bottom: 16px;
}
.channels-screen--list .channels-tabs {
margin-top: 16px;
margin-bottom: 12px;
}
.channels-screen--list .channels-tab-btn {
background: transparent;
border: 1px solid transparent;
color: rgba(255, 255, 255, 0.66);
text-shadow: none;
}
.channels-screen--list .channels-tab-btn.is-active {
background:
linear-gradient(145deg, rgba(212, 175, 55, 0.22), rgba(68, 92, 171, 0.2)),
rgba(18, 24, 38, 0.44);
border: 1px solid transparent;
color: #D4AF37;
text-shadow: 0 0 10px rgba(212, 175, 55, 0.6);
box-shadow: inset 0 1px 0 rgba(255, 238, 197, 0.3);
}
.channels-screen--list .channels-tab-btn.is-disabled {
text-decoration: line-through;
text-decoration-thickness: 1.5px;
opacity: 0.72;
}
.toolbar {
background: transparent;
backdrop-filter: none;
-webkit-backdrop-filter: none;
border: 1px solid transparent;
border-radius: 20px;
}
.toolbar-btn.active {
background: transparent !important;
border-color: transparent !important;
box-shadow: none !important;
color: #D4AF37;
}
.toolbar-btn.active span:first-child {
color: #D4AF37;
filter: drop-shadow(0 0 10px rgba(212, 175, 55, 0.6));
}
.toolbar-btn.active span:last-child {
color: #D4AF37;
text-shadow: 0 0 10px rgba(212, 175, 55, 0.6);
}
.registration-toggle {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 14px;
border-radius: 14px;
border: 1px solid rgba(132, 162, 228, 0.22);
background: rgba(20, 31, 52, 0.72);
color: #eef3ff;
line-height: 1.4;
}
.registration-toggle input {
width: 18px;
height: 18px;
accent-color: #d4af37;
}
.registration-words-block[hidden] {
display: none;
}
.registration-words-block {
display: grid;
gap: 10px;
}
.registration-words-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
}
.registration-word-row {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
align-items: center;
gap: 8px;
}
.registration-word-number {
font-size: 12px;
color: #b2c2e6;
min-width: 18px;
text-align: right;
}
.registration-word-input {
min-height: 44px;
padding-left: 10px;
}
.registration-faq-card {
gap: 12px;
}
.registration-faq-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
}
.registration-faq-grid .ghost-btn,
.registration-faq-grid .secondary-btn {
min-height: 44px;
text-align: left;
}
@media (max-width: 740px) {
.registration-words-grid,
.registration-faq-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 460px) {
.registration-words-grid,
.registration-faq-grid {
grid-template-columns: minmax(0, 1fr);
}
}
.registration-faq-hero {
gap: 12px;
}
.registration-faq-topic {
gap: 12px;
}
.registration-faq-title {
margin: 0;
font-size: 22px;
line-height: 1.2;
color: #f6deb0;
}
.registration-password-toggle {
width: 44px;
height: 44px;
min-width: 44px;
min-height: 44px;
border-radius: 14px;
}
.registration-progress {
width: 100%;
height: 10px;
border: 1px solid rgba(180, 180, 180, 0.5);
border-radius: 6px;
overflow: hidden;
}
.registration-progress-bar {
height: 100%;
width: 0%;
background: rgba(80, 160, 255, 0.9);
transition: width 180ms linear;
}
/* Неоновые PNG-иконки вкладок (свечение запечено в PNG). Цвет доп.свечения — var --tab-glow (инлайн на img). */
.toolbar-icon-img {
--tab-icon-size: 27px; /* крупнее (бар-иконки); герой ниже ещё больше */
width: var(--tab-icon-size);
height: var(--tab-icon-size);
object-fit: contain;
display: block;
transition: transform .12s ease, filter .15s ease;
}
/* Активная вкладка — лёгкое доп. свечение (подпись подсвечивается правилом .active span:last-child выше). */
.toolbar-btn.active .toolbar-icon-img {
filter: drop-shadow(0 0 5px var(--tab-glow)) brightness(1.08);
}
/* Нажатие — вдавливание + краткая вспышка свечения; на отпускании возврат. */
.toolbar-btn:active .toolbar-icon-img {
transform: scale(0.9);
filter: drop-shadow(0 0 9px var(--tab-glow)) brightness(1.2);
}
/* «Связи» — герой: крупнее и всегда чуть светится сильнее остальных; press-feedback ярче. */
.toolbar-btn-hero .toolbar-icon-img {
/* Крупнее ВИЗУАЛЬНО через transform (origin center) — раскладочный размер как у остальных (27px),
поэтому иконка остаётся на одной линии с другими, а не задирается вверх. */
transform: scale(1.63); /* ≈44px при базовых 27px */
filter: brightness(1.05); /* CSS-ореол убран — светится только сама PNG (логотип не тронут) */
}
.toolbar-btn-hero.active .toolbar-icon-img {
filter: brightness(1.12);
}
.toolbar-btn-hero:active .toolbar-icon-img {
transform: scale(1.47); /* 1.63 × 0.9 (нажатие) */
filter: brightness(1.25); /* нажатие — только подсветление, без ореола */
}
.toolbar-channels-hold-overlay {
position: fixed;
z-index: 1200;
transform: translate(-50%, -100%);
display: grid;
grid-template-columns: repeat(3, minmax(68px, 1fr));
gap: 6px;
padding: 8px;
border-radius: 10px;
background: rgba(15, 18, 31, 0.94);
border: 1px solid rgba(160, 175, 220, 0.35);
box-shadow: 0 16px 32px rgba(0, 0, 0, 0.35);
}
.toolbar-channels-hold-item {
border: 1px solid rgba(160, 175, 220, 0.35);
border-radius: 8px;
background: rgba(255, 255, 255, 0.06);
color: #e9efff;
font-size: 12px;
line-height: 1.2;
min-height: 34px;
padding: 6px 8px;
transition: background-color 0.12s ease, border-color 0.12s ease;
}
.toolbar-channels-hold-item.is-active {
background: rgba(133, 170, 255, 0.34);
border-color: rgba(197, 219, 255, 0.75);
}
/* ===== Targeted UI touchups (requested) ===== */
.channels-screen--list .channel-row .avatar,
.profile-screen .avatar-xl,
.profile-screen .avatar.large {
position: relative;
border-radius: 50%;
overflow: hidden;
border: 1px solid rgba(130, 198, 255, 0.62);
background:
radial-gradient(circle at 30% 28%, rgba(161, 204, 255, 0.95), rgba(89, 141, 220, 0.92) 46%, rgba(32, 71, 136, 0.95) 72%, rgba(20, 48, 99, 0.98) 100%);
color: #f3f8ff;
box-shadow:
inset 0 1px 0 rgba(240, 248, 255, 0.6),
inset 0 -10px 18px rgba(12, 33, 72, 0.5),
0 0 0 2px rgba(72, 155, 248, 0.28),
0 12px 24px rgba(8, 24, 55, 0.42);
}
.channels-screen--list .channel-row .avatar::after,
.profile-screen .avatar-xl::after,
.profile-screen .avatar.large::after {
content: "";
position: absolute;
top: 14%;
left: 18%;
width: 42%;
height: 28%;
border-radius: 50%;
background: radial-gradient(circle, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0) 72%);
pointer-events: none;
}
.channels-screen--add .page-header .icon-btn {
width: 42px;
min-width: 42px;
height: 42px;
padding: 0;
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.16);
background: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.86);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: 0 10px 22px rgba(4, 10, 24, 0.34);
}
.channels-screen--add .page-header .icon-btn:hover {
border-color: transparent;
color: rgba(255, 215, 126, 0.95);
background: rgba(255, 180, 0, 0.1);
transform: none;
}
.channels-screen--add #cancel-create-channel,
.channels-screen--add #submit-create-channel {
min-height: 50px;
border-radius: 14px;
font-weight: 700;
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
}
.channels-screen--add #cancel-create-channel {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.16);
color: rgba(255, 255, 255, 0.72);
}
.channels-screen--add #submit-create-channel {
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
border: 1px solid transparent;
color: rgba(255, 213, 118, 0.95);
}
.channels-screen--add #cancel-create-channel:hover,
.channels-screen--add #submit-create-channel:hover {
transform: none;
box-shadow: 0 0 22px rgba(212, 175, 55, 0.2), inset 0 0 8px rgba(212, 175, 55, 0.1);
}
.channel-create-avatar-head {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: 14px;
align-items: start;
}
.channel-create-avatar-side {
min-width: 0;
display: grid;
gap: 10px;
align-content: start;
}
.channel-create-avatar-status-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 10px;
align-items: start;
}
.channel-create-avatar-status {
min-width: 0;
}
.channel-avatar-status-text {
margin: 0;
color: rgba(255, 255, 255, 0.96);
font-weight: 500;
font-size: 12px;
line-height: 1.35;
}
.channel-avatar-status-line {
margin: 2px 0 0;
color: rgba(255, 255, 255, 0.96);
font-size: 12px;
line-height: 1.35;
}
.channel-avatar-txid {
margin: 0;
word-break: break-all;
color: rgba(255, 255, 255, 0.96);
font-size: 11px;
}
.channel-avatar-status-pending {
color: rgba(255, 255, 255, 0.82);
}
.channel-create-login-hint {
font-size: 11px;
line-height: 1.35;
}
.channel-link-preview {
min-height: 18px;
}
.channel-avatar-remove-btn {
width: 26px;
min-width: 26px;
height: 26px;
padding: 0;
border: 1px solid rgba(255, 107, 107, 0.75);
border-radius: 8px;
background: rgba(150, 18, 18, 0.3);
color: #ff8b8b;
font-weight: 700;
line-height: 1;
}
.channel-avatar-remove-btn:hover,
.channel-avatar-remove-btn:focus-visible {
background: rgba(180, 22, 22, 0.42);
box-shadow: 0 0 0 2px rgba(255, 107, 107, 0.16);
}
.channel-avatar-remove-btn[hidden] {
display: none;
}
@media (max-width: 420px) {
.channel-create-avatar-head {
grid-template-columns: 1fr;
}
}
/* ===== Final microinteractions: breathe cards + static energy buttons ===== */
@keyframes breatheCard {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-3px); }
}
@keyframes glareSweep {
0% { left: -150%; }
100% { left: 150%; }
}
@keyframes blurRevealMedium {
0% { filter: blur(0px); opacity: 1; color: inherit; }
40% { filter: blur(5px); opacity: 0; color: #D4AF37; }
100% { filter: blur(0px); opacity: 1; color: #D4AF37; }
}
/* 1) Minimal breathing only for content cards */
.channels-screen .channel-message-card,
.channels-screen .thread-node-card,
.channels-screen .thread-block,
.channels-screen .thread-summary,
.channels-screen--list .channel-row {
animation: breatheCard 8s ease-in-out infinite;
position: relative;
}
/* Keep card hover static so breathe is the only motion */
.channels-screen .channel-message-card:hover,
.channels-screen .thread-node-card:hover,
.channels-screen .thread-block:hover,
.channels-screen .thread-summary:hover,
.channels-screen--list .channel-row:hover {
transform: none;
}
/* Thread cards should stay fixed without breathing motion */
.channels-screen--thread .thread-node-card,
.channels-screen--thread .thread-block,
.channels-screen--thread .thread-summary {
animation: none !important;
}
/* 2) Static controls with energy + glass glare (no levitation) */
.channels-screen--list .channels-tab-btn,
.channels-screen--list .channels-bottom-action,
.channels-screen .channel-main-action,
.channels-screen .channel-back-btn,
.channels-screen .channel-head-actions .secondary-btn,
.channels-screen .channel-action-item {
position: relative;
overflow: hidden;
transition: box-shadow 0.75s ease-out, color 0.28s ease, border-color 0.28s ease, background 0.28s ease;
animation: none !important;
}
.channels-screen--list .channels-tab-btn:hover,
.channels-screen--list .channels-bottom-action:hover,
.channels-screen .channel-main-action:hover,
.channels-screen .channel-back-btn:hover,
.channels-screen .channel-head-actions .secondary-btn:hover,
.channels-screen .channel-action-item:hover {
box-shadow: 0 0 16px rgba(212, 175, 55, 0.22), inset 0 0 6px rgba(212, 175, 55, 0.07);
transform: none !important;
}
.channels-screen--list .channels-tab-btn::after,
.channels-screen--list .channels-bottom-action::after,
.channels-screen .channel-main-action::after,
.channels-screen .channel-back-btn::after,
.channels-screen .channel-head-actions .secondary-btn::after,
.channels-screen .channel-action-item::after {
content: "";
position: absolute;
top: 0;
left: -150%;
width: 50%;
height: 100%;
background: linear-gradient(
to right,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.1) 50%,
rgba(255, 255, 255, 0) 100%
);
transform: skewX(-25deg);
transition: none;
z-index: 1;
pointer-events: none;
}
.channels-screen--list .channels-tab-btn:hover::after,
.channels-screen--list .channels-bottom-action:hover::after,
.channels-screen .channel-main-action:hover::after,
.channels-screen .channel-back-btn:hover::after,
.channels-screen .channel-head-actions .secondary-btn:hover::after,
.channels-screen .channel-action-item:hover::after {
animation: glareSweep 1.6s cubic-bezier(0.22, 0.61, 0.36, 1) forwards;
}
/* 3) Medium blur-reveal for stats/counters */
.stat-blur-reveal {
animation: blurRevealMedium 1s cubic-bezier(0.4, 0, 0.2, 1) forwards;
display: inline-block;
}
/* ===== Channels CTA proportions fix ===== */
.channels-screen--list .channels-bottom-action {
display: block;
width: min(90%, 360px) !important;
max-width: 90%;
margin-left: auto !important;
margin-right: auto !important;
margin-top: 16px !important;
margin-bottom: 20px !important;
padding: 12px 24px !important;
box-sizing: border-box;
align-self: center;
}
/* ===== Profile glass style (same visual family as DM) ===== */
.profile-screen {
position: relative;
isolation: isolate;
background: #05070A;
color: rgba(255, 255, 255, 0.9);
min-height: 100%;
gap: 4px;
align-content: start;
grid-auto-rows: max-content;
}
.profile-screen::before {
content: "";
position: absolute;
inset: -12px -12px 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(260px 260px at 86% 10%, rgba(147, 112, 219, 0.22), transparent 72%),
radial-gradient(220px 220px at 14% 84%, rgba(147, 112, 219, 0.18), transparent 72%),
radial-gradient(220px 220px at 76% 68%, rgba(212, 175, 55, 0.14), transparent 75%),
radial-gradient(190px 190px at 26% 20%, rgba(212, 175, 55, 0.1), transparent 74%),
#05070A;
}
.profile-screen .card,
.profile-screen .profile-param-item,
.profile-screen .profile-relative-search-suggest {
background: rgba(20, 25, 35, 0.4);
backdrop-filter: blur(25px);
-webkit-backdrop-filter: blur(25px);
border: 1px solid transparent;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.37);
}
.profile-top-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.profile-top-action-btn {
position: relative;
width: 48px;
height: 48px;
min-width: 48px;
min-height: 48px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 15px;
}
.profile-top-icon-btn img {
width: 48px;
height: 48px;
display: block;
opacity: 0.94;
filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.34));
}
.profile-top-icon-btn.is-active {
border-color: transparent;
background: rgba(212, 175, 55, 0.12);
box-shadow: 0 10px 22px rgba(0, 0, 0, 0.22);
}
.profile-top-icon-btn:hover {
border-color: rgba(230, 236, 245, 0.28);
}
.profile-info-modal {
padding: 16px;
background: rgba(2, 5, 11, 0.7);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
}
.profile-info-modal__card {
width: min(100%, 430px);
max-height: calc(100dvh - 32px);
overflow: auto;
padding: 20px;
gap: 18px;
border: 1px solid rgba(142, 180, 242, 0.34);
border-radius: 16px;
background: rgba(13, 23, 42, 0.96);
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.52);
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "Segoe UI", sans-serif;
}
.profile-info-modal__header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
}
.profile-info-modal__eyebrow {
margin: 0 0 5px;
color: rgba(177, 203, 244, 0.7);
font-size: 12px;
font-weight: 600;
line-height: 1.2;
}
.profile-info-modal__title {
color: #f4f7ff;
font-size: 22px;
font-weight: 700;
line-height: 1.18;
}
.profile-info-modal__close {
display: grid;
flex: 0 0 32px;
width: 32px;
height: 32px;
padding: 0;
place-items: center;
border: 1px solid rgba(171, 195, 235, 0.25);
border-radius: 8px;
background: rgba(145, 172, 223, 0.1);
color: rgba(244, 247, 255, 0.94);
font-size: 25px;
font-weight: 300;
line-height: 1;
cursor: pointer;
}
.profile-info-modal__close:hover {
background: rgba(145, 172, 223, 0.2);
}
.profile-info-modal__content {
display: grid;
gap: 18px;
color: rgba(229, 237, 255, 0.86);
font-size: 16px;
line-height: 1.52;
}
.profile-info-modal__lead {
margin: 0;
}
.profile-info-modal__section {
padding-top: 16px;
border-top: 1px solid rgba(174, 200, 242, 0.18);
}
.profile-info-modal__section-title {
margin: 0 0 10px;
color: rgba(244, 247, 255, 0.95);
font-size: 15px;
font-weight: 650;
line-height: 1.35;
}
.profile-info-modal__list {
display: grid;
gap: 8px;
margin: 0;
padding-left: 22px;
}
.profile-info-modal__list li {
padding-left: 2px;
}
.profile-info-modal__footer {
display: flex;
justify-content: flex-end;
}
.profile-info-modal__confirm {
min-width: 112px;
font-weight: 650;
}
@media (max-width: 360px) {
.profile-info-modal__card {
padding: 16px;
gap: 16px;
}
.profile-info-modal__title {
font-size: 20px;
}
.profile-info-modal__content {
font-size: 15px;
}
}
.profile-links-header-btn {
white-space: pre-line;
line-height: 1.1;
}
.profile-main-card {
position: relative;
margin-top: 0;
padding: 8px;
gap: 4px;
}
.profile-main-card .profile-top-actions {
position: absolute;
top: 8px;
right: 8px;
z-index: 2;
}
.profile-status-row {
align-items: center;
gap: 6px;
}
.profile-status-row .status-line {
flex: 1 1 auto;
min-height: 16px;
margin: 0;
line-height: 1.2;
}
.profile-refresh-btn {
min-height: 28px;
padding: 5px 8px;
font-size: 12px;
line-height: 1.1;
}
.profile-main-card > .row {
margin: 0;
}
.profile-main-card > .row:first-child {
margin-top: 0;
}
.profile-main-card .profile-identity-lines {
gap: 2px;
}
.profile-main-card .profile-identity-line {
font-size: 15px;
}
.profile-main-card .profile-identity-login {
font-size: 17px;
}
.profile-main-card .profile-avatar {
margin-top: 4px;
margin-bottom: 4px;
}
.profile-main-card .profile-param-list {
gap: 6px;
}
.profile-main-card .profile-param-item {
padding: 8px 9px;
}
.profile-screen .primary-btn {
background: rgba(212, 175, 55, 0.2);
border: 1px solid transparent;
color: rgba(255, 217, 128, 0.98);
}
.profile-screen .secondary-btn {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.75);
}
/* ===== Notifications glass style ===== */
.notifications-screen {
position: relative;
isolation: isolate;
background: #05070A;
color: rgba(255, 255, 255, 0.9);
min-height: 100%;
align-content: start;
}
.notifications-screen::before {
content: "";
position: absolute;
inset: -12px -12px 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(320px 320px at 86% 12%, rgba(147, 112, 219, 0.2), transparent 72%),
radial-gradient(280px 280px at 18% 82%, rgba(147, 112, 219, 0.14), transparent 72%),
radial-gradient(260px 260px at 70% 65%, rgba(212, 175, 55, 0.12), transparent 75%),
#05070A;
}
.notifications-screen .tabs {
background: rgba(20, 25, 35, 0.5);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
border: 1px solid transparent;
border-radius: 16px;
}
.notifications-screen .tab-btn {
color: rgba(255, 255, 255, 0.65);
}
.notifications-screen .tab-btn.active {
background: rgba(255, 180, 0, 0.12);
border: 1px solid transparent;
color: rgba(255, 200, 50, 0.92);
}
.notifications-screen .notifications-list > .card {
background: rgba(20, 25, 35, 0.55);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 20px;
box-shadow: 0 0 60px rgba(80, 60, 180, 0.12);
}
/* Cosmic styling for the "Связи" toolbar button */
.toolbar-btn-network {
position: relative;
overflow: hidden;
-webkit-tap-highlight-color: transparent; /* нет синей вспышки-квадрата при тапе (Android WebView/Chromium) */
}
/* нет рамки/подсветки фокуса ВОКРУГ кнопки — светится только сама иконка (её drop-shadow) */
.toolbar-btn-network:focus,
.toolbar-btn-network:focus-visible {
outline: none;
}
.toolbar-btn-network::before {
content: "";
display: none; /* подсветка-подложка вокруг иконки «Связи» убрана по запросу (иконка и её drop-shadow-ореол не тронуты) */
position: absolute;
inset: 6px;
border-radius: 10px;
pointer-events: none;
opacity: 0.42;
background:
radial-gradient(circle at 24% 24%, rgba(112, 170, 255, 0.35), transparent 56%),
radial-gradient(circle at 78% 72%, rgba(197, 132, 255, 0.24), transparent 60%);
filter: blur(8px);
}
.toolbar-btn-network span:first-child {
color: #9eb3e8;
filter: drop-shadow(0 0 5px rgba(123, 170, 255, 0.24));
}
.toolbar-btn-network.active {
color: #a7bcf2;
background: linear-gradient(150deg, rgba(52, 120, 235, 0.16), rgba(103, 67, 198, 0.16)) !important;
border: 1px solid rgba(95, 151, 255, 0.46) !important;
box-shadow:
0 0 0 1px rgba(125, 180, 255, 0.24),
0 0 18px rgba(88, 130, 255, 0.28),
0 0 26px rgba(121, 75, 229, 0.22) !important;
}
.toolbar-btn-network.active span:first-child {
color: #c8e3ff;
filter: drop-shadow(0 0 8px rgba(123, 183, 255, 0.65));
}
.toolbar-btn-network.active span:last-child {
color: #c6dcff;
text-shadow: 0 0 10px rgba(123, 183, 255, 0.45);
}
/* ===== Empty states alignment + transparent wrappers cleanup ===== */
.dm-screen .dm-list > .card.meta-muted,
.channels-empty-state--compact .meta-muted,
.channels-list-empty {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
width: 100%;
}
.channels-screen,
.channels-list-content,
.channels-scroll-wrap {
background: transparent !important;
}
.channels-screen::before,
.channels-screen.channels-screen--channel::before {
background: transparent !important;
}
/* Use the shared application canvas for every primary navigation screen. */
.dm-screen,
.profile-screen,
.notifications-screen {
background: transparent !important;
}
.dm-screen::before,
.profile-screen::before,
.notifications-screen::before {
content: none;
}
.dm-screen .dm-list > .card.meta-muted {
width: calc(100% - 40px);
}
.channels-screen--list .channels-bottom-action {
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
border: 1px solid transparent;
color: #D4AF37;
font-weight: 700;
}
/* ===== SHiNE Glassmorphism activation (channels list) ===== */
.channels-screen--list .channels-tabs,
.channels-screen--list .channel-row,
.channels-screen--list .channels-status,
.channels-screen--list .channels-empty-state {
background: rgba(18, 24, 38, 0.4) !important;
backdrop-filter: blur(25px);
-webkit-backdrop-filter: blur(25px);
border: 1px solid transparent !important;
border-radius: 20px;
}
.channels-screen--list .channels-tabs,
.channels-screen--list .channel-row,
.channels-screen--list .channels-status,
.channels-screen--list .channels-empty-state,
.channels-screen--list .channels-bottom-action {
margin: 16px 8px;
}
.channels-screen--list .channels-bottom-action {
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2), rgba(212, 175, 55, 0.05));
backdrop-filter: blur(25px);
-webkit-backdrop-filter: blur(25px);
border: 1px solid transparent;
border-radius: 20px;
color: #D4AF37;
}
.channels-empty-state--silent {
padding: 0 !important;
min-height: 0;
}
.channels-screen--list .channels-bottom-action.is-empty-lift {
margin-top: 6px !important;
}
/* Compact rows keep the channel sphere as the visual height reference. */
.channels-screen--list .channels-groups {
gap: 0;
}
.channels-screen--list .channel-row {
grid-template-columns: 72px minmax(0, 1fr) auto;
align-items: center;
gap: 16px;
min-height: 78px;
margin: 4px 2px;
padding: 8px 10px;
border-radius: 16px;
border-color: transparent !important;
background: rgba(18, 24, 38, 0.18) !important;
box-shadow: none;
}
.channels-screen--list .channel-row .avatar {
width: 56px;
height: 56px;
min-width: 56px;
min-height: 56px;
}
.channels-screen--list .channel-row-main {
gap: 3px;
}
.channels-screen--list .channel-row-message {
min-height: 0;
line-height: 1.25;
}
.channels-screen--channel .channel-main-action--compose {
position: sticky;
bottom: -12px;
margin: 16px 20px 0;
width: calc(100% - 40px);
background: linear-gradient(135deg, #f5cf4f, #e2ad1f);
border: 1px solid transparent;
color: #2f2200;
font-weight: 700;
box-shadow: 0 14px 28px rgba(226, 173, 31, 0.24);
z-index: 3;
}
.toolbar {
background: transparent;
backdrop-filter: none;
-webkit-backdrop-filter: none;
border: 0;
border-radius: 20px;
}
.profile-screen .profile-param-item {
border: 0;
}
.profile-screen .profile-main-card {
border-color: transparent;
}
.toolbar-btn.active {
background: transparent !important;
border-color: transparent !important;
box-shadow: none !important;
color: #D4AF37;
}
.toolbar-btn.active span:first-child {
color: #D4AF37;
filter: drop-shadow(0 0 10px rgba(212, 175, 55, 0.6));
}
.toolbar-btn.active span:last-child {
color: #D4AF37;
text-shadow: 0 0 10px rgba(212, 175, 55, 0.6);
}
/* Contacts header overflow menu — vertical ellipsis + glass dropdown. */
.dm-head-menu-wrap {
position: relative;
justify-self: end;
display: grid;
place-items: center;
z-index: 40;
}
.dm-head-menu-btn {
width: 46px;
height: 46px;
padding: 0;
border: 0;
border-radius: 16px;
display: grid;
place-items: center;
color: #FFD98A;
background: transparent;
cursor: pointer;
transition: background 160ms ease, box-shadow 160ms ease, transform 120ms ease;
}
.dm-head-menu-btn:active { transform: scale(0.94); }
.dm-head-menu-wrap.is-open .dm-head-menu-btn,
.dm-head-menu-btn:focus-visible {
outline: none;
background: rgba(240, 184, 46, 0.08);
box-shadow: 0 0 18px rgba(240, 184, 46, 0.12);
}
.dm-head-menu-dots {
width: 6px;
height: 24px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 3.5px;
}
.dm-head-menu-dots i {
display: block;
width: 4px;
height: 4px;
border-radius: 50%;
background: currentColor;
box-shadow: 0 0 7px rgba(240, 184, 46, 0.45);
}
.dm-head-menu {
position: absolute;
top: calc(100% + 7px);
right: 0;
width: max-content;
min-width: 190px;
padding: 6px;
border: 1px solid transparent;
border-radius: 15px;
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);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
transform-origin: top right;
animation: dm-head-menu-in 140ms ease-out both;
}
.dm-head-menu[hidden] { display: none; }
.dm-head-menu::before {
content: '';
position: absolute;
top: -5px;
right: 18px;
width: 9px;
height: 9px;
transform: rotate(45deg);
border-left: 1px solid transparent;
border-top: 1px solid transparent;
background: rgba(19, 21, 28, 0.98);
}
.dm-head-menu-item {
position: relative;
z-index: 1;
width: 100%;
min-height: 44px;
padding: 0 12px;
border: 0;
border-radius: 10px;
display: flex;
align-items: center;
gap: 10px;
color: #FCEAC0;
background: transparent;
font: inherit;
font-size: 14px;
font-weight: 600;
text-align: left;
white-space: nowrap;
cursor: pointer;
}
.dm-head-menu-item svg {
width: 19px;
height: 19px;
flex: 0 0 auto;
color: #E7B83D;
filter: drop-shadow(0 0 5px rgba(240, 184, 46, 0.22));
}
.dm-head-menu-item:hover,
.dm-head-menu-item:focus-visible,
.dm-head-menu-item:active {
outline: none;
background: rgba(240, 184, 46, 0.09);
}
@keyframes dm-head-menu-in {
from { opacity: 0; transform: translateY(-5px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
@media (prefers-reduced-motion: reduce) {
.dm-head-menu { animation: none; }
.dm-head-menu-btn { transition: none; }
}
/* Contacts overflow menu body portal: avoids topbar overflow hit-testing on desktop/Android. */
.dm-head-menu--portal {
position: fixed;
right: auto;
z-index: 10000;
pointer-events: auto;
isolation: isolate;
}
/* ===== Notifications: social event cards ===== */
.notifications-screen .notification-card {
gap: 10px;
}
.notification-identity {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
}
.notification-avatar {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
flex: 0 0 auto;
}
.notification-identity-text {
min-width: 0;
flex: 1 1 auto;
}
.notification-identity-primary {
display: flex;
align-items: baseline;
gap: 6px;
min-width: 0;
flex-wrap: wrap;
}
.notification-person-name {
color: rgba(255, 255, 255, 0.96);
font-weight: 700;
overflow-wrap: anywhere;
}
.notification-login,
.notification-time-separator,
.notification-time {
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
}
.notification-action,
.notification-content {
margin: 0;
}
.notification-action {
color: rgba(255, 255, 255, 0.66);
font-size: 13px;
}
.notification-content {
color: rgba(255, 255, 255, 0.94);
font-size: 15px;
line-height: 1.45;
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.notification-engagement {
display: flex;
align-items: center;
gap: 18px;
flex-wrap: wrap;
padding-top: 2px;
color: rgba(255, 255, 255, 0.58);
}
.notification-engagement-item {
display: inline-flex;
align-items: center;
gap: 5px;
min-width: 24px;
font-size: 12px;
line-height: 1;
}
.notification-engagement-icon {
font-size: 15px;
}
.notifications-screen .notification-card--clickable {
cursor: pointer;
transition: transform 120ms ease, border-color 120ms ease, background-color 120ms ease;
}
.notifications-screen .notification-card--clickable:hover,
.notifications-screen .notification-card--clickable:focus-visible {
border-color: rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.055);
outline: none;
}
.notifications-screen .notification-card--clickable:active {
transform: scale(0.99);
}
/* ===== Общая кнопка прокрутки ленты вниз ===== */
.scroll-to-bottom-btn {
position: absolute;
right: 18px;
bottom: calc(var(--toolbar-height, 78px) + var(--composer-height, 0px) + 18px + env(safe-area-inset-bottom));
width: 48px;
height: 48px;
margin: 0;
padding: 0;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
border-radius: 999px;
border: 1px solid transparent;
background: linear-gradient(160deg, rgba(16, 24, 38, 0.94), rgba(12, 18, 30, 0.9));
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);
display: inline-flex;
align-items: center;
justify-content: center;
z-index: 38;
opacity: 0;
pointer-events: none;
transform: translateY(8px);
transition: opacity 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
}
.scroll-to-bottom-btn.is-visible {
opacity: 1;
pointer-events: auto;
transform: translateY(0);
}
.scroll-to-bottom-btn:hover {
box-shadow: 0 14px 30px rgba(3, 8, 18, 0.55), 0 0 24px rgba(212, 175, 55, 0.22);
}
.scroll-to-bottom-btn:focus-visible {
outline: 2px solid transparent;
outline-offset: 3px;
}
.scroll-to-bottom-btn__icon {
font-size: 22px;
line-height: 1;
transform: translateY(-1px);
}
body.chat-topbar-overlay .app-shell.keyboard-open .scroll-to-bottom-btn {
bottom: calc(var(--keyboard-offset, 0px) + var(--composer-height, 0px) + 18px);
}
/* ===== Унифицированный верхний toolbar приложения =====
* Единая геометрия для основных экранов и вложенных страниц:
* слева действие/назад, по центру заголовок, справа действия.
*/
:root {
--app-topbar-base-height: 64px;
--app-topbar-title-size: 18px;
--app-topbar-bg: #05070A;
}
.page-header.app-topbar-shell {
display: grid;
grid-template-columns: minmax(44px, 1fr) minmax(0, auto) minmax(44px, 1fr);
align-items: center;
gap: 8px;
}
.page-header.app-topbar-shell .header-center {
min-width: 0;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
.page-header.app-topbar-shell .header-left,
.page-header.app-topbar-shell .header-actions {
min-width: 0;
width: 100%;
}
.page-header.app-topbar-shell .header-left {
justify-content: flex-start;
}
.page-header.app-topbar-shell .header-actions {
justify-content: flex-end;
}
.page-header .page-title,
.topbar-slot .dm-head-title,
.topbar-slot .channels-top-title,
.app-topbar-title-action {
margin: 0;
min-width: 0;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--font-main);
font-size: var(--app-topbar-title-size);
line-height: 1.2;
font-weight: 700;
letter-spacing: 0;
color: rgba(255, 255, 255, 0.95);
text-shadow: none;
text-align: center;
}
.topbar-slot {
padding: 0 12px;
background: var(--app-topbar-bg);
}
.topbar-slot .page-header,
.topbar-slot .dm-head,
.topbar-slot .channels-top-bar {
width: 100%;
min-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
margin: 0;
padding: calc(10px + env(safe-area-inset-top)) 0 10px;
box-sizing: border-box;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
.topbar-slot .channels-top-bar {
display: grid;
grid-template-columns: minmax(44px, 1fr) minmax(0, auto) minmax(44px, 1fr);
align-items: center;
gap: 8px;
}
.topbar-slot .channels-top-left,
.topbar-slot .channels-top-right {
width: 100%;
min-width: 0;
}
.topbar-slot .channels-top-left {
justify-content: flex-start;
}
.topbar-slot .channels-top-right {
justify-content: flex-end;
}
.topbar-slot .channels-top-title {
justify-self: center;
}
.app-topbar-shell--profile {
justify-content: stretch;
}
.app-topbar-shell--profile .header-left,
.app-topbar-shell--profile .header-actions,
.app-topbar-shell .header-left,
.app-topbar-shell .header-actions {
min-width: 0;
}
/* Одинаковая стрелка назад на всех экранах. Визуально чуть крупнее текста,
* чтобы сам глиф по воспринимаемому размеру совпадал с 18px заголовком. */
.header-back-btn,
.channels-top-back-btn.header-back-btn {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
font-family: var(--font-main);
font-size: 24px;
line-height: 1;
font-weight: 500;
}
/* В канале и треде название остаётся кликабельным, но визуально является
* тем же центральным заголовком, а не отдельной кнопкой справа. */
.topbar-slot .app-topbar-title-action {
width: auto;
min-height: 40px;
padding: 0 4px;
justify-content: center;
}
.topbar-slot .channels-screen--thread .app-topbar-title-action,
.topbar-slot .channels-screen--channel .app-topbar-title-action {
max-width: 100%;
}
.topbar-slot .page-header.channel-thread-topbar {
display: grid;
grid-template-columns: minmax(44px, 1fr) minmax(0, auto) minmax(44px, 1fr);
align-items: center;
gap: 8px;
}
.topbar-slot .page-header.channel-thread-topbar .header-left,
.topbar-slot .page-header.channel-thread-topbar .header-actions {
display: flex;
width: 100%;
min-width: 0;
flex: initial;
gap: 8px;
}
.topbar-slot .page-header.channel-thread-topbar .header-left {
justify-content: flex-start;
}
.topbar-slot .page-header.channel-thread-topbar .header-actions {
justify-content: flex-end;
}
.topbar-slot .page-header.channel-thread-topbar .header-center {
min-width: 0;
}
/* Чат: в центре только компактная идентичность собеседника. */
.chat-header-identity {
min-width: 0;
max-width: 132px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
}
.chat-header-avatar-slot {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
display: inline-flex;
align-items: center;
justify-content: center;
}
.chat-header-avatar.avatar,
.chat-header-avatar.avatar-image {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
font-size: 14px;
border: 0;
box-shadow: none;
}
.chat-header-login {
min-width: 0;
max-width: 96px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--font-main);
font-size: 13px;
line-height: 1.15;
font-weight: 600;
color: rgba(255, 255, 255, 0.78);
}
/* «Связи» рисует шапку внутри сцены, поэтому повторяем тот же контракт там. */
.network-header-overlay,
.network-header-overlay.page-header {
top: 0;
left: 0;
right: 0;
min-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
margin: 0;
padding: calc(10px + env(safe-area-inset-top)) 12px 10px;
display: grid;
grid-template-columns: minmax(44px, 1fr) minmax(0, auto) minmax(44px, 1fr);
align-items: center;
gap: 8px;
border: 0;
border-radius: 0;
background: var(--app-topbar-bg);
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
.network-header-overlay .header-center {
min-width: 0;
display: flex;
justify-content: center;
}
.network-header-overlay .page-title {
font-family: var(--font-main);
font-size: var(--app-topbar-title-size);
line-height: 1.2;
font-weight: 700;
letter-spacing: 0;
color: rgba(255, 255, 255, 0.95);
text-shadow: none;
}
.network-header-overlay .header-left,
.network-header-overlay .header-actions {
width: 100%;
min-width: 0;
}
.network-header-overlay .icon-btn {
min-height: 40px;
padding: 0 8px;
font-size: 14px;
border: 0;
background: transparent;
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
.network-header-overlay .header-back-btn {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
padding: 0;
font-size: 24px;
}
/* ===== Верхний toolbar: финальная унификация геометрии и типографики ===== */
:root {
--app-topbar-gold: #F0C56B;
}
/* Фиксированная высота, а не только min-height: при смене основных вкладок
* верхняя граница контента больше не меняется из-за локальной шапки страницы. */
.topbar-slot .page-header,
.topbar-slot .dm-head,
.topbar-slot .channels-top-bar {
height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
min-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
max-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
padding-top: env(safe-area-inset-top);
padding-bottom: 0;
}
/* Один и тот же текстовый ритм на Контактах / Каналах / Связях /
* Уведомлениях / Профиле и вложенных экранах. */
.page-header .page-title,
.topbar-slot .dm-head-title,
.topbar-slot .channels-top-title,
.app-topbar-title-action,
.network-header-overlay .page-title {
font-family: var(--font-main);
font-size: 18px;
font-weight: 700;
font-style: normal;
line-height: 22px;
letter-spacing: 0;
color: var(--app-topbar-gold);
text-shadow: none;
}
/* В списке контактов логин слева также остаётся в общей палитре шапки. */
.topbar-slot .dm-head-name {
font-family: var(--font-main);
color: var(--app-topbar-gold);
}
/* Все интерактивные элементы верхней шапки имеют одинаковую рабочую высоту. */
.topbar-slot .icon-btn,
.topbar-slot .dm-head-menu-btn,
.topbar-slot .channels-top-more-btn {
min-height: 40px;
height: 40px;
color: var(--app-topbar-gold);
}
.topbar-slot .dm-head-menu-btn {
width: 40px;
min-width: 40px;
border-radius: 0;
}
.topbar-slot .channels-top-more-btn {
width: 40px;
min-width: 40px;
font-size: 24px;
line-height: 1;
}
/* Личный чат: аватар остаётся компактным, логин теперь равен общему 18px. */
.chat-header-identity {
max-width: 176px;
gap: 8px;
}
.chat-header-login {
max-width: 136px;
font-size: 18px;
line-height: 22px;
font-weight: 700;
color: var(--app-topbar-gold);
}
/* Связи живут вне topbar-slot, поэтому фиксируем ту же фактическую высоту. */
.network-header-overlay,
.network-header-overlay.page-header {
height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
min-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
max-height: calc(var(--app-topbar-base-height) + env(safe-area-inset-top));
padding-top: env(safe-area-inset-top);
padding-bottom: 0;
}
.network-header-overlay .icon-btn,
.network-header-overlay .header-back-btn {
color: var(--app-topbar-gold);
}
/* ===== Верхний toolbar: белый интерфейс с мягким синим свечением ===== */
:root {
--app-topbar-gold: #F7FBFF;
--app-topbar-blue-glow: rgba(92, 190, 255, 0.72);
--app-topbar-blue-glow-soft: rgba(72, 145, 255, 0.34);
}
.page-header .page-title,
.topbar-slot .dm-head-title,
.topbar-slot .channels-top-title,
.app-topbar-title-action,
.network-header-overlay .page-title,
.topbar-slot .dm-head-name,
.chat-header-login {
color: var(--app-topbar-gold);
text-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 14px var(--app-topbar-blue-glow-soft);
}
.topbar-slot .icon-btn,
.topbar-slot .dm-head-menu-btn,
.topbar-slot .channels-top-more-btn,
.network-header-overlay .icon-btn,
.network-header-overlay .header-back-btn {
color: var(--app-topbar-gold);
text-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 12px var(--app-topbar-blue-glow-soft);
}
.topbar-slot .icon-btn svg,
.network-header-overlay .icon-btn svg {
filter:
drop-shadow(0 0 3px var(--app-topbar-blue-glow))
drop-shadow(0 0 7px var(--app-topbar-blue-glow-soft));
}
.topbar-slot .dm-head-menu-dots i {
background: var(--app-topbar-gold);
box-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 10px var(--app-topbar-blue-glow-soft);
}
/* Уведомления: переключатели лент повторяют стеклянные чипы экрана «Связи». */
.notifications-screen .notification-feed-tabs {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 8px;
padding: 8px 12px 4px;
margin: 0;
background: transparent;
border: 0;
box-shadow: none;
}
.notifications-screen .notification-feed-tabs .notification-tab-btn {
min-width: 92px;
text-align: center;
}
/* Личный чат: логин остаётся строго в центральной колонке,
* аватар живёт отдельно в левой колонке рядом со стрелкой назад. */
.page-header.app-topbar-shell .header-center {
overflow: hidden;
}
.chat-header-login {
display: block;
max-width: min(42vw, 180px);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
}
.chat-header-avatar-slot--left {
flex: 0 0 28px;
margin-left: 0;
}
/* ===== Shared primary topbar + upper tabs geometry (2026-08-22) =====
* «Связи» теперь монтируют header в общий topbar-slot, как остальные основные экраны.
* Верхние переключатели используют один ритм и не меняют вертикальную позицию между страницами.
*/
:root {
--app-primary-tabs-top-gap: 14px;
--app-primary-tabs-gap: 8px;
--app-primary-tab-min-height: 28px;
}
/* Граф занимает ровно доступную область между общей шапкой и нижним toolbar. */
.screen-content.network-scroll-lock .network-screen {
width: 100%;
height: 100%;
min-height: 0;
margin: 0;
}
.screen-content.network-scroll-lock .network-stage {
width: 100%;
height: 100%;
min-height: 0;
}
/* Общий контейнер верхних кнопок-вкладок. */
.app-top-tabs {
min-height: var(--app-primary-tab-min-height);
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: var(--app-primary-tabs-gap);
margin: 0;
padding: 0;
border: 0;
background: transparent;
box-shadow: none;
}
/* На обычных экранах отступ создаёт стандартный padding screen-content (14px). */
.notifications-screen .notification-feed-tabs.app-top-tabs {
min-height: var(--app-primary-tab-min-height);
padding: 0;
margin: 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;
}
.notifications-screen .notification-feed-tabs .notification-tab-btn {
min-width: 92px;
}
/* ===== Единый шаблон аватаров (2026-08-22) =====
* Базовая аватарка повторяет принцип орбов экрана «Связи»:
* - fallback: нейтральный серый круг + белые инициалы;
* - фото занимает тот же внутренний круг;
* - стеклянный внешний круг остаётся поверх всегда, независимо от наличия фото;
* - усиленное свечение включается модификатором .avatar-glow, не меняя геометрию аватара.
*/
.avatar.avatar-image.avatar-framed {
position: relative;
overflow: visible;
isolation: isolate;
display: grid;
place-items: center;
border: 0;
background: transparent;
color: #ffffff;
box-shadow: none;
}
.avatar.avatar-image.avatar-framed > .avatar-fallback,
.avatar.avatar-image.avatar-framed > .avatar-photo {
grid-area: 1 / 1;
place-self: center;
width: 92.5%;
height: 92.5%;
border-radius: 50%;
z-index: 1;
}
.avatar.avatar-image.avatar-framed > .avatar-fallback {
display: grid;
place-items: center;
overflow: hidden;
background: #454b55;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.42);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.08),
inset 0 -8px 16px rgba(0, 0, 0, 0.16);
}
.avatar.avatar-image.avatar-framed > .avatar-photo {
display: block;
object-fit: cover;
object-position: center;
opacity: 0;
transition: opacity 120ms ease;
}
.avatar.avatar-image.avatar-framed.has-image > .avatar-photo {
opacity: 1;
}
.avatar.avatar-image.avatar-framed.has-image > .avatar-fallback {
opacity: 0;
visibility: hidden;
}
/* Второй круг — тот же стеклянный overlay, который используется в «Связях». */
.avatar.avatar-image.avatar-framed::after {
content: '';
position: absolute;
inset: 50% auto auto 50%;
width: 119%;
height: 119%;
transform: translate(-50%, -50%);
border: 0;
border-radius: 0;
background: url('../assets/glass_overlay_faithful.png') center / contain no-repeat;
box-shadow: none;
opacity: 1;
pointer-events: none;
z-index: 3;
}
/* Опциональный усиленный ореол для состояний «сияющий» и будущих экранов. */
.avatar.avatar-image.avatar-framed.avatar-glow::before {
content: '';
position: absolute;
inset: -16%;
border-radius: 50%;
background: radial-gradient(circle, rgba(139, 232, 255, 0.36) 0%, rgba(116, 217, 255, 0.14) 48%, rgba(116, 217, 255, 0) 74%);
filter: blur(3px);
pointer-events: none;
z-index: -1;
}
/* ===== UI cleanup: main tabs, shared overflow menu and DM list (2026-08-22) ===== */
/* Единое вертикальное троеточие для всех overflow/menu-кнопок. */
.app-overflow-dots {
width: 8px;
height: 24px;
display: inline-flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 3.5px;
color: inherit;
pointer-events: none;
}
.app-overflow-dots i {
display: block;
width: 4px;
height: 4px;
flex: 0 0 4px;
border-radius: 50%;
background: currentColor;
box-shadow:
0 0 5px rgba(92, 190, 255, 0.72),
0 0 10px rgba(72, 145, 255, 0.34);
}
.channel-menu-trigger .app-overflow-dots,
.arweave-uploads-menu-btn .app-overflow-dots {
margin: auto;
}
/* Пустые каналы: больше никакой золотой вставки/рамки. Сообщение оформлено
* как спокойный матовый chip из панели фильтров «Связей». */
.channels-screen--list .channels-empty-state.channels-empty-state--silent {
width: 100%;
min-height: 0;
margin: 12px 0 !important;
padding: 0 !important;
border: 0 !important;
border-radius: 0;
background: transparent !important;
box-shadow: none !important;
backdrop-filter: none;
-webkit-backdrop-filter: none;
place-items: center;
}
.channels-screen--list .channels-empty-state.channels-empty-state--silent .meta-muted {
display: inline-flex;
align-items: center;
justify-content: center;
width: auto;
max-width: calc(100% - 24px);
min-height: 30px;
margin: 0;
padding: 7px 14px;
border: 0.5px solid rgba(255, 255, 255, 0.1);
border-radius: 999px;
background: rgba(255, 255, 255, 0.03);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: inset 0 0.5px 0 rgba(255, 255, 255, 0.08);
color: #cfe0ff;
font-size: 12px;
font-weight: 600;
font-style: normal;
line-height: 1.2;
text-align: center;
}
/* «Личные»: вместо жёлтого шестиугольника — текущий аватар пользователя. */
.dm-head-avatar-slot {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
display: inline-flex;
align-items: center;
justify-content: center;
}
.dm-head-avatar.avatar,
.dm-head-avatar.avatar-image {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
font-size: 14px;
}
/* Список личных чатов: без цветной границы карточки, компактная ава как в шапке
* самого чата, а дата/время стоит на строке превью. */
.dm-list-screen .dm-dialog-card {
grid-template-columns: 60px minmax(0, 1fr) auto;
gap: 10px;
min-height: 58px;
padding: 8px 10px;
border: 0;
border-radius: 18px;
box-shadow: none;
background: rgba(7, 10, 18, 0.42);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
}
.dm-list-screen .dm-card--family,
.dm-list-screen .dm-card--shining {
border: 0;
}
.dm-list-screen .dm-av {
width: 60px;
height: 60px;
min-width: 60px;
min-height: 60px;
}
.dm-list-screen .dm-av .avatar,
.dm-list-screen .list-item .avatar {
width: 56px;
height: 56px;
min-width: 56px;
min-height: 56px;
font-size: 18px;
border: 0;
box-shadow: none;
}
.dm-list-screen .dm-row-main,
.dm-list-screen .dm-row-meta-col {
display: grid;
grid-template-rows: 22px 20px;
align-items: center;
gap: 0;
min-height: 42px;
}
.dm-list-screen .dm-row-titlewrap {
flex-wrap: nowrap;
min-height: 22px;
overflow: hidden;
}
.dm-list-screen .dm-row-last-message {
align-self: center;
line-height: 20px;
}
.dm-list-screen .dm-row-meta-col {
align-self: center;
justify-items: end;
justify-content: initial;
}
.dm-list-screen .dm-unread-badge,
.dm-list-screen .dm-row-meta-spacer {
grid-row: 1;
align-self: center;
}
.dm-list-screen .dm-row-time {
grid-row: 2;
align-self: center;
line-height: 20px;
white-space: nowrap;
}
.dm-list-screen .dm-row-meta-line {
display: contents;
}
.dm-list-screen .dm-chevron {
display: none !important;
}
@media (max-width: 380px) {
.dm-list-screen .dm-dialog-card {
grid-template-columns: 60px minmax(0, 1fr) auto;
}
.dm-list-screen .dm-row-meta-col {
grid-column: 3;
justify-self: end;
}
}
/* ===== Личные сообщения: финальная чистка чата ===== */
/* В списке «Личные» слева в шапке остаётся только аватар текущего пользователя. */
.topbar-slot .dm-list-screen .dm-head-brand {
gap: 0;
}
.chat-header-connections-btn,
.chat-header-avatar-btn {
padding: 0;
min-width: 0;
min-height: 0;
border: 0;
background: transparent;
box-shadow: none;
transform: none;
}
.chat-header-connections-btn:hover,
.chat-header-connections-btn:active,
.chat-header-connections-btn:focus,
.chat-header-connections-btn:focus-visible,
.chat-header-avatar-btn:hover,
.chat-header-avatar-btn:active,
.chat-header-avatar-btn:focus,
.chat-header-avatar-btn:focus-visible {
border: 0;
background: transparent;
box-shadow: none;
transform: none;
}
.chat-header-connections-btn {
width: 38px;
height: 38px;
border-radius: 999px;
display: inline-flex;
align-items: center;
justify-content: center;
background: rgba(8, 17, 31, 0.65);
border: 1px solid rgba(97, 198, 255, 0.26);
box-shadow: 0 0 0 1px rgba(97, 198, 255, 0.08), 0 0 12px rgba(64, 172, 255, 0.18);
}
.chat-header-connections-btn:hover,
.chat-header-connections-btn:focus-visible {
border-color: rgba(111, 208, 255, 0.38);
box-shadow: 0 0 0 1px rgba(111, 208, 255, 0.16), 0 0 16px rgba(64, 172, 255, 0.28);
}
.chat-header-connections-logo {
width: 24px;
height: 24px;
object-fit: contain;
display: block;
}
.chat-header-avatar-btn {
display: inline-flex;
align-items: center;
justify-content: center;
}
.chat-header-avatar-btn .chat-header-avatar-slot {
display: inline-flex;
}
/* Пузырям сообщений не нужна отдельная обводка: направление читается по фону и геометрии. */
.dm-chat-screen .bubble,
.dm-chat-screen .bubble.in,
.dm-chat-screen .bubble.out,
.dm-chat-screen .bubble.call-tech {
border: 0;
}
.dm-chat-screen .bubble-reply-preview {
border: 0;
}
/* Нижняя панель чата повторяет бело-голубую цветовую роль верхнего toolbar вместо золота. */
.dm-chat-input {
border-top: 1px solid rgba(92, 190, 255, 0.12);
}
.dm-chat-input .dm-input {
border-color: rgba(247, 251, 255, 0.12);
color: var(--app-topbar-gold);
text-shadow:
0 0 4px rgba(92, 190, 255, 0.34),
0 0 10px rgba(72, 145, 255, 0.16);
caret-color: var(--app-topbar-gold);
}
.dm-chat-input .dm-input:focus {
border-color: rgba(92, 190, 255, 0.28);
box-shadow: 0 0 0 1px rgba(92, 190, 255, 0.08);
}
.dm-chat-input .dm-input::placeholder {
color: rgba(247, 251, 255, 0.46);
text-shadow: none;
}
.dm-chat-input .dm-emoji-btn,
.dm-chat-input .dm-send-btn,
.dm-chat-input .dm-edit-banner__close {
color: var(--app-topbar-gold) !important;
text-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 12px var(--app-topbar-blue-glow-soft) !important;
filter: drop-shadow(0 0 4px rgba(92, 190, 255, 0.42));
}
.dm-chat-input .dm-send-btn {
border-color: rgba(247, 251, 255, 0.12);
background: rgba(92, 190, 255, 0.08);
box-shadow: none;
}
.dm-chat-input .dm-edit-banner {
border-color: rgba(92, 190, 255, 0.18);
background: rgba(92, 190, 255, 0.08);
color: var(--app-topbar-gold);
}
.dm-chat-input .emoji-picker-tab.is-active {
background: rgba(92, 190, 255, 0.12);
}
/* ===== DM + Channels polish (2026-08-22 13:22) ===== */
/* «Личные»: аватар основной вкладки стоит ровно на той же горизонтальной позиции,
* что и аватар собеседника в открытом чате: после 40px back-slot + 8px gap. */
.topbar-slot .dm-head .dm-head-brand {
margin-left: 48px;
}
.dm-head-avatar-slot,
.dm-head-avatar.avatar,
.dm-head-avatar.avatar-image {
width: 40px;
height: 40px;
min-width: 40px;
min-height: 40px;
}
.dm-head-avatar.avatar,
.dm-head-avatar.avatar-image {
font-size: 14px;
}
/* Composer должен быть продолжением основного фона: без верхнего разделителя
* и без отдельной затемнённой/стеклянной подложки. */
.dm-chat-input {
border-top: 0 !important;
background: transparent !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* Каналы: счётчик непрочитанных — целиком голубой светящийся овал,
* цифра остаётся обычной белой, без собственного glow. */
.channel-row-count {
background: rgba(92, 190, 255, 0.16);
border: 1px solid rgba(92, 190, 255, 0.56);
color: #FFFFFF;
box-shadow:
0 0 7px rgba(92, 190, 255, 0.58),
0 0 15px rgba(72, 145, 255, 0.28),
inset 0 0 8px rgba(92, 190, 255, 0.10);
text-shadow: none;
}
/* Каналы: логин/техническая подпись и overflow-троеточие используют
* тот же основной белый + голубое свечение, что верхний toolbar. */
.channel-row-technical {
font-family: var(--font-main);
font-weight: 600;
color: var(--app-topbar-gold);
text-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 12px var(--app-topbar-blue-glow-soft);
}
.channel-menu-trigger {
color: var(--app-topbar-gold);
text-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 12px var(--app-topbar-blue-glow-soft);
}
/* ===== DM avatar + channel row visual alignment fix (2026-08-22 13:29) ===== */
/* Шапка «Личных» переносится в topbar-slot отдельно от .dm-list-screen,
* поэтому позиционируем аватар по реальной DOM-структуре. 48px = back 40px + gap 8px
* в открытом чате, что даёт одинаковую абсолютную X-позицию. */
.topbar-slot .dm-head .dm-head-brand {
margin-left: 48px;
}
/* Название канала и техническая строка (login / channel) — одна типографическая
* система с основным интерфейсом: белый текст + голубое свечение. */
.channels-screen--list .channel-row-title,
.channels-screen--list .channel-row-technical {
font-family: var(--font-main);
color: var(--app-topbar-gold);
text-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 12px var(--app-topbar-blue-glow-soft);
}
.channels-screen--list .channel-row-title {
font-weight: 700;
}
/* Счётчик непрочитанных: без видимой границы. Сам овал — светящийся синий объём,
* цифра остаётся обычной белой. */
.channels-screen--list .channel-row-count,
.channels-screen--list .unread.channel-row-count {
border: 0 !important;
outline: 0 !important;
background: linear-gradient(180deg, #57b6ff 0%, #2a86ff 100%) !important;
color: #FFFFFF !important;
box-shadow:
0 0 0 1px rgba(255, 255, 255, 0.08) inset,
0 0 10px rgba(52, 146, 255, 0.68),
0 0 18px rgba(52, 146, 255, 0.32) !important;
text-shadow: none !important;
}
.channels-screen--list .channel-row .channel-row-controls > .channel-row-count {
top: 0 !important;
right: 0 !important;
position: absolute !important;
z-index: 2;
}
.channels-screen--list .channel-row .channel-row-controls > .channel-menu-trigger {
display: none !important;
}
/* ===== Transparent topbar + scroll fade (2026-08-22 13:40) =====
* Верхняя шапка не рисует отдельную плашку. Контент прокручивается под ней и
* постепенно исчезает по alpha-mask: у самого верхнего края полностью прозрачен,
* к нижней кромке topbar — полностью видим. */
:root {
--app-topbar-fade-end: var(--topbar-height, 64px);
}
.topbar-slot {
z-index: 20;
background: transparent !important;
isolation: isolate;
}
/* Лёгкое затемнение только для читаемости текста шапки, без видимой границы. */
.topbar-slot::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: linear-gradient(
180deg,
rgba(5, 7, 10, 0.32) 0%,
rgba(5, 7, 10, 0.16) 52%,
rgba(5, 7, 10, 0) 100%
);
}
.topbar-slot .page-header,
.topbar-slot .dm-head,
.topbar-slot .channels-top-bar {
background: transparent !important;
border: 0 !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* Обычные прокручиваемые экраны начинаются физически от верхнего края app-shell.
* В исходном положении padding держит первый элемент под шапкой; при прокрутке
* этот padding уезжает, и контент проходит под прозрачным topbar. */
.screen-content:not(.no-app-chrome):not(.network-scroll-lock):not(:has(> .dm-chat-screen)) {
top: var(--call-minimized-bar-height, 0px);
padding-top: calc(var(--topbar-height, 64px) + 14px);
-webkit-mask-image: linear-gradient(
to bottom,
transparent 0,
rgba(0, 0, 0, 0.12) 12px,
rgba(0, 0, 0, 0.48) calc(var(--app-topbar-fade-end) - 24px),
rgba(0, 0, 0, 0.82) calc(var(--app-topbar-fade-end) - 8px),
#000 var(--app-topbar-fade-end),
#000 100%
);
mask-image: linear-gradient(
to bottom,
transparent 0,
rgba(0, 0, 0, 0.12) 12px,
rgba(0, 0, 0, 0.48) calc(var(--app-topbar-fade-end) - 24px),
rgba(0, 0, 0, 0.82) calc(var(--app-topbar-fade-end) - 8px),
#000 var(--app-topbar-fade-end),
#000 100%
);
}
/* DM-чат скроллится не через .screen-content, а через .dm-chat-wrap.
* Расширяем его до верхнего края и переносим безопасный отступ внутрь самого
* scroll-контейнера — так сообщения реально заходят под шапку и затухают. */
body.chat-topbar-overlay .screen-content:has(> .dm-chat-screen) {
top: var(--call-minimized-bar-height, 0px) !important;
padding-top: 0 !important;
}
body.chat-topbar-overlay .dm-chat-screen > .dm-chat-wrap {
box-sizing: border-box;
padding-top: calc(var(--topbar-height, 64px) + 12px);
-webkit-mask-image: linear-gradient(
to bottom,
transparent 0,
rgba(0, 0, 0, 0.12) 12px,
rgba(0, 0, 0, 0.48) calc(var(--app-topbar-fade-end) - 24px),
rgba(0, 0, 0, 0.82) calc(var(--app-topbar-fade-end) - 8px),
#000 var(--app-topbar-fade-end),
#000 100%
);
mask-image: linear-gradient(
to bottom,
transparent 0,
rgba(0, 0, 0, 0.12) 12px,
rgba(0, 0, 0, 0.48) calc(var(--app-topbar-fade-end) - 24px),
rgba(0, 0, 0, 0.82) calc(var(--app-topbar-fade-end) - 8px),
#000 var(--app-topbar-fade-end),
#000 100%
);
}
/* «Контакты»: верхняя аватарка убрана полностью. Пустая левая колонка сохраняет
* строгий центр заголовка относительно правого overflow-меню. */
.topbar-slot .dm-head .dm-head-brand {
margin-left: 0 !important;
min-width: 40px;
width: 40px;
height: 40px;
}
/* ===== Robust topbar fade overlay (2026-08-22 13:44) =====
* Mask-image on scrolling containers is not consistently composited by every
* Chromium/WebView path used by the app. The fade is therefore rendered as a
* dedicated overlay layer above scrolled content and below topbar controls.
* Content remains physically scrollable under the header and visually dissolves
* into the app background before reaching the very top edge. */
.topbar-slot {
overflow: visible !important;
isolation: isolate;
}
.topbar-slot::before {
content: '';
position: absolute;
top: 0;
left: -12px;
right: -12px;
height: calc(100% + 48px);
z-index: 0;
pointer-events: none;
background: linear-gradient(
to bottom,
rgba(5, 7, 10, 1) 0%,
rgba(5, 7, 10, 0.98) 16%,
rgba(5, 7, 10, 0.88) 32%,
rgba(5, 7, 10, 0.66) 52%,
rgba(5, 7, 10, 0.38) 70%,
rgba(5, 7, 10, 0.15) 84%,
rgba(5, 7, 10, 0) 100%
);
}
.topbar-slot > * {
position: relative;
z-index: 1;
}
/* The overlay above is the source of truth for the fade. Disable the previous
* alpha masks so browser-specific mask compositing cannot cancel the effect. */
.screen-content:not(.no-app-chrome):not(.network-scroll-lock):not(:has(> .dm-chat-screen)),
body.chat-topbar-overlay .dm-chat-screen > .dm-chat-wrap {
-webkit-mask-image: none !important;
mask-image: none !important;
}
/* ===== Bottom chat fade + Connections topbar fade + Notifications borderless cards (2026-08-22 13:49) ===== */
/* Личный чат: область сообщений продолжается под composer. Внутренний нижний
* padding сохраняет последнее сообщение над полем ввода в конечной позиции,
* но во время прокрутки сообщения могут проходить под нижним fade-слоем. */
body.chat-topbar-overlay .app-shell:not(.keyboard-open) .screen-content:has(> .dm-chat-screen) {
bottom: calc(var(--toolbar-height, 78px) + env(safe-area-inset-bottom)) !important;
}
body.chat-topbar-overlay .app-shell.keyboard-open .screen-content:has(> .dm-chat-screen) {
bottom: var(--keyboard-offset, 0px) !important;
}
body.chat-topbar-overlay .dm-chat-screen > .dm-chat-wrap {
padding-bottom: calc(var(--composer-height, 0px) + 52px);
}
/* Нижнее затухание — зеркальная версия верхнего эффекта. Слой находится над
* сообщениями и под самим composer, поэтому текст плавно исчезает перед полем ввода. */
body.chat-topbar-overlay .composer-slot {
isolation: isolate;
overflow: visible !important;
}
body.chat-topbar-overlay .composer-slot::before {
content: '';
position: absolute;
left: -12px;
right: -12px;
top: -52px;
bottom: 0;
z-index: 0;
pointer-events: none;
background: linear-gradient(
to bottom,
rgba(5, 7, 10, 0) 0%,
rgba(5, 7, 10, 0.14) 18%,
rgba(5, 7, 10, 0.38) 38%,
rgba(5, 7, 10, 0.66) 58%,
rgba(5, 7, 10, 0.88) 76%,
rgba(5, 7, 10, 0.98) 90%,
rgba(5, 7, 10, 1) 100%
);
}
body.chat-topbar-overlay .composer-slot > * {
position: relative;
z-index: 1;
}
/* «Связи»: граф теперь физически продолжается под общей верхней шапкой.
* Глобальный .topbar-slot::before даёт тот же fade, что и на лентах. */
.screen-content.network-scroll-lock {
top: var(--call-minimized-bar-height, 0px) !important;
}
/* Верхние фильтры графа остаются ниже шапки и не попадают в зону затухания. */
.network-stage > .fg-filter-bar.app-top-tabs {
top: calc(var(--topbar-height, 64px) + var(--app-primary-tabs-top-gap, 14px)) !important;
}
/* Уведомления: информационные блоки без рамок. Hover/focus не возвращает
* обводку — различение сохраняется фоном и лёгкой реакцией на нажатие. */
.notifications-screen .notifications-list > .notification-card,
.notifications-screen .notifications-list > .notification-card:hover,
.notifications-screen .notifications-list > .notification-card:focus,
.notifications-screen .notifications-list > .notification-card:focus-visible,
.notifications-screen .notifications-list > .notification-card:active {
border: 0 !important;
outline: 0 !important;
}
/* ===== «Связи»: симметричное затухание сверху и снизу =====
* Граф занимает всю высоту экрана и продолжается под обеими панелями.
* Размытия нет: верх и низ используют одинаковую зеркальную alpha-кривую.
* У внешнего края последняя треть панели уже полностью совпадает с фоном. */
.screen-content.network-scroll-lock {
top: var(--call-minimized-bar-height, 0px) !important;
left: 0;
right: 0;
bottom: 0 !important;
padding: 0 !important;
}
.screen-content.network-scroll-lock .network-screen,
.screen-content.network-scroll-lock .network-stage {
width: 100%;
height: 100%;
min-height: 0;
margin: 0;
}
/* Фильтры остаются ниже интерактивной части topbar. */
.network-stage > .fg-filter-bar.app-top-tabs {
top: calc(var(--topbar-height, 64px) + var(--app-primary-tabs-top-gap, 14px)) !important;
}
/* Верхняя панель: зеркальная пара к нижней. Граф полностью скрыт примерно
* в последней трети пути к верхнему краю, без blur и без отдельной плашки. */
.app-shell:has(.screen-content.network-scroll-lock) .topbar-slot::before {
height: 100%;
background: linear-gradient(
to bottom,
rgba(5, 7, 10, 1) 0%,
rgba(5, 7, 10, 1) 32%,
rgba(5, 7, 10, 0.94) 38%,
rgba(5, 7, 10, 0.72) 46%,
rgba(5, 7, 10, 0.46) 54%,
rgba(5, 7, 10, 0.22) 61%,
rgba(5, 7, 10, 0.08) 65%,
rgba(5, 7, 10, 0) 68%,
rgba(5, 7, 10, 0) 100%
);
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
-webkit-mask-image: none !important;
mask-image: none !important;
}
/* Нижняя панель не имеет собственной рамки/стеклянной плашки: её фон формирует
* только затухание графа, поэтому toolbar визуально сливается с #05070A. */
.app-shell:has(.screen-content.network-scroll-lock) .toolbar-slot {
z-index: 20;
isolation: isolate;
overflow: visible !important;
background: transparent !important;
border: 0 !important;
box-shadow: none !important;
}
/* Низ — точное зеркало верхней alpha-кривой. Граф полностью пропадает на ~68%
* высоты бара, поэтому оставшаяся примерно треть до нижнего края — чистый фон. */
.app-shell:has(.screen-content.network-scroll-lock) .toolbar-slot::before {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 100%;
z-index: 0;
pointer-events: none;
background: linear-gradient(
to bottom,
rgba(5, 7, 10, 0) 0%,
rgba(5, 7, 10, 0) 32%,
rgba(5, 7, 10, 0.08) 35%,
rgba(5, 7, 10, 0.22) 39%,
rgba(5, 7, 10, 0.46) 46%,
rgba(5, 7, 10, 0.72) 54%,
rgba(5, 7, 10, 0.94) 62%,
rgba(5, 7, 10, 1) 68%,
rgba(5, 7, 10, 1) 100%
);
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
-webkit-mask-image: none !important;
mask-image: none !important;
}
.app-shell:has(.screen-content.network-scroll-lock) .toolbar-slot > .toolbar {
position: relative;
z-index: 1;
background: transparent !important;
border: 0 !important;
border-color: transparent !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* ===== Единая полировка меню, DM и управляющих кнопок (2026-08-26) ===== */
/* Центральная вкладка остаётся на прежней оси иконок, но имеет большую
* интерактивную область; подпись опущена ниже и больше не заходит на логотип. */
.toolbar-btn-network {
width: calc(100% + 6px);
min-height: 58px;
margin-inline: -3px;
}
.toolbar-btn-network > span:last-child {
display: block;
position: relative;
transform: translateY(7px);
}
/* Общая круглая кнопка прокрутки. Её цвет задаётся --shine-action-blue. */
.scroll-to-bottom-btn {
width: 54px;
height: 54px;
right: 16px;
border-radius: 50%;
}
.scroll-to-bottom-btn__icon {
font-size: 28px;
font-weight: 700;
transform: translateY(-2px);
}
/* Один визуальный язык для меню профиля, чатов и каналов. */
.dm-head-menu,
.channel-menu-wrap,
.dm-message-actions-menu {
min-width: 196px;
padding: 6px;
gap: 2px;
border: 1px solid rgba(92, 190, 255, 0.22);
border-radius: 16px;
background: linear-gradient(155deg, rgba(19, 27, 42, 0.97), rgba(7, 12, 22, 0.98));
box-shadow:
0 18px 42px rgba(0, 0, 0, 0.48),
0 0 24px rgba(39, 141, 255, 0.10),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
backdrop-filter: blur(20px) saturate(125%);
-webkit-backdrop-filter: blur(20px) saturate(125%);
}
/* У меню больше нет «облачного» треугольного хвостика. */
.dm-head-menu::before {
display: none !important;
content: none !important;
}
.dm-head-menu-item,
.channel-menu-item,
.dm-message-action-btn {
width: 100%;
min-height: 42px;
padding: 0 11px;
display: flex;
align-items: center;
justify-content: flex-start;
gap: 10px;
border: 0;
border-radius: 10px;
background: transparent;
color: #f4f8ff;
font: inherit;
font-size: 14px;
font-weight: 600;
line-height: 1.2;
text-align: left;
white-space: nowrap;
}
.dm-head-menu-item:hover,
.dm-head-menu-item:focus-visible,
.channel-menu-item:hover,
.channel-menu-item:focus-visible,
.dm-message-action-btn:hover,
.dm-message-action-btn:focus-visible {
outline: none;
background: rgba(39, 141, 255, 0.12);
}
.dm-head-menu-item svg,
.dm-head-menu-item img,
.channel-menu-icon,
.dm-menu-icon,
.dm-menu-image-icon {
width: 18px;
height: 18px;
min-width: 18px;
flex: 0 0 18px;
object-fit: contain;
color: #65b7ff;
filter: drop-shadow(0 0 5px rgba(39, 141, 255, 0.28));
}
.profile-head-menu .profile-head-menu-item img {
width: 17px;
height: 17px;
min-width: 17px;
flex-basis: 17px;
}
.channel-menu-wrap--portal {
position: fixed;
}
.channel-menu-divider {
margin: 4px 8px !important;
background: rgba(255, 255, 255, 0.08) !important;
}
.channel-menu-item.destructive,
.dm-message-action-btn--danger {
color: #ffb7c5;
background: transparent;
}
.channel-menu-toggle {
min-height: 42px;
padding: 0 11px;
border-radius: 10px;
}
.channel-menu-toggle-label {
display: inline-flex;
align-items: center;
gap: 10px;
}
.dm-message-actions-menu {
width: min(78vw, 240px);
}
.dm-user-identity-menu {
width: 196px;
}
.dm-user-menu-layer {
pointer-events: auto;
}
.chat-header-login-btn {
padding: 4px 7px;
min-height: 34px;
border: 0;
border-radius: 10px;
background: transparent;
cursor: pointer;
}
/* Поле сообщения занимает почти всю ширину; действия прижаты к правому краю. */
body.chat-topbar-overlay .composer-slot {
padding-left: 0;
padding-right: 4px;
}
.dm-chat-input {
gap: 4px;
padding-left: 0;
padding-right: 0;
}
.dm-actions-col {
grid-template-columns: repeat(2, 43px);
grid-template-rows: 46px;
gap: 2px;
}
.dm-chat-input--multiline .dm-actions-col {
grid-template-columns: 43px;
}
.dm-emoji-btn,
.dm-send-icon-btn {
min-width: 43px;
width: 43px;
}
/* Loader не имеет права участвовать в растяжении пустого flex-контейнера. */
.dm-history-loader {
flex: 0 0 34px;
align-self: center;
width: max-content;
max-width: calc(100% - 24px);
height: 34px;
min-height: 34px;
max-height: 34px;
top: calc(var(--topbar-height, 64px) + 8px);
margin: 0 auto -4px;
overflow: visible;
}
.dm-history-loader__pill {
flex: 0 0 auto;
width: max-content;
max-width: 100%;
height: 34px;
}
/* «Личные»: широкие, низкие и более плотные плитки. */
.dm-list-screen .dm-list {
width: calc(100% + 16px);
margin-inline: -8px;
gap: 4px;
}
.dm-list-screen .dm-dialog-card {
grid-template-columns: 50px minmax(0, 1fr) auto;
min-height: 54px;
margin: 0;
padding: 5px 6px 5px 4px;
gap: 8px;
border-radius: 15px;
}
.dm-list-screen .dm-av,
.dm-list-screen .dm-av .avatar,
.dm-list-screen .list-item .avatar {
width: 48px;
height: 48px;
min-width: 48px;
min-height: 48px;
}
.dm-list-screen .dm-row-main,
.dm-list-screen .dm-row-meta-col {
min-height: 40px;
}
@media (max-width: 380px) {
.dm-list-screen .dm-dialog-card {
grid-template-columns: 50px minmax(0, 1fr) auto;
}
}
/* Новый двухшаговый login flow */
.login-remote-server {
width: 100%;
padding: 14px;
border: 1px solid rgba(182, 201, 235, 0.18);
border-radius: 14px;
background: rgba(4, 11, 25, 0.44);
}
.login-server-link {
display: inline-flex;
align-items: center;
justify-content: center;
width: 100%;
overflow-wrap: anywhere;
text-decoration: none;
}
.login-device-preparation {
width: 100%;
}
.secret-generation-overlay {
position: fixed;
inset: 0;
z-index: 12000;
place-items: center;
padding: 24px;
background: rgba(1, 5, 14, 0.72);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
}
.secret-generation-card {
width: min(100%, 290px);
place-items: center;
padding: 28px 24px;
border: 1px solid rgba(205, 220, 246, 0.18);
border-radius: 20px;
background: rgba(7, 15, 31, 0.9);
box-shadow: 0 22px 54px rgba(0, 0, 0, 0.34);
text-align: center;
}
.secret-generation-spinner {
width: 42px;
height: 42px;
border: 3px solid rgba(220, 232, 255, 0.18);
border-top-color: transparent;
border-radius: 50%;
animation: secret-generation-spin 0.82s linear infinite;
}
.secret-generation-title {
color: var(--preauth-ivory, #f4ebdd);
font-size: 18px;
font-weight: 650;
}
.secret-generation-progress {
min-height: 20px;
color: var(--preauth-muted, #a8bcdf);
font-size: 13px;
}
@keyframes secret-generation-spin {
to { transform: rotate(360deg); }
}
/* ===== 2026-08-28: единое dropdown-меню для чатов / каналов / профиля ===== */
.shared-dropdown-menu {
position: fixed;
z-index: 12000;
}
.shared-dropdown-menu__item.is-selected {
background: rgba(39, 141, 255, 0.14);
}
.shared-dropdown-menu__icon {
width: 22px;
height: 22px;
min-width: 22px;
flex: 0 0 22px;
display: inline-grid;
place-items: center;
}
.shared-dropdown-menu__icon > svg,
.shared-dropdown-menu__item > img {
width: 22px;
height: 22px;
min-width: 22px;
flex: 0 0 22px;
object-fit: contain;
color: #65b7ff;
filter: drop-shadow(0 0 5px rgba(39, 141, 255, 0.28));
}
.profile-head-menu .shared-dropdown-menu__item > img {
width: 27px;
height: 27px;
min-width: 27px;
flex-basis: 27px;
filter: drop-shadow(0 0 6px rgba(101, 183, 255, 0.36));
}
.dm-head-filter-title,
.channels-filter-title {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
cursor: pointer;
}
.dm-head-filter-title::after,
.channels-filter-title::after {
content: '⌄';
font-size: 13px;
line-height: 1;
opacity: 0.72;
transform: translateY(-1px);
}
/* ===== Выбор языка со стартового экрана ===== */
.language-screen {
width: min(100%, 430px);
margin-inline: auto;
}
.language-choice-card {
padding: 16px;
background: rgba(38, 43, 52, 0.74);
border: 1px solid rgba(255, 255, 255, 0.10);
}
.language-choice-hint {
margin: 0 0 4px;
text-align: center;
}
.language-choice-grid {
display: grid;
gap: 10px;
}
.language-choice-option {
min-height: 64px;
padding: 0 16px;
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
gap: 12px;
border: 1px solid rgba(210, 222, 241, 0.16) !important;
border-radius: 16px;
background: rgba(255, 255, 255, 0.035) !important;
text-align: left;
}
.language-choice-option.is-selected {
border-color: rgba(92, 190, 255, 0.62) !important;
background: rgba(39, 141, 255, 0.12) !important;
box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 0 20px rgba(39,141,255,.10) !important;
}
.language-choice-name {
font-size: 17px;
font-weight: 650;
}
.language-choice-code {
color: rgba(255,255,255,.5);
font-size: 13px;
font-weight: 700;
letter-spacing: .08em;
}
/* ===== Вход через другое устройство: заголовок внутри панели ===== */
.auth-screen--other-device {
justify-content: flex-start;
padding-top: max(18px, env(safe-area-inset-top));
}
.auth-screen--other-device .login-panel {
margin-top: 0;
}
.login-panel-inline-back {
width: 100%;
min-height: 42px;
display: flex;
align-items: center;
justify-content: flex-start !important;
gap: 10px;
padding: 0 2px;
font-size: 18px;
font-weight: 700;
text-align: left;
}
.login-panel-inline-back > span:first-child {
font-size: 24px;
line-height: 1;
}
/* ===== Pairing: простое Подключить / Отклонить + выбор доступных ключей ===== */
:root button.pairing-approve-btn,
:root button.pairing-approve-btn:hover,
:root button.pairing-approve-btn:focus {
background: linear-gradient(180deg, rgba(57, 180, 108, .92), rgba(22, 116, 69, .94)) !important;
border: 1px solid rgba(126, 235, 170, .55) !important;
border-radius: 14px;
box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 8px 22px rgba(22,116,69,.20) !important;
}
:root button.pairing-reject-btn,
:root button.pairing-reject-btn:hover,
:root button.pairing-reject-btn:focus {
color: #fff1f3 !important;
background: rgba(134, 31, 49, .28) !important;
border: 1px solid rgba(255, 105, 128, .42) !important;
border-radius: 14px;
}
.pairing-request-actions > button {
flex: 1 1 140px;
}
.pairing-transfer-dialog {
position: fixed;
inset: 0;
z-index: 13000;
}
.pairing-transfer-dialog__backdrop {
position: absolute;
inset: 0;
background: rgba(3, 7, 15, .76);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
.pairing-transfer-dialog__card {
position: absolute;
left: 50%;
top: 50%;
width: min(calc(100vw - 28px), 390px);
transform: translate(-50%, -50%);
padding: 16px;
gap: 14px;
}
.pairing-transfer-key-list {
display: grid;
gap: 9px;
}
.pairing-transfer-key {
display: grid;
grid-template-columns: auto 1fr;
align-items: center;
gap: 11px;
min-height: 58px;
padding: 9px 12px;
border: 1px solid rgba(255,255,255,.11);
border-radius: 14px;
background: rgba(255,255,255,.035);
}
.pairing-transfer-key span {
display: grid;
gap: 2px;
}
.pairing-transfer-key small {
color: rgba(255,255,255,.48);
}
.pairing-transfer-key.is-required {
opacity: .82;
}
.pairing-transfer-dialog__actions {
justify-content: flex-end;
flex-wrap: wrap;
}
/* ===== Каналы: плотные широкие строки, badge сверху, время на линии preview ===== */
.channels-screen--list .channels-list-content,
.channels-screen--list .channels-groups {
width: 100%;
}
.channels-screen--list .channel-row {
position: relative;
width: calc(100% - 2px);
grid-template-columns: 46px minmax(0, 1fr);
gap: 8px;
min-height: 44px;
margin: 1px 1px;
padding: 3px 6px 3px 3px;
border-radius: 14px;
}
.channels-screen--list .channel-row .avatar {
width: 42px;
height: 42px;
min-width: 42px;
min-height: 42px;
}
.channels-screen--list .channel-row-main {
min-width: 0;
padding-right: 6px;
gap: 1px;
}
.channels-screen--list .channel-row-preview-line {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: baseline;
gap: 8px;
min-width: 0;
}
.channels-screen--list .channel-row-preview-line .channel-row-message {
min-width: 0;
margin: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.channels-screen--list .channel-row-preview-line .channel-row-time {
align-self: baseline;
margin: 0;
white-space: nowrap;
font-size: 11px;
}
.channels-screen--list .channel-row-controls {
position: absolute;
top: 5px;
right: 7px;
width: auto;
min-width: 0;
height: auto;
}
.channels-screen--list .channel-row-count,
.channels-screen--list .unread.channel-row-count {
position: static !important;
margin: 0 !important;
}
/* ===== Вложенные настройки: тот же рамочный язык действий ===== */
:root .screen-content.settings-bordered-actions button:not(.icon-btn):not(.key-toggle-btn):not(.channel-toggle-btn):not(.fg-filter-chip):not(.toolbar-btn):not(.pairing-approve-btn):not(.pairing-reject-btn) {
border: 1px solid rgba(183, 203, 235, 0.28) !important;
border-radius: 14px;
background:
linear-gradient(180deg, rgba(255,255,255,.055), transparent 30%),
rgba(8, 19, 42, .58) !important;
box-shadow:
inset 0 1px 0 rgba(255,255,255,.10),
0 5px 16px rgba(0,0,0,.18) !important;
padding-inline: 14px;
}
:root .screen-content.settings-bordered-actions button:not(.icon-btn):not(.key-toggle-btn):not(.channel-toggle-btn):not(.fg-filter-chip):not(.toolbar-btn):not(.pairing-approve-btn):not(.pairing-reject-btn):hover {
border-color: rgba(213, 225, 247, 0.42) !important;
background:
linear-gradient(180deg, rgba(255,255,255,.075), transparent 30%),
rgba(10, 24, 52, .68) !important;
}
/* ===== UX refinements 2026-08-29 ===== */
/* Start: larger breathing room between brand and actions. */
.auth-screen--welcome .auth-brand {
margin-bottom: clamp(34px, 6vh, 58px) !important;
}
.auth-screen--welcome .shine-actions {
margin-top: 0;
}
/* Language selector: actual two-position switch with explicit confirmation. */
.language-segmented-control {
position: relative;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0;
padding: 4px;
min-height: 58px;
border: 1px solid rgba(190, 210, 238, .18);
border-radius: 18px;
background: rgba(12, 22, 40, .72);
overflow: hidden;
}
.language-segmented-thumb {
position: absolute;
z-index: 0;
top: 4px;
bottom: 4px;
left: 4px;
width: calc(50% - 4px);
border: 1px solid rgba(99, 190, 255, .52);
border-radius: 14px;
background: linear-gradient(180deg, rgba(76, 166, 255, .28), rgba(30, 105, 204, .20));
box-shadow: inset 0 1px 0 rgba(255,255,255,.10), 0 0 18px rgba(63,160,255,.14);
transition: transform 180ms ease;
}
.language-choice-card[data-language="en"] .language-segmented-thumb { transform: translateX(100%); }
.language-segment {
position: relative;
z-index: 1;
min-height: 50px;
padding: 0 12px;
border: 0 !important;
background: transparent !important;
color: rgba(231,239,255,.64);
font-size: 16px;
font-weight: 650;
}
.language-segment.is-selected { color: #eef8ff; }
.language-choice-actions {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-top: 8px;
}
.language-choice-actions .shine-btn { height: 50px; }
/* Entry settings actions use the existing Start button visual language without huge width side effects. */
.screen-content.preauth-flow .server-check-btn.shine-btn {
width: auto;
height: 44px;
min-height: 44px;
padding-inline: 18px;
border-radius: 14px;
font-size: 15px;
}
.screen-content.preauth-flow .auth-footer-actions .shine-btn {
width: 100%;
}
/* Channels: much wider, substantially shorter rows. */
.channels-screen--list .channels-list-content,
.channels-screen--list .channels-groups,
.channels-screen--list .stack:has(> .channel-row) {
width: calc(100% + 16px) !important;
margin-left: -8px !important;
margin-right: -8px !important;
}
.channels-screen--list .channel-row {
width: 100% !important;
min-height: 54px !important;
margin: 1px 0 !important;
padding: 5px 6px 5px 4px !important;
grid-template-columns: 50px minmax(0, 1fr) !important;
gap: 8px !important;
border-radius: 15px !important;
}
.channels-screen--list .channel-row .avatar {
width: 48px !important;
height: 48px !important;
min-width: 48px !important;
min-height: 48px !important;
}
.channels-screen--list .channel-row-main {
gap: 0 !important;
padding-right: 3px !important;
align-self: center;
overflow: hidden;
}
.channels-screen--list .channel-row-title,
.channels-screen--list .channel-row-technical,
.channels-screen--list .channel-row-description,
.channels-screen--list .channel-row-owner {
margin-block: 0 !important;
line-height: 1.12 !important;
}
.channels-screen--list .channel-row-preview-line {
display: flex !important;
align-items: baseline !important;
gap: 7px !important;
min-width: 0 !important;
width: 100% !important;
line-height: 1.15 !important;
}
.channels-screen--list .channel-row-preview-line .channel-row-message {
flex: 1 1 auto !important;
min-width: 0 !important;
max-width: 100% !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
line-height: 1.15 !important;
}
.channels-screen--list .channel-row-preview-line .channel-row-time {
flex: 0 0 auto !important;
position: static !important;
align-self: baseline !important;
margin: 0 !important;
padding: 0 !important;
line-height: 1.15 !important;
transform: none !important;
white-space: nowrap !important;
}
.channels-screen--list .channel-row-controls { top: 3px !important; right: 5px !important; }
/* Toolbar: reserve enough vertical room for the Connections label and safe area. */
:root { --toolbar-height: 88px; }
.toolbar-slot {
min-height: calc(88px + env(safe-area-inset-bottom)) !important;
overflow: visible !important;
padding-bottom: env(safe-area-inset-bottom) !important;
}
.toolbar {
min-height: 82px !important;
overflow: visible !important;
padding-bottom: 6px !important;
align-items: end;
}
.toolbar-btn-network {
min-height: 72px !important;
align-content: end !important;
overflow: visible !important;
padding-bottom: 2px !important;
}
.toolbar-btn-network .toolbar-icon-img {
transform: translateY(-4px) !important;
}
.toolbar-btn-network > span:last-child {
display: block !important;
transform: translateY(-2px) !important;
line-height: 1.05 !important;
padding-bottom: 1px !important;
}
.channels-screen--list .channel-row-technical,
.channels-screen--list .channel-row-description,
.channels-screen--list .channel-row-owner {
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;
}
.badge.profile-toggle-btn.is-not-interested {
border-color: rgba(170, 180, 205, 0.38);
color: #d7deea;
background: rgba(116, 126, 148, 0.18);
}
.profile-shine-not-interested {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 50%;
border: 1px solid rgba(170, 180, 205, 0.34);
background: rgba(116, 126, 148, 0.14);
color: #d7deea;
font-size: 20px;
line-height: 1;
}
.profile-param-value {
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.profile-shine-not-interested img {
width: 22px;
height: 22px;
display: block;
}
/* Profile v18 statistics/lists */
.profile-stats-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.profile-stat-card{display:flex;flex-direction:column;align-items:flex-start;gap:3px;text-align:left;cursor:pointer}
.profile-stat-card b{font-size:22px}.profile-stat-card span{font-size:12px;opacity:.78}
.profile-list-row{width:100%;align-items:center;gap:12px;text-align:left;cursor:pointer}
.profile-list-row-text{display:flex;flex-direction:column;gap:3px;min-width:0}.profile-list-row-text small{opacity:.68}
.profile-bottom-actions{justify-content:center;gap:12px;position:sticky;bottom:12px;z-index:3}
.profile-about:empty{display:none}
/* ===== «Связи»: боковой fade, ослабленный в зоне центрального света =====
* Радиальная виньетка давала слишком общий эффект. Здесь края затухают независимо:
* по X — узкой мягкой полосой от левого/правого края, а по Y сила этой полосы
* уменьшается возле источника света графа (50% / 47%) и растёт к углам.
* Поэтому центральное свечение визуально доходит почти до боковой кромки, тогда как
* верхние/нижние участки графа растворяются по краям раньше. Blur не используется. */
.app-shell:has(.screen-content.network-scroll-lock) .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%
);
}
/* DM header: human name is primary, login remains secondary. */
.chat-header-login-btn{display:flex;flex-direction:column;align-items:flex-start;line-height:1.1}
.chat-header-display-name{font-size:14px;font-weight:650}
.chat-header-user-login{font-size:11px;font-weight:400;opacity:.68;margin-top:2px}
/* ===== Профиль другого пользователя: плавающая композиция без рамок (2026-09-01) ===== */
.user-profile-screen {
--user-profile-avatar-size: min(33.6vw, 134px);
--user-profile-metric-size: clamp(42px, 12vw, 48px);
position: relative;
min-height: 100%;
gap: 0;
isolation: isolate;
overflow-x: hidden;
margin-top: -8px;
}
.user-profile-screen::before {
content: '';
position: absolute;
z-index: -1;
inset: 4% 0 14%;
pointer-events: none;
background:
radial-gradient(circle at 50% 27%, rgba(73, 113, 189, 0.16), transparent 29%),
radial-gradient(circle at 25% 58%, rgba(49, 198, 255, 0.08), transparent 24%),
radial-gradient(circle at 76% 56%, rgba(224, 190, 86, 0.07), transparent 25%);
filter: blur(18px);
}
.user-profile-status {
min-height: 0;
margin: 0;
text-align: center;
font-size: 12px;
}
.user-profile-status:empty {
display: none;
}
.user-profile-body {
display: flex;
flex-direction: column;
align-items: stretch;
min-height: 0;
padding: 0 0 10px;
}
.user-profile-hero {
display: grid;
grid-template-columns: minmax(0, 1fr) var(--user-profile-avatar-size) minmax(0, 1fr);
grid-template-rows: 1fr 1fr;
align-items: stretch;
width: 100%;
height: var(--user-profile-avatar-size);
margin-top: 0;
}
.user-profile-avatar-slot {
grid-column: 2;
grid-row: 1 / 3;
width: var(--user-profile-avatar-size);
height: var(--user-profile-avatar-size);
display: grid;
place-items: center;
align-self: center;
justify-self: center;
z-index: 2;
}
.user-profile-screen .user-profile-hero-avatar.avatar,
.user-profile-screen .user-profile-hero-avatar.avatar-image {
width: 100%;
height: 100%;
min-width: 100%;
min-height: 100%;
overflow: visible;
border: 0 !important;
background: transparent;
box-shadow: none;
}
/* На профиле используем ту же стеклянную обводку аватара, что и в остальных местах приложения. */
.user-profile-screen .user-profile-hero-avatar.avatar-framed::after {
display: block;
}
.user-profile-screen .user-profile-hero-avatar.avatar-framed > .avatar-fallback,
.user-profile-screen .user-profile-hero-avatar.avatar-framed > .avatar-photo {
width: 92.5%;
height: 92.5%;
}
.user-profile-screen .user-profile-hero-avatar.avatar-glow::before {
inset: -12%;
opacity: 0.5;
}
.user-profile-screen .user-profile-hero-avatar .avatar-fallback {
font-size: clamp(34px, 9vw, 58px);
font-weight: 800;
}
.user-profile-metric {
width: min(100%, 92px);
min-width: 0;
padding: 0;
border: 0;
outline: 0;
background: transparent;
box-shadow: none;
display: flex;
flex-direction: column;
align-items: center;
gap: 5px;
color: #edf5ff;
cursor: pointer;
}
.user-profile-metric:focus-visible .user-profile-metric-circle,
.user-profile-metric:active .user-profile-metric-circle {
transform: scale(0.94);
}
.user-profile-metric-circle {
width: var(--user-profile-metric-size);
height: var(--user-profile-metric-size);
min-width: var(--user-profile-metric-size);
min-height: var(--user-profile-metric-size);
border-radius: 50%;
display: grid;
place-items: center;
border: 0;
background: rgba(14, 25, 43, 0.34);
box-shadow: none;
color: rgba(238, 246, 255, 0.94);
font-size: clamp(15px, 4.2vw, 19px);
font-weight: 800;
line-height: 1;
transition: transform 120ms ease, filter 160ms ease, box-shadow 160ms ease;
}
.user-profile-metric.is-glowing .user-profile-metric-circle {
color: var(--app-topbar-gold);
background: rgba(14, 25, 43, 0.42);
box-shadow:
0 0 8px var(--app-topbar-blue-glow),
0 0 22px var(--app-topbar-blue-glow-soft),
0 0 38px rgba(72, 145, 255, 0.18);
text-shadow:
0 0 5px var(--app-topbar-blue-glow),
0 0 14px var(--app-topbar-blue-glow-soft);
}
.user-profile-metric-label {
width: 100%;
min-height: 24px;
color: rgba(205, 220, 243, 0.78);
font-size: clamp(9px, 2.8vw, 11px);
font-weight: 600;
line-height: 1.08;
text-align: center;
}
.user-profile-metric.is-top-left,
.user-profile-metric.is-bottom-left {
grid-column: 1;
justify-self: end;
padding-right: clamp(4px, 2vw, 10px);
}
.user-profile-metric.is-top-right,
.user-profile-metric.is-bottom-right {
grid-column: 3;
justify-self: start;
padding-left: clamp(4px, 2vw, 10px);
}
/* Парные подписи читаются от центра: у левых к аватару прижат конец текста, у правых — начало. */
.user-profile-hero .user-profile-metric.is-top-left .user-profile-metric-label,
.user-profile-hero .user-profile-metric.is-bottom-left .user-profile-metric-label {
text-align: right;
align-self: flex-end;
}
.user-profile-hero .user-profile-metric.is-top-right .user-profile-metric-label,
.user-profile-hero .user-profile-metric.is-bottom-right .user-profile-metric-label {
text-align: left;
align-self: flex-start;
}
.user-profile-metric.is-top-left,
.user-profile-metric.is-top-right {
grid-row: 1;
align-self: start;
}
.user-profile-metric.is-bottom-left,
.user-profile-metric.is-bottom-right {
grid-row: 2;
align-self: end;
flex-direction: column-reverse;
}
.user-profile-channel-metrics {
width: 66.666%;
margin: clamp(22px, 4vh, 30px) auto 0;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
align-items: start;
justify-items: center;
}
.user-profile-channel-metrics .user-profile-metric {
width: 100%;
}
.user-profile-channel-metrics .user-profile-metric-label {
min-height: 16px;
font-size: 11px;
}
.user-profile-actions-wrap {
position: relative;
width: min(86%, 310px);
margin: clamp(18px, 3.4vh, 26px) auto 0;
}
.user-profile-actions {
display: grid;
grid-template-columns: repeat(3, 1fr);
align-items: center;
justify-items: center;
}
.user-profile-action-btn {
width: 54px;
height: 54px;
min-width: 54px;
min-height: 54px;
padding: 7px;
display: grid;
place-items: center;
border: 0 !important;
border-radius: 50%;
outline: 0;
background: transparent !important;
box-shadow: none !important;
color: rgba(226, 238, 255, 0.86);
cursor: pointer;
opacity: 0.9;
transition: transform 120ms ease, filter 160ms ease, opacity 160ms ease;
}
.user-profile-action-btn:hover,
.user-profile-action-btn:focus-visible {
opacity: 1;
filter: drop-shadow(0 0 10px rgba(95, 196, 255, 0.42));
}
.user-profile-action-btn:active {
transform: scale(0.9);
}
.user-profile-action-btn.is-active {
color: #d9f8ff;
filter: drop-shadow(0 0 9px rgba(83, 211, 255, 0.52));
}
.user-profile-action-btn img {
display: block;
width: 32px;
height: 32px;
object-fit: contain;
}
.user-profile-action-btn.is-links img {
width: 39px;
height: 39px;
filter: brightness(1.08);
}
.user-profile-action-svg {
width: 38px;
height: 38px;
overflow: visible;
fill: none;
stroke: currentColor;
stroke-width: 2.8;
stroke-linecap: round;
stroke-linejoin: round;
}
.user-profile-add-menu {
position: absolute;
z-index: 12;
left: 0;
bottom: calc(100% + 8px);
width: min(190px, 68vw);
padding: 6px 4px;
border: 0;
border-radius: 18px;
background: linear-gradient(180deg, rgba(13, 20, 35, 0.93), rgba(5, 10, 20, 0.88));
box-shadow: 0 18px 42px rgba(0, 0, 0, 0.38);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
transform-origin: 28px 100%;
animation: user-profile-menu-in 130ms ease-out both;
}
.user-profile-add-menu[hidden] {
display: none !important;
}
.user-profile-add-menu.is-busy {
pointer-events: none;
opacity: 0.58;
}
.user-profile-add-option {
width: 100%;
min-height: 42px;
padding: 8px 11px;
border: 0;
border-radius: 12px;
background: transparent;
box-shadow: none;
display: grid;
grid-template-columns: 1fr 24px;
align-items: center;
gap: 8px;
text-align: left;
color: rgba(231, 239, 255, 0.88);
font-size: 13px;
cursor: pointer;
}
.user-profile-add-option:hover,
.user-profile-add-option:focus-visible,
.user-profile-add-option.is-current {
background: radial-gradient(circle at 18% 50%, rgba(70, 171, 224, 0.14), transparent 68%);
color: #ffffff;
}
.user-profile-add-option-check {
color: #8deeff;
font-weight: 800;
text-align: center;
text-shadow: 0 0 9px rgba(89, 224, 255, 0.7);
}
.user-profile-detail-links {
width: min(86%, 330px);
margin: clamp(16px, 3vh, 24px) auto 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: 30px;
}
.user-profile-detail-links button {
position: relative;
isolation: isolate;
min-height: 38px;
padding: 5px 8px;
border: 0 !important;
background: transparent !important;
box-shadow: none !important;
color: rgba(229, 239, 253, 0.86);
font-size: 15px;
font-weight: 650;
cursor: pointer;
text-shadow:
0 0 4px rgba(92, 190, 255, 0.46),
0 0 11px rgba(72, 145, 255, 0.2);
}
.user-profile-detail-links button::before {
content: '';
position: absolute;
z-index: -1;
left: 50%;
top: 50%;
width: 112px;
height: 34px;
transform: translate(-50%, -50%);
border-radius: 50%;
pointer-events: none;
background: radial-gradient(ellipse at center, rgba(92, 190, 255, 0.14) 0%, rgba(72, 145, 255, 0.07) 46%, transparent 74%);
filter: blur(4px);
}
.user-profile-detail-links button:hover,
.user-profile-detail-links button:focus-visible {
color: #f2f7ff;
text-shadow: 0 0 12px rgba(111, 189, 255, 0.34);
}
.user-profile-sheet-backdrop {
position: fixed;
z-index: 1400;
inset: 0;
display: flex;
align-items: flex-end;
justify-content: center;
padding: 0 max(10px, env(safe-area-inset-right)) max(10px, env(safe-area-inset-bottom)) max(10px, env(safe-area-inset-left));
background: rgba(0, 0, 0, 0.34);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(3px);
}
.user-profile-sheet {
width: min(100%, 410px);
max-height: min(58vh, 480px);
overflow: auto;
padding: 10px 20px calc(22px + env(safe-area-inset-bottom));
border: 0;
border-radius: 28px 28px 18px 18px;
background:
radial-gradient(circle at 50% -12%, rgba(73, 145, 211, 0.16), transparent 42%),
linear-gradient(180deg, rgba(13, 20, 34, 0.96), rgba(5, 9, 17, 0.97));
box-shadow: 0 -20px 55px rgba(0, 0, 0, 0.46);
animation: user-profile-sheet-in 180ms ease-out both;
}
.user-profile-sheet-handle {
width: 42px;
height: 4px;
margin: 1px auto 14px;
border-radius: 999px;
background: rgba(211, 226, 246, 0.2);
}
.user-profile-sheet-title {
margin-bottom: 16px;
color: #f2f7ff;
font-size: 19px;
font-weight: 800;
text-align: center;
}
.user-profile-sheet-content {
display: grid;
gap: 13px;
}
.user-profile-sheet-copy {
white-space: pre-wrap;
overflow-wrap: anywhere;
color: rgba(225, 234, 248, 0.88);
font-size: 14px;
line-height: 1.58;
}
.user-profile-sheet-copy.is-muted {
color: rgba(194, 207, 229, 0.56);
text-align: center;
}
.user-profile-contact-row {
display: grid;
grid-template-columns: minmax(70px, auto) minmax(0, 1fr);
gap: 14px;
align-items: baseline;
}
.user-profile-contact-row span {
color: rgba(181, 198, 225, 0.56);
font-size: 12px;
}
.user-profile-contact-row b {
overflow-wrap: anywhere;
color: rgba(233, 240, 252, 0.9);
font-size: 14px;
font-weight: 600;
text-align: right;
}
@keyframes user-profile-menu-in {
from { opacity: 0; transform: translateY(8px) scale(0.96); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes user-profile-sheet-in {
from { opacity: 0; transform: translateY(24px); }
to { opacity: 1; transform: translateY(0); }
}
@media (max-height: 700px) {
.user-profile-channel-metrics {
margin-top: 18px;
}
.user-profile-actions-wrap {
margin-top: 16px;
}
.user-profile-detail-links {
margin-top: 14px;
}
}
@media (max-width: 350px) {
.user-profile-screen {
--user-profile-metric-size: 40px;
}
.user-profile-metric-label {
font-size: 9px;
}
.user-profile-actions-wrap {
width: 92%;
}
}
/* Боковые метрики: круг строго остаётся внутри высоты аватара, подпись может быть ниже. */
.user-profile-hero > .user-profile-metric {
position: relative;
height: var(--user-profile-metric-size);
gap: 0;
}
.user-profile-hero > .user-profile-metric .user-profile-metric-label {
position: absolute;
top: calc(100% + 5px);
left: 0;
}
.user-profile-metric.is-bottom-left,
.user-profile-metric.is-bottom-right {
flex-direction: column;
}
/* ===== Профиль другого пользователя: геометрия v4 (2026-09-01) =====
* - однородный фон без локальных пятен;
* - аватар +10% относительно v3;
* - все малые круги +10% и строго симметричны по четвертям высоты аватара;
* - неактивные круги полностью прозрачные;
* - активное состояние даёт только внешний ореол невидимой окружности (эффект затмения);
* - подписи якорятся на собственных кругах и остаются в боковых колонках.
*/
.user-profile-screen {
--user-profile-avatar-size: min(36.96vw, 147px);
--user-profile-metric-size: clamp(46px, 13.2vw, 53px);
margin-top: 0;
background: transparent;
}
.user-profile-screen::before {
display: none;
content: none;
}
.user-profile-body {
padding-top: clamp(10px, 1.8vh, 16px);
}
.user-profile-hero {
grid-template-columns: minmax(0, 1fr) var(--user-profile-avatar-size) minmax(0, 1fr);
grid-template-rows: repeat(2, minmax(0, 1fr));
height: var(--user-profile-avatar-size);
margin-top: 0;
overflow: visible;
}
/* Боковые метрики имеют ровно размер своего невидимого круга.
Это исключает разные смещения слева/справа из-за ширины текста. */
.user-profile-hero > .user-profile-metric {
position: relative;
width: var(--user-profile-metric-size);
min-width: var(--user-profile-metric-size);
height: var(--user-profile-metric-size);
padding: 0;
gap: 0;
justify-self: center;
align-self: center;
overflow: visible;
}
.user-profile-metric.is-top-left,
.user-profile-metric.is-bottom-left {
grid-column: 1;
padding-right: 0;
}
.user-profile-metric.is-top-right,
.user-profile-metric.is-bottom-right {
grid-column: 3;
padding-left: 0;
}
.user-profile-metric.is-top-left,
.user-profile-metric.is-top-right {
grid-row: 1;
align-self: center;
}
.user-profile-metric.is-bottom-left,
.user-profile-metric.is-bottom-right {
grid-row: 2;
align-self: center;
flex-direction: column;
}
.user-profile-metric-circle {
position: relative;
z-index: 1;
width: var(--user-profile-metric-size);
height: var(--user-profile-metric-size);
min-width: var(--user-profile-metric-size);
min-height: var(--user-profile-metric-size);
border: 0 !important;
background: transparent !important;
box-shadow: none;
color: rgba(238, 246, 255, 0.94);
font-size: clamp(16px, 4.5vw, 20px);
}
/* Свет идёт от геометрии невидимой окружности, а не от заливки/рамки. */
.user-profile-metric.is-glowing .user-profile-metric-circle {
border: 0 !important;
background: transparent !important;
color: var(--app-topbar-gold);
box-shadow:
0 0 7px 1px var(--app-topbar-blue-glow),
0 0 20px 4px var(--app-topbar-blue-glow-soft),
0 0 34px 8px rgba(72, 145, 255, 0.12);
text-shadow: none;
}
/* Подпись всегда привязана к центру собственного круга и не влияет на его позицию. */
.user-profile-hero > .user-profile-metric .user-profile-metric-label {
position: absolute;
top: calc(100% + 5px);
left: 50%;
width: clamp(76px, 22vw, 104px);
min-height: 0;
transform: translateX(-50%);
padding: 0;
text-align: center !important;
align-self: auto !important;
line-height: 1.05;
pointer-events: none;
}
/* Чуть сильнее уводим подписи от аватара к внешним краям,
оставаясь связанными с центром соответствующего круга. */
.user-profile-hero > .user-profile-metric.is-top-left .user-profile-metric-label,
.user-profile-hero > .user-profile-metric.is-bottom-left .user-profile-metric-label {
left: calc(50% - clamp(3px, 1.1vw, 5px));
}
.user-profile-hero > .user-profile-metric.is-top-right .user-profile-metric-label,
.user-profile-hero > .user-profile-metric.is-bottom-right .user-profile-metric-label {
left: calc(50% + clamp(3px, 1.1vw, 5px));
}
/* Нижние счётчики используют ту же прозрачную окружность и размер. */
.user-profile-channel-metrics {
margin-top: clamp(28px, 4.6vh, 36px);
}
.user-profile-channel-metrics .user-profile-metric {
gap: 5px;
}
.user-profile-channel-metrics .user-profile-metric-label {
position: static;
width: 100%;
transform: none;
text-align: center;
}
@media (max-height: 700px) {
.user-profile-body {
padding-top: 8px;
}
.user-profile-channel-metrics {
margin-top: 25px;
}
}
@media (max-width: 350px) {
.user-profile-screen {
--user-profile-avatar-size: min(36.96vw, 147px);
--user-profile-metric-size: 46px;
}
.user-profile-hero > .user-profile-metric .user-profile-metric-label {
width: 72px;
font-size: 9px;
}
}
/* ===== Channel list preview/time flex sizing fix (2026-09-02) =====
* The global .channel-row-time rule still has width:100%, which makes the
* timestamp consume the entire flex row and collapses the message preview.
* Keep the timestamp content-sized and reserve a little more room at the
* right edge so the final digit is never clipped by the widened list tile. */
.channels-screen--list .channel-row {
padding-right: 14px !important;
}
.channels-screen--list .channel-row-preview-line .channel-row-time {
width: auto !important;
max-width: none !important;
}