3 Commits

Author SHA1 Message Date
cd5399f88a fix(auth): заголовок вылезал за брендовую панель на широком окне
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
Кегль «Ваша инфраструктура» уменьшался только в @media по ширине ОКНА —
не спасало, когда окно широкое, а панель (42% от него, `.layout` flex
42/58) сама по себе узкая: слово не помещалось, overflow:hidden обрезал
его вместо переноса. Перешли на container query (`container-type:
inline-size` на .brand-panel + `cqw` на .brand-headline) — тот же приём,
что у аватара участника в комнате (container-type:size + cqmin,
room.css). Кегль теперь считается от реальной ширины панели, а не окна,
в любой раскладке.

Тем же механизмом клипались плашки .brand-stats («AI-саммари») — добавлен
flex-wrap в базовое правило вместо только-мобильного.
2026-08-03 01:56:42 +03:00
2be799b19d fix(room): эмодзи-поповер в чате — 5-я колонка вылезала за рамку
Настоящая причина (подтверждена вживую через getBoundingClientRect):
`.chat-input-row button` (стиль круглой кнопки «Отправить», width/height
42px) красил размер и кнопкам эмодзи внутри поповера — они тоже лежат в
.chat-input-row. Сетка на 5 колонок по 42px требовала ~238px при
фиксированной ширине попапа 220px, лишнее уезжало вправо за рамку.
Явные width/height: auto на .chat-emoji-option перебивают унаследованный
размер нужной специфичностью, дальше квадрат считает aspect-ratio от
реальной ширины колонки (~36px). Заодно — max-width на попап и
overflow:hidden/white-space:nowrap на кнопки как общая страховка от
переполнения на очень узких экранах.
2026-08-03 01:56:27 +03:00
6b9d0b833e fix(room): чат вылезает за панель в Firefox — min-width/min-height:0
`.chat-messages` (flex-колонка) без явного min-height:0 не сжимается до
flex:1 в Firefox и растёт по контенту списка сообщений. Textarea в
.chat-input-row без min-width:0 упирается в автоматическую минимальную
ширину, которую Firefox считает от атрибута cols (умолчание 20 символов) —
жёстче, чем Chrome/Safari.
2026-08-03 01:56:03 +03:00
2 changed files with 55 additions and 6 deletions

View File

@@ -16,6 +16,11 @@
position: relative;
overflow: hidden;
border-right: 1px solid var(--color-border);
/* Запрос по ширине САМОЙ панели, а не окна: `.layout` — flex 42/58, и на
широком окне с узкой панелью `vw` (см. .brand-headline) не отражает
реальную доступную ширину — тот же паттерн, что у `.room-tile-avatar`
(container-type:size + cqmin, room.css) для аватара участника. */
container-type: inline-size;
}
.brand-panel::after {
content: "";
@@ -41,6 +46,12 @@
.brand-headline {
font: var(--text-display-lg);
font-family: var(--font-display);
/* `cqw` — от ширины `.brand-panel` (её `container-type: inline-size` выше),
а не окна: длинное слово «инфраструктура» иначе не помещается именно
тогда, когда окно широкое, а панель (42% от него) — узкая. Раньше кегль
уменьшался только в @media по ширине ОКНА (узкие экраны) — не спасало
от этого случая. */
font-size: clamp(20px, 8cqw, 34px);
color: var(--color-ink-700);
margin: 0 0 var(--space-4);
max-width: 460px;
@@ -51,7 +62,11 @@
max-width: 420px;
margin: 0;
}
.brand-stats { display: flex; gap: var(--space-4); z-index: 1; margin-top: var(--space-8); }
/* `flex-wrap` не только на мобильном медиа-запросе (см. ниже) — та же
природа бага, что у заголовка: узкая ПАНЕЛЬ (а не узкое окно) не даёт
двум плашкам поместиться в ряд, а `overflow:hidden` у `.brand-panel`
обрезал вторую вместо переноса. */
.brand-stats { display: flex; flex-wrap: wrap; gap: var(--space-4); z-index: 1; margin-top: var(--space-8); }
.stat-glass {
background: var(--color-surface-glass);
backdrop-filter: blur(16px);
@@ -248,10 +263,10 @@
right: -90px;
bottom: -90px;
}
/* clamp() — на узких экранах слово «инфраструктура» иначе вылезает за
край брендовой панели (см. .brand-panel padding ниже и её overflow:hidden,
обрезающий текст без переноса вместо уменьшения кегля). */
.brand-headline { max-width: none; font-size: clamp(22px, 6.2vw, 34px); }
/* Кегль теперь считает `.brand-headline` сама (cqw от ширины панели, см.
базовое правило) — здесь снимаем только `max-width:460px`: в сложенной
колонкой раскладке панель может стать шире 460px, а дизайн этого хочет. */
.brand-headline { max-width: none; }
.brand-sub { max-width: none; }
.brand-stats { flex-wrap: wrap; }
.stat-glass { flex: 1 1 140px; min-width: 0; }

View File

@@ -497,8 +497,14 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
.chat-empty { font: var(--text-body); color: var(--color-room-text-tertiary); margin: auto; text-align: center; }
/* `min-height: 0` обязателен — тот же приём, что у `.stage-side` (комментарий
выше): без него `.chat-panel` (flex-колонка) в Firefox не сжимает
`.chat-messages` до высоты `flex:1`, а даёт ей вырасти по контенту
(список сообщений) и вылезти за пределы панели — Chrome в этой ситуации
более снисходителен, Firefox — нет. */
.chat-messages {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: var(--space-5);
display: flex;
@@ -540,6 +546,13 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
}
.chat-input-row textarea {
flex: 1;
/* Firefox даёт `<textarea>` большую автоматическую минимальную ширину,
завязанную на атрибут `cols` (умолчание 20 символов моноширинной
метрики), и как flex-item без `min-width:0` отказывается сжиматься
ниже нее — панель шириной 320px раздувается вправо. Chrome/Safari
считают минимальную ширину textarea мягче, поэтому баг был виден
только в Firefox. */
min-width: 0;
resize: none;
background: var(--color-room-tile);
border: 1px solid var(--color-room-tile-border);
@@ -592,13 +605,18 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
.chat-emoji-wrap .chat-emoji-trigger:disabled { opacity: 0.5; cursor: default; }
/* 5 колонок × 6 строк — ровно 30 эмодзи в EMOJI_OPTIONS (ChatPanel.tsx), без
неполной последней строки. */
неполной последней строки. `max-width` — страховка на случай совсем узкого
viewport: фикс-ширина 220px без потолка сама по себе не переполняется при
текущей раскладке (триггер у левого края панели, попап растёт вправо в
свободное место — проверено геометрией и вживую), но фиксированный размер
совсем без ограничителя — плохая практика сама по себе. */
.chat-emoji-popover {
position: absolute;
bottom: calc(100% + var(--space-2));
left: 0;
z-index: 50;
width: 220px;
max-width: calc(100vw - 2 * var(--space-4));
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px;
@@ -609,14 +627,30 @@ video[data-lk-source='screen_share'] { object-fit: contain; background: #000; }
box-shadow: var(--shadow-room-panel);
}
.chat-emoji-popover .chat-emoji-option {
/* Настоящая причина переполнения (найдена по факту, не по догадке —
`getBoundingClientRect` показал кнопки 42×42px при колонке ~36px):
`.chat-input-row button` (специфичность 0,1,1) задаёт ВСЕМ кнопкам
формы `width/height: 42px` — это правило круглой кнопки «Отправить»,
а кнопки эмодзи в поповере тоже лежат внутри `.chat-input-row`
(см. комментарий выше про гонку специфичности, она чинилась для
цвета в 0.0.19, но не для размера). Без явного `width`/`height` здесь
побеждает тот 42px, сетка на 5 колонок раздувается за 220px попапа,
и последняя колонка уезжает вправо за рамку. `min-width: 0` сам по
себе НЕ помогает — конфликт не в авто-минимуме грида, а в explicit
width, который обязательно нужно перебить явно. */
width: auto;
height: auto;
min-width: 0;
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
background: none;
border: none;
font-size: 20px;
line-height: 1;
white-space: nowrap;
border-radius: var(--radius-md);
cursor: pointer;
}