[bug][ui][temporary-notes] Баннер временной заметки разваливается на мобильном: текст лесенкой по одному слову и уезжает под кнопку «Move to trash» #321
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Симптом
На узком экране (телефон, ~390px) баннер временной заметки превращается в кашу: текст сжат в колонку уже самого длинного слова и рассыпается «лесенкой» по одному слову на строку, а переполняющие слова уезжают вправо под прозрачную кнопку «Move to trash» (
variant="subtle") — текст и кнопка визуально накладываются. «Make permanent» прижата к правому краю. На десктопе всё выглядит нормально.(скрин: мобильный Safari, Edit-режим, страница Untitled с баннером «This temporary note moves to trash in 10 hours…»)
Репро
canEdit— и баннер выглядит нормально; поэтому ловят именно редакторы).Корень
apps/client/src/features/page/components/temporary-note-banner.tsx:72-113. Два флекс-эффекта складываются:Group justify="space-between" wrap="wrap", но текстовая группа имеетstyle={{ flex: 1, minWidth: 0 }}→flex: 1 1 0%, т.е. flex-basis = 0. Базовый размер флекс-строки — это только кнопочная группа (~250px en), она «влезает» всегда →wrap="wrap"ни при какой ширине не уводит кнопки на вторую строку; вместо этого ужимается текст.Group wrap="nowrap"имеетmin-width: auto≈ min-content ≈ 250px (en) и не сжимается. Тексту на телефоне остаётся ~330 − 250 − gap ≈ 70px — меньше самого длинного слова («permanent.» ≈ 80px приsize="sm"). Слова посимвольно не переносятся, иTextпереполняет свою колонку (это разрешилminWidth: 0) вправо — прямо под subtle-кнопку с прозрачным фоном. Отсюда и наложение, и лесенка.В ru-локали ещё хуже: «Переместить в корзину» + «Сделать постоянной» — nowrap-ряд ~350px+, который на 390px-экране не влезает даже в отдельную строку.
DeletedPageBanner, поведение которого этот баннер сознательно зеркалит, ровно эту проблему уже решает:apps/client/src/features/page/trash/components/deleted-page-banner.tsx:80-134— на< smполные кнопки заменяются на icon-onlyActionIcon+Tooltip(visibleFrom="sm"/hiddenFrom="sm"). Когда в баннер временной заметки добавляли вторую кнопку (#273/#277), адаптивная часть паттерна не переехала.Ожидаемое поведение
На мобильном баннер остаётся компактным: текст читается с нормальными переносами по всей ширине, оба действия доступны и ни на что не накладываются. Поведение согласовано с
DeletedPageBanner.Фикс (точечный)
Две части, обе в одном файле:
1. Скопировать адаптивный паттерн из
DeletedPageBanner: на>= sm— текущие кнопки с подписями, на< sm— icon-onlyActionIcon+Tooltip+aria-label. Это решает и ru-локаль (длинные подписи на мобильном исчезают вовсе).2. Прививка для средних контейнеров (десктоп с открытым aside: viewport ≥ sm, а контейнер узкий —
visibleFromсмотрит на viewport, не на контейнер): текстовой группе ненулевой flex-basis, чтобы внешнийwrap="wrap"реально срабатывал и кнопки уходили на вторую строку вместо выдавливания текста.16rem(256px): с en-кнопками (~250px) перенос на вторую строку включается при ширине контента примерно < 520px — телефоны и узкие сплиты попадают всегда, широкий десктоп не затрагивается.Альтернатива (вариант Б, не основной): только flex-basis +
ml="auto"у кнопок, без icon-only ряда — сохраняет подписи на мобильном, но баннер растёт до двух строк, в ru-локали рискует третьей и расходится с уже принятым паттерномDeletedPageBanner. Имеет смысл, только если icon-only «Make permanent» посчитаем недостаточно заметным для главного rescue-действия (тултип + aria-label этот риск смягчают — как и у «Restore page» в trash-баннере).Затронутые файлы
apps/client/src/features/page/components/temporary-note-banner.tsx— единственная правка: разметка + импортыActionIcon,Tooltipиз@mantine/core. Handlers, логика и i18n-ключи не меняются (оба ключа уже в локалях как подписи кнопок).deleted-page-banner.tsx:71— там латентно тот же нюанс сflex: 1, просто icon-only ряд узкий и до переполнения обычно не доходит.Связанное
DeletedPageBannerпри этом не был скопирован.