UI v4: новый стиль по макету V3/V4 и доводка экранов

Палитра «Сияние» по умолчанию, новые роли цветов. Лента канала: плоские записи, ряд действий
с равным шагом иконок, дата у записи. Обсуждение со строкой ввода, личный чат, шторки.
Вход и регистрация: стартовый экран (надпись «СИЯНИЕ», сияние мандалы), настройки входа
со статусами серверов, статус логина в одну строку, вход с другого устройства (код, таймер, шаги),
сохранение ключей с переключателями. Корневые разделы – заголовок по центру; фильтр чатов –
переключатель; уведомления – список как в чатах; фото – просмотр на весь экран.
Общее: один зазор под шапкой (--page-top-gap), переключатели высотой с поле ввода,
второстепенные кнопки по одной роли (в том числе на экранах устройств и серверов),
иконки только из ui-icon.js, полоса прокрутки скрыта, среднее тире в текстах интерфейса.

Что нужно от сервера и разработчика – docs/UI-Design/UI-v4-for-dev.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
q
2026-09-29 01:36:52 +03:00
co-authored by Claude Opus 5.5
parent 13693a0a53
commit 2e62616b46
84 changed files with 2507 additions and 1583 deletions
+31 -127
View File
@@ -850,26 +850,19 @@
/* Поле сообщения занимает почти всю ширину; действия прижаты к правому краю. */
.composer-slot:has(> .dm-chat-input) {
padding-left: 0;
padding-right: 4px;
}
/* Нижняя панель чата — поверхность с линией сверху, как у канала и обсуждения */
.dm-chat-input {
grid-template-columns: minmax(0, 1fr) auto;
align-items: end;
position: relative;
z-index: 10;
margin-inline: 0;
padding: 10px 0;
border-top: 0;
background: transparent;
backdrop-filter: none;
-webkit-backdrop-filter: none;
gap: 4px;
padding-left: 0;
padding-right: 0;
margin-inline: calc(-1 * var(--page-gutter));
padding: 9px var(--page-gutter) calc(11px + env(safe-area-inset-bottom));
border-top: 1px solid var(--border-subtle);
background: var(--surface);
gap: 6px;
}
@@ -891,98 +884,16 @@
.chat-header-peer-btn {
width: 100%;
min-width: 0;
min-height: 46px;
padding: 2px 0;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: flex-start;
gap: 7px;
text-align: left;
cursor: pointer;
}
.chat-header-peer-btn .chat-header-avatar-slot {
flex: 0 0 40px;
}
.chat-header-peer-text {
min-width: 0;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
gap: 2px;
}
.chat-header-peer-name,
.chat-header-peer-meta {
display: block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-header-peer-name {
font-size: 14px;
line-height: 1.15;
font-weight: 650;
color: var(--text-primary);
}
.chat-header-peer-meta {
font-size: 11px;
line-height: 1.15;
font-weight: 500;
color: var(--text-secondary);
}
/* ===== DM header regression fix (2026-09-02) =====
* The peer identity button intentionally spans the whole free header area.
* Its avatar uses a 119% glass overlay, so neither the center cell nor the
* button may clip overflow. Text keeps its own ellipsis boundary instead.
*/
.chat-header-peer-btn {
overflow: visible;
padding-inline: 2px;
}
.chat-header-peer-btn .chat-header-avatar-slot {
width: 44px;
height: 44px;
min-width: 44px;
min-height: 44px;
flex: 0 0 44px;
overflow: visible;
}
.chat-header-peer-btn .chat-header-avatar-slot .chat-header-avatar {
overflow: visible;
}
.chat-header-peer-text {
flex: 1 1 auto;
overflow: hidden;
}
/* Шапка чата — общая «визитка» (topbar.css .topbar-identity). У аватара стеклянный ободок на 119%,
* поэтому ни кнопка, ни слот аватара не обрезают содержимое; текст обрезается сам. */
.chat-header-peer-btn { width: 100%; overflow: visible; }
.chat-header-peer-btn .chat-header-avatar-slot { width: 36px; height: 36px; min-width: 36px; flex: 0 0 36px; overflow: visible; }
.chat-header-peer-btn .chat-header-avatar-slot .avatar.chat-header-avatar { width: 36px; height: 36px; min-width: 36px; min-height: 36px; overflow: visible; }
.chat-header-peer-text { flex: 1 1 auto; overflow: hidden; }
/* Shell state + Chat-owned composer adjustment (moved out of app-shell.css). */
.app-shell--scroll-nested.keyboard-open .composer-slot .dm-chat-input {
padding-bottom: 0;
padding-bottom: 9px;
}
@@ -1393,35 +1304,28 @@
margin-top: 2px;
}
.chat-header-peer-btn { border: 0; background: transparent; color: inherit; font: inherit; }
.chat-header-peer-btn:hover { background: var(--surface); }
.chat-header-peer-btn:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; }
.chat-header-peer-name { font-size: var(--text-md); font-weight: var(--weight-bold); }
.chat-header-peer-meta { font-size: var(--text-xs); }
.dm-chat-screen .bubble {
max-width: min(80%, 34rem);
padding: 8px 12px 6px;
border-radius: var(--radius-lg);
max-width: min(85%, 34rem);
padding: 10px 12px 7px;
border-radius: 17px;
color: var(--text-primary);
font-size: var(--text-md);
line-height: var(--leading-md);
font-size: .9375rem;
line-height: 1.375rem;
box-shadow: none;
overflow-wrap: anywhere;
}
.dm-chat-screen .bubble.in {
background: var(--surface);
border: 1px solid var(--border-subtle);
border-bottom-left-radius: var(--radius-xs);
border-top-left-radius: var(--radius-lg);
}
.dm-chat-screen .bubble.out {
background: color-mix(in srgb, var(--accent) 24%, var(--surface));
border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--border-subtle));
border-bottom-right-radius: var(--radius-xs);
border-top-right-radius: var(--radius-lg);
}
.dm-chat-screen .bubble-meta { font-size: .6875rem; line-height: 1rem; color: var(--text-secondary); }
.dm-chat-screen .bubble-status--read { color: var(--accent); }
.dm-chat-screen .bubble.in { background: var(--surface); border-bottom-left-radius: 5px; }
.dm-chat-screen .bubble.out { background: var(--bubble-out); border-bottom-right-radius: 5px; }
/* Время и статус — в конце последней строки (эксперимент V4, принят); не влезают — переносятся */
.dm-chat-screen .bubble-text { display: inline; }
.dm-chat-screen .bubble-meta { float: right; margin: 5px 0 0 10px; display: inline-flex; align-items: center; gap: 4px; font-size: .6875rem; line-height: 1rem; color: color-mix(in srgb, var(--text-secondary) 70%, var(--text-primary)); }
.dm-chat-screen .bubble::after { content: ''; display: table; clear: both; }
.dm-chat-screen .bubble-status { display: inline-flex; min-width: 0; color: inherit; text-shadow: none; }
.dm-chat-screen .bubble-status svg { width: 16px; height: 16px; }
.dm-chat-screen .bubble-status--read { color: var(--action); }
.dm-chat-screen .bubble-status--failed { color: var(--danger); }
.dm-chat-screen .bubble-delivery-note { clear: both; }
.dm-day-separator { display: flex; justify-content: center; margin: 8px 0; }
.dm-day-separator span { padding: 3px 10px; border-radius: var(--radius-pill); color: var(--text-secondary); background: var(--surface); border: 1px solid var(--border-subtle); font-size: var(--text-xs); line-height: var(--leading-xs); }
@@ -1431,7 +1335,7 @@
border: 1px solid var(--border-control);
border-radius: 22px;
color: var(--text-primary);
background: var(--surface);
background: var(--surface-raised);
text-shadow: none;
caret-color: var(--accent);
font-size: 1rem;