# Quickstart: UI Polish Visual Acceptance Scenarios Use this guide to manually verify each milestone after implementation. Run `docker compose up` before starting. Open the browser at `http://localhost:4200`. --- ## M1 — Design Token Layer **Goal**: Tokens exist; visual output is identical to before. 1. Open the library, upload, detail, and login pages. 2. Open browser DevTools → Elements → `` or `
`. 3. Confirm `--bg`, `--surface`, `--accent`, `--danger` etc. are visible in computed styles. 4. Confirm no visible change in any view compared to before M1. --- ## M2 — Library View ### Loading skeleton 1. Open DevTools → Network → set throttle to "Slow 3G". 2. Hard-refresh the library page. 3. **Expect**: A grid of grey shimmer cards appears immediately; no blank white space; no layout jump when real images load in. ### Empty state 1. Ensure no images are uploaded (or use a fresh test database). 2. Open the library. 3. **Expect**: A centred empty-state panel with explanatory text and a prominent "Upload your first image" link. Clicking the link navigates to `/upload`. ### Error state 1. Stop the API container (`docker compose stop api`). 2. Hard-refresh the library. 3. **Expect**: An error card with a plain-language message and a "Retry" button. No blank grid, no raw status code. 4. Restart the API (`docker compose start api`) and click "Retry". 5. **Expect**: Images load successfully. ### Card polish 1. Hover over an image card. 2. **Expect**: Card lifts slightly (2 px translate) with a smooth transition. ### Broken image 1. Manually corrupt a storage key in the database (or unplug MinIO) and reload. 2. **Expect**: Card shows a grey placeholder graphic, not a broken-image browser icon. ### 375 px viewport 1. DevTools → Device toolbar → iPhone SE (375 × 667). 2. **Expect**: Cards stack, no horizontal scrollbar, all content readable. --- ## M3 — Upload View ### Drop-zone idle 1. Navigate to `/upload` (must be logged in). 2. **Expect**: A visually distinct drop-zone with dashed border and clear instructions. Submit button is disabled/greyed. ### In-progress 1. Select a large image file. 2. Click upload. 3. **Expect**: Button label changes to "Uploading…" and is disabled. A spinner or animated indicator is visible. ### Success 1. After a successful upload completes. 2. **Expect**: A green-tinted success banner with the filename, "Upload another" link, and "View in library" link. Banner disappears after 4 seconds. ### Validation error 1. Attempt to upload a `.txt` file. 2. **Expect**: An inline error message names the problem ("Unsupported file type"). The form is still usable — no page reload required. ### Network error 1. Stop the API mid-upload (or use DevTools → block the upload request). 2. **Expect**: A generic inline error with guidance to retry. Form remains usable. --- ## M4 — Detail View ### Loading skeleton 1. Set network throttle to Slow 3G. 2. Navigate directly to an image URL (e.g., `http://localhost:4200/images/