feat(web): add scroll-to-top button - #176
Conversation
lyubomir-bozhinov
left a comment
There was a problem hiding this comment.
Проверих ScrollToTop.tsx: SSR-безопасен (всичкият window достъп е в useEffect/handler-и), listener cleanup присъства, { passive: true }, a11y-то е коректно (aria-label, aria-hidden/tabIndex вързани за видимостта), няма hydration mismatch (useState(false) съвпада със server-render-а). Чисто.
|
Проверката е завършена. Изходът по-долу е финалният ревю коментар. Ревю на PR #176 —
|
ydimitrof
left a comment
There was a problem hiding this comment.
Преглед на PR: feat(web): add scroll-to-top button
Обща оценка: добро качество, малка и добре обособена промяна. Компонентът е чист, използва window само вътре в useEffect (безопасно за SSR), закача scroll listener-а с { passive: true } и коректно го премахва при unmount. Достъпността е взета предвид (aria-label, aria-hidden, управление на tabIndex, :focus-visible стилове).
Phase 0 – Сигурност (сканиране)
- Няма hardcoded тайни, ключове или токени.
- Няма нови/променени URL адреси.
- Няма нови зависимости.
- Няма зловредни модели (backdoor, code injection, обфускация).
- Резултат: CLEAN — не блокира.
Основни забележки
- Липсва поддръжка на
prefers-reduced-motion(достъпност). Иbehavior: 'smooth'в JS, иtransitionв CSS игнорират системното предпочитание на потребителя за намалено движение. Това е WCAG препоръка и лесно се адресира. - Няма тестове за новия компонент. Според изискванията за покритие (≥90% за нов код) трябва да се добави тест, който проверява превключването на видимостта при scroll над/под 400px и извикването на
scrollTo.
Второстепенни
- Прагът
400и destination-ът на scroll са „magic“ стойности; ОК за такъв компонент, но може да се изнесат като константа. - Scroll handler-ът не е throttle-нат, но тъй като е
passiveи прави само евтина сравнителна проверка + условенsetState, реалният performance ефект е пренебрежим.
Заключение
Функционалността е коректна и безопасна. Препоръчвам да се адресират prefers-reduced-motion и липсата на тестове преди merge. Verdict: COMMENT.
| const scrollToTop = () => { | ||
| window.scrollTo({ | ||
| top: 0, | ||
| behavior: 'smooth', |
There was a problem hiding this comment.
Достъпност: behavior: 'smooth' не зачита предпочитанието prefers-reduced-motion. Потребители, които са заявили намалено движение, ще получат анимирано превъртане. Препоръка: проверявайте window.matchMedia('(prefers-reduced-motion: reduce)').matches и подавайте behavior: 'auto' в този случай (или четете стойността динамично при клик).
|
|
||
| useEffect(() => { | ||
| const toggleVisibility = () => { | ||
| if (window.scrollY > 400) { |
There was a problem hiding this comment.
Прагът 400 е „magic number". Препоръчително е да се изнесе като именувана константа (напр. SCROLL_THRESHOLD = 400) за четимост и по-лесна поддръжка. Освен това би било добре да се добави тест, който покрива превключването на isVisible при scrollY над/под прага, тъй като за новия компонент липсва тестово покритие.
| opacity: 0; | ||
| visibility: hidden; | ||
| transform: translateY(16px); | ||
| transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease, background 0.2s ease; |
There was a problem hiding this comment.
CSS transition също анимира появата/изчезването на бутона. За пълна съвместимост с prefers-reduced-motion добавете медия заявка @media (prefers-reduced-motion: reduce), която да намали/премахне тези преходи, съгласувано с промяната в JS-а.
|
Благодаря за PR-а, @Hard-system! Функционалността влезе в main чрез #201 - независима имплементация на същата идея, която добави и rAF throttle на scroll handler-а, prefers-reduced-motion поддръжка (JS + CSS) и позициониране, което не се застъпва с accessibility widget-а, плюс тестове. Идеята и първата реализация бяха твои - отбелязано е и в ревюто. Затварям като изместен от #201. |
Какво и защо
Този PR добавя функционалност и бутон "Към началото" (Scroll to Top) в основния лейаут (
root.tsx), за да се подобри UX/UI изживяването на потребителите.Потребителска история:
Като потребител на платформата СИГМА, често преглеждам дълги списъци с договори, институции и компании. Когато скролирам надолу, искам да имам удобен и бърз начин да се върна в началото на страницата, за да използвам основната навигация или търсачката, без да се налага да скролирам ръчно обратно нагоре.
Детайли по имплементацията:
ScrollToTop.tsxс плавно визуализиране при скролиране над 400px надолу.root.tsx.var(--ink),var(--accent)) за визуална консистентност с editorial стила на СИГМА.aria-label) и фокус мениджмънт чрез клавиатура (tabIndex и focus-visible стилове).Свързан issue
N/A (Самостоятелно UX/UI подобрение)
Вид промяна
fix— поправка на бъгfeat— нова функционалностdocs— документацияrefactor/perf/style— без промяна в поведениетоtest/ci/build/chore— поддръжкаКак е тествано
Чеклист
Co-Authored-By:trailermidt-bg/sigma:mainpnpm typecheckминаваpnpm test(поне за засегнатите пакети) минаваpnpm lintе чисто.env*или.dev.varsdocs/е обновена, ако промяната го налага