Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
7.9 KiB
Mobile / tablet audit — descrybe-v2 web
Date: 2026-08-04
App: apps/web (SvelteKit) at http://127.0.0.1:5174
Auth: demo user demo@descrybe.local (see demo-user.md)
Tooling: codehelper browser with device=mobile (390×844) and device=tablet (768×1024), format=png
Gate: npm run check → 0 errors, 0 warnings
Summary
Document-level horizontal overflow on dashboard table pages is fixed (products/feeds document width now matches the viewport ≈390px on mobile). Tables scroll horizontally inside shells. Modals use a bottom-sheet layout on small screens. Tutorial popover clamps and scrolls on narrow viewports. Remaining polish: denser header cluster, mapping/table column density, and tutorial popover vs open drawer.
| Area | Before (mobile) | After |
|---|---|---|
| Products page width | ~823px (page scroll) | 390px (table scrolls inside) |
| Feeds page width | ~989px | 390px |
| Campaigns / Woo | 627–708px | Contained via layout overflow-x-clip + table shells |
| Billing / Dashboard / Pricing / Login | Already ~390 | OK |
npm run check |
— | Pass |
Pages audited
Login (/login) — mobile + tablet
- Screenshot notes: Centered sign-in card, brand header, footer legal links. No horizontal overflow. Form fields and Sign in CTA are comfortable tap sizes.
- Findings: Secondary text links (Create company / Accept invite / View pricing) are smaller than 44px but usable. OK for auth.
- Fixes: None required.
Pricing (/pricing) — mobile
- Screenshot notes: Marketing shell with hamburger + theme toggle; plan cards stack vertically; Monthly/Yearly toggle fits.
- Findings: Header icon pair is close; FAQ rows are full-width (good). Hero CTA pair sits side-by-side — acceptable.
- Fixes: None required this pass.
Dashboard (/dashboard) — mobile
- Screenshot notes: Hamburger + company switcher + short “Resume” tour control + avatar. Action grid (tutorial / processing / store / campaign) wraps. Stat cards stack full width.
- Findings: Header cluster is dense on 390px. Tutorial opens drawer for nav steps and shows popover over sidebar (step “Standard fields” observed).
- Fixes: Shorter header tour labels on xs; larger tap height (~36–40px); layout padding
p-4 sm:p-6.
Products (/products) — mobile + tablet
- Screenshot notes (mobile): Status tabs + search/filters; product flex-table with Quality / Category / Status columns. Viewport no longer widens the document.
- Screenshot notes (tablet): Sidebar drawer pattern still uses hamburger at 768; table columns readable; “Resume tutorial” full label visible.
- Findings: Table still needs in-card horizontal swipe to see Actions; that is intended. Filter row can feel cramped on mobile.
- Fixes:
ProductTablemin-w-[40rem]+overflow-x-auto; page shellmin-w-0.
Feeds (/feeds) — mobile
- Screenshot notes: Stats cards stack; search card; wide feeds table with Name / Source / Type / Interval / Status / Last Synced / Actions. Map + ⋮ actions visible after horizontal scroll.
- Findings: Source header truncates in the first viewport until the user scrolls the table — expected with sticky Actions. Map/⋮ remain tight tap targets.
- Fixes: Card
min-w-0 overflow-hidden; sharedTablemin-w-[36rem]+ overflow shell.
Mapping (/feeds/[id]/mapping) — mobile
- Screenshot notes: Title + Auto-map / Extract / Back actions wrap; step tabs and field mapping table; footer Save / Sync sample.
- Findings: Step tabs previously clipped horizontally (“Select Product Element” / “Map Fields” side-by-side).
- Fixes: Step tabs stack on xs (
flex-col→sm:flex-row).
Billing (/billing) — mobile
- Screenshot notes: Plan/credits cards stack; usage chart; Compare / Manage / Add credits actions.
- Findings: Header density same as other app pages. No page overflow.
- Fixes: Inherited layout/header fixes.
Campaigns (/campaigns) — mobile
- Screenshot notes: Search + campaign table (Name / Season / Status / Updated / Actions).
- Findings: Table uses horizontal scroll inside card after shell fix.
- Fixes: Campaigns table Card
min-w-0 overflow-hidden.
Woo / Stores (/woocommerce) — mobile
- Screenshot notes: Setup steps card; Connection / Categories / … tabs (2-col grid on mobile); credential form; Save / Queue buttons.
- Findings: Setup step copy previously appeared clipped when the page itself overflowed;
break-wordsadded on the steps list. - Fixes:
break-wordson setup<ol>; layout containment.
Sidebar / nav
- Screenshot notes: Off-canvas drawer (
#app-sidebar), overlay, primary links + More. Opens for tutorial nav targets. - Findings: Drawer + tutorial popover compete for space on 390px (popover can cover the highlighted link). Skip/Pause/Back remain reachable.
- Fixes: Tutorial popover max-height + edge clamp + full-bleed width under 480px; header hamburger ≥40×40.
Tutorial overlay
- Screenshot notes: Shade panels + highlight ring + popover (“STEP N OF 16”, Skip tour, Pause). Observed on dashboard with More → Standard Fields highlighted.
- Findings: Works on mobile; popover should stay smaller / lower when the drawer is open (follow-up).
- Fixes:
max-height: min(70dvh, 28rem), overflow scroll, safe-area padding, tighter edge inset on small screens.
Modals (Dialog)
- Intent: Add Feed and similar dialogs.
- Fixes: Mobile bottom-sheet alignment (
items-end),max-h-[min(92dvh,900px)], scrollable body, removedsm:min-w-[500px]that fought small widths.
Code changes (this pass)
| File | Intent |
|---|---|
src/routes/+layout.svelte |
max-w-[100vw] overflow-x-clip, min-w-0 main, compact tour header labels |
src/lib/components/DashboardHeader.svelte |
Larger hamburger/logout targets, tighter header gaps |
src/lib/components/CompanySwitcher.svelte |
Narrower max-width on xs |
src/lib/components/PageShell.svelte |
min-w-0 max-w-full |
src/lib/components/ui/Table.svelte |
min-w-[36rem] + overscroll containment |
src/lib/components/ui/TableShell.svelte |
Outer overflow + min-w-0 |
src/lib/components/ui/Dialog.svelte |
Mobile bottom sheet + max-height |
src/lib/components/ui/TabsList.svelte |
Horizontal scroll when needed |
src/lib/components/products/ProductTable.svelte |
Explicit min-width rows for in-shell scroll |
src/lib/components/tutorial/TutorialOverlay.svelte |
Small-screen popover sizing/clamp |
src/routes/feeds/+page.svelte |
Table card overflow containment |
src/routes/campaigns/+page.svelte |
Table card overflow containment |
src/routes/woocommerce/+page.svelte |
Setup steps break-words |
src/routes/feeds/[feedId]/mapping/+page.svelte |
Step tabs stack on mobile |
Follow-ups (not blocking)
- Tutorial + drawer: Prefer bottom-anchored popover when
navUi.mobileOpen, or auto-scroll the highlighted nav item above the popover. - Feeds/products actions: Increase Map / ⋮ hit areas to ≥44px on touch.
- Products filters: Stack category/feed/sort full-width on xs.
- Tablet (≥768): Consider showing persistent sidebar earlier (
md:vslg:) so tablet does not rely only on the drawer. - Add Feed modal e2e: Browser click was flaky with overlapping outline targets; re-verify after drawer closed.
How to re-run
# from apps/web
npm run check
Browser (codehelper MCP / CLI), with demo session:
- Base URL:
http://127.0.0.1:5174 device=mobileanddevice=tablet- Prefer
format=pngif WebP encoding is unavailable in the agent host - Authenticated pages: login then
session=<name>reuse
Key routes: /login, /pricing, /dashboard, /products, /feeds, /feeds/<id>/mapping, /billing, /campaigns, /woocommerce.