SHA256
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user