Files
descrybe/docs/mobile-audit.md
T
greeneclipse 8580c996c3 Initial commit of Descrybe v2 without local scratch artifacts.
Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
2026-08-09 22:47:43 +02:00

147 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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](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 | 627708px | 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 (~3640px); 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:** `ProductTable` `min-w-[40rem]` + `overflow-x-auto`; page shell `min-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`; shared `Table` `min-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-words` added on the steps list.
- **Fixes:** `break-words` on 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, removed `sm: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)
1. **Tutorial + drawer:** Prefer bottom-anchored popover when `navUi.mobileOpen`, or auto-scroll the highlighted nav item above the popover.
2. **Feeds/products actions:** Increase Map / ⋮ hit areas to ≥44px on touch.
3. **Products filters:** Stack category/feed/sort full-width on xs.
4. **Tablet (≥768):** Consider showing persistent sidebar earlier (`md:` vs `lg:`) so tablet does not rely only on the drawer.
5. **Add Feed modal e2e:** Browser click was flaky with overlapping outline targets; re-verify after drawer closed.
---
## How to re-run
```bash
# from apps/web
npm run check
```
Browser (codehelper MCP / CLI), with demo session:
- Base URL: `http://127.0.0.1:5174`
- `device=mobile` and `device=tablet`
- Prefer `format=png` if 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`.