From 1999593e07b350f129ff25606d24fde7e2b65568 Mon Sep 17 00:00:00 2001 From: isra el Date: Sun, 19 Jul 2026 00:07:29 +0300 Subject: [PATCH] fix: day header overlap, mobile footer alignment, modal animation Day headers in message history could cover message rows. Two distinct causes, both reproduced before fixing: - On mobile the header was pinned to top-14, the same sticky band the mobile search bar already occupies, so it detached and landed on top of rows. Being bg-muted/70 with a backdrop blur, row text bled through it, which is the distortion that was reported. - On desktop it was pinned to top-0, behind the app header, and it covered rows scrolled beneath it and swallowed their clicks. Playwright surfaced this second one: a row click failed with "h3 intercepts pointer events". Day headers are no longer sticky. A page holds 20 messages, so groups are short and pinning bought little in exchange for those failures. Footer links are left-aligned on mobile. Centred links in a single column had no common edge to scan down. Modal animation is now a quick fade. Dialogs slid in from the left and top while zooming, which is the movement that read badly; the slide and zoom are gone and the duration drops from 200ms to 150ms, applied to both the dialog and alert-dialog primitives so every modal matches. Sheets still slide, since that is what a drawer should do. Guards: the overlap check runs at both mobile and desktop widths and also asserts a row is still clickable after scrolling. Verified it fails against the old markup rather than assuming a green test means coverage. Fixture dates now anchor to local midnight instead of "N hours ago". A 2-hour-old message falls on the previous day when the suite runs shortly after midnight, which made the Today/Yesterday assertions depend on the wall clock. It failed exactly that way during this session. Co-Authored-By: Claude Fable 5 --- .../(components)/message-history/index.tsx | 8 ++- web/components/shared/footer.tsx | 6 +- web/components/ui/alert-dialog.tsx | 2 +- web/components/ui/dialog.tsx | 4 +- web/e2e/message-history.spec.ts | 69 +++++++++++++++++++ web/test/fixtures.ts | 23 +++++-- 6 files changed, 99 insertions(+), 13 deletions(-) diff --git a/web/app/(app)/dashboard/(components)/message-history/index.tsx b/web/app/(app)/dashboard/(components)/message-history/index.tsx index 5f96860..346adec 100644 --- a/web/app/(app)/dashboard/(components)/message-history/index.tsx +++ b/web/app/(app)/dashboard/(components)/message-history/index.tsx @@ -208,7 +208,13 @@ export default function MessageHistory() {
{days.map((day) => (
-

+ {/* Deliberately not sticky. On mobile it pinned to the same + offset as the sticky search bar and landed on top of message + rows, translucent, with text bleeding through. On desktop it + covered rows scrolled beneath it and swallowed their clicks. + A page holds 20 messages, so groups are short and a pinned + header bought little in exchange for that. */} +

{day.label}

diff --git a/web/components/shared/footer.tsx b/web/components/shared/footer.tsx index 262a0f7..b7cf54e 100644 --- a/web/components/shared/footer.tsx +++ b/web/components/shared/footer.tsx @@ -22,7 +22,9 @@ const linkClass = export default function Footer() { return (