fix(temporary-notes): баннер временной заметки на мобильном — адаптивные icon-only действия + flex-basis (#321) #322
Reference in New Issue
Block a user
Delete Branch "fix/321-banner-mobile"
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?
Summary
На узком экране (~390px) баннер временной заметки разваливался: текст сжимался в «лесенку» по слову на строку, а переполняющие слова уезжали под прозрачную кнопку «Move to trash». Две layout-причины, обе починены (только разметка, без правки хендлеров/логики/i18n):
Groupимелаflex: 1(= basis 0), поэтому внешнийwrap="wrap"НИКОГДА не уводил кнопки на вторую строку — вместо этого давил текст. Дал ненулевой базис (flex: 1 1 16rem), теперь wrap реально срабатывает на узком контейнере.DeletedPageBanner: подписи-кнопкиvisibleFrom="sm", icon-onlyActionIcon+Tooltip+aria-labelhiddenFrom="sm"(те же хендлеры, loading-флаги,t()-ключи). Это чинит и ru-локаль (длинные подписи на мобильном не рендерятся).Соседний
DeletedPageBannerуже использует этот паттерн; при добавлении второй кнопки в #273/#277 адаптивную часть не перенесли.closes #321
How verified
tsc --noEmit— без ошибок в файле;eslint— чисто.handleTrashNow/handleMakePermanent, те жеisDeleting/toggleTemporary.isPendingи те жеt("Move to trash")/t("Make permanent"), что и десктопные кнопки — на>= smвид не меняется, на< smпоявляется icon-only ряд.temporary-note-banner.test.tsx, ни render-харнесса для баннеров (MantineProvider + моки мутаций); поднимать его ради layout-only правки, зеркалящей уже отгруженный (и не покрытый тестом)DeletedPageBanner, непропорционально. Адаптивность — чистый CSS (visibleFrom/hiddenFrom).Checklist
DeletedPageBannerПримечание:
deleted-page-banner.tsxимеет тот же латентныйflex:1-нюанс, но его мобильный ряд уже icon-only (узкий) и до переполнения не доходит — не трогал, чтобы не расширять scope (как и предложено в issue опциональным пунктом).Ревью — #322 (fix(temporary-notes): баннер временной заметки на мобильном — адаптивные icon-only действия + flex-basis, #321), round 1, head
ba94def3, base developScope: полный дифф PR
e1b8f81b..ba94def3— 1 файлtemporary-note-banner.tsx(+68/−24), разметка-only. Клиент-only. Полный веер 9 аспектов.Вердикт: PASS — фикс корректный и целен, регрессий нет, объективка зелёная. Готово к мержу.
Объективка запущена мной (детач
ba94def3, main-клон): clienttsc --noEmit→ 0. (Юнит-теста для этого баннера в проекте нет — см. ниже про покрытие; релевантная объективка для разметочной правки — tsc, зелёный.)Подтверждено по коду
Groupсменилаflex: 1(basis 0%, из-за чего внешнийwrap="wrap"никогда не уводил кнопки на вторую строку, а давил текст в «лесенку») наflex: "1 1 16rem"(:86) — теперь при узком контейнере wrap реально срабатывает. (2) Скопирован адаптивный паттернDeletedPageBanner: текст-кнопкиvisibleFrom="sm"(:106), icon-onlyActionIcon+Tooltip+aria-labelhiddenFrom="sm"(:129-154).handleTrashNow/handleMakePermanentбайт-идентичны (вне диффа); ОБА брейкпоинта зовут ОДНИ хендлеры с ОДНИМИ loading-флагами (isDeleting/toggleTemporary.isPending) и ОДНИМИt()-ключами ("Move to trash"/"Make permanent"). MantineActionIcon loadingдизейблит так же, какButton loading→ double-fire нет. ОбеGroupв DOM, но неактивная скрытаdisplay:none→ дубль-onClick не стреляет.flex-basisне меняет десктоп (при>=smgrow:1 поглощает базис). i18n-ключи те же, консьюмеры/пропсы/хуки не тронуты.DeletedPageBanner(тот жеsm-токен,ActionIcon size="lg"вTooltip withArrow+aria-label, loading проброшен); варианты (subtle/light) согласованы с ДЕСКТОПНЫМИ близнецами этого же баннера (даже чище сиблинга). Security/stability/architecture/documentation/simplification LGTM (twin-rendervisibleFrom/hiddenFrom— идиоматичный Mantine; извлекать общий компонент рано — 2 колл-сайта, rule-of-three не выполнен). Комментарии английские.mic-button.test.tsx— рабочий прецедент рендераActionIcon+ассертaria-label). НО вывод «тест не нужен» верен по risk-weighting: единственное новое = видимость по брейкпоинту (CSS media-query;matchMediaзастаблен в jsdom → «показывается только <sm» не проверить), а icon-кнопки — дословная зеркалка десктопного блока и уже-смерженного сиблингаDeletedPageBanner, у которого теста тоже нет. Риск-критичного непокрытого пути нет; хендлеры не менялись. Минимальный render-тест (aria-label + disabled-while-pending) возможен, но НЕ блокер.Готово к мержу.